]> git.ipfire.org Git - thirdparty/strongswan.git/commitdiff
iv_gen: aead_t implementations provide an IV generator
authorTobias Brunner <tobias@strongswan.org>
Mon, 5 Aug 2013 12:52:30 +0000 (14:52 +0200)
committerTobias Brunner <tobias@strongswan.org>
Fri, 11 Oct 2013 13:55:40 +0000 (15:55 +0200)
src/libcharon/sa/ikev1/keymat_v1.c
src/libstrongswan/crypto/aead.c
src/libstrongswan/crypto/aead.h
src/libstrongswan/plugins/ccm/ccm_aead.c
src/libstrongswan/plugins/gcm/gcm_aead.c
src/libstrongswan/plugins/openssl/openssl_gcm.c

index 39e4cad2093d68279a5a0e6ac362f7904d507b22..bf1b0046c3c398956b7f7279162283c1b2d02faa 100644 (file)
@@ -196,6 +196,13 @@ METHOD(aead_t, get_iv_size, size_t,
        return 0;
 }
 
+METHOD(aead_t, get_iv_gen, iv_gen_t*,
+       private_aead_t *this)
+{
+       /* IVs are retrieved via keymat_v1.get_iv() */
+       return NULL;
+}
+
 METHOD(aead_t, get_key_size, size_t,
        private_aead_t *this)
 {
@@ -304,6 +311,7 @@ static aead_t *create_aead(proposal_t *proposal, prf_t *prf, chunk_t skeyid_e)
                        .get_block_size = _get_block_size,
                        .get_icv_size = _get_icv_size,
                        .get_iv_size = _get_iv_size,
+                       .get_iv_gen = _get_iv_gen,
                        .get_key_size = _get_key_size,
                        .set_key = _set_key,
                        .destroy = _aead_destroy,
index 32a0e6759a8c4b29ec95e9ade731db16af73641e..afcc11fbee5d215d2b52614ba84f87018dcd963f 100644 (file)
@@ -1,4 +1,7 @@
 /*
+ * Copyright (C) 2013 Tobias Brunner
+ * Hochschule fuer Technik Rapperswil
+ *
  * Copyright (C) 2010 Martin Willi
  * Copyright (C) 2010 revosec AG
  *
@@ -16,6 +19,7 @@
 #include "aead.h"
 
 #include <utils/debug.h>
+#include <crypto/iv/iv_gen_rand.h>
 
 typedef struct private_aead_t private_aead_t;
 
@@ -35,9 +39,14 @@ struct private_aead_t {
        crypter_t *crypter;
 
        /**
-        * draditional signer
+        * traditional signer
         */
        signer_t *signer;
+
+       /**
+        * IV generator
+        */
+       iv_gen_t *iv_gen;
 };
 
 METHOD(aead_t, encrypt, bool,
@@ -126,6 +135,12 @@ METHOD(aead_t, get_iv_size, size_t,
        return this->crypter->get_iv_size(this->crypter);
 }
 
+METHOD(aead_t, get_iv_gen, iv_gen_t*,
+       private_aead_t *this)
+{
+       return this->iv_gen;
+}
+
 METHOD(aead_t, get_key_size, size_t,
        private_aead_t *this)
 {
@@ -148,6 +163,7 @@ METHOD(aead_t, set_key, bool,
 METHOD(aead_t, destroy, void,
        private_aead_t *this)
 {
+       this->iv_gen->destroy(this->iv_gen);
        this->crypter->destroy(this->crypter);
        this->signer->destroy(this->signer);
        free(this);
@@ -167,12 +183,14 @@ aead_t *aead_create(crypter_t *crypter, signer_t *signer)
                        .get_block_size = _get_block_size,
                        .get_icv_size = _get_icv_size,
                        .get_iv_size = _get_iv_size,
+                       .get_iv_gen = _get_iv_gen,
                        .get_key_size = _get_key_size,
                        .set_key = _set_key,
                        .destroy = _destroy,
                },
                .crypter = crypter,
                .signer = signer,
+               .iv_gen = iv_gen_rand_create(),
        );
 
        return &this->public;
index f3959f8f36cf2ac5af66926c2e79e5226d3bca37..c887f53bba7f5aa3fa671c29dec394ee0fe64501 100644 (file)
@@ -1,4 +1,7 @@
 /*
+ * Copyright (C) 2013 Tobias Brunner
+ * Hochschule fuer Technik Rapperswil
+ *
  * Copyright (C) 2010 Martin Willi
  * Copyright (C) 2010 revosec AG
  *
@@ -26,6 +29,7 @@ typedef struct aead_t aead_t;
 #include <library.h>
 #include <crypto/crypters/crypter.h>
 #include <crypto/signers/signer.h>
+#include <crypto/iv/iv_gen.h>
 
 /**
  * Authenticated encryption / authentication decryption interface.
@@ -88,6 +92,13 @@ struct aead_t {
         */
        size_t (*get_iv_size)(aead_t *this);
 
+       /**
+        * Get the IV generator implementation
+        *
+        * @return                              IV generator
+        */
+       iv_gen_t *(*get_iv_gen)(aead_t *this);
+
        /**
         * Get the size of the key material (for encryption and authentication).
         *
index 0e2f9b75f5b08bce6e89a6255b5ab3391b9e31ea..f5ad606b796f8f487f5e8272c6f0392028a0546d 100644 (file)
@@ -15,6 +15,8 @@
 
 #include "ccm_aead.h"
 
+#include <crypto/iv/iv_gen_seq.h>
+
 #define BLOCK_SIZE 16
 #define SALT_SIZE 3
 #define IV_SIZE 8
@@ -38,6 +40,11 @@ struct private_ccm_aead_t {
         */
        crypter_t *crypter;
 
+       /**
+        * IV generator.
+        */
+       iv_gen_t *iv_gen;
+
        /**
         * Length of the integrity check value
         */
@@ -305,6 +312,12 @@ METHOD(aead_t, get_iv_size, size_t,
        return IV_SIZE;
 }
 
+METHOD(aead_t, get_iv_gen, iv_gen_t*
+       private_ccm_aead_t *this)
+{
+       return this->iv_gen;
+}
+
 METHOD(aead_t, get_key_size, size_t,
        private_ccm_aead_t *this)
 {
@@ -323,6 +336,7 @@ METHOD(aead_t, destroy, void,
        private_ccm_aead_t *this)
 {
        this->crypter->destroy(this->crypter);
+       this->iv_gen->destroy(this->iv_gen);
        free(this);
 }
 
@@ -384,12 +398,14 @@ ccm_aead_t *ccm_aead_create(encryption_algorithm_t algo, size_t key_size)
                                .get_block_size = _get_block_size,
                                .get_icv_size = _get_icv_size,
                                .get_iv_size = _get_iv_size,
+                               .get_iv_gen = _get_iv_gen,
                                .get_key_size = _get_key_size,
                                .set_key = _set_key,
                                .destroy = _destroy,
                        },
                },
                .crypter = lib->crypto->create_crypter(lib->crypto, algo, key_size),
+               .iv_gen = iv_gen_seq_create(),
                .icv_size = icv_size,
        );
 
index 79ee65d984872fb1cd792b548280e77dd3b3bbcc..ba5f2e4b32fd2497503582b96cc8bf816f0b7647 100644 (file)
@@ -16,6 +16,7 @@
 #include "gcm_aead.h"
 
 #include <limits.h>
+#include <crypto/iv/iv_gen_seq.h>
 
 #define BLOCK_SIZE 16
 #define NONCE_SIZE 12
@@ -39,6 +40,11 @@ struct private_gcm_aead_t {
         */
        crypter_t *crypter;
 
+       /**
+        * IV generator.
+        */
+       iv_gen_t *iv_gen;
+
        /**
         * Size of the integrity check value
         */
@@ -337,6 +343,12 @@ METHOD(aead_t, get_iv_size, size_t,
        return IV_SIZE;
 }
 
+METHOD(aead_t, get_iv_gen, iv_gen_t*,
+       private_gcm_aead_t *this)
+{
+       return this->iv_gen;
+}
+
 METHOD(aead_t, get_key_size, size_t,
        private_gcm_aead_t *this)
 {
@@ -356,6 +368,7 @@ METHOD(aead_t, destroy, void,
        private_gcm_aead_t *this)
 {
        this->crypter->destroy(this->crypter);
+       this->iv_gen->destroy(this->iv_gen);
        free(this);
 }
 
@@ -405,12 +418,14 @@ gcm_aead_t *gcm_aead_create(encryption_algorithm_t algo, size_t key_size)
                                .get_block_size = _get_block_size,
                                .get_icv_size = _get_icv_size,
                                .get_iv_size = _get_iv_size,
+                               .get_iv_gen = _get_iv_gen,
                                .get_key_size = _get_key_size,
                                .set_key = _set_key,
                                .destroy = _destroy,
                        },
                },
                .crypter = lib->crypto->create_crypter(lib->crypto, algo, key_size),
+               .iv_gen = iv_gen_seq_create(),
                .icv_size = icv_size,
        );
 
index 89d1cd589b2e01b39d48ada6b83bd28c88b989e6..842111bd368624592e51ba212b56559bf5ef9389 100644 (file)
@@ -20,6 +20,7 @@
 #include "openssl_gcm.h"
 
 #include <openssl/evp.h>
+#include <crypto/iv/iv_gen_seq.h>
 
 /** as defined in RFC 4106 */
 #define IV_LEN         8
@@ -53,6 +54,11 @@ struct private_aead_t {
         */
        size_t icv_size;
 
+       /**
+        * IV generator
+        */
+       iv_gen_t *iv_gen;
+
        /**
         * The cipher to use
         */
@@ -161,6 +167,12 @@ METHOD(aead_t, get_iv_size, size_t,
        return IV_LEN;
 }
 
+METHOD(aead_t, get_iv_gen, iv_gen_t*,
+       private_aead_t *this)
+{
+       return this->iv_gen;
+}
+
 METHOD(aead_t, get_key_size, size_t,
        private_aead_t *this)
 {
@@ -183,6 +195,7 @@ METHOD(aead_t, destroy, void,
        private_aead_t *this)
 {
        chunk_clear(&this->key);
+       this->iv_gen->destroy(this->iv_gen);
        free(this);
 }
 
@@ -200,6 +213,7 @@ aead_t *openssl_gcm_create(encryption_algorithm_t algo, size_t key_size)
                        .get_block_size = _get_block_size,
                        .get_icv_size = _get_icv_size,
                        .get_iv_size = _get_iv_size,
+                       .get_iv_gen = _get_iv_gen,
                        .get_key_size = _get_key_size,
                        .set_key = _set_key,
                        .destroy = _destroy,
@@ -258,6 +272,7 @@ aead_t *openssl_gcm_create(encryption_algorithm_t algo, size_t key_size)
        }
 
        this->key = chunk_alloc(key_size);
+       this->iv_gen = iv_gen_seq_create();
 
        return &this->public;
 }