diff options
author | tb <> | 2023-11-07 16:46:12 +0000 |
---|---|---|
committer | tb <> | 2023-11-07 16:46:12 +0000 |
commit | cefa9a1d9f2460838d8d3687457363dc5f30f660 (patch) | |
tree | 630f9db768e44e0ae7f7438ab6dbdd05831da52f | |
parent | c04812f8ed8b3ee4fd760e7d319f9676c9128010 (diff) | |
download | openbsd-cefa9a1d9f2460838d8d3687457363dc5f30f660.tar.gz openbsd-cefa9a1d9f2460838d8d3687457363dc5f30f660.tar.bz2 openbsd-cefa9a1d9f2460838d8d3687457363dc5f30f660.zip |
Wrap hex.DecodeString() into mustDecodeHexString()
The hex decoding is only done from the JSON files provided by the
wycheproof-testvectors package. Failure is always fatal. So there
is no need for repeated error checks, and we can use an ergonomic
wrapper.
Also rework the calculation of the message digest from input data
this had a similar deficit.
All in all this shaves off about 10% of the code and removes a lot
of tedious repetition.
Diffstat (limited to '')
-rw-r--r-- | src/regress/lib/libcrypto/wycheproof/wycheproof.go | 468 |
1 files changed, 78 insertions, 390 deletions
diff --git a/src/regress/lib/libcrypto/wycheproof/wycheproof.go b/src/regress/lib/libcrypto/wycheproof/wycheproof.go index 6f33fe56c6..dea2f2e5f8 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.154 2023/11/07 16:37:02 tb Exp $ */ | 1 | /* $OpenBSD: wycheproof.go,v 1.155 2023/11/07 16:46:12 tb Exp $ */ |
2 | /* | 2 | /* |
3 | * Copyright (c) 2018 Joel Sing <jsing@openbsd.org> | 3 | * Copyright (c) 2018 Joel Sing <jsing@openbsd.org> |
4 | * Copyright (c) 2018,2019,2022 Theo Buehler <tb@openbsd.org> | 4 | * Copyright (c) 2018,2019,2022 Theo Buehler <tb@openbsd.org> |
@@ -709,24 +709,33 @@ func aeadAes(size int) (*C.EVP_AEAD, error) { | |||
709 | return nil, fmt.Errorf("invalid key size: %d", size) | 709 | return nil, fmt.Errorf("invalid key size: %d", size) |
710 | } | 710 | } |
711 | 711 | ||
712 | func hashEvpDigestMessage(md *C.EVP_MD, msg []byte) ([]byte, int, error) { | 712 | func mustHashHexMessage(md *C.EVP_MD, message string) ([]byte, int) { |
713 | size := C.EVP_MD_size(md) | 713 | size := C.EVP_MD_size(md) |
714 | if size <= 0 || size > C.EVP_MAX_MD_SIZE { | 714 | if size <= 0 || size > C.EVP_MAX_MD_SIZE { |
715 | return nil, 0, fmt.Errorf("unexpected MD size %d", size) | 715 | log.Fatalf("unexpected MD size %d", size) |
716 | } | 716 | } |
717 | 717 | ||
718 | msgLen := len(msg) | 718 | msg, msgLen := mustDecodeHexString(message, "for hex message digest") |
719 | if msgLen == 0 { | ||
720 | msg = append(msg, 0) | ||
721 | } | ||
722 | 719 | ||
723 | digest := make([]byte, size) | 720 | digest := make([]byte, size) |
724 | 721 | ||
725 | if C.EVP_Digest(unsafe.Pointer(&msg[0]), C.size_t(msgLen), (*C.uchar)(unsafe.Pointer(&digest[0])), nil, md, nil) != 1 { | 722 | if C.EVP_Digest(unsafe.Pointer(&msg[0]), C.size_t(msgLen), (*C.uchar)(unsafe.Pointer(&digest[0])), nil, md, nil) != 1 { |
726 | return nil, 0, fmt.Errorf("EVP_Digest failed") | 723 | log.Fatalf("EVP_Digest failed") |
727 | } | 724 | } |
728 | 725 | ||
729 | return digest, int(size), nil | 726 | return digest, int(size) |
727 | } | ||
728 | |||
729 | func mustDecodeHexString(str, descr string) (out []byte, outLen int) { | ||
730 | out, err := hex.DecodeString(str) | ||
731 | if err != nil { | ||
732 | log.Fatalf("Failed to decode %s %q: %v", descr, str, err) | ||
733 | } | ||
734 | outLen = len(out) | ||
735 | if outLen == 0 { | ||
736 | out = append(out, 0) | ||
737 | } | ||
738 | return out, outLen | ||
730 | } | 739 | } |
731 | 740 | ||
732 | func checkAesCbcPkcs5(ctx *C.EVP_CIPHER_CTX, doEncrypt int, key []byte, keyLen int, | 741 | func checkAesCbcPkcs5(ctx *C.EVP_CIPHER_CTX, doEncrypt int, key []byte, keyLen int, |
@@ -790,37 +799,10 @@ func checkAesCbcPkcs5(ctx *C.EVP_CIPHER_CTX, doEncrypt int, key []byte, keyLen i | |||
790 | } | 799 | } |
791 | 800 | ||
792 | func runAesCbcPkcs5Test(ctx *C.EVP_CIPHER_CTX, wt *wycheproofTestAesCbcPkcs5) bool { | 801 | func runAesCbcPkcs5Test(ctx *C.EVP_CIPHER_CTX, wt *wycheproofTestAesCbcPkcs5) bool { |
793 | key, err := hex.DecodeString(wt.Key) | 802 | key, keyLen := mustDecodeHexString(wt.Key, "key") |
794 | if err != nil { | 803 | iv, ivLen := mustDecodeHexString(wt.IV, "iv") |
795 | log.Fatalf("Failed to decode key %q: %v", wt.Key, err) | 804 | ct, ctLen := mustDecodeHexString(wt.CT, "ct") |
796 | } | 805 | msg, msgLen := mustDecodeHexString(wt.Msg, "message") |
797 | iv, err := hex.DecodeString(wt.IV) | ||
798 | if err != nil { | ||
799 | log.Fatalf("Failed to decode IV %q: %v", wt.IV, err) | ||
800 | } | ||
801 | ct, err := hex.DecodeString(wt.CT) | ||
802 | if err != nil { | ||
803 | log.Fatalf("Failed to decode CT %q: %v", wt.CT, err) | ||
804 | } | ||
805 | msg, err := hex.DecodeString(wt.Msg) | ||
806 | if err != nil { | ||
807 | log.Fatalf("Failed to decode message %q: %v", wt.Msg, err) | ||
808 | } | ||
809 | |||
810 | keyLen, ivLen, ctLen, msgLen := len(key), len(iv), len(ct), len(msg) | ||
811 | |||
812 | if keyLen == 0 { | ||
813 | key = append(key, 0) | ||
814 | } | ||
815 | if ivLen == 0 { | ||
816 | iv = append(iv, 0) | ||
817 | } | ||
818 | if ctLen == 0 { | ||
819 | ct = append(ct, 0) | ||
820 | } | ||
821 | if msgLen == 0 { | ||
822 | msg = append(msg, 0) | ||
823 | } | ||
824 | 806 | ||
825 | openSuccess := checkAesCbcPkcs5(ctx, 0, key, keyLen, iv, ivLen, ct, ctLen, msg, msgLen, wt) | 807 | openSuccess := checkAesCbcPkcs5(ctx, 0, key, keyLen, iv, ivLen, ct, ctLen, msg, msgLen, wt) |
826 | sealSuccess := checkAesCbcPkcs5(ctx, 1, key, keyLen, iv, ivLen, msg, msgLen, ct, ctLen, wt) | 808 | sealSuccess := checkAesCbcPkcs5(ctx, 1, key, keyLen, iv, ivLen, msg, msgLen, ct, ctLen, wt) |
@@ -997,56 +979,12 @@ func checkAesAead(algorithm string, ctx *C.EVP_CIPHER_CTX, doEncrypt int, | |||
997 | } | 979 | } |
998 | 980 | ||
999 | func runAesAeadTest(algorithm string, ctx *C.EVP_CIPHER_CTX, aead *C.EVP_AEAD, wt *wycheproofTestAead) bool { | 981 | func runAesAeadTest(algorithm string, ctx *C.EVP_CIPHER_CTX, aead *C.EVP_AEAD, wt *wycheproofTestAead) bool { |
1000 | key, err := hex.DecodeString(wt.Key) | 982 | key, keyLen := mustDecodeHexString(wt.Key, "key") |
1001 | if err != nil { | 983 | iv, ivLen := mustDecodeHexString(wt.IV, "iv") |
1002 | log.Fatalf("Failed to decode key %q: %v", wt.Key, err) | 984 | aad, aadLen := mustDecodeHexString(wt.AAD, "aad") |
1003 | } | 985 | msg, msgLen := mustDecodeHexString(wt.Msg, "msg") |
1004 | 986 | ct, ctLen := mustDecodeHexString(wt.CT, "CT") | |
1005 | iv, err := hex.DecodeString(wt.IV) | 987 | tag, tagLen := mustDecodeHexString(wt.Tag, "tag") |
1006 | if err != nil { | ||
1007 | log.Fatalf("Failed to decode IV %q: %v", wt.IV, err) | ||
1008 | } | ||
1009 | |||
1010 | aad, err := hex.DecodeString(wt.AAD) | ||
1011 | if err != nil { | ||
1012 | log.Fatalf("Failed to decode AAD %q: %v", wt.AAD, err) | ||
1013 | } | ||
1014 | |||
1015 | msg, err := hex.DecodeString(wt.Msg) | ||
1016 | if err != nil { | ||
1017 | log.Fatalf("Failed to decode msg %q: %v", wt.Msg, err) | ||
1018 | } | ||
1019 | |||
1020 | ct, err := hex.DecodeString(wt.CT) | ||
1021 | if err != nil { | ||
1022 | log.Fatalf("Failed to decode CT %q: %v", wt.CT, err) | ||
1023 | } | ||
1024 | |||
1025 | tag, err := hex.DecodeString(wt.Tag) | ||
1026 | if err != nil { | ||
1027 | log.Fatalf("Failed to decode tag %q: %v", wt.Tag, err) | ||
1028 | } | ||
1029 | |||
1030 | keyLen, ivLen, aadLen, msgLen, ctLen, tagLen := len(key), len(iv), len(aad), len(msg), len(ct), len(tag) | ||
1031 | |||
1032 | if keyLen == 0 { | ||
1033 | key = append(key, 0) | ||
1034 | } | ||
1035 | if ivLen == 0 { | ||
1036 | iv = append(iv, 0) | ||
1037 | } | ||
1038 | if aadLen == 0 { | ||
1039 | aad = append(aad, 0) | ||
1040 | } | ||
1041 | if msgLen == 0 { | ||
1042 | msg = append(msg, 0) | ||
1043 | } | ||
1044 | if ctLen == 0 { | ||
1045 | ct = append(ct, 0) | ||
1046 | } | ||
1047 | if tagLen == 0 { | ||
1048 | tag = append(tag, 0) | ||
1049 | } | ||
1050 | 988 | ||
1051 | openEvp := checkAesAead(algorithm, ctx, 0, key, keyLen, iv, ivLen, aad, aadLen, ct, ctLen, msg, msgLen, tag, tagLen, wt) | 989 | openEvp := checkAesAead(algorithm, ctx, 0, key, keyLen, iv, ivLen, aad, aadLen, ct, ctLen, msg, msgLen, tag, tagLen, wt) |
1052 | sealEvp := checkAesAead(algorithm, ctx, 1, key, keyLen, iv, ivLen, aad, aadLen, msg, msgLen, ct, ctLen, tag, tagLen, wt) | 990 | sealEvp := checkAesAead(algorithm, ctx, 1, key, keyLen, iv, ivLen, aad, aadLen, msg, msgLen, ct, ctLen, tag, tagLen, wt) |
@@ -1110,32 +1048,9 @@ func (wtg *wycheproofTestGroupAesAead) run(algorithm string, variant testVariant | |||
1110 | } | 1048 | } |
1111 | 1049 | ||
1112 | func runAesCmacTest(cipher *C.EVP_CIPHER, wt *wycheproofTestAesCmac) bool { | 1050 | func runAesCmacTest(cipher *C.EVP_CIPHER, wt *wycheproofTestAesCmac) bool { |
1113 | key, err := hex.DecodeString(wt.Key) | 1051 | key, keyLen := mustDecodeHexString(wt.Key, "key") |
1114 | if err != nil { | 1052 | msg, msgLen := mustDecodeHexString(wt.Msg, "msg") |
1115 | log.Fatalf("Failed to decode key %q: %v", wt.Key, err) | 1053 | tag, tagLen := mustDecodeHexString(wt.Tag, "tag") |
1116 | } | ||
1117 | |||
1118 | msg, err := hex.DecodeString(wt.Msg) | ||
1119 | if err != nil { | ||
1120 | log.Fatalf("Failed to decode msg %q: %v", wt.Msg, err) | ||
1121 | } | ||
1122 | |||
1123 | tag, err := hex.DecodeString(wt.Tag) | ||
1124 | if err != nil { | ||
1125 | log.Fatalf("Failed to decode tag %q: %v", wt.Tag, err) | ||
1126 | } | ||
1127 | |||
1128 | keyLen, msgLen, tagLen := len(key), len(msg), len(tag) | ||
1129 | |||
1130 | if keyLen == 0 { | ||
1131 | key = append(key, 0) | ||
1132 | } | ||
1133 | if msgLen == 0 { | ||
1134 | msg = append(msg, 0) | ||
1135 | } | ||
1136 | if tagLen == 0 { | ||
1137 | tag = append(tag, 0) | ||
1138 | } | ||
1139 | 1054 | ||
1140 | mdctx := C.EVP_MD_CTX_new() | 1055 | mdctx := C.EVP_MD_CTX_new() |
1141 | if mdctx == nil { | 1056 | if mdctx == nil { |
@@ -1291,22 +1206,13 @@ func runChaCha20Poly1305Test(algorithm string, wt *wycheproofTestAead) bool { | |||
1291 | aead = C.EVP_aead_xchacha20_poly1305() | 1206 | aead = C.EVP_aead_xchacha20_poly1305() |
1292 | } | 1207 | } |
1293 | 1208 | ||
1294 | key, err := hex.DecodeString(wt.Key) | 1209 | key, keyLen := mustDecodeHexString(wt.Key, "key") |
1295 | if err != nil { | 1210 | ct, ctLen := mustDecodeHexString(wt.CT, "CT") |
1296 | log.Fatalf("Failed to decode key %q: %v", wt.Key, err) | 1211 | iv, ivLen := mustDecodeHexString(wt.IV, "iv") |
1297 | } | 1212 | aad, aadLen := mustDecodeHexString(wt.AAD, "aad") |
1298 | iv, err := hex.DecodeString(wt.IV) | 1213 | msg, msgLen := mustDecodeHexString(wt.Msg, "msg") |
1299 | if err != nil { | 1214 | |
1300 | log.Fatalf("Failed to decode key %q: %v", wt.IV, err) | 1215 | // ct and tag are concatenated in checkAeadOpen(), so don't use mustDecodeHexString() |
1301 | } | ||
1302 | aad, err := hex.DecodeString(wt.AAD) | ||
1303 | if err != nil { | ||
1304 | log.Fatalf("Failed to decode AAD %q: %v", wt.AAD, err) | ||
1305 | } | ||
1306 | msg, err := hex.DecodeString(wt.Msg) | ||
1307 | if err != nil { | ||
1308 | log.Fatalf("Failed to decode msg %q: %v", wt.Msg, err) | ||
1309 | } | ||
1310 | ct, err := hex.DecodeString(wt.CT) | 1216 | ct, err := hex.DecodeString(wt.CT) |
1311 | if err != nil { | 1217 | if err != nil { |
1312 | log.Fatalf("Failed to decode ct %q: %v", wt.CT, err) | 1218 | log.Fatalf("Failed to decode ct %q: %v", wt.CT, err) |
@@ -1315,18 +1221,7 @@ func runChaCha20Poly1305Test(algorithm string, wt *wycheproofTestAead) bool { | |||
1315 | if err != nil { | 1221 | if err != nil { |
1316 | log.Fatalf("Failed to decode tag %q: %v", wt.Tag, err) | 1222 | log.Fatalf("Failed to decode tag %q: %v", wt.Tag, err) |
1317 | } | 1223 | } |
1318 | 1224 | ctLen, tagLen := len(ct), len(tag) | |
1319 | keyLen, ivLen, aadLen, msgLen, ctLen, tagLen := len(key), len(iv), len(aad), len(msg), len(ct), len(tag) | ||
1320 | |||
1321 | if ivLen == 0 { | ||
1322 | iv = append(iv, 0) | ||
1323 | } | ||
1324 | if aadLen == 0 { | ||
1325 | aad = append(aad, 0) | ||
1326 | } | ||
1327 | if msgLen == 0 { | ||
1328 | msg = append(msg, 0) | ||
1329 | } | ||
1330 | 1225 | ||
1331 | ctx := C.EVP_AEAD_CTX_new() | 1226 | ctx := C.EVP_AEAD_CTX_new() |
1332 | if ctx == nil { | 1227 | if ctx == nil { |
@@ -1410,15 +1305,7 @@ func encodeDSAP1363Sig(wtSig string) (*C.uchar, C.int) { | |||
1410 | } | 1305 | } |
1411 | 1306 | ||
1412 | func runDSATest(dsa *C.DSA, md *C.EVP_MD, variant testVariant, wt *wycheproofTestDSA) bool { | 1307 | func runDSATest(dsa *C.DSA, md *C.EVP_MD, variant testVariant, wt *wycheproofTestDSA) bool { |
1413 | msg, err := hex.DecodeString(wt.Msg) | 1308 | msg, msgLen := mustHashHexMessage(md, wt.Msg) |
1414 | if err != nil { | ||
1415 | log.Fatalf("Failed to decode message %q: %v", wt.Msg, err) | ||
1416 | } | ||
1417 | |||
1418 | msg, msgLen, err := hashEvpDigestMessage(md, msg) | ||
1419 | if err != nil { | ||
1420 | log.Fatalf("%v", err) | ||
1421 | } | ||
1422 | 1309 | ||
1423 | var ret C.int | 1310 | var ret C.int |
1424 | if variant == P1363 { | 1311 | if variant == P1363 { |
@@ -1432,14 +1319,7 @@ func runDSATest(dsa *C.DSA, md *C.EVP_MD, variant testVariant, wt *wycheproofTes | |||
1432 | ret = C.DSA_verify(0, (*C.uchar)(unsafe.Pointer(&msg[0])), C.int(msgLen), | 1319 | ret = C.DSA_verify(0, (*C.uchar)(unsafe.Pointer(&msg[0])), C.int(msgLen), |
1433 | (*C.uchar)(unsafe.Pointer(cDer)), C.int(derLen), dsa) | 1320 | (*C.uchar)(unsafe.Pointer(cDer)), C.int(derLen), dsa) |
1434 | } else { | 1321 | } else { |
1435 | sig, err := hex.DecodeString(wt.Sig) | 1322 | sig, sigLen := mustDecodeHexString(wt.Sig, "sig") |
1436 | if err != nil { | ||
1437 | log.Fatalf("Failed to decode signature %q: %v", wt.Sig, err) | ||
1438 | } | ||
1439 | sigLen := len(sig) | ||
1440 | if sigLen == 0 { | ||
1441 | sig = append(msg, 0) | ||
1442 | } | ||
1443 | ret = C.DSA_verify(0, (*C.uchar)(unsafe.Pointer(&msg[0])), C.int(msgLen), | 1323 | ret = C.DSA_verify(0, (*C.uchar)(unsafe.Pointer(&msg[0])), C.int(msgLen), |
1444 | (*C.uchar)(unsafe.Pointer(&sig[0])), C.int(sigLen), dsa) | 1324 | (*C.uchar)(unsafe.Pointer(&sig[0])), C.int(sigLen), dsa) |
1445 | } | 1325 | } |
@@ -1505,15 +1385,7 @@ func (wtg *wycheproofTestGroupDSA) run(algorithm string, variant testVariant) bo | |||
1505 | log.Fatalf("Failed to get hash: %v", err) | 1385 | log.Fatalf("Failed to get hash: %v", err) |
1506 | } | 1386 | } |
1507 | 1387 | ||
1508 | der, err := hex.DecodeString(wtg.KeyDER) | 1388 | der, derLen := mustDecodeHexString(wtg.KeyDER, "DER encoded key") |
1509 | if err != nil { | ||
1510 | log.Fatalf("Failed to decode DER encoded key: %v", err) | ||
1511 | } | ||
1512 | |||
1513 | derLen := len(der) | ||
1514 | if derLen == 0 { | ||
1515 | der = append(der, 0) | ||
1516 | } | ||
1517 | 1389 | ||
1518 | Cder := (*C.uchar)(C.malloc(C.ulong(derLen))) | 1390 | Cder := (*C.uchar)(C.malloc(C.ulong(derLen))) |
1519 | if Cder == nil { | 1391 | if Cder == nil { |
@@ -1576,15 +1448,7 @@ func runECDHTest(nid int, variant testVariant, wt *wycheproofTestECDH) bool { | |||
1576 | return false | 1448 | return false |
1577 | } | 1449 | } |
1578 | 1450 | ||
1579 | pub, err := hex.DecodeString(wt.Public) | 1451 | pub, pubLen := mustDecodeHexString(wt.Public, "public key") |
1580 | if err != nil { | ||
1581 | log.Fatalf("Failed to decode public key: %v", err) | ||
1582 | } | ||
1583 | |||
1584 | pubLen := len(pub) | ||
1585 | if pubLen == 0 { | ||
1586 | pub = append(pub, 0) | ||
1587 | } | ||
1588 | 1452 | ||
1589 | Cpub := (*C.uchar)(C.malloc(C.ulong(pubLen))) | 1453 | Cpub := (*C.uchar)(C.malloc(C.ulong(pubLen))) |
1590 | if Cpub == nil { | 1454 | if Cpub == nil { |
@@ -1634,13 +1498,10 @@ func runECDHTest(nid int, variant testVariant, wt *wycheproofTestECDH) bool { | |||
1634 | return false | 1498 | return false |
1635 | } | 1499 | } |
1636 | 1500 | ||
1637 | shared, err := hex.DecodeString(wt.Shared) | 1501 | shared, sharedLen := mustDecodeHexString(wt.Shared, "shared secret") |
1638 | if err != nil { | ||
1639 | log.Fatalf("Failed to decode shared secret: %v", err) | ||
1640 | } | ||
1641 | 1502 | ||
1642 | // XXX The shared fields of the secp224k1 test cases have a 0 byte preprended. | 1503 | // XXX The shared fields of the secp224k1 test cases have a 0 byte preprended. |
1643 | if len(shared) == int(secLen)+1 && shared[0] == 0 { | 1504 | if sharedLen == int(secLen)+1 && shared[0] == 0 { |
1644 | fmt.Printf("INFO: %s - prepending 0 byte.\n", wt) | 1505 | fmt.Printf("INFO: %s - prepending 0 byte.\n", wt) |
1645 | // shared = shared[1:]; | 1506 | // shared = shared[1:]; |
1646 | zero := make([]byte, 1, secLen+1) | 1507 | zero := make([]byte, 1, secLen+1) |
@@ -1750,10 +1611,7 @@ func runECDHWebCryptoTest(nid int, wt *wycheproofTestECDHWebCrypto) bool { | |||
1750 | return false | 1611 | return false |
1751 | } | 1612 | } |
1752 | 1613 | ||
1753 | shared, err := hex.DecodeString(wt.Shared) | 1614 | shared, _ := mustDecodeHexString(wt.Shared, "shared secret") |
1754 | if err != nil { | ||
1755 | log.Fatalf("Failed to decode shared secret: %v", err) | ||
1756 | } | ||
1757 | 1615 | ||
1758 | success := true | 1616 | success := true |
1759 | if !bytes.Equal(shared, secret) { | 1617 | if !bytes.Equal(shared, secret) { |
@@ -1782,15 +1640,7 @@ func (wtg *wycheproofTestGroupECDHWebCrypto) run(algorithm string, variant testV | |||
1782 | } | 1640 | } |
1783 | 1641 | ||
1784 | func runECDSATest(ecKey *C.EC_KEY, md *C.EVP_MD, nid int, variant testVariant, wt *wycheproofTestECDSA) bool { | 1642 | func runECDSATest(ecKey *C.EC_KEY, md *C.EVP_MD, nid int, variant testVariant, wt *wycheproofTestECDSA) bool { |
1785 | msg, err := hex.DecodeString(wt.Msg) | 1643 | msg, msgLen := mustHashHexMessage(md, wt.Msg) |
1786 | if err != nil { | ||
1787 | log.Fatalf("Failed to decode message %q: %v", wt.Msg, err) | ||
1788 | } | ||
1789 | |||
1790 | msg, msgLen, err := hashEvpDigestMessage(md, msg) | ||
1791 | if err != nil { | ||
1792 | log.Fatalf("%v", err) | ||
1793 | } | ||
1794 | 1644 | ||
1795 | var ret C.int | 1645 | var ret C.int |
1796 | if variant == Webcrypto || variant == P1363 { | 1646 | if variant == Webcrypto || variant == P1363 { |
@@ -1804,15 +1654,8 @@ func runECDSATest(ecKey *C.EC_KEY, md *C.EVP_MD, nid int, variant testVariant, w | |||
1804 | ret = C.ECDSA_verify(0, (*C.uchar)(unsafe.Pointer(&msg[0])), C.int(msgLen), | 1654 | ret = C.ECDSA_verify(0, (*C.uchar)(unsafe.Pointer(&msg[0])), C.int(msgLen), |
1805 | (*C.uchar)(unsafe.Pointer(cDer)), C.int(derLen), ecKey) | 1655 | (*C.uchar)(unsafe.Pointer(cDer)), C.int(derLen), ecKey) |
1806 | } else { | 1656 | } else { |
1807 | sig, err := hex.DecodeString(wt.Sig) | 1657 | sig, sigLen := mustDecodeHexString(wt.Sig, "sig") |
1808 | if err != nil { | ||
1809 | log.Fatalf("Failed to decode signature %q: %v", wt.Sig, err) | ||
1810 | } | ||
1811 | 1658 | ||
1812 | sigLen := len(sig) | ||
1813 | if sigLen == 0 { | ||
1814 | sig = append(sig, 0) | ||
1815 | } | ||
1816 | ret = C.ECDSA_verify(0, (*C.uchar)(unsafe.Pointer(&msg[0])), C.int(msgLen), | 1659 | ret = C.ECDSA_verify(0, (*C.uchar)(unsafe.Pointer(&msg[0])), C.int(msgLen), |
1817 | (*C.uchar)(unsafe.Pointer(&sig[0])), C.int(sigLen), ecKey) | 1660 | (*C.uchar)(unsafe.Pointer(&sig[0])), C.int(sigLen), ecKey) |
1818 | } | 1661 | } |
@@ -1993,23 +1836,8 @@ func runEdDSATest(pkey *C.EVP_PKEY, wt *wycheproofTestEdDSA) bool { | |||
1993 | log.Fatal("EVP_DigestVerifyInit failed") | 1836 | log.Fatal("EVP_DigestVerifyInit failed") |
1994 | } | 1837 | } |
1995 | 1838 | ||
1996 | msg, err := hex.DecodeString(wt.Msg) | 1839 | msg, msgLen := mustDecodeHexString(wt.Msg, "msg") |
1997 | if err != nil { | 1840 | sig, sigLen := mustDecodeHexString(wt.Sig, "sig") |
1998 | log.Fatalf("Failed to decode Message %q: %v", wt.Msg, err) | ||
1999 | } | ||
2000 | msgLen := len(msg) | ||
2001 | if msgLen == 0 { | ||
2002 | msg = append(msg, 0) | ||
2003 | } | ||
2004 | |||
2005 | sig, err := hex.DecodeString(wt.Sig) | ||
2006 | if err != nil { | ||
2007 | log.Fatalf("Failed to decode Signature %q: %v", wt.Sig, err) | ||
2008 | } | ||
2009 | sigLen := len(sig) | ||
2010 | if sigLen == 0 { | ||
2011 | sig = append(sig, 0) | ||
2012 | } | ||
2013 | 1841 | ||
2014 | ret := C.EVP_DigestVerify(mdctx, (*C.uchar)(unsafe.Pointer(&sig[0])), (C.size_t)(sigLen), (*C.uchar)(unsafe.Pointer(&msg[0])), (C.size_t)(msgLen)) | 1842 | ret := C.EVP_DigestVerify(mdctx, (*C.uchar)(unsafe.Pointer(&sig[0])), (C.size_t)(sigLen), (*C.uchar)(unsafe.Pointer(&msg[0])), (C.size_t)(msgLen)) |
2015 | 1843 | ||
@@ -2029,12 +1857,9 @@ func (wtg *wycheproofTestGroupEdDSA) run(algorithm string, variant testVariant) | |||
2029 | return false | 1857 | return false |
2030 | } | 1858 | } |
2031 | 1859 | ||
2032 | pubKey, err := hex.DecodeString(wtg.Key.Pk) | 1860 | pubKey, pubKeyLen := mustDecodeHexString(wtg.Key.Pk, "pubkey") |
2033 | if err != nil { | ||
2034 | log.Fatalf("Failed to decode Pubkey %q: %v", wtg.Key.Pk, err) | ||
2035 | } | ||
2036 | 1861 | ||
2037 | pkey := C.EVP_PKEY_new_raw_public_key(C.EVP_PKEY_ED25519, nil, (*C.uchar)(unsafe.Pointer(&pubKey[0])), (C.size_t)(len(pubKey))) | 1862 | pkey := C.EVP_PKEY_new_raw_public_key(C.EVP_PKEY_ED25519, nil, (*C.uchar)(unsafe.Pointer(&pubKey[0])), (C.size_t)(pubKeyLen)) |
2038 | if pkey == nil { | 1863 | if pkey == nil { |
2039 | log.Fatal("EVP_PKEY_new_raw_public_key failed") | 1864 | log.Fatal("EVP_PKEY_new_raw_public_key failed") |
2040 | } | 1865 | } |
@@ -2050,29 +1875,9 @@ func (wtg *wycheproofTestGroupEdDSA) run(algorithm string, variant testVariant) | |||
2050 | } | 1875 | } |
2051 | 1876 | ||
2052 | func runHkdfTest(md *C.EVP_MD, wt *wycheproofTestHkdf) bool { | 1877 | func runHkdfTest(md *C.EVP_MD, wt *wycheproofTestHkdf) bool { |
2053 | ikm, err := hex.DecodeString(wt.Ikm) | 1878 | ikm, ikmLen := mustDecodeHexString(wt.Ikm, "ikm") |
2054 | if err != nil { | 1879 | salt, saltLen := mustDecodeHexString(wt.Salt, "salt") |
2055 | log.Fatalf("Failed to decode ikm %q: %v", wt.Ikm, err) | 1880 | info, infoLen := mustDecodeHexString(wt.Info, "info") |
2056 | } | ||
2057 | salt, err := hex.DecodeString(wt.Salt) | ||
2058 | if err != nil { | ||
2059 | log.Fatalf("Failed to decode salt %q: %v", wt.Salt, err) | ||
2060 | } | ||
2061 | info, err := hex.DecodeString(wt.Info) | ||
2062 | if err != nil { | ||
2063 | log.Fatalf("Failed to decode info %q: %v", wt.Info, err) | ||
2064 | } | ||
2065 | |||
2066 | ikmLen, saltLen, infoLen := len(ikm), len(salt), len(info) | ||
2067 | if ikmLen == 0 { | ||
2068 | ikm = append(ikm, 0) | ||
2069 | } | ||
2070 | if saltLen == 0 { | ||
2071 | salt = append(salt, 0) | ||
2072 | } | ||
2073 | if infoLen == 0 { | ||
2074 | info = append(info, 0) | ||
2075 | } | ||
2076 | 1881 | ||
2077 | outLen := wt.Size | 1882 | outLen := wt.Size |
2078 | out := make([]byte, outLen) | 1883 | out := make([]byte, outLen) |
@@ -2120,10 +1925,7 @@ func runHkdfTest(md *C.EVP_MD, wt *wycheproofTestHkdf) bool { | |||
2120 | return success | 1925 | return success |
2121 | } | 1926 | } |
2122 | 1927 | ||
2123 | okm, err := hex.DecodeString(wt.Okm) | 1928 | okm, _ := mustDecodeHexString(wt.Okm, "okm") |
2124 | if err != nil { | ||
2125 | log.Fatalf("Failed to decode okm %q: %v", wt.Okm, err) | ||
2126 | } | ||
2127 | if !bytes.Equal(out[:outLen], okm) { | 1929 | if !bytes.Equal(out[:outLen], okm) { |
2128 | fmt.Printf("FAIL: %s - expected and computed output don't match.\n", wt) | 1930 | fmt.Printf("FAIL: %s - expected and computed output don't match.\n", wt) |
2129 | } | 1931 | } |
@@ -2148,25 +1950,8 @@ func (wtg *wycheproofTestGroupHkdf) run(algorithm string, variant testVariant) b | |||
2148 | } | 1950 | } |
2149 | 1951 | ||
2150 | func runHmacTest(md *C.EVP_MD, tagBytes int, wt *wycheproofTestHmac) bool { | 1952 | func runHmacTest(md *C.EVP_MD, tagBytes int, wt *wycheproofTestHmac) bool { |
2151 | key, err := hex.DecodeString(wt.Key) | 1953 | key, keyLen := mustDecodeHexString(wt.Key, "key") |
2152 | if err != nil { | 1954 | msg, msgLen := mustDecodeHexString(wt.Msg, "msg") |
2153 | log.Fatalf("failed to decode key %q: %v", wt.Key, err) | ||
2154 | } | ||
2155 | |||
2156 | msg, err := hex.DecodeString(wt.Msg) | ||
2157 | if err != nil { | ||
2158 | log.Fatalf("failed to decode msg %q: %v", wt.Msg, err) | ||
2159 | } | ||
2160 | |||
2161 | keyLen, msgLen := len(key), len(msg) | ||
2162 | |||
2163 | if keyLen == 0 { | ||
2164 | key = append(key, 0) | ||
2165 | } | ||
2166 | |||
2167 | if msgLen == 0 { | ||
2168 | msg = append(msg, 0) | ||
2169 | } | ||
2170 | 1955 | ||
2171 | got := make([]byte, C.EVP_MAX_MD_SIZE) | 1956 | got := make([]byte, C.EVP_MAX_MD_SIZE) |
2172 | var gotLen C.uint | 1957 | var gotLen C.uint |
@@ -2187,11 +1972,7 @@ func runHmacTest(md *C.EVP_MD, tagBytes int, wt *wycheproofTestHmac) bool { | |||
2187 | return false | 1972 | return false |
2188 | } | 1973 | } |
2189 | 1974 | ||
2190 | tag, err := hex.DecodeString(wt.Tag) | 1975 | tag, _ := mustDecodeHexString(wt.Tag, "tag") |
2191 | if err != nil { | ||
2192 | log.Fatalf("failed to decode tag %q: %v", wt.Tag, err) | ||
2193 | } | ||
2194 | |||
2195 | success = bytes.Equal(got[:tagBytes], tag) == (wt.Result == "valid") | 1976 | success = bytes.Equal(got[:tagBytes], tag) == (wt.Result == "valid") |
2196 | 1977 | ||
2197 | if !success { | 1978 | if !success { |
@@ -2279,30 +2060,9 @@ func runKWTestUnWrap(keySize int, key []byte, keyLen int, msg []byte, msgLen int | |||
2279 | } | 2060 | } |
2280 | 2061 | ||
2281 | func runKWTest(keySize int, wt *wycheproofTestKW) bool { | 2062 | func runKWTest(keySize int, wt *wycheproofTestKW) bool { |
2282 | key, err := hex.DecodeString(wt.Key) | 2063 | key, keyLen := mustDecodeHexString(wt.Key, "key") |
2283 | if err != nil { | 2064 | msg, msgLen := mustDecodeHexString(wt.Msg, "msg") |
2284 | log.Fatalf("Failed to decode key %q: %v", wt.Key, err) | 2065 | ct, ctLen := mustDecodeHexString(wt.CT, "CT") |
2285 | } | ||
2286 | msg, err := hex.DecodeString(wt.Msg) | ||
2287 | if err != nil { | ||
2288 | log.Fatalf("Failed to decode msg %q: %v", wt.Msg, err) | ||
2289 | } | ||
2290 | ct, err := hex.DecodeString(wt.CT) | ||
2291 | if err != nil { | ||
2292 | log.Fatalf("Failed to decode ct %q: %v", wt.CT, err) | ||
2293 | } | ||
2294 | |||
2295 | keyLen, msgLen, ctLen := len(key), len(msg), len(ct) | ||
2296 | |||
2297 | if keyLen == 0 { | ||
2298 | key = append(key, 0) | ||
2299 | } | ||
2300 | if msgLen == 0 { | ||
2301 | msg = append(msg, 0) | ||
2302 | } | ||
2303 | if ctLen == 0 { | ||
2304 | ct = append(ct, 0) | ||
2305 | } | ||
2306 | 2066 | ||
2307 | wrapSuccess := runKWTestWrap(keySize, key, keyLen, msg, msgLen, ct, ctLen, wt) | 2067 | wrapSuccess := runKWTestWrap(keySize, key, keyLen, msg, msgLen, ct, ctLen, wt) |
2308 | unwrapSuccess := runKWTestUnWrap(keySize, key, keyLen, msg, msgLen, ct, ctLen, wt) | 2068 | unwrapSuccess := runKWTestUnWrap(keySize, key, keyLen, msg, msgLen, ct, ctLen, wt) |
@@ -2353,14 +2113,7 @@ func (wtg *wycheproofTestGroupPrimality) run(algorithm string, variant testVaria | |||
2353 | } | 2113 | } |
2354 | 2114 | ||
2355 | func runRsaesOaepTest(rsa *C.RSA, sha *C.EVP_MD, mgfSha *C.EVP_MD, wt *wycheproofTestRsaes) bool { | 2115 | func runRsaesOaepTest(rsa *C.RSA, sha *C.EVP_MD, mgfSha *C.EVP_MD, wt *wycheproofTestRsaes) bool { |
2356 | ct, err := hex.DecodeString(wt.CT) | 2116 | ct, ctLen := mustDecodeHexString(wt.CT, "CT") |
2357 | if err != nil { | ||
2358 | log.Fatalf("Failed to decode cipher text %q: %v", wt.CT, err) | ||
2359 | } | ||
2360 | ctLen := len(ct) | ||
2361 | if ctLen == 0 { | ||
2362 | ct = append(ct, 0) | ||
2363 | } | ||
2364 | 2117 | ||
2365 | rsaSize := C.RSA_size(rsa) | 2118 | rsaSize := C.RSA_size(rsa) |
2366 | decrypted := make([]byte, rsaSize) | 2119 | decrypted := make([]byte, rsaSize) |
@@ -2378,20 +2131,8 @@ func runRsaesOaepTest(rsa *C.RSA, sha *C.EVP_MD, mgfSha *C.EVP_MD, wt *wycheproo | |||
2378 | return success | 2131 | return success |
2379 | } | 2132 | } |
2380 | 2133 | ||
2381 | label, err := hex.DecodeString(wt.Label) | 2134 | label, labelLen := mustDecodeHexString(wt.Label, "label") |
2382 | if err != nil { | 2135 | msg, msgLen := mustDecodeHexString(wt.Msg, "msg") |
2383 | log.Fatalf("Failed to decode label %q: %v", wt.Label, err) | ||
2384 | } | ||
2385 | labelLen := len(label) | ||
2386 | if labelLen == 0 { | ||
2387 | label = append(label, 0) | ||
2388 | } | ||
2389 | |||
2390 | msg, err := hex.DecodeString(wt.Msg) | ||
2391 | if err != nil { | ||
2392 | log.Fatalf("Failed to decode message %q: %v", wt.Msg, err) | ||
2393 | } | ||
2394 | msgLen := len(msg) | ||
2395 | 2136 | ||
2396 | to := make([]byte, rsaSize) | 2137 | to := make([]byte, rsaSize) |
2397 | 2138 | ||
@@ -2407,7 +2148,7 @@ func runRsaesOaepTest(rsa *C.RSA, sha *C.EVP_MD, mgfSha *C.EVP_MD, wt *wycheproo | |||
2407 | } | 2148 | } |
2408 | 2149 | ||
2409 | to = to[:msgLen] | 2150 | to = to[:msgLen] |
2410 | if !bytes.Equal(msg, to) { | 2151 | if !bytes.Equal(msg[:msgLen], to) { |
2411 | success = false | 2152 | success = false |
2412 | fmt.Printf("FAIL: %s - expected and calculated message differ.\n", wt) | 2153 | fmt.Printf("FAIL: %s - expected and calculated message differ.\n", wt) |
2413 | } | 2154 | } |
@@ -2476,14 +2217,7 @@ func (wtg *wycheproofTestGroupRsaesOaep) run(algorithm string, variant testVaria | |||
2476 | } | 2217 | } |
2477 | 2218 | ||
2478 | func runRsaesPkcs1Test(rsa *C.RSA, wt *wycheproofTestRsaes) bool { | 2219 | func runRsaesPkcs1Test(rsa *C.RSA, wt *wycheproofTestRsaes) bool { |
2479 | ct, err := hex.DecodeString(wt.CT) | 2220 | ct, ctLen := mustDecodeHexString(wt.CT, "CT") |
2480 | if err != nil { | ||
2481 | log.Fatalf("Failed to decode cipher text %q: %v", wt.CT, err) | ||
2482 | } | ||
2483 | ctLen := len(ct) | ||
2484 | if ctLen == 0 { | ||
2485 | ct = append(ct, 0) | ||
2486 | } | ||
2487 | 2221 | ||
2488 | rsaSize := C.RSA_size(rsa) | 2222 | rsaSize := C.RSA_size(rsa) |
2489 | decrypted := make([]byte, rsaSize) | 2223 | decrypted := make([]byte, rsaSize) |
@@ -2501,15 +2235,12 @@ func runRsaesPkcs1Test(rsa *C.RSA, wt *wycheproofTestRsaes) bool { | |||
2501 | return success | 2235 | return success |
2502 | } | 2236 | } |
2503 | 2237 | ||
2504 | msg, err := hex.DecodeString(wt.Msg) | 2238 | msg, msgLen := mustDecodeHexString(wt.Msg, "msg") |
2505 | if err != nil { | ||
2506 | log.Fatalf("Failed to decode message %q: %v", wt.Msg, err) | ||
2507 | } | ||
2508 | 2239 | ||
2509 | if int(ret) != len(msg) { | 2240 | if int(ret) != msgLen { |
2510 | success = false | 2241 | success = false |
2511 | fmt.Printf("FAIL: %s - got %d, want %d.\n", wt, ret, len(msg)) | 2242 | fmt.Printf("FAIL: %s - got %d, want %d\n", wt, ret, len(msg)) |
2512 | } else if !bytes.Equal(msg, decrypted[:len(msg)]) { | 2243 | } else if !bytes.Equal(msg[:msgLen], decrypted[:msgLen]) { |
2513 | success = false | 2244 | success = false |
2514 | fmt.Printf("FAIL: %s - expected and calculated message differ.\n", wt) | 2245 | fmt.Printf("FAIL: %s - expected and calculated message differ.\n", wt) |
2515 | } | 2246 | } |
@@ -2566,25 +2297,8 @@ func (wtg *wycheproofTestGroupRsaesPkcs1) run(algorithm string, variant testVari | |||
2566 | } | 2297 | } |
2567 | 2298 | ||
2568 | func runRsassaTest(rsa *C.RSA, sha *C.EVP_MD, mgfSha *C.EVP_MD, sLen int, wt *wycheproofTestRsassa) bool { | 2299 | func runRsassaTest(rsa *C.RSA, sha *C.EVP_MD, mgfSha *C.EVP_MD, sLen int, wt *wycheproofTestRsassa) bool { |
2569 | msg, err := hex.DecodeString(wt.Msg) | 2300 | msg, _ := mustHashHexMessage(sha, wt.Msg) |
2570 | if err != nil { | 2301 | sig, sigLen := mustDecodeHexString(wt.Sig, "sig") |
2571 | log.Fatalf("Failed to decode message %q: %v", wt.Msg, err) | ||
2572 | } | ||
2573 | |||
2574 | msg, _, err = hashEvpDigestMessage(sha, msg) | ||
2575 | if err != nil { | ||
2576 | log.Fatalf("%v", err) | ||
2577 | } | ||
2578 | |||
2579 | sig, err := hex.DecodeString(wt.Sig) | ||
2580 | if err != nil { | ||
2581 | log.Fatalf("Failed to decode signature %q: %v", wt.Sig, err) | ||
2582 | } | ||
2583 | |||
2584 | sigLen := len(sig) | ||
2585 | if sigLen == 0 { | ||
2586 | sig = append(sig, 0) | ||
2587 | } | ||
2588 | 2302 | ||
2589 | sigOut := make([]byte, C.RSA_size(rsa)-11) | 2303 | sigOut := make([]byte, C.RSA_size(rsa)-11) |
2590 | if sigLen == 0 { | 2304 | if sigLen == 0 { |
@@ -2668,25 +2382,8 @@ func (wtg *wycheproofTestGroupRsassa) run(algorithm string, variant testVariant) | |||
2668 | } | 2382 | } |
2669 | 2383 | ||
2670 | func runRSATest(rsa *C.RSA, md *C.EVP_MD, nid int, wt *wycheproofTestRSA) bool { | 2384 | func runRSATest(rsa *C.RSA, md *C.EVP_MD, nid int, wt *wycheproofTestRSA) bool { |
2671 | msg, err := hex.DecodeString(wt.Msg) | 2385 | msg, msgLen := mustHashHexMessage(md, wt.Msg) |
2672 | if err != nil { | 2386 | sig, sigLen := mustDecodeHexString(wt.Sig, "sig") |
2673 | log.Fatalf("Failed to decode message %q: %v", wt.Msg, err) | ||
2674 | } | ||
2675 | |||
2676 | msg, msgLen, err := hashEvpDigestMessage(md, msg) | ||
2677 | if err != nil { | ||
2678 | log.Fatalf("%v", err) | ||
2679 | } | ||
2680 | |||
2681 | sig, err := hex.DecodeString(wt.Sig) | ||
2682 | if err != nil { | ||
2683 | log.Fatalf("Failed to decode signature %q: %v", wt.Sig, err) | ||
2684 | } | ||
2685 | |||
2686 | sigLen := len(sig) | ||
2687 | if sigLen == 0 { | ||
2688 | sig = append(sig, 0) | ||
2689 | } | ||
2690 | 2387 | ||
2691 | ret := C.RSA_verify(C.int(nid), (*C.uchar)(unsafe.Pointer(&msg[0])), C.uint(msgLen), | 2388 | ret := C.RSA_verify(C.int(nid), (*C.uchar)(unsafe.Pointer(&msg[0])), C.uint(msgLen), |
2692 | (*C.uchar)(unsafe.Pointer(&sig[0])), C.uint(sigLen), rsa) | 2389 | (*C.uchar)(unsafe.Pointer(&sig[0])), C.uint(sigLen), rsa) |
@@ -2751,18 +2448,9 @@ func (wtg *wycheproofTestGroupRSA) run(algorithm string, variant testVariant) bo | |||
2751 | } | 2448 | } |
2752 | 2449 | ||
2753 | func runX25519Test(wt *wycheproofTestX25519) bool { | 2450 | func runX25519Test(wt *wycheproofTestX25519) bool { |
2754 | public, err := hex.DecodeString(wt.Public) | 2451 | public, _ := mustDecodeHexString(wt.Public, "public") |
2755 | if err != nil { | 2452 | private, _ := mustDecodeHexString(wt.Private, "private") |
2756 | log.Fatalf("Failed to decode public %q: %v", wt.Public, err) | 2453 | shared, _ := mustDecodeHexString(wt.Shared, "shared") |
2757 | } | ||
2758 | private, err := hex.DecodeString(wt.Private) | ||
2759 | if err != nil { | ||
2760 | log.Fatalf("Failed to decode private %q: %v", wt.Private, err) | ||
2761 | } | ||
2762 | shared, err := hex.DecodeString(wt.Shared) | ||
2763 | if err != nil { | ||
2764 | log.Fatalf("Failed to decode shared %q: %v", wt.Shared, err) | ||
2765 | } | ||
2766 | 2454 | ||
2767 | got := make([]byte, C.X25519_KEY_LENGTH) | 2455 | got := make([]byte, C.X25519_KEY_LENGTH) |
2768 | result := true | 2456 | result := true |