55package dtls
66
77import (
8+ "bytes"
89 "crypto/hmac"
910 "crypto/md5"
1011 "crypto/sha1"
12+ "crypto/sha256"
1113 "hash"
1214)
1315
@@ -62,6 +64,13 @@ func pRF10(result, secret, label, seed []byte) {
6264 }
6365}
6466
67+ func pRF12 (result , secret , label , seed []byte ) {
68+ labelAndSeed := make ([]byte , len (label )+ len (seed ))
69+ copy (labelAndSeed , label )
70+ copy (labelAndSeed [len (label ):], seed )
71+ pHash (result , secret , labelAndSeed , sha256 .New )
72+ }
73+
6574const (
6675 tlsRandomLength = 32 // Length of a random nonce in TLS 1.1.
6776 masterSecretLength = 48 // Length of a master secret in TLS 1.1.
@@ -76,8 +85,11 @@ var serverFinishedLabel = []byte("server finished")
7685// keysFromPreMasterSecret generates the connection keys from the pre master
7786// secret, given the lengths of the MAC key, cipher key and IV, as defined in
7887// RFC 2246, section 6.3.
79- func keysFromPreMasterSecret (preMasterSecret , clientRandom , serverRandom []byte , macLen , keyLen int ) (masterSecret , clientMAC , serverMAC , clientKey , serverKey []byte ) {
88+ func keysFromPreMasterSecret (version protocolVersion , preMasterSecret , clientRandom , serverRandom []byte , macLen , keyLen int ) (masterSecret , clientMAC , serverMAC , clientKey , serverKey []byte ) {
8089 prf := pRF10
90+ if version == DTLS_12 {
91+ prf = pRF12
92+ }
8193
8294 var seed [tlsRandomLength * 2 ]byte
8395 copy (seed [0 :len (clientRandom )], clientRandom )
@@ -102,24 +114,13 @@ func keysFromPreMasterSecret(preMasterSecret, clientRandom, serverRandom []byte,
102114}
103115
104116func newFinishedHash () finishedHash {
105- return finishedHash {md5 . New (), sha1 . New (), md5 . New (), sha1 . New () }
117+ return finishedHash {Buffer : bytes. Buffer {} }
106118}
107119
108120// A finishedHash calculates the hash of a set of handshake messages suitable
109121// for including in a Finished message.
110122type finishedHash struct {
111- clientMD5 hash.Hash
112- clientSHA1 hash.Hash
113- serverMD5 hash.Hash
114- serverSHA1 hash.Hash
115- }
116-
117- func (h finishedHash ) Write (msg []byte ) (n int , err error ) {
118- h .clientMD5 .Write (msg )
119- h .clientSHA1 .Write (msg )
120- h .serverMD5 .Write (msg )
121- h .serverSHA1 .Write (msg )
122- return len (msg ), nil
123+ bytes.Buffer
123124}
124125
125126// finishedSum10 calculates the contents of the verify_data member of a TLSv1
@@ -134,18 +135,46 @@ func finishedSum10(md5, sha1, label, masterSecret []byte) []byte {
134135 return out
135136}
136137
137- // clientSum returns the contents of the verify_data member of a client's
138+ func finishedSum12 (hash , label , masterSecret []byte ) []byte {
139+ out := make ([]byte , finishedVerifyLength )
140+ pRF12 (out , masterSecret , label , hash )
141+ return out
142+ }
143+
144+ // clientSum10 returns the contents of the verify_data member of a client's
138145// Finished message.
139- func (h finishedHash ) clientSum (masterSecret []byte ) []byte {
140- md5 := h .clientMD5 .Sum (nil )
141- sha1 := h .clientSHA1 .Sum (nil )
142- return finishedSum10 (md5 , sha1 , clientFinishedLabel , masterSecret )
146+ func (h finishedHash ) clientSum10 (masterSecret []byte ) []byte {
147+ md5 := md5 .New ()
148+ md5 .Write (h .Bytes ())
149+ md5Digest := md5 .Sum (nil )
150+ sha1 := sha1 .New ()
151+ sha1 .Write (h .Bytes ())
152+ sha1Digest := sha1 .Sum (nil )
153+ return finishedSum10 (md5Digest , sha1Digest , clientFinishedLabel , masterSecret )
143154}
144155
145- // serverSum returns the contents of the verify_data member of a server's
156+ // serverSum10 returns the contents of the verify_data member of a server's
146157// Finished message.
147- func (h finishedHash ) serverSum (masterSecret []byte ) []byte {
148- md5 := h .serverMD5 .Sum (nil )
149- sha1 := h .serverSHA1 .Sum (nil )
150- return finishedSum10 (md5 , sha1 , serverFinishedLabel , masterSecret )
158+ func (h finishedHash ) serverSum10 (masterSecret []byte ) []byte {
159+ md5 := md5 .New ()
160+ md5 .Write (h .Bytes ())
161+ md5Digest := md5 .Sum (nil )
162+ sha1 := sha1 .New ()
163+ sha1 .Write (h .Bytes ())
164+ sha1Digest := sha1 .Sum (nil )
165+ return finishedSum10 (md5Digest , sha1Digest , serverFinishedLabel , masterSecret )
166+ }
167+
168+ func (h finishedHash ) clientSum12 (masterSecret []byte ) []byte {
169+ sha256 := sha256 .New ()
170+ sha256 .Write (h .Bytes ())
171+ sha256Digest := sha256 .Sum (nil )
172+ return finishedSum12 (sha256Digest , clientFinishedLabel , masterSecret )
173+ }
174+
175+ func (h finishedHash ) serverSum12 (masterSecret []byte ) []byte {
176+ sha256 := sha256 .New ()
177+ sha256 .Write (h .Bytes ())
178+ sha256Digest := sha256 .Sum (nil )
179+ return finishedSum12 (sha256Digest , serverFinishedLabel , masterSecret )
151180}
0 commit comments