mirror of
https://github.com/wolfSSL/wolfssl.git
synced 2026-01-31 19:09:19 +01:00
Improvements to RSA padding. Expose API's to support external pad/unpad.
This commit is contained in:
@@ -129,19 +129,23 @@ enum {
|
||||
|
||||
static void wc_RsaCleanup(RsaKey* key)
|
||||
{
|
||||
#if !defined(WOLFSSL_RSA_VERIFY_INLINE) && !defined(WOLFSSL_NO_MALLOC)
|
||||
if (key && key->data) {
|
||||
#if !defined(WOLFSSL_NO_MALLOC) && (defined(WOLFSSL_ASYNC_CRYPT) || \
|
||||
(!defined(WOLFSSL_RSA_VERIFY_ONLY) && !defined(WOLFSSL_RSA_VERIFY_INLINE)))
|
||||
if (key != NULL) {
|
||||
#ifndef WOLFSSL_RSA_PUBLIC_ONLY
|
||||
/* if private operation zero temp buffer */
|
||||
if ((key->data != NULL && key->dataLen > 0) &&
|
||||
(key->type == RSA_PRIVATE_DECRYPT ||
|
||||
key->type == RSA_PRIVATE_ENCRYPT)) {
|
||||
ForceZero(key->data, key->dataLen);
|
||||
}
|
||||
#endif
|
||||
/* make sure any allocated memory is free'd */
|
||||
if (key->dataIsAlloc) {
|
||||
#ifndef WOLFSSL_RSA_PUBLIC_ONLY
|
||||
if (key->type == RSA_PRIVATE_DECRYPT ||
|
||||
key->type == RSA_PRIVATE_ENCRYPT) {
|
||||
ForceZero(key->data, key->dataLen);
|
||||
}
|
||||
#endif
|
||||
XFREE(key->data, key->heap, DYNAMIC_TYPE_WOLF_BIGINT);
|
||||
key->dataIsAlloc = 0;
|
||||
}
|
||||
|
||||
key->data = NULL;
|
||||
key->dataLen = 0;
|
||||
}
|
||||
@@ -163,10 +167,11 @@ int wc_InitRsaKey_ex(RsaKey* key, void* heap, int devId)
|
||||
key->type = RSA_TYPE_UNKNOWN;
|
||||
key->state = RSA_STATE_NONE;
|
||||
key->heap = heap;
|
||||
#if !defined(WOLFSSL_RSA_VERIFY_INLINE) && !defined(WOLFSSL_NO_MALLOC)
|
||||
#if !defined(WOLFSSL_NO_MALLOC) && (defined(WOLFSSL_ASYNC_CRYPT) || \
|
||||
(!defined(WOLFSSL_RSA_VERIFY_ONLY) && !defined(WOLFSSL_RSA_VERIFY_INLINE)))
|
||||
key->dataIsAlloc = 0;
|
||||
key->data = NULL;
|
||||
#endif
|
||||
key->data = NULL;
|
||||
key->dataLen = 0;
|
||||
#ifdef WC_RSA_BLINDING
|
||||
key->rng = NULL;
|
||||
@@ -3504,6 +3509,7 @@ static int RsaPrivateDecryptEx(const byte* in, word32 inLen, byte* out,
|
||||
break;
|
||||
}
|
||||
XMEMCPY(key->data, in, inLen);
|
||||
key->dataLen = inLen;
|
||||
}
|
||||
else {
|
||||
key->dataIsAlloc = 0;
|
||||
@@ -3537,13 +3543,13 @@ static int RsaPrivateDecryptEx(const byte* in, word32 inLen, byte* out,
|
||||
case RSA_STATE_DECRYPT_UNPAD:
|
||||
#if !defined(WOLFSSL_RSA_VERIFY_ONLY) && !defined(WOLFSSL_RSA_VERIFY_INLINE) && \
|
||||
!defined(WOLFSSL_NO_MALLOC)
|
||||
ret = wc_RsaUnPad_ex(key->data, key->dataLen, &pad, pad_value, pad_type,
|
||||
hash, mgf, label, labelSz, saltLen,
|
||||
mp_count_bits(&key->n), key->heap);
|
||||
ret = wc_RsaUnPad_ex(key->data,
|
||||
key->dataLen, &pad, pad_value, pad_type, hash, mgf,
|
||||
label, labelSz, saltLen, mp_count_bits(&key->n), key->heap);
|
||||
#else
|
||||
ret = wc_RsaUnPad_ex(out, key->dataLen, &pad, pad_value, pad_type, hash,
|
||||
mgf, label, labelSz, saltLen,
|
||||
mp_count_bits(&key->n), key->heap);
|
||||
ret = wc_RsaUnPad_ex(out,
|
||||
key->dataLen, &pad, pad_value, pad_type, hash, mgf, label,
|
||||
labelSz, saltLen, mp_count_bits(&key->n), key->heap);
|
||||
#endif
|
||||
if (rsa_type == RSA_PUBLIC_DECRYPT && ret > (int)outLen) {
|
||||
ret = RSA_BUFFER_E;
|
||||
|
||||
Reference in New Issue
Block a user