Added support for QAT RSA Key Generation.

This commit is contained in:
David Garske
2018-12-10 16:51:54 -08:00
parent b60918b8cd
commit c23489e6ed
4 changed files with 30 additions and 41 deletions

View File

@ -1681,7 +1681,7 @@ if test "$ENABLED_STACKSIZE" = "yes"
then then
AC_CHECK_FUNC([posix_memalign], [], [AC_MSG_ERROR(stacksize needs posix_memalign)]) AC_CHECK_FUNC([posix_memalign], [], [AC_MSG_ERROR(stacksize needs posix_memalign)])
AC_CHECK_FUNC([pthread_attr_setstack], [], AC_CHECK_LIB([pthread],[pthread_attr_setstack])) AC_CHECK_FUNC([pthread_attr_setstack], [], AC_CHECK_LIB([pthread],[pthread_attr_setstack]))
AM_CFLAGS="$AM_CFLAGS -DHAVE_STACK_SIZE -DWOLFSSL_LOW_MEMORY" AM_CFLAGS="$AM_CFLAGS -DHAVE_STACK_SIZE"
fi fi

View File

@ -1452,16 +1452,13 @@ static void* benchmarks_do(void* args)
bench_rsaKeyGen(0); bench_rsaKeyGen(0);
} }
#endif #endif
#if defined(WOLFSSL_ASYNC_CRYPT) && defined(WC_ASYNC_ENABLE_RSA) #if defined(WOLFSSL_ASYNC_CRYPT) && defined(WC_ASYNC_ENABLE_RSA_KEYGEN)
/* async supported in simulator only */
#ifdef WOLFSSL_ASYNC_CRYPT_TEST
if (bench_asym_algs & BENCH_RSA_SZ) { if (bench_asym_algs & BENCH_RSA_SZ) {
bench_rsaKeyGen_size(1, bench_size); bench_rsaKeyGen_size(1, bench_size);
} }
else { else {
bench_rsaKeyGen(1); bench_rsaKeyGen(1);
} }
#endif
#endif #endif
} }
#endif #endif

View File

@ -3057,7 +3057,7 @@ static int _CheckProbablePrime(mp_int* p, mp_int* q, mp_int* e, int nlen,
if (ret != MP_EQ) goto exit; /* e divides p-1 */ if (ret != MP_EQ) goto exit; /* e divides p-1 */
/* 4.5.1,5.6.1 - Check primality of p with 8 rounds of M-R. /* 4.5.1,5.6.1 - Check primality of p with 8 rounds of M-R.
* mp_prime_is_prime_ex() performs test divisons against the first 256 * mp_prime_is_prime_ex() performs test divisions against the first 256
* prime numbers. After that it performs 8 rounds of M-R using random * prime numbers. After that it performs 8 rounds of M-R using random
* bases between 2 and n-2. * bases between 2 and n-2.
* mp_prime_is_prime() performs the same test divisions and then does * mp_prime_is_prime() performs the same test divisions and then does
@ -3162,12 +3162,13 @@ int wc_MakeRsaKey(RsaKey* key, int size, long e, WC_RNG* rng)
} }
#endif #endif
#if defined(WOLFSSL_ASYNC_CRYPT) && defined(WC_ASYNC_ENABLE_RSA) #if defined(WOLFSSL_ASYNC_CRYPT) && defined(WC_ASYNC_ENABLE_RSA) && \
defined(WC_ASYNC_ENABLE_RSA_KEYGEN)
if (key->asyncDev.marker == WOLFSSL_ASYNC_MARKER_RSA) { if (key->asyncDev.marker == WOLFSSL_ASYNC_MARKER_RSA) {
#ifdef HAVE_CAVIUM #ifdef HAVE_CAVIUM
/* TODO: Not implemented */ /* TODO: Not implemented */
#elif defined(HAVE_INTEL_QA) #elif defined(HAVE_INTEL_QA)
/* TODO: Not implemented */ return IntelQaRsaKeyGen(&key->asyncDev, key, size, e, rng);
#else #else
if (wc_AsyncTestInit(&key->asyncDev, ASYNC_TEST_RSA_MAKE)) { if (wc_AsyncTestInit(&key->asyncDev, ASYNC_TEST_RSA_MAKE)) {
WC_ASYNC_TEST* testDev = &key->asyncDev.test; WC_ASYNC_TEST* testDev = &key->asyncDev.test;
@ -3210,7 +3211,6 @@ int wc_MakeRsaKey(RsaKey* key, int size, long e, WC_RNG* rng)
#endif #endif
/* generate value */ /* generate value */
err = wc_RNG_GenerateBlock(rng, buf, primeSz); err = wc_RNG_GenerateBlock(rng, buf, primeSz);
if (err == 0) { if (err == 0) {
/* prime lower bound has the MSB set, set it in candidate */ /* prime lower bound has the MSB set, set it in candidate */
buf[0] |= 0x80; buf[0] |= 0x80;
@ -3246,7 +3246,6 @@ int wc_MakeRsaKey(RsaKey* key, int size, long e, WC_RNG* rng)
#endif #endif
/* generate value */ /* generate value */
err = wc_RNG_GenerateBlock(rng, buf, primeSz); err = wc_RNG_GenerateBlock(rng, buf, primeSz);
if (err == 0) { if (err == 0) {
/* prime lower bound has the MSB set, set it in candidate */ /* prime lower bound has the MSB set, set it in candidate */
buf[0] |= 0x80; buf[0] |= 0x80;
@ -3276,50 +3275,40 @@ int wc_MakeRsaKey(RsaKey* key, int size, long e, WC_RNG* rng)
XFREE(buf, key->heap, DYNAMIC_TYPE_RSA); XFREE(buf, key->heap, DYNAMIC_TYPE_RSA);
} }
/* Setup RsaKey buffers */
if (err == MP_OKAY) if (err == MP_OKAY)
err = mp_init_multi(&key->n, &key->e, &key->d, &key->p, &key->q, NULL); err = mp_init_multi(&key->n, &key->e, &key->d, &key->p, &key->q, NULL);
if (err == MP_OKAY) if (err == MP_OKAY)
err = mp_init_multi(&key->dP, &key->dQ, &key->u, NULL, NULL, NULL); err = mp_init_multi(&key->dP, &key->dQ, &key->u, NULL, NULL, NULL);
if (err == MP_OKAY) /* Software Key Calculation */
err = mp_sub_d(&p, 1, &tmp1); /* tmp1 = p-1 */ if (err == MP_OKAY) /* tmp1 = p-1 */
err = mp_sub_d(&p, 1, &tmp1);
if (err == MP_OKAY) if (err == MP_OKAY) /* tmp2 = q-1 */
err = mp_sub_d(&q, 1, &tmp2); /* tmp2 = q-1 */ err = mp_sub_d(&q, 1, &tmp2);
if (err == MP_OKAY) /* tmp3 = lcm(p-1, q-1), last loop */
if (err == MP_OKAY) err = mp_lcm(&tmp1, &tmp2, &tmp3);
err = mp_lcm(&tmp1, &tmp2, &tmp3); /* tmp3 = lcm(p-1, q-1),last loop */
/* make key */ /* make key */
if (err == MP_OKAY) if (err == MP_OKAY) /* key->e = e */
err = mp_set_int(&key->e, (mp_digit)e); /* key->e = e */ err = mp_set_int(&key->e, (mp_digit)e);
if (err == MP_OKAY) /* key->d = 1/e mod lcm(p-1, q-1) */ if (err == MP_OKAY) /* key->d = 1/e mod lcm(p-1, q-1) */
err = mp_invmod(&key->e, &tmp3, &key->d); err = mp_invmod(&key->e, &tmp3, &key->d);
if (err == MP_OKAY) /* key->n = pq */
if (err == MP_OKAY) err = mp_mul(&p, &q, &key->n);
err = mp_mul(&p, &q, &key->n); /* key->n = pq */ if (err == MP_OKAY) /* key->dP = d mod(p-1) */
err = mp_mod(&key->d, &tmp1, &key->dP);
if (err == MP_OKAY) if (err == MP_OKAY) /* key->dQ = d mod(q-1) */
err = mp_mod(&key->d, &tmp1, &key->dP); /* key->dP = d mod(p-1) */ err = mp_mod(&key->d, &tmp2, &key->dQ);
if (err == MP_OKAY) /* key->u = 1/q mod p */
if (err == MP_OKAY) err = mp_invmod(&q, &p, &key->u);
err = mp_mod(&key->d, &tmp2, &key->dQ); /* key->dQ = d mod(q-1) */
if (err == MP_OKAY)
err = mp_invmod(&q, &p, &key->u); /* key->u = 1/q mod p */
if (err == MP_OKAY) if (err == MP_OKAY)
err = mp_copy(&p, &key->p); err = mp_copy(&p, &key->p);
if (err == MP_OKAY) if (err == MP_OKAY)
err = mp_copy(&q, &key->q); err = mp_copy(&q, &key->q);
if (err == MP_OKAY)
key->type = RSA_PRIVATE;
#ifdef HAVE_WOLF_BIGINT #ifdef HAVE_WOLF_BIGINT
/* make sure raw unsigned bin version is available */
if (err == MP_OKAY) if (err == MP_OKAY)
err = wc_mp_to_bigint(&key->n, &key->n.raw); err = wc_mp_to_bigint(&key->n, &key->n.raw);
if (err == MP_OKAY) if (err == MP_OKAY)
@ -3338,6 +3327,9 @@ int wc_MakeRsaKey(RsaKey* key, int size, long e, WC_RNG* rng)
err = wc_mp_to_bigint(&key->u, &key->u.raw); err = wc_mp_to_bigint(&key->u, &key->u.raw);
#endif #endif
if (err == MP_OKAY)
key->type = RSA_PRIVATE;
mp_clear(&tmp1); mp_clear(&tmp1);
mp_clear(&tmp2); mp_clear(&tmp2);
mp_clear(&tmp3); mp_clear(&tmp3);

View File

@ -10713,7 +10713,7 @@ static int rsa_keygen_test(WC_RNG* rng)
keySz = 2048; keySz = 2048;
#endif /* HAVE_FIPS */ #endif /* HAVE_FIPS */
ret = wc_InitRsaKey(&genKey, HEAP_HINT); ret = wc_InitRsaKey_ex(&genKey, HEAP_HINT, devId);
if (ret != 0) { if (ret != 0) {
ERROR_OUT(-6962, exit_rsa); ERROR_OUT(-6962, exit_rsa);
} }