Use IV length of a crypter instead of block size for IV calculations
This commit is contained in:
+7
-6
@@ -1782,7 +1782,7 @@ process_packet(struct msg_digest **mdp)
|
||||
* the last phase 1 block, not the last block sent.
|
||||
*/
|
||||
{
|
||||
size_t crypter_block_size;
|
||||
size_t crypter_block_size, crypter_iv_size;
|
||||
encryption_algorithm_t enc_alg;
|
||||
crypter_t *crypter;
|
||||
chunk_t data, iv;
|
||||
@@ -1791,6 +1791,7 @@ process_packet(struct msg_digest **mdp)
|
||||
enc_alg = oakley_to_encryption_algorithm(st->st_oakley.encrypt);
|
||||
crypter = lib->crypto->create_crypter(lib->crypto, enc_alg, st->st_enc_key.len);
|
||||
crypter_block_size = crypter->get_block_size(crypter);
|
||||
crypter_iv_size = crypter->get_iv_size(crypter);
|
||||
|
||||
if (pbs_left(&md->message_pbs) % crypter_block_size != 0)
|
||||
{
|
||||
@@ -1817,17 +1818,17 @@ process_packet(struct msg_digest **mdp)
|
||||
}
|
||||
|
||||
/* form iv by truncation */
|
||||
st->st_new_iv_len = crypter_block_size;
|
||||
st->st_new_iv_len = crypter_iv_size;
|
||||
iv = chunk_create(st->st_new_iv, st->st_new_iv_len);
|
||||
new_iv = alloca(crypter_block_size);
|
||||
memcpy(new_iv, data.ptr + data.len - crypter_block_size,
|
||||
crypter_block_size);
|
||||
new_iv = alloca(crypter_iv_size);
|
||||
memcpy(new_iv, data.ptr + data.len - crypter_iv_size,
|
||||
crypter_iv_size);
|
||||
|
||||
crypter->set_key(crypter, st->st_enc_key);
|
||||
crypter->decrypt(crypter, data, iv, NULL);
|
||||
crypter->destroy(crypter);
|
||||
|
||||
memcpy(st->st_new_iv, new_iv, crypter_block_size);
|
||||
memcpy(st->st_new_iv, new_iv, crypter_iv_size);
|
||||
if (restore_iv)
|
||||
{
|
||||
memcpy(st->st_new_iv, new_iv, new_iv_len);
|
||||
|
||||
@@ -1753,7 +1753,7 @@ bool encrypt_message(pb_stream *pbs, struct state *st)
|
||||
size_t enc_len = pbs_offset(pbs) - sizeof(struct isakmp_hdr);
|
||||
chunk_t data, iv;
|
||||
char *new_iv;
|
||||
size_t crypter_block_size;
|
||||
size_t crypter_block_size, crypter_iv_size;
|
||||
encryption_algorithm_t enc_alg;
|
||||
crypter_t *crypter;
|
||||
|
||||
@@ -1761,6 +1761,7 @@ bool encrypt_message(pb_stream *pbs, struct state *st)
|
||||
enc_alg = oakley_to_encryption_algorithm(st->st_oakley.encrypt);
|
||||
crypter = lib->crypto->create_crypter(lib->crypto, enc_alg, st->st_enc_key.len);
|
||||
crypter_block_size = crypter->get_block_size(crypter);
|
||||
crypter_iv_size = crypter->get_iv_size(crypter);
|
||||
|
||||
/* Pad up to multiple of encryption blocksize.
|
||||
* See the description associated with the definition of
|
||||
@@ -1781,15 +1782,15 @@ bool encrypt_message(pb_stream *pbs, struct state *st)
|
||||
data = chunk_create(enc_start, enc_len);
|
||||
|
||||
/* form iv by truncation */
|
||||
st->st_new_iv_len = crypter_block_size;
|
||||
st->st_new_iv_len = crypter_iv_size;
|
||||
iv = chunk_create(st->st_new_iv, st->st_new_iv_len);
|
||||
|
||||
crypter->set_key(crypter, st->st_enc_key);
|
||||
crypter->encrypt(crypter, data, iv, NULL);
|
||||
crypter->destroy(crypter);
|
||||
|
||||
new_iv = data.ptr + data.len - crypter_block_size;
|
||||
memcpy(st->st_new_iv, new_iv, crypter_block_size);
|
||||
new_iv = data.ptr + data.len - crypter_iv_size;
|
||||
memcpy(st->st_new_iv, new_iv, crypter_iv_size);
|
||||
update_iv(st);
|
||||
DBG_cond_dump(DBG_CRYPT, "next IV:", st->st_iv, st->st_iv_len);
|
||||
close_message(pbs);
|
||||
|
||||
+2
-2
@@ -473,7 +473,7 @@ end:
|
||||
DBG1(DBG_LIB, "symmetric key length %d is wrong", symmetric_key.len);
|
||||
goto failed;
|
||||
}
|
||||
if (iv.len != crypter->get_block_size(crypter))
|
||||
if (iv.len != crypter->get_iv_size(crypter))
|
||||
{
|
||||
DBG1(DBG_LIB, "IV length %d is wrong", iv.len);
|
||||
goto failed;
|
||||
@@ -668,7 +668,7 @@ chunk_t pkcs7_build_envelopedData(chunk_t data, certificate_t *cert, int enc_alg
|
||||
rng->destroy(rng);
|
||||
|
||||
rng = lib->crypto->create_rng(lib->crypto, RNG_WEAK);
|
||||
rng->allocate_bytes(rng, crypter->get_block_size(crypter), &iv);
|
||||
rng->allocate_bytes(rng, crypter->get_iv_size(crypter), &iv);
|
||||
DBG4(DBG_LIB, "initialization vector: %B", &iv);
|
||||
rng->destroy(rng);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user