Skip to content

Commit 7260cc1

Browse files
committed
smallstack refactors of wolfcrypt/src/evp.c:wolfssl_evp_digest_pk_final() and wolfcrypt/test/test.c:openssl_test().
1 parent 885497b commit 7260cc1

2 files changed

Lines changed: 103 additions & 72 deletions

File tree

wolfcrypt/src/evp.c

Lines changed: 27 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -4275,23 +4275,39 @@ static int wolfssl_evp_digest_pk_final(WOLFSSL_EVP_MD_CTX *ctx,
42754275
int ret;
42764276

42774277
if (ctx->isHMAC) {
4278-
Hmac hmacCopy;
4279-
4280-
if (wolfSSL_HmacCopy(&hmacCopy, &ctx->hash.hmac) != WOLFSSL_SUCCESS)
4278+
#ifdef WOLFSSL_SMALL_STACK
4279+
Hmac *hmacCopy = (Hmac *)XMALLOC(sizeof(Hmac), NULL, DYNAMIC_TYPE_OPENSSL);
4280+
if (hmacCopy == NULL)
42814281
return WOLFSSL_FAILURE;
4282-
ret = wc_HmacFinal(&hmacCopy, md) == 0;
4283-
wc_HmacFree(&hmacCopy);
4282+
#else
4283+
Hmac hmacCopy[1];
4284+
#endif
4285+
ret = wolfSSL_HmacCopy(hmacCopy, &ctx->hash.hmac);
4286+
if (ret == WOLFSSL_SUCCESS)
4287+
ret = wc_HmacFinal(hmacCopy, md) == 0;
4288+
wc_HmacFree(hmacCopy);
4289+
#ifdef WOLFSSL_SMALL_STACK
4290+
XFREE(hmacCopy, NULL, DYNAMIC_TYPE_OPENSSL);
4291+
#endif
42844292
return ret;
42854293
}
42864294
else {
4287-
WOLFSSL_EVP_MD_CTX ctxCopy;
4288-
wolfSSL_EVP_MD_CTX_init(&ctxCopy);
4289-
4290-
if (wolfSSL_EVP_MD_CTX_copy_ex(&ctxCopy, ctx) != WOLFSSL_SUCCESS)
4295+
#ifdef WOLFSSL_SMALL_STACK
4296+
WOLFSSL_EVP_MD_CTX *ctxCopy = (WOLFSSL_EVP_MD_CTX *)XMALLOC(sizeof(WOLFSSL_EVP_MD_CTX), NULL, DYNAMIC_TYPE_OPENSSL);
4297+
if (ctxCopy == NULL)
42914298
return WOLFSSL_FAILURE;
4299+
#else
4300+
WOLFSSL_EVP_MD_CTX ctxCopy[1];
4301+
#endif
4302+
wolfSSL_EVP_MD_CTX_init(ctxCopy);
42924303

4293-
ret = wolfSSL_EVP_DigestFinal(&ctxCopy, md, mdlen);
4294-
wolfSSL_EVP_MD_CTX_cleanup(&ctxCopy);
4304+
ret = wolfSSL_EVP_MD_CTX_copy_ex(ctxCopy, ctx);
4305+
if (ret == WOLFSSL_SUCCESS)
4306+
ret = wolfSSL_EVP_DigestFinal(ctxCopy, md, mdlen);
4307+
wolfSSL_EVP_MD_CTX_cleanup(ctxCopy);
4308+
#ifdef WOLFSSL_SMALL_STACK
4309+
XFREE(ctxCopy, NULL, DYNAMIC_TYPE_OPENSSL);
4310+
#endif
42954311
return ret;
42964312
}
42974313
}

wolfcrypt/test/test.c

Lines changed: 76 additions & 61 deletions
Original file line numberDiff line numberDiff line change
@@ -22661,9 +22661,19 @@ static wc_test_ret_t openssl_aes_test(void)
2266122661
WOLFSSL_TEST_SUBROUTINE wc_test_ret_t openssl_test(void)
2266222662
{
2266322663
wc_test_ret_t ret;
22664-
EVP_MD_CTX md_ctx;
22664+
#ifdef WOLFSSL_SMALL_STACK
22665+
EVP_MD_CTX *md_ctx = (EVP_MD_CTX *)XMALLOC(sizeof(EVP_MD_CTX), NULL, DYNAMIC_TYPE_OPENSSL);
22666+
#else
22667+
EVP_MD_CTX md_ctx[1];
22668+
#endif
2266522669
testVector a, b, c, d, e, f;
2266622670
byte hash[WC_SHA256_DIGEST_SIZE*2]; /* max size */
22671+
22672+
#ifdef WOLFSSL_SMALL_STACK
22673+
if (md_ctx == NULL)
22674+
return WC_TEST_RET_ENC_EC(MEMORY_E);
22675+
#endif
22676+
2266722677
WOLFSSL_ENTER("openssl_test");
2266822678

2266922679
a.inLen = 0;
@@ -22697,15 +22707,15 @@ WOLFSSL_TEST_SUBROUTINE wc_test_ret_t openssl_test(void)
2269722707
a.inLen = XSTRLEN(a.input);
2269822708
a.outLen = WC_MD5_DIGEST_SIZE;
2269922709

22700-
EVP_MD_CTX_init(&md_ctx);
22701-
ret = EVP_DigestInit(&md_ctx, EVP_md5());
22710+
EVP_MD_CTX_init(md_ctx);
22711+
ret = EVP_DigestInit(md_ctx, EVP_md5());
2270222712
if (ret == WOLFSSL_SUCCESS) {
22703-
ret = EVP_DigestUpdate(&md_ctx, a.input, (unsigned long)a.inLen);
22713+
ret = EVP_DigestUpdate(md_ctx, a.input, (unsigned long)a.inLen);
2270422714
}
2270522715
if (ret == WOLFSSL_SUCCESS) {
22706-
ret = EVP_DigestFinal(&md_ctx, hash, 0);
22716+
ret = EVP_DigestFinal(md_ctx, hash, 0);
2270722717
}
22708-
EVP_MD_CTX_cleanup(&md_ctx);
22718+
EVP_MD_CTX_cleanup(md_ctx);
2270922719
if (ret != WOLFSSL_SUCCESS)
2271022720
return WC_TEST_RET_ENC_NC;
2271122721
if (XMEMCMP(hash, a.output, WC_MD5_DIGEST_SIZE) != 0)
@@ -22721,14 +22731,14 @@ WOLFSSL_TEST_SUBROUTINE wc_test_ret_t openssl_test(void)
2272122731
b.inLen = XSTRLEN(b.input);
2272222732
b.outLen = WC_SHA_DIGEST_SIZE;
2272322733

22724-
EVP_MD_CTX_init(&md_ctx);
22725-
ret = EVP_DigestInit(&md_ctx, EVP_sha1());
22734+
EVP_MD_CTX_init(md_ctx);
22735+
ret = EVP_DigestInit(md_ctx, EVP_sha1());
2272622736
if (ret == WOLFSSL_SUCCESS) {
22727-
ret = EVP_DigestUpdate(&md_ctx, b.input, (unsigned long)b.inLen);
22737+
ret = EVP_DigestUpdate(md_ctx, b.input, (unsigned long)b.inLen);
2272822738
if (ret == WOLFSSL_SUCCESS)
22729-
ret = EVP_DigestFinal(&md_ctx, hash, 0);
22739+
ret = EVP_DigestFinal(md_ctx, hash, 0);
2273022740
}
22731-
EVP_MD_CTX_cleanup(&md_ctx);
22741+
EVP_MD_CTX_cleanup(md_ctx);
2273222742
if (ret != WOLFSSL_SUCCESS)
2273322743
return WC_TEST_RET_ENC_NC;
2273422744
if (XMEMCMP(hash, b.output, b.outLen) != 0)
@@ -22743,14 +22753,14 @@ WOLFSSL_TEST_SUBROUTINE wc_test_ret_t openssl_test(void)
2274322753
e.inLen = XSTRLEN(e.input);
2274422754
e.outLen = WC_SHA224_DIGEST_SIZE;
2274522755

22746-
EVP_MD_CTX_init(&md_ctx);
22747-
ret = EVP_DigestInit(&md_ctx, EVP_sha224());
22756+
EVP_MD_CTX_init(md_ctx);
22757+
ret = EVP_DigestInit(md_ctx, EVP_sha224());
2274822758
if (ret == WOLFSSL_SUCCESS) {
22749-
ret = EVP_DigestUpdate(&md_ctx, e.input, (unsigned long)e.inLen);
22759+
ret = EVP_DigestUpdate(md_ctx, e.input, (unsigned long)e.inLen);
2275022760
if (ret == WOLFSSL_SUCCESS)
22751-
ret = EVP_DigestFinal(&md_ctx, hash, 0);
22761+
ret = EVP_DigestFinal(md_ctx, hash, 0);
2275222762
}
22753-
EVP_MD_CTX_cleanup(&md_ctx);
22763+
EVP_MD_CTX_cleanup(md_ctx);
2275422764
if (ret != WOLFSSL_SUCCESS || XMEMCMP(hash, e.output, e.outLen) != 0) {
2275522765
return WC_TEST_RET_ENC_NC;
2275622766
}
@@ -22764,14 +22774,14 @@ WOLFSSL_TEST_SUBROUTINE wc_test_ret_t openssl_test(void)
2276422774
d.inLen = XSTRLEN(d.input);
2276522775
d.outLen = WC_SHA256_DIGEST_SIZE;
2276622776

22767-
EVP_MD_CTX_init(&md_ctx);
22768-
ret = EVP_DigestInit(&md_ctx, EVP_sha256());
22777+
EVP_MD_CTX_init(md_ctx);
22778+
ret = EVP_DigestInit(md_ctx, EVP_sha256());
2276922779
if (ret == WOLFSSL_SUCCESS) {
22770-
ret = EVP_DigestUpdate(&md_ctx, d.input, (unsigned long)d.inLen);
22780+
ret = EVP_DigestUpdate(md_ctx, d.input, (unsigned long)d.inLen);
2277122781
if (ret == WOLFSSL_SUCCESS)
22772-
ret = EVP_DigestFinal(&md_ctx, hash, 0);
22782+
ret = EVP_DigestFinal(md_ctx, hash, 0);
2277322783
}
22774-
EVP_MD_CTX_cleanup(&md_ctx);
22784+
EVP_MD_CTX_cleanup(md_ctx);
2277522785
if (ret != WOLFSSL_SUCCESS || XMEMCMP(hash, d.output, d.outLen) != 0) {
2277622786
return WC_TEST_RET_ENC_NC;
2277722787
}
@@ -22787,14 +22797,14 @@ WOLFSSL_TEST_SUBROUTINE wc_test_ret_t openssl_test(void)
2278722797
e.inLen = XSTRLEN(e.input);
2278822798
e.outLen = WC_SHA384_DIGEST_SIZE;
2278922799

22790-
EVP_MD_CTX_init(&md_ctx);
22791-
ret = EVP_DigestInit(&md_ctx, EVP_sha384());
22800+
EVP_MD_CTX_init(md_ctx);
22801+
ret = EVP_DigestInit(md_ctx, EVP_sha384());
2279222802
if (ret == WOLFSSL_SUCCESS) {
22793-
ret = EVP_DigestUpdate(&md_ctx, e.input, (unsigned long)e.inLen);
22803+
ret = EVP_DigestUpdate(md_ctx, e.input, (unsigned long)e.inLen);
2279422804
if (ret == WOLFSSL_SUCCESS)
22795-
ret = EVP_DigestFinal(&md_ctx, hash, 0);
22805+
ret = EVP_DigestFinal(md_ctx, hash, 0);
2279622806
}
22797-
EVP_MD_CTX_cleanup(&md_ctx);
22807+
EVP_MD_CTX_cleanup(md_ctx);
2279822808
if (ret != WOLFSSL_SUCCESS || XMEMCMP(hash, e.output, e.outLen) != 0) {
2279922809
return WC_TEST_RET_ENC_NC;
2280022810
}
@@ -22811,14 +22821,14 @@ WOLFSSL_TEST_SUBROUTINE wc_test_ret_t openssl_test(void)
2281122821
f.inLen = XSTRLEN(f.input);
2281222822
f.outLen = WC_SHA512_DIGEST_SIZE;
2281322823

22814-
EVP_MD_CTX_init(&md_ctx);
22815-
ret = EVP_DigestInit(&md_ctx, EVP_sha512());
22824+
EVP_MD_CTX_init(md_ctx);
22825+
ret = EVP_DigestInit(md_ctx, EVP_sha512());
2281622826
if (ret == WOLFSSL_SUCCESS) {
22817-
ret = EVP_DigestUpdate(&md_ctx, f.input, (unsigned long)f.inLen);
22827+
ret = EVP_DigestUpdate(md_ctx, f.input, (unsigned long)f.inLen);
2281822828
if (ret == WOLFSSL_SUCCESS)
22819-
ret = EVP_DigestFinal(&md_ctx, hash, 0);
22829+
ret = EVP_DigestFinal(md_ctx, hash, 0);
2282022830
}
22821-
EVP_MD_CTX_cleanup(&md_ctx);
22831+
EVP_MD_CTX_cleanup(md_ctx);
2282222832
if (ret != WOLFSSL_SUCCESS || XMEMCMP(hash, f.output, f.outLen) != 0) {
2282322833
return WC_TEST_RET_ENC_NC;
2282422834
}
@@ -22833,14 +22843,14 @@ WOLFSSL_TEST_SUBROUTINE wc_test_ret_t openssl_test(void)
2283322843
f.inLen = XSTRLEN(f.input);
2283422844
f.outLen = WC_SHA512_224_DIGEST_SIZE;
2283522845

22836-
EVP_MD_CTX_init(&md_ctx);
22837-
ret = EVP_DigestInit(&md_ctx, EVP_sha512_224());
22846+
EVP_MD_CTX_init(md_ctx);
22847+
ret = EVP_DigestInit(md_ctx, EVP_sha512_224());
2283822848
if (ret == WOLFSSL_SUCCESS) {
22839-
ret = EVP_DigestUpdate(&md_ctx, f.input, (unsigned long)f.inLen);
22849+
ret = EVP_DigestUpdate(md_ctx, f.input, (unsigned long)f.inLen);
2284022850
if (ret == WOLFSSL_SUCCESS)
22841-
ret = EVP_DigestFinal(&md_ctx, hash, 0);
22851+
ret = EVP_DigestFinal(md_ctx, hash, 0);
2284222852
}
22843-
EVP_MD_CTX_cleanup(&md_ctx);
22853+
EVP_MD_CTX_cleanup(md_ctx);
2284422854
if (ret != WOLFSSL_SUCCESS || XMEMCMP(hash, f.output, f.outLen) != 0) {
2284522855
return WC_TEST_RET_ENC_NC;
2284622856
}
@@ -22856,14 +22866,14 @@ WOLFSSL_TEST_SUBROUTINE wc_test_ret_t openssl_test(void)
2285622866
f.inLen = XSTRLEN(f.input);
2285722867
f.outLen = WC_SHA512_256_DIGEST_SIZE;
2285822868

22859-
EVP_MD_CTX_init(&md_ctx);
22860-
ret = EVP_DigestInit(&md_ctx, EVP_sha512_256());
22869+
EVP_MD_CTX_init(md_ctx);
22870+
ret = EVP_DigestInit(md_ctx, EVP_sha512_256());
2286122871
if (ret == WOLFSSL_SUCCESS) {
22862-
ret = EVP_DigestUpdate(&md_ctx, f.input, (unsigned long)f.inLen);
22872+
ret = EVP_DigestUpdate(md_ctx, f.input, (unsigned long)f.inLen);
2286322873
if (ret == WOLFSSL_SUCCESS)
22864-
ret = EVP_DigestFinal(&md_ctx, hash, 0);
22874+
ret = EVP_DigestFinal(md_ctx, hash, 0);
2286522875
}
22866-
EVP_MD_CTX_cleanup(&md_ctx);
22876+
EVP_MD_CTX_cleanup(md_ctx);
2286722877
if (ret != WOLFSSL_SUCCESS || XMEMCMP(hash, f.output, f.outLen) != 0) {
2286822878
return WC_TEST_RET_ENC_NC;
2286922879
}
@@ -22879,14 +22889,14 @@ WOLFSSL_TEST_SUBROUTINE wc_test_ret_t openssl_test(void)
2287922889
e.inLen = XSTRLEN(e.input);
2288022890
e.outLen = WC_SHA3_224_DIGEST_SIZE;
2288122891

22882-
EVP_MD_CTX_init(&md_ctx);
22883-
ret = EVP_DigestInit(&md_ctx, EVP_sha3_224());
22892+
EVP_MD_CTX_init(md_ctx);
22893+
ret = EVP_DigestInit(md_ctx, EVP_sha3_224());
2288422894
if (ret == WOLFSSL_SUCCESS) {
22885-
ret = EVP_DigestUpdate(&md_ctx, e.input, (unsigned long)e.inLen);
22895+
ret = EVP_DigestUpdate(md_ctx, e.input, (unsigned long)e.inLen);
2288622896
if (ret == WOLFSSL_SUCCESS)
22887-
ret = EVP_DigestFinal(&md_ctx, hash, 0);
22897+
ret = EVP_DigestFinal(md_ctx, hash, 0);
2288822898
}
22889-
EVP_MD_CTX_cleanup(&md_ctx);
22899+
EVP_MD_CTX_cleanup(md_ctx);
2289022900
if (ret != WOLFSSL_SUCCESS || XMEMCMP(hash, e.output, e.outLen) != 0) {
2289122901
return WC_TEST_RET_ENC_NC;
2289222902
}
@@ -22901,14 +22911,14 @@ WOLFSSL_TEST_SUBROUTINE wc_test_ret_t openssl_test(void)
2290122911
d.inLen = XSTRLEN(d.input);
2290222912
d.outLen = WC_SHA3_256_DIGEST_SIZE;
2290322913

22904-
EVP_MD_CTX_init(&md_ctx);
22905-
ret = EVP_DigestInit(&md_ctx, EVP_sha3_256());
22914+
EVP_MD_CTX_init(md_ctx);
22915+
ret = EVP_DigestInit(md_ctx, EVP_sha3_256());
2290622916
if (ret == WOLFSSL_SUCCESS) {
22907-
ret = EVP_DigestUpdate(&md_ctx, d.input, (unsigned long)d.inLen);
22917+
ret = EVP_DigestUpdate(md_ctx, d.input, (unsigned long)d.inLen);
2290822918
if (ret == WOLFSSL_SUCCESS)
22909-
ret = EVP_DigestFinal(&md_ctx, hash, 0);
22919+
ret = EVP_DigestFinal(md_ctx, hash, 0);
2291022920
}
22911-
EVP_MD_CTX_cleanup(&md_ctx);
22921+
EVP_MD_CTX_cleanup(md_ctx);
2291222922
if (ret != WOLFSSL_SUCCESS || XMEMCMP(hash, d.output, d.outLen) != 0) {
2291322923
return WC_TEST_RET_ENC_NC;
2291422924
}
@@ -22923,14 +22933,14 @@ WOLFSSL_TEST_SUBROUTINE wc_test_ret_t openssl_test(void)
2292322933
e.inLen = XSTRLEN(e.input);
2292422934
e.outLen = WC_SHA3_384_DIGEST_SIZE;
2292522935

22926-
EVP_MD_CTX_init(&md_ctx);
22927-
ret = EVP_DigestInit(&md_ctx, EVP_sha3_384());
22936+
EVP_MD_CTX_init(md_ctx);
22937+
ret = EVP_DigestInit(md_ctx, EVP_sha3_384());
2292822938
if (ret == WOLFSSL_SUCCESS) {
22929-
ret = EVP_DigestUpdate(&md_ctx, e.input, (unsigned long)e.inLen);
22939+
ret = EVP_DigestUpdate(md_ctx, e.input, (unsigned long)e.inLen);
2293022940
if (ret == WOLFSSL_SUCCESS)
22931-
ret = EVP_DigestFinal(&md_ctx, hash, 0);
22941+
ret = EVP_DigestFinal(md_ctx, hash, 0);
2293222942
}
22933-
EVP_MD_CTX_cleanup(&md_ctx);
22943+
EVP_MD_CTX_cleanup(md_ctx);
2293422944
if (ret != WOLFSSL_SUCCESS || XMEMCMP(hash, e.output, e.outLen) != 0) {
2293522945
return WC_TEST_RET_ENC_NC;
2293622946
}
@@ -22946,21 +22956,26 @@ WOLFSSL_TEST_SUBROUTINE wc_test_ret_t openssl_test(void)
2294622956
f.inLen = XSTRLEN(f.input);
2294722957
f.outLen = WC_SHA3_512_DIGEST_SIZE;
2294822958

22949-
EVP_MD_CTX_init(&md_ctx);
22950-
ret = EVP_DigestInit(&md_ctx, EVP_sha3_512());
22959+
EVP_MD_CTX_init(md_ctx);
22960+
ret = EVP_DigestInit(md_ctx, EVP_sha3_512());
2295122961
if (ret == WOLFSSL_SUCCESS) {
22952-
ret = EVP_DigestUpdate(&md_ctx, f.input, (unsigned long)f.inLen);
22962+
ret = EVP_DigestUpdate(md_ctx, f.input, (unsigned long)f.inLen);
2295322963
if (ret == WOLFSSL_SUCCESS)
22954-
ret = EVP_DigestFinal(&md_ctx, hash, 0);
22964+
ret = EVP_DigestFinal(md_ctx, hash, 0);
2295522965
}
22956-
EVP_MD_CTX_cleanup(&md_ctx);
22966+
EVP_MD_CTX_cleanup(md_ctx);
2295722967
if (ret != WOLFSSL_SUCCESS ||
2295822968
XMEMCMP(hash, f.output, f.outLen) != 0) {
2295922969
return WC_TEST_RET_ENC_NC;
2296022970
}
2296122971
#endif /* WOLFSSL_NOSHA3_512 */
2296222972
#endif /* WOLFSSL_SHA3 */
2296322973

22974+
#ifdef WOLFSSL_SMALL_STACK
22975+
XFREE(md_ctx, NULL, DYNAMIC_TYPE_OPENSSL);
22976+
md_ctx = NULL;
22977+
#endif
22978+
2296422979
#ifndef WC_NO_RNG
2296522980
if (RAND_bytes(hash, sizeof(hash)) != WOLFSSL_SUCCESS)
2296622981
return WC_TEST_RET_ENC_NC;

0 commit comments

Comments
 (0)