iv_gen: aead_t implementations provide an IV generator

This commit is contained in:
Tobias Brunner
2013-10-11 15:55:40 +02:00
parent b3e1eb2afe
commit 50bd28d549
6 changed files with 84 additions and 1 deletions
+8
View File
@@ -196,6 +196,13 @@ METHOD(aead_t, get_iv_size, size_t,
return 0; 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, METHOD(aead_t, get_key_size, size_t,
private_aead_t *this) 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_block_size = _get_block_size,
.get_icv_size = _get_icv_size, .get_icv_size = _get_icv_size,
.get_iv_size = _get_iv_size, .get_iv_size = _get_iv_size,
.get_iv_gen = _get_iv_gen,
.get_key_size = _get_key_size, .get_key_size = _get_key_size,
.set_key = _set_key, .set_key = _set_key,
.destroy = _aead_destroy, .destroy = _aead_destroy,
+19 -1
View File
@@ -1,4 +1,7 @@
/* /*
* Copyright (C) 2013 Tobias Brunner
* Hochschule fuer Technik Rapperswil
*
* Copyright (C) 2010 Martin Willi * Copyright (C) 2010 Martin Willi
* Copyright (C) 2010 revosec AG * Copyright (C) 2010 revosec AG
* *
@@ -16,6 +19,7 @@
#include "aead.h" #include "aead.h"
#include <utils/debug.h> #include <utils/debug.h>
#include <crypto/iv/iv_gen_rand.h>
typedef struct private_aead_t private_aead_t; typedef struct private_aead_t private_aead_t;
@@ -35,9 +39,14 @@ struct private_aead_t {
crypter_t *crypter; crypter_t *crypter;
/** /**
* draditional signer * traditional signer
*/ */
signer_t *signer; signer_t *signer;
/**
* IV generator
*/
iv_gen_t *iv_gen;
}; };
METHOD(aead_t, encrypt, bool, 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); 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, METHOD(aead_t, get_key_size, size_t,
private_aead_t *this) private_aead_t *this)
{ {
@@ -148,6 +163,7 @@ METHOD(aead_t, set_key, bool,
METHOD(aead_t, destroy, void, METHOD(aead_t, destroy, void,
private_aead_t *this) private_aead_t *this)
{ {
this->iv_gen->destroy(this->iv_gen);
this->crypter->destroy(this->crypter); this->crypter->destroy(this->crypter);
this->signer->destroy(this->signer); this->signer->destroy(this->signer);
free(this); free(this);
@@ -167,12 +183,14 @@ aead_t *aead_create(crypter_t *crypter, signer_t *signer)
.get_block_size = _get_block_size, .get_block_size = _get_block_size,
.get_icv_size = _get_icv_size, .get_icv_size = _get_icv_size,
.get_iv_size = _get_iv_size, .get_iv_size = _get_iv_size,
.get_iv_gen = _get_iv_gen,
.get_key_size = _get_key_size, .get_key_size = _get_key_size,
.set_key = _set_key, .set_key = _set_key,
.destroy = _destroy, .destroy = _destroy,
}, },
.crypter = crypter, .crypter = crypter,
.signer = signer, .signer = signer,
.iv_gen = iv_gen_rand_create(),
); );
return &this->public; return &this->public;
+11
View File
@@ -1,4 +1,7 @@
/* /*
* Copyright (C) 2013 Tobias Brunner
* Hochschule fuer Technik Rapperswil
*
* Copyright (C) 2010 Martin Willi * Copyright (C) 2010 Martin Willi
* Copyright (C) 2010 revosec AG * Copyright (C) 2010 revosec AG
* *
@@ -26,6 +29,7 @@ typedef struct aead_t aead_t;
#include <library.h> #include <library.h>
#include <crypto/crypters/crypter.h> #include <crypto/crypters/crypter.h>
#include <crypto/signers/signer.h> #include <crypto/signers/signer.h>
#include <crypto/iv/iv_gen.h>
/** /**
* Authenticated encryption / authentication decryption interface. * Authenticated encryption / authentication decryption interface.
@@ -88,6 +92,13 @@ struct aead_t {
*/ */
size_t (*get_iv_size)(aead_t *this); 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). * Get the size of the key material (for encryption and authentication).
* *
+16
View File
@@ -15,6 +15,8 @@
#include "ccm_aead.h" #include "ccm_aead.h"
#include <crypto/iv/iv_gen_seq.h>
#define BLOCK_SIZE 16 #define BLOCK_SIZE 16
#define SALT_SIZE 3 #define SALT_SIZE 3
#define IV_SIZE 8 #define IV_SIZE 8
@@ -38,6 +40,11 @@ struct private_ccm_aead_t {
*/ */
crypter_t *crypter; crypter_t *crypter;
/**
* IV generator.
*/
iv_gen_t *iv_gen;
/** /**
* Length of the integrity check value * Length of the integrity check value
*/ */
@@ -305,6 +312,12 @@ METHOD(aead_t, get_iv_size, size_t,
return IV_SIZE; 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, METHOD(aead_t, get_key_size, size_t,
private_ccm_aead_t *this) private_ccm_aead_t *this)
{ {
@@ -323,6 +336,7 @@ METHOD(aead_t, destroy, void,
private_ccm_aead_t *this) private_ccm_aead_t *this)
{ {
this->crypter->destroy(this->crypter); this->crypter->destroy(this->crypter);
this->iv_gen->destroy(this->iv_gen);
free(this); 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_block_size = _get_block_size,
.get_icv_size = _get_icv_size, .get_icv_size = _get_icv_size,
.get_iv_size = _get_iv_size, .get_iv_size = _get_iv_size,
.get_iv_gen = _get_iv_gen,
.get_key_size = _get_key_size, .get_key_size = _get_key_size,
.set_key = _set_key, .set_key = _set_key,
.destroy = _destroy, .destroy = _destroy,
}, },
}, },
.crypter = lib->crypto->create_crypter(lib->crypto, algo, key_size), .crypter = lib->crypto->create_crypter(lib->crypto, algo, key_size),
.iv_gen = iv_gen_seq_create(),
.icv_size = icv_size, .icv_size = icv_size,
); );
+15
View File
@@ -16,6 +16,7 @@
#include "gcm_aead.h" #include "gcm_aead.h"
#include <limits.h> #include <limits.h>
#include <crypto/iv/iv_gen_seq.h>
#define BLOCK_SIZE 16 #define BLOCK_SIZE 16
#define NONCE_SIZE 12 #define NONCE_SIZE 12
@@ -39,6 +40,11 @@ struct private_gcm_aead_t {
*/ */
crypter_t *crypter; crypter_t *crypter;
/**
* IV generator.
*/
iv_gen_t *iv_gen;
/** /**
* Size of the integrity check value * Size of the integrity check value
*/ */
@@ -337,6 +343,12 @@ METHOD(aead_t, get_iv_size, size_t,
return IV_SIZE; 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, METHOD(aead_t, get_key_size, size_t,
private_gcm_aead_t *this) private_gcm_aead_t *this)
{ {
@@ -356,6 +368,7 @@ METHOD(aead_t, destroy, void,
private_gcm_aead_t *this) private_gcm_aead_t *this)
{ {
this->crypter->destroy(this->crypter); this->crypter->destroy(this->crypter);
this->iv_gen->destroy(this->iv_gen);
free(this); 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_block_size = _get_block_size,
.get_icv_size = _get_icv_size, .get_icv_size = _get_icv_size,
.get_iv_size = _get_iv_size, .get_iv_size = _get_iv_size,
.get_iv_gen = _get_iv_gen,
.get_key_size = _get_key_size, .get_key_size = _get_key_size,
.set_key = _set_key, .set_key = _set_key,
.destroy = _destroy, .destroy = _destroy,
}, },
}, },
.crypter = lib->crypto->create_crypter(lib->crypto, algo, key_size), .crypter = lib->crypto->create_crypter(lib->crypto, algo, key_size),
.iv_gen = iv_gen_seq_create(),
.icv_size = icv_size, .icv_size = icv_size,
); );
@@ -20,6 +20,7 @@
#include "openssl_gcm.h" #include "openssl_gcm.h"
#include <openssl/evp.h> #include <openssl/evp.h>
#include <crypto/iv/iv_gen_seq.h>
/** as defined in RFC 4106 */ /** as defined in RFC 4106 */
#define IV_LEN 8 #define IV_LEN 8
@@ -53,6 +54,11 @@ struct private_aead_t {
*/ */
size_t icv_size; size_t icv_size;
/**
* IV generator
*/
iv_gen_t *iv_gen;
/** /**
* The cipher to use * The cipher to use
*/ */
@@ -161,6 +167,12 @@ METHOD(aead_t, get_iv_size, size_t,
return IV_LEN; 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, METHOD(aead_t, get_key_size, size_t,
private_aead_t *this) private_aead_t *this)
{ {
@@ -183,6 +195,7 @@ METHOD(aead_t, destroy, void,
private_aead_t *this) private_aead_t *this)
{ {
chunk_clear(&this->key); chunk_clear(&this->key);
this->iv_gen->destroy(this->iv_gen);
free(this); 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_block_size = _get_block_size,
.get_icv_size = _get_icv_size, .get_icv_size = _get_icv_size,
.get_iv_size = _get_iv_size, .get_iv_size = _get_iv_size,
.get_iv_gen = _get_iv_gen,
.get_key_size = _get_key_size, .get_key_size = _get_key_size,
.set_key = _set_key, .set_key = _set_key,
.destroy = _destroy, .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->key = chunk_alloc(key_size);
this->iv_gen = iv_gen_seq_create();
return &this->public; return &this->public;
} }