mirror of https://github.com/openssl/openssl.git
GCM: record limit counter gets reset on AAD changes
It shouldn't be. This moves the reset to the init function instead and only does the reset on a key change. Reviewed-by: Hugo Landau <hlandau@openssl.org> Reviewed-by: Tomas Mraz <tomas@openssl.org> (Merged from https://github.com/openssl/openssl/pull/18860)
This commit is contained in:
parent
5f18dc7fac
commit
3ebcb2fff5
|
|
@ -25,6 +25,10 @@ static int gcm_cipher_internal(PROV_GCM_CTX *ctx, unsigned char *out,
|
||||||
size_t *padlen, const unsigned char *in,
|
size_t *padlen, const unsigned char *in,
|
||||||
size_t len);
|
size_t len);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Called from EVP_CipherInit when there is currently no context via
|
||||||
|
* the new_ctx() function
|
||||||
|
*/
|
||||||
void ossl_gcm_initctx(void *provctx, PROV_GCM_CTX *ctx, size_t keybits,
|
void ossl_gcm_initctx(void *provctx, PROV_GCM_CTX *ctx, size_t keybits,
|
||||||
const PROV_GCM_HW *hw)
|
const PROV_GCM_HW *hw)
|
||||||
{
|
{
|
||||||
|
|
@ -38,6 +42,9 @@ void ossl_gcm_initctx(void *provctx, PROV_GCM_CTX *ctx, size_t keybits,
|
||||||
ctx->libctx = PROV_LIBCTX_OF(provctx);
|
ctx->libctx = PROV_LIBCTX_OF(provctx);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Called by EVP_CipherInit via the _einit and _dinit functions
|
||||||
|
*/
|
||||||
static int gcm_init(void *vctx, const unsigned char *key, size_t keylen,
|
static int gcm_init(void *vctx, const unsigned char *key, size_t keylen,
|
||||||
const unsigned char *iv, size_t ivlen,
|
const unsigned char *iv, size_t ivlen,
|
||||||
const OSSL_PARAM params[], int enc)
|
const OSSL_PARAM params[], int enc)
|
||||||
|
|
@ -66,6 +73,7 @@ static int gcm_init(void *vctx, const unsigned char *key, size_t keylen,
|
||||||
}
|
}
|
||||||
if (!ctx->hw->setkey(ctx, key, ctx->keylen))
|
if (!ctx->hw->setkey(ctx, key, ctx->keylen))
|
||||||
return 0;
|
return 0;
|
||||||
|
ctx->tls_enc_records = 0;
|
||||||
}
|
}
|
||||||
return ossl_gcm_set_ctx_params(ctx, params);
|
return ossl_gcm_set_ctx_params(ctx, params);
|
||||||
}
|
}
|
||||||
|
|
@ -447,7 +455,6 @@ static int gcm_tls_init(PROV_GCM_CTX *dat, unsigned char *aad, size_t aad_len)
|
||||||
buf = dat->buf;
|
buf = dat->buf;
|
||||||
memcpy(buf, aad, aad_len);
|
memcpy(buf, aad, aad_len);
|
||||||
dat->tls_aad_len = aad_len;
|
dat->tls_aad_len = aad_len;
|
||||||
dat->tls_enc_records = 0;
|
|
||||||
|
|
||||||
len = buf[aad_len - 2] << 8 | buf[aad_len - 1];
|
len = buf[aad_len - 2] << 8 | buf[aad_len - 1];
|
||||||
/* Correct length for explicit iv. */
|
/* Correct length for explicit iv. */
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue