werift 0.22.8 → 0.23.0

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 (69) hide show
  1. package/lib/common/src/crc.d.ts +4 -0
  2. package/lib/common/src/crc.js +124 -0
  3. package/lib/common/src/crc.js.map +1 -0
  4. package/lib/common/src/index.d.ts +1 -0
  5. package/lib/common/src/index.js +1 -0
  6. package/lib/common/src/index.js.map +1 -1
  7. package/lib/dtls/src/flight/server/flight6.js +12 -2
  8. package/lib/dtls/src/flight/server/flight6.js.map +1 -1
  9. package/lib/dtls/src/server.js +6 -1
  10. package/lib/dtls/src/server.js.map +1 -1
  11. package/lib/dtls/src/socket.d.ts +1 -0
  12. package/lib/dtls/src/socket.js +3 -0
  13. package/lib/dtls/src/socket.js.map +1 -1
  14. package/lib/ice/src/stun/message.js +2 -10
  15. package/lib/ice/src/stun/message.js.map +1 -1
  16. package/lib/index.mjs +705 -113
  17. package/lib/nonstandard/index.mjs +308 -44
  18. package/lib/rtp/src/index.d.ts +1 -0
  19. package/lib/rtp/src/index.js +1 -0
  20. package/lib/rtp/src/index.js.map +1 -1
  21. package/lib/rtp/src/srtp/cipher/ctr.d.ts +3 -3
  22. package/lib/rtp/src/srtp/cipher/ctr.js +25 -14
  23. package/lib/rtp/src/srtp/cipher/ctr.js.map +1 -1
  24. package/lib/rtp/src/srtp/cipher/gcm.d.ts +3 -3
  25. package/lib/rtp/src/srtp/cipher/gcm.js +57 -20
  26. package/lib/rtp/src/srtp/cipher/gcm.js.map +1 -1
  27. package/lib/rtp/src/srtp/cipher/index.d.ts +1 -1
  28. package/lib/rtp/src/srtp/cipher/index.js +1 -1
  29. package/lib/rtp/src/srtp/cipher/index.js.map +1 -1
  30. package/lib/rtp/src/srtp/context/srtp.d.ts +2 -1
  31. package/lib/rtp/src/srtp/context/srtp.js +22 -5
  32. package/lib/rtp/src/srtp/context/srtp.js.map +1 -1
  33. package/lib/rtp/src/srtp/error.d.ts +3 -0
  34. package/lib/rtp/src/srtp/error.js +11 -0
  35. package/lib/rtp/src/srtp/error.js.map +1 -0
  36. package/lib/rtp/src/srtp/packet.d.ts +5 -0
  37. package/lib/rtp/src/srtp/packet.js +48 -0
  38. package/lib/rtp/src/srtp/packet.js.map +1 -0
  39. package/lib/sctp/src/chunk.js +3 -6
  40. package/lib/sctp/src/chunk.js.map +1 -1
  41. package/lib/sctp/src/sctp.d.ts +19 -0
  42. package/lib/sctp/src/sctp.js +259 -23
  43. package/lib/sctp/src/sctp.js.map +1 -1
  44. package/lib/webrtc/src/dataChannel.d.ts +1 -0
  45. package/lib/webrtc/src/dataChannel.js +5 -2
  46. package/lib/webrtc/src/dataChannel.js.map +1 -1
  47. package/lib/webrtc/src/peerConnection.d.ts +4 -1
  48. package/lib/webrtc/src/peerConnection.js +26 -5
  49. package/lib/webrtc/src/peerConnection.js.map +1 -1
  50. package/lib/webrtc/src/sctpManager.d.ts +1 -1
  51. package/lib/webrtc/src/sctpManager.js +3 -2
  52. package/lib/webrtc/src/sctpManager.js.map +1 -1
  53. package/lib/webrtc/src/sdpManager.d.ts +1 -1
  54. package/lib/webrtc/src/sdpManager.js +3 -4
  55. package/lib/webrtc/src/sdpManager.js.map +1 -1
  56. package/lib/webrtc/src/secureTransportManager.js +1 -1
  57. package/lib/webrtc/src/secureTransportManager.js.map +1 -1
  58. package/lib/webrtc/src/transceiverManager.js +3 -2
  59. package/lib/webrtc/src/transceiverManager.js.map +1 -1
  60. package/lib/webrtc/src/transport/dtls.d.ts +1 -0
  61. package/lib/webrtc/src/transport/dtls.js +117 -12
  62. package/lib/webrtc/src/transport/dtls.js.map +1 -1
  63. package/lib/webrtc/src/transport/sctp.d.ts +9 -3
  64. package/lib/webrtc/src/transport/sctp.js +35 -9
  65. package/lib/webrtc/src/transport/sctp.js.map +1 -1
  66. package/lib/webrtc/src/utils.d.ts +2 -0
  67. package/lib/webrtc/src/utils.js +20 -0
  68. package/lib/webrtc/src/utils.js.map +1 -1
  69. package/package.json +1 -3
@@ -1,6 +1,6 @@
1
1
  import { CipherAesBase } from ".";
2
- import { RtcpHeader } from "../../rtcp/header";
3
- import { RtpHeader } from "../../rtp/rtp";
2
+ import type { RtcpHeader } from "../../rtcp/header";
3
+ import type { RtpHeader } from "../../rtp/rtp";
4
4
  export declare class CipherAesGcm extends CipherAesBase {
5
5
  readonly aeadAuthTagLen = 16;
6
6
  readonly rtpIvWriter: (values: (number | bigint)[]) => Buffer<ArrayBuffer>;
@@ -8,7 +8,7 @@ export declare class CipherAesGcm extends CipherAesBase {
8
8
  readonly aadWriter: (values: (number | bigint)[]) => Buffer<ArrayBuffer>;
9
9
  constructor(srtpSessionKey: Buffer, srtpSessionSalt: Buffer, srtcpSessionKey: Buffer, srtcpSessionSalt: Buffer);
10
10
  encryptRtp(header: RtpHeader, payload: Buffer, rolloverCounter: number): Buffer<ArrayBuffer>;
11
- decryptRtp(cipherText: Buffer, rolloverCounter: number): [Buffer, RtpHeader];
11
+ decryptRtp(cipherText: Buffer, rolloverCounter: number, header?: RtpHeader): [Buffer, RtpHeader];
12
12
  encryptRTCP(rtcpPacket: Buffer, srtcpIndex: number): Buffer;
13
13
  decryptRTCP(encrypted: Buffer): [Buffer, RtcpHeader];
14
14
  private rtpInitializationVector;
@@ -5,8 +5,8 @@ const crypto_1 = require("crypto");
5
5
  const _1 = require(".");
6
6
  const src_1 = require("../../../../common/src");
7
7
  const helper_1 = require("../../helper");
8
- const header_1 = require("../../rtcp/header");
9
- const rtp_1 = require("../../rtp/rtp");
8
+ const error_1 = require("../error");
9
+ const packet_1 = require("../packet");
10
10
  class CipherAesGcm extends _1.CipherAesBase {
11
11
  constructor(srtpSessionKey, srtpSessionSalt, srtcpSessionKey, srtcpSessionSalt) {
12
12
  super(srtpSessionKey, srtpSessionSalt, srtcpSessionKey, srtcpSessionSalt);
@@ -46,17 +46,25 @@ class CipherAesGcm extends _1.CipherAesBase {
46
46
  const dst = Buffer.concat([hdr, enc, authTag]);
47
47
  return dst;
48
48
  }
49
- decryptRtp(cipherText, rolloverCounter) {
50
- const header = rtp_1.RtpHeader.deSerialize(cipherText);
49
+ decryptRtp(cipherText, rolloverCounter, header = (0, packet_1.parseSrtpRtpHeader)(cipherText, this.aeadAuthTagLen)) {
50
+ const headerBuffer = cipherText.subarray(0, header.payloadOffset);
51
+ const authTagOffset = cipherText.length - this.aeadAuthTagLen;
52
+ const authTag = cipherText.subarray(authTagOffset);
51
53
  let dst = Buffer.from([]);
52
54
  dst = (0, helper_1.growBufferSize)(dst, cipherText.length - this.aeadAuthTagLen);
53
- cipherText.slice(0, header.payloadOffset).copy(dst);
55
+ headerBuffer.copy(dst);
54
56
  const iv = this.rtpInitializationVector(header, rolloverCounter);
55
- const enc = cipherText.slice(header.payloadOffset, cipherText.length - this.aeadAuthTagLen);
56
- const cipher = (0, crypto_1.createDecipheriv)("aes-128-gcm", this.srtpSessionKey, iv);
57
- const dec = cipher.update(enc);
57
+ const enc = cipherText.slice(header.payloadOffset, authTagOffset);
58
+ const decipher = (0, crypto_1.createDecipheriv)("aes-128-gcm", this.srtpSessionKey, iv);
59
+ decipher.setAAD(headerBuffer);
60
+ decipher.setAuthTag(authTag);
61
+ const dec = decipher.update(enc);
62
+ finalizeAuthenticatedDecryption(decipher, "SRTP");
58
63
  dec.copy(dst, header.payloadOffset);
59
- return [dst, header];
64
+ return [
65
+ dst,
66
+ (0, packet_1.finalizeSrtpRtpHeader)(header, dst, "Failed to authenticate SRTP packet"),
67
+ ];
60
68
  }
61
69
  encryptRTCP(rtcpPacket, srtcpIndex) {
62
70
  const ssrc = rtcpPacket.readUInt32BE(4);
@@ -77,19 +85,40 @@ class CipherAesGcm extends _1.CipherAesBase {
77
85
  return dst;
78
86
  }
79
87
  decryptRTCP(encrypted) {
80
- const header = header_1.RtcpHeader.deSerialize(encrypted);
81
- const aadPos = encrypted.length - srtcpIndexSize;
82
- const dst = Buffer.alloc(aadPos - this.aeadAuthTagLen);
83
- encrypted.slice(0, 8).copy(dst);
88
+ const header = (0, packet_1.parseSrtcpHeader)(encrypted, this.aeadAuthTagLen, srtcpIndexSize);
89
+ const srtcpIndexOffset = encrypted.length - srtcpIndexSize;
90
+ const authTagOffset = srtcpIndexOffset - this.aeadAuthTagLen;
84
91
  const ssrc = encrypted.readUInt32BE(4);
85
- let srtcpIndex = encrypted.readUInt32BE(encrypted.length - 4);
86
- srtcpIndex &= ~(rtcpEncryptionFlag << 24);
92
+ const encodedSrtcpIndex = encrypted.readUInt32BE(srtcpIndexOffset);
93
+ const isEncrypted = encodedSrtcpIndex >>> 31 === 1;
94
+ const srtcpIndex = encodedSrtcpIndex & ~(rtcpEncryptionFlag << 24);
87
95
  const iv = this.rtcpInitializationVector(ssrc, srtcpIndex);
88
- const aad = this.rtcpAdditionalAuthenticatedData(encrypted, srtcpIndex);
89
- const cipher = (0, crypto_1.createDecipheriv)("aes-128-gcm", this.srtcpSessionKey, iv);
90
- cipher.setAAD(aad);
91
- const dec = cipher.update(encrypted.slice(8, aadPos));
92
- dec.copy(dst, 8);
96
+ const aad = isEncrypted
97
+ ? Buffer.concat([
98
+ encrypted.subarray(0, 8),
99
+ encrypted.subarray(srtcpIndexOffset),
100
+ ])
101
+ : Buffer.concat([
102
+ encrypted.subarray(0, authTagOffset),
103
+ encrypted.subarray(srtcpIndexOffset),
104
+ ]);
105
+ const cipherText = isEncrypted
106
+ ? encrypted.slice(8, authTagOffset)
107
+ : Buffer.alloc(0);
108
+ const dst = isEncrypted
109
+ ? Buffer.alloc(authTagOffset)
110
+ : Buffer.from(encrypted.subarray(0, authTagOffset));
111
+ if (isEncrypted) {
112
+ encrypted.slice(0, 8).copy(dst);
113
+ }
114
+ const decipher = (0, crypto_1.createDecipheriv)("aes-128-gcm", this.srtcpSessionKey, iv);
115
+ decipher.setAAD(aad);
116
+ decipher.setAuthTag(encrypted.subarray(authTagOffset, srtcpIndexOffset));
117
+ const dec = decipher.update(cipherText);
118
+ finalizeAuthenticatedDecryption(decipher, "SRTCP");
119
+ if (isEncrypted) {
120
+ dec.copy(dst, 8);
121
+ }
93
122
  return [dst, header];
94
123
  }
95
124
  // https://tools.ietf.org/html/rfc7714#section-8.1
@@ -126,4 +155,12 @@ class CipherAesGcm extends _1.CipherAesBase {
126
155
  exports.CipherAesGcm = CipherAesGcm;
127
156
  const srtcpIndexSize = 4;
128
157
  const rtcpEncryptionFlag = 0x80;
158
+ function finalizeAuthenticatedDecryption(decipher, packetType) {
159
+ try {
160
+ decipher.final();
161
+ }
162
+ catch {
163
+ throw new error_1.SrtpAuthenticationError(`Failed to authenticate ${packetType} packet`);
164
+ }
165
+ }
129
166
  //# sourceMappingURL=gcm.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"gcm.js","sourceRoot":"","sources":["../../../../../../rtp/src/srtp/cipher/gcm.ts"],"names":[],"mappings":"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","sourcesContent":["import { createCipheriv, createDecipheriv } from \"crypto\";\n\nimport { CipherAesBase } from \".\";\nimport { createBufferWriter } from \"../../../../common/src\";\nimport { growBufferSize } from \"../../helper\";\nimport { RtcpHeader } from \"../../rtcp/header\";\nimport { RtpHeader } from \"../../rtp/rtp\";\n\nexport class CipherAesGcm extends CipherAesBase {\n readonly aeadAuthTagLen = 16;\n readonly rtpIvWriter = createBufferWriter([2, 4, 4, 2], true);\n readonly rtcpIvWriter = createBufferWriter([2, 4, 2, 4], true);\n readonly aadWriter = createBufferWriter([4], true);\n\n constructor(\n srtpSessionKey: Buffer,\n srtpSessionSalt: Buffer,\n srtcpSessionKey: Buffer,\n srtcpSessionSalt: Buffer,\n ) {\n super(srtpSessionKey, srtpSessionSalt, srtcpSessionKey, srtcpSessionSalt);\n }\n\n encryptRtp(header: RtpHeader, payload: Buffer, rolloverCounter: number) {\n const hdr = header.serialize(header.serializeSize);\n\n const iv = this.rtpInitializationVector(header, rolloverCounter);\n\n const cipher = createCipheriv(\"aes-128-gcm\", this.srtpSessionKey, iv);\n cipher.setAAD(hdr);\n const enc = cipher.update(payload);\n cipher.final();\n\n const authTag = cipher.getAuthTag();\n\n const dst = Buffer.concat([hdr, enc, authTag]);\n return dst;\n }\n\n decryptRtp(cipherText: Buffer, rolloverCounter: number): [Buffer, RtpHeader] {\n const header = RtpHeader.deSerialize(cipherText);\n\n let dst = Buffer.from([]);\n dst = growBufferSize(dst, cipherText.length - this.aeadAuthTagLen);\n cipherText.slice(0, header.payloadOffset).copy(dst);\n\n const iv = this.rtpInitializationVector(header, rolloverCounter);\n\n const enc = cipherText.slice(\n header.payloadOffset,\n cipherText.length - this.aeadAuthTagLen,\n );\n\n const cipher = createDecipheriv(\"aes-128-gcm\", this.srtpSessionKey, iv);\n const dec = cipher.update(enc);\n\n dec.copy(dst, header.payloadOffset);\n\n return [dst, header];\n }\n\n encryptRTCP(rtcpPacket: Buffer, srtcpIndex: number): Buffer {\n const ssrc = rtcpPacket.readUInt32BE(4);\n\n const addPos = rtcpPacket.length + this.aeadAuthTagLen;\n let dst = Buffer.from([]);\n dst = growBufferSize(dst, addPos + srtcpIndexSize);\n rtcpPacket.slice(0, 8).copy(dst);\n\n const iv = this.rtcpInitializationVector(ssrc, srtcpIndex);\n const aad = this.rtcpAdditionalAuthenticatedData(rtcpPacket, srtcpIndex);\n\n const cipher = createCipheriv(\"aes-128-gcm\", this.srtcpSessionKey, iv);\n cipher.setAAD(aad);\n const enc = cipher.update(rtcpPacket.slice(8));\n cipher.final();\n enc.copy(dst, 8);\n\n const authTag = cipher.getAuthTag();\n authTag.copy(dst, 8 + enc.length);\n aad.slice(8, 12).copy(dst, addPos);\n\n return dst;\n }\n\n decryptRTCP(encrypted: Buffer): [Buffer, RtcpHeader] {\n const header = RtcpHeader.deSerialize(encrypted);\n const aadPos = encrypted.length - srtcpIndexSize;\n\n const dst = Buffer.alloc(aadPos - this.aeadAuthTagLen);\n encrypted.slice(0, 8).copy(dst);\n\n const ssrc = encrypted.readUInt32BE(4);\n\n let srtcpIndex = encrypted.readUInt32BE(encrypted.length - 4);\n srtcpIndex &= ~(rtcpEncryptionFlag << 24);\n\n const iv = this.rtcpInitializationVector(ssrc, srtcpIndex);\n const aad = this.rtcpAdditionalAuthenticatedData(encrypted, srtcpIndex);\n\n const cipher = createDecipheriv(\"aes-128-gcm\", this.srtcpSessionKey, iv);\n cipher.setAAD(aad);\n const dec = cipher.update(encrypted.slice(8, aadPos));\n\n dec.copy(dst, 8);\n\n return [dst, header];\n }\n\n // https://tools.ietf.org/html/rfc7714#section-8.1\n private rtpInitializationVector(header: RtpHeader, rolloverCounter: number) {\n const iv = this.rtpIvWriter([\n 0,\n header.ssrc,\n rolloverCounter,\n header.sequenceNumber,\n ]);\n for (let i = 0; i < iv.length; i++) {\n iv[i] ^= this.srtpSessionSalt[i];\n }\n return iv;\n }\n\n // https://tools.ietf.org/html/rfc7714#section-9.1\n private rtcpInitializationVector(ssrc: number, srtcpIndex: number) {\n const iv = this.rtcpIvWriter([0, ssrc, 0, srtcpIndex]);\n for (let i = 0; i < iv.length; i++) {\n iv[i] ^= this.srtcpSessionSalt[i];\n }\n return iv;\n }\n\n // https://datatracker.ietf.org/doc/html/rfc7714#section-17\n private rtcpAdditionalAuthenticatedData(\n rtcpPacket: Buffer,\n srtcpIndex: number,\n ) {\n const aad = Buffer.concat([\n rtcpPacket.subarray(0, 8),\n this.aadWriter([srtcpIndex]),\n ]);\n aad[8] |= rtcpEncryptionFlag;\n return aad;\n }\n}\n\nconst srtcpIndexSize = 4;\nconst rtcpEncryptionFlag = 0x80;\n"]}
1
+ {"version":3,"file":"gcm.js","sourceRoot":"","sources":["../../../../../../rtp/src/srtp/cipher/gcm.ts"],"names":[],"mappings":"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","sourcesContent":["import { createCipheriv, createDecipheriv } from \"crypto\";\n\nimport { CipherAesBase } from \".\";\nimport { createBufferWriter } from \"../../../../common/src\";\nimport { growBufferSize } from \"../../helper\";\nimport type { RtcpHeader } from \"../../rtcp/header\";\nimport type { RtpHeader } from \"../../rtp/rtp\";\nimport { SrtpAuthenticationError } from \"../error\";\nimport {\n finalizeSrtpRtpHeader,\n parseSrtcpHeader,\n parseSrtpRtpHeader,\n} from \"../packet\";\n\nexport class CipherAesGcm extends CipherAesBase {\n readonly aeadAuthTagLen = 16;\n readonly rtpIvWriter = createBufferWriter([2, 4, 4, 2], true);\n readonly rtcpIvWriter = createBufferWriter([2, 4, 2, 4], true);\n readonly aadWriter = createBufferWriter([4], true);\n\n constructor(\n srtpSessionKey: Buffer,\n srtpSessionSalt: Buffer,\n srtcpSessionKey: Buffer,\n srtcpSessionSalt: Buffer,\n ) {\n super(srtpSessionKey, srtpSessionSalt, srtcpSessionKey, srtcpSessionSalt);\n }\n\n encryptRtp(header: RtpHeader, payload: Buffer, rolloverCounter: number) {\n const hdr = header.serialize(header.serializeSize);\n\n const iv = this.rtpInitializationVector(header, rolloverCounter);\n\n const cipher = createCipheriv(\"aes-128-gcm\", this.srtpSessionKey, iv);\n cipher.setAAD(hdr);\n const enc = cipher.update(payload);\n cipher.final();\n\n const authTag = cipher.getAuthTag();\n\n const dst = Buffer.concat([hdr, enc, authTag]);\n return dst;\n }\n\n decryptRtp(\n cipherText: Buffer,\n rolloverCounter: number,\n header = parseSrtpRtpHeader(cipherText, this.aeadAuthTagLen),\n ): [Buffer, RtpHeader] {\n const headerBuffer = cipherText.subarray(0, header.payloadOffset);\n const authTagOffset = cipherText.length - this.aeadAuthTagLen;\n const authTag = cipherText.subarray(authTagOffset);\n\n let dst = Buffer.from([]);\n dst = growBufferSize(dst, cipherText.length - this.aeadAuthTagLen);\n headerBuffer.copy(dst);\n\n const iv = this.rtpInitializationVector(header, rolloverCounter);\n\n const enc = cipherText.slice(header.payloadOffset, authTagOffset);\n\n const decipher = createDecipheriv(\"aes-128-gcm\", this.srtpSessionKey, iv);\n decipher.setAAD(headerBuffer);\n decipher.setAuthTag(authTag);\n const dec = decipher.update(enc);\n finalizeAuthenticatedDecryption(decipher, \"SRTP\");\n\n dec.copy(dst, header.payloadOffset);\n\n return [\n dst,\n finalizeSrtpRtpHeader(header, dst, \"Failed to authenticate SRTP packet\"),\n ];\n }\n\n encryptRTCP(rtcpPacket: Buffer, srtcpIndex: number): Buffer {\n const ssrc = rtcpPacket.readUInt32BE(4);\n\n const addPos = rtcpPacket.length + this.aeadAuthTagLen;\n let dst = Buffer.from([]);\n dst = growBufferSize(dst, addPos + srtcpIndexSize);\n rtcpPacket.slice(0, 8).copy(dst);\n\n const iv = this.rtcpInitializationVector(ssrc, srtcpIndex);\n const aad = this.rtcpAdditionalAuthenticatedData(rtcpPacket, srtcpIndex);\n\n const cipher = createCipheriv(\"aes-128-gcm\", this.srtcpSessionKey, iv);\n cipher.setAAD(aad);\n const enc = cipher.update(rtcpPacket.slice(8));\n cipher.final();\n enc.copy(dst, 8);\n\n const authTag = cipher.getAuthTag();\n authTag.copy(dst, 8 + enc.length);\n aad.slice(8, 12).copy(dst, addPos);\n\n return dst;\n }\n\n decryptRTCP(encrypted: Buffer): [Buffer, RtcpHeader] {\n const header = parseSrtcpHeader(\n encrypted,\n this.aeadAuthTagLen,\n srtcpIndexSize,\n );\n const srtcpIndexOffset = encrypted.length - srtcpIndexSize;\n const authTagOffset = srtcpIndexOffset - this.aeadAuthTagLen;\n\n const ssrc = encrypted.readUInt32BE(4);\n const encodedSrtcpIndex = encrypted.readUInt32BE(srtcpIndexOffset);\n const isEncrypted = encodedSrtcpIndex >>> 31 === 1;\n const srtcpIndex = encodedSrtcpIndex & ~(rtcpEncryptionFlag << 24);\n\n const iv = this.rtcpInitializationVector(ssrc, srtcpIndex);\n const aad = isEncrypted\n ? Buffer.concat([\n encrypted.subarray(0, 8),\n encrypted.subarray(srtcpIndexOffset),\n ])\n : Buffer.concat([\n encrypted.subarray(0, authTagOffset),\n encrypted.subarray(srtcpIndexOffset),\n ]);\n const cipherText = isEncrypted\n ? encrypted.slice(8, authTagOffset)\n : Buffer.alloc(0);\n const dst = isEncrypted\n ? Buffer.alloc(authTagOffset)\n : Buffer.from(encrypted.subarray(0, authTagOffset));\n if (isEncrypted) {\n encrypted.slice(0, 8).copy(dst);\n }\n\n const decipher = createDecipheriv(\"aes-128-gcm\", this.srtcpSessionKey, iv);\n decipher.setAAD(aad);\n decipher.setAuthTag(encrypted.subarray(authTagOffset, srtcpIndexOffset));\n const dec = decipher.update(cipherText);\n finalizeAuthenticatedDecryption(decipher, \"SRTCP\");\n\n if (isEncrypted) {\n dec.copy(dst, 8);\n }\n\n return [dst, header];\n }\n\n // https://tools.ietf.org/html/rfc7714#section-8.1\n private rtpInitializationVector(header: RtpHeader, rolloverCounter: number) {\n const iv = this.rtpIvWriter([\n 0,\n header.ssrc,\n rolloverCounter,\n header.sequenceNumber,\n ]);\n for (let i = 0; i < iv.length; i++) {\n iv[i] ^= this.srtpSessionSalt[i];\n }\n return iv;\n }\n\n // https://tools.ietf.org/html/rfc7714#section-9.1\n private rtcpInitializationVector(ssrc: number, srtcpIndex: number) {\n const iv = this.rtcpIvWriter([0, ssrc, 0, srtcpIndex]);\n for (let i = 0; i < iv.length; i++) {\n iv[i] ^= this.srtcpSessionSalt[i];\n }\n return iv;\n }\n\n // https://datatracker.ietf.org/doc/html/rfc7714#section-17\n private rtcpAdditionalAuthenticatedData(\n rtcpPacket: Buffer,\n srtcpIndex: number,\n ) {\n const aad = Buffer.concat([\n rtcpPacket.subarray(0, 8),\n this.aadWriter([srtcpIndex]),\n ]);\n aad[8] |= rtcpEncryptionFlag;\n return aad;\n }\n}\n\nconst srtcpIndexSize = 4;\nconst rtcpEncryptionFlag = 0x80;\n\nfunction finalizeAuthenticatedDecryption(\n decipher: ReturnType<typeof createDecipheriv>,\n packetType: \"SRTP\" | \"SRTCP\",\n) {\n try {\n decipher.final();\n } catch {\n throw new SrtpAuthenticationError(\n `Failed to authenticate ${packetType} packet`,\n );\n }\n}\n"]}
@@ -7,7 +7,7 @@ export declare abstract class CipherAesBase {
7
7
  srtcpSessionSalt: Buffer;
8
8
  constructor(srtpSessionKey: Buffer, srtpSessionSalt: Buffer, srtcpSessionKey: Buffer, srtcpSessionSalt: Buffer);
9
9
  encryptRtp(header: RtpHeader, payload: Buffer, rolloverCounter: number): Buffer;
10
- decryptRtp(cipherText: Buffer, rolloverCounter: number): [Buffer, RtpHeader];
10
+ decryptRtp(cipherText: Buffer, rolloverCounter: number, header?: RtpHeader): [Buffer, RtpHeader];
11
11
  encryptRTCP(rawRtcp: Buffer, srtcpIndex: number): Buffer;
12
12
  decryptRTCP(encrypted: Buffer): [Buffer, RtcpHeader];
13
13
  }
@@ -31,7 +31,7 @@ class CipherAesBase {
31
31
  encryptRtp(header, payload, rolloverCounter) {
32
32
  return Buffer.from([]);
33
33
  }
34
- decryptRtp(cipherText, rolloverCounter) {
34
+ decryptRtp(cipherText, rolloverCounter, header) {
35
35
  return [];
36
36
  }
37
37
  encryptRTCP(rawRtcp, srtcpIndex) {
@@ -1 +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;QAH/B;;;;mBAAO,cAAc;WAAQ;QAC7B;;;;mBAAO,eAAe;WAAQ;QAC9B;;;;mBAAO,eAAe;WAAQ;QAC9B;;;;mBAAO,gBAAgB;WAAQ;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 type { RtcpHeader } from \"../../rtcp/header\";\nimport type { 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"]}
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;QAH/B;;;;mBAAO,cAAc;WAAQ;QAC7B;;;;mBAAO,eAAe;WAAQ;QAC9B;;;;mBAAO,eAAe;WAAQ;QAC9B;;;;mBAAO,gBAAgB;WAAQ;IAC9B,CAAC;IAEJ,UAAU,CACR,MAAiB,EACjB,OAAe,EACf,eAAuB;QAEvB,OAAO,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACzB,CAAC;IAED,UAAU,CACR,UAAkB,EAClB,eAAuB,EACvB,MAAkB;QAElB,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;AA/BD,sCA+BC","sourcesContent":["import type { RtcpHeader } from \"../../rtcp/header\";\nimport type { 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(\n cipherText: Buffer,\n rolloverCounter: number,\n header?: RtpHeader,\n ): [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"]}
@@ -1,8 +1,9 @@
1
- import { RtpHeader } from "../../rtp/rtp";
1
+ import type { RtpHeader } from "../../rtp/rtp";
2
2
  import type { SrtpProfile } from "../const";
3
3
  import { Context } from "./context";
4
4
  export declare class SrtpContext extends Context {
5
5
  constructor(masterKey: Buffer, masterSalt: Buffer, profile: SrtpProfile);
6
6
  encryptRtp(payload: Buffer, header: RtpHeader): Buffer<ArrayBufferLike>;
7
7
  decryptRtp(cipherText: Buffer): [Buffer, RtpHeader];
8
+ private get rtpAuthTagLength();
8
9
  }
@@ -1,7 +1,8 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.SrtpContext = void 0;
4
- const rtp_1 = require("../../rtp/rtp");
4
+ const const_1 = require("../const");
5
+ const packet_1 = require("../packet");
5
6
  const context_1 = require("./context");
6
7
  class SrtpContext extends context_1.Context {
7
8
  constructor(masterKey, masterSalt, profile) {
@@ -14,12 +15,28 @@ class SrtpContext extends context_1.Context {
14
15
  return enc;
15
16
  }
16
17
  decryptRtp(cipherText) {
17
- const header = rtp_1.RtpHeader.deSerialize(cipherText);
18
- const s = this.getSrtpSsrcState(header.ssrc);
19
- this.updateRolloverCount(header.sequenceNumber, s);
20
- const dec = this.cipher.decryptRtp(cipherText, s.rolloverCounter);
18
+ const header = (0, packet_1.parseSrtpRtpHeader)(cipherText, this.rtpAuthTagLength);
19
+ const existingState = this.srtpSSRCStates[header.ssrc];
20
+ const nextState = existingState
21
+ ? { ...existingState }
22
+ : {
23
+ ssrc: header.ssrc,
24
+ rolloverCounter: 0,
25
+ lastSequenceNumber: 0,
26
+ };
27
+ this.updateRolloverCount(header.sequenceNumber, nextState);
28
+ const dec = this.cipher.decryptRtp(cipherText, nextState.rolloverCounter, header);
29
+ if (existingState) {
30
+ Object.assign(existingState, nextState);
31
+ }
32
+ else {
33
+ this.srtpSSRCStates[header.ssrc] = nextState;
34
+ }
21
35
  return dec;
22
36
  }
37
+ get rtpAuthTagLength() {
38
+ return this.profile === const_1.ProtectionProfileAeadAes128Gcm ? 16 : 10;
39
+ }
23
40
  }
24
41
  exports.SrtpContext = SrtpContext;
25
42
  //# sourceMappingURL=srtp.js.map
@@ -1 +1 @@
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,OAAoB;QACrE,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 type { SrtpProfile } from \"../const\";\nimport { Context } from \"./context\";\n\nexport class SrtpContext extends Context {\n constructor(masterKey: Buffer, masterSalt: Buffer, profile: SrtpProfile) {\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"]}
1
+ {"version":3,"file":"srtp.js","sourceRoot":"","sources":["../../../../../../rtp/src/srtp/context/srtp.ts"],"names":[],"mappings":";;;AACA,oCAA0D;AAE1D,sCAA+C;AAC/C,uCAAoC;AAEpC,MAAa,WAAY,SAAQ,iBAAO;IACtC,YAAY,SAAiB,EAAE,UAAkB,EAAE,OAAoB;QACrE,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,IAAA,2BAAkB,EAAC,UAAU,EAAE,IAAI,CAAC,gBAAgB,CAAC,CAAC;QAErE,MAAM,aAAa,GAAG,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QACvD,MAAM,SAAS,GAAG,aAAa;YAC7B,CAAC,CAAC,EAAE,GAAG,aAAa,EAAE;YACtB,CAAC,CAAC;gBACE,IAAI,EAAE,MAAM,CAAC,IAAI;gBACjB,eAAe,EAAE,CAAC;gBAClB,kBAAkB,EAAE,CAAC;aACtB,CAAC;QACN,IAAI,CAAC,mBAAmB,CAAC,MAAM,CAAC,cAAc,EAAE,SAAS,CAAC,CAAC;QAE3D,MAAM,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC,UAAU,CAChC,UAAU,EACV,SAAS,CAAC,eAAe,EACzB,MAAM,CACP,CAAC;QACF,IAAI,aAAa,EAAE,CAAC;YAClB,MAAM,CAAC,MAAM,CAAC,aAAa,EAAE,SAAS,CAAC,CAAC;QAC1C,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,SAAS,CAAC;QAC/C,CAAC;QACD,OAAO,GAAG,CAAC;IACb,CAAC;IAED,IAAY,gBAAgB;QAC1B,OAAO,IAAI,CAAC,OAAO,KAAK,sCAA8B,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;IACnE,CAAC;CACF;AA1CD,kCA0CC","sourcesContent":["import type { RtpHeader } from \"../../rtp/rtp\";\nimport { ProtectionProfileAeadAes128Gcm } from \"../const\";\nimport type { SrtpProfile } from \"../const\";\nimport { parseSrtpRtpHeader } from \"../packet\";\nimport { Context } from \"./context\";\n\nexport class SrtpContext extends Context {\n constructor(masterKey: Buffer, masterSalt: Buffer, profile: SrtpProfile) {\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 = parseSrtpRtpHeader(cipherText, this.rtpAuthTagLength);\n\n const existingState = this.srtpSSRCStates[header.ssrc];\n const nextState = existingState\n ? { ...existingState }\n : {\n ssrc: header.ssrc,\n rolloverCounter: 0,\n lastSequenceNumber: 0,\n };\n this.updateRolloverCount(header.sequenceNumber, nextState);\n\n const dec = this.cipher.decryptRtp(\n cipherText,\n nextState.rolloverCounter,\n header,\n );\n if (existingState) {\n Object.assign(existingState, nextState);\n } else {\n this.srtpSSRCStates[header.ssrc] = nextState;\n }\n return dec;\n }\n\n private get rtpAuthTagLength() {\n return this.profile === ProtectionProfileAeadAes128Gcm ? 16 : 10;\n }\n}\n"]}
@@ -0,0 +1,3 @@
1
+ export declare class SrtpAuthenticationError extends Error {
2
+ constructor(message: string);
3
+ }
@@ -0,0 +1,11 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.SrtpAuthenticationError = void 0;
4
+ class SrtpAuthenticationError extends Error {
5
+ constructor(message) {
6
+ super(message);
7
+ this.name = "SrtpAuthenticationError";
8
+ }
9
+ }
10
+ exports.SrtpAuthenticationError = SrtpAuthenticationError;
11
+ //# sourceMappingURL=error.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"error.js","sourceRoot":"","sources":["../../../../../rtp/src/srtp/error.ts"],"names":[],"mappings":";;;AAAA,MAAa,uBAAwB,SAAQ,KAAK;IAChD,YAAY,OAAe;QACzB,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,yBAAyB,CAAC;IACxC,CAAC;CACF;AALD,0DAKC","sourcesContent":["export class SrtpAuthenticationError extends Error {\n constructor(message: string) {\n super(message);\n this.name = \"SrtpAuthenticationError\";\n }\n}\n"]}
@@ -0,0 +1,5 @@
1
+ import { RtcpHeader } from "../rtcp/header";
2
+ import { RtpHeader } from "../rtp/rtp";
3
+ export declare function parseSrtpRtpHeader(packet: Buffer, authTagLength: number, message?: string): RtpHeader;
4
+ export declare function parseSrtcpHeader(packet: Buffer, authTagLength: number, srtcpIndexSize: number, message?: string): RtcpHeader;
5
+ export declare function finalizeSrtpRtpHeader(header: RtpHeader, packet: Buffer, message?: string): RtpHeader;
@@ -0,0 +1,48 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.parseSrtpRtpHeader = parseSrtpRtpHeader;
4
+ exports.parseSrtcpHeader = parseSrtcpHeader;
5
+ exports.finalizeSrtpRtpHeader = finalizeSrtpRtpHeader;
6
+ const header_1 = require("../rtcp/header");
7
+ const rtp_1 = require("../rtp/rtp");
8
+ const error_1 = require("./error");
9
+ const minRtpHeaderSize = 12;
10
+ const minRtcpPacketSize = 8;
11
+ function parseSrtpRtpHeader(packet, authTagLength, message = "Failed to authenticate SRTP packet") {
12
+ const authTagOffset = packet.length - authTagLength;
13
+ assertAuthenticatedPacketLength(packet.length >= minRtpHeaderSize + authTagLength, message);
14
+ const header = wrapAuthenticationError(() => rtp_1.RtpHeader.deSerialize(packet.subarray(0, authTagOffset)), message);
15
+ header.paddingSize = 0;
16
+ assertAuthenticatedPacketLength(header.payloadOffset >= minRtpHeaderSize &&
17
+ header.payloadOffset <= authTagOffset, message);
18
+ return header;
19
+ }
20
+ function parseSrtcpHeader(packet, authTagLength, srtcpIndexSize, message = "Failed to authenticate SRTCP packet") {
21
+ assertAuthenticatedPacketLength(packet.length >= minRtcpPacketSize + authTagLength + srtcpIndexSize, message);
22
+ return wrapAuthenticationError(() => header_1.RtcpHeader.deSerialize(packet.subarray(0, header_1.RTCP_HEADER_SIZE)), message);
23
+ }
24
+ function assertAuthenticatedPacketLength(condition, message) {
25
+ if (!condition) {
26
+ throw new error_1.SrtpAuthenticationError(message);
27
+ }
28
+ }
29
+ function wrapAuthenticationError(parse, message) {
30
+ try {
31
+ return parse();
32
+ }
33
+ catch {
34
+ throw new error_1.SrtpAuthenticationError(message);
35
+ }
36
+ }
37
+ function finalizeSrtpRtpHeader(header, packet, message = "Failed to authenticate SRTP packet") {
38
+ if (!header.padding) {
39
+ header.paddingSize = 0;
40
+ return header;
41
+ }
42
+ assertAuthenticatedPacketLength(packet.length > header.payloadOffset, message);
43
+ const paddingSize = packet[packet.length - 1];
44
+ assertAuthenticatedPacketLength(paddingSize > 0 && paddingSize <= packet.length - header.payloadOffset, message);
45
+ header.paddingSize = paddingSize;
46
+ return header;
47
+ }
48
+ //# sourceMappingURL=packet.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"packet.js","sourceRoot":"","sources":["../../../../../rtp/src/srtp/packet.ts"],"names":[],"mappings":";;AAOA,gDAwBC;AAED,4CAeC;AAgBD,sDAuBC;AAvFD,2CAA8D;AAC9D,oCAAuC;AACvC,mCAAkD;AAElD,MAAM,gBAAgB,GAAG,EAAE,CAAC;AAC5B,MAAM,iBAAiB,GAAG,CAAC,CAAC;AAE5B,SAAgB,kBAAkB,CAChC,MAAc,EACd,aAAqB,EACrB,OAAO,GAAG,oCAAoC;IAE9C,MAAM,aAAa,GAAG,MAAM,CAAC,MAAM,GAAG,aAAa,CAAC;IACpD,+BAA+B,CAC7B,MAAM,CAAC,MAAM,IAAI,gBAAgB,GAAG,aAAa,EACjD,OAAO,CACR,CAAC;IAEF,MAAM,MAAM,GAAG,uBAAuB,CACpC,GAAG,EAAE,CAAC,eAAS,CAAC,WAAW,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,EAAE,aAAa,CAAC,CAAC,EAC9D,OAAO,CACR,CAAC;IACF,MAAM,CAAC,WAAW,GAAG,CAAC,CAAC;IAEvB,+BAA+B,CAC7B,MAAM,CAAC,aAAa,IAAI,gBAAgB;QACtC,MAAM,CAAC,aAAa,IAAI,aAAa,EACvC,OAAO,CACR,CAAC;IAEF,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,SAAgB,gBAAgB,CAC9B,MAAc,EACd,aAAqB,EACrB,cAAsB,EACtB,OAAO,GAAG,qCAAqC;IAE/C,+BAA+B,CAC7B,MAAM,CAAC,MAAM,IAAI,iBAAiB,GAAG,aAAa,GAAG,cAAc,EACnE,OAAO,CACR,CAAC;IAEF,OAAO,uBAAuB,CAC5B,GAAG,EAAE,CAAC,mBAAU,CAAC,WAAW,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,EAAE,yBAAgB,CAAC,CAAC,EAClE,OAAO,CACR,CAAC;AACJ,CAAC;AAED,SAAS,+BAA+B,CAAC,SAAkB,EAAE,OAAe;IAC1E,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,MAAM,IAAI,+BAAuB,CAAC,OAAO,CAAC,CAAC;IAC7C,CAAC;AACH,CAAC;AAED,SAAS,uBAAuB,CAAI,KAAc,EAAE,OAAe;IACjE,IAAI,CAAC;QACH,OAAO,KAAK,EAAE,CAAC;IACjB,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,IAAI,+BAAuB,CAAC,OAAO,CAAC,CAAC;IAC7C,CAAC;AACH,CAAC;AAED,SAAgB,qBAAqB,CACnC,MAAiB,EACjB,MAAc,EACd,OAAO,GAAG,oCAAoC;IAE9C,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;QACpB,MAAM,CAAC,WAAW,GAAG,CAAC,CAAC;QACvB,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,+BAA+B,CAC7B,MAAM,CAAC,MAAM,GAAG,MAAM,CAAC,aAAa,EACpC,OAAO,CACR,CAAC;IAEF,MAAM,WAAW,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IAC9C,+BAA+B,CAC7B,WAAW,GAAG,CAAC,IAAI,WAAW,IAAI,MAAM,CAAC,MAAM,GAAG,MAAM,CAAC,aAAa,EACtE,OAAO,CACR,CAAC;IAEF,MAAM,CAAC,WAAW,GAAG,WAAW,CAAC;IACjC,OAAO,MAAM,CAAC;AAChB,CAAC","sourcesContent":["import { RTCP_HEADER_SIZE, RtcpHeader } from \"../rtcp/header\";\nimport { RtpHeader } from \"../rtp/rtp\";\nimport { SrtpAuthenticationError } from \"./error\";\n\nconst minRtpHeaderSize = 12;\nconst minRtcpPacketSize = 8;\n\nexport function parseSrtpRtpHeader(\n packet: Buffer,\n authTagLength: number,\n message = \"Failed to authenticate SRTP packet\",\n) {\n const authTagOffset = packet.length - authTagLength;\n assertAuthenticatedPacketLength(\n packet.length >= minRtpHeaderSize + authTagLength,\n message,\n );\n\n const header = wrapAuthenticationError(\n () => RtpHeader.deSerialize(packet.subarray(0, authTagOffset)),\n message,\n );\n header.paddingSize = 0;\n\n assertAuthenticatedPacketLength(\n header.payloadOffset >= minRtpHeaderSize &&\n header.payloadOffset <= authTagOffset,\n message,\n );\n\n return header;\n}\n\nexport function parseSrtcpHeader(\n packet: Buffer,\n authTagLength: number,\n srtcpIndexSize: number,\n message = \"Failed to authenticate SRTCP packet\",\n) {\n assertAuthenticatedPacketLength(\n packet.length >= minRtcpPacketSize + authTagLength + srtcpIndexSize,\n message,\n );\n\n return wrapAuthenticationError(\n () => RtcpHeader.deSerialize(packet.subarray(0, RTCP_HEADER_SIZE)),\n message,\n );\n}\n\nfunction assertAuthenticatedPacketLength(condition: boolean, message: string) {\n if (!condition) {\n throw new SrtpAuthenticationError(message);\n }\n}\n\nfunction wrapAuthenticationError<T>(parse: () => T, message: string) {\n try {\n return parse();\n } catch {\n throw new SrtpAuthenticationError(message);\n }\n}\n\nexport function finalizeSrtpRtpHeader(\n header: RtpHeader,\n packet: Buffer,\n message = \"Failed to authenticate SRTP packet\",\n) {\n if (!header.padding) {\n header.paddingSize = 0;\n return header;\n }\n\n assertAuthenticatedPacketLength(\n packet.length > header.payloadOffset,\n message,\n );\n\n const paddingSize = packet[packet.length - 1];\n assertAuthenticatedPacketLength(\n paddingSize > 0 && paddingSize <= packet.length - header.payloadOffset,\n message,\n );\n\n header.paddingSize = paddingSize;\n return header;\n}\n"]}
@@ -25,15 +25,12 @@
25
25
  // 191 - reserved for IETF-defined Chunk Extensions
26
26
  // 192 to 254 - available
27
27
  // 255 - reserved for IETF-defined Chunk Extensions
28
- var __importDefault = (this && this.__importDefault) || function (mod) {
29
- return (mod && mod.__esModule) ? mod : { "default": mod };
30
- };
31
28
  Object.defineProperty(exports, "__esModule", { value: true });
32
29
  exports.CHUNK_BY_TYPE = exports.ShutdownCompleteChunk = exports.ShutdownAckChunk = exports.ShutdownChunk = exports.SackChunk = exports.ReconfigChunk = exports.HeartbeatAckChunk = exports.HeartbeatChunk = exports.ErrorChunk = exports.AbortChunk = exports.BaseParamsChunk = exports.CookieAckChunk = exports.CookieEchoChunk = exports.DataChunk = exports.ForwardTsnChunk = exports.ReConfigChunk = exports.InitAckChunk = exports.InitChunk = exports.BaseInitChunk = exports.Chunk = void 0;
33
30
  exports.decodeParams = decodeParams;
34
31
  exports.parsePacket = parsePacket;
35
32
  exports.serializePacket = serializePacket;
36
- const crc32c_js_1 = __importDefault(require("turbo-crc32/crc32c.js"));
33
+ const common_1 = require("./imports/common");
37
34
  class Chunk {
38
35
  get body() {
39
36
  return this._body;
@@ -732,7 +729,7 @@ function parsePacket(data) {
732
729
  const destinationPort = data.readUInt16BE(2);
733
730
  const verificationTag = data.readUInt32BE(4);
734
731
  const checkSum = data.readUInt32LE(8);
735
- const expect = (0, crc32c_js_1.default)(Buffer.concat([
732
+ const expect = (0, common_1.crc32c)(Buffer.concat([
736
733
  data.slice(0, 8),
737
734
  Buffer.from("\x00\x00\x00\x00"),
738
735
  data.slice(12),
@@ -763,7 +760,7 @@ function serializePacket(sourcePort, destinationPort, verificationTag, chunk) {
763
760
  header.writeUInt16BE(destinationPort, 2);
764
761
  header.writeUInt32BE(verificationTag, 4);
765
762
  const body = chunk.bytes;
766
- const checksum = (0, crc32c_js_1.default)(Buffer.concat([header, Buffer.from("\x00\x00\x00\x00"), body]));
763
+ const checksum = (0, common_1.crc32c)(Buffer.concat([header, Buffer.from("\x00\x00\x00\x00"), body]));
767
764
  const checkSumBuf = Buffer.alloc(4);
768
765
  checkSumBuf.writeUInt32LE(checksum, 0);
769
766
  const packet = Buffer.concat([header, checkSumBuf, body]);
@@ -1 +1 @@
1
- {"version":3,"file":"chunk.js","sourceRoot":"","sources":["../../../../sctp/src/chunk.ts"],"names":[],"mappings":"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","sourcesContent":["// ID Value Chunk Type\n// ----- ----------\n// 0 - Payload Data (DATA)\n// 1 - Initiation (INIT)\n// 2 - Initiation Acknowledgement (INIT ACK)\n// 3 - Selective Acknowledgement (SACK)\n// 4 - Heartbeat Request (HEARTBEAT)\n// 5 - Heartbeat Acknowledgement (HEARTBEAT ACK)\n// 6 - Abort (ABORT)\n// 7 - Shutdown (SHUTDOWN)\n// 8 - Shutdown Acknowledgement (SHUTDOWN ACK)\n// 9 - Operation Error (ERROR)\n// 10 - State Cookie (COOKIE ECHO)\n// 11 - Cookie Acknowledgement (COOKIE ACK)\n// 12 - Reserved for Explicit Congestion Notification Echo\n// (ECNE)\n// 13 - Reserved for Congestion Window Reduced (CWR)\n// 14 - Shutdown Complete (SHUTDOWN COMPLETE)\n// 15 to 62 - available\n// 63 - reserved for IETF-defined Chunk Extensions\n// 64 to 126 - available\n// 127 - reserved for IETF-defined Chunk Extensions\n// 128 to 190 - available\n// 191 - reserved for IETF-defined Chunk Extensions\n// 192 to 254 - available\n// 255 - reserved for IETF-defined Chunk Extensions\n\nimport crc32c from \"turbo-crc32/crc32c.js\";\n\nexport class Chunk {\n public get body(): Buffer | undefined {\n return this._body;\n }\n public set body(value: Buffer | undefined) {\n this._body = value;\n }\n static type = -1;\n\n constructor(\n public flags = 0,\n private _body: Buffer | undefined = Buffer.from(\"\"),\n ) {}\n\n get type() {\n return Chunk.type;\n }\n\n get bytes() {\n if (!this.body) throw new Error();\n\n const header = Buffer.alloc(4);\n header.writeUInt8(this.type, 0);\n header.writeUInt8(this.flags, 1);\n header.writeUInt16BE(this.body.length + 4, 2);\n\n const data = Buffer.concat([\n header,\n this.body,\n ...[...Array(padL(this.body.length))].map(() => Buffer.from(\"\\x00\")),\n ]);\n return data;\n }\n}\n\nexport class BaseInitChunk extends Chunk {\n initiateTag: number;\n advertisedRwnd: number;\n outboundStreams: number;\n inboundStreams: number;\n initialTsn: number;\n params: [number, Buffer][];\n\n constructor(\n public flags = 0,\n body?: Buffer,\n ) {\n super(flags, body);\n\n if (body) {\n this.initiateTag = body.readUInt32BE(0);\n this.advertisedRwnd = body.readUInt32BE(4);\n this.outboundStreams = body.readUInt16BE(8);\n this.inboundStreams = body.readUInt16BE(10);\n this.initialTsn = body.readUInt32BE(12);\n this.params = decodeParams(body.slice(16));\n } else {\n this.initiateTag = 0;\n this.advertisedRwnd = 0;\n this.outboundStreams = 0;\n this.inboundStreams = 0;\n this.initialTsn = 0;\n this.params = [];\n }\n }\n\n get body() {\n const body = Buffer.alloc(16);\n body.writeUInt32BE(this.initiateTag, 0);\n body.writeUInt32BE(this.advertisedRwnd, 4);\n body.writeUInt16BE(this.outboundStreams, 8);\n body.writeUInt16BE(this.inboundStreams, 10);\n body.writeUInt32BE(this.initialTsn, 12);\n return Buffer.concat([body, encodeParams(this.params)]);\n }\n}\n\nexport class InitChunk extends BaseInitChunk {\n static type = 1 as const;\n\n get type() {\n return InitChunk.type;\n }\n}\n\nexport class InitAckChunk extends BaseInitChunk {\n static type = 2 as const;\n\n get type() {\n return InitAckChunk.type;\n }\n}\n\nexport class ReConfigChunk extends BaseInitChunk {\n static type = 130 as const;\n\n get type() {\n return ReConfigChunk.type;\n }\n}\n\nexport class ForwardTsnChunk extends Chunk {\n static type = 192 as const;\n streams: [number, number][] = [];\n cumulativeTsn: number;\n\n constructor(\n public flags = 0,\n body: Buffer | undefined,\n ) {\n super(flags, body);\n\n if (body) {\n this.cumulativeTsn = body.readUInt32BE(0);\n let pos = 4;\n while (pos < body.length) {\n this.streams.push([body.readUInt16BE(pos), body.readUInt16BE(pos + 2)]);\n pos += 4;\n }\n } else {\n this.cumulativeTsn = 0;\n }\n }\n\n get type() {\n return ForwardTsnChunk.type;\n }\n\n set body(_: Buffer) {}\n\n get body() {\n const body = Buffer.alloc(4);\n body.writeUInt32BE(this.cumulativeTsn, 0);\n return Buffer.concat([\n body,\n ...this.streams.map(([id, seq]) => {\n const streamBuffer = Buffer.alloc(4);\n streamBuffer.writeUInt16BE(id, 0);\n streamBuffer.writeUInt16BE(seq, 2);\n return streamBuffer;\n }),\n ]);\n }\n}\n\nexport class DataChunk extends Chunk {\n static type = 0 as const;\n get type() {\n return DataChunk.type;\n }\n tsn: number = 0;\n streamId: number = 0;\n streamSeqNum: number = 0;\n protocol: number = 0;\n userData: Buffer = Buffer.from(\"\");\n abandoned: boolean = false;\n acked: boolean = false;\n misses: number = 0;\n retransmit: boolean = false;\n sentCount: number = 0;\n bookSize: number = 0;\n expiry?: number;\n maxRetransmits?: number;\n sentTime?: number;\n\n constructor(\n public flags = 0,\n body: Buffer | undefined,\n ) {\n super(flags, body);\n if (body) {\n this.tsn = body.readUInt32BE(0);\n this.streamId = body.readUInt16BE(4);\n this.streamSeqNum = body.readUInt16BE(6);\n this.protocol = body.readUInt32BE(8);\n this.userData = body.slice(12);\n }\n }\n\n get bytes() {\n const length = 16 + this.userData.length;\n const header = Buffer.alloc(16);\n header.writeUInt8(this.type, 0);\n header.writeUInt8(this.flags, 1);\n header.writeUInt16BE(length, 2);\n header.writeUInt32BE(this.tsn, 4);\n header.writeUInt16BE(this.streamId, 8);\n header.writeUInt16BE(this.streamSeqNum, 10);\n header.writeUInt32BE(this.protocol, 12);\n\n let data = Buffer.concat([header, this.userData]);\n if (length % 4) {\n data = Buffer.concat([\n data,\n ...[...Array(padL(length))].map(() => Buffer.from(\"\\x00\")),\n ]);\n }\n return data;\n }\n}\n\nexport class CookieEchoChunk extends Chunk {\n static type = 10 as const;\n\n get type() {\n return CookieEchoChunk.type;\n }\n}\n\nexport class CookieAckChunk extends Chunk {\n static type = 11 as const;\n\n get type() {\n return CookieAckChunk.type;\n }\n}\n\nexport class BaseParamsChunk extends Chunk {\n params: [number, Buffer][] = [];\n constructor(\n public flags = 0,\n body: Buffer | undefined = undefined,\n ) {\n super(flags, body);\n if (body) {\n this.params = decodeParams(body);\n }\n }\n\n get body() {\n return encodeParams(this.params);\n }\n}\n\nexport class AbortChunk extends BaseParamsChunk {\n static type = 6 as const;\n\n get type() {\n return AbortChunk.type;\n }\n}\n\nexport class ErrorChunk extends BaseParamsChunk {\n static type = 9 as const;\n static readonly CODE = {\n InvalidStreamIdentifier: 1,\n MissingMandatoryParameter: 2,\n StaleCookieError: 3,\n OutofResource: 4,\n UnresolvableAddress: 5,\n UnrecognizedChunkType: 6,\n InvalidMandatoryParameter: 7,\n UnrecognizedParameters: 8,\n NoUserData: 9,\n CookieReceivedWhileShuttingDown: 10,\n RestartofanAssociationwithNewAddresses: 11,\n UserInitiatedAbort: 12,\n ProtocolViolation: 13,\n } as const;\n\n get type() {\n return ErrorChunk.type;\n }\n\n get descriptions() {\n return this.params.map(([code, body]) => {\n const name = (Object.entries(ErrorChunk.CODE).find(\n ([, num]) => num === code,\n ) || [])[0];\n return { name, body };\n });\n }\n}\n\nexport class HeartbeatChunk extends BaseParamsChunk {\n static type = 4 as const;\n\n get type() {\n return HeartbeatChunk.type;\n }\n}\n\nexport class HeartbeatAckChunk extends BaseParamsChunk {\n static type = 5 as const;\n\n get type() {\n return HeartbeatAckChunk.type;\n }\n}\n\n// https://tools.ietf.org/html/rfc6525#section-3.1\n// chunkReconfig represents an SCTP Chunk used to reconfigure streams.\n//\n// 0 1 2 3\n// 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1\n// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\n// | Type = 130 | Chunk Flags | Chunk Length |\n// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\n// \\ \\\n// / Re-configuration Parameter /\n// \\ \\\n// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\n// \\ \\\n// / Re-configuration Parameter (optional) /\n// \\ \\\n// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\nexport class ReconfigChunk extends BaseParamsChunk {\n static type = 130 as const;\n\n get type() {\n return ReconfigChunk.type;\n }\n}\n\nexport class SackChunk extends Chunk {\n static type = 3;\n get type() {\n return SackChunk.type;\n }\n\n gaps: [number, number][] = [];\n duplicates: number[] = [];\n cumulativeTsn = 0;\n advertisedRwnd = 0;\n\n constructor(\n public flags = 0,\n body: Buffer | undefined,\n ) {\n super(flags, body);\n\n if (body) {\n this.cumulativeTsn = body.readUInt32BE(0);\n this.advertisedRwnd = body.readUInt32BE(4);\n const nbGaps = body.readUInt16BE(8);\n const nbDuplicates = body.readUInt16BE(10);\n\n let pos = 12;\n\n [...Array(nbGaps)].forEach(() => {\n this.gaps.push([body.readUInt16BE(pos), body.readUInt16BE(pos + 2)]);\n pos += 4;\n });\n\n [...Array(nbDuplicates)].forEach(() => {\n this.duplicates.push(body.readUInt32BE(pos));\n pos += 4;\n });\n }\n }\n\n get bytes() {\n const length = 16 + 4 * (this.gaps.length + this.duplicates.length);\n const header = Buffer.alloc(16);\n header.writeUInt8(this.type, 0);\n header.writeUInt8(this.flags, 1);\n header.writeUInt16BE(length, 2);\n header.writeUInt32BE(this.cumulativeTsn, 4);\n header.writeUInt32BE(this.advertisedRwnd, 8);\n header.writeUInt16BE(this.gaps.length, 12);\n header.writeUInt16BE(this.duplicates.length, 14);\n\n let data = Buffer.concat([\n header,\n ...this.gaps.map((gap) => {\n const gapBuffer = Buffer.alloc(4);\n gapBuffer.writeUInt16BE(gap[0], 0);\n gapBuffer.writeUInt16BE(gap[1], 2);\n return gapBuffer;\n }),\n ]);\n data = Buffer.concat([\n data,\n ...this.duplicates.map((tsn) => {\n const tsnBuffer = Buffer.alloc(4);\n tsnBuffer.writeUInt32BE(tsn, 0);\n return tsnBuffer;\n }),\n ]);\n return data;\n }\n}\n\nexport class ShutdownChunk extends Chunk {\n static type = 7;\n get type() {\n return ShutdownChunk.type;\n }\n\n cumulativeTsn = 0;\n\n constructor(\n public flags = 0,\n body: Buffer | undefined,\n ) {\n super(flags, body);\n\n if (body) {\n this.cumulativeTsn = body.readUInt32BE(0);\n }\n }\n\n get body() {\n const body = Buffer.alloc(4);\n body.writeUInt32BE(this.cumulativeTsn, 0);\n return body;\n }\n}\n\nexport class ShutdownAckChunk extends Chunk {\n static type = 8;\n get type() {\n return ShutdownAckChunk.type;\n }\n}\n\nexport class ShutdownCompleteChunk extends Chunk {\n static type = 14;\n get type() {\n return ShutdownCompleteChunk.type;\n }\n}\n\nconst CHUNK_CLASSES: (typeof Chunk)[] = [\n DataChunk,\n InitChunk,\n InitAckChunk,\n SackChunk,\n HeartbeatChunk,\n HeartbeatAckChunk,\n AbortChunk,\n ShutdownChunk,\n ShutdownAckChunk,\n ErrorChunk,\n CookieEchoChunk,\n CookieAckChunk,\n ShutdownCompleteChunk,\n ReconfigChunk,\n ForwardTsnChunk,\n];\n\nexport const CHUNK_BY_TYPE = CHUNK_CLASSES.reduce(\n (acc: { [key: string]: typeof Chunk }, cur) => {\n acc[cur.type] = cur;\n return acc;\n },\n {},\n);\n\nfunction padL(l: number) {\n const m = l % 4;\n return m ? 4 - m : 0;\n}\n\nfunction encodeParams(params: [number, Buffer][]) {\n let body = Buffer.from(\"\");\n let padding = Buffer.from(\"\");\n params.forEach(([type, value]) => {\n const length = value.length + 4;\n const paramHeader = Buffer.alloc(4);\n paramHeader.writeUInt16BE(type, 0);\n paramHeader.writeUInt16BE(length, 2);\n body = Buffer.concat([body, padding, paramHeader, value]);\n padding = Buffer.concat(\n [...Array(padL(length))].map(() => Buffer.from(\"\\x00\")),\n );\n });\n return body;\n}\n\nexport function decodeParams(body: Buffer): [number, Buffer][] {\n const params: [number, Buffer][] = [];\n let pos = 0;\n while (pos <= body.length - 4) {\n const type = body.readUInt16BE(pos);\n const length = body.readUInt16BE(pos + 2);\n params.push([type, body.slice(pos + 4, pos + length)]);\n pos += length + padL(length);\n }\n return params;\n}\n\nexport function parsePacket(data: Buffer): [number, number, number, Chunk[]] {\n if (data.length < 12)\n throw new Error(\"SCTP packet length is less than 12 bytes\");\n\n const sourcePort = data.readUInt16BE(0);\n const destinationPort = data.readUInt16BE(2);\n const verificationTag = data.readUInt32BE(4);\n\n const checkSum = data.readUInt32LE(8);\n\n const expect = crc32c(\n Buffer.concat([\n data.slice(0, 8),\n Buffer.from(\"\\x00\\x00\\x00\\x00\"),\n data.slice(12),\n ]),\n );\n\n if (checkSum !== expect) throw new Error(\"SCTP packet has invalid checksum\");\n\n const chunks: Chunk[] = [];\n let pos = 12;\n while (pos + 4 <= data.length) {\n const chunkType = data.readUInt8(pos);\n const chunkFlags = data.readUInt8(pos + 1);\n const chunkLength = data.readUInt16BE(pos + 2);\n const chunkBody = data.slice(pos + 4, pos + chunkLength);\n const ChunkClass = CHUNK_BY_TYPE[chunkType.toString()];\n if (ChunkClass) {\n chunks.push(new ChunkClass(chunkFlags, chunkBody));\n } else {\n throw new Error(\"unknown\");\n }\n pos += chunkLength + padL(chunkLength);\n }\n return [sourcePort, destinationPort, verificationTag, chunks];\n}\n\nexport function serializePacket(\n sourcePort: number,\n destinationPort: number,\n verificationTag: number,\n chunk: Chunk,\n) {\n const header = Buffer.alloc(8);\n header.writeUInt16BE(sourcePort, 0);\n header.writeUInt16BE(destinationPort, 2);\n header.writeUInt32BE(verificationTag, 4);\n\n const body = chunk.bytes;\n\n const checksum: number = crc32c(\n Buffer.concat([header, Buffer.from(\"\\x00\\x00\\x00\\x00\"), body]),\n );\n const checkSumBuf = Buffer.alloc(4);\n checkSumBuf.writeUInt32LE(checksum, 0);\n\n const packet = Buffer.concat([header, checkSumBuf, body]);\n\n return packet;\n}\n"]}
1
+ {"version":3,"file":"chunk.js","sourceRoot":"","sources":["../../../../sctp/src/chunk.ts"],"names":[],"mappings":"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","sourcesContent":["// ID Value Chunk Type\n// ----- ----------\n// 0 - Payload Data (DATA)\n// 1 - Initiation (INIT)\n// 2 - Initiation Acknowledgement (INIT ACK)\n// 3 - Selective Acknowledgement (SACK)\n// 4 - Heartbeat Request (HEARTBEAT)\n// 5 - Heartbeat Acknowledgement (HEARTBEAT ACK)\n// 6 - Abort (ABORT)\n// 7 - Shutdown (SHUTDOWN)\n// 8 - Shutdown Acknowledgement (SHUTDOWN ACK)\n// 9 - Operation Error (ERROR)\n// 10 - State Cookie (COOKIE ECHO)\n// 11 - Cookie Acknowledgement (COOKIE ACK)\n// 12 - Reserved for Explicit Congestion Notification Echo\n// (ECNE)\n// 13 - Reserved for Congestion Window Reduced (CWR)\n// 14 - Shutdown Complete (SHUTDOWN COMPLETE)\n// 15 to 62 - available\n// 63 - reserved for IETF-defined Chunk Extensions\n// 64 to 126 - available\n// 127 - reserved for IETF-defined Chunk Extensions\n// 128 to 190 - available\n// 191 - reserved for IETF-defined Chunk Extensions\n// 192 to 254 - available\n// 255 - reserved for IETF-defined Chunk Extensions\n\nimport { crc32c } from \"./imports/common\";\n\nexport class Chunk {\n public get body(): Buffer | undefined {\n return this._body;\n }\n public set body(value: Buffer | undefined) {\n this._body = value;\n }\n static type = -1;\n\n constructor(\n public flags = 0,\n private _body: Buffer | undefined = Buffer.from(\"\"),\n ) {}\n\n get type() {\n return Chunk.type;\n }\n\n get bytes() {\n if (!this.body) throw new Error();\n\n const header = Buffer.alloc(4);\n header.writeUInt8(this.type, 0);\n header.writeUInt8(this.flags, 1);\n header.writeUInt16BE(this.body.length + 4, 2);\n\n const data = Buffer.concat([\n header,\n this.body,\n ...[...Array(padL(this.body.length))].map(() => Buffer.from(\"\\x00\")),\n ]);\n return data;\n }\n}\n\nexport class BaseInitChunk extends Chunk {\n initiateTag: number;\n advertisedRwnd: number;\n outboundStreams: number;\n inboundStreams: number;\n initialTsn: number;\n params: [number, Buffer][];\n\n constructor(\n public flags = 0,\n body?: Buffer,\n ) {\n super(flags, body);\n\n if (body) {\n this.initiateTag = body.readUInt32BE(0);\n this.advertisedRwnd = body.readUInt32BE(4);\n this.outboundStreams = body.readUInt16BE(8);\n this.inboundStreams = body.readUInt16BE(10);\n this.initialTsn = body.readUInt32BE(12);\n this.params = decodeParams(body.slice(16));\n } else {\n this.initiateTag = 0;\n this.advertisedRwnd = 0;\n this.outboundStreams = 0;\n this.inboundStreams = 0;\n this.initialTsn = 0;\n this.params = [];\n }\n }\n\n get body() {\n const body = Buffer.alloc(16);\n body.writeUInt32BE(this.initiateTag, 0);\n body.writeUInt32BE(this.advertisedRwnd, 4);\n body.writeUInt16BE(this.outboundStreams, 8);\n body.writeUInt16BE(this.inboundStreams, 10);\n body.writeUInt32BE(this.initialTsn, 12);\n return Buffer.concat([body, encodeParams(this.params)]);\n }\n}\n\nexport class InitChunk extends BaseInitChunk {\n static type = 1 as const;\n\n get type() {\n return InitChunk.type;\n }\n}\n\nexport class InitAckChunk extends BaseInitChunk {\n static type = 2 as const;\n\n get type() {\n return InitAckChunk.type;\n }\n}\n\nexport class ReConfigChunk extends BaseInitChunk {\n static type = 130 as const;\n\n get type() {\n return ReConfigChunk.type;\n }\n}\n\nexport class ForwardTsnChunk extends Chunk {\n static type = 192 as const;\n streams: [number, number][] = [];\n cumulativeTsn: number;\n\n constructor(\n public flags = 0,\n body: Buffer | undefined,\n ) {\n super(flags, body);\n\n if (body) {\n this.cumulativeTsn = body.readUInt32BE(0);\n let pos = 4;\n while (pos < body.length) {\n this.streams.push([body.readUInt16BE(pos), body.readUInt16BE(pos + 2)]);\n pos += 4;\n }\n } else {\n this.cumulativeTsn = 0;\n }\n }\n\n get type() {\n return ForwardTsnChunk.type;\n }\n\n set body(_: Buffer) {}\n\n get body() {\n const body = Buffer.alloc(4);\n body.writeUInt32BE(this.cumulativeTsn, 0);\n return Buffer.concat([\n body,\n ...this.streams.map(([id, seq]) => {\n const streamBuffer = Buffer.alloc(4);\n streamBuffer.writeUInt16BE(id, 0);\n streamBuffer.writeUInt16BE(seq, 2);\n return streamBuffer;\n }),\n ]);\n }\n}\n\nexport class DataChunk extends Chunk {\n static type = 0 as const;\n get type() {\n return DataChunk.type;\n }\n tsn: number = 0;\n streamId: number = 0;\n streamSeqNum: number = 0;\n protocol: number = 0;\n userData: Buffer = Buffer.from(\"\");\n abandoned: boolean = false;\n acked: boolean = false;\n misses: number = 0;\n retransmit: boolean = false;\n sentCount: number = 0;\n bookSize: number = 0;\n expiry?: number;\n maxRetransmits?: number;\n sentTime?: number;\n\n constructor(\n public flags = 0,\n body: Buffer | undefined,\n ) {\n super(flags, body);\n if (body) {\n this.tsn = body.readUInt32BE(0);\n this.streamId = body.readUInt16BE(4);\n this.streamSeqNum = body.readUInt16BE(6);\n this.protocol = body.readUInt32BE(8);\n this.userData = body.slice(12);\n }\n }\n\n get bytes() {\n const length = 16 + this.userData.length;\n const header = Buffer.alloc(16);\n header.writeUInt8(this.type, 0);\n header.writeUInt8(this.flags, 1);\n header.writeUInt16BE(length, 2);\n header.writeUInt32BE(this.tsn, 4);\n header.writeUInt16BE(this.streamId, 8);\n header.writeUInt16BE(this.streamSeqNum, 10);\n header.writeUInt32BE(this.protocol, 12);\n\n let data = Buffer.concat([header, this.userData]);\n if (length % 4) {\n data = Buffer.concat([\n data,\n ...[...Array(padL(length))].map(() => Buffer.from(\"\\x00\")),\n ]);\n }\n return data;\n }\n}\n\nexport class CookieEchoChunk extends Chunk {\n static type = 10 as const;\n\n get type() {\n return CookieEchoChunk.type;\n }\n}\n\nexport class CookieAckChunk extends Chunk {\n static type = 11 as const;\n\n get type() {\n return CookieAckChunk.type;\n }\n}\n\nexport class BaseParamsChunk extends Chunk {\n params: [number, Buffer][] = [];\n constructor(\n public flags = 0,\n body: Buffer | undefined = undefined,\n ) {\n super(flags, body);\n if (body) {\n this.params = decodeParams(body);\n }\n }\n\n get body() {\n return encodeParams(this.params);\n }\n}\n\nexport class AbortChunk extends BaseParamsChunk {\n static type = 6 as const;\n\n get type() {\n return AbortChunk.type;\n }\n}\n\nexport class ErrorChunk extends BaseParamsChunk {\n static type = 9 as const;\n static readonly CODE = {\n InvalidStreamIdentifier: 1,\n MissingMandatoryParameter: 2,\n StaleCookieError: 3,\n OutofResource: 4,\n UnresolvableAddress: 5,\n UnrecognizedChunkType: 6,\n InvalidMandatoryParameter: 7,\n UnrecognizedParameters: 8,\n NoUserData: 9,\n CookieReceivedWhileShuttingDown: 10,\n RestartofanAssociationwithNewAddresses: 11,\n UserInitiatedAbort: 12,\n ProtocolViolation: 13,\n } as const;\n\n get type() {\n return ErrorChunk.type;\n }\n\n get descriptions() {\n return this.params.map(([code, body]) => {\n const name = (Object.entries(ErrorChunk.CODE).find(\n ([, num]) => num === code,\n ) || [])[0];\n return { name, body };\n });\n }\n}\n\nexport class HeartbeatChunk extends BaseParamsChunk {\n static type = 4 as const;\n\n get type() {\n return HeartbeatChunk.type;\n }\n}\n\nexport class HeartbeatAckChunk extends BaseParamsChunk {\n static type = 5 as const;\n\n get type() {\n return HeartbeatAckChunk.type;\n }\n}\n\n// https://tools.ietf.org/html/rfc6525#section-3.1\n// chunkReconfig represents an SCTP Chunk used to reconfigure streams.\n//\n// 0 1 2 3\n// 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1\n// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\n// | Type = 130 | Chunk Flags | Chunk Length |\n// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\n// \\ \\\n// / Re-configuration Parameter /\n// \\ \\\n// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\n// \\ \\\n// / Re-configuration Parameter (optional) /\n// \\ \\\n// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\nexport class ReconfigChunk extends BaseParamsChunk {\n static type = 130 as const;\n\n get type() {\n return ReconfigChunk.type;\n }\n}\n\nexport class SackChunk extends Chunk {\n static type = 3;\n get type() {\n return SackChunk.type;\n }\n\n gaps: [number, number][] = [];\n duplicates: number[] = [];\n cumulativeTsn = 0;\n advertisedRwnd = 0;\n\n constructor(\n public flags = 0,\n body: Buffer | undefined,\n ) {\n super(flags, body);\n\n if (body) {\n this.cumulativeTsn = body.readUInt32BE(0);\n this.advertisedRwnd = body.readUInt32BE(4);\n const nbGaps = body.readUInt16BE(8);\n const nbDuplicates = body.readUInt16BE(10);\n\n let pos = 12;\n\n [...Array(nbGaps)].forEach(() => {\n this.gaps.push([body.readUInt16BE(pos), body.readUInt16BE(pos + 2)]);\n pos += 4;\n });\n\n [...Array(nbDuplicates)].forEach(() => {\n this.duplicates.push(body.readUInt32BE(pos));\n pos += 4;\n });\n }\n }\n\n get bytes() {\n const length = 16 + 4 * (this.gaps.length + this.duplicates.length);\n const header = Buffer.alloc(16);\n header.writeUInt8(this.type, 0);\n header.writeUInt8(this.flags, 1);\n header.writeUInt16BE(length, 2);\n header.writeUInt32BE(this.cumulativeTsn, 4);\n header.writeUInt32BE(this.advertisedRwnd, 8);\n header.writeUInt16BE(this.gaps.length, 12);\n header.writeUInt16BE(this.duplicates.length, 14);\n\n let data = Buffer.concat([\n header,\n ...this.gaps.map((gap) => {\n const gapBuffer = Buffer.alloc(4);\n gapBuffer.writeUInt16BE(gap[0], 0);\n gapBuffer.writeUInt16BE(gap[1], 2);\n return gapBuffer;\n }),\n ]);\n data = Buffer.concat([\n data,\n ...this.duplicates.map((tsn) => {\n const tsnBuffer = Buffer.alloc(4);\n tsnBuffer.writeUInt32BE(tsn, 0);\n return tsnBuffer;\n }),\n ]);\n return data;\n }\n}\n\nexport class ShutdownChunk extends Chunk {\n static type = 7;\n get type() {\n return ShutdownChunk.type;\n }\n\n cumulativeTsn = 0;\n\n constructor(\n public flags = 0,\n body: Buffer | undefined,\n ) {\n super(flags, body);\n\n if (body) {\n this.cumulativeTsn = body.readUInt32BE(0);\n }\n }\n\n get body() {\n const body = Buffer.alloc(4);\n body.writeUInt32BE(this.cumulativeTsn, 0);\n return body;\n }\n}\n\nexport class ShutdownAckChunk extends Chunk {\n static type = 8;\n get type() {\n return ShutdownAckChunk.type;\n }\n}\n\nexport class ShutdownCompleteChunk extends Chunk {\n static type = 14;\n get type() {\n return ShutdownCompleteChunk.type;\n }\n}\n\nconst CHUNK_CLASSES: (typeof Chunk)[] = [\n DataChunk,\n InitChunk,\n InitAckChunk,\n SackChunk,\n HeartbeatChunk,\n HeartbeatAckChunk,\n AbortChunk,\n ShutdownChunk,\n ShutdownAckChunk,\n ErrorChunk,\n CookieEchoChunk,\n CookieAckChunk,\n ShutdownCompleteChunk,\n ReconfigChunk,\n ForwardTsnChunk,\n];\n\nexport const CHUNK_BY_TYPE = CHUNK_CLASSES.reduce(\n (acc: { [key: string]: typeof Chunk }, cur) => {\n acc[cur.type] = cur;\n return acc;\n },\n {},\n);\n\nfunction padL(l: number) {\n const m = l % 4;\n return m ? 4 - m : 0;\n}\n\nfunction encodeParams(params: [number, Buffer][]) {\n let body = Buffer.from(\"\");\n let padding = Buffer.from(\"\");\n params.forEach(([type, value]) => {\n const length = value.length + 4;\n const paramHeader = Buffer.alloc(4);\n paramHeader.writeUInt16BE(type, 0);\n paramHeader.writeUInt16BE(length, 2);\n body = Buffer.concat([body, padding, paramHeader, value]);\n padding = Buffer.concat(\n [...Array(padL(length))].map(() => Buffer.from(\"\\x00\")),\n );\n });\n return body;\n}\n\nexport function decodeParams(body: Buffer): [number, Buffer][] {\n const params: [number, Buffer][] = [];\n let pos = 0;\n while (pos <= body.length - 4) {\n const type = body.readUInt16BE(pos);\n const length = body.readUInt16BE(pos + 2);\n params.push([type, body.slice(pos + 4, pos + length)]);\n pos += length + padL(length);\n }\n return params;\n}\n\nexport function parsePacket(data: Buffer): [number, number, number, Chunk[]] {\n if (data.length < 12)\n throw new Error(\"SCTP packet length is less than 12 bytes\");\n\n const sourcePort = data.readUInt16BE(0);\n const destinationPort = data.readUInt16BE(2);\n const verificationTag = data.readUInt32BE(4);\n\n const checkSum = data.readUInt32LE(8);\n\n const expect = crc32c(\n Buffer.concat([\n data.slice(0, 8),\n Buffer.from(\"\\x00\\x00\\x00\\x00\"),\n data.slice(12),\n ]),\n );\n\n if (checkSum !== expect) throw new Error(\"SCTP packet has invalid checksum\");\n\n const chunks: Chunk[] = [];\n let pos = 12;\n while (pos + 4 <= data.length) {\n const chunkType = data.readUInt8(pos);\n const chunkFlags = data.readUInt8(pos + 1);\n const chunkLength = data.readUInt16BE(pos + 2);\n const chunkBody = data.slice(pos + 4, pos + chunkLength);\n const ChunkClass = CHUNK_BY_TYPE[chunkType.toString()];\n if (ChunkClass) {\n chunks.push(new ChunkClass(chunkFlags, chunkBody));\n } else {\n throw new Error(\"unknown\");\n }\n pos += chunkLength + padL(chunkLength);\n }\n return [sourcePort, destinationPort, verificationTag, chunks];\n}\n\nexport function serializePacket(\n sourcePort: number,\n destinationPort: number,\n verificationTag: number,\n chunk: Chunk,\n) {\n const header = Buffer.alloc(8);\n header.writeUInt16BE(sourcePort, 0);\n header.writeUInt16BE(destinationPort, 2);\n header.writeUInt32BE(verificationTag, 4);\n\n const body = chunk.bytes;\n\n const checksum: number = crc32c(\n Buffer.concat([header, Buffer.from(\"\\x00\\x00\\x00\\x00\"), body]),\n );\n const checkSumBuf = Buffer.alloc(4);\n checkSumBuf.writeUInt32LE(checksum, 0);\n\n const packet = Buffer.concat([header, checkSumBuf, body]);\n\n return packet;\n}\n"]}