libipsec: Add support for AES-GCM

This commit is contained in:
Tobias Brunner
2013-05-03 15:13:57 +02:00
parent 24a8d1253f
commit 051fc25d92
+45 -3
View File
@@ -204,6 +204,37 @@ METHOD(esp_context_t, destroy, void,
free(this);
}
/**
* Create an AEAD algorithm
*/
static bool create_aead(private_esp_context_t *this, int alg,
chunk_t key)
{
switch (alg)
{
case ENCR_AES_GCM_ICV8:
case ENCR_AES_GCM_ICV12:
case ENCR_AES_GCM_ICV16:
/* the key includes a 4 byte salt */
this->aead = lib->crypto->create_aead(lib->crypto, alg, key.len-4);
break;
default:
break;
}
if (!this->aead)
{
DBG1(DBG_ESP, "failed to create ESP context: unsupported AEAD "
"algorithm");
return FALSE;
}
if (!this->aead->set_key(this->aead, key))
{
DBG1(DBG_ESP, "failed to create ESP context: setting AEAD key failed");
return FALSE;
}
return TRUE;
}
/**
* Create AEAD wrapper around traditional encryption/integrity algorithms
*/
@@ -288,10 +319,21 @@ esp_context_t *esp_context_create(int enc_alg, chunk_t enc_key,
.window_size = ESP_DEFAULT_WINDOW_SIZE,
);
if (!create_traditional(this, enc_alg, enc_key, int_alg, int_key))
if (encryption_algorithm_is_aead(enc_alg))
{
destroy(this);
return NULL;
if (!create_aead(this, enc_alg, enc_key))
{
destroy(this);
return NULL;
}
}
else
{
if (!create_traditional(this, enc_alg, enc_key, int_alg, int_key))
{
destroy(this);
return NULL;
}
}
if (inbound)