gcc-13 thinks `bl` can take negative value (when returned from
EVP_CIPHER_CTX_block_size). Do simple sanity checking to workaround this.
Also, add error propagation up to EVP_DigestFinal_ex, so this sanity checking
is not in vain.
Error message:
In function 'make_kn',
inlined from 'CMAC_ACPKM_Final' at /builddir/build/BUILD/engine-3.0.0/gost_omac_acpkm.c:274:5,
inlined from 'omac_acpkm_imit_final' at /builddir/build/BUILD/engine-3.0.0/gost_omac_acpkm.c:354:5:
/builddir/build/BUILD/engine-3.0.0/gost_omac_acpkm.c:55:20: error: writing 1 byte into a region of size 0 [-Werror=stringop-overflow=]
55 | k1[bl - 1] ^= bl == 16 ? 0x87 : 0x1b;
| ~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~
/builddir/build/BUILD/engine-3.0.0/gost_omac_acpkm.c: In function 'omac_acpkm_imit_final':
/builddir/build/BUILD/engine-3.0.0/gost_omac_acpkm.c:260:24: note: at offset [-
2147483649, -1] into destination object 'k2' of size 32
260 | unsigned char *k1, k2[EVP_MAX_BLOCK_LENGTH];
| ^~
Fixes: https://github.com/gost-engine/engine/issues/436
Signed-off-by: Vitaly Chikunov <vt@altlinux.org>
+/* Return value is propagated to EVP_DigestFinal_ex */
static int CMAC_ACPKM_Final(CMAC_ACPKM_CTX *ctx, unsigned char *out,
size_t *poutlen)
{
static int CMAC_ACPKM_Final(CMAC_ACPKM_CTX *ctx, unsigned char *out,
size_t *poutlen)
{
if (ctx->nlast_block == -1)
return 0;
bl = EVP_CIPHER_CTX_block_size(ctx->cctx);
if (ctx->nlast_block == -1)
return 0;
bl = EVP_CIPHER_CTX_block_size(ctx->cctx);
+ if (bl != 8 && bl != 16) {
+ GOSTerr(GOST_F_OMAC_ACPKM_IMIT_FINAL, GOST_R_INVALID_MAC_PARAMS);
+ return 0;
+ }
*poutlen = (size_t) bl;
if (!out)
return 1;
*poutlen = (size_t) bl;
if (!out)
return 1;
OMAC_ACPKM_CTX *c = EVP_MD_CTX_md_data(ctx);
unsigned char mac[MAX_GOST_OMAC_ACPKM_SIZE];
size_t mac_size = sizeof(mac);
OMAC_ACPKM_CTX *c = EVP_MD_CTX_md_data(ctx);
unsigned char mac[MAX_GOST_OMAC_ACPKM_SIZE];
size_t mac_size = sizeof(mac);
if (!c->key_set) {
GOSTerr(GOST_F_OMAC_ACPKM_IMIT_FINAL, GOST_R_MAC_KEY_NOT_SET);
return 0;
}
if (!c->key_set) {
GOSTerr(GOST_F_OMAC_ACPKM_IMIT_FINAL, GOST_R_MAC_KEY_NOT_SET);
return 0;
}
- CMAC_ACPKM_Final(c->cmac_ctx, mac, &mac_size);
+ ret = CMAC_ACPKM_Final(c->cmac_ctx, mac, &mac_size);
memcpy(md, mac, c->dgst_size);
memcpy(md, mac, c->dgst_size);
}
static int omac_acpkm_imit_copy(EVP_MD_CTX *to, const EVP_MD_CTX *from)
}
static int omac_acpkm_imit_copy(EVP_MD_CTX *to, const EVP_MD_CTX *from)