Skip to content

Commit ccc7308

Browse files
authored
Merge pull request #84 from ColtonWilley/wp_rsa_verify_recover
Initial implementation of PKCS1 only rsa verify recover
2 parents bb27889 + d0e30e0 commit ccc7308

5 files changed

Lines changed: 152 additions & 9 deletions

File tree

src/wp_rsa_sig.c

Lines changed: 27 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1365,17 +1365,35 @@ static int wp_rsa_verify_recover_init(wp_RsaSigCtx* ctx, wp_Rsa* rsa,
13651365
* @return 1 on success.
13661366
* @return 0 on failure.
13671367
*/
1368-
static int wp_rsa_verify_recover(wp_RsaSigCtx* ctx, const unsigned char* rout,
1368+
static int wp_rsa_verify_recover(wp_RsaSigCtx* ctx, unsigned char* rout,
13691369
size_t* routlen, size_t routsize, const unsigned char* sig, size_t sigLen)
13701370
{
1371-
/* TODO: implement */
1372-
(void)ctx;
1373-
(void)rout;
1374-
(void)routlen;
1375-
(void)routsize;
1376-
(void)sig;
1377-
(void)sigLen;
1378-
return 0;
1371+
int rc;
1372+
int ok = 1;
1373+
1374+
if ((ctx == NULL) || (rout == NULL) || (routlen == NULL) || (sig == NULL)) {
1375+
ok = 0;
1376+
}
1377+
1378+
/* Only PKCS1 supported for now */
1379+
if (ok && (ctx->padMode != RSA_PKCS1_PADDING)) {
1380+
WOLFPROV_ERROR_MSG(WP_LOG_PK, "Only PKCS1 padding supported"
1381+
" for verify recover");
1382+
ok = 0;
1383+
}
1384+
1385+
if (ok) {
1386+
rc = wc_RsaSSL_Verify(sig, (word32)sigLen, rout, (word32)routsize,
1387+
wp_rsa_get_key(ctx->rsa));
1388+
if (rc < 0) {
1389+
ok = 0;
1390+
}
1391+
}
1392+
if (ok) {
1393+
*routlen = (size_t)rc;
1394+
}
1395+
1396+
return ok;
13791397
}
13801398

13811399
/**

test/test_pkey.c

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -162,6 +162,42 @@ int test_pkey_verify(EVP_PKEY *pkey, OSSL_LIB_CTX* libCtx, unsigned char *hash,
162162
return err;
163163
}
164164

165+
int test_pkey_verify_recover(EVP_PKEY *pkey, OSSL_LIB_CTX* libCtx, unsigned char *hash,
166+
size_t hashLen, unsigned char *sig, size_t sigLen, int padMode)
167+
{
168+
int err;
169+
EVP_PKEY_CTX *ctx = NULL;
170+
unsigned char rout[512];
171+
size_t routLen = 512;
172+
173+
err = (ctx = EVP_PKEY_CTX_new_from_pkey(libCtx, pkey, NULL)) == NULL;
174+
if (err == 0) {
175+
err = EVP_PKEY_verify_recover_init(ctx) != 1;
176+
}
177+
if ((err == 0) && padMode) {
178+
err = EVP_PKEY_CTX_set_rsa_padding(ctx, padMode) <= 0;
179+
}
180+
if (err == 0) {
181+
err = EVP_PKEY_verify_recover(ctx, rout, &routLen, sig, sigLen) != 1;
182+
}
183+
if (err == 0) {
184+
if ((routLen != hashLen) ||
185+
(memcmp(rout, hash, hashLen) != 0)) {
186+
err = 1;
187+
}
188+
}
189+
if (err == 0) {
190+
PRINT_MSG("Signature verified");
191+
}
192+
else {
193+
PRINT_MSG("Signature not verified");
194+
}
195+
196+
EVP_PKEY_CTX_free(ctx);
197+
198+
return err;
199+
}
200+
165201
int test_pkey_enc(EVP_PKEY *pkey, OSSL_LIB_CTX* libCtx, unsigned char *msg,
166202
size_t msgLen, unsigned char *ciphertext, size_t cipherLen, int padMode,
167203
const EVP_MD *rsaMd, const EVP_MD *rsaMgf1Md)

test/test_rsa.c

Lines changed: 85 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -361,6 +361,84 @@ static int test_rsa_sign_verify_pad(int padMode, const EVP_MD *md,
361361
return err;
362362
}
363363

364+
365+
static int test_rsa_sign_verify_recover(int padMode)
366+
{
367+
int err;
368+
int res;
369+
EVP_PKEY *pkey = NULL;
370+
#if OPENSSL_VERSION_NUMBER >= 0x30000000L
371+
const RSA *rsaKey = NULL;
372+
#else
373+
RSA *rsaKey = NULL;
374+
#endif
375+
unsigned char *rsaSig = NULL;
376+
size_t rsaSigLen = 0;
377+
size_t bufLen = 20;
378+
unsigned char *buf = NULL;
379+
const unsigned char *p = rsa_key_der_2048;
380+
381+
PRINT_MSG("Load RSA key");
382+
pkey = d2i_PrivateKey(EVP_PKEY_RSA, NULL, &p, sizeof(rsa_key_der_2048));
383+
err = pkey == NULL;
384+
if (err == 0) {
385+
rsaKey = EVP_PKEY_get0_RSA(pkey);
386+
err = rsaKey == NULL;
387+
}
388+
if (err == 0) {
389+
rsaSigLen = RSA_size(rsaKey);
390+
rsaSig = (unsigned char*)OPENSSL_malloc(rsaSigLen);
391+
err = rsaSig == NULL;
392+
}
393+
if (err == 0) {
394+
buf = (unsigned char *)OPENSSL_malloc(bufLen);
395+
err = buf == NULL;
396+
}
397+
if (err == 0) {
398+
err = RAND_bytes(buf, (int)bufLen) == 0;
399+
}
400+
401+
if (err == 0) {
402+
PRINT_MSG("Test signing/verifying arbitrary data");
403+
PRINT_MSG("Sign with OpenSSL");
404+
err = test_pkey_sign(pkey, osslLibCtx, buf, bufLen, rsaSig, &rsaSigLen,
405+
padMode, NULL, NULL);
406+
}
407+
if (err == 0) {
408+
PRINT_MSG("Verify with wolfprovider");
409+
err = test_pkey_verify_recover(pkey, wpLibCtx, buf, bufLen, rsaSig, rsaSigLen,
410+
padMode);
411+
}
412+
if (err == 0) {
413+
PRINT_MSG("Verify bad signature with wolfprovider");
414+
rsaSig[1] ^= 0x80;
415+
res = test_pkey_verify_recover(pkey, wpLibCtx, buf, bufLen, rsaSig, rsaSigLen,
416+
padMode);
417+
if (res != 1)
418+
err = 1;
419+
}
420+
if (err == 0) {
421+
PRINT_MSG("Sign with wolfprovider");
422+
rsaSigLen = RSA_size(rsaKey);
423+
err = test_pkey_sign(pkey, wpLibCtx, buf, bufLen, rsaSig, &rsaSigLen,
424+
padMode, NULL, NULL);
425+
}
426+
if (err == 0) {
427+
PRINT_MSG("Verify with OpenSSL");
428+
err = test_pkey_verify_recover(pkey, osslLibCtx, buf, bufLen, rsaSig, rsaSigLen,
429+
padMode);
430+
}
431+
432+
EVP_PKEY_free(pkey);
433+
434+
if (rsaSig)
435+
OPENSSL_free(rsaSig);
436+
if (buf)
437+
OPENSSL_free(buf);
438+
439+
return err;
440+
}
441+
364442
int test_rsa_sign_sha1(void *data)
365443
{
366444
int err = 0;
@@ -429,6 +507,13 @@ int test_rsa_sign_verify_pkcs1(void *data)
429507
return test_rsa_sign_verify_pad(RSA_PKCS1_PADDING, NULL, NULL);
430508
}
431509

510+
int test_rsa_sign_verify_recover_pkcs1(void *data)
511+
{
512+
(void)data;
513+
514+
return test_rsa_sign_verify_recover(RSA_PKCS1_PADDING);
515+
}
516+
432517
int test_rsa_sign_verify_pss(void *data)
433518
{
434519
int err = 0;

test/unit.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -154,6 +154,7 @@ TEST_CASE test_case[] = {
154154
#ifdef WP_HAVE_RSA
155155
TEST_DECL(test_rsa_sign_sha1, NULL),
156156
TEST_DECL(test_rsa_sign_verify_pkcs1, NULL),
157+
TEST_DECL(test_rsa_sign_verify_recover_pkcs1, NULL),
157158
TEST_DECL(test_rsa_sign_verify_pss, NULL),
158159
TEST_DECL(test_rsa_sign_verify_x931, NULL),
159160
TEST_DECL(test_rsa_enc_dec_pkcs1, NULL),

test/unit.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -213,6 +213,8 @@ int test_pkey_sign(EVP_PKEY *pkey, OSSL_LIB_CTX* libCtx, unsigned char *hash,
213213
int test_pkey_verify(EVP_PKEY *pkey, OSSL_LIB_CTX* libCtx, unsigned char *hash,
214214
size_t hashLen, unsigned char *sig, size_t sigLen, int padMode,
215215
const EVP_MD *rsaMd, const EVP_MD *rsaMgf1Md);
216+
int test_pkey_verify_recover(EVP_PKEY *pkey, OSSL_LIB_CTX* libCtx, unsigned char *hash,
217+
size_t hashLen, unsigned char *sig, size_t sigLen, int padMode);
216218

217219
int test_pkey_enc(EVP_PKEY *pkey, OSSL_LIB_CTX* libCtx, unsigned char *msg,
218220
size_t msgLen, unsigned char *ciphertext, size_t cipherLen, int padMode,
@@ -230,6 +232,7 @@ int test_pkey_dec_rsa(EVP_PKEY *pkey, unsigned char *msg, size_t msgLen,
230232
const EVP_MD *rsaMd, const EVP_MD *rsaMgf1Md);
231233
int test_rsa_sign_sha1(void *data);
232234
int test_rsa_sign_verify_pkcs1(void *data);
235+
int test_rsa_sign_verify_recover_pkcs1(void *data);
233236
int test_rsa_sign_verify_pss(void *data);
234237
int test_rsa_sign_verify_x931(void *data);
235238
int test_rsa_enc_dec_pkcs1(void *data);

0 commit comments

Comments
 (0)