summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/regress/lib/libcrypto/wycheproof/wycheproof.go96
1 files changed, 95 insertions, 1 deletions
diff --git a/src/regress/lib/libcrypto/wycheproof/wycheproof.go b/src/regress/lib/libcrypto/wycheproof/wycheproof.go
index f37aede93c..0babddaa1d 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.101 2019/11/28 16:54:00 tb Exp $ */ 1/* $OpenBSD: wycheproof.go,v 1.102 2019/11/28 21:35:47 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 Theo Buehler <tb@openbsd.org> 4 * Copyright (c) 2018, 2019 Theo Buehler <tb@openbsd.org>
@@ -33,6 +33,7 @@ package main
33#include <openssl/ec.h> 33#include <openssl/ec.h>
34#include <openssl/ecdsa.h> 34#include <openssl/ecdsa.h>
35#include <openssl/evp.h> 35#include <openssl/evp.h>
36#include <openssl/hkdf.h>
36#include <openssl/objects.h> 37#include <openssl/objects.h>
37#include <openssl/pem.h> 38#include <openssl/pem.h>
38#include <openssl/x509.h> 39#include <openssl/x509.h>
@@ -238,6 +239,24 @@ type wycheproofTestGroupECDSAWebCrypto struct {
238 Tests []*wycheproofTestECDSA `json:"tests"` 239 Tests []*wycheproofTestECDSA `json:"tests"`
239} 240}
240 241
242type wycheproofTestHkdf struct {
243 TCID int `json:"tcId"`
244 Comment string `json:"comment"`
245 Ikm string `json:"ikm"`
246 Salt string `json:"salt"`
247 Info string `json:"info"`
248 Size int `json:"size"`
249 Okm string `json:"okm"`
250 Result string `json:"result"`
251 Flags []string `json:"flags"`
252}
253
254type wycheproofTestGroupHkdf struct {
255 Type string `json:"type"`
256 KeySize int `json:"keySize"`
257 Tests []*wycheproofTestHkdf `json:"tests"`
258}
259
241type wycheproofTestKW struct { 260type wycheproofTestKW struct {
242 TCID int `json:"tcId"` 261 TCID int `json:"tcId"`
243 Comment string `json:"comment"` 262 Comment string `json:"comment"`
@@ -1835,6 +1854,74 @@ func runKWTestUnWrap(keySize int, key []byte, keyLen int, msg []byte, msgLen int
1835 return success 1854 return success
1836} 1855}
1837 1856
1857func runHkdfTest(md *C.EVP_MD, wt *wycheproofTestHkdf) bool {
1858 ikm, err := hex.DecodeString(wt.Ikm)
1859 if err != nil {
1860 log.Fatalf("Failed to decode ikm %q: %v", wt.Ikm, err)
1861 }
1862 salt, err := hex.DecodeString(wt.Salt)
1863 if err != nil {
1864 log.Fatalf("Failed to decode salt %q: %v", wt.Salt, err)
1865 }
1866 info, err := hex.DecodeString(wt.Info)
1867 if err != nil {
1868 log.Fatalf("Failed to decode info %q: %v", wt.Info, err)
1869 }
1870
1871 ikmLen, saltLen, infoLen := len(ikm), len(salt), len(info)
1872 if ikmLen == 0 {
1873 ikm = append(ikm, 0)
1874 }
1875 if saltLen == 0 {
1876 salt = append(salt, 0)
1877 }
1878 if infoLen == 0 {
1879 info = append(info, 0)
1880 }
1881
1882 outLen := wt.Size
1883 out := make([]byte, outLen)
1884 if outLen == 0 {
1885 out = append(out, 0)
1886 }
1887
1888 ret := C.HKDF((*C.uchar)(unsafe.Pointer(&out[0])), C.size_t(outLen), md, (*C.uchar)(unsafe.Pointer(&ikm[0])), C.size_t(ikmLen), (*C.uchar)(&salt[0]), C.size_t(saltLen), (*C.uchar)(unsafe.Pointer(&info[0])), C.size_t(infoLen))
1889
1890 if ret != 1 {
1891 success := wt.Result == "invalid"
1892 if !success {
1893 fmt.Printf("FAIL: Test case %d (%q) %v - got %d, want %v\n", wt.TCID, wt.Comment, wt.Flags, ret, wt.Result)
1894 }
1895 return success
1896 }
1897
1898 okm, err := hex.DecodeString(wt.Okm)
1899 if err != nil {
1900 log.Fatalf("Failed to decode okm %q: %v", wt.Okm, err)
1901 }
1902 if !bytes.Equal(out[:outLen], okm) {
1903 fmt.Printf("FAIL: Test case %d (%q) %v - expected and computed output don't match: %v", wt.TCID, wt.Comment, wt.Flags, wt.Result)
1904 }
1905
1906 return wt.Result == "valid"
1907}
1908
1909func runHkdfTestGroup(algorithm string, wtg *wycheproofTestGroupHkdf) bool {
1910 fmt.Printf("Running %v test group %v with key size %d...\n", algorithm, wtg.Type, wtg.KeySize)
1911 md, err := hashEvpMdFromString(strings.TrimPrefix(algorithm, "HKDF-"))
1912 if err != nil {
1913 log.Fatalf("Failed to get hash: %v", err)
1914 }
1915
1916 success := true
1917 for _, wt := range wtg.Tests {
1918 if !runHkdfTest(md, wt) {
1919 success = false
1920 }
1921 }
1922 return success
1923}
1924
1838func runKWTest(keySize int, wt *wycheproofTestKW) bool { 1925func runKWTest(keySize int, wt *wycheproofTestKW) bool {
1839 key, err := hex.DecodeString(wt.Key) 1926 key, err := hex.DecodeString(wt.Key)
1840 if err != nil { 1927 if err != nil {
@@ -2338,6 +2425,8 @@ func runTestVectors(path string, webcrypto bool) bool {
2338 } else { 2425 } else {
2339 wtg = &wycheproofTestGroupECDSA{} 2426 wtg = &wycheproofTestGroupECDSA{}
2340 } 2427 }
2428 case "HKDF-SHA-1", "HKDF-SHA-256", "HKDF-SHA-384", "HKDF-SHA-512":
2429 wtg = &wycheproofTestGroupHkdf{}
2341 case "KW": 2430 case "KW":
2342 wtg = &wycheproofTestGroupKW{} 2431 wtg = &wycheproofTestGroupKW{}
2343 case "RSAES-OAEP": 2432 case "RSAES-OAEP":
@@ -2411,6 +2500,10 @@ func runTestVectors(path string, webcrypto bool) bool {
2411 success = false 2500 success = false
2412 } 2501 }
2413 } 2502 }
2503 case "HKDF-SHA-1", "HKDF-SHA-256", "HKDF-SHA-384", "HKDF-SHA-512":
2504 if !runHkdfTestGroup(wtv.Algorithm, wtg.(*wycheproofTestGroupHkdf)) {
2505 success = false
2506 }
2414 case "KW": 2507 case "KW":
2415 if !runKWTestGroup(wtv.Algorithm, wtg.(*wycheproofTestGroupKW)) { 2508 if !runKWTestGroup(wtv.Algorithm, wtg.(*wycheproofTestGroupKW)) {
2416 success = false 2509 success = false
@@ -2475,6 +2568,7 @@ func main() {
2475 {"ECDHWebCrypto", "ecdh_w*_test.json"}, 2568 {"ECDHWebCrypto", "ecdh_w*_test.json"},
2476 {"ECDSA", "ecdsa_[^w]*test.json"}, 2569 {"ECDSA", "ecdsa_[^w]*test.json"},
2477 {"ECDSAWebCrypto", "ecdsa_w*_test.json"}, 2570 {"ECDSAWebCrypto", "ecdsa_w*_test.json"},
2571 {"HKDF", "hkdf_sha*_test.json"},
2478 {"KW", "kw_test.json"}, 2572 {"KW", "kw_test.json"},
2479 {"RSA", "rsa_*test.json"}, 2573 {"RSA", "rsa_*test.json"},
2480 {"X25519", "x25519_test.json"}, 2574 {"X25519", "x25519_test.json"},