FIPS counters for AES-CTR.
Change-Id: I0ea4c600741c3604d7b3b6df614b40d8c57116e4
Reviewed-on: https://boringssl-review.googlesource.com/c/boringssl/+/46504
Commit-Queue: David Benjamin <davidben@google.com>
Reviewed-by: David Benjamin <davidben@google.com>
diff --git a/crypto/crypto_test.cc b/crypto/crypto_test.cc
index ccb0956..03b909d 100644
--- a/crypto/crypto_test.cc
+++ b/crypto/crypto_test.cc
@@ -49,6 +49,14 @@
EVP_aes_256_gcm,
fips_counter_evp_aes_256_gcm,
},
+ {
+ EVP_aes_128_ctr,
+ fips_counter_evp_aes_128_ctr,
+ },
+ {
+ EVP_aes_256_ctr,
+ fips_counter_evp_aes_256_ctr,
+ },
};
uint8_t key[EVP_MAX_KEY_LENGTH] = {0};
diff --git a/crypto/fipsmodule/cipher/e_aes.c b/crypto/fipsmodule/cipher/e_aes.c
index 9186186..f77133f 100644
--- a/crypto/fipsmodule/cipher/e_aes.c
+++ b/crypto/fipsmodule/cipher/e_aes.c
@@ -141,10 +141,22 @@
static int aes_init_key(EVP_CIPHER_CTX *ctx, const uint8_t *key,
const uint8_t *iv, int enc) {
- int ret, mode;
+ int ret;
EVP_AES_KEY *dat = (EVP_AES_KEY *)ctx->cipher_data;
+ const int mode = ctx->cipher->flags & EVP_CIPH_MODE_MASK;
- mode = ctx->cipher->flags & EVP_CIPH_MODE_MASK;
+ if (mode == EVP_CIPH_CTR_MODE) {
+ switch (ctx->key_len) {
+ case 16:
+ boringssl_fips_inc_counter(fips_counter_evp_aes_128_ctr);
+ break;
+
+ case 32:
+ boringssl_fips_inc_counter(fips_counter_evp_aes_256_ctr);
+ break;
+ }
+ }
+
if ((mode == EVP_CIPH_ECB_MODE || mode == EVP_CIPH_CBC_MODE) && !enc) {
if (hwaes_capable()) {
ret = aes_hw_set_decrypt_key(key, ctx->key_len * 8, &dat->ks.ks);
diff --git a/include/openssl/crypto.h b/include/openssl/crypto.h
index e3773e5..93b1a9b 100644
--- a/include/openssl/crypto.h
+++ b/include/openssl/crypto.h
@@ -80,8 +80,10 @@
enum fips_counter_t {
fips_counter_evp_aes_128_gcm = 0,
fips_counter_evp_aes_256_gcm = 1,
+ fips_counter_evp_aes_128_ctr = 2,
+ fips_counter_evp_aes_256_ctr = 3,
- fips_counter_max = 1,
+ fips_counter_max = 3,
};
// FIPS_read_counter returns a counter of the number of times the specific