summaryrefslogtreecommitdiffstats
path: root/security/nss/lib/freebl/intel-gcm-wrap.c
diff options
context:
space:
mode:
authorwolfbeast <mcwerewolf@wolfbeast.com>2019-10-24 22:41:05 +0200
committerwolfbeast <mcwerewolf@wolfbeast.com>2019-10-24 22:41:05 +0200
commit565ae72f5af3bcc9fb85945233e2a7afa115d435 (patch)
tree52dd8525956f7bea1fcb2bc89b9af73269666855 /security/nss/lib/freebl/intel-gcm-wrap.c
parentf1308011aef318f40d05d93353db17d059db83a0 (diff)
parentfbf84d5155f7d47df85e1d389955a9529a04158f (diff)
downloadUXP-565ae72f5af3bcc9fb85945233e2a7afa115d435.tar
UXP-565ae72f5af3bcc9fb85945233e2a7afa115d435.tar.gz
UXP-565ae72f5af3bcc9fb85945233e2a7afa115d435.tar.lz
UXP-565ae72f5af3bcc9fb85945233e2a7afa115d435.tar.xz
UXP-565ae72f5af3bcc9fb85945233e2a7afa115d435.zip
Merge branch 'nss-work'
Diffstat (limited to 'security/nss/lib/freebl/intel-gcm-wrap.c')
-rw-r--r--security/nss/lib/freebl/intel-gcm-wrap.c22
1 files changed, 22 insertions, 0 deletions
diff --git a/security/nss/lib/freebl/intel-gcm-wrap.c b/security/nss/lib/freebl/intel-gcm-wrap.c
index 37a1af765..f69bc7c7a 100644
--- a/security/nss/lib/freebl/intel-gcm-wrap.c
+++ b/security/nss/lib/freebl/intel-gcm-wrap.c
@@ -62,6 +62,12 @@ intel_AES_GCM_CreateContext(void *context,
PORT_SetError(SEC_ERROR_INVALID_ARGS);
return NULL;
}
+ // Limit AADLen in accordance with SP800-38D
+ if (sizeof(AAD_whole_len) >= 8 && AAD_whole_len > (1ULL << 61) - 1) {
+ PORT_SetError(SEC_ERROR_INPUT_LEN);
+ return NULL;
+ }
+
gcm = PORT_ZNew(intel_AES_GCMContext);
if (gcm == NULL) {
return NULL;
@@ -159,6 +165,14 @@ intel_AES_GCM_EncryptUpdate(intel_AES_GCMContext *gcm,
unsigned char T[AES_BLOCK_SIZE];
unsigned int j;
+ // GCM has a 16 octet block, with a 32-bit block counter
+ // Limit in accordance with SP800-38D
+ if (sizeof(inlen) > 4 &&
+ inlen >= ((1ULL << 32) - 2) * AES_BLOCK_SIZE) {
+ PORT_SetError(SEC_ERROR_INPUT_LEN);
+ return SECFailure;
+ }
+
tagBytes = (gcm->tagBits + (PR_BITS_PER_BYTE - 1)) / PR_BITS_PER_BYTE;
if (UINT_MAX - inlen < tagBytes) {
PORT_SetError(SEC_ERROR_INPUT_LEN);
@@ -216,6 +230,14 @@ intel_AES_GCM_DecryptUpdate(intel_AES_GCMContext *gcm,
inlen -= tagBytes;
intag = inbuf + inlen;
+ // GCM has a 16 octet block, with a 32-bit block counter
+ // Limit in accordance with SP800-38D
+ if (sizeof(inlen) > 4 &&
+ inlen >= ((1ULL << 32) - 2) * AES_BLOCK_SIZE) {
+ PORT_SetError(SEC_ERROR_INPUT_LEN);
+ return SECFailure;
+ }
+
if (maxout < inlen) {
*outlen = inlen;
PORT_SetError(SEC_ERROR_OUTPUT_LEN);