werift 0.25.0 → 0.25.1
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.
- package/lib/common/src/binaryData.d.ts +116 -0
- package/lib/common/src/binaryData.js +421 -0
- package/lib/common/src/binaryData.js.map +1 -0
- package/lib/common/src/index.d.ts +1 -0
- package/lib/common/src/index.js +24 -0
- package/lib/common/src/index.js.map +1 -1
- package/lib/dtls/src/cipher/prf.d.ts +2 -2
- package/lib/dtls/src/cipher/prf.js +2 -2
- package/lib/dtls/src/cipher/prf.js.map +1 -1
- package/lib/dtls/src/context/cipher.js +4 -3
- package/lib/dtls/src/context/cipher.js.map +1 -1
- package/lib/dtls/src/handshake/binary.d.ts +12 -8
- package/lib/dtls/src/handshake/binary.js +3 -2
- package/lib/dtls/src/handshake/binary.js.map +1 -1
- package/lib/dtls/src/handshake/extensions/ellipticCurves.d.ts +4 -3
- package/lib/dtls/src/handshake/extensions/ellipticCurves.js +7 -6
- package/lib/dtls/src/handshake/extensions/ellipticCurves.js.map +1 -1
- package/lib/dtls/src/handshake/extensions/renegotiationIndication.d.ts +4 -3
- package/lib/dtls/src/handshake/extensions/renegotiationIndication.js +6 -6
- package/lib/dtls/src/handshake/extensions/renegotiationIndication.js.map +1 -1
- package/lib/dtls/src/handshake/extensions/signature.d.ts +7 -3
- package/lib/dtls/src/handshake/extensions/signature.js +6 -6
- package/lib/dtls/src/handshake/extensions/signature.js.map +1 -1
- package/lib/dtls/src/handshake/extensions/useSrtp.d.ts +4 -3
- package/lib/dtls/src/handshake/extensions/useSrtp.js +6 -6
- package/lib/dtls/src/handshake/extensions/useSrtp.js.map +1 -1
- package/lib/dtls/src/handshake/message/alert.d.ts +4 -3
- package/lib/dtls/src/handshake/message/alert.js +6 -6
- package/lib/dtls/src/handshake/message/alert.js.map +1 -1
- package/lib/dtls/src/handshake/message/certificate.d.ts +3 -2
- package/lib/dtls/src/handshake/message/certificate.js +5 -5
- package/lib/dtls/src/handshake/message/certificate.js.map +1 -1
- package/lib/dtls/src/handshake/message/changeCipherSpec.d.ts +3 -2
- package/lib/dtls/src/handshake/message/changeCipherSpec.js +5 -5
- package/lib/dtls/src/handshake/message/changeCipherSpec.js.map +1 -1
- package/lib/dtls/src/handshake/message/client/certificateVerify.d.ts +4 -3
- package/lib/dtls/src/handshake/message/client/certificateVerify.js +6 -6
- package/lib/dtls/src/handshake/message/client/certificateVerify.js.map +1 -1
- package/lib/dtls/src/handshake/message/client/hello.d.ts +14 -10
- package/lib/dtls/src/handshake/message/client/hello.js +9 -9
- package/lib/dtls/src/handshake/message/client/hello.js.map +1 -1
- package/lib/dtls/src/handshake/message/client/keyExchange.d.ts +3 -2
- package/lib/dtls/src/handshake/message/client/keyExchange.js +5 -5
- package/lib/dtls/src/handshake/message/client/keyExchange.js.map +1 -1
- package/lib/dtls/src/handshake/message/server/certificateRequest.d.ts +8 -4
- package/lib/dtls/src/handshake/message/server/certificateRequest.js +7 -7
- package/lib/dtls/src/handshake/message/server/certificateRequest.js.map +1 -1
- package/lib/dtls/src/handshake/message/server/hello.d.ts +9 -8
- package/lib/dtls/src/handshake/message/server/hello.js +11 -11
- package/lib/dtls/src/handshake/message/server/hello.js.map +1 -1
- package/lib/dtls/src/handshake/message/server/helloDone.d.ts +1 -1
- package/lib/dtls/src/handshake/message/server/helloDone.js +4 -4
- package/lib/dtls/src/handshake/message/server/helloDone.js.map +1 -1
- package/lib/dtls/src/handshake/message/server/helloVerifyRequest.d.ts +5 -4
- package/lib/dtls/src/handshake/message/server/helloVerifyRequest.js +5 -5
- package/lib/dtls/src/handshake/message/server/helloVerifyRequest.js.map +1 -1
- package/lib/dtls/src/handshake/message/server/keyExchange.d.ts +10 -9
- package/lib/dtls/src/handshake/message/server/keyExchange.js +11 -10
- package/lib/dtls/src/handshake/message/server/keyExchange.js.map +1 -1
- package/lib/dtls/src/handshake/random.d.ts +5 -4
- package/lib/dtls/src/handshake/random.js +6 -6
- package/lib/dtls/src/handshake/random.js.map +1 -1
- package/lib/dtls/src/record/message/fragment.d.ts +8 -7
- package/lib/dtls/src/record/message/fragment.js +10 -10
- package/lib/dtls/src/record/message/fragment.js.map +1 -1
- package/lib/dtls/src/record/message/header.d.ts +8 -7
- package/lib/dtls/src/record/message/header.js +8 -8
- package/lib/dtls/src/record/message/header.js.map +1 -1
- package/lib/dtls/src/record/message/plaintext.d.ts +1 -1
- package/lib/dtls/src/socket.d.ts +4 -4
- package/lib/dtls/src/socket.js +6 -6
- package/lib/dtls/src/socket.js.map +1 -1
- package/lib/dtls/src/util/binary.d.ts +2 -1
- package/lib/dtls/src/util/binary.js +3 -2
- package/lib/dtls/src/util/binary.js.map +1 -1
- package/lib/index.mjs +517 -210
- package/lib/nonstandard/index.mjs +500 -194
- package/lib/polyfill/dom.mjs +538 -232
- package/lib/polyfill/index.mjs +538 -232
- package/package.json +1 -2
|
@@ -1,10 +1,11 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.ServerHelloVerifyRequest = void 0;
|
|
4
|
-
const
|
|
4
|
+
const common_1 = require("../../../imports/common");
|
|
5
5
|
const fragment_1 = require("../../../record/message/fragment");
|
|
6
6
|
const binary_1 = require("../../binary");
|
|
7
7
|
const const_1 = require("../../const");
|
|
8
|
+
const { decode, encode, types } = common_1.binaryData;
|
|
8
9
|
// 4.2.1. Denial-of-Service Countermeasures
|
|
9
10
|
class ServerHelloVerifyRequest {
|
|
10
11
|
constructor(serverVersion, cookie) {
|
|
@@ -39,11 +40,10 @@ class ServerHelloVerifyRequest {
|
|
|
39
40
|
static deSerialize(buf) {
|
|
40
41
|
return new ServerHelloVerifyRequest(
|
|
41
42
|
//@ts-ignore
|
|
42
|
-
...Object.values(
|
|
43
|
+
...Object.values(decode(buf, ServerHelloVerifyRequest.spec)));
|
|
43
44
|
}
|
|
44
45
|
serialize() {
|
|
45
|
-
|
|
46
|
-
return Buffer.from(res);
|
|
46
|
+
return encode(this, ServerHelloVerifyRequest.spec);
|
|
47
47
|
}
|
|
48
48
|
get version() {
|
|
49
49
|
return {
|
|
@@ -63,7 +63,7 @@ Object.defineProperty(ServerHelloVerifyRequest, "spec", {
|
|
|
63
63
|
writable: true,
|
|
64
64
|
value: {
|
|
65
65
|
serverVersion: binary_1.ProtocolVersion,
|
|
66
|
-
cookie:
|
|
66
|
+
cookie: types.buffer(types.uint8),
|
|
67
67
|
}
|
|
68
68
|
});
|
|
69
69
|
//# sourceMappingURL=helloVerifyRequest.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"helloVerifyRequest.js","sourceRoot":"","sources":["../../../../../../../dtls/src/handshake/message/server/helloVerifyRequest.ts"],"names":[],"mappings":";;;AAAA,
|
|
1
|
+
{"version":3,"file":"helloVerifyRequest.js","sourceRoot":"","sources":["../../../../../../../dtls/src/handshake/message/server/helloVerifyRequest.ts"],"names":[],"mappings":";;;AAAA,oDAAqD;AAErD,+DAAuE;AAEvE,yCAA+C;AAC/C,uCAA4C;AAE5C,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,mBAAU,CAAC;AAE7C,4CAA4C;AAE5C,MAAa,wBAAwB;IAQnC,YACS,aAA+C,EAC/C,MAAc;QADrB;;;;mBAAO,aAAa;WAAkC;QACtD;;;;mBAAO,MAAM;WAAQ;QATvB;;;;mBAAU,qBAAa,CAAC,sBAAsB;WAAC;QAC/C;;;;;WAAoB;IASjB,CAAC;IAEJ,MAAM,CAAC,WAAW;QAChB,OAAO,IAAI,wBAAwB,CAAC,SAAgB,EAAE,SAAgB,CAAC,CAAC;IAC1E,CAAC;IAED,MAAM,CAAC,WAAW,CAAC,GAAW;QAC5B,OAAO,IAAI,wBAAwB;QACjC,YAAY;QACZ,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,GAAG,EAAE,wBAAwB,CAAC,IAAI,CAAC,CAAC,CAC7D,CAAC;IACJ,CAAC;IAED,SAAS;QACP,OAAO,MAAM,CAAC,IAAI,EAAE,wBAAwB,CAAC,IAAI,CAAC,CAAC;IACrD,CAAC;IAED,IAAI,OAAO;QACT,OAAO;YACL,KAAK,EAAE,GAAG,GAAG,IAAI,CAAC,aAAa,CAAC,KAAK;YACrC,KAAK,EAAE,GAAG,GAAG,IAAI,CAAC,aAAa,CAAC,KAAK;SACtC,CAAC;IACJ,CAAC;IAED,UAAU;QACR,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,EAAE,CAAC;QAC9B,OAAO,IAAI,8BAAmB,CAC5B,IAAI,CAAC,OAAO,EACZ,IAAI,CAAC,MAAM,EACX,IAAI,CAAC,UAAW,EAChB,CAAC,EACD,IAAI,CAAC,MAAM,EACX,IAAI,CACL,CAAC;IACJ,CAAC;;AA7CH,4DA8CC;AA3CiB;;;;WAAO;QACrB,aAAa,EAAE,wBAAe;QAC9B,MAAM,EAAE,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC;KAClC;EAHmB,CAGlB","sourcesContent":["import { binaryData } from \"../../../imports/common\";\n\nimport { FragmentedHandshake } from \"../../../record/message/fragment\";\nimport type { Handshake } from \"../../../typings/domain\";\nimport { ProtocolVersion } from \"../../binary\";\nimport { HandshakeType } from \"../../const\";\n\nconst { decode, encode, types } = binaryData;\n\n// 4.2.1. Denial-of-Service Countermeasures\n\nexport class ServerHelloVerifyRequest implements Handshake {\n msgType = HandshakeType.hello_verify_request_3;\n messageSeq?: number;\n static readonly spec = {\n serverVersion: ProtocolVersion,\n cookie: types.buffer(types.uint8),\n };\n\n constructor(\n public serverVersion: { major: number; minor: number },\n public cookie: Buffer,\n ) {}\n\n static createEmpty() {\n return new ServerHelloVerifyRequest(undefined as any, undefined as any);\n }\n\n static deSerialize(buf: Buffer) {\n return new ServerHelloVerifyRequest(\n //@ts-ignore\n ...Object.values(decode(buf, ServerHelloVerifyRequest.spec)),\n );\n }\n\n serialize() {\n return encode(this, ServerHelloVerifyRequest.spec);\n }\n\n get version() {\n return {\n major: 255 - this.serverVersion.major,\n minor: 255 - this.serverVersion.minor,\n };\n }\n\n toFragment() {\n const body = this.serialize();\n return new FragmentedHandshake(\n this.msgType,\n body.length,\n this.messageSeq!,\n 0,\n body.length,\n body,\n );\n }\n}\n"]}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { binaryData } from "../../../imports/common";
|
|
1
2
|
import type { CurveTypes, NamedCurveAlgorithms } from "../../../cipher/const";
|
|
2
3
|
import { FragmentedHandshake } from "../../../record/message/fragment";
|
|
3
4
|
import type { Handshake } from "../../../typings/domain";
|
|
@@ -14,18 +15,18 @@ export declare class ServerKeyExchange implements Handshake {
|
|
|
14
15
|
msgType: HandshakeType;
|
|
15
16
|
messageSeq?: number;
|
|
16
17
|
static readonly spec: {
|
|
17
|
-
ellipticCurveType:
|
|
18
|
-
namedCurve:
|
|
19
|
-
publicKeyLength:
|
|
20
|
-
publicKey:
|
|
21
|
-
hashAlgorithm:
|
|
22
|
-
signatureAlgorithm:
|
|
23
|
-
signatureLength:
|
|
24
|
-
signature:
|
|
18
|
+
ellipticCurveType: binaryData.NumberType;
|
|
19
|
+
namedCurve: binaryData.NumberType;
|
|
20
|
+
publicKeyLength: binaryData.NumberType;
|
|
21
|
+
publicKey: binaryData.DataType<Buffer<ArrayBufferLike>>;
|
|
22
|
+
hashAlgorithm: binaryData.NumberType;
|
|
23
|
+
signatureAlgorithm: binaryData.NumberType;
|
|
24
|
+
signatureLength: binaryData.NumberType;
|
|
25
|
+
signature: binaryData.DataType<Buffer<ArrayBufferLike>>;
|
|
25
26
|
};
|
|
26
27
|
constructor(ellipticCurveType: CurveTypes, namedCurve: NamedCurveAlgorithms, publicKeyLength: number, publicKey: Buffer, hashAlgorithm: number, signatureAlgorithm: number, signatureLength: number, signature: Buffer);
|
|
27
28
|
static createEmpty(): ServerKeyExchange;
|
|
28
29
|
static deSerialize(buf: Buffer): ServerKeyExchange;
|
|
29
|
-
serialize(): Buffer<
|
|
30
|
+
serialize(): Buffer<ArrayBufferLike>;
|
|
30
31
|
toFragment(): FragmentedHandshake;
|
|
31
32
|
}
|
|
@@ -1,10 +1,11 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.ServerKeyExchange = void 0;
|
|
4
|
-
const
|
|
4
|
+
const common_1 = require("../../../imports/common");
|
|
5
5
|
const fragment_1 = require("../../../record/message/fragment");
|
|
6
6
|
const binary_1 = require("../../../util/binary");
|
|
7
7
|
const const_1 = require("../../const");
|
|
8
|
+
const { decode, types } = common_1.binaryData;
|
|
8
9
|
class ServerKeyExchange {
|
|
9
10
|
constructor(ellipticCurveType, namedCurve, publicKeyLength, publicKey, hashAlgorithm, signatureAlgorithm, signatureLength, signature) {
|
|
10
11
|
Object.defineProperty(this, "ellipticCurveType", {
|
|
@@ -72,7 +73,7 @@ class ServerKeyExchange {
|
|
|
72
73
|
return new ServerKeyExchange(undefined, undefined, undefined, undefined, undefined, undefined, undefined, undefined);
|
|
73
74
|
}
|
|
74
75
|
static deSerialize(buf) {
|
|
75
|
-
const res =
|
|
76
|
+
const res = decode(buf, ServerKeyExchange.spec);
|
|
76
77
|
return new ServerKeyExchange(
|
|
77
78
|
//@ts-ignore
|
|
78
79
|
...Object.values(res));
|
|
@@ -92,14 +93,14 @@ Object.defineProperty(ServerKeyExchange, "spec", {
|
|
|
92
93
|
configurable: true,
|
|
93
94
|
writable: true,
|
|
94
95
|
value: {
|
|
95
|
-
ellipticCurveType:
|
|
96
|
-
namedCurve:
|
|
97
|
-
publicKeyLength:
|
|
98
|
-
publicKey:
|
|
99
|
-
hashAlgorithm:
|
|
100
|
-
signatureAlgorithm:
|
|
101
|
-
signatureLength:
|
|
102
|
-
signature:
|
|
96
|
+
ellipticCurveType: types.uint8,
|
|
97
|
+
namedCurve: types.uint16be,
|
|
98
|
+
publicKeyLength: types.uint8,
|
|
99
|
+
publicKey: types.buffer((ctx) => ctx.current.publicKeyLength),
|
|
100
|
+
hashAlgorithm: types.uint8,
|
|
101
|
+
signatureAlgorithm: types.uint8,
|
|
102
|
+
signatureLength: types.uint16be,
|
|
103
|
+
signature: types.buffer((ctx) => ctx.current.signatureLength),
|
|
103
104
|
}
|
|
104
105
|
});
|
|
105
106
|
//# sourceMappingURL=keyExchange.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"keyExchange.js","sourceRoot":"","sources":["../../../../../../../dtls/src/handshake/message/server/keyExchange.ts"],"names":[],"mappings":";;;AAAA,
|
|
1
|
+
{"version":3,"file":"keyExchange.js","sourceRoot":"","sources":["../../../../../../../dtls/src/handshake/message/server/keyExchange.ts"],"names":[],"mappings":";;;AAAA,oDAAqD;AAGrD,+DAAuE;AAEvE,iDAAoD;AACpD,uCAA4C;AAE5C,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,mBAAU,CAAC;AAErC,MAAa,iBAAiB;IAe5B,YACS,iBAA6B,EAC7B,UAAgC,EAChC,eAAuB,EACvB,SAAiB,EACjB,aAAqB,EACrB,kBAA0B,EAC1B,eAAuB,EACvB,SAAiB;QAPxB;;;;mBAAO,iBAAiB;WAAY;QACpC;;;;mBAAO,UAAU;WAAsB;QACvC;;;;mBAAO,eAAe;WAAQ;QAC9B;;;;mBAAO,SAAS;WAAQ;QACxB;;;;mBAAO,aAAa;WAAQ;QAC5B;;;;mBAAO,kBAAkB;WAAQ;QACjC;;;;mBAAO,eAAe;WAAQ;QAC9B;;;;mBAAO,SAAS;WAAQ;QAtB1B;;;;mBAAU,qBAAa,CAAC,sBAAsB;WAAC;QAC/C;;;;;WAAoB;IAsBjB,CAAC;IAEJ,MAAM,CAAC,WAAW;QAChB,OAAO,IAAI,iBAAiB,CAC1B,SAAgB,EAChB,SAAgB,EAChB,SAAgB,EAChB,SAAgB,EAChB,SAAgB,EAChB,SAAgB,EAChB,SAAgB,EAChB,SAAgB,CACjB,CAAC;IACJ,CAAC;IAED,MAAM,CAAC,WAAW,CAAC,GAAW;QAC5B,MAAM,GAAG,GAAG,MAAM,CAAC,GAAG,EAAE,iBAAiB,CAAC,IAAI,CAAC,CAAC;QAChD,OAAO,IAAI,iBAAiB;QAC1B,YAAY;QACZ,GAAG,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CACtB,CAAC;IACJ,CAAC;IAED,SAAS;QACP,MAAM,GAAG,GAAG,IAAA,qBAAY,EAAC,IAAI,EAAE,iBAAiB,CAAC,IAAI,CAAC,CAAC;QACvD,OAAO,GAAG,CAAC;IACb,CAAC;IAED,UAAU;QACR,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,EAAE,CAAC;QAC9B,OAAO,IAAI,8BAAmB,CAC5B,IAAI,CAAC,OAAO,EACZ,IAAI,CAAC,MAAM,EACX,IAAI,CAAC,UAAW,EAChB,CAAC,EACD,IAAI,CAAC,MAAM,EACX,IAAI,CACL,CAAC;IACJ,CAAC;;AA9DH,8CA+DC;AA3DiB;;;;WAAO;QACrB,iBAAiB,EAAE,KAAK,CAAC,KAAK;QAC9B,UAAU,EAAE,KAAK,CAAC,QAAQ;QAC1B,eAAe,EAAE,KAAK,CAAC,KAAK;QAC5B,SAAS,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,OAAO,CAAC,eAAe,CAAC;QAC7D,aAAa,EAAE,KAAK,CAAC,KAAK;QAC1B,kBAAkB,EAAE,KAAK,CAAC,KAAK;QAC/B,eAAe,EAAE,KAAK,CAAC,QAAQ;QAC/B,SAAS,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,OAAO,CAAC,eAAe,CAAC;KAC9D;EATmB,CASlB","sourcesContent":["import { binaryData } from \"../../../imports/common\";\n\nimport type { CurveTypes, NamedCurveAlgorithms } from \"../../../cipher/const\";\nimport { FragmentedHandshake } from \"../../../record/message/fragment\";\nimport type { Handshake } from \"../../../typings/domain\";\nimport { encodeBuffer } from \"../../../util/binary\";\nimport { HandshakeType } from \"../../const\";\n\nconst { decode, types } = binaryData;\n\nexport class ServerKeyExchange implements Handshake {\n msgType = HandshakeType.server_key_exchange_12;\n messageSeq?: number;\n\n static readonly spec = {\n ellipticCurveType: types.uint8,\n namedCurve: types.uint16be,\n publicKeyLength: types.uint8,\n publicKey: types.buffer((ctx) => ctx.current.publicKeyLength),\n hashAlgorithm: types.uint8,\n signatureAlgorithm: types.uint8,\n signatureLength: types.uint16be,\n signature: types.buffer((ctx) => ctx.current.signatureLength),\n };\n\n constructor(\n public ellipticCurveType: CurveTypes,\n public namedCurve: NamedCurveAlgorithms,\n public publicKeyLength: number,\n public publicKey: Buffer,\n public hashAlgorithm: number,\n public signatureAlgorithm: number,\n public signatureLength: number,\n public signature: Buffer,\n ) {}\n\n static createEmpty() {\n return new ServerKeyExchange(\n undefined as any,\n undefined as any,\n undefined as any,\n undefined as any,\n undefined as any,\n undefined as any,\n undefined as any,\n undefined as any,\n );\n }\n\n static deSerialize(buf: Buffer) {\n const res = decode(buf, ServerKeyExchange.spec);\n return new ServerKeyExchange(\n //@ts-ignore\n ...Object.values(res),\n );\n }\n\n serialize() {\n const res = encodeBuffer(this, ServerKeyExchange.spec);\n return res;\n }\n\n toFragment() {\n const body = this.serialize();\n return new FragmentedHandshake(\n this.msgType,\n body.length,\n this.messageSeq!,\n 0,\n body.length,\n body,\n );\n }\n}\n"]}
|
|
@@ -1,12 +1,13 @@
|
|
|
1
|
+
import { binaryData } from "../imports/common";
|
|
1
2
|
export declare class DtlsRandom {
|
|
2
3
|
gmt_unix_time: number;
|
|
3
4
|
random_bytes: Buffer<ArrayBufferLike>;
|
|
4
5
|
static readonly spec: {
|
|
5
|
-
gmt_unix_time:
|
|
6
|
-
random_bytes:
|
|
6
|
+
gmt_unix_time: binaryData.NumberType;
|
|
7
|
+
random_bytes: binaryData.DataType<Buffer<ArrayBufferLike>>;
|
|
7
8
|
};
|
|
8
9
|
constructor(gmt_unix_time?: number, random_bytes?: Buffer<ArrayBufferLike>);
|
|
9
10
|
static deSerialize(buf: Buffer): DtlsRandom;
|
|
10
|
-
static from(spec: typeof DtlsRandom.spec): DtlsRandom;
|
|
11
|
-
serialize(): Buffer<
|
|
11
|
+
static from(spec: binaryData.Decoded<typeof DtlsRandom.spec>): DtlsRandom;
|
|
12
|
+
serialize(): Buffer<ArrayBufferLike>;
|
|
12
13
|
}
|
|
@@ -3,7 +3,8 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.DtlsRandom = void 0;
|
|
4
4
|
const crypto_1 = require("crypto");
|
|
5
5
|
/* eslint-disable @typescript-eslint/ban-ts-comment */
|
|
6
|
-
const
|
|
6
|
+
const common_1 = require("../imports/common");
|
|
7
|
+
const { decode, encode, types } = common_1.binaryData;
|
|
7
8
|
class DtlsRandom {
|
|
8
9
|
constructor(gmt_unix_time = Math.floor(Date.now() / 1000), random_bytes = (0, crypto_1.randomBytes)(28)) {
|
|
9
10
|
Object.defineProperty(this, "gmt_unix_time", {
|
|
@@ -22,15 +23,14 @@ class DtlsRandom {
|
|
|
22
23
|
static deSerialize(buf) {
|
|
23
24
|
return new DtlsRandom(
|
|
24
25
|
//@ts-ignore
|
|
25
|
-
...Object.values(
|
|
26
|
+
...Object.values(decode(buf, DtlsRandom.spec)));
|
|
26
27
|
}
|
|
27
28
|
static from(spec) {
|
|
28
29
|
//@ts-ignore
|
|
29
30
|
return new DtlsRandom(...Object.values(spec));
|
|
30
31
|
}
|
|
31
32
|
serialize() {
|
|
32
|
-
|
|
33
|
-
return Buffer.from(res);
|
|
33
|
+
return encode(this, DtlsRandom.spec);
|
|
34
34
|
}
|
|
35
35
|
}
|
|
36
36
|
exports.DtlsRandom = DtlsRandom;
|
|
@@ -39,8 +39,8 @@ Object.defineProperty(DtlsRandom, "spec", {
|
|
|
39
39
|
configurable: true,
|
|
40
40
|
writable: true,
|
|
41
41
|
value: {
|
|
42
|
-
gmt_unix_time:
|
|
43
|
-
random_bytes:
|
|
42
|
+
gmt_unix_time: types.uint32be,
|
|
43
|
+
random_bytes: types.buffer(28),
|
|
44
44
|
}
|
|
45
45
|
});
|
|
46
46
|
//# sourceMappingURL=random.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"random.js","sourceRoot":"","sources":["../../../../../dtls/src/handshake/random.ts"],"names":[],"mappings":";;;AAAA,mCAAqC;AACrC,sDAAsD;AACtD,
|
|
1
|
+
{"version":3,"file":"random.js","sourceRoot":"","sources":["../../../../../dtls/src/handshake/random.ts"],"names":[],"mappings":";;;AAAA,mCAAqC;AACrC,sDAAsD;AACtD,8CAA+C;AAE/C,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,mBAAU,CAAC;AAE7C,MAAa,UAAU;IAMrB,YACS,gBAAgB,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,EAC7C,eAAe,IAAA,oBAAW,EAAC,EAAE,CAAC;QADrC;;;;mBAAO,aAAa;WAAgC;QACpD;;;;mBAAO,YAAY;WAAkB;IACpC,CAAC;IAEJ,MAAM,CAAC,WAAW,CAAC,GAAW;QAC5B,OAAO,IAAI,UAAU;QACnB,YAAY;QACZ,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,GAAG,EAAE,UAAU,CAAC,IAAI,CAAC,CAAC,CAC/C,CAAC;IACJ,CAAC;IAED,MAAM,CAAC,IAAI,CAAC,IAAgD;QAC1D,YAAY;QACZ,OAAO,IAAI,UAAU,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC;IAChD,CAAC;IAED,SAAS;QACP,OAAO,MAAM,CAAC,IAAI,EAAE,UAAU,CAAC,IAAI,CAAC,CAAC;IACvC,CAAC;;AAzBH,gCA0BC;AAzBiB;;;;WAAO;QACrB,aAAa,EAAE,KAAK,CAAC,QAAQ;QAC7B,YAAY,EAAE,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC;KAC/B;EAHmB,CAGlB","sourcesContent":["import { randomBytes } from \"crypto\";\n/* eslint-disable @typescript-eslint/ban-ts-comment */\nimport { binaryData } from \"../imports/common\";\n\nconst { decode, encode, types } = binaryData;\n\nexport class DtlsRandom {\n static readonly spec = {\n gmt_unix_time: types.uint32be,\n random_bytes: types.buffer(28),\n };\n\n constructor(\n public gmt_unix_time = Math.floor(Date.now() / 1000),\n public random_bytes = randomBytes(28),\n ) {}\n\n static deSerialize(buf: Buffer) {\n return new DtlsRandom(\n //@ts-ignore\n ...Object.values(decode(buf, DtlsRandom.spec)),\n );\n }\n\n static from(spec: binaryData.Decoded<typeof DtlsRandom.spec>) {\n //@ts-ignore\n return new DtlsRandom(...Object.values(spec));\n }\n\n serialize() {\n return encode(this, DtlsRandom.spec);\n }\n}\n"]}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { binaryData } from "../../imports/common";
|
|
1
2
|
import type { HandshakeType } from "../../handshake/const";
|
|
2
3
|
export declare class FragmentedHandshake {
|
|
3
4
|
msg_type: number;
|
|
@@ -7,18 +8,18 @@ export declare class FragmentedHandshake {
|
|
|
7
8
|
fragment_length: number;
|
|
8
9
|
fragment: Buffer;
|
|
9
10
|
static readonly spec: {
|
|
10
|
-
msg_type:
|
|
11
|
-
length:
|
|
12
|
-
message_seq:
|
|
13
|
-
fragment_offset:
|
|
14
|
-
fragment_length:
|
|
15
|
-
fragment:
|
|
11
|
+
msg_type: binaryData.NumberType;
|
|
12
|
+
length: binaryData.NumberType;
|
|
13
|
+
message_seq: binaryData.NumberType;
|
|
14
|
+
fragment_offset: binaryData.NumberType;
|
|
15
|
+
fragment_length: binaryData.NumberType;
|
|
16
|
+
fragment: binaryData.DataType<Buffer<ArrayBufferLike>>;
|
|
16
17
|
};
|
|
17
18
|
constructor(msg_type: number, length: number, message_seq: number, fragment_offset: number, fragment_length: number, fragment: Buffer);
|
|
18
19
|
get summary(): any;
|
|
19
20
|
static createEmpty(): FragmentedHandshake;
|
|
20
21
|
static deSerialize(buf: Buffer): FragmentedHandshake;
|
|
21
|
-
serialize(): Buffer<
|
|
22
|
+
serialize(): Buffer<ArrayBufferLike>;
|
|
22
23
|
chunk(maxFragmentLength?: number): FragmentedHandshake[];
|
|
23
24
|
static assemble(messages: FragmentedHandshake[]): FragmentedHandshake;
|
|
24
25
|
static findAllFragments(fragments: FragmentedHandshake[], type: HandshakeType): FragmentedHandshake[];
|
|
@@ -2,8 +2,9 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.FragmentedHandshake = void 0;
|
|
4
4
|
/* eslint-disable @typescript-eslint/ban-ts-comment */
|
|
5
|
-
const
|
|
5
|
+
const common_1 = require("../../imports/common");
|
|
6
6
|
const helper_1 = require("../../helper");
|
|
7
|
+
const { decode, encode, types } = common_1.binaryData;
|
|
7
8
|
class FragmentedHandshake {
|
|
8
9
|
constructor(msg_type, length, message_seq, fragment_offset, fragment_length, fragment) {
|
|
9
10
|
Object.defineProperty(this, "msg_type", {
|
|
@@ -52,11 +53,10 @@ class FragmentedHandshake {
|
|
|
52
53
|
static deSerialize(buf) {
|
|
53
54
|
return new FragmentedHandshake(
|
|
54
55
|
//@ts-ignore
|
|
55
|
-
...Object.values(
|
|
56
|
+
...Object.values(decode(buf, FragmentedHandshake.spec)));
|
|
56
57
|
}
|
|
57
58
|
serialize() {
|
|
58
|
-
|
|
59
|
-
return Buffer.from(res);
|
|
59
|
+
return encode(this, FragmentedHandshake.spec);
|
|
60
60
|
}
|
|
61
61
|
chunk(maxFragmentLength) {
|
|
62
62
|
let start = 0;
|
|
@@ -122,12 +122,12 @@ Object.defineProperty(FragmentedHandshake, "spec", {
|
|
|
122
122
|
configurable: true,
|
|
123
123
|
writable: true,
|
|
124
124
|
value: {
|
|
125
|
-
msg_type:
|
|
126
|
-
length:
|
|
127
|
-
message_seq:
|
|
128
|
-
fragment_offset:
|
|
129
|
-
fragment_length:
|
|
130
|
-
fragment:
|
|
125
|
+
msg_type: types.uint8,
|
|
126
|
+
length: types.uint24be,
|
|
127
|
+
message_seq: types.uint16be,
|
|
128
|
+
fragment_offset: types.uint24be,
|
|
129
|
+
fragment_length: types.uint24be,
|
|
130
|
+
fragment: types.buffer((context) => context.current.fragment_length),
|
|
131
131
|
}
|
|
132
132
|
});
|
|
133
133
|
//# sourceMappingURL=fragment.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fragment.js","sourceRoot":"","sources":["../../../../../../dtls/src/record/message/fragment.ts"],"names":[],"mappings":";;;AAAA,sDAAsD;AACtD,
|
|
1
|
+
{"version":3,"file":"fragment.js","sourceRoot":"","sources":["../../../../../../dtls/src/record/message/fragment.ts"],"names":[],"mappings":"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","sourcesContent":["/* eslint-disable @typescript-eslint/ban-ts-comment */\nimport { binaryData } from \"../../imports/common\";\n\nimport type { HandshakeType } from \"../../handshake/const\";\nimport { getObjectSummary } from \"../../helper\";\n\nconst { decode, encode, types } = binaryData;\n\nexport class FragmentedHandshake {\n static readonly spec = {\n msg_type: types.uint8,\n length: types.uint24be,\n message_seq: types.uint16be,\n fragment_offset: types.uint24be,\n fragment_length: types.uint24be,\n fragment: types.buffer((context) => context.current.fragment_length),\n };\n\n constructor(\n public msg_type: number,\n public length: number,\n public message_seq: number,\n public fragment_offset: number,\n public fragment_length: number,\n public fragment: Buffer,\n ) {}\n\n get summary() {\n return getObjectSummary(this);\n }\n\n static createEmpty() {\n return new FragmentedHandshake(\n undefined as any,\n undefined as any,\n undefined as any,\n undefined as any,\n undefined as any,\n undefined as any,\n );\n }\n\n static deSerialize(buf: Buffer) {\n return new FragmentedHandshake(\n //@ts-ignore\n ...Object.values(decode(buf, FragmentedHandshake.spec)),\n );\n }\n\n serialize() {\n return encode(this, FragmentedHandshake.spec);\n }\n\n chunk(maxFragmentLength?: number): FragmentedHandshake[] {\n let start = 0;\n const totalLength = this.fragment.length;\n\n if (totalLength === 0)\n return [\n new FragmentedHandshake(\n this.msg_type,\n totalLength,\n this.message_seq,\n start,\n 0,\n this.fragment,\n ),\n ];\n\n const fragments: FragmentedHandshake[] = [];\n if (!maxFragmentLength) {\n maxFragmentLength = 1280 - (20 + 8) - (1 + 3 + 2 + 3 + 3);\n }\n // loop through the message and fragment it\n while (start < totalLength) {\n // calculate maximum length, limited by MTU - IP/UDP headers - handshake overhead\n const fragmentLength = Math.min(maxFragmentLength, totalLength - start);\n // slice and dice\n const data = Buffer.from(\n this.fragment.slice(start, start + fragmentLength),\n );\n if (data.length <= 0) {\n // this shouldn't happen, but we don't want to introduce an infinite loop\n throw new Error(\n `Zero or less bytes processed while fragmenting handshake message.`,\n );\n }\n // create the message\n fragments.push(\n new FragmentedHandshake(\n this.msg_type,\n totalLength,\n this.message_seq,\n start,\n data.length,\n data,\n ),\n );\n // step forward by the actual fragment length\n start += data.length;\n }\n\n return fragments;\n }\n\n static assemble(messages: FragmentedHandshake[]): FragmentedHandshake {\n // cannot reassemble empty arrays\n if (!messages?.length) {\n throw new Error(\"cannot reassemble handshake from empty array\");\n }\n\n // sort by fragment start\n messages = messages.sort((a, b) => a.fragment_offset - b.fragment_offset);\n // combine into a single buffer\n const combined = Buffer.alloc(messages[0].length);\n for (const msg of messages) {\n msg.fragment.copy(combined, msg.fragment_offset);\n }\n\n // and return the complete message\n return new FragmentedHandshake(\n messages[0].msg_type,\n messages[0].length,\n messages[0].message_seq,\n 0,\n combined.length,\n combined,\n );\n }\n\n static findAllFragments(\n fragments: FragmentedHandshake[],\n type: HandshakeType,\n ): FragmentedHandshake[] {\n const reference = fragments.find((v) => v.msg_type === type);\n if (!reference) return [];\n\n // ignore empty arrays\n if (!fragments?.length) return [];\n\n // return all fragments with matching msg_type, message_seq and total length\n return fragments.filter((f) => {\n return (\n f.msg_type === reference.msg_type &&\n f.message_seq === reference.message_seq &&\n f.length === reference.length\n );\n });\n }\n}\n"]}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { binaryData } from "../../imports/common";
|
|
1
2
|
export interface DtlsPlaintextHeader {
|
|
2
3
|
contentType: number;
|
|
3
4
|
protocolVersion: {
|
|
@@ -18,14 +19,14 @@ export declare class MACHeader {
|
|
|
18
19
|
};
|
|
19
20
|
contentLen: number;
|
|
20
21
|
static readonly spec: {
|
|
21
|
-
epoch:
|
|
22
|
-
sequenceNumber:
|
|
23
|
-
contentType:
|
|
22
|
+
epoch: binaryData.NumberType;
|
|
23
|
+
sequenceNumber: binaryData.NumberType;
|
|
24
|
+
contentType: binaryData.NumberType;
|
|
24
25
|
protocolVersion: {
|
|
25
|
-
major:
|
|
26
|
-
minor:
|
|
26
|
+
major: binaryData.NumberType;
|
|
27
|
+
minor: binaryData.NumberType;
|
|
27
28
|
};
|
|
28
|
-
contentLen:
|
|
29
|
+
contentLen: binaryData.NumberType;
|
|
29
30
|
};
|
|
30
31
|
constructor(epoch: number, sequenceNumber: number, contentType: number, protocolVersion: {
|
|
31
32
|
major: number;
|
|
@@ -33,5 +34,5 @@ export declare class MACHeader {
|
|
|
33
34
|
}, contentLen: number);
|
|
34
35
|
static createEmpty(): MACHeader;
|
|
35
36
|
static deSerialize(buf: Buffer): MACHeader;
|
|
36
|
-
serialize(): Buffer<
|
|
37
|
+
serialize(): Buffer<ArrayBufferLike>;
|
|
37
38
|
}
|
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.MACHeader = void 0;
|
|
4
|
-
const
|
|
4
|
+
const common_1 = require("../../imports/common");
|
|
5
5
|
const binary_1 = require("../../handshake/binary");
|
|
6
|
+
const { decode, encode, types } = common_1.binaryData;
|
|
6
7
|
class MACHeader {
|
|
7
8
|
constructor(epoch, sequenceNumber, contentType, protocolVersion, contentLen) {
|
|
8
9
|
Object.defineProperty(this, "epoch", {
|
|
@@ -42,11 +43,10 @@ class MACHeader {
|
|
|
42
43
|
static deSerialize(buf) {
|
|
43
44
|
return new MACHeader(
|
|
44
45
|
//@ts-ignore
|
|
45
|
-
...Object.values(
|
|
46
|
+
...Object.values(decode(buf, MACHeader.spec)));
|
|
46
47
|
}
|
|
47
48
|
serialize() {
|
|
48
|
-
|
|
49
|
-
return Buffer.from(res);
|
|
49
|
+
return encode(this, MACHeader.spec);
|
|
50
50
|
}
|
|
51
51
|
}
|
|
52
52
|
exports.MACHeader = MACHeader;
|
|
@@ -55,11 +55,11 @@ Object.defineProperty(MACHeader, "spec", {
|
|
|
55
55
|
configurable: true,
|
|
56
56
|
writable: true,
|
|
57
57
|
value: {
|
|
58
|
-
epoch:
|
|
59
|
-
sequenceNumber:
|
|
60
|
-
contentType:
|
|
58
|
+
epoch: types.uint16be,
|
|
59
|
+
sequenceNumber: types.uint48be,
|
|
60
|
+
contentType: types.uint8,
|
|
61
61
|
protocolVersion: binary_1.ProtocolVersion,
|
|
62
|
-
contentLen:
|
|
62
|
+
contentLen: types.uint16be,
|
|
63
63
|
}
|
|
64
64
|
});
|
|
65
65
|
//# sourceMappingURL=header.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"header.js","sourceRoot":"","sources":["../../../../../../dtls/src/record/message/header.ts"],"names":[],"mappings":";;;AAAA,
|
|
1
|
+
{"version":3,"file":"header.js","sourceRoot":"","sources":["../../../../../../dtls/src/record/message/header.ts"],"names":[],"mappings":";;;AAAA,iDAAkD;AAElD,mDAAyD;AAEzD,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,mBAAU,CAAC;AAa7C,MAAa,SAAS;IASpB,YACS,KAAa,EACb,cAAsB,EACtB,WAAmB,EACnB,eAAiD,EACjD,UAAkB;QAJzB;;;;mBAAO,KAAK;WAAQ;QACpB;;;;mBAAO,cAAc;WAAQ;QAC7B;;;;mBAAO,WAAW;WAAQ;QAC1B;;;;mBAAO,eAAe;WAAkC;QACxD;;;;mBAAO,UAAU;WAAQ;IACxB,CAAC;IAEJ,MAAM,CAAC,WAAW;QAChB,OAAO,IAAI,SAAS,CAClB,SAAgB,EAChB,SAAgB,EAChB,SAAgB,EAChB,SAAgB,EAChB,SAAgB,CACjB,CAAC;IACJ,CAAC;IAED,MAAM,CAAC,WAAW,CAAC,GAAW;QAC5B,OAAO,IAAI,SAAS;QAClB,YAAY;QACZ,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,GAAG,EAAE,SAAS,CAAC,IAAI,CAAC,CAAC,CAC9C,CAAC;IACJ,CAAC;IAED,SAAS;QACP,OAAO,MAAM,CAAC,IAAI,EAAE,SAAS,CAAC,IAAI,CAAC,CAAC;IACtC,CAAC;;AApCH,8BAqCC;AApCiB;;;;WAAO;QACrB,KAAK,EAAE,KAAK,CAAC,QAAQ;QACrB,cAAc,EAAE,KAAK,CAAC,QAAQ;QAC9B,WAAW,EAAE,KAAK,CAAC,KAAK;QACxB,eAAe,EAAE,wBAAe;QAChC,UAAU,EAAE,KAAK,CAAC,QAAQ;KAC3B;EANmB,CAMlB","sourcesContent":["import { binaryData } from \"../../imports/common\";\n\nimport { ProtocolVersion } from \"../../handshake/binary\";\n\nconst { decode, encode, types } = binaryData;\n\nexport interface DtlsPlaintextHeader {\n contentType: number;\n protocolVersion: {\n major: number;\n minor: number;\n };\n epoch: number;\n sequenceNumber: number;\n contentLen: number;\n}\n\nexport class MACHeader {\n static readonly spec = {\n epoch: types.uint16be,\n sequenceNumber: types.uint48be,\n contentType: types.uint8,\n protocolVersion: ProtocolVersion,\n contentLen: types.uint16be,\n };\n\n constructor(\n public epoch: number,\n public sequenceNumber: number,\n public contentType: number,\n public protocolVersion: { major: number; minor: number },\n public contentLen: number,\n ) {}\n\n static createEmpty() {\n return new MACHeader(\n undefined as any,\n undefined as any,\n undefined as any,\n undefined as any,\n undefined as any,\n );\n }\n\n static deSerialize(buf: Buffer) {\n return new MACHeader(\n //@ts-ignore\n ...Object.values(decode(buf, MACHeader.spec)),\n );\n }\n\n serialize() {\n return encode(this, MACHeader.spec);\n }\n}\n"]}
|
package/lib/dtls/src/socket.d.ts
CHANGED
|
@@ -34,10 +34,10 @@ export declare class DtlsSocket {
|
|
|
34
34
|
send: (buf: Buffer, addr?: Address) => Promise<void>;
|
|
35
35
|
close(): void;
|
|
36
36
|
extractSessionKeys(keyLength: number, saltLength: number): {
|
|
37
|
-
localKey:
|
|
38
|
-
localSalt:
|
|
39
|
-
remoteKey:
|
|
40
|
-
remoteSalt:
|
|
37
|
+
localKey: Buffer<ArrayBufferLike>;
|
|
38
|
+
localSalt: Buffer<ArrayBufferLike>;
|
|
39
|
+
remoteKey: Buffer<ArrayBufferLike>;
|
|
40
|
+
remoteSalt: Buffer<ArrayBufferLike>;
|
|
41
41
|
};
|
|
42
42
|
exportKeyingMaterial(label: string, length: number): Buffer<ArrayBuffer>;
|
|
43
43
|
get remoteCertificate(): Buffer<ArrayBufferLike> | undefined;
|
package/lib/dtls/src/socket.js
CHANGED
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.DtlsSocket = void 0;
|
|
4
|
-
const binary_data_1 = require("@shinyoshiaki/binary-data");
|
|
5
4
|
const promises_1 = require("timers/promises");
|
|
6
5
|
const common_1 = require("./imports/common");
|
|
7
6
|
const const_1 = require("./cipher/const");
|
|
@@ -20,6 +19,7 @@ const builder_1 = require("./record/builder");
|
|
|
20
19
|
const const_2 = require("./record/const");
|
|
21
20
|
const fragment_1 = require("./record/message/fragment");
|
|
22
21
|
const receive_1 = require("./record/receive");
|
|
22
|
+
const { decode, types } = common_1.binaryData;
|
|
23
23
|
const log = (0, common_1.debug)("werift-dtls : packages/dtls/src/socket.ts : log");
|
|
24
24
|
const err = (0, common_1.debug)("werift-dtls : packages/dtls/src/socket.ts : err");
|
|
25
25
|
class DtlsSocket {
|
|
@@ -247,11 +247,11 @@ class DtlsSocket {
|
|
|
247
247
|
}
|
|
248
248
|
extractSessionKeys(keyLength, saltLength) {
|
|
249
249
|
const keyingMaterial = this.exportKeyingMaterial("EXTRACTOR-dtls_srtp", keyLength * 2 + saltLength * 2);
|
|
250
|
-
const { clientKey, serverKey, clientSalt, serverSalt } =
|
|
251
|
-
clientKey:
|
|
252
|
-
serverKey:
|
|
253
|
-
clientSalt:
|
|
254
|
-
serverSalt:
|
|
250
|
+
const { clientKey, serverKey, clientSalt, serverSalt } = decode(keyingMaterial, {
|
|
251
|
+
clientKey: types.buffer(keyLength),
|
|
252
|
+
serverKey: types.buffer(keyLength),
|
|
253
|
+
clientSalt: types.buffer(saltLength),
|
|
254
|
+
serverSalt: types.buffer(saltLength),
|
|
255
255
|
});
|
|
256
256
|
if (this.sessionType === abstract_1.SessionType.CLIENT) {
|
|
257
257
|
return {
|
|
@@ -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, debug } from \"./imports/common\";\nimport type { Address, Transport } 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, addr?: Address) => {\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(), addr);\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
|
+
{"version":3,"file":"socket.js","sourceRoot":"","sources":["../../../../dtls/src/socket.ts"],"names":[],"mappings":";;;AAAA,8CAA6C;AAC7C,6CAA4D;AAG5D,0CAIwB;AACxB,sCAAoD;AACpD,uDAA0E;AAC1E,6CAAiD;AACjD,yCAA6C;AAC7C,yCAA6C;AAC7C,mDAAuD;AACvD,0EAAuE;AACvE,sFAAmF;AACnF,4FAAyF;AACzF,gEAA6D;AAC7D,4DAAyD;AAEzD,8CAAmD;AACnD,0CAA6C;AAC7C,wDAAgE;AAChE,8CAA+D;AAG/D,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,mBAAU,CAAC;AAErC,MAAM,GAAG,GAAG,IAAA,cAAK,EAAC,iDAAiD,CAAC,CAAC;AACrE,MAAM,GAAG,GAAG,IAAA,cAAK,EAAC,iDAAiD,CAAC,CAAC;AAErE,MAAa,UAAU;IAgBrB,YACS,OAAgB,EAChB,WAAyB;QADhC;;;;mBAAO,OAAO;WAAS;QACvB;;;;mBAAO,WAAW;WAAc;QAjBzB;;;;mBAAY,IAAI,cAAK,EAAE;WAAC;QACxB;;;;mBAAS,IAAI,cAAK,EAAY;WAAC;QAC/B;;;;mBAAU,IAAI,cAAK,EAAW;WAAC;QAC/B;;;;mBAAU,IAAI,cAAK,EAAE;WAAC;QACtB;;;;;WAA4B;QACrC;;;;;WAAsB;QACtB;;;;;WAAkB;QAClB;;;;mBAAoB,IAAI,kBAAW,EAAE;WAAC;QAEtC;;;;mBAAY,KAAK;WAAC;QAClB;;;;mBAA0B,EAAE;WAAC;QAC7B;;;;;WAAyE;QAEjE;;;;mBAAoD,EAAE;WAAC;QAiCvD;;;;mBAAe,CAAC,IAAY,EAAE,EAAE;gBACtC,MAAM,OAAO,GAAG,IAAA,qBAAW,EAAC,IAAI,CAAC,CAAC;gBAElC,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;oBAC7B,IAAI,CAAC;wBACH,MAAM,QAAQ,GAAG,IAAA,wBAAc,EAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,CAAC;wBAChE,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;4BAC/B,QAAQ,OAAO,CAAC,IAAI,EAAE,CAAC;gCACrB,KAAK,mBAAW,CAAC,SAAS;oCACxB,CAAC;wCACC,MAAM,SAAS,GAAG,OAAO,CAAC,IAA2B,CAAC;wCACtD,MAAM,UAAU,GAAG,IAAI,CAAC,uBAAuB,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC;wCAC7D,MAAM,SAAS,GAAG,MAAM,CAAC,MAAM,CAC7B,UAAU,CAAC,MAAM,CACf,CAAC,GAA8C,EAAE,GAAG,EAAE,EAAE;4CACtD,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,QAAQ,CAAC;gDAAE,GAAG,CAAC,GAAG,CAAC,QAAQ,CAAC,GAAG,EAAE,CAAC;4CAC/C,GAAG,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;4CAC5B,OAAO,GAAG,CAAC;wCACb,CAAC,EACD,EAAE,CACH,CACF;6CACE,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,8BAAmB,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;6CAC3C,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,GAAG,CAAC,CAAC,QAAQ,CAAC,CAAC;wCAE3C,IAAI,CAAC,kBAAkB,CAAC,SAAS,CAAC,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;4CACjD,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,0BAA0B,EAAE,KAAK,CAAC,CAAC;4CAC5D,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;wCAC9B,CAAC,CAAC,CAAC;oCACL,CAAC;oCACD,MAAM;gCACR,KAAK,mBAAW,CAAC,eAAe;oCAC9B,CAAC;wCACC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,IAAc,CAAC,CAAC;oCAC9C,CAAC;oCACD,MAAM;gCACR,KAAK,mBAAW,CAAC,KAAK;oCACpB,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC;oCACvB,MAAM;4BACV,CAAC;wBACH,CAAC;oBACH,CAAC;oBAAC,OAAO,KAAK,EAAE,CAAC;wBACf,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,0BAA0B,EAAE,KAAK,CAAC,CAAC;oBAC9D,CAAC;gBACH,CAAC;YACH,CAAC;WAAC;QAqCQ;;;;mBAAe,CAAC,SAAwB,EAAE,EAAE,CACpD,IAAI,OAAO,CAAO,KAAK,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE;gBAC/B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC;oBAC5B,IAAI,SAAS,EAAE,EAAE,CAAC;wBAChB,CAAC,EAAE,CAAC;wBACJ,MAAM;oBACR,CAAC;yBAAM,CAAC;wBACN,MAAM,IAAA,qBAAU,EAAC,GAAG,GAAG,CAAC,CAAC,CAAC;oBAC5B,CAAC;gBACH,CAAC;gBACD,CAAC,CAAC,sBAAsB,CAAC,CAAC;YAC5B,CAAC,CAAC;WAAC;QAsBL,2BAA2B;QAC3B;;;;mBAAO,KAAK,EAAE,GAAW,EAAE,IAAc,EAAE,EAAE;gBAC3C,MAAM,GAAG,GAAG,IAAA,yBAAe,EAAC,IAAI,CAAC,IAAI,CAAC,CACpC,CAAC,EAAE,IAAI,EAAE,mBAAW,CAAC,eAAe,EAAE,QAAQ,EAAE,GAAG,EAAE,CAAC,EACtD,EAAE,IAAI,CAAC,IAAI,CAAC,oBAAoB,CACjC,CAAC,CAAC,CAAC,CAAC;gBACL,MAAM,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,SAAS,EAAE,EAAE,IAAI,CAAC,CAAC;YAC9E,CAAC;WAAC;QArJA,IAAI,CAAC,IAAI,GAAG,IAAI,kBAAW,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC;QAC5D,IAAI,CAAC,MAAM,GAAG,IAAI,sBAAa,CAC7B,IAAI,CAAC,WAAW,EAChB,IAAI,CAAC,OAAO,CAAC,IAAI,EACjB,IAAI,CAAC,OAAO,CAAC,GAAG,EAChB,IAAI,CAAC,OAAO,CAAC,aAAa,CAC3B,CAAC;QACF,IAAI,CAAC,SAAS,GAAG,IAAI,4BAAgB,CAAC,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;QAC9D,IAAI,CAAC,eAAe,EAAE,CAAC;QACvB,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,MAAM,GAAG,IAAI,CAAC,YAAY,CAAC;IACnD,CAAC;IAED,aAAa;QACX,GAAG,CAAC,eAAe,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC;QACvC,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC;QACvB,IAAI,CAAC,MAAM,GAAG,IAAI,sBAAa,CAC7B,IAAI,CAAC,WAAW,EAChB,IAAI,CAAC,OAAO,CAAC,IAAI,EACjB,IAAI,CAAC,OAAO,CAAC,GAAG,EAChB,IAAI,CAAC,OAAO,CAAC,aAAa,CAC3B,CAAC;QACF,IAAI,CAAC,IAAI,GAAG,IAAI,kBAAW,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC;QAC5D,IAAI,CAAC,IAAI,GAAG,IAAI,kBAAW,EAAE,CAAC;QAC9B,IAAI,CAAC,UAAU,GAAG,EAAE,CAAC;QACrB,IAAI,CAAC,0BAA0B,GAAG,EAAE,CAAC;IACvC,CAAC;IAiDO,eAAe;QACrB,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,sBAAsB,EAAE,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC;QAC5E,IAAI,IAAI,CAAC,OAAO,CAAC,YAAY,IAAI,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACtE,MAAM,OAAO,GAAG,iBAAO,CAAC,MAAM,CAC5B,IAAI,CAAC,OAAO,CAAC,YAAY,EACzB,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,CACpB,CAAC;YACF,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;QAC1C,CAAC;QAED,CAAC;YACC,MAAM,KAAK,GAAG,+BAAc,CAAC,WAAW,EAAE,CAAC;YAC3C,KAAK,CAAC,IAAI,GAAG,+BAAuB,CAAC;YACrC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;QACxC,CAAC;QAED,CAAC;YACC,MAAM,SAAS,GAAG,qBAAS,CAAC,WAAW,EAAE,CAAC;YAC1C,oDAAoD;YACpD,SAAS,CAAC,IAAI,GAAG,kBAAU,CAAC;YAC5B,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;QAC5C,CAAC;QACD,IAAI,IAAI,CAAC,OAAO,CAAC,oBAAoB,EAAE,CAAC;YACtC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC;gBACnB,IAAI,EAAE,2CAAoB,CAAC,IAAI;gBAC/B,IAAI,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;aACtB,CAAC,CAAC;QACL,CAAC;QAED,CAAC;YACC,MAAM,uBAAuB,GAAG,iDAAuB,CAAC,WAAW,EAAE,CAAC;YACtE,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,uBAAuB,CAAC,SAAS,CAAC,CAAC;QAC1D,CAAC;IACH,CAAC;IAeD,uBAAuB,CAAC,QAA+B;QACrD,IAAI,UAAU,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE;YACrC,kBAAkB;YAClB,IAAI,CAAC,CAAC,eAAe,KAAK,CAAC,CAAC,MAAM,EAAE,CAAC;gBACnC,IAAI,CAAC,0BAA0B,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;gBACxC,OAAO,KAAK,CAAC;YACf,CAAC;YACD,OAAO,IAAI,CAAC;QACd,CAAC,CAAC,CAAC;QAEH,IAAI,IAAI,CAAC,0BAA0B,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC/C,MAAM,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,0BAA0B,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;YACzD,IAAI,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC,eAAe,KAAK,IAAI,CAAC,MAAM,EAAE,CAAC;gBAChE,UAAU,GAAG,CAAC,GAAG,IAAI,CAAC,0BAA0B,EAAE,GAAG,UAAU,CAAC,CAAC;gBACjE,IAAI,CAAC,0BAA0B,GAAG,EAAE,CAAC;YACvC,CAAC;QACH,CAAC;QACD,OAAO,UAAU,CAAC,CAAC,kCAAkC;IACvD,CAAC;IAWD,KAAK;QACH,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;IAChC,CAAC;IAED,kBAAkB,CAAC,SAAiB,EAAE,UAAkB;QACtD,MAAM,cAAc,GAAG,IAAI,CAAC,oBAAoB,CAC9C,qBAAqB,EACrB,SAAS,GAAG,CAAC,GAAG,UAAU,GAAG,CAAC,CAC/B,CAAC;QAEF,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,UAAU,EAAE,UAAU,EAAE,GAAG,MAAM,CAC7D,cAAc,EACd;YACE,SAAS,EAAE,KAAK,CAAC,MAAM,CAAC,SAAS,CAAC;YAClC,SAAS,EAAE,KAAK,CAAC,MAAM,CAAC,SAAS,CAAC;YAClC,UAAU,EAAE,KAAK,CAAC,MAAM,CAAC,UAAU,CAAC;YACpC,UAAU,EAAE,KAAK,CAAC,MAAM,CAAC,UAAU,CAAC;SACrC,CACF,CAAC;QAEF,IAAI,IAAI,CAAC,WAAW,KAAK,sBAAW,CAAC,MAAM,EAAE,CAAC;YAC5C,OAAO;gBACL,QAAQ,EAAE,SAAS;gBACnB,SAAS,EAAE,UAAU;gBACrB,SAAS,EAAE,SAAS;gBACpB,UAAU,EAAE,UAAU;aACvB,CAAC;QACJ,CAAC;aAAM,CAAC;YACN,OAAO;gBACL,QAAQ,EAAE,SAAS;gBACnB,SAAS,EAAE,UAAU;gBACrB,SAAS,EAAE,SAAS;gBACpB,UAAU,EAAE,UAAU;aACvB,CAAC;QACJ,CAAC;IACH,CAAC;IAED,oBAAoB,CAAC,KAAa,EAAE,MAAc;QAChD,OAAO,IAAA,0BAAoB,EACzB,KAAK,EACL,MAAM,EACN,IAAI,CAAC,MAAM,CAAC,YAAY,EACxB,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,SAAS,EAAE,EACnC,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC,SAAS,EAAE,EACpC,IAAI,CAAC,WAAW,KAAK,sBAAW,CAAC,MAAM,CACxC,CAAC;IACJ,CAAC;IAED,IAAI,iBAAiB;QACnB,OAAO,IAAI,CAAC,MAAM,CAAC,iBAAiB,CAAC;IACvC,CAAC;CACF;AA9ND,gCA8NC","sourcesContent":["import { setTimeout } from \"timers/promises\";\nimport { Event, binaryData, debug } from \"./imports/common\";\nimport type { Address, Transport } 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 { decode, types } = binaryData;\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, addr?: Address) => {\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(), addr);\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 +1,2 @@
|
|
|
1
|
-
|
|
1
|
+
import { binaryData } from "../imports/common";
|
|
2
|
+
export declare function encodeBuffer(obj: object, spec: binaryData.Schema): Buffer<ArrayBufferLike>;
|
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.encodeBuffer = encodeBuffer;
|
|
4
|
-
const
|
|
4
|
+
const common_1 = require("../imports/common");
|
|
5
|
+
const { encode } = common_1.binaryData;
|
|
5
6
|
function encodeBuffer(obj, spec) {
|
|
6
|
-
return
|
|
7
|
+
return encode(obj, spec);
|
|
7
8
|
}
|
|
8
9
|
//# sourceMappingURL=binary.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"binary.js","sourceRoot":"","sources":["../../../../../dtls/src/util/binary.ts"],"names":[],"mappings":";;
|
|
1
|
+
{"version":3,"file":"binary.js","sourceRoot":"","sources":["../../../../../dtls/src/util/binary.ts"],"names":[],"mappings":";;AAIA,oCAEC;AAND,8CAA+C;AAE/C,MAAM,EAAE,MAAM,EAAE,GAAG,mBAAU,CAAC;AAE9B,SAAgB,YAAY,CAAC,GAAW,EAAE,IAAuB;IAC/D,OAAO,MAAM,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;AAC3B,CAAC","sourcesContent":["import { binaryData } from \"../imports/common\";\n\nconst { encode } = binaryData;\n\nexport function encodeBuffer(obj: object, spec: binaryData.Schema) {\n return encode(obj, spec);\n}\n"]}
|