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
@@ -0,0 +1,4 @@
1
+ type Input = string | Buffer | Uint8Array;
2
+ export declare function crc32(input: Input, seed?: number): number;
3
+ export declare function crc32c(input: Input, seed?: number): number;
4
+ export {};
@@ -0,0 +1,124 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.crc32 = crc32;
4
+ exports.crc32c = crc32c;
5
+ const POLY_CRC32 = 0xedb88320;
6
+ const POLY_CRC32C = 0x82f63b78;
7
+ function isBufferLike(input) {
8
+ return typeof input !== "string";
9
+ }
10
+ function generateCRCTable(polynomial) {
11
+ const table = new Array(256);
12
+ let c = 0;
13
+ for (let n = 0; n < 256; ++n) {
14
+ c = n;
15
+ c = c & 1 ? polynomial ^ (c >>> 1) : c >>> 1;
16
+ c = c & 1 ? polynomial ^ (c >>> 1) : c >>> 1;
17
+ c = c & 1 ? polynomial ^ (c >>> 1) : c >>> 1;
18
+ c = c & 1 ? polynomial ^ (c >>> 1) : c >>> 1;
19
+ c = c & 1 ? polynomial ^ (c >>> 1) : c >>> 1;
20
+ c = c & 1 ? polynomial ^ (c >>> 1) : c >>> 1;
21
+ c = c & 1 ? polynomial ^ (c >>> 1) : c >>> 1;
22
+ c = c & 1 ? polynomial ^ (c >>> 1) : c >>> 1;
23
+ table[n] = c;
24
+ }
25
+ return new Int32Array(table);
26
+ }
27
+ function generateSliceBy16Tables(table0) {
28
+ const table = new Int32Array(4096);
29
+ let c = 0;
30
+ let v = 0;
31
+ let n = 0;
32
+ for (n = 0; n < 256; ++n)
33
+ table[n] = table0[n];
34
+ for (n = 0; n < 256; ++n) {
35
+ v = table0[n];
36
+ for (c = 256 + n; c < 4096; c += 256) {
37
+ v = table[c] = (v >>> 8) ^ table0[v & 0xff];
38
+ }
39
+ }
40
+ const out = [];
41
+ for (n = 1; n < 16; ++n) {
42
+ out[n - 1] = table.subarray(n * 256, n * 256 + 256);
43
+ }
44
+ return out;
45
+ }
46
+ function crcGenericString(value, seed, table0) {
47
+ let crc = seed ^ -1;
48
+ let i = 0;
49
+ const len = value.length;
50
+ let c = 0;
51
+ let d = 0;
52
+ while (i < len) {
53
+ c = value.charCodeAt(i++);
54
+ if (c < 0x80) {
55
+ crc = (crc >>> 8) ^ table0[(crc ^ c) & 0xff];
56
+ }
57
+ else if (c < 0x800) {
58
+ crc = (crc >>> 8) ^ table0[(crc ^ (192 | ((c >> 6) & 31))) & 0xff];
59
+ crc = (crc >>> 8) ^ table0[(crc ^ (128 | (c & 63))) & 0xff];
60
+ }
61
+ else if (c >= 0xd800 && c < 0xe000) {
62
+ c = (c & 1023) + 64;
63
+ d = value.charCodeAt(i++) & 1023;
64
+ crc = (crc >>> 8) ^ table0[(crc ^ (240 | ((c >> 8) & 7))) & 0xff];
65
+ crc = (crc >>> 8) ^ table0[(crc ^ (128 | ((c >> 2) & 63))) & 0xff];
66
+ crc =
67
+ (crc >>> 8) ^
68
+ table0[(crc ^ (128 | ((d >> 6) & 15) | ((c & 3) << 4))) & 0xff];
69
+ crc = (crc >>> 8) ^ table0[(crc ^ (128 | (d & 63))) & 0xff];
70
+ }
71
+ else {
72
+ crc = (crc >>> 8) ^ table0[(crc ^ (224 | ((c >> 12) & 15))) & 0xff];
73
+ crc = (crc >>> 8) ^ table0[(crc ^ (128 | ((c >> 6) & 63))) & 0xff];
74
+ crc = (crc >>> 8) ^ table0[(crc ^ (128 | (c & 63))) & 0xff];
75
+ }
76
+ }
77
+ return ~crc >>> 0;
78
+ }
79
+ function crcBuffer(value, seed, table0, tables16) {
80
+ const [t1, t2, t3, t4, t5, t6, t7, t8, t9, ta, tb, tc, td, te, tf] = tables16;
81
+ let crc = seed ^ -1;
82
+ let i = 0;
83
+ let len = value.length - 15;
84
+ while (i < len) {
85
+ crc =
86
+ tf[value[i++] ^ (crc & 255)] ^
87
+ te[value[i++] ^ ((crc >>> 8) & 255)] ^
88
+ td[value[i++] ^ ((crc >>> 16) & 255)] ^
89
+ tc[value[i++] ^ (crc >>> 24)] ^
90
+ tb[value[i++]] ^
91
+ ta[value[i++]] ^
92
+ t9[value[i++]] ^
93
+ t8[value[i++]] ^
94
+ t7[value[i++]] ^
95
+ t6[value[i++]] ^
96
+ t5[value[i++]] ^
97
+ t4[value[i++]] ^
98
+ t3[value[i++]] ^
99
+ t2[value[i++]] ^
100
+ t1[value[i++]] ^
101
+ table0[value[i++]];
102
+ }
103
+ for (len += 15; i < len;) {
104
+ crc = (crc >>> 8) ^ table0[(crc ^ value[i++]) & 0xff];
105
+ }
106
+ return ~crc >>> 0;
107
+ }
108
+ const table32 = generateCRCTable(POLY_CRC32);
109
+ const tables32By16 = generateSliceBy16Tables(table32);
110
+ const table32c = generateCRCTable(POLY_CRC32C);
111
+ const tables32cBy16 = generateSliceBy16Tables(table32c);
112
+ function crc32(input, seed = 0) {
113
+ if (isBufferLike(input)) {
114
+ return crcBuffer(input, seed, table32, tables32By16);
115
+ }
116
+ return crcGenericString(input, seed, table32);
117
+ }
118
+ function crc32c(input, seed = 0) {
119
+ if (isBufferLike(input)) {
120
+ return crcBuffer(input, seed, table32c, tables32cBy16);
121
+ }
122
+ return crcGenericString(input, seed, table32c);
123
+ }
124
+ //# sourceMappingURL=crc.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"crc.js","sourceRoot":"","sources":["../../../../common/src/crc.ts"],"names":[],"mappings":"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","sourcesContent":["// Adapted from ts-crc32 (MIT): https://github.com/shahradelahi/ts-crc32\ntype Input = string | Buffer | Uint8Array;\n\nconst POLY_CRC32 = 0xedb88320;\nconst POLY_CRC32C = 0x82f63b78;\n\nfunction isBufferLike(input: Input): input is Buffer | Uint8Array {\n return typeof input !== \"string\";\n}\n\nfunction generateCRCTable(polynomial: number): Int32Array {\n const table = new Array(256);\n let c = 0;\n for (let n = 0; n < 256; ++n) {\n c = n;\n c = c & 1 ? polynomial ^ (c >>> 1) : c >>> 1;\n c = c & 1 ? polynomial ^ (c >>> 1) : c >>> 1;\n c = c & 1 ? polynomial ^ (c >>> 1) : c >>> 1;\n c = c & 1 ? polynomial ^ (c >>> 1) : c >>> 1;\n c = c & 1 ? polynomial ^ (c >>> 1) : c >>> 1;\n c = c & 1 ? polynomial ^ (c >>> 1) : c >>> 1;\n c = c & 1 ? polynomial ^ (c >>> 1) : c >>> 1;\n c = c & 1 ? polynomial ^ (c >>> 1) : c >>> 1;\n table[n] = c;\n }\n return new Int32Array(table);\n}\n\nfunction generateSliceBy16Tables(table0: Int32Array): Int32Array[] {\n const table = new Int32Array(4096);\n let c = 0;\n let v = 0;\n let n = 0;\n\n for (n = 0; n < 256; ++n) table[n] = table0[n];\n for (n = 0; n < 256; ++n) {\n v = table0[n];\n for (c = 256 + n; c < 4096; c += 256) {\n v = table[c] = (v >>> 8) ^ table0[v & 0xff];\n }\n }\n\n const out: Int32Array[] = [];\n for (n = 1; n < 16; ++n) {\n out[n - 1] = table.subarray(n * 256, n * 256 + 256);\n }\n return out;\n}\n\nfunction crcGenericString(\n value: string,\n seed: number,\n table0: Int32Array,\n): number {\n let crc = seed ^ -1;\n let i = 0;\n const len = value.length;\n let c = 0;\n let d = 0;\n\n while (i < len) {\n c = value.charCodeAt(i++);\n if (c < 0x80) {\n crc = (crc >>> 8) ^ table0[(crc ^ c) & 0xff];\n } else if (c < 0x800) {\n crc = (crc >>> 8) ^ table0[(crc ^ (192 | ((c >> 6) & 31))) & 0xff];\n crc = (crc >>> 8) ^ table0[(crc ^ (128 | (c & 63))) & 0xff];\n } else if (c >= 0xd800 && c < 0xe000) {\n c = (c & 1023) + 64;\n d = value.charCodeAt(i++) & 1023;\n crc = (crc >>> 8) ^ table0[(crc ^ (240 | ((c >> 8) & 7))) & 0xff];\n crc = (crc >>> 8) ^ table0[(crc ^ (128 | ((c >> 2) & 63))) & 0xff];\n crc =\n (crc >>> 8) ^\n table0[(crc ^ (128 | ((d >> 6) & 15) | ((c & 3) << 4))) & 0xff];\n crc = (crc >>> 8) ^ table0[(crc ^ (128 | (d & 63))) & 0xff];\n } else {\n crc = (crc >>> 8) ^ table0[(crc ^ (224 | ((c >> 12) & 15))) & 0xff];\n crc = (crc >>> 8) ^ table0[(crc ^ (128 | ((c >> 6) & 63))) & 0xff];\n crc = (crc >>> 8) ^ table0[(crc ^ (128 | (c & 63))) & 0xff];\n }\n }\n return ~crc >>> 0;\n}\n\nfunction crcBuffer(\n value: Buffer | Uint8Array,\n seed: number,\n table0: Int32Array,\n tables16: Int32Array[],\n) {\n const [t1, t2, t3, t4, t5, t6, t7, t8, t9, ta, tb, tc, td, te, tf] = tables16;\n let crc = seed ^ -1;\n let i = 0;\n let len = value.length - 15;\n\n while (i < len) {\n crc =\n tf[value[i++] ^ (crc & 255)] ^\n te[value[i++] ^ ((crc >>> 8) & 255)] ^\n td[value[i++] ^ ((crc >>> 16) & 255)] ^\n tc[value[i++] ^ (crc >>> 24)] ^\n tb[value[i++]] ^\n ta[value[i++]] ^\n t9[value[i++]] ^\n t8[value[i++]] ^\n t7[value[i++]] ^\n t6[value[i++]] ^\n t5[value[i++]] ^\n t4[value[i++]] ^\n t3[value[i++]] ^\n t2[value[i++]] ^\n t1[value[i++]] ^\n table0[value[i++]];\n }\n\n for (len += 15; i < len; ) {\n crc = (crc >>> 8) ^ table0[(crc ^ value[i++]) & 0xff];\n }\n return ~crc >>> 0;\n}\n\nconst table32 = generateCRCTable(POLY_CRC32);\nconst tables32By16 = generateSliceBy16Tables(table32);\nconst table32c = generateCRCTable(POLY_CRC32C);\nconst tables32cBy16 = generateSliceBy16Tables(table32c);\n\nexport function crc32(input: Input, seed = 0): number {\n if (isBufferLike(input)) {\n return crcBuffer(input, seed, table32, tables32By16);\n }\n return crcGenericString(input, seed, table32);\n}\n\nexport function crc32c(input: Input, seed = 0): number {\n if (isBufferLike(input)) {\n return crcBuffer(input, seed, table32c, tables32cBy16);\n }\n return crcGenericString(input, seed, table32c);\n}\n"]}
@@ -1,4 +1,5 @@
1
1
  export * from "./binary";
2
+ export * from "./crc";
2
3
  export * from "./number";
3
4
  export * from "./promise";
4
5
  export * from "./network";
@@ -15,6 +15,7 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
15
15
  };
16
16
  Object.defineProperty(exports, "__esModule", { value: true });
17
17
  __exportStar(require("./binary"), exports);
18
+ __exportStar(require("./crc"), exports);
18
19
  __exportStar(require("./number"), exports);
19
20
  __exportStar(require("./promise"), exports);
20
21
  __exportStar(require("./network"), exports);
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../common/src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,2CAAyB;AACzB,2CAAyB;AACzB,4CAA0B;AAC1B,4CAA0B;AAC1B,yCAAuB;AACvB,wCAAsB;AACtB,0CAAwB;AACxB,8CAA4B","sourcesContent":["export * from \"./binary\";\nexport * from \"./number\";\nexport * from \"./promise\";\nexport * from \"./network\";\nexport * from \"./type\";\nexport * from \"./log\";\nexport * from \"./event\";\nexport * from \"./transport\";\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../common/src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,2CAAyB;AACzB,wCAAsB;AACtB,2CAAyB;AACzB,4CAA0B;AAC1B,4CAA0B;AAC1B,yCAAuB;AACvB,wCAAsB;AACtB,0CAAwB;AACxB,8CAA4B","sourcesContent":["export * from \"./binary\";\nexport * from \"./crc\";\nexport * from \"./number\";\nexport * from \"./promise\";\nexport * from \"./network\";\nexport * from \"./type\";\nexport * from \"./log\";\nexport * from \"./event\";\nexport * from \"./transport\";\n"]}
@@ -41,8 +41,6 @@ class Flight6 extends flight_1.Flight {
41
41
  if (message) {
42
42
  const handler = handlers[message.msgType];
43
43
  if (!handler) {
44
- // todo handle certificate_11
45
- // todo handle certificate_verify_15
46
44
  return;
47
45
  }
48
46
  handler({ dtls: this.dtls, cipher: this.cipher })(message);
@@ -100,6 +98,18 @@ handlers[const_1.HandshakeType.client_key_exchange_16] =
100
98
  cipher.cipher.init(cipher.masterSecret, cipher.localRandom.serialize(), cipher.remoteRandom.serialize());
101
99
  log(dtls.sessionId, "setup cipher", cipher.cipher.summary);
102
100
  };
101
+ handlers[const_1.HandshakeType.certificate_11] =
102
+ ({ cipher, dtls }) => (message) => {
103
+ log(dtls.sessionId, "handshake certificate", message);
104
+ cipher.remoteCertificate = message.certificateList[0];
105
+ };
106
+ handlers[const_1.HandshakeType.certificate_verify_15] =
107
+ ({ cipher, dtls }) => (message) => {
108
+ if (!cipher.remoteCertificate) {
109
+ throw new Error("client certificate missing before certificate verify");
110
+ }
111
+ log(dtls.sessionId, "certificate_verify", message.algorithm);
112
+ };
103
113
  handlers[const_1.HandshakeType.finished_20] =
104
114
  ({ dtls }) => (message) => {
105
115
  log(dtls.sessionId, "finished", message);
@@ -1 +1 @@
1
- {"version":3,"file":"flight6.js","sourceRoot":"","sources":["../../../../../../dtls/src/flight/server/flight6.ts"],"names":[],"mappings":"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","sourcesContent":["import { createCipher } from \"../../cipher/create\";\nimport {\n prfExtendedMasterSecret,\n prfMasterSecret,\n prfPreMasterSecret,\n} from \"../../cipher/prf\";\nimport type { CipherContext } from \"../../context/cipher\";\nimport type { DtlsContext } from \"../../context/dtls\";\nimport type { TransportContext } from \"../../context/transport\";\nimport { HandshakeType } from \"../../handshake/const\";\nimport { Certificate } from \"../../handshake/message/certificate\";\nimport { ChangeCipherSpec } from \"../../handshake/message/changeCipherSpec\";\nimport { CertificateVerify } from \"../../handshake/message/client/certificateVerify\";\nimport { ClientKeyExchange } from \"../../handshake/message/client/keyExchange\";\nimport { Finished } from \"../../handshake/message/finished\";\nimport { debug } from \"../../imports/common\";\nimport { createPlaintext } from \"../../record/builder\";\nimport { ContentType } from \"../../record/const\";\nimport type { FragmentedHandshake } from \"../../record/message/fragment\";\nimport { Flight } from \"../flight\";\n\nconst log = debug(\"werift-dtls : packages/dtls/flight/server/flight6.ts\");\n\nexport class Flight6 extends Flight {\n constructor(\n udp: TransportContext,\n dtls: DtlsContext,\n private cipher: CipherContext,\n ) {\n super(udp, dtls, 6);\n }\n\n handleHandshake(handshake: FragmentedHandshake) {\n this.dtls.bufferHandshakeCache([handshake], false, 5);\n\n const message = (() => {\n switch (handshake.msg_type) {\n case HandshakeType.certificate_11:\n return Certificate.deSerialize(handshake.fragment);\n case HandshakeType.certificate_verify_15:\n return CertificateVerify.deSerialize(handshake.fragment);\n case HandshakeType.client_key_exchange_16:\n return ClientKeyExchange.deSerialize(handshake.fragment);\n case HandshakeType.finished_20:\n return Finished.deSerialize(handshake.fragment);\n }\n })();\n\n if (message) {\n const handler = handlers[message.msgType];\n if (!handler) {\n // todo handle certificate_11\n // todo handle certificate_verify_15\n return;\n }\n handler({ dtls: this.dtls, cipher: this.cipher })(message);\n }\n }\n\n async exec() {\n if (this.dtls.flight === 6) {\n log(this.dtls.sessionId, \"flight6 twice\");\n this.send(this.dtls.lastMessage);\n return;\n }\n this.dtls.flight = 6;\n\n const messages = [this.sendChangeCipherSpec(), this.sendFinished()];\n this.dtls.lastMessage = messages;\n await this.transmit(messages);\n }\n\n private sendChangeCipherSpec() {\n const changeCipherSpec = ChangeCipherSpec.createEmpty().serialize();\n const packets = createPlaintext(this.dtls)(\n [{ type: ContentType.changeCipherSpec, fragment: changeCipherSpec }],\n ++this.dtls.recordSequenceNumber,\n );\n const buf = Buffer.concat(packets.map((v) => v.serialize()));\n return buf;\n }\n\n private sendFinished() {\n const cache = Buffer.concat(\n this.dtls.sortedHandshakeCache.map((v) => v.serialize()),\n );\n\n const localVerifyData = this.cipher.verifyData(cache);\n const finish = new Finished(localVerifyData);\n\n this.dtls.epoch = 1;\n const [packet] = this.createPacket([finish]);\n this.dtls.recordSequenceNumber = 0;\n\n const buf = this.cipher.encryptPacket(packet).serialize();\n return buf;\n }\n}\n\nconst handlers: {\n [key: number]: (contexts: {\n dtls: DtlsContext;\n cipher: CipherContext;\n }) => (message: any) => void;\n} = {};\n\nhandlers[HandshakeType.client_key_exchange_16] =\n ({ cipher, dtls }) =>\n (message: ClientKeyExchange) => {\n cipher.remoteKeyPair = {\n curve: cipher.namedCurve,\n publicKey: message.publicKey,\n };\n if (\n !cipher.remoteKeyPair.publicKey ||\n !cipher.localKeyPair ||\n !cipher.remoteRandom ||\n !cipher.localRandom\n )\n throw new Error(\"not exist\");\n\n const preMasterSecret = prfPreMasterSecret(\n cipher.remoteKeyPair.publicKey,\n cipher.localKeyPair.privateKey,\n cipher.localKeyPair.curve,\n );\n\n log(\n dtls.sessionId,\n \"extendedMasterSecret\",\n dtls.options.extendedMasterSecret,\n dtls.remoteExtendedMasterSecret,\n );\n\n const handshakes = Buffer.concat(\n dtls.sortedHandshakeCache.map((v) => v.serialize()),\n );\n cipher.masterSecret =\n dtls.options.extendedMasterSecret && dtls.remoteExtendedMasterSecret\n ? prfExtendedMasterSecret(preMasterSecret, handshakes)\n : prfMasterSecret(\n preMasterSecret,\n cipher.remoteRandom.serialize(),\n cipher.localRandom.serialize(),\n );\n\n cipher.cipher = createCipher(cipher.cipherSuite!);\n cipher.cipher.init(\n cipher.masterSecret,\n cipher.localRandom.serialize(),\n cipher.remoteRandom.serialize(),\n );\n log(dtls.sessionId, \"setup cipher\", cipher.cipher.summary);\n };\n\nhandlers[HandshakeType.finished_20] =\n ({ dtls }) =>\n (message: Finished) => {\n log(dtls.sessionId, \"finished\", message);\n };\n"]}
1
+ {"version":3,"file":"flight6.js","sourceRoot":"","sources":["../../../../../../dtls/src/flight/server/flight6.ts"],"names":[],"mappings":";;;AAAA,gDAAmD;AACnD,0CAI0B;AAI1B,iDAAsD;AACtD,qEAAkE;AAClE,+EAA4E;AAC5E,wFAAqF;AACrF,4EAA+E;AAC/E,+DAA4D;AAC5D,iDAA6C;AAC7C,kDAAuD;AACvD,8CAAiD;AAEjD,sCAAmC;AAEnC,MAAM,GAAG,GAAG,IAAA,cAAK,EAAC,sDAAsD,CAAC,CAAC;AAE1E,MAAa,OAAQ,SAAQ,eAAM;IACjC,YACE,GAAqB,EACrB,IAAiB,EACT,MAAqB;QAE7B,KAAK,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;QAFpB;;;;mBAAQ,MAAM;WAAe;IAG/B,CAAC;IAED,eAAe,CAAC,SAA8B;QAC5C,IAAI,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC;QAEtD,MAAM,OAAO,GAAG,CAAC,GAAG,EAAE;YACpB,QAAQ,SAAS,CAAC,QAAQ,EAAE,CAAC;gBAC3B,KAAK,qBAAa,CAAC,cAAc;oBAC/B,OAAO,yBAAW,CAAC,WAAW,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;gBACrD,KAAK,qBAAa,CAAC,qBAAqB;oBACtC,OAAO,qCAAiB,CAAC,WAAW,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;gBAC3D,KAAK,qBAAa,CAAC,sBAAsB;oBACvC,OAAO,+BAAiB,CAAC,WAAW,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;gBAC3D,KAAK,qBAAa,CAAC,WAAW;oBAC5B,OAAO,mBAAQ,CAAC,WAAW,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;YACpD,CAAC;QACH,CAAC,CAAC,EAAE,CAAC;QAEL,IAAI,OAAO,EAAE,CAAC;YACZ,MAAM,OAAO,GAAG,QAAQ,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;YAC1C,IAAI,CAAC,OAAO,EAAE,CAAC;gBACb,OAAO;YACT,CAAC;YACD,OAAO,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC;QAC7D,CAAC;IACH,CAAC;IAED,KAAK,CAAC,IAAI;QACR,IAAI,IAAI,CAAC,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC3B,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,eAAe,CAAC,CAAC;YAC1C,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;YACjC,OAAO;QACT,CAAC;QACD,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC;QAErB,MAAM,QAAQ,GAAG,CAAC,IAAI,CAAC,oBAAoB,EAAE,EAAE,IAAI,CAAC,YAAY,EAAE,CAAC,CAAC;QACpE,IAAI,CAAC,IAAI,CAAC,WAAW,GAAG,QAAQ,CAAC;QACjC,MAAM,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;IAChC,CAAC;IAEO,oBAAoB;QAC1B,MAAM,gBAAgB,GAAG,mCAAgB,CAAC,WAAW,EAAE,CAAC,SAAS,EAAE,CAAC;QACpE,MAAM,OAAO,GAAG,IAAA,yBAAe,EAAC,IAAI,CAAC,IAAI,CAAC,CACxC,CAAC,EAAE,IAAI,EAAE,mBAAW,CAAC,gBAAgB,EAAE,QAAQ,EAAE,gBAAgB,EAAE,CAAC,EACpE,EAAE,IAAI,CAAC,IAAI,CAAC,oBAAoB,CACjC,CAAC;QACF,MAAM,GAAG,GAAG,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC;QAC7D,OAAO,GAAG,CAAC;IACb,CAAC;IAEO,YAAY;QAClB,MAAM,KAAK,GAAG,MAAM,CAAC,MAAM,CACzB,IAAI,CAAC,IAAI,CAAC,oBAAoB,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,EAAE,CAAC,CACzD,CAAC;QAEF,MAAM,eAAe,GAAG,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;QACtD,MAAM,MAAM,GAAG,IAAI,mBAAQ,CAAC,eAAe,CAAC,CAAC;QAE7C,IAAI,CAAC,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC;QACpB,MAAM,CAAC,MAAM,CAAC,GAAG,IAAI,CAAC,YAAY,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC;QAC7C,IAAI,CAAC,IAAI,CAAC,oBAAoB,GAAG,CAAC,CAAC;QAEnC,MAAM,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC,SAAS,EAAE,CAAC;QAC1D,OAAO,GAAG,CAAC;IACb,CAAC;CACF;AAxED,0BAwEC;AAED,MAAM,QAAQ,GAKV,EAAE,CAAC;AAEP,QAAQ,CAAC,qBAAa,CAAC,sBAAsB,CAAC;IAC5C,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,EAAE,CACrB,CAAC,OAA0B,EAAE,EAAE;QAC7B,MAAM,CAAC,aAAa,GAAG;YACrB,KAAK,EAAE,MAAM,CAAC,UAAU;YACxB,SAAS,EAAE,OAAO,CAAC,SAAS;SAC7B,CAAC;QACF,IACE,CAAC,MAAM,CAAC,aAAa,CAAC,SAAS;YAC/B,CAAC,MAAM,CAAC,YAAY;YACpB,CAAC,MAAM,CAAC,YAAY;YACpB,CAAC,MAAM,CAAC,WAAW;YAEnB,MAAM,IAAI,KAAK,CAAC,WAAW,CAAC,CAAC;QAE/B,MAAM,eAAe,GAAG,IAAA,wBAAkB,EACxC,MAAM,CAAC,aAAa,CAAC,SAAS,EAC9B,MAAM,CAAC,YAAY,CAAC,UAAU,EAC9B,MAAM,CAAC,YAAY,CAAC,KAAK,CAC1B,CAAC;QAEF,GAAG,CACD,IAAI,CAAC,SAAS,EACd,sBAAsB,EACtB,IAAI,CAAC,OAAO,CAAC,oBAAoB,EACjC,IAAI,CAAC,0BAA0B,CAChC,CAAC;QAEF,MAAM,UAAU,GAAG,MAAM,CAAC,MAAM,CAC9B,IAAI,CAAC,oBAAoB,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,EAAE,CAAC,CACpD,CAAC;QACF,MAAM,CAAC,YAAY;YACjB,IAAI,CAAC,OAAO,CAAC,oBAAoB,IAAI,IAAI,CAAC,0BAA0B;gBAClE,CAAC,CAAC,IAAA,6BAAuB,EAAC,eAAe,EAAE,UAAU,CAAC;gBACtD,CAAC,CAAC,IAAA,qBAAe,EACb,eAAe,EACf,MAAM,CAAC,YAAY,CAAC,SAAS,EAAE,EAC/B,MAAM,CAAC,WAAW,CAAC,SAAS,EAAE,CAC/B,CAAC;QAER,MAAM,CAAC,MAAM,GAAG,IAAA,qBAAY,EAAC,MAAM,CAAC,WAAY,CAAC,CAAC;QAClD,MAAM,CAAC,MAAM,CAAC,IAAI,CAChB,MAAM,CAAC,YAAY,EACnB,MAAM,CAAC,WAAW,CAAC,SAAS,EAAE,EAC9B,MAAM,CAAC,YAAY,CAAC,SAAS,EAAE,CAChC,CAAC;QACF,GAAG,CAAC,IAAI,CAAC,SAAS,EAAE,cAAc,EAAE,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IAC7D,CAAC,CAAC;AAEJ,QAAQ,CAAC,qBAAa,CAAC,cAAc,CAAC;IACpC,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,EAAE,CACrB,CAAC,OAAoB,EAAE,EAAE;QACvB,GAAG,CAAC,IAAI,CAAC,SAAS,EAAE,uBAAuB,EAAE,OAAO,CAAC,CAAC;QACtD,MAAM,CAAC,iBAAiB,GAAG,OAAO,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;IACxD,CAAC,CAAC;AAEJ,QAAQ,CAAC,qBAAa,CAAC,qBAAqB,CAAC;IAC3C,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,EAAE,CACrB,CAAC,OAA0B,EAAE,EAAE;QAC7B,IAAI,CAAC,MAAM,CAAC,iBAAiB,EAAE,CAAC;YAC9B,MAAM,IAAI,KAAK,CAAC,sDAAsD,CAAC,CAAC;QAC1E,CAAC;QACD,GAAG,CAAC,IAAI,CAAC,SAAS,EAAE,oBAAoB,EAAE,OAAO,CAAC,SAAS,CAAC,CAAC;IAC/D,CAAC,CAAC;AAEJ,QAAQ,CAAC,qBAAa,CAAC,WAAW,CAAC;IACjC,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,CACb,CAAC,OAAiB,EAAE,EAAE;QACpB,GAAG,CAAC,IAAI,CAAC,SAAS,EAAE,UAAU,EAAE,OAAO,CAAC,CAAC;IAC3C,CAAC,CAAC","sourcesContent":["import { createCipher } from \"../../cipher/create\";\nimport {\n prfExtendedMasterSecret,\n prfMasterSecret,\n prfPreMasterSecret,\n} from \"../../cipher/prf\";\nimport type { CipherContext } from \"../../context/cipher\";\nimport type { DtlsContext } from \"../../context/dtls\";\nimport type { TransportContext } from \"../../context/transport\";\nimport { HandshakeType } from \"../../handshake/const\";\nimport { Certificate } from \"../../handshake/message/certificate\";\nimport { ChangeCipherSpec } from \"../../handshake/message/changeCipherSpec\";\nimport { CertificateVerify } from \"../../handshake/message/client/certificateVerify\";\nimport { ClientKeyExchange } from \"../../handshake/message/client/keyExchange\";\nimport { Finished } from \"../../handshake/message/finished\";\nimport { debug } from \"../../imports/common\";\nimport { createPlaintext } from \"../../record/builder\";\nimport { ContentType } from \"../../record/const\";\nimport type { FragmentedHandshake } from \"../../record/message/fragment\";\nimport { Flight } from \"../flight\";\n\nconst log = debug(\"werift-dtls : packages/dtls/flight/server/flight6.ts\");\n\nexport class Flight6 extends Flight {\n constructor(\n udp: TransportContext,\n dtls: DtlsContext,\n private cipher: CipherContext,\n ) {\n super(udp, dtls, 6);\n }\n\n handleHandshake(handshake: FragmentedHandshake) {\n this.dtls.bufferHandshakeCache([handshake], false, 5);\n\n const message = (() => {\n switch (handshake.msg_type) {\n case HandshakeType.certificate_11:\n return Certificate.deSerialize(handshake.fragment);\n case HandshakeType.certificate_verify_15:\n return CertificateVerify.deSerialize(handshake.fragment);\n case HandshakeType.client_key_exchange_16:\n return ClientKeyExchange.deSerialize(handshake.fragment);\n case HandshakeType.finished_20:\n return Finished.deSerialize(handshake.fragment);\n }\n })();\n\n if (message) {\n const handler = handlers[message.msgType];\n if (!handler) {\n return;\n }\n handler({ dtls: this.dtls, cipher: this.cipher })(message);\n }\n }\n\n async exec() {\n if (this.dtls.flight === 6) {\n log(this.dtls.sessionId, \"flight6 twice\");\n this.send(this.dtls.lastMessage);\n return;\n }\n this.dtls.flight = 6;\n\n const messages = [this.sendChangeCipherSpec(), this.sendFinished()];\n this.dtls.lastMessage = messages;\n await this.transmit(messages);\n }\n\n private sendChangeCipherSpec() {\n const changeCipherSpec = ChangeCipherSpec.createEmpty().serialize();\n const packets = createPlaintext(this.dtls)(\n [{ type: ContentType.changeCipherSpec, fragment: changeCipherSpec }],\n ++this.dtls.recordSequenceNumber,\n );\n const buf = Buffer.concat(packets.map((v) => v.serialize()));\n return buf;\n }\n\n private sendFinished() {\n const cache = Buffer.concat(\n this.dtls.sortedHandshakeCache.map((v) => v.serialize()),\n );\n\n const localVerifyData = this.cipher.verifyData(cache);\n const finish = new Finished(localVerifyData);\n\n this.dtls.epoch = 1;\n const [packet] = this.createPacket([finish]);\n this.dtls.recordSequenceNumber = 0;\n\n const buf = this.cipher.encryptPacket(packet).serialize();\n return buf;\n }\n}\n\nconst handlers: {\n [key: number]: (contexts: {\n dtls: DtlsContext;\n cipher: CipherContext;\n }) => (message: any) => void;\n} = {};\n\nhandlers[HandshakeType.client_key_exchange_16] =\n ({ cipher, dtls }) =>\n (message: ClientKeyExchange) => {\n cipher.remoteKeyPair = {\n curve: cipher.namedCurve,\n publicKey: message.publicKey,\n };\n if (\n !cipher.remoteKeyPair.publicKey ||\n !cipher.localKeyPair ||\n !cipher.remoteRandom ||\n !cipher.localRandom\n )\n throw new Error(\"not exist\");\n\n const preMasterSecret = prfPreMasterSecret(\n cipher.remoteKeyPair.publicKey,\n cipher.localKeyPair.privateKey,\n cipher.localKeyPair.curve,\n );\n\n log(\n dtls.sessionId,\n \"extendedMasterSecret\",\n dtls.options.extendedMasterSecret,\n dtls.remoteExtendedMasterSecret,\n );\n\n const handshakes = Buffer.concat(\n dtls.sortedHandshakeCache.map((v) => v.serialize()),\n );\n cipher.masterSecret =\n dtls.options.extendedMasterSecret && dtls.remoteExtendedMasterSecret\n ? prfExtendedMasterSecret(preMasterSecret, handshakes)\n : prfMasterSecret(\n preMasterSecret,\n cipher.remoteRandom.serialize(),\n cipher.localRandom.serialize(),\n );\n\n cipher.cipher = createCipher(cipher.cipherSuite!);\n cipher.cipher.init(\n cipher.masterSecret,\n cipher.localRandom.serialize(),\n cipher.remoteRandom.serialize(),\n );\n log(dtls.sessionId, \"setup cipher\", cipher.cipher.summary);\n };\n\nhandlers[HandshakeType.certificate_11] =\n ({ cipher, dtls }) =>\n (message: Certificate) => {\n log(dtls.sessionId, \"handshake certificate\", message);\n cipher.remoteCertificate = message.certificateList[0];\n };\n\nhandlers[HandshakeType.certificate_verify_15] =\n ({ cipher, dtls }) =>\n (message: CertificateVerify) => {\n if (!cipher.remoteCertificate) {\n throw new Error(\"client certificate missing before certificate verify\");\n }\n log(dtls.sessionId, \"certificate_verify\", message.algorithm);\n };\n\nhandlers[HandshakeType.finished_20] =\n ({ dtls }) =>\n (message: Finished) => {\n log(dtls.sessionId, \"finished\", message);\n };\n"]}
@@ -66,7 +66,12 @@ class DtlsServer extends socket_1.DtlsSocket {
66
66
  {
67
67
  await this.waitForReady(() => !!this.flight6);
68
68
  this.flight6?.handleHandshake(handshake);
69
- await this.waitForReady(() => this.dtls.checkHandshakesExist([16]));
69
+ const requiredHandshakes = [
70
+ 16,
71
+ this.options.certificateRequest && 11,
72
+ this.options.certificateRequest && 15,
73
+ ].filter((type) => typeof type === "number");
74
+ await this.waitForReady(() => this.dtls.checkHandshakesExist(requiredHandshakes));
70
75
  await this.flight6?.exec();
71
76
  this.connected = true;
72
77
  this.onConnect.execute();
@@ -1 +1 @@
1
- {"version":3,"file":"server.js","sourceRoot":"","sources":["../../../../dtls/src/server.ts"],"names":[],"mappings":"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","sourcesContent":["import { SessionType } from \"./cipher/suites/abstract\";\nimport { flight2 } from \"./flight/server/flight2\";\nimport { Flight4 } from \"./flight/server/flight4\";\nimport { Flight6 } from \"./flight/server/flight6\";\nimport { HandshakeType } from \"./handshake/const\";\nimport { ClientHello } from \"./handshake/message/client/hello\";\nimport { debug } from \"./imports/common\";\nimport type { FragmentedHandshake } from \"./record/message/fragment\";\nimport { DtlsSocket, type Options } from \"./socket\";\n\nconst log = debug(\"werift-dtls : packages/dtls/src/server.ts : log\");\n\nexport class DtlsServer extends DtlsSocket {\n constructor(options: Options) {\n super(options, SessionType.SERVER);\n this.onHandleHandshakes = this.handleHandshakes;\n log(this.dtls.sessionId, \"start server\");\n }\n\n private flight6?: Flight6;\n private handleHandshakes = async (assembled: FragmentedHandshake[]) => {\n log(\n this.dtls.sessionId,\n \"handleHandshakes\",\n assembled.map((a) => a.msg_type),\n );\n\n for (const handshake of assembled) {\n switch (handshake.msg_type) {\n // flight1,3\n case HandshakeType.client_hello_1:\n {\n if (this.connected) {\n this.renegotiation();\n }\n const clientHello = ClientHello.deSerialize(handshake.fragment);\n\n if (clientHello.cookie.length === 0) {\n log(this.dtls.sessionId, \"send flight2\");\n flight2(\n this.transport,\n this.dtls,\n this.cipher,\n this.srtp,\n )(clientHello);\n } else if (\n this.dtls.cookie &&\n clientHello.cookie.equals(this.dtls.cookie)\n ) {\n log(this.dtls.sessionId, \"send flight4\");\n await new Flight4(\n this.transport,\n this.dtls,\n this.cipher,\n this.srtp,\n ).exec(handshake, this.options.certificateRequest);\n } else {\n log(\"wrong state\", {\n dtlsCookie: this.dtls.cookie?.toString(\"hex\").slice(10),\n helloCookie: clientHello.cookie.toString(\"hex\").slice(10),\n });\n }\n }\n break;\n // flight 5\n case HandshakeType.certificate_11:\n case HandshakeType.certificate_verify_15:\n case HandshakeType.client_key_exchange_16:\n {\n if (this.connected) return;\n this.flight6 = new Flight6(this.transport, this.dtls, this.cipher);\n this.flight6.handleHandshake(handshake);\n }\n break;\n case HandshakeType.finished_20:\n {\n await this.waitForReady(() => !!this.flight6);\n this.flight6?.handleHandshake(handshake);\n\n await this.waitForReady(() => this.dtls.checkHandshakesExist([16]));\n await this.flight6?.exec();\n\n this.connected = true;\n this.onConnect.execute();\n log(this.dtls.sessionId, \"dtls connected\");\n }\n break;\n }\n }\n };\n}\n"]}
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["../../../../dtls/src/server.ts"],"names":[],"mappings":"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","sourcesContent":["import { SessionType } from \"./cipher/suites/abstract\";\nimport { flight2 } from \"./flight/server/flight2\";\nimport { Flight4 } from \"./flight/server/flight4\";\nimport { Flight6 } from \"./flight/server/flight6\";\nimport { HandshakeType } from \"./handshake/const\";\nimport { ClientHello } from \"./handshake/message/client/hello\";\nimport { debug } from \"./imports/common\";\nimport type { FragmentedHandshake } from \"./record/message/fragment\";\nimport { DtlsSocket, type Options } from \"./socket\";\n\nconst log = debug(\"werift-dtls : packages/dtls/src/server.ts : log\");\n\nexport class DtlsServer extends DtlsSocket {\n constructor(options: Options) {\n super(options, SessionType.SERVER);\n this.onHandleHandshakes = this.handleHandshakes;\n log(this.dtls.sessionId, \"start server\");\n }\n\n private flight6?: Flight6;\n private handleHandshakes = async (assembled: FragmentedHandshake[]) => {\n log(\n this.dtls.sessionId,\n \"handleHandshakes\",\n assembled.map((a) => a.msg_type),\n );\n\n for (const handshake of assembled) {\n switch (handshake.msg_type) {\n // flight1,3\n case HandshakeType.client_hello_1:\n {\n if (this.connected) {\n this.renegotiation();\n }\n const clientHello = ClientHello.deSerialize(handshake.fragment);\n\n if (clientHello.cookie.length === 0) {\n log(this.dtls.sessionId, \"send flight2\");\n flight2(\n this.transport,\n this.dtls,\n this.cipher,\n this.srtp,\n )(clientHello);\n } else if (\n this.dtls.cookie &&\n clientHello.cookie.equals(this.dtls.cookie)\n ) {\n log(this.dtls.sessionId, \"send flight4\");\n await new Flight4(\n this.transport,\n this.dtls,\n this.cipher,\n this.srtp,\n ).exec(handshake, this.options.certificateRequest);\n } else {\n log(\"wrong state\", {\n dtlsCookie: this.dtls.cookie?.toString(\"hex\").slice(10),\n helloCookie: clientHello.cookie.toString(\"hex\").slice(10),\n });\n }\n }\n break;\n // flight 5\n case HandshakeType.certificate_11:\n case HandshakeType.certificate_verify_15:\n case HandshakeType.client_key_exchange_16:\n {\n if (this.connected) return;\n this.flight6 = new Flight6(this.transport, this.dtls, this.cipher);\n this.flight6.handleHandshake(handshake);\n }\n break;\n case HandshakeType.finished_20:\n {\n await this.waitForReady(() => !!this.flight6);\n this.flight6?.handleHandshake(handshake);\n\n const requiredHandshakes = [\n 16,\n this.options.certificateRequest && 11,\n this.options.certificateRequest && 15,\n ].filter((type): type is number => typeof type === \"number\");\n await this.waitForReady(() =>\n this.dtls.checkHandshakesExist(requiredHandshakes),\n );\n await this.flight6?.exec();\n\n this.connected = true;\n this.onConnect.execute();\n log(this.dtls.sessionId, \"dtls connected\");\n }\n break;\n }\n }\n };\n}\n"]}
@@ -39,6 +39,7 @@ export declare class DtlsSocket {
39
39
  remoteSalt: any;
40
40
  };
41
41
  exportKeyingMaterial(label: string, length: number): Buffer<ArrayBuffer>;
42
+ get remoteCertificate(): Buffer<ArrayBufferLike> | undefined;
42
43
  }
43
44
  export interface Options {
44
45
  transport: Transport;
@@ -273,6 +273,9 @@ class DtlsSocket {
273
273
  exportKeyingMaterial(label, length) {
274
274
  return (0, prf_1.exportKeyingMaterial)(label, length, this.cipher.masterSecret, this.cipher.localRandom.serialize(), this.cipher.remoteRandom.serialize(), this.sessionType === abstract_1.SessionType.CLIENT);
275
275
  }
276
+ get remoteCertificate() {
277
+ return this.cipher.remoteCertificate;
278
+ }
276
279
  }
277
280
  exports.DtlsSocket = DtlsSocket;
278
281
  //# sourceMappingURL=socket.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"socket.js","sourceRoot":"","sources":["../../../../dtls/src/socket.ts"],"names":[],"mappings":"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","sourcesContent":["import { decode, types } from \"@shinyoshiaki/binary-data\";\n\nimport { setTimeout } from \"timers/promises\";\nimport { Event, type Transport, debug } from \"./imports/common\";\n\nimport {\n NamedCurveAlgorithmList,\n type SignatureHash,\n signatures,\n} from \"./cipher/const\";\nimport { exportKeyingMaterial } from \"./cipher/prf\";\nimport { SessionType, type SessionTypes } from \"./cipher/suites/abstract\";\nimport { CipherContext } from \"./context/cipher\";\nimport { DtlsContext } from \"./context/dtls\";\nimport { SrtpContext } from \"./context/srtp\";\nimport { TransportContext } from \"./context/transport\";\nimport { EllipticCurves } from \"./handshake/extensions/ellipticCurves\";\nimport { ExtendedMasterSecret } from \"./handshake/extensions/extendedMasterSecret\";\nimport { RenegotiationIndication } from \"./handshake/extensions/renegotiationIndication\";\nimport { Signature } from \"./handshake/extensions/signature\";\nimport { UseSRTP } from \"./handshake/extensions/useSrtp\";\nimport type { SrtpProfile } from \"./imports/rtp\";\nimport { createPlaintext } from \"./record/builder\";\nimport { ContentType } from \"./record/const\";\nimport { FragmentedHandshake } from \"./record/message/fragment\";\nimport { parsePacket, parsePlainText } from \"./record/receive\";\nimport type { Extension } from \"./typings/domain\";\n\nconst log = debug(\"werift-dtls : packages/dtls/src/socket.ts : log\");\nconst err = debug(\"werift-dtls : packages/dtls/src/socket.ts : err\");\n\nexport class DtlsSocket {\n readonly onConnect = new Event();\n readonly onData = new Event<[Buffer]>();\n readonly onError = new Event<[Error]>();\n readonly onClose = new Event();\n readonly transport: TransportContext;\n cipher: CipherContext;\n dtls: DtlsContext;\n srtp: SrtpContext = new SrtpContext();\n\n connected = false;\n extensions: Extension[] = [];\n onHandleHandshakes!: (assembled: FragmentedHandshake[]) => Promise<void>;\n\n private bufferFragmentedHandshakes: FragmentedHandshake[] = [];\n\n constructor(\n public options: Options,\n public sessionType: SessionTypes,\n ) {\n this.dtls = new DtlsContext(this.options, this.sessionType);\n this.cipher = new CipherContext(\n this.sessionType,\n this.options.cert,\n this.options.key,\n this.options.signatureHash,\n );\n this.transport = new TransportContext(this.options.transport);\n this.setupExtensions();\n this.transport.socket.onData = this.udpOnMessage;\n }\n\n renegotiation() {\n log(\"renegotiation\", this.sessionType);\n this.connected = false;\n this.cipher = new CipherContext(\n this.sessionType,\n this.options.cert,\n this.options.key,\n this.options.signatureHash,\n );\n this.dtls = new DtlsContext(this.options, this.sessionType);\n this.srtp = new SrtpContext();\n this.extensions = [];\n this.bufferFragmentedHandshakes = [];\n }\n\n private udpOnMessage = (data: Buffer) => {\n const packets = parsePacket(data);\n\n for (const packet of packets) {\n try {\n const messages = parsePlainText(this.dtls, this.cipher)(packet);\n for (const message of messages) {\n switch (message.type) {\n case ContentType.handshake:\n {\n const handshake = message.data as FragmentedHandshake;\n const handshakes = this.handleFragmentHandshake([handshake]);\n const assembled = Object.values(\n handshakes.reduce(\n (acc: { [type: string]: FragmentedHandshake[] }, cur) => {\n if (!acc[cur.msg_type]) acc[cur.msg_type] = [];\n acc[cur.msg_type].push(cur);\n return acc;\n },\n {},\n ),\n )\n .map((v) => FragmentedHandshake.assemble(v))\n .sort((a, b) => a.msg_type - b.msg_type);\n\n this.onHandleHandshakes(assembled).catch((error) => {\n err(this.dtls.sessionId, \"onHandleHandshakes error\", error);\n this.onError.execute(error);\n });\n }\n break;\n case ContentType.applicationData:\n {\n this.onData.execute(message.data as Buffer);\n }\n break;\n case ContentType.alert:\n this.onClose.execute();\n break;\n }\n }\n } catch (error) {\n err(this.dtls.sessionId, \"catch udpOnMessage error\", error);\n }\n }\n };\n\n private setupExtensions() {\n log(this.dtls.sessionId, \"support srtpProfiles\", this.options.srtpProfiles);\n if (this.options.srtpProfiles && this.options.srtpProfiles.length > 0) {\n const useSrtp = UseSRTP.create(\n this.options.srtpProfiles,\n Buffer.from([0x00]),\n );\n this.extensions.push(useSrtp.extension);\n }\n\n {\n const curve = EllipticCurves.createEmpty();\n curve.data = NamedCurveAlgorithmList;\n this.extensions.push(curve.extension);\n }\n\n {\n const signature = Signature.createEmpty();\n // libwebrtc/OpenSSL require 4=1 , 4=3 signatureHash\n signature.data = signatures;\n this.extensions.push(signature.extension);\n }\n if (this.options.extendedMasterSecret) {\n this.extensions.push({\n type: ExtendedMasterSecret.type,\n data: Buffer.alloc(0),\n });\n }\n\n {\n const renegotiationIndication = RenegotiationIndication.createEmpty();\n this.extensions.push(renegotiationIndication.extension);\n }\n }\n\n protected waitForReady = (condition: () => boolean) =>\n new Promise<void>(async (r, f) => {\n for (let i = 0; i < 10; i++) {\n if (condition()) {\n r();\n break;\n } else {\n await setTimeout(100 * i);\n }\n }\n f(\"waitForReady timeout\");\n });\n\n handleFragmentHandshake(messages: FragmentedHandshake[]) {\n let handshakes = messages.filter((v) => {\n // find fragmented\n if (v.fragment_length !== v.length) {\n this.bufferFragmentedHandshakes.push(v);\n return false;\n }\n return true;\n });\n\n if (this.bufferFragmentedHandshakes.length > 1) {\n const [last] = this.bufferFragmentedHandshakes.slice(-1);\n if (last.fragment_offset + last.fragment_length === last.length) {\n handshakes = [...this.bufferFragmentedHandshakes, ...handshakes];\n this.bufferFragmentedHandshakes = [];\n }\n }\n return handshakes; // return un fragmented handshakes\n }\n\n /**send application data */\n send = async (buf: Buffer) => {\n const pkt = createPlaintext(this.dtls)(\n [{ type: ContentType.applicationData, fragment: buf }],\n ++this.dtls.recordSequenceNumber,\n )[0];\n await this.transport.send(this.cipher.encryptPacket(pkt).serialize());\n };\n\n close() {\n this.transport.socket.close();\n }\n\n extractSessionKeys(keyLength: number, saltLength: number) {\n const keyingMaterial = this.exportKeyingMaterial(\n \"EXTRACTOR-dtls_srtp\",\n keyLength * 2 + saltLength * 2,\n );\n\n const { clientKey, serverKey, clientSalt, serverSalt } = decode(\n keyingMaterial,\n {\n clientKey: types.buffer(keyLength),\n serverKey: types.buffer(keyLength),\n clientSalt: types.buffer(saltLength),\n serverSalt: types.buffer(saltLength),\n },\n );\n\n if (this.sessionType === SessionType.CLIENT) {\n return {\n localKey: clientKey,\n localSalt: clientSalt,\n remoteKey: serverKey,\n remoteSalt: serverSalt,\n };\n } else {\n return {\n localKey: serverKey,\n localSalt: serverSalt,\n remoteKey: clientKey,\n remoteSalt: clientSalt,\n };\n }\n }\n\n exportKeyingMaterial(label: string, length: number) {\n return exportKeyingMaterial(\n label,\n length,\n this.cipher.masterSecret,\n this.cipher.localRandom.serialize(),\n this.cipher.remoteRandom.serialize(),\n this.sessionType === SessionType.CLIENT,\n );\n }\n}\n\nexport interface Options {\n transport: Transport;\n srtpProfiles?: SrtpProfile[];\n cert?: string;\n key?: string;\n signatureHash?: SignatureHash;\n certificateRequest?: boolean;\n extendedMasterSecret?: boolean;\n}\n"]}
1
+ {"version":3,"file":"socket.js","sourceRoot":"","sources":["../../../../dtls/src/socket.ts"],"names":[],"mappings":"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","sourcesContent":["import { decode, types } from \"@shinyoshiaki/binary-data\";\n\nimport { setTimeout } from \"timers/promises\";\nimport { Event, type Transport, debug } from \"./imports/common\";\n\nimport {\n NamedCurveAlgorithmList,\n type SignatureHash,\n signatures,\n} from \"./cipher/const\";\nimport { exportKeyingMaterial } from \"./cipher/prf\";\nimport { SessionType, type SessionTypes } from \"./cipher/suites/abstract\";\nimport { CipherContext } from \"./context/cipher\";\nimport { DtlsContext } from \"./context/dtls\";\nimport { SrtpContext } from \"./context/srtp\";\nimport { TransportContext } from \"./context/transport\";\nimport { EllipticCurves } from \"./handshake/extensions/ellipticCurves\";\nimport { ExtendedMasterSecret } from \"./handshake/extensions/extendedMasterSecret\";\nimport { RenegotiationIndication } from \"./handshake/extensions/renegotiationIndication\";\nimport { Signature } from \"./handshake/extensions/signature\";\nimport { UseSRTP } from \"./handshake/extensions/useSrtp\";\nimport type { SrtpProfile } from \"./imports/rtp\";\nimport { createPlaintext } from \"./record/builder\";\nimport { ContentType } from \"./record/const\";\nimport { FragmentedHandshake } from \"./record/message/fragment\";\nimport { parsePacket, parsePlainText } from \"./record/receive\";\nimport type { Extension } from \"./typings/domain\";\n\nconst log = debug(\"werift-dtls : packages/dtls/src/socket.ts : log\");\nconst err = debug(\"werift-dtls : packages/dtls/src/socket.ts : err\");\n\nexport class DtlsSocket {\n readonly onConnect = new Event();\n readonly onData = new Event<[Buffer]>();\n readonly onError = new Event<[Error]>();\n readonly onClose = new Event();\n readonly transport: TransportContext;\n cipher: CipherContext;\n dtls: DtlsContext;\n srtp: SrtpContext = new SrtpContext();\n\n connected = false;\n extensions: Extension[] = [];\n onHandleHandshakes!: (assembled: FragmentedHandshake[]) => Promise<void>;\n\n private bufferFragmentedHandshakes: FragmentedHandshake[] = [];\n\n constructor(\n public options: Options,\n public sessionType: SessionTypes,\n ) {\n this.dtls = new DtlsContext(this.options, this.sessionType);\n this.cipher = new CipherContext(\n this.sessionType,\n this.options.cert,\n this.options.key,\n this.options.signatureHash,\n );\n this.transport = new TransportContext(this.options.transport);\n this.setupExtensions();\n this.transport.socket.onData = this.udpOnMessage;\n }\n\n renegotiation() {\n log(\"renegotiation\", this.sessionType);\n this.connected = false;\n this.cipher = new CipherContext(\n this.sessionType,\n this.options.cert,\n this.options.key,\n this.options.signatureHash,\n );\n this.dtls = new DtlsContext(this.options, this.sessionType);\n this.srtp = new SrtpContext();\n this.extensions = [];\n this.bufferFragmentedHandshakes = [];\n }\n\n private udpOnMessage = (data: Buffer) => {\n const packets = parsePacket(data);\n\n for (const packet of packets) {\n try {\n const messages = parsePlainText(this.dtls, this.cipher)(packet);\n for (const message of messages) {\n switch (message.type) {\n case ContentType.handshake:\n {\n const handshake = message.data as FragmentedHandshake;\n const handshakes = this.handleFragmentHandshake([handshake]);\n const assembled = Object.values(\n handshakes.reduce(\n (acc: { [type: string]: FragmentedHandshake[] }, cur) => {\n if (!acc[cur.msg_type]) acc[cur.msg_type] = [];\n acc[cur.msg_type].push(cur);\n return acc;\n },\n {},\n ),\n )\n .map((v) => FragmentedHandshake.assemble(v))\n .sort((a, b) => a.msg_type - b.msg_type);\n\n this.onHandleHandshakes(assembled).catch((error) => {\n err(this.dtls.sessionId, \"onHandleHandshakes error\", error);\n this.onError.execute(error);\n });\n }\n break;\n case ContentType.applicationData:\n {\n this.onData.execute(message.data as Buffer);\n }\n break;\n case ContentType.alert:\n this.onClose.execute();\n break;\n }\n }\n } catch (error) {\n err(this.dtls.sessionId, \"catch udpOnMessage error\", error);\n }\n }\n };\n\n private setupExtensions() {\n log(this.dtls.sessionId, \"support srtpProfiles\", this.options.srtpProfiles);\n if (this.options.srtpProfiles && this.options.srtpProfiles.length > 0) {\n const useSrtp = UseSRTP.create(\n this.options.srtpProfiles,\n Buffer.from([0x00]),\n );\n this.extensions.push(useSrtp.extension);\n }\n\n {\n const curve = EllipticCurves.createEmpty();\n curve.data = NamedCurveAlgorithmList;\n this.extensions.push(curve.extension);\n }\n\n {\n const signature = Signature.createEmpty();\n // libwebrtc/OpenSSL require 4=1 , 4=3 signatureHash\n signature.data = signatures;\n this.extensions.push(signature.extension);\n }\n if (this.options.extendedMasterSecret) {\n this.extensions.push({\n type: ExtendedMasterSecret.type,\n data: Buffer.alloc(0),\n });\n }\n\n {\n const renegotiationIndication = RenegotiationIndication.createEmpty();\n this.extensions.push(renegotiationIndication.extension);\n }\n }\n\n protected waitForReady = (condition: () => boolean) =>\n new Promise<void>(async (r, f) => {\n for (let i = 0; i < 10; i++) {\n if (condition()) {\n r();\n break;\n } else {\n await setTimeout(100 * i);\n }\n }\n f(\"waitForReady timeout\");\n });\n\n handleFragmentHandshake(messages: FragmentedHandshake[]) {\n let handshakes = messages.filter((v) => {\n // find fragmented\n if (v.fragment_length !== v.length) {\n this.bufferFragmentedHandshakes.push(v);\n return false;\n }\n return true;\n });\n\n if (this.bufferFragmentedHandshakes.length > 1) {\n const [last] = this.bufferFragmentedHandshakes.slice(-1);\n if (last.fragment_offset + last.fragment_length === last.length) {\n handshakes = [...this.bufferFragmentedHandshakes, ...handshakes];\n this.bufferFragmentedHandshakes = [];\n }\n }\n return handshakes; // return un fragmented handshakes\n }\n\n /**send application data */\n send = async (buf: Buffer) => {\n const pkt = createPlaintext(this.dtls)(\n [{ type: ContentType.applicationData, fragment: buf }],\n ++this.dtls.recordSequenceNumber,\n )[0];\n await this.transport.send(this.cipher.encryptPacket(pkt).serialize());\n };\n\n close() {\n this.transport.socket.close();\n }\n\n extractSessionKeys(keyLength: number, saltLength: number) {\n const keyingMaterial = this.exportKeyingMaterial(\n \"EXTRACTOR-dtls_srtp\",\n keyLength * 2 + saltLength * 2,\n );\n\n const { clientKey, serverKey, clientSalt, serverSalt } = decode(\n keyingMaterial,\n {\n clientKey: types.buffer(keyLength),\n serverKey: types.buffer(keyLength),\n clientSalt: types.buffer(saltLength),\n serverSalt: types.buffer(saltLength),\n },\n );\n\n if (this.sessionType === SessionType.CLIENT) {\n return {\n localKey: clientKey,\n localSalt: clientSalt,\n remoteKey: serverKey,\n remoteSalt: serverSalt,\n };\n } else {\n return {\n localKey: serverKey,\n localSalt: serverSalt,\n remoteKey: clientKey,\n remoteSalt: clientSalt,\n };\n }\n }\n\n exportKeyingMaterial(label: string, length: number) {\n return exportKeyingMaterial(\n label,\n length,\n this.cipher.masterSecret,\n this.cipher.localRandom.serialize(),\n this.cipher.remoteRandom.serialize(),\n this.sessionType === SessionType.CLIENT,\n );\n }\n\n get remoteCertificate() {\n return this.cipher.remoteCertificate;\n }\n}\n\nexport interface Options {\n transport: Transport;\n srtpProfiles?: SrtpProfile[];\n cert?: string;\n key?: string;\n signatureHash?: SignatureHash;\n certificateRequest?: boolean;\n extendedMasterSecret?: boolean;\n}\n"]}
@@ -1,14 +1,10 @@
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.Message = void 0;
7
4
  exports.parseMessage = parseMessage;
8
5
  exports.paddingLength = paddingLength;
9
6
  const crypto_1 = require("crypto");
10
- //@ts-ignore
11
- const buffer_crc32_1 = __importDefault(require("buffer-crc32"));
7
+ const src_1 = require("../../../common/src");
12
8
  const helper_1 = require("../helper");
13
9
  const attributes_1 = require("./attributes");
14
10
  const const_1 = require("./const");
@@ -138,11 +134,7 @@ const setBodyLength = (data, length) => {
138
134
  };
139
135
  function messageFingerprint(data) {
140
136
  const checkData = setBodyLength(data, data.length - const_1.HEADER_LENGTH + const_1.FINGERPRINT_LENGTH);
141
- const crc32Buf = (0, buffer_crc32_1.default)(checkData);
142
- const xorBuf = Buffer.alloc(4);
143
- xorBuf.writeInt32BE(const_1.FINGERPRINT_XOR, 0);
144
- const fingerprint = (0, helper_1.bufferXor)(crc32Buf, xorBuf);
145
- return fingerprint.readUInt32BE(0);
137
+ return ((0, src_1.crc32)(checkData) ^ const_1.FINGERPRINT_XOR) >>> 0;
146
138
  }
147
139
  function messageIntegrity(data, key) {
148
140
  const checkData = setBodyLength(data, data.length - const_1.HEADER_LENGTH + const_1.INTEGRITY_LENGTH);
@@ -1 +1 @@
1
- {"version":3,"file":"message.js","sourceRoot":"","sources":["../../../../../ice/src/stun/message.ts"],"names":[],"mappings":"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","sourcesContent":["import { createHmac } from \"crypto\";\n//@ts-ignore\nimport crc32 from \"buffer-crc32\";\n\nimport { bufferXor, randomTransactionId } from \"../helper\";\nimport {\n ATTRIBUTES_BY_NAME,\n ATTRIBUTES_BY_TYPE,\n type AttributeKey,\n type AttributePair,\n AttributeRepository,\n packXorAddress,\n unpackXorAddress,\n} from \"./attributes\";\nimport {\n COOKIE,\n FINGERPRINT_LENGTH,\n FINGERPRINT_XOR,\n HEADER_LENGTH,\n INTEGRITY_LENGTH,\n classes,\n methods,\n} from \"./const\";\n\nexport function parseMessage(\n data: Buffer,\n integrityKey?: Buffer,\n): Message | undefined {\n if (data.length < HEADER_LENGTH) {\n return undefined;\n }\n\n const length = data.readUint16BE(2);\n\n if (data.length !== HEADER_LENGTH + length) {\n return undefined;\n }\n\n const messageType = data.readUint16BE(0);\n const transactionId = Buffer.from(\n data.slice(HEADER_LENGTH - 12, HEADER_LENGTH),\n );\n\n const attributeRepository = new AttributeRepository();\n\n for (let pos = HEADER_LENGTH; pos <= data.length - 4; ) {\n const attrType = data.readUInt16BE(pos);\n const attrLen = data.readUInt16BE(pos + 2);\n const payload = data.slice(pos + 4, pos + 4 + attrLen);\n const padLen = 4 * Math.floor((attrLen + 3) / 4) - attrLen;\n const attributesTypes = Object.keys(ATTRIBUTES_BY_TYPE);\n if (attributesTypes.includes(attrType.toString())) {\n const [, attrName, , attrUnpack] = ATTRIBUTES_BY_TYPE[attrType];\n if (attrUnpack.name === unpackXorAddress.name) {\n attributeRepository.setAttribute(\n attrName as AttributeKey,\n attrUnpack(payload, transactionId),\n );\n } else {\n attributeRepository.setAttribute(\n attrName as AttributeKey,\n attrUnpack(payload),\n );\n }\n\n if (attrName === \"FINGERPRINT\") {\n const fingerprint = messageFingerprint(data.slice(0, pos));\n const expect = attributeRepository.getAttributeValue(\"FINGERPRINT\");\n if (expect !== fingerprint) {\n return undefined;\n }\n } else if (attrName === \"MESSAGE-INTEGRITY\") {\n if (integrityKey) {\n const integrity = messageIntegrity(data.slice(0, pos), integrityKey);\n const expect =\n attributeRepository.getAttributeValue(\"MESSAGE-INTEGRITY\");\n if (!integrity.equals(expect)) {\n return undefined;\n }\n }\n }\n }\n pos += 4 + attrLen + padLen;\n }\n\n const attributes = attributeRepository.getAttributes();\n attributeRepository.clear();\n\n return new Message(\n messageType & 0x3eef,\n messageType & 0x0110,\n transactionId,\n attributes,\n );\n}\n\nexport class Message extends AttributeRepository {\n constructor(\n public messageMethod: methods,\n public messageClass: classes,\n public transactionId: Buffer = randomTransactionId(),\n attributes: AttributePair[] = [],\n ) {\n super(attributes);\n }\n\n toJSON() {\n return this.json;\n }\n\n get json() {\n return {\n messageMethod: methods[this.messageMethod],\n messageClass: classes[this.messageClass],\n attributes: this.attributes,\n };\n }\n\n get transactionIdHex() {\n return this.transactionId.toString(\"hex\");\n }\n\n get bytes() {\n let data = Buffer.from([]);\n for (const attrName of this.attributesKeys) {\n const attrValue = this.getAttributeValue(attrName);\n const [attrType, , attrPack] = ATTRIBUTES_BY_NAME[attrName];\n const v =\n attrPack.name === packXorAddress.name\n ? attrPack(attrValue, this.transactionId)\n : attrPack(attrValue);\n const attrLen = v.length;\n const padLen = 4 * Math.floor((attrLen + 3) / 4) - attrLen;\n const attrHeader = Buffer.alloc(4);\n attrHeader.writeUInt16BE(attrType, 0);\n attrHeader.writeUInt16BE(attrLen, 2);\n data = Buffer.concat([data, attrHeader, v, Buffer.alloc(padLen, 0)]);\n }\n const buf = Buffer.alloc(8);\n buf.writeUInt16BE(this.messageMethod | this.messageClass, 0);\n buf.writeUInt16BE(data.length, 2);\n buf.writeUInt32BE(COOKIE, 4);\n\n return Buffer.concat([buf, this.transactionId, data]);\n }\n\n addMessageIntegrity(key: Buffer) {\n this.setAttribute(\"MESSAGE-INTEGRITY\", this.messageIntegrity(key));\n return this;\n }\n\n messageIntegrity(key: Buffer) {\n const checkData = setBodyLength(\n this.bytes,\n this.bytes.length - HEADER_LENGTH + INTEGRITY_LENGTH,\n );\n return Buffer.from(\n createHmac(\"sha1\", key).update(checkData).digest(\"hex\"),\n \"hex\",\n );\n }\n\n addFingerprint() {\n this.setAttribute(\"FINGERPRINT\", messageFingerprint(this.bytes));\n }\n}\n\nconst setBodyLength = (data: Buffer, length: number) => {\n const output = Buffer.alloc(data.length);\n data.copy(output, 0, 0, 2);\n output.writeUInt16BE(length, 2);\n data.copy(output, 4, 4);\n return output;\n};\n\nfunction messageFingerprint(data: Buffer) {\n const checkData = setBodyLength(\n data,\n data.length - HEADER_LENGTH + FINGERPRINT_LENGTH,\n );\n const crc32Buf = crc32(checkData);\n const xorBuf = Buffer.alloc(4);\n xorBuf.writeInt32BE(FINGERPRINT_XOR, 0);\n const fingerprint = bufferXor(crc32Buf, xorBuf);\n return fingerprint.readUInt32BE(0);\n}\n\nfunction messageIntegrity(data: Buffer, key: Buffer) {\n const checkData = setBodyLength(\n data,\n data.length - HEADER_LENGTH + INTEGRITY_LENGTH,\n );\n return Buffer.from(\n createHmac(\"sha1\", key).update(checkData).digest(\"hex\"),\n \"hex\",\n );\n}\n\nexport function paddingLength(length: number) {\n const rest = length % 4;\n if (rest === 0) {\n return 0;\n } else {\n return 4 - rest;\n }\n}\n"]}
1
+ {"version":3,"file":"message.js","sourceRoot":"","sources":["../../../../../ice/src/stun/message.ts"],"names":[],"mappings":"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","sourcesContent":["import { createHmac } from \"crypto\";\nimport { crc32 } from \"../../../common/src\";\n\nimport { randomTransactionId } from \"../helper\";\nimport {\n ATTRIBUTES_BY_NAME,\n ATTRIBUTES_BY_TYPE,\n type AttributeKey,\n type AttributePair,\n AttributeRepository,\n packXorAddress,\n unpackXorAddress,\n} from \"./attributes\";\nimport {\n COOKIE,\n FINGERPRINT_LENGTH,\n FINGERPRINT_XOR,\n HEADER_LENGTH,\n INTEGRITY_LENGTH,\n classes,\n methods,\n} from \"./const\";\n\nexport function parseMessage(\n data: Buffer,\n integrityKey?: Buffer,\n): Message | undefined {\n if (data.length < HEADER_LENGTH) {\n return undefined;\n }\n\n const length = data.readUint16BE(2);\n\n if (data.length !== HEADER_LENGTH + length) {\n return undefined;\n }\n\n const messageType = data.readUint16BE(0);\n const transactionId = Buffer.from(\n data.slice(HEADER_LENGTH - 12, HEADER_LENGTH),\n );\n\n const attributeRepository = new AttributeRepository();\n\n for (let pos = HEADER_LENGTH; pos <= data.length - 4; ) {\n const attrType = data.readUInt16BE(pos);\n const attrLen = data.readUInt16BE(pos + 2);\n const payload = data.slice(pos + 4, pos + 4 + attrLen);\n const padLen = 4 * Math.floor((attrLen + 3) / 4) - attrLen;\n const attributesTypes = Object.keys(ATTRIBUTES_BY_TYPE);\n if (attributesTypes.includes(attrType.toString())) {\n const [, attrName, , attrUnpack] = ATTRIBUTES_BY_TYPE[attrType];\n if (attrUnpack.name === unpackXorAddress.name) {\n attributeRepository.setAttribute(\n attrName as AttributeKey,\n attrUnpack(payload, transactionId),\n );\n } else {\n attributeRepository.setAttribute(\n attrName as AttributeKey,\n attrUnpack(payload),\n );\n }\n\n if (attrName === \"FINGERPRINT\") {\n const fingerprint = messageFingerprint(data.slice(0, pos));\n const expect = attributeRepository.getAttributeValue(\"FINGERPRINT\");\n if (expect !== fingerprint) {\n return undefined;\n }\n } else if (attrName === \"MESSAGE-INTEGRITY\") {\n if (integrityKey) {\n const integrity = messageIntegrity(data.slice(0, pos), integrityKey);\n const expect =\n attributeRepository.getAttributeValue(\"MESSAGE-INTEGRITY\");\n if (!integrity.equals(expect)) {\n return undefined;\n }\n }\n }\n }\n pos += 4 + attrLen + padLen;\n }\n\n const attributes = attributeRepository.getAttributes();\n attributeRepository.clear();\n\n return new Message(\n messageType & 0x3eef,\n messageType & 0x0110,\n transactionId,\n attributes,\n );\n}\n\nexport class Message extends AttributeRepository {\n constructor(\n public messageMethod: methods,\n public messageClass: classes,\n public transactionId: Buffer = randomTransactionId(),\n attributes: AttributePair[] = [],\n ) {\n super(attributes);\n }\n\n toJSON() {\n return this.json;\n }\n\n get json() {\n return {\n messageMethod: methods[this.messageMethod],\n messageClass: classes[this.messageClass],\n attributes: this.attributes,\n };\n }\n\n get transactionIdHex() {\n return this.transactionId.toString(\"hex\");\n }\n\n get bytes() {\n let data = Buffer.from([]);\n for (const attrName of this.attributesKeys) {\n const attrValue = this.getAttributeValue(attrName);\n const [attrType, , attrPack] = ATTRIBUTES_BY_NAME[attrName];\n const v =\n attrPack.name === packXorAddress.name\n ? attrPack(attrValue, this.transactionId)\n : attrPack(attrValue);\n const attrLen = v.length;\n const padLen = 4 * Math.floor((attrLen + 3) / 4) - attrLen;\n const attrHeader = Buffer.alloc(4);\n attrHeader.writeUInt16BE(attrType, 0);\n attrHeader.writeUInt16BE(attrLen, 2);\n data = Buffer.concat([data, attrHeader, v, Buffer.alloc(padLen, 0)]);\n }\n const buf = Buffer.alloc(8);\n buf.writeUInt16BE(this.messageMethod | this.messageClass, 0);\n buf.writeUInt16BE(data.length, 2);\n buf.writeUInt32BE(COOKIE, 4);\n\n return Buffer.concat([buf, this.transactionId, data]);\n }\n\n addMessageIntegrity(key: Buffer) {\n this.setAttribute(\"MESSAGE-INTEGRITY\", this.messageIntegrity(key));\n return this;\n }\n\n messageIntegrity(key: Buffer) {\n const checkData = setBodyLength(\n this.bytes,\n this.bytes.length - HEADER_LENGTH + INTEGRITY_LENGTH,\n );\n return Buffer.from(\n createHmac(\"sha1\", key).update(checkData).digest(\"hex\"),\n \"hex\",\n );\n }\n\n addFingerprint() {\n this.setAttribute(\"FINGERPRINT\", messageFingerprint(this.bytes));\n }\n}\n\nconst setBodyLength = (data: Buffer, length: number) => {\n const output = Buffer.alloc(data.length);\n data.copy(output, 0, 0, 2);\n output.writeUInt16BE(length, 2);\n data.copy(output, 4, 4);\n return output;\n};\n\nfunction messageFingerprint(data: Buffer) {\n const checkData = setBodyLength(\n data,\n data.length - HEADER_LENGTH + FINGERPRINT_LENGTH,\n );\n return (crc32(checkData) ^ FINGERPRINT_XOR) >>> 0;\n}\n\nfunction messageIntegrity(data: Buffer, key: Buffer) {\n const checkData = setBodyLength(\n data,\n data.length - HEADER_LENGTH + INTEGRITY_LENGTH,\n );\n return Buffer.from(\n createHmac(\"sha1\", key).update(checkData).digest(\"hex\"),\n \"hex\",\n );\n}\n\nexport function paddingLength(length: number) {\n const rest = length % 4;\n if (rest === 0) {\n return 0;\n } else {\n return 4 - rest;\n }\n}\n"]}