Merge remote-tracking branch 'upstream/master' into tk11899

# Conflicts:
#	src/ssl.c
This commit is contained in:
TakayukiMatsuo
2021-04-08 23:59:51 +09:00
14 changed files with 442 additions and 248 deletions

View File

@@ -666,7 +666,7 @@ TEST_CASE("wolfssl sha crypt-test", "[wolfssl]")
ESP_LOGI(TAG, "sha256_test()");
TEST_ASSERT_EQUAL(0, sha256_test());
#endif
#ifdef WOLSSL_SHA384
#ifdef WOLFSSL_SHA384
ESP_LOGI(TAG, "sha384_test()");
TEST_ASSERT_EQUAL(0, sha384_test());
#endif

View File

@@ -3888,8 +3888,10 @@ error:
if (sk)
wolfSSL_sk_X509_free(sk);
for (i = 0; i < numCerts && certBuffers[i] != NULL; ++i) {
FreeDer(&certBuffers[i]);
if (certBuffers != NULL) {
for (i = 0; i < numCerts && certBuffers[i] != NULL; ++i) {
FreeDer(&certBuffers[i]);
}
}
if (certBuffers)
@@ -26570,8 +26572,8 @@ WOLFSSL_API int wolfSSL_X509_load_crl_file(WOLFSSL_X509_LOOKUP *ctx,
int ret = WOLFSSL_FAILURE;
int count = 0;
WOLFSSL_BIO *bio = NULL;
WOLFSSL_X509_CRL *crl =NULL;
WOLFSSL_X509_CRL *crl = NULL;
WOLFSSL_ENTER("wolfSSL_X509_load_crl_file");
if (ctx == NULL || file == NULL)
@@ -26584,7 +26586,12 @@ WOLFSSL_API int wolfSSL_X509_load_crl_file(WOLFSSL_X509_LOOKUP *ctx,
wolfSSL_BIO_free(bio);
return ret;
}
if (wolfSSL_BIO_read_filename(bio, file) <= 0) {
wolfSSL_BIO_free(bio);
return ret;
}
if (type == WOLFSSL_FILETYPE_PEM) {
do {
crl = wolfSSL_PEM_read_bio_X509_CRL(bio, NULL, NULL, NULL);
@@ -26594,7 +26601,7 @@ WOLFSSL_API int wolfSSL_X509_load_crl_file(WOLFSSL_X509_LOOKUP *ctx,
}
break;
}
ret = wolfSSL_X509_STORE_add_crl(ctx->store, crl);
if (ret == WOLFSSL_FAILURE) {
WOLFSSL_MSG("Adding crl failed");
@@ -26604,7 +26611,7 @@ WOLFSSL_API int wolfSSL_X509_load_crl_file(WOLFSSL_X509_LOOKUP *ctx,
wolfSSL_X509_CRL_free(crl);
crl = NULL;
} while(crl == NULL);
ret = count;
} else if (type == WOLFSSL_FILETYPE_ASN1) {
crl = wolfSSL_d2i_X509_CRL_bio(bio, NULL);
@@ -26621,10 +26628,10 @@ WOLFSSL_API int wolfSSL_X509_load_crl_file(WOLFSSL_X509_LOOKUP *ctx,
} else {
WOLFSSL_MSG("Invalid file type");
}
wolfSSL_X509_CRL_free(crl);
wolfSSL_BIO_free(bio);
WOLFSSL_LEAVE("wolfSSL_X509_load_crl_file", ret);
return ret;
}
@@ -32099,6 +32106,7 @@ int wolfSSL_RAND_egd(const char* nm)
}
#endif
XMEMSET(&rem, 0, sizeof(struct sockaddr_un));
if (nm == NULL) {
#ifdef WOLFSSL_SMALL_STACK
XFREE(buf, NULL, DYNAMIC_TYPE_TMP_BUFFER);
@@ -36390,8 +36398,8 @@ WOLFSSL_EC_KEY *wolfSSL_EC_KEY_new(void)
goto error;
}
/* curve group */
external->group = wolfSSL_EC_GROUP_new_by_curve_name(ECC_CURVE_DEF);
/* Group unknown at creation */
external->group = wolfSSL_EC_GROUP_new_by_curve_name(NID_undef);
if (external->group == NULL) {
WOLFSSL_MSG("wolfSSL_EC_KEY_new malloc WOLFSSL_EC_GROUP failure");
goto error;
@@ -36436,18 +36444,28 @@ void wolfSSL_EC_KEY_free(WOLFSSL_EC_KEY *key)
}
}
#ifndef NO_WOLFSSL_STUB
/* set the group in WOLFSSL_EC_KEY and return WOLFSSL_SUCCESS on success */
int wolfSSL_EC_KEY_set_group(WOLFSSL_EC_KEY *key, WOLFSSL_EC_GROUP *group)
{
(void)key;
(void)group;
if (key == NULL || group == NULL)
return WOLFSSL_FAILURE;
WOLFSSL_ENTER("wolfSSL_EC_KEY_set_group");
WOLFSSL_STUB("EC_KEY_set_group");
return -1;
if (key->group != NULL) {
/* free the current group */
wolfSSL_EC_GROUP_free(key->group);
}
key->group = wolfSSL_EC_GROUP_dup(group);
if (key->group == NULL) {
return WOLFSSL_FAILURE;
}
return WOLFSSL_SUCCESS;
}
#endif
int wolfSSL_EC_KEY_generate_key(WOLFSSL_EC_KEY *key)
{
@@ -41275,9 +41293,11 @@ void* wolfSSL_GetDhAgreeCtx(WOLFSSL* ssl)
WOLFSSL_MSG("Serial size error");
return WOLFSSL_FAILURE;
}
if ((int)sizeof(cert->serial) < serialSz) {
WOLFSSL_MSG("Serial buffer too small");
return BUFFER_E;
if (serialSz > EXTERNAL_SERIAL_SIZE ||
serialSz > CTC_SERIAL_SIZE) {
WOLFSSL_MSG("Serial size too large error");
return WOLFSSL_FAILURE;
}
XMEMCPY(cert->serial, serial, serialSz);
cert->serialSz = serialSz;
@@ -52576,7 +52596,7 @@ WOLFSSL_ASN1_TIME* wolfSSL_ASN1_TIME_adj(WOLFSSL_ASN1_TIME *s, time_t t,
ts = (struct tm *)XGMTIME(&t_adj, tmpTime);
if (ts == NULL){
WOLFSSL_MSG("failed to get time data.");
XFREE(s, NULL, DYNAMIC_TYPE_OPENSSL);
wolfSSL_ASN1_TIME_free(s);
return NULL;
}
@@ -52599,8 +52619,10 @@ WOLFSSL_ASN1_TIME* wolfSSL_ASN1_TIME_adj(WOLFSSL_ASN1_TIME *s, time_t t,
XSNPRINTF((char *)utc_str, sizeof(utc_str),
"%02d%02d%02d%02d%02d%02dZ",
utc_year, utc_mon, utc_day, utc_hour, utc_min, utc_sec);
if (wolfSSL_ASN1_TIME_set_string(s, utc_str) != WOLFSSL_SUCCESS)
if (wolfSSL_ASN1_TIME_set_string(s, utc_str) != WOLFSSL_SUCCESS) {
wolfSSL_ASN1_TIME_free(s);
return NULL;
}
/* GeneralizedTime */
} else {
char gt_str[ASN_GENERALIZED_TIME_MAX];
@@ -52615,8 +52637,10 @@ WOLFSSL_ASN1_TIME* wolfSSL_ASN1_TIME_adj(WOLFSSL_ASN1_TIME *s, time_t t,
XSNPRINTF((char *)gt_str, sizeof(gt_str),
"%4d%02d%02d%02d%02d%02dZ",
gt_year, gt_mon, gt_day, gt_hour, gt_min,gt_sec);
if (wolfSSL_ASN1_TIME_set_string(s, gt_str) != WOLFSSL_SUCCESS)
if (wolfSSL_ASN1_TIME_set_string(s, gt_str) != WOLFSSL_SUCCESS) {
wolfSSL_ASN1_TIME_free(s);
return NULL;
}
}
return s;
@@ -53386,6 +53410,7 @@ PKCS7* wolfSSL_d2i_PKCS7_bio(WOLFSSL_BIO* bio, PKCS7** p7)
pkcs7->len = ret;
if (wc_PKCS7_VerifySignedData(&pkcs7->pkcs7, pkcs7->data, pkcs7->len) != 0) {
wolfSSL_PKCS7_free((PKCS7*)pkcs7);
return NULL;
}

View File

@@ -5040,7 +5040,7 @@ static void TLSX_SessionTicket_ValidateRequest(WOLFSSL* ssl)
}
}
}
#endif /* WLFSSL_TLS13 || !NO_WOLFSSL_CLIENT */
#endif /* WOLFSSL_TLS13 || !NO_WOLFSSL_CLIENT */
static word16 TLSX_SessionTicket_GetSize(SessionTicket* ticket, int isRequest)
@@ -11049,7 +11049,7 @@ int TLSX_Parse(WOLFSSL* ssl, const byte* input, word16 length, byte msgType,
ato16(input + offset, &size);
offset += OPAQUE16_LEN;
if (offset + size > length)
if (length - offset < size)
return BUFFER_ERROR;
switch (type) {

View File

@@ -2750,6 +2750,9 @@ static THREAD_RETURN WOLFSSL_THREAD test_server_nofail(void* args)
}
ctx = wolfSSL_CTX_new(method);
}
if (ctx == NULL) {
goto done;
}
#if defined(HAVE_SESSION_TICKET) && \
((defined(HAVE_CHACHA) && defined(HAVE_POLY1305)) || defined(HAVE_AESGCM))
@@ -36936,6 +36939,28 @@ static void test_wolfSSL_NCONF(void)
}
#endif /* OPENSSL_ALL */
static void test_wolfSSL_EC_KEY_set_group(void)
{
#if defined(HAVE_ECC) && !defined(NO_ECC256) && !defined(NO_ECC_SECP) && \
defined(OPENSSL_EXTRA)
EC_KEY *key = NULL;
EC_GROUP *group = NULL;
const EC_GROUP *group2 = NULL;
printf(testingFmt, "wolfSSL_EC_KEY_dup()");
AssertNotNull(group = EC_GROUP_new_by_curve_name(NID_X9_62_prime256v1));
AssertNotNull(key = EC_KEY_new());
AssertIntEQ(EC_KEY_set_group(key, group), WOLFSSL_SUCCESS);
AssertNotNull(group2 = EC_KEY_get0_group(key));
AssertIntEQ(EC_GROUP_cmp(group2, group, NULL), 0);
EC_GROUP_free(group);
EC_KEY_free(key);
printf(resultFmt, passed);
#endif
}
static void test_wolfSSL_X509V3_EXT_get(void) {
#if !defined(NO_FILESYSTEM) && defined (OPENSSL_ALL)
@@ -42481,6 +42506,7 @@ void ApiTest(void)
test_CRYPTO_THREADID_xxx();
test_ENGINE_cleanup();
test_wolfSSL_EC_KEY_set_group();
#if defined(OPENSSL_ALL)
test_wolfSSL_X509_PUBKEY_get();
test_wolfSSL_sk_CIPHER_description();

View File

@@ -6188,7 +6188,7 @@ void bench_eccsiPairGen(void)
byte id[] = { 0x01, 0x23, 0x34, 0x45 };
int ret;
mp_init(&ssk);
(void)mp_init(&ssk);
pvt = wc_ecc_new_point();
wc_InitEccsiKey(&genKey, NULL, INVALID_DEVID);
(void)wc_MakeEccsiKey(&genKey, &gRng);
@@ -6227,7 +6227,7 @@ void bench_eccsiValidate(void)
int valid;
int ret;
mp_init(&ssk);
(void)mp_init(&ssk);
pvt = wc_ecc_new_point();
wc_InitEccsiKey(&genKey, NULL, INVALID_DEVID);
(void)wc_MakeEccsiKey(&genKey, &gRng);
@@ -6272,7 +6272,7 @@ void bench_eccsi(void)
int ret;
int verified;
mp_init(&ssk);
(void)mp_init(&ssk);
pvt = wc_ecc_new_point();
(void)wc_InitEccsiKey(&genKey, NULL, INVALID_DEVID);
(void)wc_MakeEccsiKey(&genKey, &gRng);
@@ -6518,10 +6518,10 @@ void bench_sakke(void)
bench_stats_asym_finish("SAKKE", 1024, desc[10], 0, count, start, 0);
len = 0;
wc_GenerateSakkeRskTable(&genKey, rsk, NULL, &len);
(void)wc_GenerateSakkeRskTable(&genKey, rsk, NULL, &len);
if (len > 0) {
table = (byte*)XMALLOC(len, HEAP_HINT, DYNAMIC_TYPE_TMP_BUFFER);
wc_GenerateSakkeRskTable(&genKey, rsk, table, &len);
(void)wc_GenerateSakkeRskTable(&genKey, rsk, table, &len);
}
(void)wc_SetSakkeRsk(&genKey, rsk, table, len);

View File

@@ -171,6 +171,9 @@ ECC Curve Sizes:
#define GEN_MEM_ERR MP_MEM
#endif
/* forward declarations */
static int wc_ecc_new_point_ex(ecc_point** point, void* heap);
static void wc_ecc_del_point_ex(ecc_point* p, void* heap);
/* internal ECC states */
enum {
@@ -3002,9 +3005,12 @@ int wc_ecc_mulmod_ex(const mp_int* k, ecc_point *G, ecc_point *R, mp_int* a,
#if !defined(WOLFSSL_SP_MATH)
{
ecc_point *tG, *M[M_POINTS];
#ifdef WOLFSSL_NO_MALLOC
ecc_point lcl_tG, lcl_M[M_POINTS];
#endif
int i, err;
#ifdef WOLFSSL_SMALL_STACK_CACHE
ecc_key *key = (ecc_key *)XMALLOC(sizeof *key, heap, DYNAMIC_TYPE_ECC);
ecc_key *key = (ecc_key *)XMALLOC(sizeof(*key), heap, DYNAMIC_TYPE_ECC);
#endif
mp_digit mp;
@@ -3030,9 +3036,11 @@ int wc_ecc_mulmod_ex(const mp_int* k, ecc_point *G, ecc_point *R, mp_int* a,
/* alloc ram for window temps */
for (i = 0; i < M_POINTS; i++) {
M[i] = wc_ecc_new_point_h(heap);
if (M[i] == NULL) {
err = MEMORY_E;
#ifdef WOLFSSL_NO_MALLOC
M[i] = &lcl_M[i];
#endif
err = wc_ecc_new_point_ex(&M[i], heap);
if (err != MP_OKAY) {
goto exit;
}
#ifdef WOLFSSL_SMALL_STACK_CACHE
@@ -3041,9 +3049,11 @@ int wc_ecc_mulmod_ex(const mp_int* k, ecc_point *G, ecc_point *R, mp_int* a,
}
/* make a copy of G in case R==G */
tG = wc_ecc_new_point_h(heap);
if (tG == NULL) {
err = MEMORY_E;
#ifdef WOLFSSL_NO_MALLOC
tG = &lcl_tG;
#endif
err = wc_ecc_new_point_ex(&tG, heap);
if (err != MP_OKAY) {
goto exit;
}
if ((err = ecc_point_to_mont(G, tG, modulus, heap)) != MP_OKAY) {
@@ -3067,10 +3077,11 @@ int wc_ecc_mulmod_ex(const mp_int* k, ecc_point *G, ecc_point *R, mp_int* a,
exit:
/* done */
wc_ecc_del_point_h(tG, heap);
wc_ecc_del_point_ex(tG, heap);
for (i = 0; i < M_POINTS; i++) {
wc_ecc_del_point_h(M[i], heap);
wc_ecc_del_point_ex(M[i], heap);
}
#ifdef WOLFSSL_SMALL_STACK_CACHE
if (key) {
if (R)
@@ -3130,6 +3141,9 @@ int wc_ecc_mulmod_ex2(const mp_int* k, ecc_point *G, ecc_point *R, mp_int* a,
#if !defined(WOLFSSL_SP_MATH)
{
ecc_point *tG, *M[M_POINTS];
#ifdef WOLFSSL_NO_MALLOC
ecc_point lcl_tG, lcl_M[M_POINTS];
#endif
int i, err;
#ifdef WOLFSSL_SMALL_STACK_CACHE
ecc_key key;
@@ -3154,11 +3168,13 @@ int wc_ecc_mulmod_ex2(const mp_int* k, ecc_point *G, ecc_point *R, mp_int* a,
R->key = &key;
#endif /* WOLFSSL_SMALL_STACK_CACHE */
/* alloc ram for window temps */
for (i = 0; i < M_POINTS; i++) {
M[i] = wc_ecc_new_point_h(heap);
if (M[i] == NULL) {
err = MEMORY_E;
/* alloc ram for window temps */
for (i = 0; i < M_POINTS; i++) {
#ifdef WOLFSSL_NO_MALLOC
M[i] = &lcl_M[i];
#endif
err = wc_ecc_new_point_ex(&M[i], heap);
if (err != MP_OKAY) {
goto exit;
}
#ifdef WOLFSSL_SMALL_STACK_CACHE
@@ -3167,9 +3183,11 @@ int wc_ecc_mulmod_ex2(const mp_int* k, ecc_point *G, ecc_point *R, mp_int* a,
}
/* make a copy of G in case R==G */
tG = wc_ecc_new_point_h(heap);
if (tG == NULL) {
err = MEMORY_E;
#ifdef WOLFSSL_NO_MALLOC
tG = &lcl_tG;
#endif
err = wc_ecc_new_point_ex(&tG, heap);
if (err != MP_OKAY) {
goto exit;
}
if ((err = ecc_point_to_mont(G, tG, modulus, heap)) != MP_OKAY) {
@@ -3228,9 +3246,9 @@ int wc_ecc_mulmod_ex2(const mp_int* k, ecc_point *G, ecc_point *R, mp_int* a,
exit:
/* done */
wc_ecc_del_point_h(tG, heap);
wc_ecc_del_point_ex(tG, heap);
for (i = 0; i < M_POINTS; i++) {
wc_ecc_del_point_h(M[i], heap);
wc_ecc_del_point_ex(M[i], heap);
}
#ifdef WOLFSSL_SMALL_STACK_CACHE
R->key = NULL;
@@ -3290,25 +3308,37 @@ int wc_ecc_mulmod(const mp_int* k, ecc_point *G, ecc_point *R, mp_int* a,
#endif /* !WOLFSSL_ATECC508A */
/**
* Allocate a new ECC point (if one not provided)
* use a heap hint when creating new ecc_point
* return an allocated point on success or NULL on failure
*/
ecc_point* wc_ecc_new_point_h(void* heap)
*/
static int wc_ecc_new_point_ex(ecc_point** point, void* heap)
{
int err = MP_OKAY;
ecc_point* p;
(void)heap;
if (point == NULL) {
return BAD_FUNC_ARG;
}
p = (ecc_point*)XMALLOC(sizeof(ecc_point), heap, DYNAMIC_TYPE_ECC);
p = *point;
#ifndef WOLFSSL_NO_MALLOC
if (p == NULL) {
return NULL;
p = (ecc_point*)XMALLOC(sizeof(ecc_point), heap, DYNAMIC_TYPE_ECC);
}
#endif
if (p == NULL) {
return MEMORY_E;
}
XMEMSET(p, 0, sizeof(ecc_point));
#ifndef ALT_ECC_SIZE
if (mp_init_multi(p->x, p->y, p->z, NULL, NULL, NULL) != MP_OKAY) {
err = mp_init_multi(p->x, p->y, p->z, NULL, NULL, NULL);
if (err != MP_OKAY) {
#ifndef WOLFSSL_NO_MALLOC
XFREE(p, heap, DYNAMIC_TYPE_ECC);
return NULL;
#endif
return err;
}
#else
p->x = (mp_int*)&p->xyz[0];
@@ -3319,42 +3349,47 @@ ecc_point* wc_ecc_new_point_h(void* heap)
alt_fp_init(p->z);
#endif
return p;
*point = p;
(void)heap;
return err;
}
ecc_point* wc_ecc_new_point_h(void* heap)
{
ecc_point* p = NULL;
(void)wc_ecc_new_point_ex(&p, heap);
return p;
}
/**
Allocate a new ECC point
return A newly allocated point or NULL on error
*/
ecc_point* wc_ecc_new_point(void)
{
return wc_ecc_new_point_h(NULL);
ecc_point* p = NULL;
(void)wc_ecc_new_point_ex(&p, NULL);
return p;
}
void wc_ecc_del_point_h(ecc_point* p, void* heap)
{
/* prevents free'ing null arguments */
if (p != NULL) {
mp_clear(p->x);
mp_clear(p->y);
mp_clear(p->z);
XFREE(p, heap, DYNAMIC_TYPE_ECC);
}
(void)heap;
}
/** Free an ECC point from memory
p The point to free
*/
static void wc_ecc_del_point_ex(ecc_point* p, void* heap)
{
if (p != NULL) {
mp_clear(p->x);
mp_clear(p->y);
mp_clear(p->z);
#ifndef WOLFSSL_NO_MALLOC
XFREE(p, heap, DYNAMIC_TYPE_ECC);
#endif
}
(void)heap;
}
void wc_ecc_del_point_h(ecc_point* p, void* heap)
{
wc_ecc_del_point_ex(p, heap);
}
void wc_ecc_del_point(ecc_point* p)
{
wc_ecc_del_point_h(p, NULL);
wc_ecc_del_point_ex(p, NULL);
}
void wc_ecc_forcezero_point(ecc_point* p)
{
if (p != NULL) {
@@ -3890,13 +3925,19 @@ static int wc_ecc_shared_secret_gen_sync(ecc_key* private_key, ecc_point* point,
int err = MP_OKAY;
#if !defined(WOLFSSL_SP_MATH)
ecc_point* result = NULL;
#ifdef WOLFSSL_NO_MALLOC
ecc_point lcl_result;
#endif
word32 x = 0;
#endif
mp_int* k = &private_key->k;
#ifdef HAVE_ECC_CDH
mp_int k_lcl;
#endif
WOLFSSL_ENTER("wc_ecc_shared_secret_gen_sync");
#ifdef HAVE_ECC_CDH
/* if cofactor flag has been set */
if (private_key->flags & WC_ECC_FLAG_COFACTOR) {
mp_digit cofactor = (mp_digit)private_key->dp->cofactor;
@@ -3913,8 +3954,6 @@ static int wc_ecc_shared_secret_gen_sync(ecc_key* private_key, ecc_point* point,
}
}
}
#else
WOLFSSL_ENTER("wc_ecc_shared_secret_gen_sync");
#endif
#ifdef WOLFSSL_HAVE_SP_ECC
@@ -3949,13 +3988,16 @@ static int wc_ecc_shared_secret_gen_sync(ecc_key* private_key, ecc_point* point,
mp_digit mp = 0;
/* make new point */
result = wc_ecc_new_point_h(private_key->heap);
if (result == NULL) {
#ifdef HAVE_ECC_CDH
#ifdef WOLFSSL_NO_MALLOC
result = &lcl_result;
#endif
err = wc_ecc_new_point_ex(&result, private_key->heap);
if (err != MP_OKAY) {
#ifdef HAVE_ECC_CDH
if (k == &k_lcl)
mp_clear(k);
#endif
return MEMORY_E;
#endif
return err;
}
#ifdef ECC_TIMING_RESISTANT
@@ -3996,7 +4038,7 @@ static int wc_ecc_shared_secret_gen_sync(ecc_key* private_key, ecc_point* point,
}
*outlen = x;
wc_ecc_del_point_h(result, private_key->heap);
wc_ecc_del_point_ex(result, private_key->heap);
}
#endif
#ifdef HAVE_ECC_CDH
@@ -4312,6 +4354,9 @@ static int ecc_make_pub_ex(ecc_key* key, ecc_curve_spec* curveIn,
&& !defined(WOLFSSL_SILABS_SE_ACCEL)
#if !defined(WOLFSSL_SP_MATH)
ecc_point* base = NULL;
#ifdef WOLFSSL_NO_MALLOC
ecc_point lcl_base;
#endif
#endif
ecc_point* pub;
DECLARE_CURVE_SPECS(curve, ECC_CURVE_FIELD_COUNT);
@@ -4390,10 +4435,11 @@ static int ecc_make_pub_ex(ecc_key* key, ecc_curve_spec* curveIn,
#else
{
mp_digit mp = 0;
#ifdef WOLFSSL_NO_MALLOC
base = &lcl_base;
#endif
err = wc_ecc_new_point_ex(&base, key->heap);
base = wc_ecc_new_point_h(key->heap);
if (base == NULL)
err = MEMORY_E;
/* read in the x/y for this key */
if (err == MP_OKAY)
err = mp_copy(curve->Gx, base->x);
@@ -4418,7 +4464,7 @@ static int ecc_make_pub_ex(ecc_key* key, ecc_curve_spec* curveIn,
err = ecc_map_ex(pub, curve->prime, mp, 1);
}
wc_ecc_del_point_h(base, key->heap);
wc_ecc_del_point_ex(base, key->heap);
}
#endif
@@ -5961,10 +6007,18 @@ int ecc_mul2add(ecc_point* A, mp_int* kA,
ecc_point** precomp = NULL;
#else
ecc_point* precomp[SHAMIR_PRECOMP_SZ];
#ifdef WOLFSSL_NO_MALLOC
ecc_point lcl_precomp[SHAMIR_PRECOMP_SZ];
#endif
#endif
unsigned bitbufA, bitbufB, lenA, lenB, len, nA, nB, nibble;
unsigned char* tA;
unsigned char* tB;
#ifdef WOLFSSL_NO_MALLOC
unsigned char tA[ECC_BUFSIZE];
unsigned char tB[ECC_BUFSIZE];
#else
unsigned char* tA = NULL;
unsigned char* tB = NULL;
#endif
int err = MP_OKAY, first, x, y;
mp_digit mp = 0;
@@ -5974,6 +6028,7 @@ int ecc_mul2add(ecc_point* A, mp_int* kA,
return ECC_BAD_ARG_E;
}
#ifndef WOLFSSL_NO_MALLOC
/* allocate memory */
tA = (unsigned char*)XMALLOC(ECC_BUFSIZE, heap, DYNAMIC_TYPE_ECC_BUFFER);
if (tA == NULL) {
@@ -5984,6 +6039,8 @@ int ecc_mul2add(ecc_point* A, mp_int* kA,
XFREE(tA, heap, DYNAMIC_TYPE_ECC_BUFFER);
return GEN_MEM_ERR;
}
#endif
#ifdef WOLFSSL_SMALL_STACK
precomp = (ecc_point**)XMALLOC(sizeof(ecc_point*) * SHAMIR_PRECOMP_SZ, heap,
DYNAMIC_TYPE_ECC_BUFFER);
@@ -6001,6 +6058,7 @@ int ecc_mul2add(ecc_point* A, mp_int* kA,
key.y = (mp_int*)XMALLOC(sizeof(mp_int), heap, DYNAMIC_TYPE_ECC);
key.z = (mp_int*)XMALLOC(sizeof(mp_int), heap, DYNAMIC_TYPE_ECC);
#endif
if (key.t1 == NULL || key.t2 == NULL
#ifdef ALT_ECC_SIZE
|| key.x == NULL || key.y == NULL || key.z == NULL
@@ -6051,11 +6109,12 @@ int ecc_mul2add(ecc_point* A, mp_int* kA,
/* allocate the table */
if (err == MP_OKAY) {
for (x = 0; x < SHAMIR_PRECOMP_SZ; x++) {
precomp[x] = wc_ecc_new_point_h(heap);
if (precomp[x] == NULL) {
err = GEN_MEM_ERR;
#ifdef WOLFSSL_NO_MALLOC
precomp[x] = &lcl_precomp[x];
#endif
err = wc_ecc_new_point_ex(&precomp[x], heap);
if (err != MP_OKAY)
break;
}
#ifdef WOLFSSL_SMALL_STACK_CACHE
precomp[x]->key = &key;
#endif
@@ -6215,7 +6274,7 @@ int ecc_mul2add(ecc_point* A, mp_int* kA,
/* clean up */
for (x = 0; x < SHAMIR_PRECOMP_SZ; x++) {
wc_ecc_del_point_h(precomp[x], heap);
wc_ecc_del_point_ex(precomp[x], heap);
}
ForceZero(tA, ECC_BUFSIZE);
@@ -6233,9 +6292,10 @@ int ecc_mul2add(ecc_point* A, mp_int* kA,
#ifdef WOLFSSL_SMALL_STACK
XFREE(precomp, heap, DYNAMIC_TYPE_ECC_BUFFER);
#endif
#ifndef WOLFSSL_NO_MALLOC
XFREE(tB, heap, DYNAMIC_TYPE_ECC_BUFFER);
XFREE(tA, heap, DYNAMIC_TYPE_ECC_BUFFER);
#endif
return err;
}
@@ -6449,6 +6509,9 @@ int wc_ecc_verify_hash_ex(mp_int *r, mp_int *s, const byte* hash,
#elif !defined(WOLFSSL_SP_MATH) || defined(FREESCALE_LTC_ECC)
int did_init = 0;
ecc_point *mG = NULL, *mQ = NULL;
#ifdef WOLFSSL_NO_MALLOC
ecc_point lcl_mG, lcl_mQ;
#endif
#ifdef WOLFSSL_SMALL_STACK
mp_int* v = NULL;
mp_int* w = NULL;
@@ -6779,10 +6842,16 @@ int wc_ecc_verify_hash_ex(mp_int *r, mp_int *s, const byte* hash,
/* allocate points */
if (err == MP_OKAY) {
mG = wc_ecc_new_point_h(key->heap);
mQ = wc_ecc_new_point_h(key->heap);
if (mQ == NULL || mG == NULL)
err = MEMORY_E;
#ifdef WOLFSSL_NO_MALLOC
mG = &lcl_mG;
#endif
err = wc_ecc_new_point_ex(&mG, key->heap);
}
if (err == MP_OKAY) {
#ifdef WOLFSSL_NO_MALLOC
mQ = &lcl_mQ;
#endif
err = wc_ecc_new_point_ex(&mQ, key->heap);
}
/* w = s^-1 mod n */
@@ -6876,8 +6945,8 @@ int wc_ecc_verify_hash_ex(mp_int *r, mp_int *s, const byte* hash,
}
/* cleanup */
wc_ecc_del_point_h(mG, key->heap);
wc_ecc_del_point_h(mQ, key->heap);
wc_ecc_del_point_ex(mG, key->heap);
wc_ecc_del_point_ex(mQ, key->heap);
mp_clear(e);
if (did_init) {
@@ -7498,9 +7567,13 @@ int wc_ecc_is_point(ecc_point* ecp, mp_int* a, mp_int* b, mp_int* prime)
/* validate privkey * generator == pubkey, 0 on success */
static int ecc_check_privkey_gen(ecc_key* key, mp_int* a, mp_int* prime)
{
int err = MP_OKAY;
int err;
ecc_point* base = NULL;
ecc_point* res = NULL;
#ifdef WOLFSSL_NO_MALLOC
ecc_point lcl_base;
ecc_point lcl_res;
#endif
DECLARE_CURVE_SPECS(curve, 3);
if (key == NULL)
@@ -7508,9 +7581,10 @@ static int ecc_check_privkey_gen(ecc_key* key, mp_int* a, mp_int* prime)
ALLOC_CURVE_SPECS(3);
res = wc_ecc_new_point_h(key->heap);
if (res == NULL)
err = MEMORY_E;
#ifdef WOLFSSL_NO_MALLOC
res = &lcl_res;
#endif
err = wc_ecc_new_point_ex(&res, key->heap);
#ifdef WOLFSSL_HAVE_SP_ECC
#ifndef WOLFSSL_SP_NO_256
@@ -7531,9 +7605,12 @@ static int ecc_check_privkey_gen(ecc_key* key, mp_int* a, mp_int* prime)
#endif
#endif
{
base = wc_ecc_new_point_h(key->heap);
if (base == NULL)
err = MEMORY_E;
if (err == MP_OKAY) {
#ifdef WOLFSSL_NO_MALLOC
base = &lcl_base;
#endif
err = wc_ecc_new_point_ex(&base, key->heap);
}
if (err == MP_OKAY) {
/* load curve info */
@@ -7571,8 +7648,8 @@ static int ecc_check_privkey_gen(ecc_key* key, mp_int* a, mp_int* prime)
}
wc_ecc_curve_free(curve);
wc_ecc_del_point_h(res, key->heap);
wc_ecc_del_point_h(base, key->heap);
wc_ecc_del_point_ex(res, key->heap);
wc_ecc_del_point_ex(base, key->heap);
FREE_CURVE_SPECS();
return err;
@@ -7624,15 +7701,19 @@ static int ecc_check_pubkey_order(ecc_key* key, ecc_point* pubkey, mp_int* a,
mp_int* prime, mp_int* order)
{
ecc_point* inf = NULL;
int err;
#ifdef WOLFSSL_NO_MALLOC
ecc_point lcl_inf;
#endif
int err;
if (key == NULL)
return BAD_FUNC_ARG;
inf = wc_ecc_new_point_h(key->heap);
if (inf == NULL)
err = MEMORY_E;
else {
#ifdef WOLFSSL_NO_MALLOC
inf = &lcl_inf;
#endif
err = wc_ecc_new_point_ex(&inf, key->heap);
if (err == MP_OKAY) {
#ifdef WOLFSSL_HAVE_SP_ECC
#ifndef WOLFSSL_SP_NO_256
if (key->idx != ECC_CUSTOM_IDX &&
@@ -7663,7 +7744,7 @@ static int ecc_check_pubkey_order(ecc_key* key, ecc_point* pubkey, mp_int* a,
#endif
}
wc_ecc_del_point_h(inf, key->heap);
wc_ecc_del_point_ex(inf, key->heap);
return err;
}

View File

@@ -1666,6 +1666,7 @@ int wc_SetEccsiHash(EccsiKey* key, const byte* hash, byte hashSz)
* @param [in] pvt Public Validation Token (PVT) as an ECC point.
* @return 0 on success.
* @return BAD_FUNC_ARG when key, ssk or pvt is NULL.
* @return MP math errors when copy fails
*/
int wc_SetEccsiPair(EccsiKey* key, const mp_int* ssk, const ecc_point* pvt)
{
@@ -1674,9 +1675,13 @@ int wc_SetEccsiPair(EccsiKey* key, const mp_int* ssk, const ecc_point* pvt)
if ((key == NULL) || (ssk == NULL) || (pvt == NULL)) {
err = BAD_FUNC_ARG;
}
if (err == 0) {
mp_copy(ssk, &key->ssk);
wc_ecc_copy_point(pvt, key->pvt);
err = mp_copy(ssk, &key->ssk);
}
if (err == 0) {
err = wc_ecc_copy_point(pvt, key->pvt);
}
return err;

View File

@@ -301,6 +301,7 @@ static WC_INLINE int Sha256Update(wc_Sha256* sha256, const byte* data, word32 le
add = (len + sha256->buffLen) - numBlocks * WC_SHA256_BLOCK_SIZE;
Sha256Transform(sha256, data, numBlocks);
data += numBlocks * WC_SHA256_BLOCK_SIZE - sha256->buffLen;
AddLength(sha256, WC_SHA256_BLOCK_SIZE * numBlocks);
@@ -885,6 +886,7 @@ static WC_INLINE int Sha256Update(wc_Sha256* sha256, const byte* data, word32 le
add = (len + sha256->buffLen) - numBlocks * WC_SHA256_BLOCK_SIZE;
Sha256Transform(sha256, data, numBlocks);
data += numBlocks * WC_SHA256_BLOCK_SIZE - sha256->buffLen;
AddLength(sha256, WC_SHA256_BLOCK_SIZE * numBlocks);

View File

@@ -415,10 +415,10 @@ int wc_PKCS12_PBKDF_ex(byte* output, const byte* passwd, int passLen,
dLen = v;
sLen = v * ((saltLen + v - 1) / v);
if (passLen)
pLen = v * ((passLen + v - 1) / v);
else
pLen = 0;
/* with passLen checked at the top of the function for >= 0 then passLen
* must be 1 or greater here and is always 'true' */
pLen = v * ((passLen + v - 1) / v);
iLen = sLen + pLen;
totalLen = dLen + sLen + pLen;

View File

@@ -6120,7 +6120,7 @@ static int sakke_hash_to_range(SakkeKey* key, enum wc_HashType hashType,
int err = 0;
byte h[WC_MAX_DIGEST_SIZE];
byte v[WC_MAX_DIGEST_SIZE];
word32 hashSz = wc_HashGetDigestSize(hashType);
word32 hashSz = 0;
word32 i;
/* Step 1: A = hashfn( s ), where s = data | extra
@@ -6128,7 +6128,16 @@ static int sakke_hash_to_range(SakkeKey* key, enum wc_HashType hashType,
*/
/* Step 2: h_0 = 00...00, a string of null bits of length hashlen bits */
XMEMSET(h, 0, hashSz);
err = wc_HashGetDigestSize(hashType);
if (err > 0) {
hashSz = (word32)err;
XMEMSET(h, 0, hashSz);
err = 0; /* reset err value after getting digest size */
}
else if (err == 0) {
/* invalid hash digest size */
err = BAD_FUNC_ARG;
}
/* Step 3: l = Ceiling(lg(n)/hashlen) */
/* Step 4: For each i in 1 to l, do */

View File

@@ -2360,7 +2360,7 @@ void sp_forcezero(sp_int* a)
}
#endif /* !WOLFSSL_RSA_VERIFY_ONLY || !NO_DH || HAVE_ECC */
#if defined(WOLSSL_SP_MATH_ALL) || !defined(NO_DH) || defined(HAVE_ECC) || \
#if defined(WOLFSSL_SP_MATH_ALL) || !defined(NO_DH) || defined(HAVE_ECC) || \
!defined(NO_RSA) || defined(WOLFSSL_KEY_GEN) || defined(HAVE_COMP_KEY)
/* Copy value of multi-precision number a into r.
*
@@ -2390,7 +2390,7 @@ int sp_copy(const sp_int* a, sp_int* r)
}
#endif
#if defined(WOLSSL_SP_MATH_ALL) || (defined(HAVE_ECC) && defined(FP_ECC))
#if defined(WOLFSSL_SP_MATH_ALL) || (defined(HAVE_ECC) && defined(FP_ECC))
/* Initializes r and copies in value from a.
*
* @param [out] r SP integer - destination.
@@ -2409,7 +2409,7 @@ int sp_init_copy(sp_int* r, sp_int* a)
}
return err;
}
#endif /* WOLSSL_SP_MATH_ALL || (HAVE_ECC && FP_ECC) */
#endif /* WOLFSSL_SP_MATH_ALL || (HAVE_ECC && FP_ECC) */
#if (defined(WOLFSSL_SP_MATH_ALL) && !defined(WOLFSSL_RSA_VERIFY_ONLY)) || \
!defined(NO_DH) || !defined(NO_DSA)
@@ -12290,7 +12290,7 @@ int sp_to_unsigned_bin_len(sp_int* a, byte* out, int outSz)
return err;
}
#if defined(WOLFSSL_SP_MATH_ALL) && !defined(WOLFSSL_RSA_VERIFY_ONLY)
#if defined(WOLFSSL_SP_MATH_ALL) && !defined(NO_RSA) && !defined(WOLFSSL_RSA_VERIFY_ONLY)
/* Store the number in big-endian format in array at an offset.
* The array must be large enough for encoded number - use mp_unsigned_bin_size
* to calculate the number of bytes required.
@@ -12312,10 +12312,10 @@ int sp_to_unsigned_bin_at_pos(int o, sp_int*a, unsigned char* out)
return ret;
}
#endif /* WOLFSSL_SP_MATH_ALL */
#endif /* WOLFSSL_SP_MATH_ALL && !NO_RSA && !WOLFSSL_RSA_VERIFY_ONLY */
#if (defined(WOLFSSL_SP_MATH_ALL) && !defined(WOLFSSL_RSA_VERIFY_ONLY)) || \
defined(HAVE_ECC)
#if (defined(WOLFSSL_SP_MATH_ALL) && !defined(NO_RSA) && !defined(WOLFSSL_RSA_VERIFY_ONLY)) || \
defined(HAVE_ECC) || !defined(NO_DSA)
/* Convert hexadecimal number as string in big-endian format to a
* multi-precision number.
*
@@ -12388,9 +12388,9 @@ static int _sp_read_radix_16(sp_int* a, const char* in)
}
return err;
}
#endif /* (WOLFSSL_SP_MATH_ALL && !WOLFSSL_RSA_VERIFY_ONLY) || HAVE_ECC */
#endif /* (WOLFSSL_SP_MATH_ALL && !NO_RSA && !WOLFSSL_RSA_VERIFY_ONLY) || HAVE_ECC */
#if defined(WOLFSSL_SP_MATH_ALL) && !defined(WOLFSSL_RSA_VERIFY_ONLY)
#if defined(WOLFSSL_SP_MATH_ALL) && !defined(NO_RSA) && !defined(WOLFSSL_RSA_VERIFY_ONLY)
/* Convert decimal number as string in big-endian format to a multi-precision
* number.
*
@@ -12447,10 +12447,10 @@ static int _sp_read_radix_10(sp_int* a, const char* in)
return err;
}
#endif /* WOLFSSL_SP_MATH_ALL && !WOLFSSL_RSA_VERIFY_ONLY */
#endif /* WOLFSSL_SP_MATH_ALL && !NO_RSA && !WOLFSSL_RSA_VERIFY_ONLY */
#if (defined(WOLFSSL_SP_MATH_ALL) && !defined(WOLFSSL_RSA_VERIFY_ONLY)) || \
defined(HAVE_ECC)
#if (defined(WOLFSSL_SP_MATH_ALL) && !defined(NO_RSA) && !defined(WOLFSSL_RSA_VERIFY_ONLY)) || \
defined(HAVE_ECC) || !defined(NO_DSA)
/* Convert a number as string in big-endian format to a big number.
* Only supports base-16 (hexadecimal) and base-10 (decimal).
*
@@ -12482,7 +12482,7 @@ int sp_read_radix(sp_int* a, const char* in, int radix)
if (radix == 16) {
err = _sp_read_radix_16(a, in);
}
#if defined(WOLFSSL_SP_MATH_ALL) && !defined(WOLFSSL_RSA_VERIFY_ONLY)
#if defined(WOLFSSL_SP_MATH_ALL) && !defined(NO_RSA) && !defined(WOLFSSL_RSA_VERIFY_ONLY)
else if (radix == 10) {
err = _sp_read_radix_10(a, in);
}
@@ -12494,7 +12494,7 @@ int sp_read_radix(sp_int* a, const char* in, int radix)
return err;
}
#endif /* (WOLFSSL_SP_MATH_ALL && !WOLFSSL_RSA_VERIFY_ONLY) || HAVE_ECC */
#endif /* (WOLFSSL_SP_MATH_ALL && !NO_RSA && !WOLFSSL_RSA_VERIFY_ONLY) || HAVE_ECC */
#if (defined(WOLFSSL_SP_MATH_ALL) && !defined(WOLFSSL_RSA_VERIFY_ONLY)) || \
defined(WC_MP_TO_RADIX)

View File

@@ -27281,7 +27281,7 @@ static int eccsi_enc_dec_pair_test(EccsiKey* priv, mp_int* ssk, ecc_point* pvt)
return -10117;
decPvt = wc_ecc_new_point();
if (ret != 0)
if (decPvt == NULL)
return -10118;
ret = wc_EncodeEccsiPair(priv, ssk, pvt, NULL, &sz);
@@ -27645,80 +27645,100 @@ static int eccsi_sign_verify_test(EccsiKey* priv, EccsiKey* pub, WC_RNG* rng,
int eccsi_test(void)
{
int ret;
int ret = 0;
WC_RNG rng;
EccsiKey* priv;
EccsiKey* pub;
mp_int* ssk;
ecc_point* pvt;
EccsiKey* priv = NULL;
EccsiKey* pub = NULL;
mp_int* ssk = NULL;
ecc_point* pvt = NULL;
priv = (EccsiKey*)XMALLOC(sizeof(EccsiKey), HEAP_HINT,
DYNAMIC_TYPE_TMP_BUFFER);
if (priv == NULL) {
return -10205;
ret = -10205;
}
pub = (EccsiKey*)XMALLOC(sizeof(EccsiKey), HEAP_HINT,
if (ret == 0) {
pub = (EccsiKey*)XMALLOC(sizeof(EccsiKey), HEAP_HINT,
DYNAMIC_TYPE_TMP_BUFFER);
if (pub == NULL) {
XFREE(priv, HEAP_HINT, DYNAMIC_TYPE_TMP_BUFFER);
return -10206;
}
ssk = (mp_int*)XMALLOC(sizeof(mp_int), HEAP_HINT, DYNAMIC_TYPE_TMP_BUFFER);
if (ssk == NULL) {
XFREE(pub, HEAP_HINT, DYNAMIC_TYPE_TMP_BUFFER);
XFREE(priv, HEAP_HINT, DYNAMIC_TYPE_TMP_BUFFER);
return -10207;
if (pub == NULL) {
ret = -10206;
}
}
#ifndef HAVE_FIPS
ret = wc_InitRng_ex(&rng, HEAP_HINT, devId);
#else
ret = wc_InitRng(&rng);
#endif
if (ret != 0)
return -10200;
if (ret == 0) {
ssk = (mp_int*)XMALLOC(sizeof(mp_int), HEAP_HINT,
DYNAMIC_TYPE_TMP_BUFFER);
if (ssk == NULL) {
ret = -10207;
}
}
pvt = wc_ecc_new_point();
if (pvt == NULL)
return -10201;
ret = mp_init(ssk);
if (ret != 0)
return -10202;
if (ret == 0) {
#ifndef HAVE_FIPS
ret = wc_InitRng_ex(&rng, HEAP_HINT, devId);
#else
ret = wc_InitRng(&rng);
#endif
if (ret != 0)
ret = -10200;
}
ret = eccsi_api_test(&rng, priv, ssk, pvt);
if (ret != 0)
return ret;
if (ret == 0) {
pvt = wc_ecc_new_point();
if (pvt == NULL)
ret = -10201;
}
ret = wc_InitEccsiKey(pub, HEAP_HINT, INVALID_DEVID);
if (ret != 0)
return -10203;
if (ret == 0) {
ret = mp_init(ssk);
if (ret != 0)
ret = -10202;
}
ret = wc_InitEccsiKey(priv, HEAP_HINT, INVALID_DEVID);
if (ret != 0)
return -10204;
if (ret == 0) {
ret = eccsi_api_test(&rng, priv, ssk, pvt);
}
ret = eccsi_kat_verify_test(pub, pvt);
if (ret != 0)
return ret;
if (ret == 0) {
ret = wc_InitEccsiKey(pub, HEAP_HINT, INVALID_DEVID);
if (ret != 0)
ret = -10203;
}
ret = eccsi_make_key_test(priv, pub, &rng, ssk, pvt);
if (ret != 0)
return ret;
if (ret == 0) {
ret = wc_InitEccsiKey(priv, HEAP_HINT, INVALID_DEVID);
if (ret != 0)
ret = -10204;
}
ret = eccsi_sign_verify_test(priv, pub, &rng, ssk, pvt);
if (ret != 0)
return ret;
if (ret == 0) {
ret = eccsi_kat_verify_test(pub, pvt);
}
if (ret == 0) {
ret = eccsi_make_key_test(priv, pub, &rng, ssk, pvt);
}
if (ret == 0) {
ret = eccsi_sign_verify_test(priv, pub, &rng, ssk, pvt);
}
wc_FreeEccsiKey(priv);
wc_FreeEccsiKey(pub);
mp_free(ssk);
wc_ecc_del_point(pvt);
wc_FreeRng(&rng);
XFREE(ssk, HEAP_HINT, DYNAMIC_TYPE_TMP_BUFFER);
XFREE(pub, HEAP_HINT, DYNAMIC_TYPE_TMP_BUFFER);
XFREE(priv, HEAP_HINT, DYNAMIC_TYPE_TMP_BUFFER);
return 0;
if (ret != -10200)
wc_FreeRng(&rng);
if (ssk != NULL)
XFREE(ssk, HEAP_HINT, DYNAMIC_TYPE_TMP_BUFFER);
if (pub != NULL)
XFREE(pub, HEAP_HINT, DYNAMIC_TYPE_TMP_BUFFER);
if (priv != NULL)
XFREE(priv, HEAP_HINT, DYNAMIC_TYPE_TMP_BUFFER);
return ret;
}
#endif /* WOLFCRYPT_HAVE_ECCSI */
@@ -28771,82 +28791,99 @@ static int sakke_op_test(SakkeKey* priv, SakkeKey* pub, WC_RNG* rng,
int sakke_test(void)
{
int ret;
int ret = 0;
WC_RNG rng;
SakkeKey* priv;
SakkeKey* pub;
SakkeKey* key;
SakkeKey* priv = NULL;
SakkeKey* pub = NULL;
SakkeKey* key = NULL;
ecc_point* rsk = NULL;
priv = (SakkeKey*)XMALLOC(sizeof(SakkeKey), HEAP_HINT,
DYNAMIC_TYPE_TMP_BUFFER);
if (priv == NULL) {
return -10404;
ret = -10404;
}
pub = (SakkeKey*)XMALLOC(sizeof(SakkeKey), HEAP_HINT,
if (ret == 0) {
pub = (SakkeKey*)XMALLOC(sizeof(SakkeKey), HEAP_HINT,
DYNAMIC_TYPE_TMP_BUFFER);
if (pub == NULL) {
XFREE(priv, HEAP_HINT, DYNAMIC_TYPE_TMP_BUFFER);
return -10405;
if (pub == NULL) {
ret = -10405;
}
}
key = (SakkeKey*)XMALLOC(sizeof(SakkeKey), HEAP_HINT,
if (ret == 0) {
key = (SakkeKey*)XMALLOC(sizeof(SakkeKey), HEAP_HINT,
DYNAMIC_TYPE_TMP_BUFFER);
if (key == NULL) {
XFREE(pub, HEAP_HINT, DYNAMIC_TYPE_TMP_BUFFER);
XFREE(priv, HEAP_HINT, DYNAMIC_TYPE_TMP_BUFFER);
return -10406;
if (key == NULL) {
ret = -10406;
}
}
#ifndef HAVE_FIPS
ret = wc_InitRng_ex(&rng, HEAP_HINT, devId);
#else
ret = wc_InitRng(&rng);
#endif
if (ret != 0)
return -10400;
if (ret == 0) {
#ifndef HAVE_FIPS
ret = wc_InitRng_ex(&rng, HEAP_HINT, devId);
#else
ret = wc_InitRng(&rng);
#endif
if (ret != 0)
ret = -10400;
}
rsk = wc_ecc_new_point();
if (rsk == NULL)
return -10401;
if (ret == 0) {
rsk = wc_ecc_new_point();
if (rsk == NULL)
ret = -10401;
}
ret = wc_InitSakkeKey(pub, HEAP_HINT, INVALID_DEVID);
if (ret != 0)
return -10402;
if (ret == 0) {
ret = wc_InitSakkeKey(pub, HEAP_HINT, INVALID_DEVID);
if (ret != 0)
ret = -10402;
}
ret = wc_InitSakkeKey(priv, HEAP_HINT, INVALID_DEVID);
if (ret != 0)
return -10403;
if (ret == 0) {
ret = wc_InitSakkeKey(priv, HEAP_HINT, INVALID_DEVID);
if (ret != 0)
ret = -10403;
}
ret = sakke_api_test(&rng, key, rsk);
if (ret != 0)
return ret;
if (ret == 0) {
ret = sakke_api_test(&rng, key, rsk);
}
ret = sakke_kat_derive_test(pub, rsk);
if (ret != 0)
return ret;
if (ret == 0) {
ret = sakke_kat_derive_test(pub, rsk);
}
ret = sakke_kat_encapsulate_test(pub);
if (ret != 0)
return ret;
if (ret == 0) {
ret = sakke_kat_encapsulate_test(pub);
}
ret = sakke_make_key_test(priv, pub, key, &rng, rsk);
if (ret != 0)
return ret;
if (ret == 0) {
ret = sakke_make_key_test(priv, pub, key, &rng, rsk);
}
ret = sakke_op_test(priv, pub, &rng, rsk);
if (ret != 0)
return ret;
if (ret == 0) {
ret = sakke_op_test(priv, pub, &rng, rsk);
}
wc_FreeSakkeKey(priv);
wc_FreeSakkeKey(pub);
wc_ecc_forcezero_point(rsk);
wc_ecc_del_point(rsk);
wc_FreeRng(&rng);
XFREE(key, HEAP_HINT, DYNAMIC_TYPE_TMP_BUFFER);
XFREE(pub, HEAP_HINT, DYNAMIC_TYPE_TMP_BUFFER);
XFREE(priv, HEAP_HINT, DYNAMIC_TYPE_TMP_BUFFER);
return 0;
if (ret != -10400)
wc_FreeRng(&rng);
if (key != NULL)
XFREE(key, HEAP_HINT, DYNAMIC_TYPE_TMP_BUFFER);
if (pub != NULL)
XFREE(pub, HEAP_HINT, DYNAMIC_TYPE_TMP_BUFFER);
if (priv != NULL)
XFREE(priv, HEAP_HINT, DYNAMIC_TYPE_TMP_BUFFER);
return ret;
}
#endif /* WOLFCRYPT_HAVE_SAKKE */
@@ -35554,7 +35591,7 @@ WOLFSSL_TEST_SUBROUTINE int mp_test(void)
if (ret != 0)
return -13300;
#ifdef WOLSSL_SP_MATH_ALL
#ifdef WOLFSSL_SP_MATH_ALL
mp_init_copy(&p, &a);
#else
ret = mp_init(&p);

View File

@@ -316,6 +316,9 @@ typedef struct ecc_set_type {
#ifndef USE_FAST_MATH
#error USE_FAST_MATH must be defined to use ALT_ECC_SIZE
#endif
#ifdef WOLFSSL_NO_MALLOC
#error ALT_ECC_SIZE cannot be used with no malloc (WOLFSSL_NO_MALLOC)
#endif
/* determine max bits required for ECC math */
#ifndef FP_MAX_BITS_ECC

View File

@@ -2437,6 +2437,12 @@ extern void uITRON4_free(void *p) ;
#define NO_STRICT_ECDSA_LEN
#endif
/* Do not allow using small stack with no malloc */
#if defined(WOLFSSL_NO_MALLOC) && \
(defined(WOLFSSL_SMALL_STACK) || defined(WOLFSSL_SMALL_STACK_CACHE))
#error Small stack cannot be used with no malloc (WOLFSSL_NO_MALLOC)
#endif
#ifdef __cplusplus
} /* extern "C" */