ekmFromMasterSecret generates exported keying material as defined in RFC 5705.
(version uint16, suite *cipherSuite, masterSecret, clientRandom, serverRandom []byte)
| 252 | |
| 253 | // ekmFromMasterSecret generates exported keying material as defined in RFC 5705. |
| 254 | func 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 | } |
no test coverage detected
searching dependent graphs…