Make bcm use internal AES functions
This prevents problems davidben and I noticed with bcm reaching
out of the module for AES.
Change-Id: I95dc57e8735140ebc296aa005f08677ef24acbe3
Reviewed-on: https://boringssl-review.googlesource.com/c/boringssl/+/77827
Reviewed-by: David Benjamin <davidben@google.com>
Commit-Queue: Bob Beck <bbe@google.com>
diff --git a/crypto/fipsmodule/aes/key_wrap.cc.inc b/crypto/fipsmodule/aes/key_wrap.cc.inc
index 99c2450..ad1c314 100644
--- a/crypto/fipsmodule/aes/key_wrap.cc.inc
+++ b/crypto/fipsmodule/aes/key_wrap.cc.inc
@@ -20,6 +20,7 @@
#include <openssl/mem.h>
+#include "../bcm_interface.h"
#include "../../internal.h"
#include "../service_indicator/internal.h"
@@ -53,7 +54,7 @@
for (unsigned j = 0; j < kBound; j++) {
for (size_t i = 1; i <= n; i++) {
OPENSSL_memcpy(A + 8, out + 8 * i, 8);
- AES_encrypt(A, A, key);
+ BCM_aes_encrypt(A, A, key);
uint32_t t = (uint32_t)(n * j + i);
A[7] ^= t & 0xff;
@@ -96,7 +97,7 @@
A[5] ^= (t >> 16) & 0xff;
A[4] ^= (t >> 24) & 0xff;
OPENSSL_memcpy(A + 8, out + 8 * (i - 1), 8);
- AES_decrypt(A, A, key);
+ BCM_aes_decrypt(A, A, key);
OPENSSL_memcpy(out + 8 * (i - 1), A + 8, 8);
}
}
@@ -145,7 +146,7 @@
if (in_len <= 8) {
memset(block + 8, 0, 8);
memcpy(block + 8, in, in_len);
- AES_encrypt(block, out, key);
+ BCM_aes_encrypt(block, out, key);
*out_len = AES_BLOCK_SIZE;
return 1;
}
@@ -179,7 +180,7 @@
uint8_t iv[8];
if (in_len == AES_BLOCK_SIZE) {
uint8_t block[AES_BLOCK_SIZE];
- AES_decrypt(in, block, key);
+ BCM_aes_decrypt(in, block, key);
memcpy(iv, block, sizeof(iv));
memcpy(out, block + 8, 8);
} else if (!aes_unwrap_key_inner(key, out, iv, in, in_len)) {
diff --git a/crypto/fipsmodule/aes/mode_wrappers.cc.inc b/crypto/fipsmodule/aes/mode_wrappers.cc.inc
index be5fba9..fdbab94 100644
--- a/crypto/fipsmodule/aes/mode_wrappers.cc.inc
+++ b/crypto/fipsmodule/aes/mode_wrappers.cc.inc
@@ -19,6 +19,15 @@
#include "../aes/internal.h"
#include "../service_indicator/internal.h"
+namespace {
+void aes_encrypt(const uint8_t *in, uint8_t *out, const AES_KEY *key) {
+ BCM_aes_encrypt(in, out, key);
+}
+
+void aes_decrypt(const uint8_t *in, uint8_t *out, const AES_KEY *key) {
+ BCM_aes_decrypt(in, out, key);
+}
+}
void AES_ctr128_encrypt(const uint8_t *in, uint8_t *out, size_t len,
const AES_KEY *key, uint8_t ivec[AES_BLOCK_SIZE],
@@ -45,9 +54,9 @@
assert((AES_ENCRYPT == enc) || (AES_DECRYPT == enc));
if (AES_ENCRYPT == enc) {
- AES_encrypt(in, out, key);
+ BCM_aes_encrypt(in, out, key);
} else {
- AES_decrypt(in, out, key);
+ BCM_aes_decrypt(in, out, key);
}
FIPS_service_indicator_update_state();
@@ -60,9 +69,9 @@
} else if (!vpaes_capable()) {
aes_nohw_cbc_encrypt(in, out, len, key, ivec, enc);
} else if (enc) {
- CRYPTO_cbc128_encrypt(in, out, len, key, ivec, AES_encrypt);
+ CRYPTO_cbc128_encrypt(in, out, len, key, ivec, aes_encrypt);
} else {
- CRYPTO_cbc128_decrypt(in, out, len, key, ivec, AES_decrypt);
+ CRYPTO_cbc128_decrypt(in, out, len, key, ivec, aes_decrypt);
}
FIPS_service_indicator_update_state();
@@ -71,7 +80,7 @@
void AES_ofb128_encrypt(const uint8_t *in, uint8_t *out, size_t length,
const AES_KEY *key, uint8_t *ivec, int *num) {
unsigned num_u = (unsigned)(*num);
- CRYPTO_ofb128_encrypt(in, out, length, key, ivec, &num_u, AES_encrypt);
+ CRYPTO_ofb128_encrypt(in, out, length, key, ivec, &num_u, aes_encrypt);
*num = (int)num_u;
}
@@ -79,6 +88,6 @@
const AES_KEY *key, uint8_t *ivec, int *num,
int enc) {
unsigned num_u = (unsigned)(*num);
- CRYPTO_cfb128_encrypt(in, out, length, key, ivec, &num_u, enc, AES_encrypt);
+ CRYPTO_cfb128_encrypt(in, out, length, key, ivec, &num_u, enc, aes_encrypt);
*num = (int)num_u;
}
diff --git a/crypto/fipsmodule/self_check/self_check.cc.inc b/crypto/fipsmodule/self_check/self_check.cc.inc
index b5eb7ea..a126a1b 100644
--- a/crypto/fipsmodule/self_check/self_check.cc.inc
+++ b/crypto/fipsmodule/self_check/self_check.cc.inc
@@ -728,8 +728,9 @@
0x50, 0x3a, 0xc5, 0x5e, 0x8e, 0x93, 0x40, 0xf2, 0x10, 0xd8,
};
memcpy(aes_iv, kAESIV, sizeof(kAESIV));
- if (AES_set_encrypt_key(kAESKey, 8 * sizeof(kAESKey), &aes_key) != 0) {
- fprintf(CRYPTO_get_stderr(), "AES_set_encrypt_key failed.\n");
+ if (!bcm_success(
+ BCM_aes_set_encrypt_key(kAESKey, 8 * sizeof(kAESKey), &aes_key))) {
+ fprintf(CRYPTO_get_stderr(), "BCM_aes_set_encrypt_key failed.\n");
goto err;
}
AES_cbc_encrypt(kAESCBCEncPlaintext, output, sizeof(kAESCBCEncPlaintext),
@@ -752,8 +753,9 @@
0xb2, 0x25, 0x6f, 0xa6, 0xd0, 0xd2, 0x0e, 0x6f, 0x19, 0xb5,
};
memcpy(aes_iv, kAESIV, sizeof(kAESIV));
- if (AES_set_decrypt_key(kAESKey, 8 * sizeof(kAESKey), &aes_key) != 0) {
- fprintf(CRYPTO_get_stderr(), "AES_set_decrypt_key failed.\n");
+ if (!bcm_success(
+ BCM_aes_set_decrypt_key(kAESKey, 8 * sizeof(kAESKey), &aes_key))) {
+ fprintf(CRYPTO_get_stderr(), "BCM_aes_set_decrypt_key failed.\n");
goto err;
}
AES_cbc_encrypt(kAESCBCDecCiphertext, output, sizeof(kAESCBCDecCiphertext),