MCPcopy Index your code
hub / github.com/XTLS/Go / ekmFromMasterSecret

Function ekmFromMasterSecret

prf.go:254–283  ·  view source on GitHub ↗

ekmFromMasterSecret generates exported keying material as defined in RFC 5705.

(version uint16, suite *cipherSuite, masterSecret, clientRandom, serverRandom []byte)

Source from the content-addressed store, hash-verified

252
253// ekmFromMasterSecret generates exported keying material as defined in RFC 5705.
254func ekmFromMasterSecret(version uint16, suite *cipherSuite, masterSecret, clientRandom, serverRandom []byte) func(string, []byte, int) ([]byte, error) {
255 return func(label string, context []byte, length int) ([]byte, error) {
256 switch label {
257 case "client finished", "server finished", "master secret", "key expansion":
258 // These values are reserved and may not be used.
259 return nil, fmt.Errorf("crypto/tls: reserved ExportKeyingMaterial label: %s", label)
260 }
261
262 seedLen := len(serverRandom) + len(clientRandom)
263 if context != nil {
264 seedLen += 2 + len(context)
265 }
266 seed := make([]byte, 0, seedLen)
267
268 seed = append(seed, clientRandom...)
269 seed = append(seed, serverRandom...)
270
271 if context != nil {
272 if len(context) >= 1<<16 {
273 return nil, fmt.Errorf("crypto/tls: ExportKeyingMaterial context too long")
274 }
275 seed = append(seed, byte(len(context)>>8), byte(len(context)))
276 seed = append(seed, context...)
277 }
278
279 keyMaterial := make([]byte, length)
280 prfForVersion(version, suite)(keyMaterial, masterSecret, []byte(label), seed)
281 return keyMaterial, nil
282 }
283}

Callers 2

handshakeMethod · 0.85
handshakeMethod · 0.85

Calls 1

prfForVersionFunction · 0.85

Tested by

no test coverage detected

Used in the wild real call sites across dependent graphs

searching dependent graphs…