From 8a0bbb0fafe325a978c3afbbe4ed394f64624d8e Mon Sep 17 00:00:00 2001 From: David Garske Date: Thu, 18 Jan 2018 15:35:21 -0800 Subject: [PATCH] Fixes for wolfCrypt test RSA PSS with async enabled. --- wolfcrypt/test/test.c | 136 +++++++++++++++++++++++++++++++++++------- 1 file changed, 114 insertions(+), 22 deletions(-) diff --git a/wolfcrypt/test/test.c b/wolfcrypt/test/test.c index 526036ce7..9022e359a 100644 --- a/wolfcrypt/test/test.c +++ b/wolfcrypt/test/test.c @@ -8015,16 +8015,33 @@ static int rsa_pss_test(WC_RNG* rng, RsaKey* key) for (i = 0; i < (int)(sizeof(mgf)/sizeof(*mgf)); i++) { outSz = RSA_TEST_BYTES; - ret = wc_RsaPSS_Sign_ex(digest, digestSz, out, outSz, hash[j], - mgf[i], -1, key, rng); + do { + #if defined(WOLFSSL_ASYNC_CRYPT) + ret = wc_AsyncWait(ret, &key->asyncDev, + WC_ASYNC_FLAG_CALL_AGAIN); + #endif + if (ret >= 0) { + ret = wc_RsaPSS_Sign_ex(digest, digestSz, out, outSz, + hash[j], mgf[i], -1, key, rng); + } + } while (ret == WC_PENDING_E); if (ret <= 0) ERROR_OUT(-5451, exit_rsa_pss); outSz = ret; XMEMCPY(sig, out, outSz); plain = NULL; - ret = wc_RsaPSS_VerifyInline_ex(sig, outSz, &plain, hash[j], - mgf[i], -1, key); + + do { + #if defined(WOLFSSL_ASYNC_CRYPT) + ret = wc_AsyncWait(ret, &key->asyncDev, + WC_ASYNC_FLAG_CALL_AGAIN); + #endif + if (ret >= 0) { + ret = wc_RsaPSS_VerifyInline_ex(sig, outSz, &plain, hash[j], + mgf[i], -1, key); + } + } while (ret == WC_PENDING_E); if (ret <= 0) ERROR_OUT(-5452, exit_rsa_pss); plainSz = ret; @@ -8041,8 +8058,17 @@ static int rsa_pss_test(WC_RNG* rng, RsaKey* key) continue; XMEMCPY(sig, out, outSz); - ret = wc_RsaPSS_VerifyInline_ex(sig, outSz, (byte**)&plain, - hash[l], mgf[k], -1, key); + + do { + #if defined(WOLFSSL_ASYNC_CRYPT) + ret = wc_AsyncWait(ret, &key->asyncDev, + WC_ASYNC_FLAG_CALL_AGAIN); + #endif + if (ret >= 0) { + ret = wc_RsaPSS_VerifyInline_ex(sig, outSz, + (byte**)&plain, hash[l], mgf[k], -1, key); + } + } while (ret == WC_PENDING_E); if (ret >= 0) ERROR_OUT(-5454, exit_rsa_pss); } @@ -8054,27 +8080,59 @@ static int rsa_pss_test(WC_RNG* rng, RsaKey* key) /* Test that a salt length of zero works. */ digestSz = wc_HashGetDigestSize(hash[0]); outSz = RSA_TEST_BYTES; - ret = wc_RsaPSS_Sign_ex(digest, digestSz, out, outSz, hash[0], mgf[0], 0, - key, rng); + do { + #if defined(WOLFSSL_ASYNC_CRYPT) + ret = wc_AsyncWait(ret, &key->asyncDev, + WC_ASYNC_FLAG_CALL_AGAIN); + #endif + if (ret >= 0) { + ret = wc_RsaPSS_Sign_ex(digest, digestSz, out, outSz, hash[0], + mgf[0], 0, key, rng); + } + } while (ret == WC_PENDING_E); if (ret <= 0) ERROR_OUT(-5460, exit_rsa_pss); outSz = ret; - ret = wc_RsaPSS_Verify_ex(out, outSz, sig, outSz, hash[0], mgf[0], 0, - key); + do { + #if defined(WOLFSSL_ASYNC_CRYPT) + ret = wc_AsyncWait(ret, &key->asyncDev, + WC_ASYNC_FLAG_CALL_AGAIN); + #endif + if (ret >= 0) { + ret = wc_RsaPSS_Verify_ex(out, outSz, sig, outSz, hash[0], mgf[0], + 0, key); + } + } while (ret == WC_PENDING_E); if (ret <= 0) ERROR_OUT(-5461, exit_rsa_pss); plainSz = ret; - ret = wc_RsaPSS_CheckPadding_ex(digest, digestSz, sig, plainSz, hash[0], - 0); + do { + #if defined(WOLFSSL_ASYNC_CRYPT) + ret = wc_AsyncWait(ret, &key->asyncDev, + WC_ASYNC_FLAG_CALL_AGAIN); + #endif + if (ret >= 0) { + ret = wc_RsaPSS_CheckPadding_ex(digest, digestSz, sig, plainSz, + hash[0], 0); + } + } while (ret == WC_PENDING_E); if (ret != 0) ERROR_OUT(-5462, exit_rsa_pss); XMEMCPY(sig, out, outSz); plain = NULL; - ret = wc_RsaPSS_VerifyInline_ex(sig, outSz, &plain, hash[0], mgf[0], 0, - key); + do { + #if defined(WOLFSSL_ASYNC_CRYPT) + ret = wc_AsyncWait(ret, &key->asyncDev, + WC_ASYNC_FLAG_CALL_AGAIN); + #endif + if (ret >= 0) { + ret = wc_RsaPSS_VerifyInline_ex(sig, outSz, &plain, hash[0], mgf[0], + 0, key); + } + } while (ret == WC_PENDING_E); if (ret <= 0) ERROR_OUT(-5463, exit_rsa_pss); plainSz = ret; @@ -8087,21 +8145,55 @@ static int rsa_pss_test(WC_RNG* rng, RsaKey* key) /* Test bad salt lengths in various APIs. */ digestSz = wc_HashGetDigestSize(hash[0]); outSz = RSA_TEST_BYTES; - ret = wc_RsaPSS_Sign_ex(digest, digestSz, out, outSz, hash[0], mgf[0], -2, - key, rng); + do { + #if defined(WOLFSSL_ASYNC_CRYPT) + ret = wc_AsyncWait(ret, &key->asyncDev, + WC_ASYNC_FLAG_CALL_AGAIN); + #endif + if (ret >= 0) { + ret = wc_RsaPSS_Sign_ex(digest, digestSz, out, outSz, hash[0], + mgf[0], -2, key, rng); + } + } while (ret == WC_PENDING_E); if (ret != PSS_SALTLEN_E) ERROR_OUT(-5470, exit_rsa_pss); - ret = wc_RsaPSS_Sign_ex(digest, digestSz, out, outSz, hash[0], mgf[0], - digestSz + 1, key, rng); + + do { + #if defined(WOLFSSL_ASYNC_CRYPT) + ret = wc_AsyncWait(ret, &key->asyncDev, + WC_ASYNC_FLAG_CALL_AGAIN); + #endif + if (ret >= 0) { + ret = wc_RsaPSS_Sign_ex(digest, digestSz, out, outSz, hash[0], + mgf[0], digestSz + 1, key, rng); + } + } while (ret == WC_PENDING_E); if (ret != PSS_SALTLEN_E) ERROR_OUT(-5471, exit_rsa_pss); - ret = wc_RsaPSS_VerifyInline_ex(sig, outSz, &plain, hash[0], mgf[0], -2, - key); + do { + #if defined(WOLFSSL_ASYNC_CRYPT) + ret = wc_AsyncWait(ret, &key->asyncDev, + WC_ASYNC_FLAG_CALL_AGAIN); + #endif + if (ret >= 0) { + ret = wc_RsaPSS_VerifyInline_ex(sig, outSz, &plain, hash[0], + mgf[0], -2, key); + } + } while (ret == WC_PENDING_E); if (ret != PSS_SALTLEN_E) ERROR_OUT(-5472, exit_rsa_pss); - ret = wc_RsaPSS_VerifyInline_ex(sig, outSz, &plain, hash[0], mgf[0], - digestSz + 1, key); + + do { + #if defined(WOLFSSL_ASYNC_CRYPT) + ret = wc_AsyncWait(ret, &key->asyncDev, + WC_ASYNC_FLAG_CALL_AGAIN); + #endif + if (ret >= 0) { + ret = wc_RsaPSS_VerifyInline_ex(sig, outSz, &plain, hash[0], mgf[0], + digestSz + 1, key); + } + } while (ret == WC_PENDING_E); if (ret != PSS_SALTLEN_E) ERROR_OUT(-5473, exit_rsa_pss);