Skip to content

Commit 290dbaa

Browse files
committed
wolfSSL_EVP_PKEY_cmp: only compare the public keys
1 parent 5e8d018 commit 290dbaa

3 files changed

Lines changed: 102 additions & 44 deletions

File tree

configure.ac

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2253,6 +2253,7 @@ if test "$ENABLED_OPENSSH" = "yes"
22532253
then
22542254
ENABLED_FORTRESS="yes"
22552255
AM_CFLAGS="$AM_CFLAGS -DWOLFSSL_OPENSSH -DHAVE_EX_DATA -DWOLFSSL_BASE16"
2256+
AM_CFLAGS="$AM_CFLAGS -DWOLFSSL_ERROR_CODE_OPENSSL"
22562257
fi
22572258

22582259
# net-snmp Build

tests/api.c

Lines changed: 27 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -6597,8 +6597,7 @@ static int test_wolfSSL_EVP_PKEY_print_public(void)
65976597
ExpectIntEQ(EVP_PKEY_print_public(wbio, pkey,0,NULL),1);
65986598

65996599
ExpectIntGT(BIO_gets(wbio, line, sizeof(line)), 0);
6600-
strcpy(line1, "Public-Key: (256 bit)\n");
6601-
ExpectIntEQ(XSTRNCMP( line, line1, XSTRLEN(line1)), 0);
6600+
ExpectStrEQ(line, "Public-Key: (256 bit)\n");
66026601

66036602
ExpectIntGT(BIO_gets(wbio, line, sizeof(line)), 0);
66046603
strcpy(line1, "pub:\n");
@@ -25378,7 +25377,7 @@ static int test_hmac_signing(const WOLFSSL_EVP_MD *type, const byte* testKey,
2537825377
{
2537925378
EXPECT_DECLS;
2538025379
unsigned char check[WC_MAX_DIGEST_SIZE];
25381-
size_t checkSz = -1;
25380+
size_t checkSz = 0;
2538225381
WOLFSSL_EVP_PKEY* key = NULL;
2538325382
WOLFSSL_EVP_MD_CTX mdCtx;
2538425383

@@ -25388,8 +25387,10 @@ static int test_hmac_signing(const WOLFSSL_EVP_MD *type, const byte* testKey,
2538825387
ExpectIntEQ(wolfSSL_EVP_DigestSignInit(&mdCtx, NULL, type, NULL, key), 1);
2538925388
ExpectIntEQ(wolfSSL_EVP_DigestSignUpdate(&mdCtx, testData,
2539025389
(unsigned int)testDataSz), 1);
25390+
checkSz = sizeof(check);
2539125391
ExpectIntEQ(wolfSSL_EVP_DigestSignFinal(&mdCtx, NULL, &checkSz), 1);
2539225392
ExpectIntEQ((int)checkSz, (int)testResultSz);
25393+
checkSz = sizeof(check);
2539325394
ExpectIntEQ(wolfSSL_EVP_DigestSignFinal(&mdCtx, check, &checkSz), 1);
2539425395
ExpectIntEQ((int)checkSz,(int)testResultSz);
2539525396
ExpectIntEQ(XMEMCMP(testResult, check, testResultSz), 0);
@@ -25404,12 +25405,15 @@ static int test_hmac_signing(const WOLFSSL_EVP_MD *type, const byte* testKey,
2540425405
wolfSSL_EVP_MD_CTX_init(&mdCtx);
2540525406
ExpectIntEQ(wolfSSL_EVP_DigestSignInit(&mdCtx, NULL, type, NULL, key), 1);
2540625407
ExpectIntEQ(wolfSSL_EVP_DigestSignUpdate(&mdCtx, testData, 4), 1);
25408+
checkSz = sizeof(check);
2540725409
ExpectIntEQ(wolfSSL_EVP_DigestSignFinal(&mdCtx, NULL, &checkSz), 1);
2540825410
ExpectIntEQ((int)checkSz, (int)testResultSz);
25411+
checkSz = sizeof(check);
2540925412
ExpectIntEQ(wolfSSL_EVP_DigestSignFinal(&mdCtx, check, &checkSz), 1);
2541025413
ExpectIntEQ((int)checkSz,(int)testResultSz);
2541125414
ExpectIntEQ(wolfSSL_EVP_DigestSignUpdate(&mdCtx, testData + 4,
2541225415
(unsigned int)testDataSz - 4), 1);
25416+
checkSz = sizeof(check);
2541325417
ExpectIntEQ(wolfSSL_EVP_DigestSignFinal(&mdCtx, check, &checkSz), 1);
2541425418
ExpectIntEQ((int)checkSz,(int)testResultSz);
2541525419
ExpectIntEQ(XMEMCMP(testResult, check, testResultSz), 0);
@@ -25612,8 +25616,10 @@ static int test_wolfSSL_EVP_MD_rsa_signing(void)
2561225616
NULL, privKey), 1);
2561325617
ExpectIntEQ(wolfSSL_EVP_DigestSignUpdate(&mdCtx, testData,
2561425618
(unsigned int)XSTRLEN(testData)), 1);
25619+
checkSz = sizeof(check);
2561525620
ExpectIntEQ(wolfSSL_EVP_DigestSignFinal(&mdCtx, NULL, &checkSz), 1);
2561625621
ExpectIntEQ((int)checkSz, sz);
25622+
checkSz = sizeof(check);
2561725623
ExpectIntEQ(wolfSSL_EVP_DigestSignFinal(&mdCtx, check, &checkSz), 1);
2561825624
ExpectIntEQ((int)checkSz,sz);
2561925625
ExpectIntEQ(wolfSSL_EVP_MD_CTX_copy_ex(&mdCtxCopy, &mdCtx), 1);
@@ -25637,12 +25643,15 @@ static int test_wolfSSL_EVP_MD_rsa_signing(void)
2563725643
ExpectIntEQ(wolfSSL_EVP_DigestSignInit(&mdCtx, NULL, wolfSSL_EVP_sha256(),
2563825644
NULL, privKey), 1);
2563925645
ExpectIntEQ(wolfSSL_EVP_DigestSignUpdate(&mdCtx, testData, 4), 1);
25646+
checkSz = sizeof(check);
2564025647
ExpectIntEQ(wolfSSL_EVP_DigestSignFinal(&mdCtx, NULL, &checkSz), 1);
2564125648
ExpectIntEQ((int)checkSz, sz);
25649+
checkSz = sizeof(check);
2564225650
ExpectIntEQ(wolfSSL_EVP_DigestSignFinal(&mdCtx, check, &checkSz), 1);
2564325651
ExpectIntEQ((int)checkSz, sz);
2564425652
ExpectIntEQ(wolfSSL_EVP_DigestSignUpdate(&mdCtx, testData + 4,
2564525653
(unsigned int)XSTRLEN(testData) - 4), 1);
25654+
checkSz = sizeof(check);
2564625655
ExpectIntEQ(wolfSSL_EVP_DigestSignFinal(&mdCtx, check, &checkSz), 1);
2564725656
ExpectIntEQ((int)checkSz, sz);
2564825657
ret = wolfSSL_EVP_MD_CTX_cleanup(&mdCtx);
@@ -25668,8 +25677,10 @@ static int test_wolfSSL_EVP_MD_rsa_signing(void)
2566825677
paddings[i]), 1);
2566925678
ExpectIntEQ(wolfSSL_EVP_DigestSignUpdate(&mdCtx, testData,
2567025679
(unsigned int)XSTRLEN(testData)), 1);
25680+
checkSz = sizeof(check);
2567125681
ExpectIntEQ(wolfSSL_EVP_DigestSignFinal(&mdCtx, NULL, &checkSz), 1);
2567225682
ExpectIntEQ((int)checkSz, sz);
25683+
checkSz = sizeof(check);
2567325684
ExpectIntEQ(wolfSSL_EVP_DigestSignFinal(&mdCtx, check, &checkSz), 1);
2567425685
ExpectIntEQ((int)checkSz,sz);
2567525686
ret = wolfSSL_EVP_MD_CTX_cleanup(&mdCtx);
@@ -25703,10 +25714,12 @@ static int test_wolfSSL_EVP_MD_ecc_signing(void)
2570325714
const char testData[] = "Hi There";
2570425715
WOLFSSL_EVP_MD_CTX mdCtx;
2570525716
int ret;
25706-
size_t checkSz = -1;
2570725717
const unsigned char* cp;
2570825718
const unsigned char* p;
2570925719
unsigned char check[2048/8];
25720+
size_t checkSz = sizeof(check);
25721+
25722+
XMEMSET(check, 0, sizeof(check));
2571025723

2571125724
cp = ecc_clikey_der_256;
2571225725
ExpectNotNull(privKey = wolfSSL_d2i_PrivateKey(EVP_PKEY_EC, NULL, &cp,
@@ -25720,7 +25733,9 @@ static int test_wolfSSL_EVP_MD_ecc_signing(void)
2572025733
NULL, privKey), 1);
2572125734
ExpectIntEQ(wolfSSL_EVP_DigestSignUpdate(&mdCtx, testData,
2572225735
(unsigned int)XSTRLEN(testData)), 1);
25736+
checkSz = sizeof(check);
2572325737
ExpectIntEQ(wolfSSL_EVP_DigestSignFinal(&mdCtx, NULL, &checkSz), 1);
25738+
checkSz = sizeof(check);
2572425739
ExpectIntEQ(wolfSSL_EVP_DigestSignFinal(&mdCtx, check, &checkSz), 1);
2572525740
ret = wolfSSL_EVP_MD_CTX_cleanup(&mdCtx);
2572625741
ExpectIntEQ(ret, 1);
@@ -25739,10 +25754,13 @@ static int test_wolfSSL_EVP_MD_ecc_signing(void)
2573925754
ExpectIntEQ(wolfSSL_EVP_DigestSignInit(&mdCtx, NULL, wolfSSL_EVP_sha256(),
2574025755
NULL, privKey), 1);
2574125756
ExpectIntEQ(wolfSSL_EVP_DigestSignUpdate(&mdCtx, testData, 4), 1);
25757+
checkSz = sizeof(check);
2574225758
ExpectIntEQ(wolfSSL_EVP_DigestSignFinal(&mdCtx, NULL, &checkSz), 1);
25759+
checkSz = sizeof(check);
2574325760
ExpectIntEQ(wolfSSL_EVP_DigestSignFinal(&mdCtx, check, &checkSz), 1);
2574425761
ExpectIntEQ(wolfSSL_EVP_DigestSignUpdate(&mdCtx, testData + 4,
2574525762
(unsigned int)XSTRLEN(testData) - 4), 1);
25763+
checkSz = sizeof(check);
2574625764
ExpectIntEQ(wolfSSL_EVP_DigestSignFinal(&mdCtx, check, &checkSz), 1);
2574725765
ret = wolfSSL_EVP_MD_CTX_cleanup(&mdCtx);
2574825766
ExpectIntEQ(ret, 1);
@@ -25834,7 +25852,7 @@ static int test_wolfSSL_CTX_add_extra_chain_cert(void)
2583425852
pkey = X509_get_pubkey(ecX509);
2583525853
ExpectNotNull(pkey);
2583625854
/* current ECC key is 256 bit (32 bytes) */
25837-
ExpectIntEQ(EVP_PKEY_size(pkey), 32);
25855+
ExpectIntEQ(EVP_PKEY_size(pkey), 72);
2583825856

2583925857
X509_free(ecX509);
2584025858
ecX509 = NULL;
@@ -37584,7 +37602,7 @@ static int test_wolfSSL_BIO_f_md(void)
3758437602
0xA4, 0x95, 0x99, 0x1B, 0x78, 0x52, 0xB8, 0x55
3758537603
};
3758637604
unsigned char check[sizeof(testResult) + 1];
37587-
size_t checkSz = -1;
37605+
size_t checkSz = sizeof(check);
3758837606
EVP_PKEY* key = NULL;
3758937607

3759037608
XMEMSET(out, 0, sizeof(out));
@@ -37637,7 +37655,9 @@ static int test_wolfSSL_BIO_f_md(void)
3763737655
EVP_DigestSignInit(ctx, NULL, EVP_sha256(), NULL, key);
3763837656
ExpectNotNull(bio = BIO_push(bio, mem));
3763937657
BIO_write(bio, testData, (int)strlen(testData));
37658+
checkSz = sizeof(check);
3764037659
ExpectIntEQ(EVP_DigestSignFinal(ctx, NULL, &checkSz), 1);
37660+
checkSz = sizeof(check);
3764137661
ExpectIntEQ(EVP_DigestSignFinal(ctx, check, &checkSz), 1);
3764237662

3764337663
ExpectIntEQ(XMEMCMP(check, testResult, sizeof(testResult)), 0);
@@ -40915,7 +40935,7 @@ static int test_wolfSSL_CTX_ctrl(void)
4091540935
#endif
4091640936
ExpectNotNull(pkey = X509_get_pubkey(ecX509));
4091740937
/* current ECC key is 256 bit (32 bytes) */
40918-
ExpectIntEQ(EVP_PKEY_size(pkey), 32);
40938+
ExpectIntEQ(EVP_PKEY_size(pkey), 72);
4091940939

4092040940
X509_free(ecX509);
4092140941
EVP_PKEY_free(pkey);

wolfcrypt/src/evp.c

Lines changed: 74 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -3478,14 +3478,44 @@ int wolfSSL_EVP_PKEY_verify(WOLFSSL_EVP_PKEY_CTX *ctx, const unsigned char *sig,
34783478
*/
34793479
int wolfSSL_EVP_PKEY_bits(const WOLFSSL_EVP_PKEY *pkey)
34803480
{
3481-
int bytes;
3481+
int ret = 0;
34823482

3483-
if (pkey == NULL) return 0;
3484-
WOLFSSL_ENTER("wolfSSL_EVP_PKEY_bits");
3485-
if ((bytes = wolfSSL_EVP_PKEY_size((WOLFSSL_EVP_PKEY*)pkey)) ==0) return 0;
3486-
if (bytes < 0)
3483+
if (pkey == NULL)
34873484
return 0;
3488-
return bytes*8;
3485+
3486+
WOLFSSL_ENTER("wolfSSL_EVP_PKEY_bits");
3487+
3488+
switch (pkey->type) {
3489+
#ifndef NO_RSA
3490+
case WC_EVP_PKEY_RSA:
3491+
ret = (int)wolfSSL_RSA_size((const WOLFSSL_RSA*)(pkey->rsa));
3492+
break;
3493+
#endif /* !NO_RSA */
3494+
3495+
#ifndef NO_DSA
3496+
case WC_EVP_PKEY_DSA:
3497+
if (pkey->dsa == NULL ||
3498+
(!pkey->dsa->exSet &&
3499+
SetDsaExternal(pkey->dsa) != WOLFSSL_SUCCESS))
3500+
break;
3501+
ret = wolfSSL_BN_num_bytes(pkey->dsa->p);
3502+
break;
3503+
#endif
3504+
3505+
#ifdef HAVE_ECC
3506+
case WC_EVP_PKEY_EC:
3507+
if (pkey->ecc == NULL || pkey->ecc->internal == NULL) {
3508+
WOLFSSL_MSG("No ECC key has been set");
3509+
break;
3510+
}
3511+
ret = wc_ecc_size((ecc_key*)(pkey->ecc->internal));
3512+
break;
3513+
#endif /* HAVE_ECC */
3514+
3515+
default:
3516+
break;
3517+
}
3518+
return ret > 0 ? ret * 8 : 0;
34893519
}
34903520

34913521

@@ -3692,12 +3722,11 @@ int wolfSSL_EVP_PKEY_keygen(WOLFSSL_EVP_PKEY_CTX *ctx,
36923722
return ret;
36933723
}
36943724

3695-
/* Get the size in bytes for WOLFSSL_EVP_PKEY key
3725+
/* Get the maximum suitable size for the operations that can be done with pkey
36963726
*
36973727
* pkey WOLFSSL_EVP_PKEY structure to get key size of
36983728
*
3699-
* returns the size of a key on success which is the maximum size of a
3700-
* signature
3729+
* returns the recommended size of buffers
37013730
*/
37023731
int wolfSSL_EVP_PKEY_size(WOLFSSL_EVP_PKEY *pkey)
37033732
{
@@ -3725,7 +3754,7 @@ int wolfSSL_EVP_PKEY_size(WOLFSSL_EVP_PKEY *pkey)
37253754
WOLFSSL_MSG("No ECC key has been set");
37263755
break;
37273756
}
3728-
return wc_ecc_size((ecc_key*)(pkey->ecc->internal));
3757+
return wc_ecc_sig_size((ecc_key*)(pkey->ecc->internal));
37293758
#endif /* HAVE_ECC */
37303759

37313760
default:
@@ -3894,7 +3923,6 @@ int wolfSSL_EVP_PKEY_missing_parameters(WOLFSSL_EVP_PKEY *pkey)
38943923
int wolfSSL_EVP_PKEY_cmp(const WOLFSSL_EVP_PKEY *a, const WOLFSSL_EVP_PKEY *b)
38953924
{
38963925
int ret = -1; /* failure */
3897-
int a_sz = 0, b_sz = 0;
38983926

38993927
if (a == NULL || b == NULL)
39003928
return WS_RETURN_CODE(ret, WOLFSSL_FAILURE);
@@ -3907,40 +3935,47 @@ int wolfSSL_EVP_PKEY_cmp(const WOLFSSL_EVP_PKEY *a, const WOLFSSL_EVP_PKEY *b)
39073935
switch (a->type) {
39083936
#ifndef NO_RSA
39093937
case WC_EVP_PKEY_RSA:
3910-
a_sz = (int)wolfSSL_RSA_size((const WOLFSSL_RSA*)(a->rsa));
3911-
b_sz = (int)wolfSSL_RSA_size((const WOLFSSL_RSA*)(b->rsa));
3938+
if (wolfSSL_RSA_size((const WOLFSSL_RSA*)(a->rsa)) <= 0 ||
3939+
wolfSSL_RSA_size((const WOLFSSL_RSA*)(b->rsa)) <= 0) {
3940+
return WS_RETURN_CODE(ret, WOLFSSL_FAILURE);
3941+
}
3942+
3943+
if (mp_cmp(&((RsaKey*)a->rsa->internal)->n,
3944+
&((RsaKey*)b->rsa->internal)->n) != MP_EQ) {
3945+
return WS_RETURN_CODE(ret, WOLFSSL_FAILURE);
3946+
}
3947+
3948+
if (mp_cmp(&((RsaKey*)a->rsa->internal)->e,
3949+
&((RsaKey*)b->rsa->internal)->e) != MP_EQ) {
3950+
return WS_RETURN_CODE(ret, WOLFSSL_FAILURE);
3951+
}
39123952
break;
39133953
#endif /* !NO_RSA */
39143954
#ifdef HAVE_ECC
39153955
case WC_EVP_PKEY_EC:
39163956
if (a->ecc == NULL || a->ecc->internal == NULL ||
3917-
b->ecc == NULL || b->ecc->internal == NULL) {
3957+
b->ecc == NULL || b->ecc->internal == NULL ||
3958+
wc_ecc_size((ecc_key*)a->ecc->internal) <= 0 ||
3959+
wc_ecc_size((ecc_key*)b->ecc->internal) <= 0 ||
3960+
a->ecc->group == NULL || b->ecc->group == NULL) {
39183961
return ret;
39193962
}
3920-
a_sz = wc_ecc_size((ecc_key*)(a->ecc->internal));
3921-
b_sz = wc_ecc_size((ecc_key*)(b->ecc->internal));
3963+
3964+
/* check curve */
3965+
if (a->ecc->group->curve_idx != b->ecc->group->curve_idx) {
3966+
return WS_RETURN_CODE(ret, WOLFSSL_FAILURE);
3967+
}
3968+
3969+
if (wc_ecc_cmp_point(&((ecc_key*)a->ecc->internal)->pubkey,
3970+
&((ecc_key*)b->ecc->internal)->pubkey) != 0) {
3971+
return WS_RETURN_CODE(ret, WOLFSSL_FAILURE);
3972+
}
39223973
break;
39233974
#endif /* HAVE_ECC */
39243975
default:
39253976
return WS_RETURN_CODE(ret, -2);
39263977
} /* switch (a->type) */
39273978

3928-
/* check size */
3929-
if (a_sz <= 0 || b_sz <= 0 || a_sz != b_sz) {
3930-
return WS_RETURN_CODE(ret, WOLFSSL_FAILURE);
3931-
}
3932-
3933-
/* check public key size */
3934-
if (a->pkey_sz > 0 && b->pkey_sz > 0 && a->pkey_sz != b->pkey_sz) {
3935-
return WS_RETURN_CODE(ret, WOLFSSL_FAILURE);
3936-
}
3937-
3938-
/* check public key */
3939-
if (a->pkey.ptr && b->pkey.ptr) {
3940-
if (XMEMCMP(a->pkey.ptr, b->pkey.ptr, (size_t)a->pkey_sz) != 0) {
3941-
return WS_RETURN_CODE(ret, WOLFSSL_FAILURE);
3942-
}
3943-
}
39443979
#if defined(WOLFSSL_ERROR_CODE_OPENSSL)
39453980
ret = 1; /* the keys match */
39463981
#else
@@ -4802,7 +4837,9 @@ int wolfSSL_EVP_DigestSignFinal(WOLFSSL_EVP_MD_CTX *ctx, unsigned char *sig,
48024837
ctx->pctx->pkey->ecc);
48034838
if (ecdsaSig == NULL)
48044839
break;
4805-
len = wolfSSL_i2d_ECDSA_SIG(ecdsaSig, &sig);
4840+
len = wolfSSL_i2d_ECDSA_SIG(ecdsaSig, NULL);
4841+
if (len > 0 && (size_t)len <= *siglen)
4842+
len = wolfSSL_i2d_ECDSA_SIG(ecdsaSig, &sig);
48064843
wolfSSL_ECDSA_SIG_free(ecdsaSig);
48074844
if (len == 0)
48084845
break;
@@ -12468,7 +12505,7 @@ int wolfSSL_EVP_PKEY_print_public(WOLFSSL_BIO* out,
1246812505
case WC_EVP_PKEY_RSA:
1246912506

1247012507
#if !defined(NO_RSA)
12471-
keybits = wolfSSL_EVP_PKEY_size((WOLFSSL_EVP_PKEY*)pkey) * 8;
12508+
keybits = wolfSSL_EVP_PKEY_bits((WOLFSSL_EVP_PKEY*)pkey);
1247212509
res = PrintPubKeyRSA(
1247312510
out,
1247412511
(byte*)(pkey->pkey.ptr), /* buffer for pkey raw data */
@@ -12484,7 +12521,7 @@ int wolfSSL_EVP_PKEY_print_public(WOLFSSL_BIO* out,
1248412521
case WC_EVP_PKEY_EC:
1248512522

1248612523
#if defined(HAVE_ECC)
12487-
keybits = wolfSSL_EVP_PKEY_size((WOLFSSL_EVP_PKEY*)pkey) * 8;
12524+
keybits = wolfSSL_EVP_PKEY_bits((WOLFSSL_EVP_PKEY*)pkey);
1248812525
res = PrintPubKeyEC(
1248912526
out,
1249012527
(byte*)(pkey->pkey.ptr), /* buffer for pkey raw data */
@@ -12500,7 +12537,7 @@ int wolfSSL_EVP_PKEY_print_public(WOLFSSL_BIO* out,
1250012537
case WC_EVP_PKEY_DSA:
1250112538

1250212539
#if !defined(NO_DSA)
12503-
keybits = wolfSSL_EVP_PKEY_size((WOLFSSL_EVP_PKEY*)pkey) * 8;
12540+
keybits = wolfSSL_EVP_PKEY_bits((WOLFSSL_EVP_PKEY*)pkey);
1250412541
res = PrintPubKeyDSA(
1250512542
out,
1250612543
(byte*)(pkey->pkey.ptr), /* buffer for pkey raw data */
@@ -12516,7 +12553,7 @@ int wolfSSL_EVP_PKEY_print_public(WOLFSSL_BIO* out,
1251612553
case WC_EVP_PKEY_DH:
1251712554

1251812555
#if defined(WOLFSSL_DH_EXTRA)
12519-
keybits = wolfSSL_EVP_PKEY_size((WOLFSSL_EVP_PKEY*)pkey) * 8;
12556+
keybits = wolfSSL_EVP_PKEY_bits((WOLFSSL_EVP_PKEY*)pkey);
1252012557
res = PrintPubKeyDH(
1252112558
out,
1252212559
(byte*)(pkey->pkey.ptr), /* buffer for pkey raw data */

0 commit comments

Comments
 (0)