werift 0.12.8 → 0.13.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (162) hide show
  1. package/lib/common/src/binary.d.ts +9 -0
  2. package/lib/common/src/binary.js +37 -1
  3. package/lib/common/src/binary.js.map +1 -1
  4. package/lib/dtls/src/context/srtp.d.ts +6 -2
  5. package/lib/dtls/src/context/srtp.js +9 -3
  6. package/lib/dtls/src/context/srtp.js.map +1 -1
  7. package/lib/dtls/src/flight/client/flight5.js.map +1 -1
  8. package/lib/dtls/src/flight/server/flight2.js.map +1 -1
  9. package/lib/dtls/src/socket.d.ts +3 -3
  10. package/lib/dtls/src/socket.js +6 -8
  11. package/lib/dtls/src/socket.js.map +1 -1
  12. package/lib/ice/src/utils.d.ts +1 -0
  13. package/lib/ice/src/utils.js +5 -1
  14. package/lib/ice/src/utils.js.map +1 -1
  15. package/lib/rtp/src/codec/base.d.ts +8 -0
  16. package/lib/rtp/src/codec/base.js +16 -0
  17. package/lib/rtp/src/codec/base.js.map +1 -0
  18. package/lib/rtp/src/codec/h264.d.ts +23 -2
  19. package/lib/rtp/src/codec/h264.js +66 -3
  20. package/lib/rtp/src/codec/h264.js.map +1 -1
  21. package/lib/rtp/src/codec/opus.d.ts +9 -0
  22. package/lib/rtp/src/codec/opus.js +18 -0
  23. package/lib/rtp/src/codec/opus.js.map +1 -0
  24. package/lib/rtp/src/codec/vp8.d.ts +18 -11
  25. package/lib/rtp/src/codec/vp8.js +51 -29
  26. package/lib/rtp/src/codec/vp8.js.map +1 -1
  27. package/lib/rtp/src/codec/vp9.d.ts +38 -10
  28. package/lib/rtp/src/codec/vp9.js +115 -26
  29. package/lib/rtp/src/codec/vp9.js.map +1 -1
  30. package/lib/rtp/src/index.d.ts +2 -0
  31. package/lib/rtp/src/index.js +2 -0
  32. package/lib/rtp/src/index.js.map +1 -1
  33. package/lib/rtp/src/rtcp/psfb/index.d.ts +2 -2
  34. package/lib/rtp/src/rtcp/psfb/index.js.map +1 -1
  35. package/lib/rtp/src/rtcp/rr.d.ts +2 -2
  36. package/lib/rtp/src/rtcp/rr.js.map +1 -1
  37. package/lib/rtp/src/rtcp/rtpfb/index.d.ts +2 -2
  38. package/lib/rtp/src/rtcp/rtpfb/index.js.map +1 -1
  39. package/lib/rtp/src/rtcp/sdes.d.ts +2 -2
  40. package/lib/rtp/src/rtcp/sdes.js.map +1 -1
  41. package/lib/rtp/src/rtcp/sr.d.ts +2 -2
  42. package/lib/rtp/src/rtcp/sr.js +36 -0
  43. package/lib/rtp/src/rtcp/sr.js.map +1 -1
  44. package/lib/rtp/src/rtp/rtp.d.ts +2 -0
  45. package/lib/rtp/src/rtp/rtp.js +2 -0
  46. package/lib/rtp/src/rtp/rtp.js.map +1 -1
  47. package/lib/rtp/src/srtp/cipher/ctr.d.ts +17 -0
  48. package/lib/rtp/src/srtp/cipher/ctr.js +103 -0
  49. package/lib/rtp/src/srtp/cipher/ctr.js.map +1 -0
  50. package/lib/rtp/src/srtp/cipher/gcm.d.ts +15 -0
  51. package/lib/rtp/src/srtp/cipher/gcm.js +106 -0
  52. package/lib/rtp/src/srtp/cipher/gcm.js.map +1 -0
  53. package/lib/rtp/src/srtp/cipher/index.d.ts +14 -0
  54. package/lib/rtp/src/srtp/cipher/index.js +25 -0
  55. package/lib/rtp/src/srtp/cipher/index.js.map +1 -0
  56. package/lib/rtp/src/srtp/const.d.ts +5 -0
  57. package/lib/rtp/src/srtp/const.js +23 -0
  58. package/lib/rtp/src/srtp/const.js.map +1 -0
  59. package/lib/rtp/src/srtp/context/context.d.ts +13 -11
  60. package/lib/rtp/src/srtp/context/context.js +23 -23
  61. package/lib/rtp/src/srtp/context/context.js.map +1 -1
  62. package/lib/rtp/src/srtp/context/srtcp.d.ts +3 -2
  63. package/lib/rtp/src/srtp/context/srtcp.js +10 -34
  64. package/lib/rtp/src/srtp/context/srtcp.js.map +1 -1
  65. package/lib/rtp/src/srtp/context/srtp.d.ts +4 -3
  66. package/lib/rtp/src/srtp/context/srtp.js +9 -28
  67. package/lib/rtp/src/srtp/context/srtp.js.map +1 -1
  68. package/lib/rtp/src/srtp/srtp.js +2 -2
  69. package/lib/rtp/src/srtp/srtp.js.map +1 -1
  70. package/lib/webrtc/src/const.d.ts +4 -3
  71. package/lib/webrtc/src/const.js +5 -4
  72. package/lib/webrtc/src/const.js.map +1 -1
  73. package/lib/webrtc/src/helper.d.ts +2 -2
  74. package/lib/webrtc/src/helper.js +2 -2
  75. package/lib/webrtc/src/helper.js.map +1 -1
  76. package/lib/webrtc/src/index.d.ts +6 -2
  77. package/lib/webrtc/src/index.js +6 -2
  78. package/lib/webrtc/src/index.js.map +1 -1
  79. package/lib/webrtc/src/{extension → media/extension}/rtcpFeedback.d.ts +1 -1
  80. package/lib/webrtc/src/{extension → media/extension}/rtcpFeedback.js +0 -0
  81. package/lib/webrtc/src/media/extension/rtcpFeedback.js.map +1 -0
  82. package/lib/webrtc/src/{extension → media/extension}/rtpExtension.d.ts +1 -1
  83. package/lib/webrtc/src/{extension → media/extension}/rtpExtension.js +1 -1
  84. package/lib/webrtc/src/media/extension/rtpExtension.js.map +1 -0
  85. package/lib/webrtc/src/media/{nack.d.ts → receiver/nack.d.ts} +2 -2
  86. package/lib/webrtc/src/media/{nack.js → receiver/nack.js} +2 -2
  87. package/lib/webrtc/src/media/receiver/nack.js.map +1 -0
  88. package/lib/webrtc/src/media/{statistics.d.ts → receiver/statistics.d.ts} +1 -1
  89. package/lib/webrtc/src/media/{statistics.js → receiver/statistics.js} +1 -1
  90. package/lib/webrtc/src/media/receiver/statistics.js.map +1 -0
  91. package/lib/webrtc/src/media/router.js +1 -1
  92. package/lib/webrtc/src/media/router.js.map +1 -1
  93. package/lib/webrtc/src/media/rtpReceiver.d.ts +4 -2
  94. package/lib/webrtc/src/media/rtpReceiver.js +13 -6
  95. package/lib/webrtc/src/media/rtpReceiver.js.map +1 -1
  96. package/lib/webrtc/src/media/rtpSender.d.ts +4 -4
  97. package/lib/webrtc/src/media/rtpSender.js +12 -6
  98. package/lib/webrtc/src/media/rtpSender.js.map +1 -1
  99. package/lib/webrtc/src/media/{senderBWE → sender}/cumulativeResult.d.ts +0 -0
  100. package/lib/webrtc/src/media/{senderBWE → sender}/cumulativeResult.js +0 -0
  101. package/lib/webrtc/src/media/sender/cumulativeResult.js.map +1 -0
  102. package/lib/webrtc/src/media/{senderBWE → sender}/senderBWE.d.ts +0 -0
  103. package/lib/webrtc/src/media/{senderBWE → sender}/senderBWE.js +0 -0
  104. package/lib/webrtc/src/media/sender/senderBWE.js.map +1 -0
  105. package/lib/webrtc/src/media/track.d.ts +3 -0
  106. package/lib/webrtc/src/media/track.js +2 -0
  107. package/lib/webrtc/src/media/track.js.map +1 -1
  108. package/lib/webrtc/src/nonstandard/jitterBuffer.d.ts +12 -0
  109. package/lib/webrtc/src/nonstandard/jitterBuffer.js +48 -0
  110. package/lib/webrtc/src/nonstandard/jitterBuffer.js.map +1 -0
  111. package/lib/webrtc/src/nonstandard/lipsync.d.ts +20 -0
  112. package/lib/webrtc/src/nonstandard/lipsync.js +39 -0
  113. package/lib/webrtc/src/nonstandard/lipsync.js.map +1 -0
  114. package/lib/webrtc/src/nonstandard/recorder.d.ts +18 -0
  115. package/lib/webrtc/src/nonstandard/recorder.js +25 -0
  116. package/lib/webrtc/src/nonstandard/recorder.js.map +1 -0
  117. package/lib/webrtc/src/nonstandard/sampleBuilder.d.ts +18 -0
  118. package/lib/webrtc/src/nonstandard/sampleBuilder.js +60 -0
  119. package/lib/webrtc/src/nonstandard/sampleBuilder.js.map +1 -0
  120. package/lib/webrtc/src/nonstandard/userMedia.d.ts +15 -0
  121. package/lib/webrtc/src/nonstandard/userMedia.js +67 -0
  122. package/lib/webrtc/src/nonstandard/userMedia.js.map +1 -0
  123. package/lib/webrtc/src/nonstandard/webm.d.ts +24 -0
  124. package/lib/webrtc/src/nonstandard/webm.js +308 -0
  125. package/lib/webrtc/src/nonstandard/webm.js.map +1 -0
  126. package/lib/webrtc/src/peerConnection.js +1 -0
  127. package/lib/webrtc/src/peerConnection.js.map +1 -1
  128. package/lib/webrtc/src/transport/dtls.d.ts +2 -1
  129. package/lib/webrtc/src/transport/dtls.js +7 -3
  130. package/lib/webrtc/src/transport/dtls.js.map +1 -1
  131. package/lib/webrtc/src/utils.d.ts +3 -0
  132. package/lib/webrtc/src/utils.js +13 -9
  133. package/lib/webrtc/src/utils.js.map +1 -1
  134. package/package.json +5 -4
  135. package/src/const.ts +8 -3
  136. package/src/helper.ts +4 -4
  137. package/src/index.ts +6 -2
  138. package/src/{extension → media/extension}/rtcpFeedback.ts +1 -1
  139. package/src/{extension → media/extension}/rtpExtension.ts +1 -1
  140. package/src/media/{nack.ts → receiver/nack.ts} +3 -3
  141. package/src/media/{statistics.ts → receiver/statistics.ts} +2 -2
  142. package/src/media/router.ts +1 -1
  143. package/src/media/rtpReceiver.ts +11 -7
  144. package/src/media/rtpSender.ts +19 -9
  145. package/src/media/{senderBWE → sender}/cumulativeResult.ts +0 -0
  146. package/src/media/{senderBWE → sender}/senderBWE.ts +0 -0
  147. package/src/media/track.ts +6 -0
  148. package/src/nonstandard/jitterBuffer.ts +47 -0
  149. package/src/nonstandard/lipsync.ts +55 -0
  150. package/src/nonstandard/recorder.ts +26 -0
  151. package/src/nonstandard/sampleBuilder.ts +71 -0
  152. package/src/nonstandard/userMedia.ts +74 -0
  153. package/src/nonstandard/webm.ts +421 -0
  154. package/src/peerConnection.ts +3 -1
  155. package/src/transport/dtls.ts +12 -4
  156. package/src/utils.ts +20 -12
  157. package/lib/webrtc/src/extension/rtcpFeedback.js.map +0 -1
  158. package/lib/webrtc/src/extension/rtpExtension.js.map +0 -1
  159. package/lib/webrtc/src/media/nack.js.map +0 -1
  160. package/lib/webrtc/src/media/senderBWE/cumulativeResult.js.map +0 -1
  161. package/lib/webrtc/src/media/senderBWE/senderBWE.js.map +0 -1
  162. package/lib/webrtc/src/media/statistics.js.map +0 -1
@@ -0,0 +1,25 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.CipherAesBase = void 0;
4
+ class CipherAesBase {
5
+ constructor(srtpSessionKey, srtpSessionSalt, srtcpSessionKey, srtcpSessionSalt) {
6
+ this.srtpSessionKey = srtpSessionKey;
7
+ this.srtpSessionSalt = srtpSessionSalt;
8
+ this.srtcpSessionKey = srtcpSessionKey;
9
+ this.srtcpSessionSalt = srtcpSessionSalt;
10
+ }
11
+ encryptRtp(header, payload, rolloverCounter) {
12
+ return Buffer.from([]);
13
+ }
14
+ decryptRtp(cipherText, rolloverCounter) {
15
+ return [];
16
+ }
17
+ encryptRTCP(rawRtcp, srtcpIndex) {
18
+ return Buffer.from([]);
19
+ }
20
+ decryptRTCP(encrypted) {
21
+ return [];
22
+ }
23
+ }
24
+ exports.CipherAesBase = CipherAesBase;
25
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../../rtp/src/srtp/cipher/index.ts"],"names":[],"mappings":";;;AAGA,MAAsB,aAAa;IACjC,YACS,cAAsB,EACtB,eAAuB,EACvB,eAAuB,EACvB,gBAAwB;QAHxB,mBAAc,GAAd,cAAc,CAAQ;QACtB,oBAAe,GAAf,eAAe,CAAQ;QACvB,oBAAe,GAAf,eAAe,CAAQ;QACvB,qBAAgB,GAAhB,gBAAgB,CAAQ;IAC9B,CAAC;IAEJ,UAAU,CACR,MAAiB,EACjB,OAAe,EACf,eAAuB;QAEvB,OAAO,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACzB,CAAC;IAED,UAAU,CAAC,UAAkB,EAAE,eAAuB;QACpD,OAAO,EAAS,CAAC;IACnB,CAAC;IAED,WAAW,CAAC,OAAe,EAAE,UAAkB;QAC7C,OAAO,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACzB,CAAC;IAED,WAAW,CAAC,SAAiB;QAC3B,OAAO,EAAS,CAAC;IACnB,CAAC;CACF;AA3BD,sCA2BC","sourcesContent":["import { RtcpHeader } from \"../../rtcp/header\";\nimport { RtpHeader } from \"../../rtp/rtp\";\n\nexport abstract class CipherAesBase {\n constructor(\n public srtpSessionKey: Buffer,\n public srtpSessionSalt: Buffer,\n public srtcpSessionKey: Buffer,\n public srtcpSessionSalt: Buffer\n ) {}\n\n encryptRtp(\n header: RtpHeader,\n payload: Buffer,\n rolloverCounter: number\n ): Buffer {\n return Buffer.from([]);\n }\n\n decryptRtp(cipherText: Buffer, rolloverCounter: number): [Buffer, RtpHeader] {\n return [] as any;\n }\n\n encryptRTCP(rawRtcp: Buffer, srtcpIndex: number): Buffer {\n return Buffer.from([]);\n }\n\n decryptRTCP(encrypted: Buffer): [Buffer, RtcpHeader] {\n return [] as any;\n }\n}\n"]}
@@ -0,0 +1,5 @@
1
+ export declare const ProtectionProfileAes128CmHmacSha1_80: 1;
2
+ export declare const ProtectionProfileAeadAes128Gcm: 7;
3
+ export declare type Profile = typeof ProtectionProfileAes128CmHmacSha1_80 | typeof ProtectionProfileAeadAes128Gcm;
4
+ export declare const keyLength: (profile: Profile) => number;
5
+ export declare const saltLength: (profile: Profile) => 12 | 14;
@@ -0,0 +1,23 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.saltLength = exports.keyLength = exports.ProtectionProfileAeadAes128Gcm = exports.ProtectionProfileAes128CmHmacSha1_80 = void 0;
4
+ exports.ProtectionProfileAes128CmHmacSha1_80 = 0x0001;
5
+ exports.ProtectionProfileAeadAes128Gcm = 0x0007;
6
+ const keyLength = (profile) => {
7
+ switch (profile) {
8
+ case exports.ProtectionProfileAes128CmHmacSha1_80:
9
+ case exports.ProtectionProfileAeadAes128Gcm:
10
+ return 16;
11
+ }
12
+ };
13
+ exports.keyLength = keyLength;
14
+ const saltLength = (profile) => {
15
+ switch (profile) {
16
+ case exports.ProtectionProfileAes128CmHmacSha1_80:
17
+ return 14;
18
+ case exports.ProtectionProfileAeadAes128Gcm:
19
+ return 12;
20
+ }
21
+ };
22
+ exports.saltLength = saltLength;
23
+ //# sourceMappingURL=const.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"const.js","sourceRoot":"","sources":["../../../../../rtp/src/srtp/const.ts"],"names":[],"mappings":";;;AAAa,QAAA,oCAAoC,GAAG,MAAe,CAAC;AACvD,QAAA,8BAA8B,GAAG,MAAe,CAAC;AAMvD,MAAM,SAAS,GAAG,CAAC,OAAgB,EAAE,EAAE;IAC5C,QAAQ,OAAO,EAAE;QACf,KAAK,4CAAoC,CAAC;QAC1C,KAAK,sCAA8B;YACjC,OAAO,EAAE,CAAC;KACb;AACH,CAAC,CAAC;AANW,QAAA,SAAS,aAMpB;AAEK,MAAM,UAAU,GAAG,CAAC,OAAgB,EAAE,EAAE;IAC7C,QAAQ,OAAO,EAAE;QACf,KAAK,4CAAoC;YACvC,OAAO,EAAE,CAAC;QACZ,KAAK,sCAA8B;YACjC,OAAO,EAAE,CAAC;KACb;AACH,CAAC,CAAC;AAPW,QAAA,UAAU,cAOrB","sourcesContent":["export const ProtectionProfileAes128CmHmacSha1_80 = 0x0001 as const;\nexport const ProtectionProfileAeadAes128Gcm = 0x0007 as const;\n\nexport type Profile =\n | typeof ProtectionProfileAes128CmHmacSha1_80\n | typeof ProtectionProfileAeadAes128Gcm;\n\nexport const keyLength = (profile: Profile) => {\n switch (profile) {\n case ProtectionProfileAes128CmHmacSha1_80:\n case ProtectionProfileAeadAes128Gcm:\n return 16;\n }\n};\n\nexport const saltLength = (profile: Profile) => {\n switch (profile) {\n case ProtectionProfileAes128CmHmacSha1_80:\n return 14;\n case ProtectionProfileAeadAes128Gcm:\n return 12;\n }\n};\n"]}
@@ -1,36 +1,38 @@
1
1
  /// <reference types="node" />
2
+ import { Hmac } from "crypto";
3
+ import { CipherAesBase } from "../cipher";
4
+ import { Profile } from "../const";
2
5
  export declare class Context {
3
6
  masterKey: Buffer;
4
7
  masterSalt: Buffer;
5
- profile: number;
8
+ profile: Profile;
6
9
  srtpSSRCStates: {
7
- [ssrc: number]: SrtpSSRCState;
10
+ [ssrc: number]: SrtpSsrcState;
8
11
  };
9
12
  srtpSessionKey: Buffer;
10
13
  srtpSessionSalt: Buffer;
11
14
  srtpSessionAuthTag: Buffer;
12
- srtpSessionAuth: import("crypto").Hmac;
15
+ srtpSessionAuth: Hmac;
13
16
  srtcpSSRCStates: {
14
17
  [ssrc: number]: SrtcpSSRCState;
15
18
  };
16
19
  srtcpSessionKey: Buffer;
17
20
  srtcpSessionSalt: Buffer;
18
21
  srtcpSessionAuthTag: Buffer;
19
- srtcpSessionAuth: import("crypto").Hmac;
20
- constructor(masterKey: Buffer, masterSalt: Buffer, profile: number);
22
+ srtcpSessionAuth: Hmac;
23
+ cipher: CipherAesBase;
24
+ constructor(masterKey: Buffer, masterSalt: Buffer, profile: Profile);
21
25
  generateSessionKey(label: number): Buffer;
22
26
  generateSessionSalt(label: number): Buffer;
23
27
  generateSessionAuthTag(label: number): Buffer;
24
- getSRTPSRRCState(ssrc: number): SrtpSSRCState;
25
- getSRTCPSSRCState(ssrc: number): SrtcpSSRCState;
26
- updateRolloverCount(sequenceNumber: number, s: SrtpSSRCState): void;
27
- generateCounter(sequenceNumber: number, rolloverCounter: number, ssrc: number, sessionSalt: Buffer): Buffer;
28
+ getSrtpSsrcState(ssrc: number): SrtpSsrcState;
29
+ getSrtcpSsrcState(ssrc: number): SrtcpSSRCState;
30
+ updateRolloverCount(sequenceNumber: number, s: SrtpSsrcState): void;
28
31
  generateSrtpAuthTag(buf: Buffer, roc: number): Buffer;
29
- generateSrtcpAuthTag(buf: Buffer): Buffer;
30
32
  index(ssrc: number): number;
31
33
  setIndex(ssrc: number, index: number): void;
32
34
  }
33
- export interface SrtpSSRCState {
35
+ export interface SrtpSsrcState {
34
36
  ssrc: number;
35
37
  rolloverCounter: number;
36
38
  rolloverHasProcessed?: boolean;
@@ -1,28 +1,42 @@
1
1
  "use strict";
2
- var __importDefault = (this && this.__importDefault) || function (mod) {
3
- return (mod && mod.__esModule) ? mod : { "default": mod };
4
- };
5
2
  Object.defineProperty(exports, "__esModule", { value: true });
6
3
  exports.Context = void 0;
7
4
  const aes_js_1 = require("aes-js");
8
- const big_integer_1 = __importDefault(require("big-integer"));
9
5
  const crypto_1 = require("crypto");
10
- const lodash_1 = require("lodash");
6
+ const ctr_1 = require("../cipher/ctr");
7
+ const gcm_1 = require("../cipher/gcm");
8
+ const const_1 = require("../const");
11
9
  class Context {
12
10
  constructor(masterKey, masterSalt, profile) {
13
11
  this.masterKey = masterKey;
14
12
  this.masterSalt = masterSalt;
15
13
  this.profile = profile;
16
14
  this.srtpSSRCStates = {};
15
+ this.srtcpSSRCStates = {};
16
+ {
17
+ // aes-js plaintext require 16byte
18
+ // so need to padding to 14 byte
19
+ const diff = 14 - masterSalt.length;
20
+ if (diff > 0) {
21
+ this.masterSalt = Buffer.concat([masterSalt, Buffer.alloc(diff)]);
22
+ }
23
+ }
17
24
  this.srtpSessionKey = this.generateSessionKey(0);
18
25
  this.srtpSessionSalt = this.generateSessionSalt(2);
19
26
  this.srtpSessionAuthTag = this.generateSessionAuthTag(1);
20
27
  this.srtpSessionAuth = crypto_1.createHmac("sha1", this.srtpSessionAuthTag);
21
- this.srtcpSSRCStates = {};
22
28
  this.srtcpSessionKey = this.generateSessionKey(3);
23
29
  this.srtcpSessionSalt = this.generateSessionSalt(5);
24
30
  this.srtcpSessionAuthTag = this.generateSessionAuthTag(4);
25
31
  this.srtcpSessionAuth = crypto_1.createHmac("sha1", this.srtcpSessionAuthTag);
32
+ switch (profile) {
33
+ case const_1.ProtectionProfileAes128CmHmacSha1_80:
34
+ this.cipher = new ctr_1.CipherAesCtr(this.srtpSessionKey, this.srtpSessionSalt, this.srtcpSessionKey, this.srtcpSessionSalt, this.srtpSessionAuthTag, this.srtcpSessionAuthTag);
35
+ break;
36
+ case const_1.ProtectionProfileAeadAes128Gcm:
37
+ this.cipher = new gcm_1.CipherAesGcm(this.srtpSessionKey, this.srtpSessionSalt, this.srtcpSessionKey, this.srtcpSessionSalt);
38
+ break;
39
+ }
26
40
  }
27
41
  generateSessionKey(label) {
28
42
  let sessionKey = Buffer.from(this.masterSalt);
@@ -82,7 +96,7 @@ class Context {
82
96
  secondRun = Buffer.from(block.encrypt(secondRun));
83
97
  return Buffer.concat([firstRun, secondRun.slice(0, 4)]);
84
98
  }
85
- getSRTPSRRCState(ssrc) {
99
+ getSrtpSsrcState(ssrc) {
86
100
  let s = this.srtpSSRCStates[ssrc];
87
101
  if (s)
88
102
  return s;
@@ -94,7 +108,7 @@ class Context {
94
108
  this.srtpSSRCStates[ssrc] = s;
95
109
  return s;
96
110
  }
97
- getSRTCPSSRCState(ssrc) {
111
+ getSrtcpSsrcState(ssrc) {
98
112
  let s = this.srtcpSSRCStates[ssrc];
99
113
  if (s)
100
114
  return s;
@@ -130,16 +144,6 @@ class Context {
130
144
  }
131
145
  s.lastSequenceNumber = sequenceNumber;
132
146
  }
133
- generateCounter(sequenceNumber, rolloverCounter, ssrc, sessionSalt) {
134
- const counter = Buffer.alloc(16);
135
- counter.writeUInt32BE(ssrc, 4);
136
- counter.writeUInt32BE(rolloverCounter, 8);
137
- counter.writeUInt32BE(big_integer_1.default(sequenceNumber).shiftLeft(16).toJSNumber(), 12);
138
- lodash_1.range(sessionSalt.length).forEach((i) => {
139
- counter[i] = counter[i] ^ sessionSalt[i];
140
- });
141
- return counter;
142
- }
143
147
  generateSrtpAuthTag(buf, roc) {
144
148
  this.srtpSessionAuth = crypto_1.createHmac("sha1", this.srtpSessionAuthTag);
145
149
  const rocRaw = Buffer.alloc(4);
@@ -150,10 +154,6 @@ class Context {
150
154
  .digest()
151
155
  .slice(0, 10);
152
156
  }
153
- generateSrtcpAuthTag(buf) {
154
- this.srtcpSessionAuth = crypto_1.createHmac("sha1", this.srtcpSessionAuthTag);
155
- return this.srtcpSessionAuth.update(buf).digest().slice(0, 10);
156
- }
157
157
  index(ssrc) {
158
158
  const s = this.srtcpSSRCStates[ssrc];
159
159
  if (!s) {
@@ -162,7 +162,7 @@ class Context {
162
162
  return s.srtcpIndex;
163
163
  }
164
164
  setIndex(ssrc, index) {
165
- const s = this.getSRTCPSSRCState(ssrc);
165
+ const s = this.getSrtcpSsrcState(ssrc);
166
166
  s.srtcpIndex = index % 0x7fffffff;
167
167
  }
168
168
  }
@@ -1 +1 @@
1
- {"version":3,"file":"context.js","sourceRoot":"","sources":["../../../../../../rtp/src/srtp/context/context.ts"],"names":[],"mappings":"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","sourcesContent":["import { AES } from \"aes-js\";\nimport bigInt from \"big-integer\";\nimport { createHmac } from \"crypto\";\nimport { range } from \"lodash\";\n\nexport class Context {\n srtpSSRCStates: { [ssrc: number]: SrtpSSRCState } = {};\n srtpSessionKey = this.generateSessionKey(0);\n srtpSessionSalt = this.generateSessionSalt(2);\n srtpSessionAuthTag = this.generateSessionAuthTag(1);\n srtpSessionAuth = createHmac(\"sha1\", this.srtpSessionAuthTag);\n srtcpSSRCStates: { [ssrc: number]: SrtcpSSRCState } = {};\n srtcpSessionKey = this.generateSessionKey(3);\n srtcpSessionSalt = this.generateSessionSalt(5);\n srtcpSessionAuthTag = this.generateSessionAuthTag(4);\n srtcpSessionAuth = createHmac(\"sha1\", this.srtcpSessionAuthTag);\n\n constructor(\n public masterKey: Buffer,\n public masterSalt: Buffer,\n public profile: number\n ) {}\n\n generateSessionKey(label: number) {\n let sessionKey = Buffer.from(this.masterSalt);\n\n const labelAndIndexOverKdr = Buffer.from([\n label,\n 0x00,\n 0x00,\n 0x00,\n 0x00,\n 0x00,\n 0x00,\n ]);\n for (\n let i = labelAndIndexOverKdr.length - 1, j = sessionKey.length - 1;\n i >= 0;\n i--, j--\n ) {\n sessionKey[j] = sessionKey[j] ^ labelAndIndexOverKdr[i];\n }\n\n sessionKey = Buffer.concat([sessionKey, Buffer.from([0x00, 0x00])]);\n const block = new AES(this.masterKey);\n return Buffer.from(block.encrypt(sessionKey) as ArrayBuffer);\n }\n\n generateSessionSalt(label: number) {\n let sessionSalt = Buffer.from(this.masterSalt);\n const labelAndIndexOverKdr = Buffer.from([\n label,\n 0x00,\n 0x00,\n 0x00,\n 0x00,\n 0x00,\n 0x00,\n ]);\n for (\n let i = labelAndIndexOverKdr.length - 1, j = sessionSalt.length - 1;\n i >= 0;\n i--, j--\n ) {\n sessionSalt[j] = sessionSalt[j] ^ labelAndIndexOverKdr[i];\n }\n sessionSalt = Buffer.concat([sessionSalt, Buffer.from([0x00, 0x00])]);\n const block = new AES(this.masterKey);\n sessionSalt = Buffer.from(block.encrypt(sessionSalt) as ArrayBuffer);\n return sessionSalt.slice(0, 14);\n }\n\n generateSessionAuthTag(label: number) {\n const sessionAuthTag = Buffer.from(this.masterSalt);\n const labelAndIndexOverKdr = Buffer.from([\n label,\n 0x00,\n 0x00,\n 0x00,\n 0x00,\n 0x00,\n 0x00,\n ]);\n for (\n let i = labelAndIndexOverKdr.length - 1, j = sessionAuthTag.length - 1;\n i >= 0;\n i--, j--\n ) {\n sessionAuthTag[j] = sessionAuthTag[j] ^ labelAndIndexOverKdr[i];\n }\n let firstRun = Buffer.concat([sessionAuthTag, Buffer.from([0x00, 0x00])]);\n let secondRun = Buffer.concat([sessionAuthTag, Buffer.from([0x00, 0x01])]);\n const block = new AES(this.masterKey);\n firstRun = Buffer.from(block.encrypt(firstRun) as ArrayBuffer);\n secondRun = Buffer.from(block.encrypt(secondRun) as ArrayBuffer);\n return Buffer.concat([firstRun, secondRun.slice(0, 4)]);\n }\n\n getSRTPSRRCState(ssrc: number) {\n let s = this.srtpSSRCStates[ssrc];\n if (s) return s;\n s = {\n ssrc,\n rolloverCounter: 0,\n lastSequenceNumber: 0,\n };\n this.srtpSSRCStates[ssrc] = s;\n return s;\n }\n\n getSRTCPSSRCState(ssrc: number) {\n let s = this.srtcpSSRCStates[ssrc];\n if (s) return s;\n s = {\n srtcpIndex: 0,\n ssrc,\n };\n this.srtcpSSRCStates[ssrc] = s;\n return s;\n }\n\n // 3.3.1. Packet Index Determination, and ROC, s_l Update\n // In particular, out-of-order RTP packets with\n // sequence numbers close to 2^16 or zero must be properly handled.\n updateRolloverCount(sequenceNumber: number, s: SrtpSSRCState) {\n if (!s.rolloverHasProcessed) {\n s.rolloverHasProcessed = true;\n } else if (sequenceNumber === 0) {\n if (s.lastSequenceNumber > MaxROCDisorder) {\n s.rolloverCounter++;\n }\n } else if (\n s.lastSequenceNumber < MaxROCDisorder &&\n sequenceNumber > MaxSequenceNumber - MaxROCDisorder\n ) {\n // https://github.com/shinyoshiaki/werift-webrtc/issues/94\n if (s.rolloverCounter > 0) {\n s.rolloverCounter--;\n }\n } else if (\n sequenceNumber < MaxROCDisorder &&\n s.lastSequenceNumber > MaxSequenceNumber - MaxROCDisorder\n ) {\n s.rolloverCounter++;\n }\n s.lastSequenceNumber = sequenceNumber;\n }\n\n generateCounter(\n sequenceNumber: number,\n rolloverCounter: number,\n ssrc: number,\n sessionSalt: Buffer\n ) {\n const counter = Buffer.alloc(16);\n counter.writeUInt32BE(ssrc, 4);\n counter.writeUInt32BE(rolloverCounter, 8);\n counter.writeUInt32BE(\n bigInt(sequenceNumber).shiftLeft(16).toJSNumber(),\n 12\n );\n\n range(sessionSalt.length).forEach((i) => {\n counter[i] = counter[i] ^ sessionSalt[i];\n });\n return counter;\n }\n\n generateSrtpAuthTag(buf: Buffer, roc: number) {\n this.srtpSessionAuth = createHmac(\"sha1\", this.srtpSessionAuthTag);\n const rocRaw = Buffer.alloc(4);\n rocRaw.writeUInt32BE(roc);\n\n return this.srtpSessionAuth\n .update(buf)\n .update(rocRaw)\n .digest()\n .slice(0, 10);\n }\n\n generateSrtcpAuthTag(buf: Buffer) {\n this.srtcpSessionAuth = createHmac(\"sha1\", this.srtcpSessionAuthTag);\n return this.srtcpSessionAuth.update(buf).digest().slice(0, 10);\n }\n\n index(ssrc: number) {\n const s = this.srtcpSSRCStates[ssrc];\n if (!s) {\n return 0;\n }\n return s.srtcpIndex;\n }\n\n setIndex(ssrc: number, index: number) {\n const s = this.getSRTCPSSRCState(ssrc);\n s.srtcpIndex = index % 0x7fffffff;\n }\n}\n\nexport interface SrtpSSRCState {\n ssrc: number;\n rolloverCounter: number;\n rolloverHasProcessed?: boolean;\n lastSequenceNumber: number;\n}\n\nexport type SrtcpSSRCState = {\n srtcpIndex: number;\n ssrc: number;\n};\n\nconst MaxROCDisorder = 100;\nconst MaxSequenceNumber = 65535;\n"]}
1
+ {"version":3,"file":"context.js","sourceRoot":"","sources":["../../../../../../rtp/src/srtp/context/context.ts"],"names":[],"mappings":"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","sourcesContent":["import { AES } from \"aes-js\";\nimport { createHmac, Hmac } from \"crypto\";\n\nimport { CipherAesBase } from \"../cipher\";\nimport { CipherAesCtr } from \"../cipher/ctr\";\nimport { CipherAesGcm } from \"../cipher/gcm\";\nimport {\n Profile,\n ProtectionProfileAeadAes128Gcm,\n ProtectionProfileAes128CmHmacSha1_80,\n} from \"../const\";\n\nexport class Context {\n srtpSSRCStates: { [ssrc: number]: SrtpSsrcState } = {};\n srtpSessionKey: Buffer;\n srtpSessionSalt: Buffer;\n srtpSessionAuthTag: Buffer;\n srtpSessionAuth: Hmac;\n srtcpSSRCStates: { [ssrc: number]: SrtcpSSRCState } = {};\n srtcpSessionKey: Buffer;\n srtcpSessionSalt: Buffer;\n srtcpSessionAuthTag: Buffer;\n srtcpSessionAuth: Hmac;\n\n cipher: CipherAesBase;\n\n constructor(\n public masterKey: Buffer,\n public masterSalt: Buffer,\n public profile: Profile\n ) {\n {\n // aes-js plaintext require 16byte\n // so need to padding to 14 byte\n const diff = 14 - masterSalt.length;\n if (diff > 0) {\n this.masterSalt = Buffer.concat([masterSalt, Buffer.alloc(diff)]);\n }\n }\n\n this.srtpSessionKey = this.generateSessionKey(0);\n this.srtpSessionSalt = this.generateSessionSalt(2);\n this.srtpSessionAuthTag = this.generateSessionAuthTag(1);\n this.srtpSessionAuth = createHmac(\"sha1\", this.srtpSessionAuthTag);\n\n this.srtcpSessionKey = this.generateSessionKey(3);\n this.srtcpSessionSalt = this.generateSessionSalt(5);\n this.srtcpSessionAuthTag = this.generateSessionAuthTag(4);\n this.srtcpSessionAuth = createHmac(\"sha1\", this.srtcpSessionAuthTag);\n\n switch (profile) {\n case ProtectionProfileAes128CmHmacSha1_80:\n this.cipher = new CipherAesCtr(\n this.srtpSessionKey,\n this.srtpSessionSalt,\n this.srtcpSessionKey,\n this.srtcpSessionSalt,\n this.srtpSessionAuthTag,\n this.srtcpSessionAuthTag\n );\n break;\n case ProtectionProfileAeadAes128Gcm:\n this.cipher = new CipherAesGcm(\n this.srtpSessionKey,\n this.srtpSessionSalt,\n this.srtcpSessionKey,\n this.srtcpSessionSalt\n );\n break;\n }\n }\n\n generateSessionKey(label: number) {\n let sessionKey = Buffer.from(this.masterSalt);\n\n const labelAndIndexOverKdr = Buffer.from([\n label,\n 0x00,\n 0x00,\n 0x00,\n 0x00,\n 0x00,\n 0x00,\n ]);\n for (\n let i = labelAndIndexOverKdr.length - 1, j = sessionKey.length - 1;\n i >= 0;\n i--, j--\n ) {\n sessionKey[j] = sessionKey[j] ^ labelAndIndexOverKdr[i];\n }\n\n sessionKey = Buffer.concat([sessionKey, Buffer.from([0x00, 0x00])]);\n const block = new AES(this.masterKey);\n return Buffer.from(block.encrypt(sessionKey) as ArrayBuffer);\n }\n\n generateSessionSalt(label: number) {\n let sessionSalt = Buffer.from(this.masterSalt);\n const labelAndIndexOverKdr = Buffer.from([\n label,\n 0x00,\n 0x00,\n 0x00,\n 0x00,\n 0x00,\n 0x00,\n ]);\n for (\n let i = labelAndIndexOverKdr.length - 1, j = sessionSalt.length - 1;\n i >= 0;\n i--, j--\n ) {\n sessionSalt[j] = sessionSalt[j] ^ labelAndIndexOverKdr[i];\n }\n sessionSalt = Buffer.concat([sessionSalt, Buffer.from([0x00, 0x00])]);\n const block = new AES(this.masterKey);\n sessionSalt = Buffer.from(block.encrypt(sessionSalt) as ArrayBuffer);\n return sessionSalt.slice(0, 14);\n }\n\n generateSessionAuthTag(label: number) {\n const sessionAuthTag = Buffer.from(this.masterSalt);\n const labelAndIndexOverKdr = Buffer.from([\n label,\n 0x00,\n 0x00,\n 0x00,\n 0x00,\n 0x00,\n 0x00,\n ]);\n for (\n let i = labelAndIndexOverKdr.length - 1, j = sessionAuthTag.length - 1;\n i >= 0;\n i--, j--\n ) {\n sessionAuthTag[j] = sessionAuthTag[j] ^ labelAndIndexOverKdr[i];\n }\n let firstRun = Buffer.concat([sessionAuthTag, Buffer.from([0x00, 0x00])]);\n let secondRun = Buffer.concat([sessionAuthTag, Buffer.from([0x00, 0x01])]);\n const block = new AES(this.masterKey);\n firstRun = Buffer.from(block.encrypt(firstRun) as ArrayBuffer);\n secondRun = Buffer.from(block.encrypt(secondRun) as ArrayBuffer);\n return Buffer.concat([firstRun, secondRun.slice(0, 4)]);\n }\n\n getSrtpSsrcState(ssrc: number) {\n let s = this.srtpSSRCStates[ssrc];\n if (s) return s;\n s = {\n ssrc,\n rolloverCounter: 0,\n lastSequenceNumber: 0,\n };\n this.srtpSSRCStates[ssrc] = s;\n return s;\n }\n\n getSrtcpSsrcState(ssrc: number) {\n let s = this.srtcpSSRCStates[ssrc];\n if (s) return s;\n s = {\n srtcpIndex: 0,\n ssrc,\n };\n this.srtcpSSRCStates[ssrc] = s;\n return s;\n }\n\n // 3.3.1. Packet Index Determination, and ROC, s_l Update\n // In particular, out-of-order RTP packets with\n // sequence numbers close to 2^16 or zero must be properly handled.\n updateRolloverCount(sequenceNumber: number, s: SrtpSsrcState) {\n if (!s.rolloverHasProcessed) {\n s.rolloverHasProcessed = true;\n } else if (sequenceNumber === 0) {\n if (s.lastSequenceNumber > MaxROCDisorder) {\n s.rolloverCounter++;\n }\n } else if (\n s.lastSequenceNumber < MaxROCDisorder &&\n sequenceNumber > MaxSequenceNumber - MaxROCDisorder\n ) {\n // https://github.com/shinyoshiaki/werift-webrtc/issues/94\n if (s.rolloverCounter > 0) {\n s.rolloverCounter--;\n }\n } else if (\n sequenceNumber < MaxROCDisorder &&\n s.lastSequenceNumber > MaxSequenceNumber - MaxROCDisorder\n ) {\n s.rolloverCounter++;\n }\n s.lastSequenceNumber = sequenceNumber;\n }\n\n generateSrtpAuthTag(buf: Buffer, roc: number) {\n this.srtpSessionAuth = createHmac(\"sha1\", this.srtpSessionAuthTag);\n const rocRaw = Buffer.alloc(4);\n rocRaw.writeUInt32BE(roc);\n\n return this.srtpSessionAuth\n .update(buf)\n .update(rocRaw)\n .digest()\n .slice(0, 10);\n }\n\n index(ssrc: number) {\n const s = this.srtcpSSRCStates[ssrc];\n if (!s) {\n return 0;\n }\n return s.srtcpIndex;\n }\n\n setIndex(ssrc: number, index: number) {\n const s = this.getSrtcpSsrcState(ssrc);\n s.srtcpIndex = index % 0x7fffffff;\n }\n}\n\nexport interface SrtpSsrcState {\n ssrc: number;\n rolloverCounter: number;\n rolloverHasProcessed?: boolean;\n lastSequenceNumber: number;\n}\n\nexport type SrtcpSSRCState = {\n srtcpIndex: number;\n ssrc: number;\n};\n\nconst MaxROCDisorder = 100;\nconst MaxSequenceNumber = 65535;\n"]}
@@ -1,8 +1,9 @@
1
1
  /// <reference types="node" />
2
2
  import { RtcpHeader } from "../../rtcp/header";
3
+ import { Profile } from "../const";
3
4
  import { Context } from "./context";
4
5
  export declare class SrtcpContext extends Context {
5
- constructor(masterKey: Buffer, masterSalt: Buffer, profile: number);
6
- decryptRTCP(encrypted: Buffer): [Buffer, RtcpHeader];
6
+ constructor(masterKey: Buffer, masterSalt: Buffer, profile: Profile);
7
7
  encryptRTCP(rawRtcp: Buffer): Buffer;
8
+ decryptRTCP(encrypted: Buffer): [Buffer, RtcpHeader];
8
9
  }
@@ -1,50 +1,26 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.SrtcpContext = void 0;
4
- const crypto_1 = require("crypto");
5
- const header_1 = require("../../rtcp/header");
6
4
  const context_1 = require("./context");
7
5
  class SrtcpContext extends context_1.Context {
8
6
  constructor(masterKey, masterSalt, profile) {
9
7
  super(masterKey, masterSalt, profile);
10
8
  }
11
- decryptRTCP(encrypted) {
12
- const header = header_1.RtcpHeader.deSerialize(encrypted);
13
- const tailOffset = encrypted.length - (10 + 4);
14
- const out = Buffer.from(encrypted).slice(0, tailOffset);
15
- const isEncrypted = encrypted[tailOffset] >> 7;
16
- if (isEncrypted === 0)
17
- return [out, header];
18
- let index = encrypted.readUInt32BE(tailOffset);
19
- index &= ~(1 << 31);
20
- const ssrc = encrypted.readUInt32BE(4);
21
- const actualTag = encrypted.slice(encrypted.length - 10);
22
- const counter = this.generateCounter(index & 0xffff, index >> 16, ssrc, this.srtcpSessionSalt);
23
- const cipher = crypto_1.createDecipheriv("aes-128-ctr", this.srtcpSessionKey, counter);
24
- const buf = cipher.update(out.slice(8));
25
- buf.copy(out, 8);
26
- return [out, header];
27
- }
28
9
  encryptRTCP(rawRtcp) {
29
- let out = Buffer.from(rawRtcp);
30
- const ssrc = out.readUInt32BE(4);
31
- const s = this.getSRTCPSSRCState(ssrc);
10
+ const ssrc = rawRtcp.readUInt32BE(4);
11
+ const s = this.getSrtcpSsrcState(ssrc);
32
12
  s.srtcpIndex++;
33
- if (s.srtcpIndex >> 0x7fffffff) {
13
+ if (s.srtcpIndex >> maxSRTCPIndex) {
34
14
  s.srtcpIndex = 0;
35
15
  }
36
- const counter = this.generateCounter(s.srtcpIndex & 0xffff, s.srtcpIndex >> 16, ssrc, this.srtcpSessionSalt);
37
- const cipher = crypto_1.createCipheriv("aes-128-ctr", this.srtcpSessionKey, counter);
38
- // Encrypt everything after header
39
- const buf = cipher.update(out.slice(8));
40
- buf.copy(out, 8);
41
- out = Buffer.concat([out, Buffer.alloc(4)]);
42
- out.writeUInt32BE(s.srtcpIndex, out.length - 4);
43
- out[out.length - 4] |= 0x80;
44
- const authTag = this.generateSrtcpAuthTag(out);
45
- out = Buffer.concat([out, authTag]);
46
- return out;
16
+ const enc = this.cipher.encryptRTCP(rawRtcp, s.srtcpIndex);
17
+ return enc;
18
+ }
19
+ decryptRTCP(encrypted) {
20
+ const dec = this.cipher.decryptRTCP(encrypted);
21
+ return dec;
47
22
  }
48
23
  }
49
24
  exports.SrtcpContext = SrtcpContext;
25
+ const maxSRTCPIndex = 0x7fffffff;
50
26
  //# sourceMappingURL=srtcp.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"srtcp.js","sourceRoot":"","sources":["../../../../../../rtp/src/srtp/context/srtcp.ts"],"names":[],"mappings":"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","sourcesContent":["import { createCipheriv, createDecipheriv } from \"crypto\";\n\nimport { RtcpHeader } from \"../../rtcp/header\";\nimport { Context } from \"./context\";\n\nexport class SrtcpContext extends Context {\n constructor(masterKey: Buffer, masterSalt: Buffer, profile: number) {\n super(masterKey, masterSalt, profile);\n }\n decryptRTCP(encrypted: Buffer): [Buffer, RtcpHeader] {\n const header = RtcpHeader.deSerialize(encrypted);\n\n const tailOffset = encrypted.length - (10 + 4);\n const out = Buffer.from(encrypted).slice(0, tailOffset);\n\n const isEncrypted = encrypted[tailOffset] >> 7;\n if (isEncrypted === 0) return [out, header];\n\n let index = encrypted.readUInt32BE(tailOffset);\n index &= ~(1 << 31);\n\n const ssrc = encrypted.readUInt32BE(4);\n\n const actualTag = encrypted.slice(encrypted.length - 10);\n\n const counter = this.generateCounter(\n index & 0xffff,\n index >> 16,\n ssrc,\n this.srtcpSessionSalt\n );\n const cipher = createDecipheriv(\n \"aes-128-ctr\",\n this.srtcpSessionKey,\n counter\n );\n const buf = cipher.update(out.slice(8));\n buf.copy(out, 8);\n return [out, header];\n }\n\n encryptRTCP(rawRtcp: Buffer): Buffer {\n let out = Buffer.from(rawRtcp);\n const ssrc = out.readUInt32BE(4);\n const s = this.getSRTCPSSRCState(ssrc);\n s.srtcpIndex++;\n if (s.srtcpIndex >> 0x7fffffff) {\n s.srtcpIndex = 0;\n }\n\n const counter = this.generateCounter(\n s.srtcpIndex & 0xffff,\n s.srtcpIndex >> 16,\n ssrc,\n this.srtcpSessionSalt\n );\n const cipher = createCipheriv(\"aes-128-ctr\", this.srtcpSessionKey, counter);\n // Encrypt everything after header\n const buf = cipher.update(out.slice(8));\n buf.copy(out, 8);\n out = Buffer.concat([out, Buffer.alloc(4)]);\n out.writeUInt32BE(s.srtcpIndex, out.length - 4);\n out[out.length - 4] |= 0x80;\n const authTag = this.generateSrtcpAuthTag(out);\n out = Buffer.concat([out, authTag]);\n\n return out;\n }\n}\n"]}
1
+ {"version":3,"file":"srtcp.js","sourceRoot":"","sources":["../../../../../../rtp/src/srtp/context/srtcp.ts"],"names":[],"mappings":";;;AAEA,uCAAoC;AAEpC,MAAa,YAAa,SAAQ,iBAAO;IACvC,YAAY,SAAiB,EAAE,UAAkB,EAAE,OAAgB;QACjE,KAAK,CAAC,SAAS,EAAE,UAAU,EAAE,OAAO,CAAC,CAAC;IACxC,CAAC;IAED,WAAW,CAAC,OAAe;QACzB,MAAM,IAAI,GAAG,OAAO,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;QACrC,MAAM,CAAC,GAAG,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC;QACvC,CAAC,CAAC,UAAU,EAAE,CAAC;QACf,IAAI,CAAC,CAAC,UAAU,IAAI,aAAa,EAAE;YACjC,CAAC,CAAC,UAAU,GAAG,CAAC,CAAC;SAClB;QACD,MAAM,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,OAAO,EAAE,CAAC,CAAC,UAAU,CAAC,CAAC;QAC3D,OAAO,GAAG,CAAC;IACb,CAAC;IAED,WAAW,CAAC,SAAiB;QAC3B,MAAM,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC;QAC/C,OAAO,GAAG,CAAC;IACb,CAAC;CACF;AApBD,oCAoBC;AAED,MAAM,aAAa,GAAG,UAAU,CAAC","sourcesContent":["import { RtcpHeader } from \"../../rtcp/header\";\nimport { Profile } from \"../const\";\nimport { Context } from \"./context\";\n\nexport class SrtcpContext extends Context {\n constructor(masterKey: Buffer, masterSalt: Buffer, profile: Profile) {\n super(masterKey, masterSalt, profile);\n }\n\n encryptRTCP(rawRtcp: Buffer) {\n const ssrc = rawRtcp.readUInt32BE(4);\n const s = this.getSrtcpSsrcState(ssrc);\n s.srtcpIndex++;\n if (s.srtcpIndex >> maxSRTCPIndex) {\n s.srtcpIndex = 0;\n }\n const enc = this.cipher.encryptRTCP(rawRtcp, s.srtcpIndex);\n return enc;\n }\n\n decryptRTCP(encrypted: Buffer): [Buffer, RtcpHeader] {\n const dec = this.cipher.decryptRTCP(encrypted);\n return dec;\n }\n}\n\nconst maxSRTCPIndex = 0x7fffffff;\n"]}
@@ -1,8 +1,9 @@
1
1
  /// <reference types="node" />
2
2
  import { RtpHeader } from "../../rtp/rtp";
3
+ import { Profile } from "../const";
3
4
  import { Context } from "./context";
4
5
  export declare class SrtpContext extends Context {
5
- constructor(masterKey: Buffer, masterSalt: Buffer, profile: number);
6
- decryptRTP(ciphertext: Buffer, header?: RtpHeader): [Buffer, RtpHeader];
7
- encryptRTP(payload: Buffer, header: RtpHeader): Buffer;
6
+ constructor(masterKey: Buffer, masterSalt: Buffer, profile: Profile);
7
+ encryptRtp(payload: Buffer, header: RtpHeader): Buffer;
8
+ decryptRtp(cipherText: Buffer): [Buffer, RtpHeader];
8
9
  }
@@ -1,43 +1,24 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.SrtpContext = void 0;
4
- const crypto_1 = require("crypto");
5
- const helper_1 = require("../../helper");
6
4
  const rtp_1 = require("../../rtp/rtp");
7
5
  const context_1 = require("./context");
8
6
  class SrtpContext extends context_1.Context {
9
7
  constructor(masterKey, masterSalt, profile) {
10
8
  super(masterKey, masterSalt, profile);
11
9
  }
12
- decryptRTP(ciphertext, header) {
13
- header = header || rtp_1.RtpHeader.deSerialize(ciphertext);
14
- const s = this.getSRTPSRRCState(header.ssrc);
15
- let dst = Buffer.from([]);
16
- dst = helper_1.growBufferSize(dst, ciphertext.length - 10);
10
+ encryptRtp(payload, header) {
11
+ const s = this.getSrtpSsrcState(header.ssrc);
17
12
  this.updateRolloverCount(header.sequenceNumber, s);
18
- ciphertext = ciphertext.slice(0, ciphertext.length - 10);
19
- ciphertext.slice(0, header.payloadOffset).copy(dst);
20
- const counter = this.generateCounter(header.sequenceNumber, s.rolloverCounter, s.ssrc, this.srtpSessionSalt);
21
- const cipher = crypto_1.createDecipheriv("aes-128-ctr", this.srtpSessionKey, counter);
22
- const payload = ciphertext.slice(header.payloadOffset);
23
- const buf = cipher.update(payload);
24
- buf.copy(dst, header.payloadOffset);
25
- return [dst, header];
13
+ const enc = this.cipher.encryptRtp(header, payload, s.rolloverCounter);
14
+ return enc;
26
15
  }
27
- encryptRTP(payload, header) {
28
- const dst = Buffer.alloc(header.serializeSize + payload.length + 10);
29
- const s = this.getSRTPSRRCState(header.ssrc);
16
+ decryptRtp(cipherText) {
17
+ const header = rtp_1.RtpHeader.deSerialize(cipherText);
18
+ const s = this.getSrtpSsrcState(header.ssrc);
30
19
  this.updateRolloverCount(header.sequenceNumber, s);
31
- header.serialize(dst.length).copy(dst);
32
- const { payloadOffset } = header;
33
- const counter = this.generateCounter(header.sequenceNumber, s.rolloverCounter, s.ssrc, this.srtpSessionSalt);
34
- const cipher = crypto_1.createCipheriv("aes-128-ctr", this.srtpSessionKey, counter);
35
- const buf = cipher.update(payload);
36
- buf.copy(dst, payloadOffset);
37
- const totalLength = payloadOffset + payload.length;
38
- const authTag = this.generateSrtpAuthTag(dst.slice(0, totalLength), s.rolloverCounter);
39
- authTag.copy(dst, totalLength);
40
- return dst;
20
+ const dec = this.cipher.decryptRtp(cipherText, s.rolloverCounter);
21
+ return dec;
41
22
  }
42
23
  }
43
24
  exports.SrtpContext = SrtpContext;
@@ -1 +1 @@
1
- {"version":3,"file":"srtp.js","sourceRoot":"","sources":["../../../../../../rtp/src/srtp/context/srtp.ts"],"names":[],"mappings":"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","sourcesContent":["import { createCipheriv, createDecipheriv } from \"crypto\";\n\nimport { growBufferSize } from \"../../helper\";\nimport { RtpHeader } from \"../../rtp/rtp\";\nimport { Context } from \"./context\";\n\nexport class SrtpContext extends Context {\n constructor(masterKey: Buffer, masterSalt: Buffer, profile: number) {\n super(masterKey, masterSalt, profile);\n }\n\n decryptRTP(ciphertext: Buffer, header?: RtpHeader): [Buffer, RtpHeader] {\n header = header || RtpHeader.deSerialize(ciphertext);\n\n const s = this.getSRTPSRRCState(header.ssrc);\n\n let dst = Buffer.from([]);\n dst = growBufferSize(dst, ciphertext.length - 10);\n this.updateRolloverCount(header.sequenceNumber, s);\n\n ciphertext = ciphertext.slice(0, ciphertext.length - 10);\n\n ciphertext.slice(0, header.payloadOffset).copy(dst);\n\n const counter = this.generateCounter(\n header.sequenceNumber,\n s.rolloverCounter,\n s.ssrc,\n this.srtpSessionSalt\n );\n const cipher = createDecipheriv(\n \"aes-128-ctr\",\n this.srtpSessionKey,\n counter\n );\n const payload = ciphertext.slice(header.payloadOffset);\n const buf = cipher.update(payload);\n buf.copy(dst, header.payloadOffset);\n\n return [dst, header];\n }\n\n encryptRTP(payload: Buffer, header: RtpHeader) {\n const dst = Buffer.alloc(header.serializeSize + payload.length + 10);\n\n const s = this.getSRTPSRRCState(header.ssrc);\n this.updateRolloverCount(header.sequenceNumber, s);\n\n header.serialize(dst.length).copy(dst);\n const { payloadOffset } = header;\n\n const counter = this.generateCounter(\n header.sequenceNumber,\n s.rolloverCounter,\n s.ssrc,\n this.srtpSessionSalt\n );\n\n const cipher = createCipheriv(\"aes-128-ctr\", this.srtpSessionKey, counter);\n const buf = cipher.update(payload);\n buf.copy(dst, payloadOffset);\n const totalLength = payloadOffset + payload.length;\n\n const authTag = this.generateSrtpAuthTag(\n dst.slice(0, totalLength),\n s.rolloverCounter\n );\n authTag.copy(dst, totalLength);\n return dst;\n }\n}\n"]}
1
+ {"version":3,"file":"srtp.js","sourceRoot":"","sources":["../../../../../../rtp/src/srtp/context/srtp.ts"],"names":[],"mappings":";;;AAAA,uCAA0C;AAE1C,uCAAoC;AAEpC,MAAa,WAAY,SAAQ,iBAAO;IACtC,YAAY,SAAiB,EAAE,UAAkB,EAAE,OAAgB;QACjE,KAAK,CAAC,SAAS,EAAE,UAAU,EAAE,OAAO,CAAC,CAAC;IACxC,CAAC;IAED,UAAU,CAAC,OAAe,EAAE,MAAiB;QAC3C,MAAM,CAAC,GAAG,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QAC7C,IAAI,CAAC,mBAAmB,CAAC,MAAM,CAAC,cAAc,EAAE,CAAC,CAAC,CAAC;QAEnD,MAAM,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,MAAM,EAAE,OAAO,EAAE,CAAC,CAAC,eAAe,CAAC,CAAC;QACvE,OAAO,GAAG,CAAC;IACb,CAAC;IAED,UAAU,CAAC,UAAkB;QAC3B,MAAM,MAAM,GAAG,eAAS,CAAC,WAAW,CAAC,UAAU,CAAC,CAAC;QAEjD,MAAM,CAAC,GAAG,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QAC7C,IAAI,CAAC,mBAAmB,CAAC,MAAM,CAAC,cAAc,EAAE,CAAC,CAAC,CAAC;QAEnD,MAAM,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,UAAU,EAAE,CAAC,CAAC,eAAe,CAAC,CAAC;QAClE,OAAO,GAAG,CAAC;IACb,CAAC;CACF;AAtBD,kCAsBC","sourcesContent":["import { RtpHeader } from \"../../rtp/rtp\";\nimport { Profile } from \"../const\";\nimport { Context } from \"./context\";\n\nexport class SrtpContext extends Context {\n constructor(masterKey: Buffer, masterSalt: Buffer, profile: Profile) {\n super(masterKey, masterSalt, profile);\n }\n\n encryptRtp(payload: Buffer, header: RtpHeader) {\n const s = this.getSrtpSsrcState(header.ssrc);\n this.updateRolloverCount(header.sequenceNumber, s);\n\n const enc = this.cipher.encryptRtp(header, payload, s.rolloverCounter);\n return enc;\n }\n\n decryptRtp(cipherText: Buffer): [Buffer, RtpHeader] {\n const header = RtpHeader.deSerialize(cipherText);\n\n const s = this.getSrtpSsrcState(header.ssrc);\n this.updateRolloverCount(header.sequenceNumber, s);\n\n const dec = this.cipher.decryptRtp(cipherText, s.rolloverCounter);\n return dec;\n }\n}\n"]}
@@ -8,13 +8,13 @@ class SrtpSession extends session_1.Session {
8
8
  super(srtp_1.SrtpContext);
9
9
  this.config = config;
10
10
  this.decrypt = (buf) => {
11
- const [decrypted] = this.remoteContext.decryptRTP(buf);
11
+ const [decrypted] = this.remoteContext.decryptRtp(buf);
12
12
  return decrypted;
13
13
  };
14
14
  this.start(config.keys.localMasterKey, config.keys.localMasterSalt, config.keys.remoteMasterKey, config.keys.remoteMasterSalt, config.profile);
15
15
  }
16
16
  encrypt(payload, header) {
17
- return this.localContext.encryptRTP(payload, header);
17
+ return this.localContext.encryptRtp(payload, header);
18
18
  }
19
19
  }
20
20
  exports.SrtpSession = SrtpSession;
@@ -1 +1 @@
1
- {"version":3,"file":"srtp.js","sourceRoot":"","sources":["../../../../../rtp/src/srtp/srtp.ts"],"names":[],"mappings":";;;AACA,yCAA6C;AAC7C,uCAA4C;AAE5C,MAAa,WAAY,SAAQ,iBAAoB;IACnD,YAAmB,MAAc;QAC/B,KAAK,CAAC,kBAAW,CAAC,CAAC;QADF,WAAM,GAAN,MAAM,CAAQ;QAWjC,YAAO,GAAG,CAAC,GAAW,EAAE,EAAE;YACxB,MAAM,CAAC,SAAS,CAAC,GAAG,IAAI,CAAC,aAAa,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;YACvD,OAAO,SAAS,CAAC;QACnB,CAAC,CAAC;QAZA,IAAI,CAAC,KAAK,CACR,MAAM,CAAC,IAAI,CAAC,cAAc,EAC1B,MAAM,CAAC,IAAI,CAAC,eAAe,EAC3B,MAAM,CAAC,IAAI,CAAC,eAAe,EAC3B,MAAM,CAAC,IAAI,CAAC,gBAAgB,EAC5B,MAAM,CAAC,OAAO,CACf,CAAC;IACJ,CAAC;IAOD,OAAO,CAAC,OAAe,EAAE,MAAiB;QACxC,OAAO,IAAI,CAAC,YAAY,CAAC,UAAU,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;IACvD,CAAC;CACF;AApBD,kCAoBC","sourcesContent":["import { RtpHeader } from \"../rtp/rtp\";\nimport { SrtpContext } from \"./context/srtp\";\nimport { Config, Session } from \"./session\";\n\nexport class SrtpSession extends Session<SrtpContext> {\n constructor(public config: Config) {\n super(SrtpContext);\n this.start(\n config.keys.localMasterKey,\n config.keys.localMasterSalt,\n config.keys.remoteMasterKey,\n config.keys.remoteMasterSalt,\n config.profile\n );\n }\n\n decrypt = (buf: Buffer) => {\n const [decrypted] = this.remoteContext.decryptRTP(buf);\n return decrypted;\n };\n\n encrypt(payload: Buffer, header: RtpHeader) {\n return this.localContext.encryptRTP(payload, header);\n }\n}\n"]}
1
+ {"version":3,"file":"srtp.js","sourceRoot":"","sources":["../../../../../rtp/src/srtp/srtp.ts"],"names":[],"mappings":";;;AACA,yCAA6C;AAC7C,uCAA4C;AAE5C,MAAa,WAAY,SAAQ,iBAAoB;IACnD,YAAmB,MAAc;QAC/B,KAAK,CAAC,kBAAW,CAAC,CAAC;QADF,WAAM,GAAN,MAAM,CAAQ;QAWjC,YAAO,GAAG,CAAC,GAAW,EAAE,EAAE;YACxB,MAAM,CAAC,SAAS,CAAC,GAAG,IAAI,CAAC,aAAa,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;YACvD,OAAO,SAAS,CAAC;QACnB,CAAC,CAAC;QAZA,IAAI,CAAC,KAAK,CACR,MAAM,CAAC,IAAI,CAAC,cAAc,EAC1B,MAAM,CAAC,IAAI,CAAC,eAAe,EAC3B,MAAM,CAAC,IAAI,CAAC,eAAe,EAC3B,MAAM,CAAC,IAAI,CAAC,gBAAgB,EAC5B,MAAM,CAAC,OAAO,CACf,CAAC;IACJ,CAAC;IAOD,OAAO,CAAC,OAAe,EAAE,MAAiB;QACxC,OAAO,IAAI,CAAC,YAAY,CAAC,UAAU,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;IACvD,CAAC;CACF;AApBD,kCAoBC","sourcesContent":["import { RtpHeader } from \"../rtp/rtp\";\nimport { SrtpContext } from \"./context/srtp\";\nimport { Config, Session } from \"./session\";\n\nexport class SrtpSession extends Session<SrtpContext> {\n constructor(public config: Config) {\n super(SrtpContext);\n this.start(\n config.keys.localMasterKey,\n config.keys.localMasterSalt,\n config.keys.remoteMasterKey,\n config.keys.remoteMasterSalt,\n config.profile\n );\n }\n\n decrypt = (buf: Buffer) => {\n const [decrypted] = this.remoteContext.decryptRtp(buf);\n return decrypted;\n };\n\n encrypt(payload: Buffer, header: RtpHeader) {\n return this.localContext.encryptRtp(payload, header);\n }\n}\n"]}
@@ -26,8 +26,9 @@ export declare const DTLS_SETUP_ROLE: {
26
26
  };
27
27
  export declare const FMTP_INT_PARAMETERS: string[];
28
28
  export declare const SSRC_INFO_ATTRS: string[];
29
- export declare enum SRTP_PROFILE {
30
- SRTP_AES128_CM_HMAC_SHA1_80 = 1
31
- }
29
+ export declare const SRTP_PROFILE: {
30
+ readonly SRTP_AES128_CM_HMAC_SHA1_80: 1;
31
+ readonly SRTP_AEAD_AES_128_GCM: 7;
32
+ };
32
33
  export declare const SenderDirections: string[];
33
34
  export declare const NotSenderDirections: string[];
@@ -1,6 +1,7 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.NotSenderDirections = exports.SenderDirections = exports.SRTP_PROFILE = exports.SSRC_INFO_ATTRS = exports.FMTP_INT_PARAMETERS = exports.DTLS_SETUP_ROLE = exports.DTLS_ROLE_SETUP = exports.DIRECTIONS = exports.MEDIA_KINDS = exports.DISCARD_PORT = exports.DISCARD_HOST = exports.WEBRTC_BINARY_EMPTY = exports.WEBRTC_STRING_EMPTY = exports.WEBRTC_BINARY = exports.WEBRTC_STRING = exports.WEBRTC_DCEP = exports.DATA_CHANNEL_PARTIAL_RELIABLE_TIMED_UNORDERED = exports.DATA_CHANNEL_PARTIAL_RELIABLE_REXMIT_UNORDERED = exports.DATA_CHANNEL_RELIABLE_UNORDERED = exports.DATA_CHANNEL_PARTIAL_RELIABLE_TIMED = exports.DATA_CHANNEL_PARTIAL_RELIABLE_REXMIT = exports.DATA_CHANNEL_RELIABLE = exports.DATA_CHANNEL_OPEN = exports.DATA_CHANNEL_ACK = void 0;
4
+ const srtp_1 = require("../../dtls/src/context/srtp");
4
5
  // data channel export constants
5
6
  exports.DATA_CHANNEL_ACK = 2;
6
7
  exports.DATA_CHANNEL_OPEN = 3;
@@ -40,10 +41,10 @@ exports.FMTP_INT_PARAMETERS = [
40
41
  "useinbandfec",
41
42
  ];
42
43
  exports.SSRC_INFO_ATTRS = ["cname", "msid", "mslabel", "label"];
43
- var SRTP_PROFILE;
44
- (function (SRTP_PROFILE) {
45
- SRTP_PROFILE[SRTP_PROFILE["SRTP_AES128_CM_HMAC_SHA1_80"] = 1] = "SRTP_AES128_CM_HMAC_SHA1_80";
46
- })(SRTP_PROFILE = exports.SRTP_PROFILE || (exports.SRTP_PROFILE = {}));
44
+ exports.SRTP_PROFILE = {
45
+ SRTP_AES128_CM_HMAC_SHA1_80: srtp_1.ProtectionProfileAes128CmHmacSha1_80,
46
+ SRTP_AEAD_AES_128_GCM: srtp_1.ProtectionProfileAeadAes128Gcm,
47
+ };
47
48
  exports.SenderDirections = ["sendonly", "sendrecv"];
48
49
  exports.NotSenderDirections = ["inactive", "recvonly"];
49
50
  //# sourceMappingURL=const.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"const.js","sourceRoot":"","sources":["../../../src/const.ts"],"names":[],"mappings":";;;AAEA,gCAAgC;AACnB,QAAA,gBAAgB,GAAG,CAAC,CAAC;AACrB,QAAA,iBAAiB,GAAG,CAAC,CAAC;AAEnC,kCAAkC;AACrB,QAAA,qBAAqB,GAAG,IAAI,CAAC;AAC7B,QAAA,oCAAoC,GAAG,IAAI,CAAC;AAC5C,QAAA,mCAAmC,GAAG,IAAI,CAAC;AAC3C,QAAA,+BAA+B,GAAG,IAAI,CAAC;AACvC,QAAA,8CAA8C,GAAG,IAAI,CAAC;AACtD,QAAA,6CAA6C,GAAG,IAAI,CAAC;AAErD,QAAA,WAAW,GAAG,EAAE,CAAC;AACjB,QAAA,aAAa,GAAG,EAAE,CAAC;AACnB,QAAA,aAAa,GAAG,EAAE,CAAC;AACnB,QAAA,mBAAmB,GAAG,EAAE,CAAC;AACzB,QAAA,mBAAmB,GAAG,EAAE,CAAC;AAEzB,QAAA,YAAY,GAAG,SAAS,CAAC;AACzB,QAAA,YAAY,GAAG,CAAC,CAAC;AACjB,QAAA,WAAW,GAAG,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;AAEjC,QAAA,UAAU,GAAG,CAAC,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,CAAC,CAAC;AAC9D,QAAA,eAAe,GAAG;IAC7B,IAAI,EAAE,SAAS;IACf,MAAM,EAAE,QAAQ;IAChB,MAAM,EAAE,SAAS;CAClB,CAAC;AACW,QAAA,eAAe,GAAgC,MAAM,CAAC,IAAI,CACrE,uBAAe,CAChB,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE;IACpB,MAAM,GAAG,GAAI,uBAAuB,CAAC,GAAG,CAAC,CAAC;IAC1C,GAAG,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC;IACf,OAAO,GAAG,CAAC;AACb,CAAC,EAAE,EAAS,CAAC,CAAC;AACD,QAAA,mBAAmB,GAAG;IACjC,KAAK;IACL,QAAQ;IACR,QAAQ;IACR,iBAAiB;IACjB,UAAU;IACV,QAAQ;IACR,cAAc;CACf,CAAC;AAEW,QAAA,eAAe,GAAG,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC;AAErE,IAAY,YAEX;AAFD,WAAY,YAAY;IACtB,6FAA+B,CAAA;AACjC,CAAC,EAFW,YAAY,GAAZ,oBAAY,KAAZ,oBAAY,QAEvB;AAEY,QAAA,gBAAgB,GAAG,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC;AAC5C,QAAA,mBAAmB,GAAG,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC","sourcesContent":["import { DtlsRole } from \"./transport/dtls\";\n\n// data channel export constants\nexport const DATA_CHANNEL_ACK = 2;\nexport const DATA_CHANNEL_OPEN = 3;\n\n// 5.1. DATA_CHANNEL_OPEN Message\nexport const DATA_CHANNEL_RELIABLE = 0x00;\nexport const DATA_CHANNEL_PARTIAL_RELIABLE_REXMIT = 0x01;\nexport const DATA_CHANNEL_PARTIAL_RELIABLE_TIMED = 0x02;\nexport const DATA_CHANNEL_RELIABLE_UNORDERED = 0x80;\nexport const DATA_CHANNEL_PARTIAL_RELIABLE_REXMIT_UNORDERED = 0x81;\nexport const DATA_CHANNEL_PARTIAL_RELIABLE_TIMED_UNORDERED = 0x82;\n\nexport const WEBRTC_DCEP = 50;\nexport const WEBRTC_STRING = 51;\nexport const WEBRTC_BINARY = 53;\nexport const WEBRTC_STRING_EMPTY = 56;\nexport const WEBRTC_BINARY_EMPTY = 57;\n\nexport const DISCARD_HOST = \"0.0.0.0\";\nexport const DISCARD_PORT = 9;\nexport const MEDIA_KINDS = [\"audio\", \"video\"];\n\nexport const DIRECTIONS = [\"inactive\", \"sendonly\", \"recvonly\", \"sendrecv\"];\nexport const DTLS_ROLE_SETUP = {\n auto: \"actpass\",\n client: \"active\",\n server: \"passive\",\n};\nexport const DTLS_SETUP_ROLE: { [key: string]: DtlsRole } = Object.keys(\n DTLS_ROLE_SETUP\n).reduce((acc, cur) => {\n const key = (DTLS_ROLE_SETUP as any)[cur];\n acc[key] = cur;\n return acc;\n}, {} as any);\nexport const FMTP_INT_PARAMETERS = [\n \"apt\",\n \"max-fr\",\n \"max-fs\",\n \"maxplaybackrate\",\n \"minptime\",\n \"stereo\",\n \"useinbandfec\",\n];\n\nexport const SSRC_INFO_ATTRS = [\"cname\", \"msid\", \"mslabel\", \"label\"];\n\nexport enum SRTP_PROFILE {\n SRTP_AES128_CM_HMAC_SHA1_80 = 1,\n}\n\nexport const SenderDirections = [\"sendonly\", \"sendrecv\"];\nexport const NotSenderDirections = [\"inactive\", \"recvonly\"];\n"]}
1
+ {"version":3,"file":"const.js","sourceRoot":"","sources":["../../../src/const.ts"],"names":[],"mappings":";;;AAAA,sDAGqC;AAGrC,gCAAgC;AACnB,QAAA,gBAAgB,GAAG,CAAC,CAAC;AACrB,QAAA,iBAAiB,GAAG,CAAC,CAAC;AAEnC,kCAAkC;AACrB,QAAA,qBAAqB,GAAG,IAAI,CAAC;AAC7B,QAAA,oCAAoC,GAAG,IAAI,CAAC;AAC5C,QAAA,mCAAmC,GAAG,IAAI,CAAC;AAC3C,QAAA,+BAA+B,GAAG,IAAI,CAAC;AACvC,QAAA,8CAA8C,GAAG,IAAI,CAAC;AACtD,QAAA,6CAA6C,GAAG,IAAI,CAAC;AAErD,QAAA,WAAW,GAAG,EAAE,CAAC;AACjB,QAAA,aAAa,GAAG,EAAE,CAAC;AACnB,QAAA,aAAa,GAAG,EAAE,CAAC;AACnB,QAAA,mBAAmB,GAAG,EAAE,CAAC;AACzB,QAAA,mBAAmB,GAAG,EAAE,CAAC;AAEzB,QAAA,YAAY,GAAG,SAAS,CAAC;AACzB,QAAA,YAAY,GAAG,CAAC,CAAC;AACjB,QAAA,WAAW,GAAG,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;AAEjC,QAAA,UAAU,GAAG,CAAC,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,CAAC,CAAC;AAC9D,QAAA,eAAe,GAAG;IAC7B,IAAI,EAAE,SAAS;IACf,MAAM,EAAE,QAAQ;IAChB,MAAM,EAAE,SAAS;CAClB,CAAC;AACW,QAAA,eAAe,GAAgC,MAAM,CAAC,IAAI,CACrE,uBAAe,CAChB,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE;IACpB,MAAM,GAAG,GAAI,uBAAuB,CAAC,GAAG,CAAC,CAAC;IAC1C,GAAG,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC;IACf,OAAO,GAAG,CAAC;AACb,CAAC,EAAE,EAAS,CAAC,CAAC;AACD,QAAA,mBAAmB,GAAG;IACjC,KAAK;IACL,QAAQ;IACR,QAAQ;IACR,iBAAiB;IACjB,UAAU;IACV,QAAQ;IACR,cAAc;CACf,CAAC;AAEW,QAAA,eAAe,GAAG,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC;AAExD,QAAA,YAAY,GAAG;IAC1B,2BAA2B,EAAE,2CAAoC;IACjE,qBAAqB,EAAE,qCAA8B;CAC7C,CAAC;AAEE,QAAA,gBAAgB,GAAG,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC;AAC5C,QAAA,mBAAmB,GAAG,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC","sourcesContent":["import {\n ProtectionProfileAeadAes128Gcm,\n ProtectionProfileAes128CmHmacSha1_80,\n} from \"../../dtls/src/context/srtp\";\nimport { DtlsRole } from \"./transport/dtls\";\n\n// data channel export constants\nexport const DATA_CHANNEL_ACK = 2;\nexport const DATA_CHANNEL_OPEN = 3;\n\n// 5.1. DATA_CHANNEL_OPEN Message\nexport const DATA_CHANNEL_RELIABLE = 0x00;\nexport const DATA_CHANNEL_PARTIAL_RELIABLE_REXMIT = 0x01;\nexport const DATA_CHANNEL_PARTIAL_RELIABLE_TIMED = 0x02;\nexport const DATA_CHANNEL_RELIABLE_UNORDERED = 0x80;\nexport const DATA_CHANNEL_PARTIAL_RELIABLE_REXMIT_UNORDERED = 0x81;\nexport const DATA_CHANNEL_PARTIAL_RELIABLE_TIMED_UNORDERED = 0x82;\n\nexport const WEBRTC_DCEP = 50;\nexport const WEBRTC_STRING = 51;\nexport const WEBRTC_BINARY = 53;\nexport const WEBRTC_STRING_EMPTY = 56;\nexport const WEBRTC_BINARY_EMPTY = 57;\n\nexport const DISCARD_HOST = \"0.0.0.0\";\nexport const DISCARD_PORT = 9;\nexport const MEDIA_KINDS = [\"audio\", \"video\"];\n\nexport const DIRECTIONS = [\"inactive\", \"sendonly\", \"recvonly\", \"sendrecv\"];\nexport const DTLS_ROLE_SETUP = {\n auto: \"actpass\",\n client: \"active\",\n server: \"passive\",\n};\nexport const DTLS_SETUP_ROLE: { [key: string]: DtlsRole } = Object.keys(\n DTLS_ROLE_SETUP\n).reduce((acc, cur) => {\n const key = (DTLS_ROLE_SETUP as any)[cur];\n acc[key] = cur;\n return acc;\n}, {} as any);\nexport const FMTP_INT_PARAMETERS = [\n \"apt\",\n \"max-fr\",\n \"max-fs\",\n \"maxplaybackrate\",\n \"minptime\",\n \"stereo\",\n \"useinbandfec\",\n];\n\nexport const SSRC_INFO_ATTRS = [\"cname\", \"msid\", \"mslabel\", \"label\"];\n\nexport const SRTP_PROFILE = {\n SRTP_AES128_CM_HMAC_SHA1_80: ProtectionProfileAes128CmHmacSha1_80,\n SRTP_AEAD_AES_128_GCM: ProtectionProfileAeadAes128Gcm,\n} as const;\n\nexport const SenderDirections = [\"sendonly\", \"sendrecv\"];\nexport const NotSenderDirections = [\"inactive\", \"recvonly\"];\n"]}
@@ -5,11 +5,11 @@ export declare function divide(from: string, split: string): [string, string];
5
5
  export declare class PromiseQueue {
6
6
  queue: {
7
7
  promise: () => Promise<any>;
8
- call: () => void;
8
+ done: () => void;
9
9
  }[];
10
10
  running: boolean;
11
11
  push: (promise: () => Promise<any>) => Promise<void>;
12
- run(): Promise<void>;
12
+ private run;
13
13
  }
14
14
  export declare class EventTarget extends EventEmitter {
15
15
  addEventListener: (type: string, listener: (...args: any[]) => void) => void;
@@ -19,7 +19,7 @@ class PromiseQueue {
19
19
  this.queue = [];
20
20
  this.running = false;
21
21
  this.push = (promise) => new Promise((r) => {
22
- this.queue.push({ promise, call: r });
22
+ this.queue.push({ promise, done: r });
23
23
  if (!this.running)
24
24
  this.run();
25
25
  });
@@ -29,7 +29,7 @@ class PromiseQueue {
29
29
  if (task) {
30
30
  this.running = true;
31
31
  await task.promise();
32
- task.call();
32
+ task.done();
33
33
  this.run();
34
34
  }
35
35
  else {
@@ -1 +1 @@
1
- {"version":3,"file":"helper.js","sourceRoot":"","sources":["../../../src/helper.ts"],"names":[],"mappings":";;;;;;AAAA,oDAAkC;AAElC,SAAgB,SAAS,CAAI,GAAQ;IACnC,OAAO,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;AACnC,CAAC;AAFD,8BAEC;AAED,SAAgB,MAAM,CAAC,IAAY,EAAE,KAAa;IAChD,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IAC9B,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;AAC5C,CAAC;AAHD,wBAGC;AAED,MAAa,YAAY;IAAzB;QACE,UAAK,GAAwD,EAAE,CAAC;QAChE,YAAO,GAAG,KAAK,CAAC;QAEhB,SAAI,GAAG,CAAC,OAA2B,EAAE,EAAE,CACrC,IAAI,OAAO,CAAO,CAAC,CAAC,EAAE,EAAE;YACtB,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC;YACtC,IAAI,CAAC,IAAI,CAAC,OAAO;gBAAE,IAAI,CAAC,GAAG,EAAE,CAAC;QAChC,CAAC,CAAC,CAAC;IAcP,CAAC;IAZC,KAAK,CAAC,GAAG;QACP,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;QAChC,IAAI,IAAI,EAAE;YACR,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;YACpB,MAAM,IAAI,CAAC,OAAO,EAAE,CAAC;YACrB,IAAI,CAAC,IAAI,EAAE,CAAC;YAEZ,IAAI,CAAC,GAAG,EAAE,CAAC;SACZ;aAAM;YACL,IAAI,CAAC,OAAO,GAAG,KAAK,CAAC;SACtB;IACH,CAAC;CACF;AAtBD,oCAsBC;AAED,MAAa,WAAY,SAAQ,gBAAY;IAA7C;;QACE,qBAAgB,GAAG,CAAC,IAAY,EAAE,QAAkC,EAAE,EAAE;YACtE,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;QACnC,CAAC,CAAC;QAEF,wBAAmB,GAAG,CAAC,IAAY,EAAE,QAAkC,EAAE,EAAE;YACzE,IAAI,CAAC,cAAc,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;QACtC,CAAC,CAAC;IACJ,CAAC;CAAA;AARD,kCAQC","sourcesContent":["import EventEmitter from \"events\";\n\nexport function enumerate<T>(arr: T[]): [number, T][] {\n return arr.map((v, i) => [i, v]);\n}\n\nexport function divide(from: string, split: string): [string, string] {\n const arr = from.split(split);\n return [arr[0], arr.slice(1).join(split)];\n}\n\nexport class PromiseQueue {\n queue: { promise: () => Promise<any>; call: () => void }[] = [];\n running = false;\n\n push = (promise: () => Promise<any>) =>\n new Promise<void>((r) => {\n this.queue.push({ promise, call: r });\n if (!this.running) this.run();\n });\n\n async run() {\n const task = this.queue.shift();\n if (task) {\n this.running = true;\n await task.promise();\n task.call();\n\n this.run();\n } else {\n this.running = false;\n }\n }\n}\n\nexport class EventTarget extends EventEmitter {\n addEventListener = (type: string, listener: (...args: any[]) => void) => {\n this.addListener(type, listener);\n };\n\n removeEventListener = (type: string, listener: (...args: any[]) => void) => {\n this.removeListener(type, listener);\n };\n}\n"]}
1
+ {"version":3,"file":"helper.js","sourceRoot":"","sources":["../../../src/helper.ts"],"names":[],"mappings":";;;;;;AAAA,oDAAkC;AAElC,SAAgB,SAAS,CAAI,GAAQ;IACnC,OAAO,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;AACnC,CAAC;AAFD,8BAEC;AAED,SAAgB,MAAM,CAAC,IAAY,EAAE,KAAa;IAChD,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IAC9B,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;AAC5C,CAAC;AAHD,wBAGC;AAED,MAAa,YAAY;IAAzB;QACE,UAAK,GAAwD,EAAE,CAAC;QAChE,YAAO,GAAG,KAAK,CAAC;QAEhB,SAAI,GAAG,CAAC,OAA2B,EAAE,EAAE,CACrC,IAAI,OAAO,CAAO,CAAC,CAAC,EAAE,EAAE;YACtB,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC;YACtC,IAAI,CAAC,IAAI,CAAC,OAAO;gBAAE,IAAI,CAAC,GAAG,EAAE,CAAC;QAChC,CAAC,CAAC,CAAC;IAcP,CAAC;IAZS,KAAK,CAAC,GAAG;QACf,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;QAChC,IAAI,IAAI,EAAE;YACR,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;YACpB,MAAM,IAAI,CAAC,OAAO,EAAE,CAAC;YACrB,IAAI,CAAC,IAAI,EAAE,CAAC;YAEZ,IAAI,CAAC,GAAG,EAAE,CAAC;SACZ;aAAM;YACL,IAAI,CAAC,OAAO,GAAG,KAAK,CAAC;SACtB;IACH,CAAC;CACF;AAtBD,oCAsBC;AAED,MAAa,WAAY,SAAQ,gBAAY;IAA7C;;QACE,qBAAgB,GAAG,CAAC,IAAY,EAAE,QAAkC,EAAE,EAAE;YACtE,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;QACnC,CAAC,CAAC;QAEF,wBAAmB,GAAG,CAAC,IAAY,EAAE,QAAkC,EAAE,EAAE;YACzE,IAAI,CAAC,cAAc,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;QACtC,CAAC,CAAC;IACJ,CAAC;CAAA;AARD,kCAQC","sourcesContent":["import EventEmitter from \"events\";\n\nexport function enumerate<T>(arr: T[]): [number, T][] {\n return arr.map((v, i) => [i, v]);\n}\n\nexport function divide(from: string, split: string): [string, string] {\n const arr = from.split(split);\n return [arr[0], arr.slice(1).join(split)];\n}\n\nexport class PromiseQueue {\n queue: { promise: () => Promise<any>; done: () => void }[] = [];\n running = false;\n\n push = (promise: () => Promise<any>) =>\n new Promise<void>((r) => {\n this.queue.push({ promise, done: r });\n if (!this.running) this.run();\n });\n\n private async run() {\n const task = this.queue.shift();\n if (task) {\n this.running = true;\n await task.promise();\n task.done();\n\n this.run();\n } else {\n this.running = false;\n }\n }\n}\n\nexport class EventTarget extends EventEmitter {\n addEventListener = (type: string, listener: (...args: any[]) => void) => {\n this.addListener(type, listener);\n };\n\n removeEventListener = (type: string, listener: (...args: any[]) => void) => {\n this.removeListener(type, listener);\n };\n}\n"]}
@@ -1,12 +1,16 @@
1
1
  export * from "../../ice/src";
2
2
  export * from "../../rtp/src";
3
3
  export * from "./dataChannel";
4
- export * from "./extension/rtcpFeedback";
5
- export * from "./extension/rtpExtension";
6
4
  export * from "./helper";
5
+ export * from "./media/extension/rtcpFeedback";
6
+ export * from "./media/extension/rtpExtension";
7
7
  export * from "./media/parameters";
8
8
  export * from "./media/rtpTransceiver";
9
9
  export * from "./media/track";
10
+ export * from "./nonstandard/lipsync";
11
+ export * from "./nonstandard/recorder";
12
+ export * from "./nonstandard/sampleBuilder";
13
+ export * from "./nonstandard/userMedia";
10
14
  export * from "./peerConnection";
11
15
  export * from "./sdp";
12
16
  export * from "./transport/dtls";