1// Copyright 2009 The Go Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style
3// license that can be found in the LICENSE file.
4
5package runner
6
7import (
8	"crypto"
9	"crypto/hmac"
10	"crypto/md5"
11	"crypto/sha1"
12	"crypto/sha256"
13	"hash"
14
15	"golang.org/x/crypto/hkdf"
16)
17
18// Split a premaster secret in two as specified in RFC 4346, section 5.
19func splitPreMasterSecret(secret []byte) (s1, s2 []byte) {
20	s1 = secret[0 : (len(secret)+1)/2]
21	s2 = secret[len(secret)/2:]
22	return
23}
24
25// pHash implements the P_hash function, as defined in RFC 4346, section 5.
26func pHash(result, secret, seed []byte, hash func() hash.Hash) {
27	h := hmac.New(hash, secret)
28	h.Write(seed)
29	a := h.Sum(nil)
30
31	j := 0
32	for j < len(result) {
33		h.Reset()
34		h.Write(a)
35		h.Write(seed)
36		b := h.Sum(nil)
37		todo := len(b)
38		if j+todo > len(result) {
39			todo = len(result) - j
40		}
41		copy(result[j:j+todo], b)
42		j += todo
43
44		h.Reset()
45		h.Write(a)
46		a = h.Sum(nil)
47	}
48}
49
50// prf10 implements the TLS 1.0 pseudo-random function, as defined in RFC 2246, section 5.
51func prf10(result, secret, label, seed []byte) {
52	hashSHA1 := sha1.New
53	hashMD5 := md5.New
54
55	labelAndSeed := make([]byte, len(label)+len(seed))
56	copy(labelAndSeed, label)
57	copy(labelAndSeed[len(label):], seed)
58
59	s1, s2 := splitPreMasterSecret(secret)
60	pHash(result, s1, labelAndSeed, hashMD5)
61	result2 := make([]byte, len(result))
62	pHash(result2, s2, labelAndSeed, hashSHA1)
63
64	for i, b := range result2 {
65		result[i] ^= b
66	}
67}
68
69// prf12 implements the TLS 1.2 pseudo-random function, as defined in RFC 5246, section 5.
70func prf12(hashFunc func() hash.Hash) func(result, secret, label, seed []byte) {
71	return func(result, secret, label, seed []byte) {
72		labelAndSeed := make([]byte, len(label)+len(seed))
73		copy(labelAndSeed, label)
74		copy(labelAndSeed[len(label):], seed)
75
76		pHash(result, secret, labelAndSeed, hashFunc)
77	}
78}
79
80// prf30 implements the SSL 3.0 pseudo-random function, as defined in
81// www.mozilla.org/projects/security/pki/nss/ssl/draft302.txt section 6.
82func prf30(result, secret, label, seed []byte) {
83	hashSHA1 := sha1.New()
84	hashMD5 := md5.New()
85
86	done := 0
87	i := 0
88	// RFC5246 section 6.3 says that the largest PRF output needed is 128
89	// bytes. Since no more ciphersuites will be added to SSLv3, this will
90	// remain true. Each iteration gives us 16 bytes so 10 iterations will
91	// be sufficient.
92	var b [11]byte
93	for done < len(result) {
94		for j := 0; j <= i; j++ {
95			b[j] = 'A' + byte(i)
96		}
97
98		hashSHA1.Reset()
99		hashSHA1.Write(b[:i+1])
100		hashSHA1.Write(secret)
101		hashSHA1.Write(seed)
102		digest := hashSHA1.Sum(nil)
103
104		hashMD5.Reset()
105		hashMD5.Write(secret)
106		hashMD5.Write(digest)
107
108		done += copy(result[done:], hashMD5.Sum(nil))
109		i++
110	}
111}
112
113const (
114	tlsRandomLength      = 32 // Length of a random nonce in TLS 1.1.
115	masterSecretLength   = 48 // Length of a master secret in TLS 1.1.
116	finishedVerifyLength = 12 // Length of verify_data in a Finished message.
117)
118
119var masterSecretLabel = []byte("master secret")
120var extendedMasterSecretLabel = []byte("extended master secret")
121var keyExpansionLabel = []byte("key expansion")
122var clientFinishedLabel = []byte("client finished")
123var serverFinishedLabel = []byte("server finished")
124var finishedLabel = []byte("finished")
125var channelIDLabel = []byte("TLS Channel ID signature\x00")
126var channelIDResumeLabel = []byte("Resumption\x00")
127
128func prfForVersion(version uint16, suite *cipherSuite) func(result, secret, label, seed []byte) {
129	switch version {
130	case VersionSSL30:
131		return prf30
132	case VersionTLS10, VersionTLS11:
133		return prf10
134	case VersionTLS12:
135		return prf12(suite.hash().New)
136	}
137	panic("unknown version")
138}
139
140// masterFromPreMasterSecret generates the master secret from the pre-master
141// secret. See http://tools.ietf.org/html/rfc5246#section-8.1
142func masterFromPreMasterSecret(version uint16, suite *cipherSuite, preMasterSecret, clientRandom, serverRandom []byte) []byte {
143	var seed [tlsRandomLength * 2]byte
144	copy(seed[0:len(clientRandom)], clientRandom)
145	copy(seed[len(clientRandom):], serverRandom)
146	masterSecret := make([]byte, masterSecretLength)
147	prfForVersion(version, suite)(masterSecret, preMasterSecret, masterSecretLabel, seed[0:])
148	return masterSecret
149}
150
151// extendedMasterFromPreMasterSecret generates the master secret from the
152// pre-master secret when the Triple Handshake fix is in effect. See
153// https://tools.ietf.org/html/rfc7627
154func extendedMasterFromPreMasterSecret(version uint16, suite *cipherSuite, preMasterSecret []byte, h finishedHash) []byte {
155	masterSecret := make([]byte, masterSecretLength)
156	prfForVersion(version, suite)(masterSecret, preMasterSecret, extendedMasterSecretLabel, h.Sum())
157	return masterSecret
158}
159
160// keysFromMasterSecret generates the connection keys from the master
161// secret, given the lengths of the MAC key, cipher key and IV, as defined in
162// RFC 2246, section 6.3.
163func keysFromMasterSecret(version uint16, suite *cipherSuite, masterSecret, clientRandom, serverRandom []byte, macLen, keyLen, ivLen int) (clientMAC, serverMAC, clientKey, serverKey, clientIV, serverIV []byte) {
164	var seed [tlsRandomLength * 2]byte
165	copy(seed[0:len(clientRandom)], serverRandom)
166	copy(seed[len(serverRandom):], clientRandom)
167
168	n := 2*macLen + 2*keyLen + 2*ivLen
169	keyMaterial := make([]byte, n)
170	prfForVersion(version, suite)(keyMaterial, masterSecret, keyExpansionLabel, seed[0:])
171	clientMAC = keyMaterial[:macLen]
172	keyMaterial = keyMaterial[macLen:]
173	serverMAC = keyMaterial[:macLen]
174	keyMaterial = keyMaterial[macLen:]
175	clientKey = keyMaterial[:keyLen]
176	keyMaterial = keyMaterial[keyLen:]
177	serverKey = keyMaterial[:keyLen]
178	keyMaterial = keyMaterial[keyLen:]
179	clientIV = keyMaterial[:ivLen]
180	keyMaterial = keyMaterial[ivLen:]
181	serverIV = keyMaterial[:ivLen]
182	return
183}
184
185func newFinishedHash(wireVersion uint16, isDTLS bool, cipherSuite *cipherSuite) finishedHash {
186	var ret finishedHash
187
188	version, ok := wireToVersion(wireVersion, isDTLS)
189	if !ok {
190		panic("unknown version")
191	}
192
193	if version >= VersionTLS12 {
194		ret.hash = cipherSuite.hash()
195
196		ret.client = ret.hash.New()
197		ret.server = ret.hash.New()
198
199		if version == VersionTLS12 {
200			ret.prf = prf12(ret.hash.New)
201		} else {
202			ret.secret = make([]byte, ret.hash.Size())
203		}
204	} else {
205		ret.hash = crypto.MD5SHA1
206
207		ret.client = sha1.New()
208		ret.server = sha1.New()
209		ret.clientMD5 = md5.New()
210		ret.serverMD5 = md5.New()
211
212		ret.prf = prf10
213	}
214
215	ret.buffer = []byte{}
216	ret.version = version
217	ret.wireVersion = wireVersion
218	return ret
219}
220
221// A finishedHash calculates the hash of a set of handshake messages suitable
222// for including in a Finished message.
223type finishedHash struct {
224	hash crypto.Hash
225
226	client hash.Hash
227	server hash.Hash
228
229	// Prior to TLS 1.2, an additional MD5 hash is required.
230	clientMD5 hash.Hash
231	serverMD5 hash.Hash
232
233	// In TLS 1.2 (and SSL 3 for implementation convenience), a
234	// full buffer is required.
235	buffer []byte
236
237	version     uint16
238	wireVersion uint16
239	prf         func(result, secret, label, seed []byte)
240
241	// secret, in TLS 1.3, is the running input secret.
242	secret []byte
243}
244
245func (h *finishedHash) UpdateForHelloRetryRequest() (err error) {
246	data := newByteBuilder()
247	data.addU8(typeMessageHash)
248	data.addU24(h.hash.Size())
249	data.addBytes(h.Sum())
250	h.client = h.hash.New()
251	h.server = h.hash.New()
252	if h.buffer != nil {
253		h.buffer = []byte{}
254	}
255	h.Write(data.finish())
256	return nil
257}
258
259func (h *finishedHash) Write(msg []byte) (n int, err error) {
260	h.client.Write(msg)
261	h.server.Write(msg)
262
263	if h.version < VersionTLS12 {
264		h.clientMD5.Write(msg)
265		h.serverMD5.Write(msg)
266	}
267
268	if h.buffer != nil {
269		h.buffer = append(h.buffer, msg...)
270	}
271
272	return len(msg), nil
273}
274
275func (h finishedHash) Sum() []byte {
276	if h.version >= VersionTLS12 {
277		return h.client.Sum(nil)
278	}
279
280	out := make([]byte, 0, md5.Size+sha1.Size)
281	out = h.clientMD5.Sum(out)
282	return h.client.Sum(out)
283}
284
285// finishedSum30 calculates the contents of the verify_data member of a SSLv3
286// Finished message given the MD5 and SHA1 hashes of a set of handshake
287// messages.
288func finishedSum30(md5, sha1 hash.Hash, masterSecret []byte, magic []byte) []byte {
289	md5.Write(magic)
290	md5.Write(masterSecret)
291	md5.Write(ssl30Pad1[:])
292	md5Digest := md5.Sum(nil)
293
294	md5.Reset()
295	md5.Write(masterSecret)
296	md5.Write(ssl30Pad2[:])
297	md5.Write(md5Digest)
298	md5Digest = md5.Sum(nil)
299
300	sha1.Write(magic)
301	sha1.Write(masterSecret)
302	sha1.Write(ssl30Pad1[:40])
303	sha1Digest := sha1.Sum(nil)
304
305	sha1.Reset()
306	sha1.Write(masterSecret)
307	sha1.Write(ssl30Pad2[:40])
308	sha1.Write(sha1Digest)
309	sha1Digest = sha1.Sum(nil)
310
311	ret := make([]byte, len(md5Digest)+len(sha1Digest))
312	copy(ret, md5Digest)
313	copy(ret[len(md5Digest):], sha1Digest)
314	return ret
315}
316
317var ssl3ClientFinishedMagic = [4]byte{0x43, 0x4c, 0x4e, 0x54}
318var ssl3ServerFinishedMagic = [4]byte{0x53, 0x52, 0x56, 0x52}
319
320// clientSum returns the contents of the verify_data member of a client's
321// Finished message.
322func (h finishedHash) clientSum(baseKey []byte) []byte {
323	if h.version == VersionSSL30 {
324		return finishedSum30(h.clientMD5, h.client, baseKey, ssl3ClientFinishedMagic[:])
325	}
326
327	if h.version < VersionTLS13 {
328		out := make([]byte, finishedVerifyLength)
329		h.prf(out, baseKey, clientFinishedLabel, h.Sum())
330		return out
331	}
332
333	clientFinishedKey := hkdfExpandLabel(h.hash, baseKey, finishedLabel, nil, h.hash.Size())
334	finishedHMAC := hmac.New(h.hash.New, clientFinishedKey)
335	finishedHMAC.Write(h.appendContextHashes(nil))
336	return finishedHMAC.Sum(nil)
337}
338
339// serverSum returns the contents of the verify_data member of a server's
340// Finished message.
341func (h finishedHash) serverSum(baseKey []byte) []byte {
342	if h.version == VersionSSL30 {
343		return finishedSum30(h.serverMD5, h.server, baseKey, ssl3ServerFinishedMagic[:])
344	}
345
346	if h.version < VersionTLS13 {
347		out := make([]byte, finishedVerifyLength)
348		h.prf(out, baseKey, serverFinishedLabel, h.Sum())
349		return out
350	}
351
352	serverFinishedKey := hkdfExpandLabel(h.hash, baseKey, finishedLabel, nil, h.hash.Size())
353	finishedHMAC := hmac.New(h.hash.New, serverFinishedKey)
354	finishedHMAC.Write(h.appendContextHashes(nil))
355	return finishedHMAC.Sum(nil)
356}
357
358// hashForClientCertificateSSL3 returns the hash to be signed for client
359// certificates in SSL 3.0.
360func (h finishedHash) hashForClientCertificateSSL3(masterSecret []byte) []byte {
361	md5Hash := md5.New()
362	md5Hash.Write(h.buffer)
363	sha1Hash := sha1.New()
364	sha1Hash.Write(h.buffer)
365	return finishedSum30(md5Hash, sha1Hash, masterSecret, nil)
366}
367
368// hashForChannelID returns the hash to be signed for TLS Channel
369// ID. If a resumption, resumeHash has the previous handshake
370// hash. Otherwise, it is nil.
371func (h finishedHash) hashForChannelID(resumeHash []byte) []byte {
372	hash := sha256.New()
373	hash.Write(channelIDLabel)
374	if resumeHash != nil {
375		hash.Write(channelIDResumeLabel)
376		hash.Write(resumeHash)
377	}
378	hash.Write(h.Sum())
379	return hash.Sum(nil)
380}
381
382// discardHandshakeBuffer is called when there is no more need to
383// buffer the entirety of the handshake messages.
384func (h *finishedHash) discardHandshakeBuffer() {
385	h.buffer = nil
386}
387
388// zeroSecretTLS13 returns the default all zeros secret for TLS 1.3, used when a
389// given secret is not available in the handshake. See RFC 8446, section 7.1.
390func (h *finishedHash) zeroSecret() []byte {
391	return make([]byte, h.hash.Size())
392}
393
394// addEntropy incorporates ikm into the running TLS 1.3 secret with HKDF-Expand.
395func (h *finishedHash) addEntropy(ikm []byte) {
396	h.secret = hkdf.Extract(h.hash.New, ikm, h.secret)
397}
398
399func (h *finishedHash) nextSecret() {
400	h.secret = hkdfExpandLabel(h.hash, h.secret, []byte("derived"), h.hash.New().Sum(nil), h.hash.Size())
401}
402
403// hkdfExpandLabel implements TLS 1.3's HKDF-Expand-Label function, as defined
404// in section 7.1 of RFC 8446.
405func hkdfExpandLabel(hash crypto.Hash, secret, label, hashValue []byte, length int) []byte {
406	if len(label) > 255 || len(hashValue) > 255 {
407		panic("hkdfExpandLabel: label or hashValue too long")
408	}
409
410	versionLabel := []byte("tls13 ")
411	hkdfLabel := make([]byte, 3+len(versionLabel)+len(label)+1+len(hashValue))
412	x := hkdfLabel
413	x[0] = byte(length >> 8)
414	x[1] = byte(length)
415	x[2] = byte(len(versionLabel) + len(label))
416	x = x[3:]
417	copy(x, versionLabel)
418	x = x[len(versionLabel):]
419	copy(x, label)
420	x = x[len(label):]
421	x[0] = byte(len(hashValue))
422	copy(x[1:], hashValue)
423	ret := make([]byte, length)
424	if n, err := hkdf.Expand(hash.New, secret, hkdfLabel).Read(ret); err != nil || n != length {
425		panic("hkdfExpandLabel: hkdf.Expand unexpectedly failed")
426	}
427	return ret
428}
429
430// appendContextHashes returns the concatenation of the handshake hash and the
431// resumption context hash, as used in TLS 1.3.
432func (h *finishedHash) appendContextHashes(b []byte) []byte {
433	b = h.client.Sum(b)
434	return b
435}
436
437// The following are labels for traffic secret derivation in TLS 1.3.
438var (
439	externalPSKBinderLabel        = []byte("ext binder")
440	resumptionPSKBinderLabel      = []byte("res binder")
441	earlyTrafficLabel             = []byte("c e traffic")
442	clientHandshakeTrafficLabel   = []byte("c hs traffic")
443	serverHandshakeTrafficLabel   = []byte("s hs traffic")
444	clientApplicationTrafficLabel = []byte("c ap traffic")
445	serverApplicationTrafficLabel = []byte("s ap traffic")
446	applicationTrafficLabel       = []byte("traffic upd")
447	earlyExporterLabel            = []byte("e exp master")
448	exporterLabel                 = []byte("exp master")
449	resumptionLabel               = []byte("res master")
450
451	resumptionPSKLabel = []byte("resumption")
452)
453
454// deriveSecret implements TLS 1.3's Derive-Secret function, as defined in
455// section 7.1 of draft ietf-tls-tls13-16.
456func (h *finishedHash) deriveSecret(label []byte) []byte {
457	return hkdfExpandLabel(h.hash, h.secret, label, h.appendContextHashes(nil), h.hash.Size())
458}
459
460// deriveSecretPeek is the same as deriveSecret, but it enables the caller to
461// tentatively append messages to the transcript. The |extraMessages| parameter
462// contains the bytes of these tentative messages.
463func (h *finishedHash) deriveSecretPeek(label []byte, extraMessages []byte) []byte {
464	hashPeek := h.hash.New()
465	hashPeek.Write(h.buffer)
466	hashPeek.Write(extraMessages)
467	return hkdfExpandLabel(h.hash, h.secret, label, hashPeek.Sum(nil), h.hash.Size())
468}
469
470// The following are context strings for CertificateVerify in TLS 1.3.
471var (
472	clientCertificateVerifyContextTLS13 = []byte("TLS 1.3, client CertificateVerify")
473	serverCertificateVerifyContextTLS13 = []byte("TLS 1.3, server CertificateVerify")
474	channelIDContextTLS13               = []byte("TLS 1.3, Channel ID")
475)
476
477// certificateVerifyMessage returns the input to be signed for CertificateVerify
478// in TLS 1.3.
479func (h *finishedHash) certificateVerifyInput(context []byte) []byte {
480	const paddingLen = 64
481	b := make([]byte, paddingLen, paddingLen+len(context)+1+2*h.hash.Size())
482	for i := 0; i < paddingLen; i++ {
483		b[i] = 32
484	}
485	b = append(b, context...)
486	b = append(b, 0)
487	b = h.appendContextHashes(b)
488	return b
489}
490
491type trafficDirection int
492
493const (
494	clientWrite trafficDirection = iota
495	serverWrite
496)
497
498var (
499	keyTLS13 = []byte("key")
500	ivTLS13  = []byte("iv")
501)
502
503// deriveTrafficAEAD derives traffic keys and constructs an AEAD given a traffic
504// secret.
505func deriveTrafficAEAD(version uint16, suite *cipherSuite, secret []byte, side trafficDirection) interface{} {
506	key := hkdfExpandLabel(suite.hash(), secret, keyTLS13, nil, suite.keyLen)
507	iv := hkdfExpandLabel(suite.hash(), secret, ivTLS13, nil, suite.ivLen(version))
508
509	return suite.aead(version, key, iv)
510}
511
512func updateTrafficSecret(hash crypto.Hash, version uint16, secret []byte) []byte {
513	return hkdfExpandLabel(hash, secret, applicationTrafficLabel, nil, hash.Size())
514}
515
516func computePSKBinder(psk []byte, version uint16, label []byte, cipherSuite *cipherSuite, clientHello, helloRetryRequest, truncatedHello []byte) []byte {
517	finishedHash := newFinishedHash(version, false, cipherSuite)
518	finishedHash.addEntropy(psk)
519	binderKey := finishedHash.deriveSecret(label)
520	finishedHash.Write(clientHello)
521	if len(helloRetryRequest) != 0 {
522		finishedHash.UpdateForHelloRetryRequest()
523	}
524	finishedHash.Write(helloRetryRequest)
525	finishedHash.Write(truncatedHello)
526	return finishedHash.clientSum(binderKey)
527}
528
529func deriveSessionPSK(suite *cipherSuite, version uint16, masterSecret []byte, nonce []byte) []byte {
530	hash := suite.hash()
531	return hkdfExpandLabel(hash, masterSecret, resumptionPSKLabel, nonce, hash.Size())
532}
533