keying.go 1.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354
  1. package srtp
  2. const labelExtractorDtlsSrtp = "EXTRACTOR-dtls_srtp"
  3. // KeyingMaterialExporter allows package SRTP to extract keying material
  4. type KeyingMaterialExporter interface {
  5. ExportKeyingMaterial(label string, context []byte, length int) ([]byte, error)
  6. }
  7. // ExtractSessionKeysFromDTLS allows setting the Config SessionKeys by
  8. // extracting them from DTLS. This behavior is defined in RFC5764:
  9. // https://tools.ietf.org/html/rfc5764
  10. func (c *Config) ExtractSessionKeysFromDTLS(exporter KeyingMaterialExporter, isClient bool) error {
  11. keyLen, err := c.Profile.keyLen()
  12. if err != nil {
  13. return err
  14. }
  15. saltLen, err := c.Profile.saltLen()
  16. if err != nil {
  17. return err
  18. }
  19. keyingMaterial, err := exporter.ExportKeyingMaterial(labelExtractorDtlsSrtp, nil, (keyLen*2)+(saltLen*2))
  20. if err != nil {
  21. return err
  22. }
  23. offset := 0
  24. clientWriteKey := append([]byte{}, keyingMaterial[offset:offset+keyLen]...)
  25. offset += keyLen
  26. serverWriteKey := append([]byte{}, keyingMaterial[offset:offset+keyLen]...)
  27. offset += keyLen
  28. clientWriteKey = append(clientWriteKey, keyingMaterial[offset:offset+saltLen]...)
  29. offset += saltLen
  30. serverWriteKey = append(serverWriteKey, keyingMaterial[offset:offset+saltLen]...)
  31. if isClient {
  32. c.Keys.LocalMasterKey = clientWriteKey[0:keyLen]
  33. c.Keys.LocalMasterSalt = clientWriteKey[keyLen:]
  34. c.Keys.RemoteMasterKey = serverWriteKey[0:keyLen]
  35. c.Keys.RemoteMasterSalt = serverWriteKey[keyLen:]
  36. return nil
  37. }
  38. c.Keys.LocalMasterKey = serverWriteKey[0:keyLen]
  39. c.Keys.LocalMasterSalt = serverWriteKey[keyLen:]
  40. c.Keys.RemoteMasterKey = clientWriteKey[0:keyLen]
  41. c.Keys.RemoteMasterSalt = clientWriteKey[keyLen:]
  42. return nil
  43. }