DBG4(DBG_CHD, "initiator SA seed %B", &seed);
prf_plus = prf_plus_create(this->prf, FALSE, seed);
- prf_plus->allocate_bytes(prf_plus, enc_size, encr_i);
- prf_plus->allocate_bytes(prf_plus, int_size, integ_i);
+ if (!prf_plus->allocate_bytes(prf_plus, enc_size, encr_i) ||
+ !prf_plus->allocate_bytes(prf_plus, int_size, integ_i))
+ {
+ prf_plus->destroy(prf_plus);
+ chunk_clear(&secret);
+ return FALSE;
+ }
prf_plus->destroy(prf_plus);
seed = chunk_cata("ccccc", secret, chunk_from_thing(protocol),
chunk_from_thing(spi_i), nonce_i, nonce_r);
DBG4(DBG_CHD, "responder SA seed %B", &seed);
prf_plus = prf_plus_create(this->prf, FALSE, seed);
- prf_plus->allocate_bytes(prf_plus, enc_size, encr_r);
- prf_plus->allocate_bytes(prf_plus, int_size, integ_r);
+ if (!prf_plus->allocate_bytes(prf_plus, enc_size, encr_r) ||
+ !prf_plus->allocate_bytes(prf_plus, int_size, integ_r))
+ {
+ prf_plus->destroy(prf_plus);
+ chunk_clear(&secret);
+ return FALSE;
+ }
prf_plus->destroy(prf_plus);
chunk_clear(&secret);
}
key_size = aead_i->get_key_size(aead_i);
- prf_plus->allocate_bytes(prf_plus, key_size, &key);
+ if (!prf_plus->allocate_bytes(prf_plus, key_size, &key))
+ {
+ return FALSE;
+ }
DBG4(DBG_IKE, "Sk_ei secret %B", &key);
if (!aead_i->set_key(aead_i, key))
{
}
chunk_clear(&key);
- prf_plus->allocate_bytes(prf_plus, key_size, &key);
+ if (!prf_plus->allocate_bytes(prf_plus, key_size, &key))
+ {
+ return FALSE;
+ }
DBG4(DBG_IKE, "Sk_er secret %B", &key);
if (!aead_r->set_key(aead_r, key))
{
}
key_size = signer_i->get_key_size(signer_i);
- prf_plus->allocate_bytes(prf_plus, key_size, &key);
+ if (!prf_plus->allocate_bytes(prf_plus, key_size, &key))
+ {
+ signer_i->destroy(signer_i);
+ signer_r->destroy(signer_r);
+ return FALSE;
+ }
DBG4(DBG_IKE, "Sk_ai secret %B", &key);
if (!signer_i->set_key(signer_i, key))
{
}
chunk_clear(&key);
- prf_plus->allocate_bytes(prf_plus, key_size, &key);
+ if (!prf_plus->allocate_bytes(prf_plus, key_size, &key))
+ {
+ signer_i->destroy(signer_i);
+ signer_r->destroy(signer_r);
+ return FALSE;
+ }
DBG4(DBG_IKE, "Sk_ar secret %B", &key);
if (!signer_r->set_key(signer_r, key))
{
}
key_size = crypter_i->get_key_size(crypter_i);
- prf_plus->allocate_bytes(prf_plus, key_size, &key);
+ if (!prf_plus->allocate_bytes(prf_plus, key_size, &key))
+ {
+ crypter_i->destroy(crypter_i);
+ crypter_r->destroy(crypter_r);
+ signer_i->destroy(signer_i);
+ signer_r->destroy(signer_r);
+ return FALSE;
+ }
DBG4(DBG_IKE, "Sk_ei secret %B", &key);
crypter_i->set_key(crypter_i, key);
chunk_clear(&key);
- prf_plus->allocate_bytes(prf_plus, key_size, &key);
+ if (!prf_plus->allocate_bytes(prf_plus, key_size, &key))
+ {
+ crypter_i->destroy(crypter_i);
+ crypter_r->destroy(crypter_r);
+ signer_i->destroy(signer_i);
+ signer_r->destroy(signer_r);
+ return FALSE;
+ }
DBG4(DBG_IKE, "Sk_er secret %B", &key);
crypter_r->set_key(crypter_r, key);
chunk_clear(&key);
/* SK_d is used for generating CHILD_SA key mat => store for later use */
key_size = this->prf->get_key_size(this->prf);
- prf_plus->allocate_bytes(prf_plus, key_size, &this->skd);
+ if (!prf_plus->allocate_bytes(prf_plus, key_size, &this->skd))
+ {
+ prf_plus->destroy(prf_plus);
+ DESTROY_IF(rekey_prf);
+ return FALSE;
+ }
DBG4(DBG_IKE, "Sk_d secret %B", &this->skd);
if (!proposal->get_algorithm(proposal, ENCRYPTION_ALGORITHM, &alg, &key_size))
/* SK_pi/SK_pr used for authentication => stored for later */
key_size = this->prf->get_key_size(this->prf);
- prf_plus->allocate_bytes(prf_plus, key_size, &key);
+ if (!prf_plus->allocate_bytes(prf_plus, key_size, &key))
+ {
+ prf_plus->destroy(prf_plus);
+ DESTROY_IF(rekey_prf);
+ return FALSE;
+ }
DBG4(DBG_IKE, "Sk_pi secret %B", &key);
if (this->initiator)
{
{
this->skp_verify = key;
}
- prf_plus->allocate_bytes(prf_plus, key_size, &key);
+ if (!prf_plus->allocate_bytes(prf_plus, key_size, &key))
+ {
+ prf_plus->destroy(prf_plus);
+ DESTROY_IF(rekey_prf);
+ return FALSE;
+ }
DBG4(DBG_IKE, "Sk_pr secret %B", &key);
if (this->initiator)
{
this->prf->set_key(this->prf, this->skd);
prf_plus = prf_plus_create(this->prf, TRUE, seed);
- prf_plus->allocate_bytes(prf_plus, enc_size, encr_i);
- prf_plus->allocate_bytes(prf_plus, int_size, integ_i);
- prf_plus->allocate_bytes(prf_plus, enc_size, encr_r);
- prf_plus->allocate_bytes(prf_plus, int_size, integ_r);
+ if (!prf_plus->allocate_bytes(prf_plus, enc_size, encr_i) ||
+ !prf_plus->allocate_bytes(prf_plus, int_size, integ_i) ||
+ !prf_plus->allocate_bytes(prf_plus, enc_size, encr_r) ||
+ !prf_plus->allocate_bytes(prf_plus, int_size, integ_r))
+ {
+ prf_plus->destroy(prf_plus);
+ return FALSE;
+ }
prf_plus->destroy(prf_plus);