mirror of
https://github.com/wolfSSL/wolfssl.git
synced 2025-07-31 11:17:29 +02:00
EVP_CipherInit: allow NULL iv for openSSL compatibility
This commit is contained in:
41
src/ssl.c
41
src/ssl.c
@ -13314,7 +13314,7 @@ int wolfSSL_EVP_MD_type(const WOLFSSL_EVP_MD *md)
|
|||||||
{
|
{
|
||||||
WOLFSSL_ENTER("EVP_CIPHER_CTX_init");
|
WOLFSSL_ENTER("EVP_CIPHER_CTX_init");
|
||||||
if (ctx) {
|
if (ctx) {
|
||||||
ctx->cipherType = 0xff; /* no init */
|
ctx->cipherType = WOLFSSL_EVP_CIPH_TYPE_INIT; /* not yet initialized */
|
||||||
ctx->keyLen = 0;
|
ctx->keyLen = 0;
|
||||||
ctx->enc = 1; /* start in encrypt mode */
|
ctx->enc = 1; /* start in encrypt mode */
|
||||||
}
|
}
|
||||||
@ -13326,13 +13326,26 @@ int wolfSSL_EVP_MD_type(const WOLFSSL_EVP_MD *md)
|
|||||||
{
|
{
|
||||||
WOLFSSL_ENTER("EVP_CIPHER_CTX_cleanup");
|
WOLFSSL_ENTER("EVP_CIPHER_CTX_cleanup");
|
||||||
if (ctx) {
|
if (ctx) {
|
||||||
ctx->cipherType = 0xff; /* no more init */
|
ctx->cipherType = WOLFSSL_EVP_CIPH_TYPE_INIT; /* not yet initialized */
|
||||||
ctx->keyLen = 0;
|
ctx->keyLen = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
return WOLFSSL_SUCCESS;
|
return WOLFSSL_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int AesSetKey(Aes* aes, const byte* key, word32 len,
|
||||||
|
const byte* iv, int dir)
|
||||||
|
{
|
||||||
|
int ret;
|
||||||
|
/* wc_AesSetKey clear aes.reg if iv == NULL.
|
||||||
|
Keep IV for openSSL compatibility */
|
||||||
|
if(iv == NULL)
|
||||||
|
XMEMCPY((byte *)aes->tmp, (byte *)aes->reg, AES_BLOCK_SIZE);
|
||||||
|
ret = wc_AesSetKey(aes, key, len, iv, dir);
|
||||||
|
if(iv == NULL)
|
||||||
|
XMEMCPY((byte *)aes->reg, (byte *)aes->tmp, AES_BLOCK_SIZE);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
/* return WOLFSSL_SUCCESS on ok, 0 on failure to match API compatibility */
|
/* return WOLFSSL_SUCCESS on ok, 0 on failure to match API compatibility */
|
||||||
int wolfSSL_EVP_CipherInit(WOLFSSL_EVP_CIPHER_CTX* ctx,
|
int wolfSSL_EVP_CipherInit(WOLFSSL_EVP_CIPHER_CTX* ctx,
|
||||||
@ -13355,13 +13368,13 @@ int wolfSSL_EVP_MD_type(const WOLFSSL_EVP_MD *md)
|
|||||||
return 0; /* failure */
|
return 0; /* failure */
|
||||||
}
|
}
|
||||||
if (ctx->cipherType == WOLFSSL_EVP_CIPH_TYPE_INIT){
|
if (ctx->cipherType == WOLFSSL_EVP_CIPH_TYPE_INIT){
|
||||||
|
/* only first EVP_CipherInit invoke. ctx->cipherType is set below */
|
||||||
|
XMEMSET(&ctx->cipher, 0, sizeof(ctx->cipher));
|
||||||
ctx->bufUsed = 0;
|
ctx->bufUsed = 0;
|
||||||
ctx->lastUsed = 0;
|
ctx->lastUsed = 0;
|
||||||
ctx->flags = 0;
|
ctx->flags = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
XMEMSET(&ctx->cipher, 0, sizeof(ctx->cipher));
|
|
||||||
|
|
||||||
#ifndef NO_AES
|
#ifndef NO_AES
|
||||||
#ifdef HAVE_AES_CBC
|
#ifdef HAVE_AES_CBC
|
||||||
#ifdef WOLFSSL_AES_128
|
#ifdef WOLFSSL_AES_128
|
||||||
@ -13376,7 +13389,7 @@ int wolfSSL_EVP_MD_type(const WOLFSSL_EVP_MD *md)
|
|||||||
if (enc == 0 || enc == 1)
|
if (enc == 0 || enc == 1)
|
||||||
ctx->enc = enc ? 1 : 0;
|
ctx->enc = enc ? 1 : 0;
|
||||||
if (key) {
|
if (key) {
|
||||||
ret = wc_AesSetKey(&ctx->cipher.aes, key, ctx->keyLen, iv,
|
ret = AesSetKey(&ctx->cipher.aes, key, ctx->keyLen, iv,
|
||||||
ctx->enc ? AES_ENCRYPTION : AES_DECRYPTION);
|
ctx->enc ? AES_ENCRYPTION : AES_DECRYPTION);
|
||||||
if (ret != 0)
|
if (ret != 0)
|
||||||
return ret;
|
return ret;
|
||||||
@ -13400,7 +13413,7 @@ int wolfSSL_EVP_MD_type(const WOLFSSL_EVP_MD *md)
|
|||||||
if (enc == 0 || enc == 1)
|
if (enc == 0 || enc == 1)
|
||||||
ctx->enc = enc ? 1 : 0;
|
ctx->enc = enc ? 1 : 0;
|
||||||
if (key) {
|
if (key) {
|
||||||
ret = wc_AesSetKey(&ctx->cipher.aes, key, ctx->keyLen, iv,
|
ret = AesSetKey(&ctx->cipher.aes, key, ctx->keyLen, iv,
|
||||||
ctx->enc ? AES_ENCRYPTION : AES_DECRYPTION);
|
ctx->enc ? AES_ENCRYPTION : AES_DECRYPTION);
|
||||||
if (ret != 0)
|
if (ret != 0)
|
||||||
return ret;
|
return ret;
|
||||||
@ -13424,10 +13437,10 @@ int wolfSSL_EVP_MD_type(const WOLFSSL_EVP_MD *md)
|
|||||||
if (enc == 0 || enc == 1)
|
if (enc == 0 || enc == 1)
|
||||||
ctx->enc = enc ? 1 : 0;
|
ctx->enc = enc ? 1 : 0;
|
||||||
if (key) {
|
if (key) {
|
||||||
ret = wc_AesSetKey(&ctx->cipher.aes, key, ctx->keyLen, iv,
|
ret = AesSetKey(&ctx->cipher.aes, key, ctx->keyLen, iv,
|
||||||
ctx->enc ? AES_ENCRYPTION : AES_DECRYPTION);
|
ctx->enc ? AES_ENCRYPTION : AES_DECRYPTION);
|
||||||
if (ret != 0){
|
if (ret != 0){
|
||||||
WOLFSSL_MSG("wc_AesSetKey() failed");
|
WOLFSSL_MSG("AesSetKey() failed");
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -13454,7 +13467,7 @@ int wolfSSL_EVP_MD_type(const WOLFSSL_EVP_MD *md)
|
|||||||
if (enc == 0 || enc == 1)
|
if (enc == 0 || enc == 1)
|
||||||
ctx->enc = enc ? 1 : 0;
|
ctx->enc = enc ? 1 : 0;
|
||||||
if (key) {
|
if (key) {
|
||||||
ret = wc_AesSetKey(&ctx->cipher.aes, key, ctx->keyLen, iv,
|
ret = AesSetKey(&ctx->cipher.aes, key, ctx->keyLen, iv,
|
||||||
AES_ENCRYPTION);
|
AES_ENCRYPTION);
|
||||||
if (ret != 0)
|
if (ret != 0)
|
||||||
return ret;
|
return ret;
|
||||||
@ -13478,7 +13491,7 @@ int wolfSSL_EVP_MD_type(const WOLFSSL_EVP_MD *md)
|
|||||||
if (enc == 0 || enc == 1)
|
if (enc == 0 || enc == 1)
|
||||||
ctx->enc = enc ? 1 : 0;
|
ctx->enc = enc ? 1 : 0;
|
||||||
if (key) {
|
if (key) {
|
||||||
ret = wc_AesSetKey(&ctx->cipher.aes, key, ctx->keyLen, iv,
|
ret = AesSetKey(&ctx->cipher.aes, key, ctx->keyLen, iv,
|
||||||
AES_ENCRYPTION);
|
AES_ENCRYPTION);
|
||||||
if (ret != 0)
|
if (ret != 0)
|
||||||
return ret;
|
return ret;
|
||||||
@ -13502,7 +13515,7 @@ int wolfSSL_EVP_MD_type(const WOLFSSL_EVP_MD *md)
|
|||||||
if (enc == 0 || enc == 1)
|
if (enc == 0 || enc == 1)
|
||||||
ctx->enc = enc ? 1 : 0;
|
ctx->enc = enc ? 1 : 0;
|
||||||
if (key) {
|
if (key) {
|
||||||
ret = wc_AesSetKey(&ctx->cipher.aes, key, ctx->keyLen, iv,
|
ret = AesSetKey(&ctx->cipher.aes, key, ctx->keyLen, iv,
|
||||||
AES_ENCRYPTION);
|
AES_ENCRYPTION);
|
||||||
if (ret != 0)
|
if (ret != 0)
|
||||||
return ret;
|
return ret;
|
||||||
@ -13527,7 +13540,7 @@ int wolfSSL_EVP_MD_type(const WOLFSSL_EVP_MD *md)
|
|||||||
if (enc == 0 || enc == 1)
|
if (enc == 0 || enc == 1)
|
||||||
ctx->enc = enc ? 1 : 0;
|
ctx->enc = enc ? 1 : 0;
|
||||||
if (key) {
|
if (key) {
|
||||||
ret = wc_AesSetKey(&ctx->cipher.aes, key, ctx->keyLen, NULL,
|
ret = AesSetKey(&ctx->cipher.aes, key, ctx->keyLen, NULL,
|
||||||
ctx->enc ? AES_ENCRYPTION : AES_DECRYPTION);
|
ctx->enc ? AES_ENCRYPTION : AES_DECRYPTION);
|
||||||
}
|
}
|
||||||
if (ret != 0)
|
if (ret != 0)
|
||||||
@ -13546,7 +13559,7 @@ int wolfSSL_EVP_MD_type(const WOLFSSL_EVP_MD *md)
|
|||||||
if (enc == 0 || enc == 1)
|
if (enc == 0 || enc == 1)
|
||||||
ctx->enc = enc ? 1 : 0;
|
ctx->enc = enc ? 1 : 0;
|
||||||
if (key) {
|
if (key) {
|
||||||
ret = wc_AesSetKey(&ctx->cipher.aes, key, ctx->keyLen, NULL,
|
ret = AesSetKey(&ctx->cipher.aes, key, ctx->keyLen, NULL,
|
||||||
ctx->enc ? AES_ENCRYPTION : AES_DECRYPTION);
|
ctx->enc ? AES_ENCRYPTION : AES_DECRYPTION);
|
||||||
}
|
}
|
||||||
if (ret != 0)
|
if (ret != 0)
|
||||||
@ -13565,7 +13578,7 @@ int wolfSSL_EVP_MD_type(const WOLFSSL_EVP_MD *md)
|
|||||||
if (enc == 0 || enc == 1)
|
if (enc == 0 || enc == 1)
|
||||||
ctx->enc = enc ? 1 : 0;
|
ctx->enc = enc ? 1 : 0;
|
||||||
if (key) {
|
if (key) {
|
||||||
ret = wc_AesSetKey(&ctx->cipher.aes, key, ctx->keyLen, NULL,
|
ret = AesSetKey(&ctx->cipher.aes, key, ctx->keyLen, NULL,
|
||||||
ctx->enc ? AES_ENCRYPTION : AES_DECRYPTION);
|
ctx->enc ? AES_ENCRYPTION : AES_DECRYPTION);
|
||||||
}
|
}
|
||||||
if (ret != 0)
|
if (ret != 0)
|
||||||
|
Reference in New Issue
Block a user