diff options
author | tb <> | 2025-09-05 13:47:41 +0000 |
---|---|---|
committer | tb <> | 2025-09-05 13:47:41 +0000 |
commit | 472f58fac15ad5c1fc0917e726d4a95b388127fc (patch) | |
tree | ecf392a423c8851c4640dd34d7193cadf195eca8 | |
parent | 3391ce89dec660073cd78f2b759e1b6ed694db25 (diff) | |
download | openbsd-472f58fac15ad5c1fc0917e726d4a95b388127fc.tar.gz openbsd-472f58fac15ad5c1fc0917e726d4a95b388127fc.tar.bz2 openbsd-472f58fac15ad5c1fc0917e726d4a95b388127fc.zip |
wycheproof: make RSA tests work
There's more work needed here since some of the tests are designed to
test the signing side of things, where we only verify. To be dealt with
later.
-rw-r--r-- | src/regress/lib/libcrypto/wycheproof/wycheproof.go | 122 |
1 files changed, 79 insertions, 43 deletions
diff --git a/src/regress/lib/libcrypto/wycheproof/wycheproof.go b/src/regress/lib/libcrypto/wycheproof/wycheproof.go index 3a2a1b7fde..f161211d3e 100644 --- a/src/regress/lib/libcrypto/wycheproof/wycheproof.go +++ b/src/regress/lib/libcrypto/wycheproof/wycheproof.go | |||
@@ -1,4 +1,4 @@ | |||
1 | /* $OpenBSD: wycheproof.go,v 1.175 2025/09/05 11:25:50 tb Exp $ */ | 1 | /* $OpenBSD: wycheproof.go,v 1.176 2025/09/05 13:47:41 tb Exp $ */ |
2 | /* | 2 | /* |
3 | * Copyright (c) 2018,2023 Joel Sing <jsing@openbsd.org> | 3 | * Copyright (c) 2018,2023 Joel Sing <jsing@openbsd.org> |
4 | * Copyright (c) 2018,2019,2022-2024 Theo Buehler <tb@openbsd.org> | 4 | * Copyright (c) 2018,2019,2022-2024 Theo Buehler <tb@openbsd.org> |
@@ -461,15 +461,31 @@ func (wt *wycheproofTestRSA) String() string { | |||
461 | } | 461 | } |
462 | 462 | ||
463 | type wycheproofTestGroupRSA struct { | 463 | type wycheproofTestGroupRSA struct { |
464 | E string `json:"e"` | 464 | PrivateKey *wycheproofRSAPrivateKey `json:"privateKey"` |
465 | KeyASN string `json:"keyAsn"` | 465 | PublicKey *wycheproofRSAPublicKey `json:"publicKey"` |
466 | KeyDER string `json:"keyDer"` | 466 | KeyASN string `json:"keyAsn"` |
467 | KeyPEM string `json:"keyPem"` | 467 | KeyDER string `json:"keyDer"` |
468 | KeySize int `json:"keysize"` | 468 | KeyPEM string `json:"keyPem"` |
469 | N string `json:"n"` | 469 | KeySize int `json:"keysize"` |
470 | SHA string `json:"sha"` | 470 | SHA string `json:"sha"` |
471 | Type string `json:"type"` | 471 | Type string `json:"type"` |
472 | Tests []*wycheproofTestRSA `json:"tests"` | 472 | Tests []*wycheproofTestRSA `json:"tests"` |
473 | } | ||
474 | |||
475 | type wycheproofRSAPublicKey struct { | ||
476 | Modulus string `json:"modulus"` | ||
477 | PublicExponent string `json:"publicExponent"` | ||
478 | } | ||
479 | |||
480 | type wycheproofRSAPrivateKey struct { | ||
481 | Modulus string `json:"modulus"` | ||
482 | PrivateExponent string `json:"privateExponent"` | ||
483 | PublicExponent string `json:"publicExponent"` | ||
484 | Prime1 string `json:"prime1"` | ||
485 | Prime2 string `json:"prime2"` | ||
486 | Exponent1 string `json:"exponent1"` | ||
487 | Exponent2 string `json:"exponent2"` | ||
488 | Coefficient string `json:"coefficient"` | ||
473 | } | 489 | } |
474 | 490 | ||
475 | type wycheproofPrivateKeyJwk struct { | 491 | type wycheproofPrivateKeyJwk struct { |
@@ -501,29 +517,25 @@ func (wt *wycheproofTestRsaes) String() string { | |||
501 | } | 517 | } |
502 | 518 | ||
503 | type wycheproofTestGroupRsaesOaep struct { | 519 | type wycheproofTestGroupRsaesOaep struct { |
504 | D string `json:"d"` | 520 | Type string `json:"type"` |
505 | E string `json:"e"` | ||
506 | KeySize int `json:"keysize"` | 521 | KeySize int `json:"keysize"` |
522 | SHA string `json:"sha"` | ||
507 | MGF string `json:"mgf"` | 523 | MGF string `json:"mgf"` |
508 | MGFSHA string `json:"mgfSha"` | 524 | MGFSHA string `json:"mgfSha"` |
509 | N string `json:"n"` | 525 | PrivateKey *wycheproofRSAPrivateKey `json:"privateKey"` |
510 | PrivateKeyJwk *wycheproofPrivateKeyJwk `json:"privateKeyJwk"` | 526 | PrivateKeyJwk *wycheproofPrivateKeyJwk `json:"privateKeyJwk"` |
511 | PrivateKeyPem string `json:"privateKeyPem"` | 527 | PrivateKeyPem string `json:"privateKeyPem"` |
512 | PrivateKeyPkcs8 string `json:"privateKeyPkcs8"` | 528 | PrivateKeyPkcs8 string `json:"privateKeyPkcs8"` |
513 | SHA string `json:"sha"` | ||
514 | Type string `json:"type"` | ||
515 | Tests []*wycheproofTestRsaes `json:"tests"` | 529 | Tests []*wycheproofTestRsaes `json:"tests"` |
516 | } | 530 | } |
517 | 531 | ||
518 | type wycheproofTestGroupRsaesPkcs1 struct { | 532 | type wycheproofTestGroupRsaesPkcs1 struct { |
519 | D string `json:"d"` | 533 | Type string `json:"type"` |
520 | E string `json:"e"` | 534 | PrivateKey *wycheproofRSAPrivateKey `json:"privateKey"` |
521 | KeySize int `json:"keysize"` | ||
522 | N string `json:"n"` | ||
523 | PrivateKeyJwk *wycheproofPrivateKeyJwk `json:"privateKeyJwk"` | 535 | PrivateKeyJwk *wycheproofPrivateKeyJwk `json:"privateKeyJwk"` |
524 | PrivateKeyPem string `json:"privateKeyPem"` | 536 | PrivateKeyPem string `json:"privateKeyPem"` |
525 | PrivateKeyPkcs8 string `json:"privateKeyPkcs8"` | 537 | PrivateKeyPkcs8 string `json:"privateKeyPkcs8"` |
526 | Type string `json:"type"` | 538 | KeySize int `json:"keysize"` |
527 | Tests []*wycheproofTestRsaes `json:"tests"` | 539 | Tests []*wycheproofTestRsaes `json:"tests"` |
528 | } | 540 | } |
529 | 541 | ||
@@ -541,18 +553,18 @@ func (wt *wycheproofTestRsassa) String() string { | |||
541 | } | 553 | } |
542 | 554 | ||
543 | type wycheproofTestGroupRsassa struct { | 555 | type wycheproofTestGroupRsassa struct { |
544 | E string `json:"e"` | 556 | PrivateKey *wycheproofRSAPrivateKey `json:"privateKey"` |
545 | KeyASN string `json:"keyAsn"` | 557 | PublicKey *wycheproofRSAPublicKey `json:"publicKey"` |
546 | KeyDER string `json:"keyDer"` | 558 | KeyASN string `json:"keyAsn"` |
547 | KeyPEM string `json:"keyPem"` | 559 | KeyDER string `json:"keyDer"` |
548 | KeySize int `json:"keysize"` | 560 | KeyPEM string `json:"keyPem"` |
549 | MGF string `json:"mgf"` | 561 | KeySize int `json:"keysize"` |
550 | MGFSHA string `json:"mgfSha"` | 562 | MGF string `json:"mgf"` |
551 | N string `json:"n"` | 563 | MGFSHA string `json:"mgfSha"` |
552 | SLen int `json:"sLen"` | 564 | SLen int `json:"sLen"` |
553 | SHA string `json:"sha"` | 565 | SHA string `json:"sha"` |
554 | Type string `json:"type"` | 566 | Type string `json:"type"` |
555 | Tests []*wycheproofTestRsassa `json:"tests"` | 567 | Tests []*wycheproofTestRsassa `json:"tests"` |
556 | } | 568 | } |
557 | 569 | ||
558 | type wycheproofTestX25519 struct { | 570 | type wycheproofTestX25519 struct { |
@@ -2303,7 +2315,7 @@ func (wtg *wycheproofTestGroupRsaesOaep) run(algorithm string, variant testVaria | |||
2303 | } | 2315 | } |
2304 | defer C.RSA_free(rsa) | 2316 | defer C.RSA_free(rsa) |
2305 | 2317 | ||
2306 | d := C.CString(wtg.D) | 2318 | d := C.CString(wtg.PrivateKey.PrivateExponent) |
2307 | var rsaD *C.BIGNUM | 2319 | var rsaD *C.BIGNUM |
2308 | defer C.BN_free(rsaD) | 2320 | defer C.BN_free(rsaD) |
2309 | if C.BN_hex2bn(&rsaD, d) == 0 { | 2321 | if C.BN_hex2bn(&rsaD, d) == 0 { |
@@ -2311,7 +2323,7 @@ func (wtg *wycheproofTestGroupRsaesOaep) run(algorithm string, variant testVaria | |||
2311 | } | 2323 | } |
2312 | C.free(unsafe.Pointer(d)) | 2324 | C.free(unsafe.Pointer(d)) |
2313 | 2325 | ||
2314 | e := C.CString(wtg.E) | 2326 | e := C.CString(wtg.PrivateKey.PublicExponent) |
2315 | var rsaE *C.BIGNUM | 2327 | var rsaE *C.BIGNUM |
2316 | defer C.BN_free(rsaE) | 2328 | defer C.BN_free(rsaE) |
2317 | if C.BN_hex2bn(&rsaE, e) == 0 { | 2329 | if C.BN_hex2bn(&rsaE, e) == 0 { |
@@ -2319,7 +2331,7 @@ func (wtg *wycheproofTestGroupRsaesOaep) run(algorithm string, variant testVaria | |||
2319 | } | 2331 | } |
2320 | C.free(unsafe.Pointer(e)) | 2332 | C.free(unsafe.Pointer(e)) |
2321 | 2333 | ||
2322 | n := C.CString(wtg.N) | 2334 | n := C.CString(wtg.PrivateKey.Modulus) |
2323 | var rsaN *C.BIGNUM | 2335 | var rsaN *C.BIGNUM |
2324 | defer C.BN_free(rsaN) | 2336 | defer C.BN_free(rsaN) |
2325 | if C.BN_hex2bn(&rsaN, n) == 0 { | 2337 | if C.BN_hex2bn(&rsaN, n) == 0 { |
@@ -2393,7 +2405,7 @@ func (wtg *wycheproofTestGroupRsaesPkcs1) run(algorithm string, variant testVari | |||
2393 | } | 2405 | } |
2394 | defer C.RSA_free(rsa) | 2406 | defer C.RSA_free(rsa) |
2395 | 2407 | ||
2396 | d := C.CString(wtg.D) | 2408 | d := C.CString(wtg.PrivateKey.PrivateExponent) |
2397 | var rsaD *C.BIGNUM | 2409 | var rsaD *C.BIGNUM |
2398 | defer C.BN_free(rsaD) | 2410 | defer C.BN_free(rsaD) |
2399 | if C.BN_hex2bn(&rsaD, d) == 0 { | 2411 | if C.BN_hex2bn(&rsaD, d) == 0 { |
@@ -2401,7 +2413,7 @@ func (wtg *wycheproofTestGroupRsaesPkcs1) run(algorithm string, variant testVari | |||
2401 | } | 2413 | } |
2402 | C.free(unsafe.Pointer(d)) | 2414 | C.free(unsafe.Pointer(d)) |
2403 | 2415 | ||
2404 | e := C.CString(wtg.E) | 2416 | e := C.CString(wtg.PrivateKey.PublicExponent) |
2405 | var rsaE *C.BIGNUM | 2417 | var rsaE *C.BIGNUM |
2406 | defer C.BN_free(rsaE) | 2418 | defer C.BN_free(rsaE) |
2407 | if C.BN_hex2bn(&rsaE, e) == 0 { | 2419 | if C.BN_hex2bn(&rsaE, e) == 0 { |
@@ -2409,7 +2421,7 @@ func (wtg *wycheproofTestGroupRsaesPkcs1) run(algorithm string, variant testVari | |||
2409 | } | 2421 | } |
2410 | C.free(unsafe.Pointer(e)) | 2422 | C.free(unsafe.Pointer(e)) |
2411 | 2423 | ||
2412 | n := C.CString(wtg.N) | 2424 | n := C.CString(wtg.PrivateKey.Modulus) |
2413 | var rsaN *C.BIGNUM | 2425 | var rsaN *C.BIGNUM |
2414 | defer C.BN_free(rsaN) | 2426 | defer C.BN_free(rsaN) |
2415 | if C.BN_hex2bn(&rsaN, n) == 0 { | 2427 | if C.BN_hex2bn(&rsaN, n) == 0 { |
@@ -2474,7 +2486,19 @@ func (wtg *wycheproofTestGroupRsassa) run(algorithm string, variant testVariant) | |||
2474 | } | 2486 | } |
2475 | defer C.RSA_free(rsa) | 2487 | defer C.RSA_free(rsa) |
2476 | 2488 | ||
2477 | e := C.CString(wtg.E) | 2489 | var publicExponent, modulus string |
2490 | if wtg.PublicKey != nil { | ||
2491 | publicExponent = wtg.PublicKey.PublicExponent | ||
2492 | modulus = wtg.PublicKey.Modulus | ||
2493 | } else if wtg.PrivateKey != nil { | ||
2494 | publicExponent = wtg.PrivateKey.PublicExponent | ||
2495 | modulus = wtg.PrivateKey.Modulus | ||
2496 | } | ||
2497 | if publicExponent == "" || modulus == "" { | ||
2498 | return true | ||
2499 | } | ||
2500 | |||
2501 | e := C.CString(publicExponent) | ||
2478 | var rsaE *C.BIGNUM | 2502 | var rsaE *C.BIGNUM |
2479 | defer C.BN_free(rsaE) | 2503 | defer C.BN_free(rsaE) |
2480 | if C.BN_hex2bn(&rsaE, e) == 0 { | 2504 | if C.BN_hex2bn(&rsaE, e) == 0 { |
@@ -2482,7 +2506,7 @@ func (wtg *wycheproofTestGroupRsassa) run(algorithm string, variant testVariant) | |||
2482 | } | 2506 | } |
2483 | C.free(unsafe.Pointer(e)) | 2507 | C.free(unsafe.Pointer(e)) |
2484 | 2508 | ||
2485 | n := C.CString(wtg.N) | 2509 | n := C.CString(modulus) |
2486 | var rsaN *C.BIGNUM | 2510 | var rsaN *C.BIGNUM |
2487 | defer C.BN_free(rsaN) | 2511 | defer C.BN_free(rsaN) |
2488 | if C.BN_hex2bn(&rsaN, n) == 0 { | 2512 | if C.BN_hex2bn(&rsaN, n) == 0 { |
@@ -2539,7 +2563,19 @@ func (wtg *wycheproofTestGroupRSA) run(algorithm string, variant testVariant) bo | |||
2539 | } | 2563 | } |
2540 | defer C.RSA_free(rsa) | 2564 | defer C.RSA_free(rsa) |
2541 | 2565 | ||
2542 | e := C.CString(wtg.E) | 2566 | var publicExponent, modulus string |
2567 | if wtg.PublicKey != nil { | ||
2568 | publicExponent = wtg.PublicKey.PublicExponent | ||
2569 | modulus = wtg.PublicKey.Modulus | ||
2570 | } else if wtg.PrivateKey != nil { | ||
2571 | publicExponent = wtg.PrivateKey.PublicExponent | ||
2572 | modulus = wtg.PrivateKey.Modulus | ||
2573 | } | ||
2574 | if publicExponent == "" || modulus == "" { | ||
2575 | return true | ||
2576 | } | ||
2577 | |||
2578 | e := C.CString(publicExponent) | ||
2543 | var rsaE *C.BIGNUM | 2579 | var rsaE *C.BIGNUM |
2544 | defer C.BN_free(rsaE) | 2580 | defer C.BN_free(rsaE) |
2545 | if C.BN_hex2bn(&rsaE, e) == 0 { | 2581 | if C.BN_hex2bn(&rsaE, e) == 0 { |
@@ -2547,7 +2583,7 @@ func (wtg *wycheproofTestGroupRSA) run(algorithm string, variant testVariant) bo | |||
2547 | } | 2583 | } |
2548 | C.free(unsafe.Pointer(e)) | 2584 | C.free(unsafe.Pointer(e)) |
2549 | 2585 | ||
2550 | n := C.CString(wtg.N) | 2586 | n := C.CString(modulus) |
2551 | var rsaN *C.BIGNUM | 2587 | var rsaN *C.BIGNUM |
2552 | defer C.BN_free(rsaN) | 2588 | defer C.BN_free(rsaN) |
2553 | if C.BN_hex2bn(&rsaN, n) == 0 { | 2589 | if C.BN_hex2bn(&rsaN, n) == 0 { |
@@ -2775,7 +2811,7 @@ func main() { | |||
2775 | {v0, "JSON webcrypto", "json_web_*_test.json", Skip}, | 2811 | {v0, "JSON webcrypto", "json_web_*_test.json", Skip}, |
2776 | {v0, "KW", "kw_test.json", Normal}, | 2812 | {v0, "KW", "kw_test.json", Normal}, |
2777 | {v0, "Primality test", "primality_test.json", Normal}, | 2813 | {v0, "Primality test", "primality_test.json", Normal}, |
2778 | {v0, "RSA", "rsa_*test.json", Normal}, | 2814 | {v1, "RSA", "rsa_*test.json", Normal}, |
2779 | {v1, "X25519", "x25519_test.json", Normal}, | 2815 | {v1, "X25519", "x25519_test.json", Normal}, |
2780 | {v1, "X25519 ASN", "x25519_asn_test.json", Skip}, | 2816 | {v1, "X25519 ASN", "x25519_asn_test.json", Skip}, |
2781 | {v1, "X25519 JWK", "x25519_jwk_test.json", Skip}, | 2817 | {v1, "X25519 JWK", "x25519_jwk_test.json", Skip}, |