- return value cleanup
This commit is contained in:
@@ -1474,90 +1474,90 @@ static status_t set_key (private_aes_cbc_crypter_t *this, chunk_t key)
|
||||
{
|
||||
u_int32_t *kf, *kt, rci, f = 0;
|
||||
u_int8_t *in_key = key.ptr;
|
||||
|
||||
|
||||
if (key.len != this->blocksize)
|
||||
{
|
||||
return INVALID_ARG;
|
||||
}
|
||||
|
||||
this->aes_Nrnd = (this->aes_Nkey > (this->aes_Ncol) ? this->aes_Nkey : (this->aes_Ncol)) + 6;
|
||||
|
||||
this->aes_e_key[0] = const_word_in(in_key );
|
||||
this->aes_e_key[1] = const_word_in(in_key + 4);
|
||||
this->aes_e_key[2] = const_word_in(in_key + 8);
|
||||
this->aes_e_key[3] = const_word_in(in_key + 12);
|
||||
|
||||
kf = this->aes_e_key;
|
||||
kt = kf + nc * (this->aes_Nrnd + 1) - this->aes_Nkey;
|
||||
rci = 0;
|
||||
|
||||
switch(this->aes_Nkey)
|
||||
{
|
||||
case 4: do
|
||||
{ kf[4] = kf[0] ^ ls_box(kf[3],3) ^ rcon_tab[rci++];
|
||||
kf[5] = kf[1] ^ kf[4];
|
||||
kf[6] = kf[2] ^ kf[5];
|
||||
kf[7] = kf[3] ^ kf[6];
|
||||
kf += 4;
|
||||
}
|
||||
while(kf < kt);
|
||||
break;
|
||||
|
||||
case 6: this->aes_e_key[4] = const_word_in(in_key + 16);
|
||||
this->aes_e_key[5] = const_word_in(in_key + 20);
|
||||
do
|
||||
{ kf[ 6] = kf[0] ^ ls_box(kf[5],3) ^ rcon_tab[rci++];
|
||||
kf[ 7] = kf[1] ^ kf[ 6];
|
||||
kf[ 8] = kf[2] ^ kf[ 7];
|
||||
kf[ 9] = kf[3] ^ kf[ 8];
|
||||
kf[10] = kf[4] ^ kf[ 9];
|
||||
kf[11] = kf[5] ^ kf[10];
|
||||
kf += 6;
|
||||
}
|
||||
while(kf < kt);
|
||||
break;
|
||||
|
||||
this->aes_Nrnd = (this->aes_Nkey > (this->aes_Ncol) ? this->aes_Nkey : (this->aes_Ncol)) + 6;
|
||||
|
||||
this->aes_e_key[0] = const_word_in(in_key );
|
||||
this->aes_e_key[1] = const_word_in(in_key + 4);
|
||||
this->aes_e_key[2] = const_word_in(in_key + 8);
|
||||
this->aes_e_key[3] = const_word_in(in_key + 12);
|
||||
|
||||
kf = this->aes_e_key;
|
||||
kt = kf + nc * (this->aes_Nrnd + 1) - this->aes_Nkey;
|
||||
rci = 0;
|
||||
|
||||
switch(this->aes_Nkey)
|
||||
case 8: this->aes_e_key[4] = const_word_in(in_key + 16);
|
||||
this->aes_e_key[5] = const_word_in(in_key + 20);
|
||||
this->aes_e_key[6] = const_word_in(in_key + 24);
|
||||
this->aes_e_key[7] = const_word_in(in_key + 28);
|
||||
do
|
||||
{ kf[ 8] = kf[0] ^ ls_box(kf[7],3) ^ rcon_tab[rci++];
|
||||
kf[ 9] = kf[1] ^ kf[ 8];
|
||||
kf[10] = kf[2] ^ kf[ 9];
|
||||
kf[11] = kf[3] ^ kf[10];
|
||||
kf[12] = kf[4] ^ ls_box(kf[11],0);
|
||||
kf[13] = kf[5] ^ kf[12];
|
||||
kf[14] = kf[6] ^ kf[13];
|
||||
kf[15] = kf[7] ^ kf[14];
|
||||
kf += 8;
|
||||
}
|
||||
while (kf < kt);
|
||||
break;
|
||||
}
|
||||
|
||||
if(!f)
|
||||
{
|
||||
case 4: do
|
||||
{ kf[4] = kf[0] ^ ls_box(kf[3],3) ^ rcon_tab[rci++];
|
||||
kf[5] = kf[1] ^ kf[4];
|
||||
kf[6] = kf[2] ^ kf[5];
|
||||
kf[7] = kf[3] ^ kf[6];
|
||||
kf += 4;
|
||||
}
|
||||
while(kf < kt);
|
||||
break;
|
||||
u_int32_t i;
|
||||
|
||||
case 6: this->aes_e_key[4] = const_word_in(in_key + 16);
|
||||
this->aes_e_key[5] = const_word_in(in_key + 20);
|
||||
do
|
||||
{ kf[ 6] = kf[0] ^ ls_box(kf[5],3) ^ rcon_tab[rci++];
|
||||
kf[ 7] = kf[1] ^ kf[ 6];
|
||||
kf[ 8] = kf[2] ^ kf[ 7];
|
||||
kf[ 9] = kf[3] ^ kf[ 8];
|
||||
kf[10] = kf[4] ^ kf[ 9];
|
||||
kf[11] = kf[5] ^ kf[10];
|
||||
kf += 6;
|
||||
}
|
||||
while(kf < kt);
|
||||
break;
|
||||
|
||||
case 8: this->aes_e_key[4] = const_word_in(in_key + 16);
|
||||
this->aes_e_key[5] = const_word_in(in_key + 20);
|
||||
this->aes_e_key[6] = const_word_in(in_key + 24);
|
||||
this->aes_e_key[7] = const_word_in(in_key + 28);
|
||||
do
|
||||
{ kf[ 8] = kf[0] ^ ls_box(kf[7],3) ^ rcon_tab[rci++];
|
||||
kf[ 9] = kf[1] ^ kf[ 8];
|
||||
kf[10] = kf[2] ^ kf[ 9];
|
||||
kf[11] = kf[3] ^ kf[10];
|
||||
kf[12] = kf[4] ^ ls_box(kf[11],0);
|
||||
kf[13] = kf[5] ^ kf[12];
|
||||
kf[14] = kf[6] ^ kf[13];
|
||||
kf[15] = kf[7] ^ kf[14];
|
||||
kf += 8;
|
||||
}
|
||||
while (kf < kt);
|
||||
break;
|
||||
}
|
||||
|
||||
if(!f)
|
||||
{ u_int32_t i;
|
||||
|
||||
kt = this->aes_d_key + nc * this->aes_Nrnd;
|
||||
kf = this->aes_e_key;
|
||||
|
||||
cpy(kt, kf); kt -= 2 * nc;
|
||||
|
||||
for(i = 1; i < this->aes_Nrnd; ++i)
|
||||
{
|
||||
kt = this->aes_d_key + nc * this->aes_Nrnd;
|
||||
kf = this->aes_e_key;
|
||||
|
||||
cpy(kt, kf); kt -= 2 * nc;
|
||||
|
||||
for(i = 1; i < this->aes_Nrnd; ++i)
|
||||
{
|
||||
#if defined(ONE_TABLE) || defined(FOUR_TABLES)
|
||||
#if !defined(ONE_IM_TABLE) && !defined(FOUR_IM_TABLES)
|
||||
u_int32_t f2, f4, f8, f9;
|
||||
u_int32_t f2, f4, f8, f9;
|
||||
#endif
|
||||
mix(kt, kf);
|
||||
mix(kt, kf);
|
||||
#else
|
||||
cpy(kt, kf);
|
||||
cpy(kt, kf);
|
||||
#endif
|
||||
kt -= 2 * nc;
|
||||
kt -= 2 * nc;
|
||||
}
|
||||
|
||||
cpy(kt, kf);
|
||||
cpy(kt, kf);
|
||||
}
|
||||
|
||||
return SUCCESS;
|
||||
@@ -1566,10 +1566,9 @@ static status_t set_key (private_aes_cbc_crypter_t *this, chunk_t key)
|
||||
/**
|
||||
* Implementation of crypter_t.destroy and aes_cbc_crypter_t.destroy.
|
||||
*/
|
||||
static status_t destroy (private_aes_cbc_crypter_t *this)
|
||||
static void destroy (private_aes_cbc_crypter_t *this)
|
||||
{
|
||||
allocator_free(this);
|
||||
return SUCCESS;
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -1578,10 +1577,7 @@ static status_t destroy (private_aes_cbc_crypter_t *this)
|
||||
aes_cbc_crypter_t *aes_cbc_crypter_create(size_t blocksize)
|
||||
{
|
||||
private_aes_cbc_crypter_t *this = allocator_alloc_thing(private_aes_cbc_crypter_t);
|
||||
if (this == NULL)
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
|
||||
#if !defined(FIXED_TABLES)
|
||||
if(!tab_gen) { gen_tabs(); tab_gen = 1; }
|
||||
#endif
|
||||
@@ -1610,10 +1606,7 @@ aes_cbc_crypter_t *aes_cbc_crypter_create(size_t blocksize)
|
||||
this->public.crypter_interface.decrypt = (status_t (*) (crypter_t *, chunk_t , chunk_t, chunk_t *)) decrypt;
|
||||
this->public.crypter_interface.get_block_size = (size_t (*) (crypter_t *)) get_block_size;
|
||||
this->public.crypter_interface.set_key = (status_t (*) (crypter_t *,chunk_t)) set_key;
|
||||
this->public.crypter_interface.destroy = (status_t (*) (crypter_t *)) destroy;
|
||||
|
||||
/* public functions */
|
||||
this->public.destroy = (status_t (*) (aes_cbc_crypter_t *)) destroy;
|
||||
this->public.crypter_interface.destroy = (void (*) (crypter_t *)) destroy;
|
||||
|
||||
/* private functions */
|
||||
this->decrypt_block = decrypt_block;
|
||||
|
||||
@@ -40,26 +40,15 @@ struct aes_cbc_crypter_t {
|
||||
* crypter_t interface.
|
||||
*/
|
||||
crypter_t crypter_interface;
|
||||
|
||||
/**
|
||||
* @brief Destroys a aes_cbc_crypter_t object.
|
||||
*
|
||||
* @param this crypter_t object to destroy
|
||||
* @return
|
||||
* - SUCCESS in any case
|
||||
*/
|
||||
status_t (*destroy) (aes_cbc_crypter_t *this);
|
||||
};
|
||||
|
||||
/**
|
||||
* @brief Constructor to create aes_cbc_crypter_t objects.
|
||||
*
|
||||
* @param blocksize block size of AES crypter
|
||||
* (16, 24 or 32 are supported)
|
||||
* Default size is set to 16.
|
||||
* @return
|
||||
* - aes_cbc_crypter_t if successfully
|
||||
* - NULL if out of ressources
|
||||
* @param blocksize block size of AES crypter
|
||||
* (16, 24 or 32 are supported)
|
||||
* Default size is set to 16.
|
||||
* @return aes_cbc_crypter_t if successfully
|
||||
*/
|
||||
aes_cbc_crypter_t *aes_cbc_crypter_create(size_t blocksize);
|
||||
|
||||
|
||||
@@ -56,7 +56,6 @@ crypter_t *crypter_create(encryption_algorithm_t encryption_algorithm,size_t blo
|
||||
case ENCR_AES_CBC:
|
||||
{
|
||||
return (crypter_t*)aes_cbc_crypter_create(blocksize);
|
||||
|
||||
}
|
||||
default:
|
||||
return NULL;
|
||||
|
||||
@@ -68,8 +68,9 @@ struct crypter_t {
|
||||
* @param data data to encrypt
|
||||
* @param iv iv
|
||||
* @param [out]encrypted pointer where the encrypted bytes will be written
|
||||
* @return
|
||||
* - SUCCESS in any case
|
||||
* @return
|
||||
* - SUCCESS, or
|
||||
* - INVALID_ARG if data size not a multiple of block size
|
||||
*/
|
||||
status_t (*encrypt) (crypter_t *this, chunk_t data, chunk_t iv, chunk_t *encrypted);
|
||||
|
||||
@@ -81,8 +82,9 @@ struct crypter_t {
|
||||
* @param data data to decrypt
|
||||
* @param iv iv
|
||||
* @param [out]encrypted pointer where the decrypted bytes will be written
|
||||
* @return
|
||||
* - SUCCESS in any case
|
||||
* @return
|
||||
* - SUCCESS, or
|
||||
* - INVALID_ARG if data size not a multiple of block size
|
||||
*/
|
||||
status_t (*decrypt) (crypter_t *this, chunk_t data, chunk_t iv, chunk_t *decrypted);
|
||||
|
||||
@@ -100,7 +102,8 @@ struct crypter_t {
|
||||
* @param this calling crypter
|
||||
* @param key key to set
|
||||
* @return
|
||||
* - SUCCESS in any case
|
||||
* - SUCCESS, or
|
||||
* - INVALID_ARG if key size != block size
|
||||
*/
|
||||
status_t (*set_key) (crypter_t *this, chunk_t key);
|
||||
|
||||
@@ -108,10 +111,8 @@ struct crypter_t {
|
||||
* @brief Destroys a crypter_t object.
|
||||
*
|
||||
* @param this crypter_t object to destroy
|
||||
* @return
|
||||
* - SUCCESS in any case
|
||||
*/
|
||||
status_t (*destroy) (crypter_t *this);
|
||||
void (*destroy) (crypter_t *this);
|
||||
};
|
||||
|
||||
/**
|
||||
@@ -121,7 +122,7 @@ struct crypter_t {
|
||||
* @param blocksize block size in bytes
|
||||
* @return
|
||||
* - crypter_t if successfully
|
||||
* - NULL if out of ressources or crypter not supported
|
||||
* - NULL if crypter not supported
|
||||
*/
|
||||
crypter_t *crypter_create(encryption_algorithm_t encryption_algorithm, size_t blocksize);
|
||||
|
||||
|
||||
@@ -438,8 +438,7 @@ struct private_diffie_hellman_t {
|
||||
};
|
||||
|
||||
/**
|
||||
* Implements private_diffie_hellman_t's set_modulus function.
|
||||
* See #private_diffie_hellman_t.set_modulus for description.
|
||||
* Implements private_diffie_hellman_tset_modulus.
|
||||
*/
|
||||
static status_t set_modulus(private_diffie_hellman_t *this)
|
||||
{
|
||||
@@ -464,19 +463,16 @@ static status_t set_modulus(private_diffie_hellman_t *this)
|
||||
}
|
||||
|
||||
/**
|
||||
* Implements diffie_hellman_t's set_other_public_value function.
|
||||
* See #diffie_hellman_t.set_other_public_value for description.
|
||||
* Implementation of diffie_hellman_t.set_other_public_value.
|
||||
*/
|
||||
static status_t set_other_public_value(private_diffie_hellman_t *this,chunk_t public_value)
|
||||
static void set_other_public_value(private_diffie_hellman_t *this,chunk_t public_value)
|
||||
{
|
||||
this->gmp_helper->chunk_to_mpz(this->gmp_helper,&(this->other_public_value),public_value);
|
||||
this->compute_shared_secret(this);
|
||||
return SUCCESS;
|
||||
this->compute_shared_secret(this);
|
||||
}
|
||||
|
||||
/**
|
||||
* Implements diffie_hellman_t's get_other_public_value function.
|
||||
* See #diffie_hellman_t.get_other_public_value for description.
|
||||
* Implements diffie_hellman_t.get_other_public_value.
|
||||
*/
|
||||
static status_t get_other_public_value(private_diffie_hellman_t *this,chunk_t *public_value)
|
||||
{
|
||||
@@ -484,12 +480,12 @@ static status_t get_other_public_value(private_diffie_hellman_t *this,chunk_t *p
|
||||
{
|
||||
return FAILED;
|
||||
}
|
||||
return (this->gmp_helper->mpz_to_chunk(this->gmp_helper,&(this->other_public_value), public_value,this->modulus_length));
|
||||
this->gmp_helper->mpz_to_chunk(this->gmp_helper,&(this->other_public_value), public_value,this->modulus_length);
|
||||
return SUCCESS;
|
||||
}
|
||||
|
||||
/**
|
||||
* Implements private_diffie_hellman_t's compute_shared_secret function.
|
||||
* See #private_diffie_hellman_t.compute_shared_secret for description.
|
||||
* Implements private_diffie_hellman_t.compute_shared_secret.
|
||||
*/
|
||||
static void compute_shared_secret (private_diffie_hellman_t *this)
|
||||
{
|
||||
@@ -497,14 +493,13 @@ static void compute_shared_secret (private_diffie_hellman_t *this)
|
||||
mpz_init(this->shared_secret);
|
||||
/* calculate my public value */
|
||||
mpz_powm(this->shared_secret,this->other_public_value,this->my_prime,this->modulus);
|
||||
|
||||
|
||||
this->shared_secret_is_computed = TRUE;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Implements private_diffie_hellman_t's compute_public_value function.
|
||||
* See #private_diffie_hellman_t.compute_public_value for description.
|
||||
* Implements private_diffie_hellman_t.compute_public_value.
|
||||
*/
|
||||
static void compute_public_value (private_diffie_hellman_t *this)
|
||||
{
|
||||
@@ -521,8 +516,7 @@ static void compute_public_value (private_diffie_hellman_t *this)
|
||||
}
|
||||
|
||||
/**
|
||||
* Implements diffie_hellman_t's get_my_public_value function.
|
||||
* See #diffie_hellman_t.get_my_public_value for description.
|
||||
* Implements diffie_hellman_t.get_my_public_value.
|
||||
*/
|
||||
static status_t get_my_public_value(private_diffie_hellman_t *this,chunk_t *public_value)
|
||||
{
|
||||
@@ -530,12 +524,12 @@ static status_t get_my_public_value(private_diffie_hellman_t *this,chunk_t *publ
|
||||
{
|
||||
this->compute_public_value(this);
|
||||
}
|
||||
return (this->gmp_helper->mpz_to_chunk(this->gmp_helper,&(this->my_public_value), public_value,this->modulus_length));
|
||||
this->gmp_helper->mpz_to_chunk(this->gmp_helper,&(this->my_public_value), public_value,this->modulus_length);
|
||||
return SUCCESS;
|
||||
}
|
||||
|
||||
/**
|
||||
* Implements diffie_hellman_t's get_shared_secret function.
|
||||
* See #diffie_hellman_t.get_shared_secret for description.
|
||||
* Implements diffie_hellman_t.get_shared_secret.
|
||||
*/
|
||||
static status_t get_shared_secret(private_diffie_hellman_t *this,chunk_t *secret)
|
||||
{
|
||||
@@ -543,14 +537,14 @@ static status_t get_shared_secret(private_diffie_hellman_t *this,chunk_t *secret
|
||||
{
|
||||
return FAILED;
|
||||
}
|
||||
return (this->gmp_helper->mpz_to_chunk(this->gmp_helper,&(this->shared_secret), secret,this->modulus_length));
|
||||
this->gmp_helper->mpz_to_chunk(this->gmp_helper,&(this->shared_secret), secret,this->modulus_length);
|
||||
return SUCCESS;
|
||||
}
|
||||
|
||||
/**
|
||||
* Implements diffie_hellman_t's destroy function.
|
||||
* See #diffie_hellman_t.destroy for description.
|
||||
* Implements diffie_hellman_t.destroy.
|
||||
*/
|
||||
static status_t destroy(private_diffie_hellman_t *this)
|
||||
static void destroy(private_diffie_hellman_t *this)
|
||||
{
|
||||
this->gmp_helper->destroy(this->gmp_helper);
|
||||
mpz_clear(this->modulus);
|
||||
@@ -565,9 +559,7 @@ static status_t destroy(private_diffie_hellman_t *this)
|
||||
mpz_clear(this->other_public_value);
|
||||
mpz_clear(this->shared_secret);
|
||||
}
|
||||
|
||||
allocator_free(this);
|
||||
return SUCCESS;
|
||||
}
|
||||
|
||||
|
||||
@@ -577,17 +569,13 @@ static status_t destroy(private_diffie_hellman_t *this)
|
||||
diffie_hellman_t *diffie_hellman_create(diffie_hellman_group_t dh_group_number)
|
||||
{
|
||||
private_diffie_hellman_t *this = allocator_alloc_thing(private_diffie_hellman_t);
|
||||
if ((this == NULL))
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
||||
/* public functions */
|
||||
this->public.get_shared_secret = (status_t (*)(diffie_hellman_t *, chunk_t *)) get_shared_secret;
|
||||
this->public.set_other_public_value = (status_t (*)(diffie_hellman_t *, chunk_t )) set_other_public_value;
|
||||
this->public.set_other_public_value = (void (*)(diffie_hellman_t *, chunk_t )) set_other_public_value;
|
||||
this->public.get_other_public_value = (status_t (*)(diffie_hellman_t *, chunk_t *)) get_other_public_value;
|
||||
this->public.get_my_public_value = (status_t (*)(diffie_hellman_t *, chunk_t *)) get_my_public_value;
|
||||
this->public.destroy = (status_t (*)(diffie_hellman_t *)) destroy;
|
||||
this->public.destroy = (void (*)(diffie_hellman_t *)) destroy;
|
||||
|
||||
/* private functions */
|
||||
this->set_modulus = set_modulus;
|
||||
@@ -599,12 +587,6 @@ diffie_hellman_t *diffie_hellman_create(diffie_hellman_group_t dh_group_number)
|
||||
|
||||
this->gmp_helper = gmp_helper_create();
|
||||
|
||||
if (this->gmp_helper == NULL)
|
||||
{
|
||||
allocator_free(this);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/* set this->modulus */
|
||||
if (this->set_modulus(this) != SUCCESS)
|
||||
{
|
||||
@@ -612,13 +594,9 @@ diffie_hellman_t *diffie_hellman_create(diffie_hellman_group_t dh_group_number)
|
||||
allocator_free(this);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
if (this->gmp_helper->init_prime(this->gmp_helper,&(this->my_prime),this->modulus_length) != SUCCESS)
|
||||
{
|
||||
this->gmp_helper->destroy(this->gmp_helper);
|
||||
allocator_free(this);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
this->gmp_helper->init_prime(this->gmp_helper,&(this->my_prime),this->modulus_length);
|
||||
|
||||
this->my_public_value_is_computed = FALSE;
|
||||
this->shared_secret_is_computed = FALSE;
|
||||
|
||||
|
||||
@@ -73,7 +73,6 @@ struct diffie_hellman_t {
|
||||
* @return
|
||||
* - SUCCESS, or
|
||||
* - FAILED if not both DH values are set
|
||||
* - OUT_OF_RES if out of ressources
|
||||
*/
|
||||
status_t (*get_shared_secret) (diffie_hellman_t *this, chunk_t *secret);
|
||||
|
||||
@@ -84,11 +83,8 @@ struct diffie_hellman_t {
|
||||
*
|
||||
* @param this calling diffie_hellman_t object
|
||||
* @param public_value public value of partner
|
||||
* @return
|
||||
* - SUCCESS, or
|
||||
* - OUT_OF_RES if out of ressources
|
||||
*/
|
||||
status_t (*set_other_public_value) (diffie_hellman_t *this, chunk_t public_value);
|
||||
void (*set_other_public_value) (diffie_hellman_t *this, chunk_t public_value);
|
||||
|
||||
/**
|
||||
* @brief Gets the public value of partner.
|
||||
@@ -99,7 +95,6 @@ struct diffie_hellman_t {
|
||||
* @param[out] public_value public value of partner is stored at this location
|
||||
* @return
|
||||
* - SUCCESS, or
|
||||
* - OUT_OF_RES if out of ressources
|
||||
* - FAILED if other public value not set
|
||||
*/
|
||||
status_t (*get_other_public_value) (diffie_hellman_t *this, chunk_t *public_value);
|
||||
@@ -110,10 +105,10 @@ struct diffie_hellman_t {
|
||||
* @warning chunk gets copied
|
||||
*
|
||||
* @param this calling diffie_hellman_t object
|
||||
* @param[out] public_value public value of caller is stored at this location
|
||||
* @param[out] public_value public value of caller is stored at this location
|
||||
* @return
|
||||
* - SUCCESS, or
|
||||
* - OUT_OF_RES if out of ressources
|
||||
* - FAILED if not computed
|
||||
*/
|
||||
status_t (*get_my_public_value) (diffie_hellman_t *this, chunk_t *public_value);
|
||||
|
||||
@@ -121,10 +116,8 @@ struct diffie_hellman_t {
|
||||
* @brief Destroys an diffie_hellman_t object.
|
||||
*
|
||||
* @param this diffie_hellman_t object to destroy
|
||||
* @return
|
||||
* - SUCCESS in any case
|
||||
*/
|
||||
status_t (*destroy) (diffie_hellman_t *this);
|
||||
void (*destroy) (diffie_hellman_t *this);
|
||||
};
|
||||
|
||||
/**
|
||||
@@ -134,8 +127,8 @@ struct diffie_hellman_t {
|
||||
*
|
||||
* @param dh_group_number Diffie Hellman group number to use
|
||||
* @return
|
||||
* - diffie_hellman_t if successfully
|
||||
* - NULL if out of ressources or dh_group not supported
|
||||
* - diffie_hellman_t object
|
||||
* - NULL if dh group not supported
|
||||
*
|
||||
* @ingroup transforms
|
||||
*/
|
||||
|
||||
@@ -54,8 +54,3 @@ hasher_t *hasher_create(hash_algorithm_t hash_algorithm)
|
||||
return NULL;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -63,10 +63,8 @@ struct hasher_t {
|
||||
* @param this calling hasher
|
||||
* @param data data to hash
|
||||
* @param [out]buffer pointer where the hash will be written
|
||||
* @return
|
||||
* - SUCCESS in any case
|
||||
*/
|
||||
status_t (*get_hash) (hasher_t *this, chunk_t data, u_int8_t *hash);
|
||||
void (*get_hash) (hasher_t *this, chunk_t data, u_int8_t *hash);
|
||||
|
||||
/**
|
||||
* @brief hash data and allocate space for the hash
|
||||
@@ -78,11 +76,8 @@ struct hasher_t {
|
||||
* @param this calling hasher
|
||||
* @param data chunk with data to hash
|
||||
* @param [out]hash chunk which will hold allocated hash
|
||||
* @return
|
||||
* - SUCCESS in any case
|
||||
* - OUT_OF_RES if space could not be allocated
|
||||
*/
|
||||
status_t (*allocate_hash) (hasher_t *this, chunk_t data, chunk_t *hash);
|
||||
void (*allocate_hash) (hasher_t *this, chunk_t data, chunk_t *hash);
|
||||
|
||||
/**
|
||||
* @brief Get the block size of this hashing function.
|
||||
@@ -97,18 +92,15 @@ struct hasher_t {
|
||||
* computation of a completly new hash.
|
||||
*
|
||||
* @param this calling hasher
|
||||
* @return - SUCCESS in any case
|
||||
*/
|
||||
status_t (*reset) (hasher_t *this);
|
||||
void (*reset) (hasher_t *this);
|
||||
|
||||
/**
|
||||
* @brief Destroys a hasher object.
|
||||
*
|
||||
* @param this hasher_t object to destroy
|
||||
* @return
|
||||
* SUCCESS in any case
|
||||
*/
|
||||
status_t (*destroy) (hasher_t *this);
|
||||
void (*destroy) (hasher_t *this);
|
||||
};
|
||||
|
||||
/**
|
||||
@@ -117,7 +109,7 @@ struct hasher_t {
|
||||
* @param hash_algorithm Algorithm to use for hashing
|
||||
* @return
|
||||
* - hasher_t if successfully
|
||||
* - NULL if out of ressources
|
||||
* - NULL if algorithm not supported
|
||||
*
|
||||
* @ingroup hashers
|
||||
*/
|
||||
|
||||
@@ -244,7 +244,7 @@ static void MD5Transform(u_int32_t state[4], u_int8_t block[64])
|
||||
* operation, processing another message block, and updating the
|
||||
* context.
|
||||
*/
|
||||
void MD5Update(private_md5_hasher_t *this, u_int8_t *input, size_t inputLen)
|
||||
static void MD5Update(private_md5_hasher_t *this, u_int8_t *input, size_t inputLen)
|
||||
{
|
||||
u_int32_t i;
|
||||
size_t index, partLen;
|
||||
@@ -285,7 +285,7 @@ void MD5Update(private_md5_hasher_t *this, u_int8_t *input, size_t inputLen)
|
||||
/* MD5 finalization. Ends an MD5 message-digest operation, writing the
|
||||
* the message digest and zeroizing the context.
|
||||
*/
|
||||
void MD5Final (private_md5_hasher_t *this, u_int8_t digest[16])
|
||||
static void MD5Final (private_md5_hasher_t *this, u_int8_t digest[16])
|
||||
{
|
||||
u_int8_t bits[8];
|
||||
size_t index, padLen;
|
||||
@@ -313,7 +313,7 @@ void MD5Final (private_md5_hasher_t *this, u_int8_t digest[16])
|
||||
/**
|
||||
* implementation of hasher_t.get_hash for md5
|
||||
*/
|
||||
static status_t get_hash(private_md5_hasher_t *this, chunk_t chunk, u_int8_t *buffer)
|
||||
static void get_hash(private_md5_hasher_t *this, chunk_t chunk, u_int8_t *buffer)
|
||||
{
|
||||
MD5Update(this, chunk.ptr, chunk.len);
|
||||
if (buffer != NULL)
|
||||
@@ -321,14 +321,13 @@ static status_t get_hash(private_md5_hasher_t *this, chunk_t chunk, u_int8_t *bu
|
||||
MD5Final(this, buffer);
|
||||
this->public.hasher_interface.reset(&(this->public.hasher_interface));
|
||||
}
|
||||
return SUCCESS;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* implementation of hasher_t.allocate_hash for md5
|
||||
*/
|
||||
static status_t allocate_hash(private_md5_hasher_t *this, chunk_t chunk, chunk_t *hash)
|
||||
static void allocate_hash(private_md5_hasher_t *this, chunk_t chunk, chunk_t *hash)
|
||||
{
|
||||
chunk_t allocated_hash;
|
||||
|
||||
@@ -337,17 +336,12 @@ static status_t allocate_hash(private_md5_hasher_t *this, chunk_t chunk, chunk_t
|
||||
{
|
||||
allocated_hash.ptr = allocator_alloc(BLOCK_SIZE_MD5);
|
||||
allocated_hash.len = BLOCK_SIZE_MD5;
|
||||
if (allocated_hash.ptr == NULL)
|
||||
{
|
||||
return OUT_OF_RES;
|
||||
}
|
||||
|
||||
MD5Final(this, allocated_hash.ptr);
|
||||
this->public.hasher_interface.reset(&(this->public.hasher_interface));
|
||||
|
||||
*hash = allocated_hash;
|
||||
}
|
||||
|
||||
return SUCCESS;
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -357,11 +351,11 @@ static size_t get_block_size(private_md5_hasher_t *this)
|
||||
{
|
||||
return BLOCK_SIZE_MD5;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* implementation of hasher_t.reset for md5
|
||||
*/
|
||||
static status_t reset(private_md5_hasher_t *this)
|
||||
static void reset(private_md5_hasher_t *this)
|
||||
{
|
||||
this->state[0] = 0x67452301;
|
||||
this->state[1] = 0xefcdab89;
|
||||
@@ -369,34 +363,28 @@ static status_t reset(private_md5_hasher_t *this)
|
||||
this->state[3] = 0x10325476;
|
||||
this->count[0] = 0;
|
||||
this->count[1] = 0;
|
||||
return SUCCESS;
|
||||
}
|
||||
|
||||
/**
|
||||
* implementation of hasher_t.destroy for md5
|
||||
*/
|
||||
static status_t destroy(private_md5_hasher_t *this)
|
||||
static void destroy(private_md5_hasher_t *this)
|
||||
{
|
||||
allocator_free(this);
|
||||
return SUCCESS;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* Described in header
|
||||
*/
|
||||
md5_hasher_t *md5_hasher_create()
|
||||
{
|
||||
private_md5_hasher_t *this = allocator_alloc_thing(private_md5_hasher_t);
|
||||
if (this == NULL)
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
|
||||
this->public.hasher_interface.get_hash = (status_t (*) (hasher_t*, chunk_t, u_int8_t*))get_hash;
|
||||
this->public.hasher_interface.allocate_hash = (status_t (*) (hasher_t*, chunk_t, chunk_t*))allocate_hash;
|
||||
|
||||
this->public.hasher_interface.get_hash = (void (*) (hasher_t*, chunk_t, u_int8_t*))get_hash;
|
||||
this->public.hasher_interface.allocate_hash = (void (*) (hasher_t*, chunk_t, chunk_t*))allocate_hash;
|
||||
this->public.hasher_interface.get_block_size = (size_t (*) (hasher_t*))get_block_size;
|
||||
this->public.hasher_interface.reset = (size_t (*) (hasher_t*))reset;
|
||||
this->public.hasher_interface.destroy = (size_t (*) (hasher_t*))destroy;
|
||||
this->public.hasher_interface.reset = (void (*) (hasher_t*))reset;
|
||||
this->public.hasher_interface.destroy = (void (*) (hasher_t*))destroy;
|
||||
|
||||
/* initialize */
|
||||
this->public.hasher_interface.reset(&(this->public.hasher_interface));
|
||||
|
||||
@@ -45,9 +45,7 @@ struct md5_hasher_t {
|
||||
/**
|
||||
* @brief Creates a new md5_hasher_t.
|
||||
*
|
||||
* @return
|
||||
* - md5_hasher_t if successfully
|
||||
* - NULL if out of ressources
|
||||
* @return md5_hasher_t object
|
||||
*
|
||||
* @ingroup hashers
|
||||
*/
|
||||
|
||||
@@ -74,7 +74,7 @@ struct private_sha1_hasher_t {
|
||||
/*
|
||||
* Hash a single 512-bit block. This is the core of the algorithm. *
|
||||
*/
|
||||
void SHA1Transform(u_int32_t state[5], const unsigned char buffer[64])
|
||||
static void SHA1Transform(u_int32_t state[5], const unsigned char buffer[64])
|
||||
{
|
||||
u_int32_t a, b, c, d, e;
|
||||
typedef union {
|
||||
@@ -125,7 +125,7 @@ void SHA1Transform(u_int32_t state[5], const unsigned char buffer[64])
|
||||
/*
|
||||
* Run your data through this.
|
||||
*/
|
||||
void SHA1Update(private_sha1_hasher_t* this, u_int8_t *data, u_int32_t len)
|
||||
static void SHA1Update(private_sha1_hasher_t* this, u_int8_t *data, u_int32_t len)
|
||||
{
|
||||
u_int32_t i;
|
||||
u_int32_t j;
|
||||
@@ -158,7 +158,7 @@ void SHA1Update(private_sha1_hasher_t* this, u_int8_t *data, u_int32_t len)
|
||||
/*
|
||||
* Add padding and return the message digest.
|
||||
*/
|
||||
void SHA1Final(private_sha1_hasher_t *this, u_int8_t *digest)
|
||||
static void SHA1Final(private_sha1_hasher_t *this, u_int8_t *digest)
|
||||
{
|
||||
u_int32_t i;
|
||||
u_int8_t finalcount[8];
|
||||
@@ -187,7 +187,7 @@ void SHA1Final(private_sha1_hasher_t *this, u_int8_t *digest)
|
||||
/**
|
||||
* implementation of hasher_t.get_hash for sha1
|
||||
*/
|
||||
static status_t get_hash(private_sha1_hasher_t *this, chunk_t chunk, u_int8_t *buffer)
|
||||
static void get_hash(private_sha1_hasher_t *this, chunk_t chunk, u_int8_t *buffer)
|
||||
{
|
||||
SHA1Update(this, chunk.ptr, chunk.len);
|
||||
if (buffer != NULL)
|
||||
@@ -195,14 +195,13 @@ static status_t get_hash(private_sha1_hasher_t *this, chunk_t chunk, u_int8_t *b
|
||||
SHA1Final(this, buffer);
|
||||
this->public.hasher_interface.reset(&(this->public.hasher_interface));
|
||||
}
|
||||
return SUCCESS;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* implementation of hasher_t.allocate_hash for sha1
|
||||
*/
|
||||
static status_t allocate_hash(private_sha1_hasher_t *this, chunk_t chunk, chunk_t *hash)
|
||||
static void allocate_hash(private_sha1_hasher_t *this, chunk_t chunk, chunk_t *hash)
|
||||
{
|
||||
chunk_t allocated_hash;
|
||||
|
||||
@@ -211,17 +210,12 @@ static status_t allocate_hash(private_sha1_hasher_t *this, chunk_t chunk, chunk_
|
||||
{
|
||||
allocated_hash.ptr = allocator_alloc(BLOCK_SIZE_SHA1);
|
||||
allocated_hash.len = BLOCK_SIZE_SHA1;
|
||||
if (allocated_hash.ptr == NULL)
|
||||
{
|
||||
return OUT_OF_RES;
|
||||
}
|
||||
|
||||
SHA1Final(this, allocated_hash.ptr);
|
||||
this->public.hasher_interface.reset(&(this->public.hasher_interface));
|
||||
|
||||
*hash = allocated_hash;
|
||||
}
|
||||
|
||||
return SUCCESS;
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -235,7 +229,7 @@ static size_t get_block_size(private_sha1_hasher_t *this)
|
||||
/**
|
||||
* implementation of hasher_t.reset for sha1
|
||||
*/
|
||||
static status_t reset(private_sha1_hasher_t *this)
|
||||
static void reset(private_sha1_hasher_t *this)
|
||||
{
|
||||
this->state[0] = 0x67452301;
|
||||
this->state[1] = 0xEFCDAB89;
|
||||
@@ -244,15 +238,13 @@ static status_t reset(private_sha1_hasher_t *this)
|
||||
this->state[4] = 0xC3D2E1F0;
|
||||
this->count[0] = 0;
|
||||
this->count[1] = 0;
|
||||
return SUCCESS;
|
||||
}
|
||||
/**
|
||||
* implementation of hasher_t.destroy for sha1
|
||||
*/
|
||||
static status_t destroy(private_sha1_hasher_t *this)
|
||||
static void destroy(private_sha1_hasher_t *this)
|
||||
{
|
||||
allocator_free(this);
|
||||
return SUCCESS;
|
||||
}
|
||||
|
||||
|
||||
@@ -267,11 +259,11 @@ sha1_hasher_t *sha1_hasher_create()
|
||||
return NULL;
|
||||
}
|
||||
|
||||
this->public.hasher_interface.get_hash = (status_t (*) (hasher_t*, chunk_t, u_int8_t*))get_hash;
|
||||
this->public.hasher_interface.allocate_hash = (status_t (*) (hasher_t*, chunk_t, chunk_t*))allocate_hash;
|
||||
this->public.hasher_interface.get_hash = (void (*) (hasher_t*, chunk_t, u_int8_t*))get_hash;
|
||||
this->public.hasher_interface.allocate_hash = (void (*) (hasher_t*, chunk_t, chunk_t*))allocate_hash;
|
||||
this->public.hasher_interface.get_block_size = (size_t (*) (hasher_t*))get_block_size;
|
||||
this->public.hasher_interface.reset = (size_t (*) (hasher_t*))reset;
|
||||
this->public.hasher_interface.destroy = (size_t (*) (hasher_t*))destroy;
|
||||
this->public.hasher_interface.reset = (void (*) (hasher_t*))reset;
|
||||
this->public.hasher_interface.destroy = (void (*) (hasher_t*))destroy;
|
||||
|
||||
/* initialize */
|
||||
this->public.hasher_interface.reset(&(this->public.hasher_interface));
|
||||
|
||||
@@ -45,9 +45,7 @@ struct sha1_hasher_t {
|
||||
/**
|
||||
* @brief Creates a new sha1_hasher_t.
|
||||
*
|
||||
* @return
|
||||
* - sha1_hasher_t if successfully
|
||||
* - NULL if out of ressources
|
||||
* @return sha1_hasher_t object
|
||||
*
|
||||
* @ingroup hashers
|
||||
*/
|
||||
|
||||
@@ -59,7 +59,7 @@ struct private_hmac_t {
|
||||
/**
|
||||
* Implementation of hmac_t.get_mac.
|
||||
*/
|
||||
static status_t get_mac(private_hmac_t *this, chunk_t data, u_int8_t *out)
|
||||
static void get_mac(private_hmac_t *this, chunk_t data, u_int8_t *out)
|
||||
{
|
||||
/* H(K XOR opad, H(K XOR ipad, text))
|
||||
*
|
||||
@@ -92,13 +92,12 @@ static status_t get_mac(private_hmac_t *this, chunk_t data, u_int8_t *out)
|
||||
/* reinit for next call */
|
||||
this->h->get_hash(this->h, this->ipaded_key, NULL);
|
||||
}
|
||||
return SUCCESS;
|
||||
}
|
||||
|
||||
/**
|
||||
* Implementation of hmac_t.allocate_mac.
|
||||
*/
|
||||
static status_t allocate_mac(private_hmac_t *this, chunk_t data, chunk_t *out)
|
||||
static void allocate_mac(private_hmac_t *this, chunk_t data, chunk_t *out)
|
||||
{
|
||||
/* allocate space and use get_mac */
|
||||
if (out == NULL)
|
||||
@@ -110,13 +109,8 @@ static status_t allocate_mac(private_hmac_t *this, chunk_t data, chunk_t *out)
|
||||
{
|
||||
out->len = this->h->get_block_size(this->h);
|
||||
out->ptr = allocator_alloc(out->len);
|
||||
if (out->ptr == NULL)
|
||||
{
|
||||
return OUT_OF_RES;
|
||||
}
|
||||
this->hmac.get_mac(&(this->hmac), data, out->ptr);
|
||||
}
|
||||
return SUCCESS;
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -130,7 +124,7 @@ static size_t get_block_size(private_hmac_t *this)
|
||||
/**
|
||||
* Implementation of hmac_t.set_key.
|
||||
*/
|
||||
static status_t set_key(private_hmac_t *this, chunk_t key)
|
||||
static void set_key(private_hmac_t *this, chunk_t key)
|
||||
{
|
||||
int i;
|
||||
u_int8_t buffer[this->b];
|
||||
@@ -158,20 +152,17 @@ static status_t set_key(private_hmac_t *this, chunk_t key)
|
||||
/* begin hashing of inner pad */
|
||||
this->h->reset(this->h);
|
||||
this->h->get_hash(this->h, this->ipaded_key, NULL);
|
||||
|
||||
return SUCCESS;;
|
||||
}
|
||||
|
||||
/**
|
||||
* Implementation of hmac_t.destroy.
|
||||
*/
|
||||
static status_t destroy(private_hmac_t *this)
|
||||
static void destroy(private_hmac_t *this)
|
||||
{
|
||||
this->h->destroy(this->h);
|
||||
allocator_free(this->opaded_key.ptr);
|
||||
allocator_free(this->ipaded_key.ptr);
|
||||
allocator_free(this);
|
||||
return SUCCESS;
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -182,16 +173,13 @@ hmac_t *hmac_create(hash_algorithm_t hash_algorithm)
|
||||
private_hmac_t *this;
|
||||
|
||||
this = allocator_alloc_thing(private_hmac_t);
|
||||
if (this == NULL)
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/* set hmac_t methods */
|
||||
this->hmac.get_mac = (size_t (*)(hmac_t *,chunk_t,u_int8_t*))get_mac;
|
||||
this->hmac.allocate_mac = (size_t (*)(hmac_t *,chunk_t,chunk_t*))allocate_mac;
|
||||
this->hmac.get_mac = (void (*)(hmac_t *,chunk_t,u_int8_t*))get_mac;
|
||||
this->hmac.allocate_mac = (void (*)(hmac_t *,chunk_t,chunk_t*))allocate_mac;
|
||||
this->hmac.get_block_size = (size_t (*)(hmac_t *))get_block_size;
|
||||
this->hmac.set_key = (status_t (*)(hmac_t *,chunk_t))set_key;
|
||||
this->hmac.destroy = (status_t (*)(hmac_t *))destroy;
|
||||
this->hmac.set_key = (void (*)(hmac_t *,chunk_t))set_key;
|
||||
this->hmac.destroy = (void (*)(hmac_t *))destroy;
|
||||
|
||||
/* set b, according to hasher */
|
||||
switch (hash_algorithm)
|
||||
@@ -207,30 +195,13 @@ hmac_t *hmac_create(hash_algorithm_t hash_algorithm)
|
||||
|
||||
/* build the hasher */
|
||||
this->h = hasher_create(hash_algorithm);
|
||||
if (this->h == NULL)
|
||||
{
|
||||
allocator_free(this);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/* build ipad and opad */
|
||||
this->opaded_key.ptr = allocator_alloc(this->b);
|
||||
this->opaded_key.len = this->b;
|
||||
if (this->opaded_key.ptr == NULL)
|
||||
{
|
||||
this->h->destroy(this->h);
|
||||
allocator_free(this);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
this->ipaded_key.ptr = allocator_alloc(this->b);
|
||||
this->ipaded_key.len = this->b;
|
||||
if (this->ipaded_key.ptr == NULL)
|
||||
{
|
||||
this->h->destroy(this->h);
|
||||
allocator_free(this->opaded_key.ptr);
|
||||
allocator_free(this);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
return &(this->hmac);
|
||||
}
|
||||
|
||||
@@ -52,10 +52,8 @@ struct hmac_t {
|
||||
* @param this calling hmac
|
||||
* @param data chunk of data to authenticate
|
||||
* @param[out] buffer pointer where the generated bytes will be written
|
||||
* @return
|
||||
* - SUCCESS in any case
|
||||
*/
|
||||
status_t (*get_mac) (hmac_t *this, chunk_t data, u_int8_t *buffer);
|
||||
void (*get_mac) (hmac_t *this, chunk_t data, u_int8_t *buffer);
|
||||
|
||||
/**
|
||||
* @brief Generates message authentication code and
|
||||
@@ -69,11 +67,8 @@ struct hmac_t {
|
||||
* @param this calling hmac
|
||||
* @param data chunk of data to authenticate
|
||||
* @param[out] chunk chunk which will hold generated bytes
|
||||
* @return
|
||||
* - SUCCESS, or
|
||||
* - OUT_OF_RES if space could not be allocated
|
||||
*/
|
||||
status_t (*allocate_mac) (hmac_t *this, chunk_t data, chunk_t *chunk);
|
||||
void (*allocate_mac) (hmac_t *this, chunk_t data, chunk_t *chunk);
|
||||
|
||||
/**
|
||||
* @brief Get the block size of this hmac.
|
||||
@@ -90,19 +85,15 @@ struct hmac_t {
|
||||
*
|
||||
* @param this calling hmac
|
||||
* @param key key to set
|
||||
* @return
|
||||
* - SUCCESS in any case
|
||||
*/
|
||||
status_t (*set_key) (hmac_t *this, chunk_t key);
|
||||
void (*set_key) (hmac_t *this, chunk_t key);
|
||||
|
||||
/**
|
||||
* @brief Destroys a hmac object.
|
||||
*
|
||||
* @param this hmac_t object to destroy
|
||||
* @return
|
||||
* - SUCCESS in any case
|
||||
*/
|
||||
status_t (*destroy) (hmac_t *this);
|
||||
void (*destroy) (hmac_t *this);
|
||||
};
|
||||
|
||||
/**
|
||||
@@ -114,7 +105,7 @@ struct hmac_t {
|
||||
* @param hash_algorithm hash algorithm to use
|
||||
* @return
|
||||
* - hmac_t if successfully
|
||||
* - NULL if out of ressources or hash not supported
|
||||
* - NULL if hash not supported
|
||||
*
|
||||
* @ingroup transforms
|
||||
*/
|
||||
|
||||
@@ -68,7 +68,7 @@ struct private_prf_plus_t {
|
||||
/**
|
||||
* implementation of prf_plus_t.get_bytes
|
||||
*/
|
||||
static status_t get_bytes(private_prf_plus_t *this, size_t length, u_int8_t *buffer)
|
||||
static void get_bytes(private_prf_plus_t *this, size_t length, u_int8_t *buffer)
|
||||
{
|
||||
chunk_t appending_chunk;
|
||||
size_t bytes_in_round;
|
||||
@@ -96,32 +96,26 @@ static status_t get_bytes(private_prf_plus_t *this, size_t length, u_int8_t *buf
|
||||
this->given_out += bytes_in_round;
|
||||
total_bytes_written += bytes_in_round;
|
||||
}
|
||||
return SUCCESS;
|
||||
}
|
||||
|
||||
/**
|
||||
* implementation of prf_plus_t.allocate_bytes
|
||||
*/
|
||||
static status_t allocate_bytes(private_prf_plus_t *this, size_t length, chunk_t *chunk)
|
||||
static void allocate_bytes(private_prf_plus_t *this, size_t length, chunk_t *chunk)
|
||||
{
|
||||
chunk->ptr = allocator_alloc(length);
|
||||
chunk->len = length;
|
||||
if (chunk->ptr == NULL)
|
||||
{
|
||||
return OUT_OF_RES;
|
||||
}
|
||||
return this->public.get_bytes(&(this->public), length, chunk->ptr);
|
||||
this->public.get_bytes(&(this->public), length, chunk->ptr);
|
||||
}
|
||||
|
||||
/**
|
||||
* implementation of prf_plus_t.destroy
|
||||
*/
|
||||
static status_t destroy(private_prf_plus_t *this)
|
||||
static void destroy(private_prf_plus_t *this)
|
||||
{
|
||||
allocator_free(this->buffer.ptr);
|
||||
allocator_free(this->seed.ptr);
|
||||
allocator_free(this);
|
||||
return SUCCESS;
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -133,14 +127,11 @@ prf_plus_t *prf_plus_create(prf_t *prf, chunk_t seed)
|
||||
chunk_t appending_chunk;
|
||||
|
||||
this = allocator_alloc_thing(private_prf_plus_t);
|
||||
if (this == NULL)
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/* set public methods */
|
||||
this->public.get_bytes = (size_t (*)(prf_plus_t *,size_t,u_int8_t*))get_bytes;
|
||||
this->public.allocate_bytes = (size_t (*)(prf_plus_t *,size_t,chunk_t*))allocate_bytes;
|
||||
this->public.destroy = (status_t (*)(prf_plus_t *))destroy;
|
||||
this->public.get_bytes = (void (*)(prf_plus_t *,size_t,u_int8_t*))get_bytes;
|
||||
this->public.allocate_bytes = (void (*)(prf_plus_t *,size_t,chunk_t*))allocate_bytes;
|
||||
this->public.destroy = (void (*)(prf_plus_t *))destroy;
|
||||
|
||||
/* take over prf */
|
||||
this->prf = prf;
|
||||
@@ -148,23 +139,13 @@ prf_plus_t *prf_plus_create(prf_t *prf, chunk_t seed)
|
||||
/* allocate buffer for prf output */
|
||||
this->buffer.len = prf->get_block_size(prf);
|
||||
this->buffer.ptr = allocator_alloc(this->buffer.len);
|
||||
if (this->buffer.ptr == NULL)
|
||||
{
|
||||
allocator_free(this);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
this->appending_octet = 0x01;
|
||||
|
||||
/* clone seed */
|
||||
this->seed.ptr = allocator_clone_bytes(seed.ptr, seed.len);
|
||||
this->seed.len = seed.len;
|
||||
if (this->seed.ptr == NULL)
|
||||
{
|
||||
allocator_free(this->buffer.ptr);
|
||||
allocator_free(this);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
||||
/* do the first run */
|
||||
appending_chunk.ptr = &(this->appending_octet);
|
||||
appending_chunk.len = 1;
|
||||
|
||||
@@ -49,10 +49,8 @@ struct prf_plus_t {
|
||||
* @param this calling prf_plus
|
||||
* @param length number of bytes to get
|
||||
* @param[out] buffer pointer where the generated bytes will be written
|
||||
* @return
|
||||
* - SUCCESS in any case
|
||||
*/
|
||||
status_t (*get_bytes) (prf_plus_t *this, size_t length, u_int8_t *buffer);
|
||||
void (*get_bytes) (prf_plus_t *this, size_t length, u_int8_t *buffer);
|
||||
|
||||
/**
|
||||
* @brief Allocate pseudo random bytes.
|
||||
@@ -63,20 +61,15 @@ struct prf_plus_t {
|
||||
* @param this calling prf_plus
|
||||
* @param length number of bytes to get
|
||||
* @param[out] chunk chunk which will hold generated bytes
|
||||
* @return
|
||||
* - SUCCESS in any case
|
||||
* - OUT_OF_RES if space could not be allocated
|
||||
*/
|
||||
status_t (*allocate_bytes) (prf_plus_t *this, size_t length, chunk_t *chunk);
|
||||
void (*allocate_bytes) (prf_plus_t *this, size_t length, chunk_t *chunk);
|
||||
|
||||
/**
|
||||
* @brief Destroys a prf_plus_t object.
|
||||
*
|
||||
* @param this prf_plus_t object to destroy
|
||||
* @return
|
||||
* - SUCCESS in any case
|
||||
*/
|
||||
status_t (*destroy) (prf_plus_t *this);
|
||||
void (*destroy) (prf_plus_t *this);
|
||||
};
|
||||
|
||||
/**
|
||||
@@ -88,9 +81,7 @@ struct prf_plus_t {
|
||||
*
|
||||
* @param prf prf object to use
|
||||
* @param seed input seed for prf
|
||||
* @return
|
||||
* - prf_plus_t if successfully
|
||||
* - NULL if out of ressources
|
||||
* @return created prf_plus_t
|
||||
*
|
||||
* @ingroup transforms
|
||||
*/
|
||||
|
||||
@@ -42,17 +42,17 @@ struct private_hmac_prf_t {
|
||||
/**
|
||||
* implementation of prf_t.get_bytes
|
||||
*/
|
||||
static status_t get_bytes(private_hmac_prf_t *this, chunk_t seed, u_int8_t *buffer)
|
||||
static void get_bytes(private_hmac_prf_t *this, chunk_t seed, u_int8_t *buffer)
|
||||
{
|
||||
return this->hmac->get_mac(this->hmac, seed, buffer);
|
||||
this->hmac->get_mac(this->hmac, seed, buffer);
|
||||
}
|
||||
|
||||
/**
|
||||
* implementation of prf_t.allocate_bytes
|
||||
*/
|
||||
static status_t allocate_bytes(private_hmac_prf_t *this, chunk_t seed, chunk_t *chunk)
|
||||
static void allocate_bytes(private_hmac_prf_t *this, chunk_t seed, chunk_t *chunk)
|
||||
{
|
||||
return this->hmac->allocate_mac(this->hmac, seed, chunk);
|
||||
this->hmac->allocate_mac(this->hmac, seed, chunk);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -66,20 +66,18 @@ static size_t get_block_size(private_hmac_prf_t *this)
|
||||
/**
|
||||
* implementation of prf_t.set_key
|
||||
*/
|
||||
static status_t set_key(private_hmac_prf_t *this, chunk_t key)
|
||||
static void set_key(private_hmac_prf_t *this, chunk_t key)
|
||||
{
|
||||
this->hmac->set_key(this->hmac, key);
|
||||
return SUCCESS;
|
||||
}
|
||||
|
||||
/**
|
||||
* implementation of prf_t.destroy
|
||||
*/
|
||||
static status_t destroy(private_hmac_prf_t *this)
|
||||
static void destroy(private_hmac_prf_t *this)
|
||||
{
|
||||
allocator_free(this);
|
||||
this->hmac->destroy(this->hmac);
|
||||
return SUCCESS;
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -89,16 +87,11 @@ hmac_prf_t *hmac_prf_create(hash_algorithm_t hash_algorithm)
|
||||
{
|
||||
private_hmac_prf_t *this = allocator_alloc_thing(private_hmac_prf_t);
|
||||
|
||||
if (this == NULL)
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
|
||||
this->public.prf_interface.get_bytes = (status_t (*) (prf_t *,chunk_t,u_int8_t*))get_bytes;
|
||||
this->public.prf_interface.allocate_bytes = (status_t (*) (prf_t*,chunk_t,chunk_t*))allocate_bytes;
|
||||
this->public.prf_interface.get_bytes = (void (*) (prf_t *,chunk_t,u_int8_t*))get_bytes;
|
||||
this->public.prf_interface.allocate_bytes = (void (*) (prf_t*,chunk_t,chunk_t*))allocate_bytes;
|
||||
this->public.prf_interface.get_block_size = (size_t (*) (prf_t*))get_block_size;
|
||||
this->public.prf_interface.set_key = (status_t (*) (prf_t *,chunk_t))set_key;
|
||||
this->public.prf_interface.destroy = (status_t (*) (prf_t *))destroy;
|
||||
this->public.prf_interface.set_key = (void (*) (prf_t *,chunk_t))set_key;
|
||||
this->public.prf_interface.destroy = (void (*) (prf_t *))destroy;
|
||||
|
||||
this->hmac = hmac_create(hash_algorithm);
|
||||
if (this->hmac == NULL)
|
||||
|
||||
@@ -49,10 +49,10 @@ struct hmac_prf_t {
|
||||
/**
|
||||
* @brief Creates a new hmac_prf_t object
|
||||
*
|
||||
* @param hash_algorithm hmac's hash algorithm
|
||||
* @param hash_algorithm hmac's hash algorithm
|
||||
* @return
|
||||
* - hmac_prf_t if successfully
|
||||
* - NULL if out of ressources
|
||||
* - hmac_prf_t if successfully
|
||||
* - NULL if hash not supported
|
||||
*
|
||||
* @ingroup prfs
|
||||
*/
|
||||
|
||||
@@ -59,10 +59,8 @@ struct prf_t {
|
||||
* @param this calling prf
|
||||
* @param seed a chunk containing the seed for the next bytes
|
||||
* @param[out] buffer pointer where the generated bytes will be written
|
||||
* @return
|
||||
* - SUCCESS in any case
|
||||
*/
|
||||
status_t (*get_bytes) (prf_t *this, chunk_t seed, u_int8_t *buffer);
|
||||
void (*get_bytes) (prf_t *this, chunk_t seed, u_int8_t *buffer);
|
||||
|
||||
/**
|
||||
* @brief generates pseudo random bytes and allocate space for them.
|
||||
@@ -70,11 +68,8 @@ struct prf_t {
|
||||
* @param this calling prf
|
||||
* @param seed a chunk containing the seed for the next bytes
|
||||
* @param[out] chunk chunk which will hold generated bytes
|
||||
* @return
|
||||
* - SUCCESS in any case
|
||||
* - OUT_OF_RES if space could not be allocated
|
||||
*/
|
||||
status_t (*allocate_bytes) (prf_t *this, chunk_t seed, chunk_t *chunk);
|
||||
void (*allocate_bytes) (prf_t *this, chunk_t seed, chunk_t *chunk);
|
||||
|
||||
/**
|
||||
* @brief get the block size of this prf.
|
||||
@@ -89,19 +84,15 @@ struct prf_t {
|
||||
*
|
||||
* @param this calling prf
|
||||
* @param key key to set
|
||||
* @return
|
||||
* - SUCCESS in any case
|
||||
*/
|
||||
status_t (*set_key) (prf_t *this, chunk_t key);
|
||||
void (*set_key) (prf_t *this, chunk_t key);
|
||||
|
||||
/**
|
||||
* @brief Destroys a prf object..
|
||||
*
|
||||
* @param this prf_t object to destroy
|
||||
* @return
|
||||
* - SUCCESS in any case
|
||||
*/
|
||||
status_t (*destroy) (prf_t *this);
|
||||
void (*destroy) (prf_t *this);
|
||||
};
|
||||
|
||||
/**
|
||||
@@ -110,7 +101,7 @@ struct prf_t {
|
||||
* @param pseudo_random_function Algorithm to use
|
||||
* @return
|
||||
* - prf_t if successfully
|
||||
* - NULL if out of ressources or prf not supported
|
||||
* - NULL if prf not supported
|
||||
*
|
||||
* @ingroup prfs
|
||||
*/
|
||||
|
||||
@@ -48,66 +48,42 @@ struct private_hmac_signer_t {
|
||||
};
|
||||
|
||||
|
||||
static status_t get_signature (private_hmac_signer_t *this, chunk_t data, u_int8_t *buffer)
|
||||
static void get_signature (private_hmac_signer_t *this, chunk_t data, u_int8_t *buffer)
|
||||
{
|
||||
u_int8_t full_mac[this->hmac_prf->get_block_size(this->hmac_prf)];
|
||||
status_t status;
|
||||
|
||||
status = this->hmac_prf->get_bytes(this->hmac_prf,data,full_mac);
|
||||
if (status != SUCCESS)
|
||||
{
|
||||
return status;
|
||||
}
|
||||
this->hmac_prf->get_bytes(this->hmac_prf,data,full_mac);
|
||||
|
||||
/* copy mac aka signature :-) */
|
||||
memcpy(buffer,full_mac,BLOCK_SIZE);
|
||||
|
||||
return SUCCESS;
|
||||
}
|
||||
|
||||
static status_t allocate_signature (private_hmac_signer_t *this, chunk_t data, chunk_t *chunk)
|
||||
static void allocate_signature (private_hmac_signer_t *this, chunk_t data, chunk_t *chunk)
|
||||
{
|
||||
chunk_t signature;
|
||||
status_t status;
|
||||
u_int8_t full_mac[this->hmac_prf->get_block_size(this->hmac_prf)];
|
||||
|
||||
status = this->hmac_prf->get_bytes(this->hmac_prf,data,full_mac);
|
||||
if (status != SUCCESS)
|
||||
{
|
||||
return status;
|
||||
}
|
||||
|
||||
this->hmac_prf->get_bytes(this->hmac_prf,data,full_mac);
|
||||
|
||||
signature.ptr = allocator_alloc(BLOCK_SIZE);
|
||||
if (signature.ptr == NULL)
|
||||
{
|
||||
return OUT_OF_RES;
|
||||
}
|
||||
signature.len = BLOCK_SIZE;
|
||||
|
||||
/* copy mac aka signature :-) */
|
||||
memcpy(signature.ptr,full_mac,BLOCK_SIZE);
|
||||
|
||||
*chunk = signature;
|
||||
|
||||
return SUCCESS;
|
||||
|
||||
}
|
||||
|
||||
static status_t verify_signature (private_hmac_signer_t *this, chunk_t data, chunk_t signature, bool *valid)
|
||||
static void verify_signature (private_hmac_signer_t *this, chunk_t data, chunk_t signature, bool *valid)
|
||||
{
|
||||
status_t status;
|
||||
u_int8_t full_mac[this->hmac_prf->get_block_size(this->hmac_prf)];
|
||||
|
||||
status = this->hmac_prf->get_bytes(this->hmac_prf,data,full_mac);
|
||||
if (status != SUCCESS)
|
||||
{
|
||||
return status;
|
||||
}
|
||||
this->hmac_prf->get_bytes(this->hmac_prf,data,full_mac);
|
||||
|
||||
if (signature.len != BLOCK_SIZE)
|
||||
{
|
||||
/* signature must have BLOCK_SIZE length */
|
||||
return INVALID_ARG;
|
||||
*valid = FALSE;
|
||||
return;
|
||||
}
|
||||
|
||||
/* compare mac aka signature :-) */
|
||||
@@ -119,8 +95,6 @@ static status_t verify_signature (private_hmac_signer_t *this, chunk_t data, chu
|
||||
{
|
||||
*valid = FALSE;
|
||||
}
|
||||
|
||||
return SUCCESS;
|
||||
}
|
||||
|
||||
static size_t get_block_size (private_hmac_signer_t *this)
|
||||
@@ -128,9 +102,9 @@ static size_t get_block_size (private_hmac_signer_t *this)
|
||||
return BLOCK_SIZE;
|
||||
}
|
||||
|
||||
static status_t set_key (private_hmac_signer_t *this, chunk_t key)
|
||||
static void set_key (private_hmac_signer_t *this, chunk_t key)
|
||||
{
|
||||
return (this->hmac_prf->set_key(this->hmac_prf,key));
|
||||
this->hmac_prf->set_key(this->hmac_prf,key);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -150,35 +124,23 @@ static status_t destroy(private_hmac_signer_t *this)
|
||||
hmac_signer_t *hmac_signer_create(hash_algorithm_t hash_algoritm)
|
||||
{
|
||||
private_hmac_signer_t *this = allocator_alloc_thing(private_hmac_signer_t);
|
||||
if (this == NULL)
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
||||
this->hmac_prf = (prf_t *) hmac_prf_create(hash_algoritm);
|
||||
|
||||
if (this->hmac_prf == NULL)
|
||||
{
|
||||
/* hmac prf could not be created !!! */
|
||||
/* algorithm not supported */
|
||||
allocator_free(this);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
if (this->hmac_prf->get_block_size(this->hmac_prf) < BLOCK_SIZE)
|
||||
{
|
||||
/* hmac prf with given algorithm has to small block size */
|
||||
allocator_free(this);
|
||||
return NULL;
|
||||
|
||||
}
|
||||
|
||||
/* interface functions */
|
||||
this->public.signer_interface.get_signature = (status_t (*) (signer_t*, chunk_t, u_int8_t*))get_signature;
|
||||
this->public.signer_interface.allocate_signature = (status_t (*) (signer_t*, chunk_t, chunk_t*))allocate_signature;
|
||||
this->public.signer_interface.verify_signature = (status_t (*) (signer_t*, chunk_t, chunk_t,bool *))verify_signature;
|
||||
this->public.signer_interface.get_signature = (void (*) (signer_t*, chunk_t, u_int8_t*))get_signature;
|
||||
this->public.signer_interface.allocate_signature = (void (*) (signer_t*, chunk_t, chunk_t*))allocate_signature;
|
||||
this->public.signer_interface.verify_signature = (void (*) (signer_t*, chunk_t, chunk_t,bool *))verify_signature;
|
||||
this->public.signer_interface.get_block_size = (size_t (*) (signer_t*))get_block_size;
|
||||
this->public.signer_interface.set_key = (size_t (*) (signer_t*,chunk_t))set_key;
|
||||
this->public.signer_interface.destroy = (status_t (*) (signer_t*))destroy;
|
||||
this->public.signer_interface.set_key = (void (*) (signer_t*,chunk_t))set_key;
|
||||
this->public.signer_interface.destroy = (void (*) (signer_t*))destroy;
|
||||
|
||||
return &(this->public);
|
||||
}
|
||||
|
||||
@@ -20,8 +20,8 @@
|
||||
* for more details.
|
||||
*/
|
||||
|
||||
#ifndef _HMAC_SIGNER_H_
|
||||
#define _HMAC_SIGNER_H_
|
||||
#ifndef HMAC_SIGNER_H_
|
||||
#define HMAC_SIGNER_H_
|
||||
|
||||
#include <transforms/signers/signer.h>
|
||||
#include <transforms/hashers/hasher.h>
|
||||
@@ -30,7 +30,7 @@ typedef struct hmac_signer_t hmac_signer_t;
|
||||
|
||||
/**
|
||||
* @brief Implementation of hmac_signer_t interface using the
|
||||
* HMAC algorithm in combination with eather MD5 or SHA1.
|
||||
* HMAC algorithm in combination with either MD5 or SHA1.
|
||||
*
|
||||
* @ingroup signers
|
||||
*/
|
||||
@@ -45,15 +45,14 @@ struct hmac_signer_t {
|
||||
/**
|
||||
* @brief Creates a new hmac_signer_t.
|
||||
*
|
||||
* @param hash_algorithm Hash algorithm to use with signer
|
||||
*
|
||||
* @return
|
||||
* - hmac_signer_t if successfully
|
||||
* - NULL if out of ressources
|
||||
* @param hash_algorithm Hash algorithm to use with signer
|
||||
* @return
|
||||
* - hmac_signer_t
|
||||
* - NULL if hash not supported
|
||||
*
|
||||
* @ingroup signers
|
||||
*/
|
||||
hmac_signer_t *hmac_signer_create(hash_algorithm_t hash_algoritm);
|
||||
|
||||
|
||||
#endif //_HMAC_SIGNER_H_
|
||||
#endif /*HMAC_SIGNER_H_*/
|
||||
|
||||
@@ -37,6 +37,10 @@ mapping_t integrity_algorithm_m[] = {
|
||||
{MAPPING_END, NULL}
|
||||
};
|
||||
|
||||
|
||||
/*
|
||||
* see header
|
||||
*/
|
||||
signer_t *signer_create(integrity_algorithm_t integrity_algorithm)
|
||||
{
|
||||
switch(integrity_algorithm)
|
||||
@@ -49,7 +53,6 @@ signer_t *signer_create(integrity_algorithm_t integrity_algorithm)
|
||||
{
|
||||
return ((signer_t *) hmac_signer_create(HASH_MD5));
|
||||
}
|
||||
|
||||
default:
|
||||
return NULL;
|
||||
}
|
||||
|
||||
@@ -61,10 +61,8 @@ struct signer_t {
|
||||
* @param this calling signer
|
||||
* @param data a chunk containing the data to sign
|
||||
* @param[out] buffer pointer where the signature will be written
|
||||
* @return
|
||||
* - SUCCESS in any case
|
||||
*/
|
||||
status_t (*get_signature) (signer_t *this, chunk_t data, u_int8_t *buffer);
|
||||
void (*get_signature) (signer_t *this, chunk_t data, u_int8_t *buffer);
|
||||
|
||||
/**
|
||||
* @brief Generate a signature and allocate space for it.
|
||||
@@ -72,11 +70,8 @@ struct signer_t {
|
||||
* @param this calling signer
|
||||
* @param data a chunk containing the data to sign
|
||||
* @param[out] chunk chunk which will hold the allocated signature
|
||||
* @return
|
||||
* - SUCCESS in any case
|
||||
* - OUT_OF_RES if space could not be allocated
|
||||
*/
|
||||
status_t (*allocate_signature) (signer_t *this, chunk_t data, chunk_t *chunk);
|
||||
void (*allocate_signature) (signer_t *this, chunk_t data, chunk_t *chunk);
|
||||
|
||||
/**
|
||||
* @brief Verify a signature.
|
||||
@@ -85,10 +80,8 @@ struct signer_t {
|
||||
* @param data a chunk containing the data to verify
|
||||
* @param signature a chunk containing the signature
|
||||
* @param[out] vaild set to TRUE, if signature is valid, to FALSE otherwise
|
||||
* @return
|
||||
* - SUCCESS in any case
|
||||
*/
|
||||
status_t (*verify_signature) (signer_t *this, chunk_t data, chunk_t signature, bool *valid);
|
||||
void (*verify_signature) (signer_t *this, chunk_t data, chunk_t signature, bool *valid);
|
||||
|
||||
/**
|
||||
* @brief Get the block size of this signature algorithm.
|
||||
@@ -103,19 +96,15 @@ struct signer_t {
|
||||
*
|
||||
* @param this calling signer
|
||||
* @param key key to set
|
||||
* @return
|
||||
* - SUCCESS in any case
|
||||
*/
|
||||
status_t (*set_key) (signer_t *this, chunk_t key);
|
||||
void (*set_key) (signer_t *this, chunk_t key);
|
||||
|
||||
/**
|
||||
* @brief Destroys a signer object.
|
||||
*
|
||||
* @param this signer_t object to destroy
|
||||
* @return
|
||||
* - SUCCESS in any case
|
||||
* @param this signer_t object to destroy
|
||||
*/
|
||||
status_t (*destroy) (signer_t *this);
|
||||
void (*destroy) (signer_t *this);
|
||||
};
|
||||
|
||||
/**
|
||||
@@ -123,8 +112,8 @@ struct signer_t {
|
||||
*
|
||||
* @param integrity_algorithm Algorithm to use for signing and verifying.
|
||||
* @return
|
||||
* - signer_t if successfully
|
||||
* - NULL if out of ressources or signer not supported
|
||||
* - signer_t if successfully,
|
||||
* - NULL if signer not supported
|
||||
*
|
||||
* @ingroup signers
|
||||
*/
|
||||
|
||||
Reference in New Issue
Block a user