xref: /aosp_15_r20/external/tink/go/prf/subtle/hkdf_test.go (revision e7b1675dde1b92d52ec075b0a92829627f2c52a5)
1*e7b1675dSTing-Kang Chang// Copyright 2020 Google LLC
2*e7b1675dSTing-Kang Chang//
3*e7b1675dSTing-Kang Chang// Licensed under the Apache License, Version 2.0 (the "License");
4*e7b1675dSTing-Kang Chang// you may not use this file except in compliance with the License.
5*e7b1675dSTing-Kang Chang// You may obtain a copy of the License at
6*e7b1675dSTing-Kang Chang//
7*e7b1675dSTing-Kang Chang//      http://www.apache.org/licenses/LICENSE-2.0
8*e7b1675dSTing-Kang Chang//
9*e7b1675dSTing-Kang Chang// Unless required by applicable law or agreed to in writing, software
10*e7b1675dSTing-Kang Chang// distributed under the License is distributed on an "AS IS" BASIS,
11*e7b1675dSTing-Kang Chang// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12*e7b1675dSTing-Kang Chang// See the License for the specific language governing permissions and
13*e7b1675dSTing-Kang Chang// limitations under the License.
14*e7b1675dSTing-Kang Chang//
15*e7b1675dSTing-Kang Chang////////////////////////////////////////////////////////////////////////////////
16*e7b1675dSTing-Kang Chang
17*e7b1675dSTing-Kang Changpackage subtle_test
18*e7b1675dSTing-Kang Chang
19*e7b1675dSTing-Kang Changimport (
20*e7b1675dSTing-Kang Chang	"bytes"
21*e7b1675dSTing-Kang Chang	"encoding/hex"
22*e7b1675dSTing-Kang Chang	"fmt"
23*e7b1675dSTing-Kang Chang	"strings"
24*e7b1675dSTing-Kang Chang	"testing"
25*e7b1675dSTing-Kang Chang
26*e7b1675dSTing-Kang Chang	"github.com/google/tink/go/prf/subtle"
27*e7b1675dSTing-Kang Chang	"github.com/google/tink/go/testutil"
28*e7b1675dSTing-Kang Chang)
29*e7b1675dSTing-Kang Chang
30*e7b1675dSTing-Kang Changtype rfc5869test struct {
31*e7b1675dSTing-Kang Chang	hash         string
32*e7b1675dSTing-Kang Chang	key          string
33*e7b1675dSTing-Kang Chang	salt         string
34*e7b1675dSTing-Kang Chang	info         string
35*e7b1675dSTing-Kang Chang	outputLength uint32
36*e7b1675dSTing-Kang Chang	okm          string
37*e7b1675dSTing-Kang Chang}
38*e7b1675dSTing-Kang Chang
39*e7b1675dSTing-Kang Changfunc TestVectorsRFC5869(t *testing.T) {
40*e7b1675dSTing-Kang Chang	// Test vectors from RFC 5869.
41*e7b1675dSTing-Kang Chang	testvectors := []*rfc5869test{
42*e7b1675dSTing-Kang Chang		{
43*e7b1675dSTing-Kang Chang			hash:         "SHA256",
44*e7b1675dSTing-Kang Chang			key:          "0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b",
45*e7b1675dSTing-Kang Chang			salt:         "000102030405060708090a0b0c",
46*e7b1675dSTing-Kang Chang			info:         "f0f1f2f3f4f5f6f7f8f9",
47*e7b1675dSTing-Kang Chang			outputLength: 42,
48*e7b1675dSTing-Kang Chang			okm:          "3cb25f25faacd57a90434f64d0362f2a2d2d0a90cf1a5a4c5db02d56ecc4c5bf34007208d5b887185865",
49*e7b1675dSTing-Kang Chang		},
50*e7b1675dSTing-Kang Chang		{
51*e7b1675dSTing-Kang Chang			hash:         "SHA256",
52*e7b1675dSTing-Kang Chang			key:          "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f",
53*e7b1675dSTing-Kang Chang			salt:         "606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeaf",
54*e7b1675dSTing-Kang Chang			info:         "b0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff",
55*e7b1675dSTing-Kang Chang			outputLength: 82,
56*e7b1675dSTing-Kang Chang			okm:          "b11e398dc80327a1c8e7f78c596a49344f012eda2d4efad8a050cc4c19afa97c59045a99cac7827271cb41c65e590e09da3275600c2f09b8367793a9aca3db71cc30c58179ec3e87c14c01d5c1f3434f1d87",
57*e7b1675dSTing-Kang Chang		},
58*e7b1675dSTing-Kang Chang		{
59*e7b1675dSTing-Kang Chang			hash:         "SHA256",
60*e7b1675dSTing-Kang Chang			key:          "0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b",
61*e7b1675dSTing-Kang Chang			salt:         "",
62*e7b1675dSTing-Kang Chang			info:         "",
63*e7b1675dSTing-Kang Chang			outputLength: 42,
64*e7b1675dSTing-Kang Chang			okm:          "8da4e775a563c18f715f802a063c5a31b8a11f5c5ee1879ec3454e5f3c738d2d9d201395faa4b61a96c8",
65*e7b1675dSTing-Kang Chang		},
66*e7b1675dSTing-Kang Chang		{
67*e7b1675dSTing-Kang Chang			hash:         "SHA1",
68*e7b1675dSTing-Kang Chang			key:          "0b0b0b0b0b0b0b0b0b0b0b",
69*e7b1675dSTing-Kang Chang			salt:         "000102030405060708090a0b0c",
70*e7b1675dSTing-Kang Chang			info:         "f0f1f2f3f4f5f6f7f8f9",
71*e7b1675dSTing-Kang Chang			outputLength: 42,
72*e7b1675dSTing-Kang Chang			okm:          "085a01ea1b10f36933068b56efa5ad81a4f14b822f5b091568a9cdd4f155fda2c22e422478d305f3f896",
73*e7b1675dSTing-Kang Chang		},
74*e7b1675dSTing-Kang Chang		{
75*e7b1675dSTing-Kang Chang			hash:         "SHA1",
76*e7b1675dSTing-Kang Chang			key:          "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f",
77*e7b1675dSTing-Kang Chang			salt:         "606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeaf",
78*e7b1675dSTing-Kang Chang			info:         "b0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3d4d5d6d7d8d9dadbdcdddedfe0e1e2e3e4e5e6e7e8e9eaebecedeeeff0f1f2f3f4f5f6f7f8f9fafbfcfdfeff",
79*e7b1675dSTing-Kang Chang			outputLength: 82,
80*e7b1675dSTing-Kang Chang			okm:          "0bd770a74d1160f7c9f12cd5912a06ebff6adcae899d92191fe4305673ba2ffe8fa3f1a4e5ad79f3f334b3b202b2173c486ea37ce3d397ed034c7f9dfeb15c5e927336d0441f4c4300e2cff0d0900b52d3b4",
81*e7b1675dSTing-Kang Chang		},
82*e7b1675dSTing-Kang Chang		{
83*e7b1675dSTing-Kang Chang			hash:         "SHA1",
84*e7b1675dSTing-Kang Chang			key:          "0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b",
85*e7b1675dSTing-Kang Chang			salt:         "",
86*e7b1675dSTing-Kang Chang			info:         "",
87*e7b1675dSTing-Kang Chang			outputLength: 42,
88*e7b1675dSTing-Kang Chang			okm:          "0ac1af7002b3d761d1e55298da9d0506b9ae52057220a306e07b6b87e8df21d0ea00033de03984d34918",
89*e7b1675dSTing-Kang Chang		},
90*e7b1675dSTing-Kang Chang		{
91*e7b1675dSTing-Kang Chang			hash:         "SHA1",
92*e7b1675dSTing-Kang Chang			key:          "0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c0c",
93*e7b1675dSTing-Kang Chang			salt:         "",
94*e7b1675dSTing-Kang Chang			info:         "",
95*e7b1675dSTing-Kang Chang			outputLength: 42,
96*e7b1675dSTing-Kang Chang			okm:          "2c91117204d745f3500d636a62f64f0ab3bae548aa53d423b0d1f27ebba6f5e5673a081d70cce7acfc48",
97*e7b1675dSTing-Kang Chang		},
98*e7b1675dSTing-Kang Chang	}
99*e7b1675dSTing-Kang Chang	for _, v := range testvectors {
100*e7b1675dSTing-Kang Chang		key, err := hex.DecodeString(v.key)
101*e7b1675dSTing-Kang Chang		if err != nil {
102*e7b1675dSTing-Kang Chang			t.Errorf("Could not decode key: %v", err)
103*e7b1675dSTing-Kang Chang		}
104*e7b1675dSTing-Kang Chang		salt, err := hex.DecodeString(v.salt)
105*e7b1675dSTing-Kang Chang		if err != nil {
106*e7b1675dSTing-Kang Chang			t.Errorf("Could not decode salt: %v", err)
107*e7b1675dSTing-Kang Chang		}
108*e7b1675dSTing-Kang Chang		info, err := hex.DecodeString(v.info)
109*e7b1675dSTing-Kang Chang		if err != nil {
110*e7b1675dSTing-Kang Chang			t.Errorf("Could not decode info: %v", err)
111*e7b1675dSTing-Kang Chang		}
112*e7b1675dSTing-Kang Chang		p, err := subtle.NewHKDFPRF(v.hash, key, salt)
113*e7b1675dSTing-Kang Chang		if err != nil {
114*e7b1675dSTing-Kang Chang			t.Errorf("Could not create HKDF object: %v", err)
115*e7b1675dSTing-Kang Chang		}
116*e7b1675dSTing-Kang Chang		output, err := p.ComputePRF(info, v.outputLength)
117*e7b1675dSTing-Kang Chang		if err != nil {
118*e7b1675dSTing-Kang Chang			t.Errorf("Error computing HKDF: %v", err)
119*e7b1675dSTing-Kang Chang		}
120*e7b1675dSTing-Kang Chang		if hex.EncodeToString(output) != v.okm {
121*e7b1675dSTing-Kang Chang			t.Errorf("Computation and test vector differ. Computation: %q, Test Vector %q", hex.EncodeToString(output), v.okm)
122*e7b1675dSTing-Kang Chang		}
123*e7b1675dSTing-Kang Chang	}
124*e7b1675dSTing-Kang Chang}
125*e7b1675dSTing-Kang Chang
126*e7b1675dSTing-Kang Changfunc TestHKDFPRFWycheproofCases(t *testing.T) {
127*e7b1675dSTing-Kang Chang	testutil.SkipTestIfTestSrcDirIsNotSet(t)
128*e7b1675dSTing-Kang Chang	for _, hash := range []string{"SHA1", "SHA256", "SHA512"} {
129*e7b1675dSTing-Kang Chang		filename := fmt.Sprintf("hkdf_%s_test.json", strings.ToLower(hash))
130*e7b1675dSTing-Kang Chang		suite := new(hkdfSuite)
131*e7b1675dSTing-Kang Chang		if err := testutil.PopulateSuite(suite, filename); err != nil {
132*e7b1675dSTing-Kang Chang			t.Fatalf("Failed populating suite: %s", err)
133*e7b1675dSTing-Kang Chang		}
134*e7b1675dSTing-Kang Chang		for _, group := range suite.TestGroups {
135*e7b1675dSTing-Kang Chang			for _, test := range group.Tests {
136*e7b1675dSTing-Kang Chang				caseName := fmt.Sprintf("%s-%s-%s(%d):Case-%d", suite.Algorithm, group.Type, hash, group.KeySize, test.CaseID)
137*e7b1675dSTing-Kang Chang				t.Run(caseName, func(t *testing.T) {
138*e7b1675dSTing-Kang Chang					if uint32(len(test.IKM))*8 != group.KeySize {
139*e7b1675dSTing-Kang Chang						t.Fatal("Invalid key length")
140*e7b1675dSTing-Kang Chang					}
141*e7b1675dSTing-Kang Chang
142*e7b1675dSTing-Kang Chang					hkdfPRF, err := subtle.NewHKDFPRF(hash, test.IKM, test.Salt)
143*e7b1675dSTing-Kang Chang					switch test.Result {
144*e7b1675dSTing-Kang Chang					case "valid":
145*e7b1675dSTing-Kang Chang						if err != nil {
146*e7b1675dSTing-Kang Chang							t.Fatalf("NewHKDFPRF failed: %v", err)
147*e7b1675dSTing-Kang Chang						}
148*e7b1675dSTing-Kang Chang						res, err := hkdfPRF.ComputePRF(test.Info, test.Size)
149*e7b1675dSTing-Kang Chang						if err != nil {
150*e7b1675dSTing-Kang Chang							t.Fatalf("ComputePRF() failed: %v", err)
151*e7b1675dSTing-Kang Chang						}
152*e7b1675dSTing-Kang Chang						if !bytes.Equal(res, test.OKM) {
153*e7b1675dSTing-Kang Chang							t.Errorf("ComputePRF() result and expected result do not match:\nComputed: %q\nExpected: %q", hex.EncodeToString(res), test.OKM)
154*e7b1675dSTing-Kang Chang						}
155*e7b1675dSTing-Kang Chang
156*e7b1675dSTing-Kang Chang					case "invalid":
157*e7b1675dSTing-Kang Chang						if err != nil {
158*e7b1675dSTing-Kang Chang							return
159*e7b1675dSTing-Kang Chang						}
160*e7b1675dSTing-Kang Chang						res, err := hkdfPRF.ComputePRF(test.Info, test.Size)
161*e7b1675dSTing-Kang Chang						if err != nil {
162*e7b1675dSTing-Kang Chang							return
163*e7b1675dSTing-Kang Chang						}
164*e7b1675dSTing-Kang Chang						if bytes.Equal(res, test.OKM) {
165*e7b1675dSTing-Kang Chang							t.Errorf("ComputePRF() result and invalid expected result match:\nComputed: %q\nExpected: %q", hex.EncodeToString(res), test.OKM)
166*e7b1675dSTing-Kang Chang						}
167*e7b1675dSTing-Kang Chang
168*e7b1675dSTing-Kang Chang					default:
169*e7b1675dSTing-Kang Chang						t.Fatalf("Unsupported test result: %q", test.Result)
170*e7b1675dSTing-Kang Chang					}
171*e7b1675dSTing-Kang Chang				})
172*e7b1675dSTing-Kang Chang			}
173*e7b1675dSTing-Kang Chang		}
174*e7b1675dSTing-Kang Chang	}
175*e7b1675dSTing-Kang Chang}
176*e7b1675dSTing-Kang Chang
177*e7b1675dSTing-Kang Changfunc TestHKDFPRFHash(t *testing.T) {
178*e7b1675dSTing-Kang Chang	if _, err := subtle.NewHKDFPRF("SHA256", []byte{
179*e7b1675dSTing-Kang Chang		0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08,
180*e7b1675dSTing-Kang Chang		0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10}, []byte{}); err != nil {
181*e7b1675dSTing-Kang Chang		t.Errorf("Expected NewHKDFPRF to work with SHA256: %v", err)
182*e7b1675dSTing-Kang Chang	}
183*e7b1675dSTing-Kang Chang	if _, err := subtle.NewHKDFPRF("SHA512", []byte{
184*e7b1675dSTing-Kang Chang		0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08,
185*e7b1675dSTing-Kang Chang		0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10}, []byte{}); err != nil {
186*e7b1675dSTing-Kang Chang		t.Errorf("Expected NewHKDFPRF to work with SHA512: %v", err)
187*e7b1675dSTing-Kang Chang	}
188*e7b1675dSTing-Kang Chang	if _, err := subtle.NewHKDFPRF("SHA1", []byte{
189*e7b1675dSTing-Kang Chang		0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08,
190*e7b1675dSTing-Kang Chang		0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10}, []byte{}); err != nil {
191*e7b1675dSTing-Kang Chang		t.Errorf("Expected NewHKDFPRF to work with SHA1: %v", err)
192*e7b1675dSTing-Kang Chang	}
193*e7b1675dSTing-Kang Chang	if _, err := subtle.NewHKDFPRF("md5", []byte{
194*e7b1675dSTing-Kang Chang		0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08,
195*e7b1675dSTing-Kang Chang		0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10}, []byte{}); err == nil {
196*e7b1675dSTing-Kang Chang		t.Errorf("Expected NewHKDFPRF to fail with md5")
197*e7b1675dSTing-Kang Chang	}
198*e7b1675dSTing-Kang Chang}
199*e7b1675dSTing-Kang Chang
200*e7b1675dSTing-Kang Changfunc TestHKDFPRFSalt(t *testing.T) {
201*e7b1675dSTing-Kang Chang	if _, err := subtle.NewHKDFPRF("SHA256", []byte{
202*e7b1675dSTing-Kang Chang		0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08,
203*e7b1675dSTing-Kang Chang		0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10}, nil); err != nil {
204*e7b1675dSTing-Kang Chang		t.Errorf("Expected NewHKDFPRF to work nil salt: %v", err)
205*e7b1675dSTing-Kang Chang	}
206*e7b1675dSTing-Kang Chang	if _, err := subtle.NewHKDFPRF("SHA256", []byte{
207*e7b1675dSTing-Kang Chang		0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08,
208*e7b1675dSTing-Kang Chang		0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10}, []byte{}); err != nil {
209*e7b1675dSTing-Kang Chang		t.Errorf("Expected NewHKDFPRF to work empty salt: %v", err)
210*e7b1675dSTing-Kang Chang	}
211*e7b1675dSTing-Kang Chang	if _, err := subtle.NewHKDFPRF("SHA256", []byte{
212*e7b1675dSTing-Kang Chang		0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08,
213*e7b1675dSTing-Kang Chang		0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10}, []byte{0xaf, 0xfe, 0xc0, 0xff, 0xee}); err != nil {
214*e7b1675dSTing-Kang Chang		t.Errorf("Expected NewHKDFPRF to work with salt: %v", err)
215*e7b1675dSTing-Kang Chang	}
216*e7b1675dSTing-Kang Chang}
217*e7b1675dSTing-Kang Chang
218*e7b1675dSTing-Kang Changfunc TestHKDFPRFOutputLength(t *testing.T) {
219*e7b1675dSTing-Kang Chang	for hash, length := range map[string]int{"SHA1": 20, "SHA256": 32, "SHA512": 64} {
220*e7b1675dSTing-Kang Chang		prf, err := subtle.NewHKDFPRF(hash, []byte{
221*e7b1675dSTing-Kang Chang			0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08,
222*e7b1675dSTing-Kang Chang			0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10,
223*e7b1675dSTing-Kang Chang			0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08,
224*e7b1675dSTing-Kang Chang			0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10}, []byte{})
225*e7b1675dSTing-Kang Chang		if err != nil {
226*e7b1675dSTing-Kang Chang			t.Errorf("Expected NewHKDFPRF to work on 32 byte key with hash %s", hash)
227*e7b1675dSTing-Kang Chang		}
228*e7b1675dSTing-Kang Chang		for i := 0; i <= length*255; i++ {
229*e7b1675dSTing-Kang Chang			output, err := prf.ComputePRF([]byte{0x01, 0x02}, uint32(i))
230*e7b1675dSTing-Kang Chang			if err != nil {
231*e7b1675dSTing-Kang Chang				t.Errorf("Expected to be able to compute HKDF %s PRF with %d output length", hash, i)
232*e7b1675dSTing-Kang Chang			}
233*e7b1675dSTing-Kang Chang			if len(output) != i {
234*e7b1675dSTing-Kang Chang				t.Errorf("Expected HKDF %s PRF to compute %d bytes, got %d", hash, i, len(output))
235*e7b1675dSTing-Kang Chang			}
236*e7b1675dSTing-Kang Chang		}
237*e7b1675dSTing-Kang Chang		for i := length*255 + 1; i < length*255+100; i++ {
238*e7b1675dSTing-Kang Chang			_, err := prf.ComputePRF([]byte{0x01, 0x02}, uint32(i))
239*e7b1675dSTing-Kang Chang			if err == nil {
240*e7b1675dSTing-Kang Chang				t.Errorf("Expected to not be able to compute HKDF %s PRF with %d output length", hash, i)
241*e7b1675dSTing-Kang Chang			}
242*e7b1675dSTing-Kang Chang		}
243*e7b1675dSTing-Kang Chang	}
244*e7b1675dSTing-Kang Chang}
245*e7b1675dSTing-Kang Chang
246*e7b1675dSTing-Kang Changfunc TestValidateHKDFPRFParams(t *testing.T) {
247*e7b1675dSTing-Kang Chang	if err := subtle.ValidateHKDFPRFParams("SHA256", 32, []byte{}); err != nil {
248*e7b1675dSTing-Kang Chang		t.Errorf("Unexpected error for valid HKDF PRF params: %v", err)
249*e7b1675dSTing-Kang Chang	}
250*e7b1675dSTing-Kang Chang	if err := subtle.ValidateHKDFPRFParams("SHA256", 32, nil); err != nil {
251*e7b1675dSTing-Kang Chang		t.Errorf("Unexpected error for valid HKDF PRF params: %v", err)
252*e7b1675dSTing-Kang Chang	}
253*e7b1675dSTing-Kang Chang	if err := subtle.ValidateHKDFPRFParams("SHA256", 32, []byte{0xaf, 0xfe, 0xc0, 0xff, 0xee}); err != nil {
254*e7b1675dSTing-Kang Chang		t.Errorf("Unexpected error for salted valid HKDF PRF params: %v", err)
255*e7b1675dSTing-Kang Chang	}
256*e7b1675dSTing-Kang Chang	if err := subtle.ValidateHKDFPRFParams("SHA256", 4, []byte{}); err == nil {
257*e7b1675dSTing-Kang Chang		t.Errorf("Short key size not detected for HKDF PRF params")
258*e7b1675dSTing-Kang Chang	}
259*e7b1675dSTing-Kang Chang	if err := subtle.ValidateHKDFPRFParams("md5", 32, []byte{}); err == nil {
260*e7b1675dSTing-Kang Chang		t.Errorf("Weak hash function not detected for HKDF PRF params")
261*e7b1675dSTing-Kang Chang	}
262*e7b1675dSTing-Kang Chang	if err := subtle.ValidateHKDFPRFParams("SHA1", 32, []byte{}); err == nil {
263*e7b1675dSTing-Kang Chang		t.Errorf("Weak hash function not detected for HKDF PRF params")
264*e7b1675dSTing-Kang Chang	}
265*e7b1675dSTing-Kang Chang}
266