forked from wolfSSL/wolfssl
add support for async with wc_RsaDirect function
This commit is contained in:
@ -1523,7 +1523,7 @@ static int wc_RsaFunctionAsync(const byte* in, word32 inLen, byte* out,
|
|||||||
* RSA_PUBLIC_DECRYPT, RSA_PRIVATE_ENCRYPT, RSA_PRIVATE_DECRYPT}
|
* RSA_PUBLIC_DECRYPT, RSA_PRIVATE_ENCRYPT, RSA_PRIVATE_DECRYPT}
|
||||||
* rng wolfSSL RNG to use if needed
|
* rng wolfSSL RNG to use if needed
|
||||||
*
|
*
|
||||||
* returns 0 on success
|
* returns size of result on success
|
||||||
*/
|
*/
|
||||||
int wc_RsaDirect(byte* in, word32 inLen, byte* out, word32* outSz,
|
int wc_RsaDirect(byte* in, word32 inLen, byte* out, word32* outSz,
|
||||||
RsaKey* key, int type, WC_RNG* rng)
|
RsaKey* key, int type, WC_RNG* rng)
|
||||||
@ -1560,7 +1560,48 @@ int wc_RsaDirect(byte* in, word32 inLen, byte* out, word32* outSz,
|
|||||||
return LENGTH_ONLY_E;
|
return LENGTH_ONLY_E;
|
||||||
}
|
}
|
||||||
|
|
||||||
return wc_RsaFunction(in, inLen, out, outSz, type, key, rng);
|
switch (key->state) {
|
||||||
|
case RSA_STATE_NONE:
|
||||||
|
case RSA_STATE_ENCRYPT_PAD:
|
||||||
|
case RSA_STATE_ENCRYPT_EXPTMOD:
|
||||||
|
case RSA_STATE_DECRYPT_EXPTMOD:
|
||||||
|
case RSA_STATE_DECRYPT_UNPAD:
|
||||||
|
key->state = (type == RSA_PRIVATE_ENCRYPT ||
|
||||||
|
type == RSA_PUBLIC_ENCRYPT) ? RSA_STATE_ENCRYPT_EXPTMOD:
|
||||||
|
RSA_STATE_DECRYPT_EXPTMOD;
|
||||||
|
|
||||||
|
key->dataLen = *outSz;
|
||||||
|
|
||||||
|
ret = wc_RsaFunction(in, inLen, out, &key->dataLen, type, key, rng);
|
||||||
|
if (ret >= 0 || ret == WC_PENDING_E) {
|
||||||
|
key->state = (type == RSA_PRIVATE_ENCRYPT ||
|
||||||
|
type == RSA_PUBLIC_ENCRYPT) ? RSA_STATE_ENCRYPT_RES:
|
||||||
|
RSA_STATE_DECRYPT_RES;
|
||||||
|
}
|
||||||
|
if (ret < 0) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
FALL_THROUGH;
|
||||||
|
|
||||||
|
case RSA_STATE_ENCRYPT_RES:
|
||||||
|
case RSA_STATE_DECRYPT_RES:
|
||||||
|
ret = key->dataLen;
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
ret = BAD_STATE_E;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* if async pending then skip cleanup*/
|
||||||
|
if (ret == WC_PENDING_E) {
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
key->state = RSA_STATE_NONE;
|
||||||
|
wc_RsaCleanup(key);
|
||||||
|
|
||||||
|
return ret;
|
||||||
}
|
}
|
||||||
#endif /* WC_RSA_NO_PADDING */
|
#endif /* WC_RSA_NO_PADDING */
|
||||||
|
|
||||||
|
@ -8585,8 +8585,16 @@ int rsa_no_pad_test(void)
|
|||||||
|
|
||||||
inLen = wc_RsaEncryptSize(&key);
|
inLen = wc_RsaEncryptSize(&key);
|
||||||
XMEMSET(tmp, 7, inLen);
|
XMEMSET(tmp, 7, inLen);
|
||||||
ret = wc_RsaDirect(tmp, inLen, out, &outSz, &key, RSA_PRIVATE_ENCRYPT, &rng);
|
do {
|
||||||
if (ret != 0) {
|
#if defined(WOLFSSL_ASYNC_CRYPT)
|
||||||
|
ret = wc_AsyncWait(ret, &key.asyncDev, WC_ASYNC_FLAG_CALL_AGAIN);
|
||||||
|
#endif
|
||||||
|
if (ret >= 0) {
|
||||||
|
ret = wc_RsaDirect(tmp, inLen, out, &outSz, &key,
|
||||||
|
RSA_PRIVATE_ENCRYPT, &rng);
|
||||||
|
}
|
||||||
|
} while (ret == WC_PENDING_E);
|
||||||
|
if (ret <= 0) {
|
||||||
ERROR_OUT(-506, exit_rsa_nopadding);
|
ERROR_OUT(-506, exit_rsa_nopadding);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -8596,9 +8604,16 @@ int rsa_no_pad_test(void)
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* decrypt with public key and compare result */
|
/* decrypt with public key and compare result */
|
||||||
ret = wc_RsaDirect(out, outSz, plain, &plainSz, &key, RSA_PUBLIC_DECRYPT,
|
do {
|
||||||
&rng);
|
#if defined(WOLFSSL_ASYNC_CRYPT)
|
||||||
if (ret != 0) {
|
ret = wc_AsyncWait(ret, &key.asyncDev, WC_ASYNC_FLAG_CALL_AGAIN);
|
||||||
|
#endif
|
||||||
|
if (ret >= 0) {
|
||||||
|
ret = wc_RsaDirect(out, outSz, plain, &plainSz, &key,
|
||||||
|
RSA_PUBLIC_DECRYPT, &rng);
|
||||||
|
}
|
||||||
|
} while (ret == WC_PENDING_E);
|
||||||
|
if (ret <= 0) {
|
||||||
ERROR_OUT(-508, exit_rsa_nopadding);
|
ERROR_OUT(-508, exit_rsa_nopadding);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -8614,15 +8629,28 @@ int rsa_no_pad_test(void)
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* test encrypt and decrypt using WC_RSA_NO_PAD */
|
/* test encrypt and decrypt using WC_RSA_NO_PAD */
|
||||||
ret = wc_RsaPublicEncrypt_ex(tmp, inLen, out, (int)outSz, &key, &rng,
|
do {
|
||||||
WC_RSA_NO_PAD, WC_HASH_TYPE_NONE, WC_MGF1NONE, NULL, 0);
|
#if defined(WOLFSSL_ASYNC_CRYPT)
|
||||||
|
ret = wc_AsyncWait(ret, &key.asyncDev, WC_ASYNC_FLAG_CALL_AGAIN);
|
||||||
|
#endif
|
||||||
|
if (ret >= 0) {
|
||||||
|
ret = wc_RsaPublicEncrypt_ex(tmp, inLen, out, (int)outSz, &key, &rng,
|
||||||
|
WC_RSA_NO_PAD, WC_HASH_TYPE_NONE, WC_MGF1NONE, NULL, 0);
|
||||||
|
}
|
||||||
|
} while (ret == WC_PENDING_E);
|
||||||
if (ret < 0) {
|
if (ret < 0) {
|
||||||
ERROR_OUT(-511, exit_rsa_nopadding);
|
ERROR_OUT(-511, exit_rsa_nopadding);
|
||||||
}
|
}
|
||||||
|
|
||||||
printf("outSz = %d plainSz = %d\n", outSz, plainSz);
|
do {
|
||||||
ret = wc_RsaPrivateDecrypt_ex(out, outSz, plain, (int)plainSz, &key,
|
#if defined(WOLFSSL_ASYNC_CRYPT)
|
||||||
WC_RSA_NO_PAD, WC_HASH_TYPE_NONE, WC_MGF1NONE, NULL, 0);
|
ret = wc_AsyncWait(ret, &key.asyncDev, WC_ASYNC_FLAG_CALL_AGAIN);
|
||||||
|
#endif
|
||||||
|
if (ret >= 0) {
|
||||||
|
ret = wc_RsaPrivateDecrypt_ex(out, outSz, plain, (int)plainSz, &key,
|
||||||
|
WC_RSA_NO_PAD, WC_HASH_TYPE_NONE, WC_MGF1NONE, NULL, 0);
|
||||||
|
}
|
||||||
|
} while (ret == WC_PENDING_E);
|
||||||
if (ret < 0) {
|
if (ret < 0) {
|
||||||
ERROR_OUT(-512, exit_rsa_nopadding);
|
ERROR_OUT(-512, exit_rsa_nopadding);
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user