test.c: now that sp math is fixed and working in linuxkm, reenable prime_test() for WOLFSSL_LINUXKM, and add a small stack refactor for it.

This commit is contained in:
Daniel Pouzzner
2020-09-04 23:19:07 -05:00
parent fdbd6addd0
commit 5f972d2ae6

View File

@ -1149,7 +1149,7 @@ initDefaultName();
test_pass("mp test passed!\n"); test_pass("mp test passed!\n");
#endif #endif
#if defined(WOLFSSL_PUBLIC_MP) && defined(WOLFSSL_KEY_GEN) && !defined(WOLFSSL_LINUXKM) #if defined(WOLFSSL_PUBLIC_MP) && defined(WOLFSSL_KEY_GEN)
if ( (ret = prime_test()) != 0) if ( (ret = prime_test()) != 0)
return err_sys("prime test failed!\n", ret); return err_sys("prime test failed!\n", ret);
else else
@ -29117,88 +29117,130 @@ static int GenerateP(mp_int* p1, mp_int* p2, mp_int* p3,
static int prime_test(void) static int prime_test(void)
{ {
mp_int n, p1, p2, p3; #ifdef WOLFSSL_SMALL_STACK
mp_int *n = (mp_int *)XMALLOC(sizeof *n, HEAP_HINT, DYNAMIC_TYPE_TMP_BUFFER),
*p1 = (mp_int *)XMALLOC(sizeof *p1, HEAP_HINT, DYNAMIC_TYPE_TMP_BUFFER),
*p2 = (mp_int *)XMALLOC(sizeof *p2, HEAP_HINT, DYNAMIC_TYPE_TMP_BUFFER),
*p3 = (mp_int *)XMALLOC(sizeof *p3, HEAP_HINT, DYNAMIC_TYPE_TMP_BUFFER);
#else
mp_int n_buf, *n = &n_buf,
p1_buf, *p1 = &p1_buf,
p2_buf, *p2 = &p2_buf,
p3_buf, *p3 = &p3_buf;
#endif
int ret, isPrime = 0; int ret, isPrime = 0;
WC_RNG rng; WC_RNG rng;
#ifdef WOLFSSL_SMALL_STACK
if ((n == NULL) ||
(p1 == NULL) ||
(p2 == NULL) ||
(p3 == NULL))
ERROR_OUT(MEMORY_E, out);
#endif
ret = wc_InitRng(&rng); ret = wc_InitRng(&rng);
if (ret == 0) if (ret == 0)
ret = mp_init_multi(&n, &p1, &p2, &p3, NULL, NULL); ret = mp_init_multi(n, p1, p2, p3, NULL, NULL);
if (ret == 0) if (ret == 0)
ret = GenerateP(&p1, &p2, &p3, ret = GenerateP(p1, p2, p3,
ecPairsA, sizeof(ecPairsA) / sizeof(ecPairsA[0]), kA); ecPairsA, sizeof(ecPairsA) / sizeof(ecPairsA[0]), kA);
if (ret == 0) if (ret == 0)
ret = mp_mul(&p1, &p2, &n); ret = mp_mul(p1, p2, n);
if (ret == 0) if (ret == 0)
ret = mp_mul(&n, &p3, &n); ret = mp_mul(n, p3, n);
if (ret != 0) if (ret != 0)
return -12400; ERROR_OUT(-12400, out);
/* Check the old prime test using the number that false positives. /* Check the old prime test using the number that false positives.
* This test result should indicate as not prime. */ * This test result should indicate as not prime. */
ret = mp_prime_is_prime(&n, 40, &isPrime); ret = mp_prime_is_prime(n, 40, &isPrime);
if (ret != 0) if (ret != 0)
return -12401; ERROR_OUT(-12401, out);
if (isPrime) if (isPrime)
return -12402; ERROR_OUT(-12402, out);
/* This test result should fail. It should indicate the value as prime. */ /* This test result should fail. It should indicate the value as prime. */
ret = mp_prime_is_prime(&n, 8, &isPrime); ret = mp_prime_is_prime(n, 8, &isPrime);
if (ret != 0) if (ret != 0)
return -12403; ERROR_OUT(-12403, out);
if (!isPrime) if (!isPrime)
return -12404; ERROR_OUT(-12404, out);
/* This test result should indicate the value as not prime. */ /* This test result should indicate the value as not prime. */
ret = mp_prime_is_prime_ex(&n, 8, &isPrime, &rng); ret = mp_prime_is_prime_ex(n, 8, &isPrime, &rng);
if (ret != 0) if (ret != 0)
return -12405; ERROR_OUT(-12405, out);
if (isPrime) if (isPrime)
return -12406; ERROR_OUT(-12406, out);
ret = mp_read_unsigned_bin(&n, controlPrime, sizeof(controlPrime)); ret = mp_read_unsigned_bin(n, controlPrime, sizeof(controlPrime));
if (ret != 0) if (ret != 0)
return -12407; ERROR_OUT(-12407, out);
/* This test result should indicate the value as prime. */ /* This test result should indicate the value as prime. */
ret = mp_prime_is_prime_ex(&n, 8, &isPrime, &rng); ret = mp_prime_is_prime_ex(n, 8, &isPrime, &rng);
if (ret != 0) if (ret != 0)
return -12408; ERROR_OUT(-12408, out);
if (!isPrime) if (!isPrime)
return -12409; ERROR_OUT(-12409, out);
/* This test result should indicate the value as prime. */ /* This test result should indicate the value as prime. */
isPrime = -1; isPrime = -1;
ret = mp_prime_is_prime(&n, 8, &isPrime); ret = mp_prime_is_prime(n, 8, &isPrime);
if (ret != 0) if (ret != 0)
return -12410; ERROR_OUT(-12410, out);
if (!isPrime) if (!isPrime)
return -12411; ERROR_OUT(-12411, out);
ret = mp_read_unsigned_bin(&n, testOne, sizeof(testOne)); ret = mp_read_unsigned_bin(n, testOne, sizeof(testOne));
if (ret != 0) if (ret != 0)
return -12412; ERROR_OUT(-12412, out);
/* This test result should indicate the value as not prime. */ /* This test result should indicate the value as not prime. */
ret = mp_prime_is_prime_ex(&n, 8, &isPrime, &rng); ret = mp_prime_is_prime_ex(n, 8, &isPrime, &rng);
if (ret != 0) if (ret != 0)
return -12413; ERROR_OUT(-12413, out);
if (isPrime) if (isPrime)
return -12414; ERROR_OUT(-12414, out);
ret = mp_prime_is_prime(&n, 8, &isPrime); ret = mp_prime_is_prime(n, 8, &isPrime);
if (ret != 0) if (ret != 0)
return -12415; ERROR_OUT(-12415, out);
if (isPrime) if (isPrime)
return -12416; ERROR_OUT(-12416, out);
ret = 0;
out:
#ifdef WOLFSSL_SMALL_STACK
if (n != NULL) {
mp_clear(n);
XFREE(n, HEAP_HINT, DYNAMIC_TYPE_TMP_BUFFER);
}
if (p1 != NULL) {
mp_clear(p1);
XFREE(p1, HEAP_HINT, DYNAMIC_TYPE_TMP_BUFFER);
}
if (p2 != NULL) {
mp_clear(p2);
XFREE(p2, HEAP_HINT, DYNAMIC_TYPE_TMP_BUFFER);
}
if (p3 != NULL) {
mp_clear(p3);
XFREE(p3, HEAP_HINT, DYNAMIC_TYPE_TMP_BUFFER);
}
#else
mp_clear(p3);
mp_clear(p2);
mp_clear(p1);
mp_clear(n);
#endif
mp_clear(&p3);
mp_clear(&p2);
mp_clear(&p1);
mp_clear(&n);
wc_FreeRng(&rng); wc_FreeRng(&rng);
return 0; return ret;
} }
#endif /* WOLFSSL_PUBLIC_MP */ #endif /* WOLFSSL_PUBLIC_MP */