diff options
author | Renato Botelho <renato@netgate.com> | 2015-08-17 13:53:22 -0300 |
---|---|---|
committer | Renato Botelho <renato@netgate.com> | 2015-08-17 13:53:22 -0300 |
commit | 86163f54d3288d43997b0766d4c2538ed7f70b17 (patch) | |
tree | f3aed79ce63c2fb0eea1b2595b71b007d200ed43 /sys/crypto/aesni/aesni_wrap.c | |
parent | 46e99a8858f1c843c1774e472c11d422ca2163ae (diff) | |
download | FreeBSD-src-86163f54d3288d43997b0766d4c2538ed7f70b17.zip FreeBSD-src-86163f54d3288d43997b0766d4c2538ed7f70b17.tar.gz |
Importing pfSense patch aesgcm.hwaccl.diff
Diffstat (limited to 'sys/crypto/aesni/aesni_wrap.c')
-rw-r--r-- | sys/crypto/aesni/aesni_wrap.c | 37 |
1 files changed, 30 insertions, 7 deletions
diff --git a/sys/crypto/aesni/aesni_wrap.c b/sys/crypto/aesni/aesni_wrap.c index 39819a6..83d79fc 100644 --- a/sys/crypto/aesni/aesni_wrap.c +++ b/sys/crypto/aesni/aesni_wrap.c @@ -176,10 +176,6 @@ aesni_decrypt_ecb(int rounds, const void *key_schedule, size_t len, } } -#define AES_XTS_BLOCKSIZE 16 -#define AES_XTS_IVSIZE 8 -#define AES_XTS_ALPHA 0x87 /* GF(2^128) generator polynomial */ - static inline __m128i xts_crank_lfsr(__m128i inp) { @@ -347,6 +343,23 @@ aesni_cipher_setup_common(struct aesni_session *ses, const uint8_t *key, ses->rounds = AES256_ROUNDS; break; default: + printf("invalid CBC/GCM key length"); + return (EINVAL); + } + break; + case CRYPTO_AES_RFC4106_GCM_16: + switch (keylen) { + case 160: + ses->rounds = AES128_ROUNDS; + break; + case 224: + ses->rounds = AES192_ROUNDS; + break; + case 288: + ses->rounds = AES256_ROUNDS; + break; + default: + printf("invalid CBC/GCM key length"); return (EINVAL); } break; @@ -359,6 +372,7 @@ aesni_cipher_setup_common(struct aesni_session *ses, const uint8_t *key, ses->rounds = AES256_ROUNDS; break; default: + printf("invalid XTS key length"); return (EINVAL); } break; @@ -368,11 +382,20 @@ aesni_cipher_setup_common(struct aesni_session *ses, const uint8_t *key, aesni_set_enckey(key, ses->enc_schedule, ses->rounds); aesni_set_deckey(ses->enc_schedule, ses->dec_schedule, ses->rounds); - if (ses->algo == CRYPTO_AES_CBC) - arc4rand(ses->iv, sizeof(ses->iv), 0); - else /* if (ses->algo == CRYPTO_AES_XTS) */ { + + /* setup IV */ + switch (ses->algo) { + case CRYPTO_AES_CBC: + /* Nothing todo */ + break; + case CRYPTO_AES_RFC4106_GCM_16: + bcopy(key + ((keylen - 32) / 8), ses->nonce, AESCTR_NONCESIZE); + arc4rand((void *)&ses->aesgcmcounter, sizeof(uint64_t), 0); + break; + case CRYPTO_AES_XTS: aesni_set_enckey(key + keylen / 16, ses->xts_schedule, ses->rounds); + break; } return (0); |