diff options
author | Kurt Roeckx <kurt@roeckx.be> | 2018-11-04 19:16:20 +0100 |
---|---|---|
committer | Kurt Roeckx <kurt@roeckx.be> | 2019-06-06 17:41:41 +0200 |
commit | be5fc053ed40bb714944f93e2d35265d2096f71f (patch) | |
tree | c3cf4d433e820288944c7f4eeb04bfccd9f2d86c /crypto/modes/siv128.c | |
parent | e6071f29c24cd22ac7857bf88917598265cc90a9 (diff) | |
download | openssl-new-be5fc053ed40bb714944f93e2d35265d2096f71f.tar.gz |
Replace EVP_MAC_CTX_copy() by EVP_MAC_CTX_dup()
Reviewed-by: Tomas Mraz <tmraz@fedoraproject.org>
GH: #7651
Diffstat (limited to 'crypto/modes/siv128.c')
-rw-r--r-- | crypto/modes/siv128.c | 61 |
1 files changed, 36 insertions, 25 deletions
diff --git a/crypto/modes/siv128.c b/crypto/modes/siv128.c index f812d0a727..9bb5eea6e1 100644 --- a/crypto/modes/siv128.c +++ b/crypto/modes/siv128.c @@ -92,30 +92,38 @@ __owur static ossl_inline int siv128_do_s2v_p(SIV128_CONTEXT *ctx, SIV_BLOCK *ou { SIV_BLOCK t; size_t out_len = sizeof(out->byte); + EVP_MAC_CTX *mac_ctx; + int ret = 0; - if (!EVP_MAC_CTX_copy(ctx->mac_ctx, ctx->mac_ctx_init)) + mac_ctx = EVP_MAC_CTX_dup(ctx->mac_ctx_init); + if (mac_ctx == NULL) return 0; if (len >= SIV_LEN) { - if (!EVP_MAC_update(ctx->mac_ctx, in, len - SIV_LEN)) - return 0; + if (!EVP_MAC_update(mac_ctx, in, len - SIV_LEN)) + goto err; memcpy(&t, in + (len-SIV_LEN), SIV_LEN); siv128_xorblock(&t, &ctx->d); - if (!EVP_MAC_update(ctx->mac_ctx, t.byte, SIV_LEN)) - return 0; + if (!EVP_MAC_update(mac_ctx, t.byte, SIV_LEN)) + goto err; } else { memset(&t, 0, sizeof(t)); memcpy(&t, in, len); t.byte[len] = 0x80; siv128_dbl(&ctx->d); siv128_xorblock(&t, &ctx->d); - if (!EVP_MAC_update(ctx->mac_ctx, t.byte, SIV_LEN)) - return 0; + if (!EVP_MAC_update(mac_ctx, t.byte, SIV_LEN)) + goto err; } - if (!EVP_MAC_final(ctx->mac_ctx, out->byte, &out_len) + if (!EVP_MAC_final(mac_ctx, out->byte, &out_len) || out_len != SIV_LEN) - return 0; - return 1; + goto err; + + ret = 1; + +err: + EVP_MAC_CTX_free(mac_ctx); + return ret; } @@ -156,27 +164,27 @@ int CRYPTO_siv128_init(SIV128_CONTEXT *ctx, const unsigned char *key, int klen, { static const unsigned char zero[SIV_LEN] = { 0 }; size_t out_len = SIV_LEN; + EVP_MAC_CTX *mac_ctx = NULL; memset(&ctx->d, 0, sizeof(ctx->d)); ctx->cipher_ctx = NULL; - ctx->mac_ctx = NULL; ctx->mac_ctx_init = NULL; if (key == NULL || cbc == NULL || ctr == NULL || (ctx->cipher_ctx = EVP_CIPHER_CTX_new()) == NULL || (ctx->mac_ctx_init = EVP_MAC_CTX_new_id(EVP_MAC_CMAC)) == NULL - || (ctx->mac_ctx = EVP_MAC_CTX_new_id(EVP_MAC_CMAC)) == NULL || EVP_MAC_ctrl(ctx->mac_ctx_init, EVP_MAC_CTRL_SET_CIPHER, cbc) <= 0 || EVP_MAC_ctrl(ctx->mac_ctx_init, EVP_MAC_CTRL_SET_KEY, key, klen) <= 0 || !EVP_EncryptInit_ex(ctx->cipher_ctx, ctr, NULL, key + klen, NULL) - || !EVP_MAC_CTX_copy(ctx->mac_ctx, ctx->mac_ctx_init) - || !EVP_MAC_update(ctx->mac_ctx, zero, sizeof(zero)) - || !EVP_MAC_final(ctx->mac_ctx, ctx->d.byte, &out_len)) { + || (mac_ctx = EVP_MAC_CTX_dup(ctx->mac_ctx_init)) == NULL + || !EVP_MAC_update(mac_ctx, zero, sizeof(zero)) + || !EVP_MAC_final(mac_ctx, ctx->d.byte, &out_len)) { EVP_CIPHER_CTX_free(ctx->cipher_ctx); EVP_MAC_CTX_free(ctx->mac_ctx_init); - EVP_MAC_CTX_free(ctx->mac_ctx); + EVP_MAC_CTX_free(mac_ctx); return 0; } + EVP_MAC_CTX_free(mac_ctx); ctx->final_ret = -1; ctx->crypto_ok = 1; @@ -192,9 +200,10 @@ int CRYPTO_siv128_copy_ctx(SIV128_CONTEXT *dest, SIV128_CONTEXT *src) memcpy(&dest->d, &src->d, sizeof(src->d)); if (!EVP_CIPHER_CTX_copy(dest->cipher_ctx, src->cipher_ctx)) return 0; - if (!EVP_MAC_CTX_copy(dest->mac_ctx_init, src->mac_ctx_init)) + EVP_MAC_CTX_free(dest->mac_ctx_init); + dest->mac_ctx_init = EVP_MAC_CTX_dup(src->mac_ctx_init); + if (dest->mac_ctx_init == NULL) return 0; - /* no need to copy mac_ctx since it's temp storage */ return 1; } @@ -208,19 +217,23 @@ int CRYPTO_siv128_aad(SIV128_CONTEXT *ctx, const unsigned char *aad, { SIV_BLOCK mac_out; size_t out_len = SIV_LEN; + EVP_MAC_CTX *mac_ctx; siv128_dbl(&ctx->d); - if (!EVP_MAC_CTX_copy(ctx->mac_ctx, ctx->mac_ctx_init) - || !EVP_MAC_update(ctx->mac_ctx, aad, len) - || !EVP_MAC_final(ctx->mac_ctx, mac_out.byte, &out_len) - || out_len != SIV_LEN) + mac_ctx = EVP_MAC_CTX_dup(ctx->mac_ctx_init); + if (mac_ctx == NULL + || !EVP_MAC_update(mac_ctx, aad, len) + || !EVP_MAC_final(mac_ctx, mac_out.byte, &out_len) + || out_len != SIV_LEN) { + EVP_MAC_CTX_free(mac_ctx); return 0; + } + EVP_MAC_CTX_free(mac_ctx); siv128_xorblock(&ctx->d, &mac_out); return 1; - } /* @@ -330,8 +343,6 @@ int CRYPTO_siv128_cleanup(SIV128_CONTEXT *ctx) ctx->cipher_ctx = NULL; EVP_MAC_CTX_free(ctx->mac_ctx_init); ctx->mac_ctx_init = NULL; - EVP_MAC_CTX_free(ctx->mac_ctx); - ctx->mac_ctx = NULL; OPENSSL_cleanse(&ctx->d, sizeof(ctx->d)); OPENSSL_cleanse(&ctx->tag, sizeof(ctx->tag)); ctx->final_ret = -1; |