botan: Move shared secret calculation to get_shared_secret()
This commit is contained in:
@@ -54,7 +54,12 @@ struct private_botan_diffie_hellman_t {
|
|||||||
/**
|
/**
|
||||||
* Private key
|
* Private key
|
||||||
*/
|
*/
|
||||||
botan_privkey_t dh_key;
|
botan_privkey_t key;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Public key value provided by peer
|
||||||
|
*/
|
||||||
|
chunk_t pubkey;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Diffie hellman shared secret
|
* Diffie hellman shared secret
|
||||||
@@ -84,8 +89,8 @@ bool load_private_key(private_botan_diffie_hellman_t *this, chunk_t value)
|
|||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (botan_privkey_destroy(this->dh_key) ||
|
if (botan_privkey_destroy(this->key) ||
|
||||||
botan_privkey_load_dh(&this->dh_key, this->p, this->g, xa))
|
botan_privkey_load_dh(&this->key, this->p, this->g, xa))
|
||||||
{
|
{
|
||||||
botan_mp_destroy(xa);
|
botan_mp_destroy(xa);
|
||||||
return FALSE;
|
return FALSE;
|
||||||
@@ -102,9 +107,9 @@ METHOD(key_exchange_t, set_public_key, bool,
|
|||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
chunk_clear(&this->shared_secret);
|
chunk_clear(&this->pubkey);
|
||||||
|
this->pubkey = chunk_clone(value);
|
||||||
return botan_dh_key_derivation(this->dh_key, value, &this->shared_secret);
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
METHOD(key_exchange_t, get_public_key, bool,
|
METHOD(key_exchange_t, get_public_key, bool,
|
||||||
@@ -113,14 +118,14 @@ METHOD(key_exchange_t, get_public_key, bool,
|
|||||||
*value = chunk_empty;
|
*value = chunk_empty;
|
||||||
|
|
||||||
/* get key size of public key first */
|
/* get key size of public key first */
|
||||||
if (botan_pk_op_key_agreement_export_public(this->dh_key, NULL, &value->len)
|
if (botan_pk_op_key_agreement_export_public(this->key, NULL, &value->len)
|
||||||
!= BOTAN_FFI_ERROR_INSUFFICIENT_BUFFER_SPACE)
|
!= BOTAN_FFI_ERROR_INSUFFICIENT_BUFFER_SPACE)
|
||||||
{
|
{
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
*value = chunk_alloc(value->len);
|
*value = chunk_alloc(value->len);
|
||||||
if (botan_pk_op_key_agreement_export_public(this->dh_key, value->ptr,
|
if (botan_pk_op_key_agreement_export_public(this->key, value->ptr,
|
||||||
&value->len))
|
&value->len))
|
||||||
{
|
{
|
||||||
chunk_clear(value);
|
chunk_clear(value);
|
||||||
@@ -139,7 +144,8 @@ METHOD(key_exchange_t, set_private_key, bool,
|
|||||||
METHOD(key_exchange_t, get_shared_secret, bool,
|
METHOD(key_exchange_t, get_shared_secret, bool,
|
||||||
private_botan_diffie_hellman_t *this, chunk_t *secret)
|
private_botan_diffie_hellman_t *this, chunk_t *secret)
|
||||||
{
|
{
|
||||||
if (!this->shared_secret.len)
|
if (!this->shared_secret.len &&
|
||||||
|
!botan_dh_key_derivation(this->key, this->pubkey, &this->shared_secret))
|
||||||
{
|
{
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
@@ -158,8 +164,9 @@ METHOD(key_exchange_t, destroy, void,
|
|||||||
{
|
{
|
||||||
botan_mp_destroy(this->p);
|
botan_mp_destroy(this->p);
|
||||||
botan_mp_destroy(this->g);
|
botan_mp_destroy(this->g);
|
||||||
botan_privkey_destroy(this->dh_key);
|
botan_privkey_destroy(this->key);
|
||||||
chunk_clear(&this->shared_secret);
|
chunk_clear(&this->shared_secret);
|
||||||
|
chunk_clear(&this->pubkey);
|
||||||
free(this);
|
free(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -60,6 +60,11 @@ struct private_botan_ec_diffie_hellman_t {
|
|||||||
*/
|
*/
|
||||||
botan_privkey_t key;
|
botan_privkey_t key;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Public key value provided by peer
|
||||||
|
*/
|
||||||
|
chunk_t pubkey;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Shared secret
|
* Shared secret
|
||||||
*/
|
*/
|
||||||
@@ -74,12 +79,10 @@ METHOD(key_exchange_t, set_public_key, bool,
|
|||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
chunk_clear(&this->shared_secret);
|
chunk_clear(&this->pubkey);
|
||||||
|
|
||||||
/* prepend 0x04 to indicate uncompressed point format */
|
/* prepend 0x04 to indicate uncompressed point format */
|
||||||
value = chunk_cata("cc", chunk_from_chars(0x04), value);
|
this->pubkey = chunk_cat("cc", chunk_from_chars(0x04), value);
|
||||||
|
return TRUE;
|
||||||
return botan_dh_key_derivation(this->key, value, &this->shared_secret);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
METHOD(key_exchange_t, get_public_key, bool,
|
METHOD(key_exchange_t, get_public_key, bool,
|
||||||
@@ -135,7 +138,8 @@ METHOD(key_exchange_t, set_private_key, bool,
|
|||||||
METHOD(key_exchange_t, get_shared_secret, bool,
|
METHOD(key_exchange_t, get_shared_secret, bool,
|
||||||
private_botan_ec_diffie_hellman_t *this, chunk_t *secret)
|
private_botan_ec_diffie_hellman_t *this, chunk_t *secret)
|
||||||
{
|
{
|
||||||
if (!this->shared_secret.len)
|
if (!this->shared_secret.len &&
|
||||||
|
!botan_dh_key_derivation(this->key, this->pubkey, &this->shared_secret))
|
||||||
{
|
{
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
@@ -154,6 +158,7 @@ METHOD(key_exchange_t, destroy, void,
|
|||||||
{
|
{
|
||||||
botan_privkey_destroy(this->key);
|
botan_privkey_destroy(this->key);
|
||||||
chunk_clear(&this->shared_secret);
|
chunk_clear(&this->shared_secret);
|
||||||
|
chunk_clear(&this->pubkey);
|
||||||
free(this);
|
free(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -49,6 +49,11 @@ struct private_diffie_hellman_t {
|
|||||||
*/
|
*/
|
||||||
botan_privkey_t key;
|
botan_privkey_t key;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Public key value provided by peer
|
||||||
|
*/
|
||||||
|
chunk_t pubkey;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Shared secret
|
* Shared secret
|
||||||
*/
|
*/
|
||||||
@@ -63,9 +68,9 @@ METHOD(key_exchange_t, set_public_key, bool,
|
|||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
chunk_clear(&this->shared_secret);
|
chunk_clear(&this->pubkey);
|
||||||
|
this->pubkey = chunk_clone(value);
|
||||||
return botan_dh_key_derivation(this->key, value, &this->shared_secret);
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
METHOD(key_exchange_t, get_public_key, bool,
|
METHOD(key_exchange_t, get_public_key, bool,
|
||||||
@@ -113,7 +118,8 @@ METHOD(key_exchange_t, set_private_key, bool,
|
|||||||
METHOD(key_exchange_t, get_shared_secret, bool,
|
METHOD(key_exchange_t, get_shared_secret, bool,
|
||||||
private_diffie_hellman_t *this, chunk_t *secret)
|
private_diffie_hellman_t *this, chunk_t *secret)
|
||||||
{
|
{
|
||||||
if (!this->shared_secret.len)
|
if (!this->shared_secret.len &&
|
||||||
|
!botan_dh_key_derivation(this->key, this->pubkey, &this->shared_secret))
|
||||||
{
|
{
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
@@ -132,6 +138,7 @@ METHOD(key_exchange_t, destroy, void,
|
|||||||
{
|
{
|
||||||
botan_privkey_destroy(this->key);
|
botan_privkey_destroy(this->key);
|
||||||
chunk_clear(&this->shared_secret);
|
chunk_clear(&this->shared_secret);
|
||||||
|
chunk_clear(&this->pubkey);
|
||||||
free(this);
|
free(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user