Skip to content

Commit a7b2323

Browse files
authored
Fix RSA PSS saltlen handling (#308)
* Fix RSA PSS saltlen handling * Only use RSA_PSS_SALTLEN_AUTO_DIGEST_MAX if defined, dont run tests for older versions of openssl * Fix auto saltlen when WOLFSSL_PSS_SALT_LEN_DISCOVER is not defined
1 parent c7b166e commit a7b2323

File tree

8 files changed

+366
-111
lines changed

8 files changed

+366
-111
lines changed

src/wp_rsa_kmgmt.c

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -415,8 +415,12 @@ static int wp_rsagen_check_key_size(wp_RsaGenCtx* rsagen)
415415
*/
416416
void wp_rsa_get_pss_mds(wp_Rsa* rsa, char** mdName, char** mgfMdName)
417417
{
418-
*mdName = rsa->pssParams.mdName;
419-
*mgfMdName = rsa->pssParams.mgfMdName;
418+
if (mdName != NULL) {
419+
*mdName = rsa->pssParams.mdName;
420+
}
421+
if (mgfMdName != NULL) {
422+
*mgfMdName = rsa->pssParams.mgfMdName;
423+
}
420424
}
421425

422426
/**

src/wp_rsa_sig.c

Lines changed: 28 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -118,14 +118,24 @@ static int wp_rsa_setup_md(wp_RsaSigCtx* ctx, const char* mdName,
118118
const char* mdProps, int op)
119119
{
120120
int ok = 1;
121+
char *localMdName = NULL;
121122

122123
WOLFPROV_ENTER(WP_LOG_RSA, "wp_rsa_setup_md");
123124

124125
if (mdProps == NULL) {
125126
mdProps = ctx->propQuery;
126127
}
127128

128-
if (mdName != NULL) {
129+
/* For PSS restricted mode, not allowed to set new MD */
130+
if (ctx->padMode == RSA_PKCS1_PSS_PADDING && ctx->minSaltLen != -1) {
131+
wp_rsa_get_pss_mds(ctx->rsa, &localMdName, NULL);
132+
if (mdName != NULL &&
133+
XSTRNCASECMP(localMdName, mdName, XSTRLEN(localMdName)) != 0) {
134+
ok = 0;
135+
}
136+
}
137+
138+
if (ok && mdName != NULL) {
129139
int rc;
130140
enum wc_HashType hashType;
131141

@@ -381,7 +391,10 @@ static int wp_pss_salt_len_to_wc(int saltLen, enum wc_HashType hashType,
381391
}
382392
else if (saltLen == RSA_PSS_SALTLEN_AUTO) {
383393
#ifndef WOLFSSL_PSS_SALT_LEN_DISCOVER
384-
saltLen = wc_HashGetDigestSize(hashType);
394+
saltLen = wc_RsaEncryptSize(key) - wc_HashGetDigestSize(hashType) - 2;
395+
if (((mp_count_bits(&key->n) - 1) & 0x7) == 0) {
396+
saltLen--;
397+
}
385398
#else
386399
saltLen = RSA_PSS_SALT_LEN_DISCOVER;
387400
#endif
@@ -462,6 +475,7 @@ static int wp_rsa_signverify_init(wp_RsaSigCtx* ctx, wp_Rsa* rsa,
462475
const OSSL_PARAM params[], int op)
463476
{
464477
int ok = 1;
478+
int saltLen = 0;
465479

466480
WOLFPROV_ENTER(WP_LOG_RSA, "wp_rsa_signverify_init");
467481

@@ -498,6 +512,13 @@ static int wp_rsa_signverify_init(wp_RsaSigCtx* ctx, wp_Rsa* rsa,
498512
ctx->saltLen = WP_RSA_DEFAULT_SALT_LEN;
499513
#endif
500514
ctx->minSaltLen = 0;
515+
516+
/* If we have already set PSS salt len, use that */
517+
saltLen = wp_rsa_get_pss_salt_len(ctx->rsa);
518+
if (saltLen != 0) {
519+
ctx->saltLen = saltLen;
520+
ctx->minSaltLen = saltLen;
521+
}
501522
}
502523
else {
503524
char* mdName;
@@ -2142,8 +2163,13 @@ static int wp_rsa_set_salt_len(wp_RsaSigCtx* ctx, const OSSL_PARAM* p)
21422163
else {
21432164
ok = 0;
21442165
}
2166+
#ifdef RSA_PSS_SALTLEN_AUTO_DIGEST_MAX
2167+
/* RSA_PSS_SALTLEN_AUTO_DIGEST_MAX is the smallest negative value supported. */
2168+
if (ok && (ctx->saltLen < RSA_PSS_SALTLEN_AUTO_DIGEST_MAX)) {
2169+
#else
21452170
/* RSA_PSS_SALTLEN_MAX is the smallest negative value supported. */
21462171
if (ok && (ctx->saltLen < RSA_PSS_SALTLEN_MAX)) {
2172+
#endif
21472173
ok = 0;
21482174
}
21492175
if (ok && (ctx->saltLen >= 0) && (ctx->saltLen < ctx->minSaltLen)) {

test/test_ecc.c

Lines changed: 45 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -1253,28 +1253,28 @@ int test_ecdsa_p192(void *data)
12531253
if (err == 0) {
12541254
PRINT_MSG("Sign with OpenSSL");
12551255
ecdsaSigLen = sizeof(ecdsaSig);
1256-
err = test_digest_sign(pkey, osslLibCtx, buf, sizeof(buf), md,
1257-
ecdsaSig, &ecdsaSigLen, 0);
1256+
err = test_digest_sign(pkey, osslLibCtx, buf, sizeof(buf), md, NULL,
1257+
ecdsaSig, &ecdsaSigLen, 0, 0);
12581258
}
12591259
if (err == 0) {
12601260
PRINT_MSG("Verify with wolfprovider");
1261-
err = test_digest_verify(pkey, wpLibCtx, buf, sizeof(buf), md,
1262-
ecdsaSig, ecdsaSigLen, 0);
1261+
err = test_digest_verify(pkey, wpLibCtx, buf, sizeof(buf), md, NULL,
1262+
ecdsaSig, ecdsaSigLen, 0, 0);
12631263
}
12641264
if (err == 0) {
12651265
PRINT_MSG("Verify bad signature with wolfprovider");
12661266
ecdsaSig[1] ^= 0x80;
1267-
res = test_digest_verify(pkey, wpLibCtx, buf, sizeof(buf), md,
1268-
ecdsaSig, ecdsaSigLen, 0);
1267+
res = test_digest_verify(pkey, wpLibCtx, buf, sizeof(buf), md, NULL,
1268+
ecdsaSig, ecdsaSigLen, 0, 0);
12691269
if (res != 1)
12701270
err = 1;
12711271
}
12721272

12731273
if (err == 0) {
12741274
PRINT_MSG("Sign with wolfprovider");
12751275
ecdsaSigLen = sizeof(ecdsaSig);
1276-
err = test_digest_sign(pkey, wpLibCtx, buf, sizeof(buf), md,
1277-
ecdsaSig, &ecdsaSigLen, 0);
1276+
err = test_digest_sign(pkey, wpLibCtx, buf, sizeof(buf), md, NULL,
1277+
ecdsaSig, &ecdsaSigLen, 0, 0);
12781278
#if defined(HAVE_FIPS) || defined(HAVE_FIPS_VERSION)
12791279
err = err != 1;
12801280
if (err == 0) {
@@ -1289,8 +1289,8 @@ int test_ecdsa_p192(void *data)
12891289
}
12901290
if (err == 0) {
12911291
PRINT_MSG("Verify with OpenSSL");
1292-
err = test_digest_verify(pkey, osslLibCtx, buf, sizeof(buf), md,
1293-
ecdsaSig, ecdsaSigLen, 0);
1292+
err = test_digest_verify(pkey, osslLibCtx, buf, sizeof(buf), md, NULL,
1293+
ecdsaSig, ecdsaSigLen, 0, 0);
12941294
}
12951295
#endif /* HAVE_FIPS || HAVE_FIPS_VERSION */
12961296

@@ -1326,32 +1326,32 @@ int test_ecdsa_p224(void *data)
13261326
if (err == 0) {
13271327
PRINT_MSG("Sign with OpenSSL");
13281328
ecdsaSigLen = sizeof(ecdsaSig);
1329-
err = test_digest_sign(pkey, osslLibCtx, buf, sizeof(buf), md,
1330-
ecdsaSig, &ecdsaSigLen, 0);
1329+
err = test_digest_sign(pkey, osslLibCtx, buf, sizeof(buf), md, NULL,
1330+
ecdsaSig, &ecdsaSigLen, 0, 0);
13311331
}
13321332
if (err == 0) {
13331333
PRINT_MSG("Verify with wolfprovider");
1334-
err = test_digest_verify(pkey, wpLibCtx, buf, sizeof(buf), md,
1335-
ecdsaSig, ecdsaSigLen, 0);
1334+
err = test_digest_verify(pkey, wpLibCtx, buf, sizeof(buf), md, NULL,
1335+
ecdsaSig, ecdsaSigLen, 0, 0);
13361336
}
13371337
if (err == 0) {
13381338
PRINT_MSG("Verify bad signature with wolfprovider");
13391339
ecdsaSig[1] ^= 0x80;
1340-
res = test_digest_verify(pkey, wpLibCtx, buf, sizeof(buf), md,
1341-
ecdsaSig, ecdsaSigLen, 0);
1340+
res = test_digest_verify(pkey, wpLibCtx, buf, sizeof(buf), md, NULL,
1341+
ecdsaSig, ecdsaSigLen, 0, 0);
13421342
if (res != 1)
13431343
err = 1;
13441344
}
13451345
if (err == 0) {
13461346
PRINT_MSG("Sign with wolfprovider");
13471347
ecdsaSigLen = sizeof(ecdsaSig);
1348-
err = test_digest_sign(pkey, wpLibCtx, buf, sizeof(buf), md,
1349-
ecdsaSig, &ecdsaSigLen, 0);
1348+
err = test_digest_sign(pkey, wpLibCtx, buf, sizeof(buf), md, NULL,
1349+
ecdsaSig, &ecdsaSigLen, 0, 0);
13501350
}
13511351
if (err == 0) {
13521352
PRINT_MSG("Verify with OpenSSL");
1353-
err = test_digest_verify(pkey, osslLibCtx, buf, sizeof(buf), md,
1354-
ecdsaSig, ecdsaSigLen, 0);
1353+
err = test_digest_verify(pkey, osslLibCtx, buf, sizeof(buf), md, NULL,
1354+
ecdsaSig, ecdsaSigLen, 0, 0);
13551355
}
13561356

13571357
EVP_PKEY_free(pkey);
@@ -1382,31 +1382,31 @@ int test_ecdsa_p256(void *data)
13821382
PRINT_MSG("Sign with OpenSSL");
13831383
ecdsaSigLen = sizeof(ecdsaSig);
13841384
err = test_digest_sign(pkey, osslLibCtx, buf, sizeof(buf), "SHA-256",
1385-
ecdsaSig, &ecdsaSigLen, 0);
1385+
NULL, ecdsaSig, &ecdsaSigLen, 0, 0);
13861386
}
13871387
if (err == 0) {
13881388
PRINT_MSG("Verify with wolfprovider");
13891389
err = test_digest_verify(pkey, wpLibCtx, buf, sizeof(buf), "SHA-256",
1390-
ecdsaSig, ecdsaSigLen, 0);
1390+
NULL, ecdsaSig, ecdsaSigLen, 0, 0);
13911391
}
13921392
if (err == 0) {
13931393
PRINT_MSG("Verify bad signature with wolfprovider");
13941394
ecdsaSig[1] ^= 0x80;
13951395
res = test_digest_verify(pkey, wpLibCtx, buf, sizeof(buf), "SHA-256",
1396-
ecdsaSig, ecdsaSigLen, 0);
1396+
NULL, ecdsaSig, ecdsaSigLen, 0, 0);
13971397
if (res != 1)
13981398
err = 1;
13991399
}
14001400
if (err == 0) {
14011401
PRINT_MSG("Sign with wolfprovider");
14021402
ecdsaSigLen = sizeof(ecdsaSig);
14031403
err = test_digest_sign(pkey, wpLibCtx, buf, sizeof(buf), "SHA-256",
1404-
ecdsaSig, &ecdsaSigLen, 0);
1404+
NULL, ecdsaSig, &ecdsaSigLen, 0, 0);
14051405
}
14061406
if (err == 0) {
14071407
PRINT_MSG("Verify with OpenSSL");
14081408
err = test_digest_verify(pkey, osslLibCtx, buf, sizeof(buf), "SHA-256",
1409-
ecdsaSig, ecdsaSigLen, 0);
1409+
NULL, ecdsaSig, ecdsaSigLen, 0, 0);
14101410
}
14111411

14121412
EVP_PKEY_free(pkey);
@@ -1441,32 +1441,32 @@ int test_ecdsa_p384(void *data)
14411441
if (err == 0) {
14421442
PRINT_MSG("Sign with OpenSSL");
14431443
ecdsaSigLen = sizeof(ecdsaSig);
1444-
err = test_digest_sign(pkey, osslLibCtx, buf, sizeof(buf), md,
1445-
ecdsaSig, &ecdsaSigLen, 0);
1444+
err = test_digest_sign(pkey, osslLibCtx, buf, sizeof(buf), md, NULL,
1445+
ecdsaSig, &ecdsaSigLen, 0, 0);
14461446
}
14471447
if (err == 0) {
14481448
PRINT_MSG("Verify with wolfprovider");
1449-
err = test_digest_verify(pkey, wpLibCtx, buf, sizeof(buf), md,
1450-
ecdsaSig, ecdsaSigLen, 0);
1449+
err = test_digest_verify(pkey, wpLibCtx, buf, sizeof(buf), md, NULL,
1450+
ecdsaSig, ecdsaSigLen, 0, 0);
14511451
}
14521452
if (err == 0) {
14531453
PRINT_MSG("Verify bad signature with wolfprovider");
14541454
ecdsaSig[1] ^= 0x80;
1455-
res = test_digest_verify(pkey, wpLibCtx, buf, sizeof(buf), md,
1456-
ecdsaSig, ecdsaSigLen, 0);
1455+
res = test_digest_verify(pkey, wpLibCtx, buf, sizeof(buf), md, NULL,
1456+
ecdsaSig, ecdsaSigLen, 0, 0);
14571457
if (res != 1)
14581458
err = 1;
14591459
}
14601460
if (err == 0) {
14611461
PRINT_MSG("Sign with wolfprovider");
14621462
ecdsaSigLen = sizeof(ecdsaSig);
1463-
err = test_digest_sign(pkey, wpLibCtx, buf, sizeof(buf), md,
1464-
ecdsaSig, &ecdsaSigLen, 0);
1463+
err = test_digest_sign(pkey, wpLibCtx, buf, sizeof(buf), md, NULL,
1464+
ecdsaSig, &ecdsaSigLen, 0, 0);
14651465
}
14661466
if (err == 0) {
14671467
PRINT_MSG("Verify with OpenSSL");
1468-
err = test_digest_verify(pkey, osslLibCtx, buf, sizeof(buf), md,
1469-
ecdsaSig, ecdsaSigLen, 0);
1468+
err = test_digest_verify(pkey, osslLibCtx, buf, sizeof(buf), md, NULL,
1469+
ecdsaSig, ecdsaSigLen, 0, 0);
14701470
}
14711471

14721472
EVP_PKEY_free(pkey);
@@ -1501,32 +1501,32 @@ int test_ecdsa_p521(void *data)
15011501
if (err == 0) {
15021502
PRINT_MSG("Sign with OpenSSL");
15031503
ecdsaSigLen = sizeof(ecdsaSig);
1504-
err = test_digest_sign(pkey, osslLibCtx, buf, sizeof(buf), md,
1505-
ecdsaSig, &ecdsaSigLen, 0);
1504+
err = test_digest_sign(pkey, osslLibCtx, buf, sizeof(buf), md, NULL,
1505+
ecdsaSig, &ecdsaSigLen, 0, 0);
15061506
}
15071507
if (err == 0) {
15081508
PRINT_MSG("Verify with wolfprovider");
1509-
err = test_digest_verify(pkey, wpLibCtx, buf, sizeof(buf), md,
1510-
ecdsaSig, ecdsaSigLen, 0);
1509+
err = test_digest_verify(pkey, wpLibCtx, buf, sizeof(buf), md, NULL,
1510+
ecdsaSig, ecdsaSigLen, 0, 0);
15111511
}
15121512
if (err == 0) {
15131513
PRINT_MSG("Verify bad signature with wolfprovider");
15141514
ecdsaSig[1] ^= 0x80;
1515-
res = test_digest_verify(pkey, wpLibCtx, buf, sizeof(buf), md,
1516-
ecdsaSig, ecdsaSigLen, 0);
1515+
res = test_digest_verify(pkey, wpLibCtx, buf, sizeof(buf), md, NULL,
1516+
ecdsaSig, ecdsaSigLen, 0, 0);
15171517
if (res != 1)
15181518
err = 1;
15191519
}
15201520
if (err == 0) {
15211521
PRINT_MSG("Sign with wolfprovider");
15221522
ecdsaSigLen = sizeof(ecdsaSig);
1523-
err = test_digest_sign(pkey, wpLibCtx, buf, sizeof(buf), md,
1524-
ecdsaSig, &ecdsaSigLen, 0);
1523+
err = test_digest_sign(pkey, wpLibCtx, buf, sizeof(buf), md, NULL,
1524+
ecdsaSig, &ecdsaSigLen, 0, 0);
15251525
}
15261526
if (err == 0) {
15271527
PRINT_MSG("Verify with OpenSSL");
1528-
err = test_digest_verify(pkey, osslLibCtx, buf, sizeof(buf), md,
1529-
ecdsaSig, ecdsaSigLen, 0);
1528+
err = test_digest_verify(pkey, osslLibCtx, buf, sizeof(buf), md, NULL,
1529+
ecdsaSig, ecdsaSigLen, 0, 0);
15301530
}
15311531

15321532
EVP_PKEY_free(pkey);

test/test_ecx.c

Lines changed: 17 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -107,29 +107,29 @@ static int sign_verify(unsigned char* sig, size_t sigLen,
107107

108108
if (err == 0) {
109109
PRINT_MSG("Sign with OpenSSL (%s)", name);
110-
err = test_digest_sign(pkey, osslLibCtx, buf, bufLen, NULL,
111-
sig, &sigLen, 0);
110+
err = test_digest_sign(pkey, osslLibCtx, buf, bufLen, NULL, NULL, sig,
111+
&sigLen, 0, 0);
112112
}
113113
if (err == 0) {
114114
PRINT_MSG("Verify with WolfProvider (%s)", name);
115-
err = test_digest_verify(pkey, wpLibCtx, buf, bufLen, NULL,
116-
sig, sigLen, 0);
115+
err = test_digest_verify(pkey, wpLibCtx, buf, bufLen, NULL, NULL, sig,
116+
sigLen, 0, 0);
117117
}
118118
if (err == 0) {
119119
PRINT_MSG("Verify bad signature with WolfProvider (%s)", name);
120120
sig[1] ^= 0x80;
121-
err = test_digest_verify(pkey, wpLibCtx, buf, bufLen, NULL,
122-
sig, sigLen, 0) != 1;
121+
err = test_digest_verify(pkey, wpLibCtx, buf, bufLen, NULL, NULL, sig,
122+
sigLen, 0, 0) != 1;
123123
}
124124
if (err == 0) {
125125
PRINT_MSG("Sign with WolfProvider (%s)", name);
126-
err = test_digest_sign(pkey, wpLibCtx, buf, bufLen, NULL,
127-
sig, &sigLen, 0);
126+
err = test_digest_sign(pkey, wpLibCtx, buf, bufLen, NULL, NULL, sig,
127+
&sigLen, 0, 0);
128128
}
129129
if (err == 0) {
130130
PRINT_MSG("Verify with OpenSSL (%s)", name);
131-
err = test_digest_verify(pkey, osslLibCtx, buf, bufLen, NULL,
132-
sig, sigLen, 0);
131+
err = test_digest_verify(pkey, osslLibCtx, buf, bufLen, NULL, NULL, sig,
132+
sigLen, 0, 0);
133133
}
134134

135135
return err;
@@ -409,7 +409,7 @@ int test_ecx_sign_verify_raw_pub(void *data)
409409
if (err == 0) {
410410
PRINT_MSG("Sign with OpenSSL (%s)", types[i].name);
411411
err = test_digest_sign(pkey_der, osslLibCtx, buf, bufLen, NULL,
412-
types[i].sig, &types[i].sigLen, 0);
412+
NULL, types[i].sig, &types[i].sigLen, 0, 0);
413413
}
414414

415415
/* Create keys from the public byte arrays */
@@ -489,25 +489,27 @@ int test_ecx_sign_verify_raw_pub(void *data)
489489
if (err == 0) {
490490
PRINT_MSG("Verify with OpenSSL (%s)", types[i].name);
491491
err = test_digest_verify(pkey_ossl, osslLibCtx, buf, bufLen, NULL,
492-
types[i].sig, types[i].sigLen, 0);
492+
NULL, types[i].sig, types[i].sigLen, 0, 0);
493493
}
494494
if (err == 0) {
495495
PRINT_MSG("Verify with WolfProvider (%s)", types[i].name);
496496
err = test_digest_verify(pkey_wolf, wpLibCtx, buf, bufLen, NULL,
497-
types[i].sig, types[i].sigLen, 0);
497+
NULL, types[i].sig, types[i].sigLen, 0, 0);
498498
}
499499

500500
/* Verify bad signature with the public keys */
501501
types[i].sig[1] ^= 0x80;
502502
if (err == 0) {
503503
PRINT_MSG("Verify bad signature with OpenSSL (%s)", types[i].name);
504504
err = test_digest_verify(pkey_ossl, osslLibCtx, buf, bufLen, NULL,
505-
types[i].sig, types[i].sigLen, 0) != 1;
505+
NULL, types[i].sig, types[i].sigLen,
506+
0, 0) != 1;
506507
}
507508
if (err == 0) {
508509
PRINT_MSG("Verify bad signature with WolfProvider (%s)", types[i].name);
509510
err = test_digest_verify(pkey_wolf, wpLibCtx, buf, bufLen, NULL,
510-
types[i].sig, types[i].sigLen, 0) != 1;
511+
NULL, types[i].sig, types[i].sigLen,
512+
0, 0) != 1;
511513
}
512514

513515
EVP_PKEY_free(pkey_der);

0 commit comments

Comments
 (0)