werift 0.22.1 → 0.22.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/common/src/binary.d.ts +6 -6
- package/lib/common/src/event.d.ts +1 -0
- package/lib/common/src/event.js +5 -0
- package/lib/common/src/event.js.map +1 -1
- package/lib/common/src/log.d.ts +1 -2
- package/lib/common/src/transport.d.ts +2 -1
- package/lib/common/src/transport.js +28 -14
- package/lib/common/src/transport.js.map +1 -1
- package/lib/dtls/src/cipher/prf.d.ts +12 -12
- package/lib/dtls/src/cipher/suites/aead.d.ts +3 -2
- package/lib/dtls/src/cipher/suites/aead.js +31 -38
- package/lib/dtls/src/cipher/suites/aead.js.map +1 -1
- package/lib/dtls/src/context/cipher.d.ts +4 -4
- package/lib/dtls/src/context/cipher.js +21 -10
- package/lib/dtls/src/context/cipher.js.map +1 -1
- package/lib/dtls/src/context/srtp.d.ts +3 -3
- package/lib/dtls/src/context/srtp.js.map +1 -1
- package/lib/dtls/src/flight/client/flight5.js.map +1 -1
- package/lib/dtls/src/flight/server/flight2.js.map +1 -1
- package/lib/dtls/src/handshake/extensions/ellipticCurves.d.ts +1 -1
- package/lib/dtls/src/handshake/extensions/renegotiationIndication.d.ts +2 -2
- package/lib/dtls/src/handshake/extensions/signature.d.ts +2 -2
- package/lib/dtls/src/handshake/extensions/useSrtp.d.ts +1 -1
- package/lib/dtls/src/handshake/message/alert.d.ts +1 -1
- package/lib/dtls/src/handshake/message/certificate.d.ts +1 -1
- package/lib/dtls/src/handshake/message/changeCipherSpec.d.ts +1 -1
- package/lib/dtls/src/handshake/message/client/certificateVerify.d.ts +1 -1
- package/lib/dtls/src/handshake/message/client/hello.d.ts +1 -1
- package/lib/dtls/src/handshake/message/client/keyExchange.d.ts +1 -1
- package/lib/dtls/src/handshake/message/finished.d.ts +1 -1
- package/lib/dtls/src/handshake/message/server/certificateRequest.d.ts +1 -1
- package/lib/dtls/src/handshake/message/server/hello.d.ts +1 -1
- package/lib/dtls/src/handshake/message/server/helloDone.d.ts +1 -1
- package/lib/dtls/src/handshake/message/server/helloVerifyRequest.d.ts +1 -1
- package/lib/dtls/src/handshake/message/server/keyExchange.d.ts +1 -1
- package/lib/dtls/src/handshake/random.d.ts +3 -3
- package/lib/dtls/src/record/message/fragment.d.ts +1 -1
- package/lib/dtls/src/record/message/header.d.ts +2 -19
- package/lib/dtls/src/record/message/header.js +1 -60
- package/lib/dtls/src/record/message/header.js.map +1 -1
- package/lib/dtls/src/record/message/plaintext.d.ts +6 -27
- package/lib/dtls/src/record/message/plaintext.js +34 -16
- package/lib/dtls/src/record/message/plaintext.js.map +1 -1
- package/lib/dtls/src/socket.d.ts +4 -4
- package/lib/dtls/src/socket.js.map +1 -1
- package/lib/dtls/src/util/binary.d.ts +1 -1
- package/lib/ice/src/helper.d.ts +1 -1
- package/lib/ice/src/ice.d.ts +4 -3
- package/lib/ice/src/ice.js +89 -68
- package/lib/ice/src/ice.js.map +1 -1
- package/lib/ice/src/iceBase.d.ts +20 -1
- package/lib/ice/src/iceBase.js +46 -0
- package/lib/ice/src/iceBase.js.map +1 -1
- package/lib/ice/src/stun/attributes.d.ts +2 -2
- package/lib/ice/src/stun/attributes.js +47 -27
- package/lib/ice/src/stun/attributes.js.map +1 -1
- package/lib/ice/src/stun/message.d.ts +2 -2
- package/lib/ice/src/stun/message.js +21 -23
- package/lib/ice/src/stun/message.js.map +1 -1
- package/lib/ice/src/stun/protocol.d.ts +2 -2
- package/lib/ice/src/turn/protocol.d.ts +2 -2
- package/lib/index.mjs +2252 -1474
- package/lib/nonstandard/index.mjs +308 -351
- package/lib/rtp/src/codec/av1.d.ts +2 -2
- package/lib/rtp/src/codec/opus.d.ts +1 -1
- package/lib/rtp/src/extra/container/mp4/container.js +18 -8
- package/lib/rtp/src/extra/container/mp4/container.js.map +1 -1
- package/lib/rtp/src/extra/container/mp4/h264.d.ts +2 -2
- package/lib/rtp/src/extra/container/mp4/sps-parser.d.ts +1 -1
- package/lib/rtp/src/extra/container/ogg/parser.d.ts +1 -1
- package/lib/rtp/src/extra/container/webm/container.d.ts +7 -7
- package/lib/rtp/src/extra/container/webm/container.js +17 -7
- package/lib/rtp/src/extra/container/webm/container.js.map +1 -1
- package/lib/rtp/src/extra/container/webm/ebml/ebml.d.ts +1 -1
- package/lib/rtp/src/extra/container/webm/ebml/id.d.ts +222 -222
- package/lib/rtp/src/extra/processor/depacketizerCallback.d.ts +1 -1
- package/lib/rtp/src/extra/processor/depacketizerTransformer.d.ts +6 -1
- package/lib/rtp/src/extra/processor/dtxCallback.d.ts +1 -1
- package/lib/rtp/src/extra/processor/interface.d.ts +1 -1
- package/lib/rtp/src/extra/processor/jitterBufferCallback.d.ts +1 -1
- package/lib/rtp/src/extra/processor/mp4.js +3 -0
- package/lib/rtp/src/extra/processor/mp4.js.map +1 -1
- package/lib/rtp/src/extra/processor/nackHandlerCallback.d.ts +1 -1
- package/lib/rtp/src/extra/processor/ntpTimeCallback.d.ts +1 -1
- package/lib/rtp/src/extra/processor/rtpTimeCallback.d.ts +1 -1
- package/lib/rtp/src/extra/processor/webm.d.ts +1 -1
- package/lib/rtp/src/helper.d.ts +1 -1
- package/lib/rtp/src/rtcp/header.d.ts +1 -1
- package/lib/rtp/src/rtcp/psfb/fullIntraRequest.d.ts +1 -1
- package/lib/rtp/src/rtcp/psfb/index.d.ts +1 -1
- package/lib/rtp/src/rtcp/psfb/pictureLossIndication.d.ts +1 -1
- package/lib/rtp/src/rtcp/psfb/remb.d.ts +1 -1
- package/lib/rtp/src/rtcp/rr.d.ts +2 -2
- package/lib/rtp/src/rtcp/rtcp.d.ts +1 -1
- package/lib/rtp/src/rtcp/rtpfb/index.d.ts +1 -1
- package/lib/rtp/src/rtcp/rtpfb/nack.d.ts +1 -1
- package/lib/rtp/src/rtcp/rtpfb/twcc.d.ts +4 -4
- package/lib/rtp/src/rtcp/sdes.d.ts +3 -3
- package/lib/rtp/src/rtcp/sr.d.ts +2 -2
- package/lib/rtp/src/rtp/headerExtension.d.ts +6 -6
- package/lib/rtp/src/rtp/red/packet.d.ts +2 -2
- package/lib/rtp/src/rtp/rtp.d.ts +2 -2
- package/lib/rtp/src/srtp/cipher/ctr.d.ts +4 -4
- package/lib/rtp/src/srtp/cipher/gcm.d.ts +4 -4
- package/lib/rtp/src/srtp/const.d.ts +3 -3
- package/lib/rtp/src/srtp/const.js.map +1 -1
- package/lib/rtp/src/srtp/context/context.d.ts +7 -7
- package/lib/rtp/src/srtp/context/context.js +10 -4
- package/lib/rtp/src/srtp/context/context.js.map +1 -1
- package/lib/rtp/src/srtp/context/srtcp.d.ts +3 -3
- package/lib/rtp/src/srtp/context/srtcp.js.map +1 -1
- package/lib/rtp/src/srtp/context/srtp.d.ts +3 -3
- package/lib/rtp/src/srtp/context/srtp.js.map +1 -1
- package/lib/rtp/src/srtp/srtcp.d.ts +2 -2
- package/lib/rtp/src/srtp/srtp.d.ts +2 -2
- package/lib/sctp/src/chunk.d.ts +12 -12
- package/lib/sctp/src/chunk.js +87 -66
- package/lib/sctp/src/chunk.js.map +1 -1
- package/lib/sctp/src/param.d.ts +3 -3
- package/lib/sctp/src/sctp.d.ts +3 -1
- package/lib/sctp/src/sctp.js +36 -1
- package/lib/sctp/src/sctp.js.map +1 -1
- package/lib/webrtc/src/dataChannel.d.ts +15 -4
- package/lib/webrtc/src/dataChannel.js +42 -7
- package/lib/webrtc/src/dataChannel.js.map +1 -1
- package/lib/webrtc/src/index.d.ts +1 -0
- package/lib/webrtc/src/index.js +1 -0
- package/lib/webrtc/src/index.js.map +1 -1
- package/lib/webrtc/src/media/index.d.ts +1 -0
- package/lib/webrtc/src/media/index.js +1 -0
- package/lib/webrtc/src/media/index.js.map +1 -1
- package/lib/webrtc/src/media/parameters.d.ts +2 -2
- package/lib/webrtc/src/media/parameters.js.map +1 -1
- package/lib/webrtc/src/media/router.js +2 -1
- package/lib/webrtc/src/media/router.js.map +1 -1
- package/lib/webrtc/src/media/rtpReceiver.d.ts +3 -3
- package/lib/webrtc/src/media/rtpReceiver.js +51 -2
- package/lib/webrtc/src/media/rtpReceiver.js.map +1 -1
- package/lib/webrtc/src/media/rtpSender.d.ts +6 -0
- package/lib/webrtc/src/media/rtpSender.js +78 -7
- package/lib/webrtc/src/media/rtpSender.js.map +1 -1
- package/lib/webrtc/src/media/rtpTransceiver.d.ts +12 -9
- package/lib/webrtc/src/media/rtpTransceiver.js +45 -8
- package/lib/webrtc/src/media/rtpTransceiver.js.map +1 -1
- package/lib/webrtc/src/media/stats.d.ts +279 -0
- package/lib/webrtc/src/media/stats.js +35 -1
- package/lib/webrtc/src/media/stats.js.map +1 -1
- package/lib/webrtc/src/peerConnection.d.ts +34 -64
- package/lib/webrtc/src/peerConnection.js +319 -986
- package/lib/webrtc/src/peerConnection.js.map +1 -1
- package/lib/webrtc/src/sctpManager.d.ts +27 -0
- package/lib/webrtc/src/sctpManager.js +147 -0
- package/lib/webrtc/src/sctpManager.js.map +1 -0
- package/lib/webrtc/src/sdp.d.ts +3 -2
- package/lib/webrtc/src/sdp.js +17 -7
- package/lib/webrtc/src/sdp.js.map +1 -1
- package/lib/webrtc/src/sdpManager.d.ts +78 -0
- package/lib/webrtc/src/sdpManager.js +391 -0
- package/lib/webrtc/src/sdpManager.js.map +1 -0
- package/lib/webrtc/src/secureTransportManager.d.ts +56 -0
- package/lib/webrtc/src/secureTransportManager.js +345 -0
- package/lib/webrtc/src/secureTransportManager.js.map +1 -0
- package/lib/webrtc/src/transceiverManager.d.ts +40 -0
- package/lib/webrtc/src/transceiverManager.js +355 -0
- package/lib/webrtc/src/transceiverManager.js.map +1 -0
- package/lib/webrtc/src/transport/dtls.d.ts +18 -6
- package/lib/webrtc/src/transport/dtls.js +119 -11
- package/lib/webrtc/src/transport/dtls.js.map +1 -1
- package/lib/webrtc/src/transport/ice.d.ts +24 -0
- package/lib/webrtc/src/transport/ice.js +86 -0
- package/lib/webrtc/src/transport/ice.js.map +1 -1
- package/lib/webrtc/src/transport/sctp.js +22 -7
- package/lib/webrtc/src/transport/sctp.js.map +1 -1
- package/lib/webrtc/src/utils.d.ts +3 -3
- package/lib/webrtc/src/utils.js.map +1 -1
- package/package.json +15 -21
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"flight5.js","sourceRoot":"","sources":["../../../../../../dtls/src/flight/client/flight5.ts"],"names":[],"mappings":"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","sourcesContent":["import { SignatureAlgorithm, SignatureScheme } from \"../../cipher/const\";\nimport { createCipher } from \"../../cipher/create\";\nimport { generateKeyPair } from \"../../cipher/namedCurve\";\nimport {\n prfExtendedMasterSecret,\n prfMasterSecret,\n prfPreMasterSecret,\n} from \"../../cipher/prf\";\nimport type { CipherContext } from \"../../context/cipher\";\nimport type { DtlsContext } from \"../../context/dtls\";\nimport { SrtpContext } from \"../../context/srtp\";\nimport type { TransportContext } from \"../../context/transport\";\nimport { HandshakeType } from \"../../handshake/const\";\nimport { ExtendedMasterSecret } from \"../../handshake/extensions/extendedMasterSecret\";\nimport { RenegotiationIndication } from \"../../handshake/extensions/renegotiationIndication\";\nimport { UseSRTP } from \"../../handshake/extensions/useSrtp\";\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 { ServerCertificateRequest } from \"../../handshake/message/server/certificateRequest\";\nimport { ServerHello } from \"../../handshake/message/server/hello\";\nimport { ServerHelloDone } from \"../../handshake/message/server/helloDone\";\nimport { ServerKeyExchange } from \"../../handshake/message/server/keyExchange\";\nimport { DtlsRandom } from \"../../handshake/random\";\nimport { type Profile, debug } from \"../../imports/rtp\";\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(\n \"werift-dtls : packages/dtls/src/flight/client/flight5.ts : log\",\n);\n\nexport class Flight5 extends Flight {\n constructor(\n udp: TransportContext,\n dtls: DtlsContext,\n private cipher: CipherContext,\n private srtp: SrtpContext,\n ) {\n super(udp, dtls, 5, 7);\n }\n\n handleHandshake(handshake: FragmentedHandshake) {\n this.dtls.bufferHandshakeCache([handshake], false, 4);\n const message = (() => {\n switch (handshake.msg_type) {\n case HandshakeType.server_hello_2:\n return ServerHello.deSerialize(handshake.fragment);\n case HandshakeType.certificate_11:\n return Certificate.deSerialize(handshake.fragment);\n case HandshakeType.server_key_exchange_12:\n return ServerKeyExchange.deSerialize(handshake.fragment);\n case HandshakeType.certificate_request_13:\n return ServerCertificateRequest.deSerialize(handshake.fragment);\n case HandshakeType.server_hello_done_14:\n return ServerHelloDone.deSerialize(handshake.fragment);\n }\n })();\n\n if (message) {\n handlers[message.msgType]({\n dtls: this.dtls,\n cipher: this.cipher,\n srtp: this.srtp,\n })(message);\n }\n }\n\n async exec() {\n if (this.dtls.flight === 5) {\n log(this.dtls.sessionId, \"flight5 twice\");\n this.send(this.dtls.lastMessage);\n return;\n }\n this.dtls.flight = 5;\n\n const needCertificate = this.dtls.requestedCertificateTypes.length > 0;\n log(this.dtls.sessionId, \"send flight5\", needCertificate);\n\n const messages = [\n needCertificate && this.sendCertificate(),\n this.sendClientKeyExchange(),\n needCertificate && this.sendCertificateVerify(),\n this.sendChangeCipherSpec(),\n this.sendFinished(),\n ].filter((v) => v) as Buffer[];\n\n this.dtls.lastMessage = messages;\n await this.transmit(messages);\n }\n\n private sendCertificate() {\n const certificate = new Certificate([Buffer.from(this.cipher.localCert)]);\n\n const packets = this.createPacket([certificate]);\n\n const buf = Buffer.concat(packets.map((v) => v.serialize()));\n return buf;\n }\n\n private sendClientKeyExchange() {\n if (!this.cipher.localKeyPair) throw new Error();\n\n const clientKeyExchange = new ClientKeyExchange(\n this.cipher.localKeyPair.publicKey,\n );\n const packets = this.createPacket([clientKeyExchange]);\n const buf = Buffer.concat(packets.map((v) => v.serialize()));\n\n const localKeyPair = this.cipher.localKeyPair;\n const remoteKeyPair = this.cipher.remoteKeyPair;\n\n if (!remoteKeyPair.publicKey) throw new Error(\"not exist\");\n\n const preMasterSecret = prfPreMasterSecret(\n remoteKeyPair.publicKey,\n localKeyPair.privateKey,\n localKeyPair.curve,\n );\n\n log(\n this.dtls.sessionId,\n \"extendedMasterSecret\",\n this.dtls.options.extendedMasterSecret,\n this.dtls.remoteExtendedMasterSecret,\n );\n\n const handshakes = Buffer.concat(\n this.dtls.sortedHandshakeCache.map((v) => v.serialize()),\n );\n this.cipher.masterSecret =\n this.dtls.options.extendedMasterSecret &&\n this.dtls.remoteExtendedMasterSecret\n ? prfExtendedMasterSecret(preMasterSecret, handshakes)\n : prfMasterSecret(\n preMasterSecret,\n this.cipher.localRandom.serialize(),\n this.cipher.remoteRandom.serialize(),\n );\n\n this.cipher.cipher = createCipher(this.cipher.cipherSuite);\n this.cipher.cipher.init(\n this.cipher.masterSecret,\n this.cipher.remoteRandom.serialize(),\n this.cipher.localRandom.serialize(),\n );\n log(this.dtls.sessionId, \"cipher\", this.cipher.cipher.summary);\n\n return buf;\n }\n\n private sendCertificateVerify() {\n const cache = Buffer.concat(\n this.dtls.sortedHandshakeCache.map((v) => v.serialize()),\n );\n const signed = this.cipher.signatureData(cache, \"sha256\");\n const signatureScheme = (() => {\n switch (this.cipher.signatureHashAlgorithm?.signature) {\n case SignatureAlgorithm.ecdsa_3:\n return SignatureScheme.ecdsa_secp256r1_sha256;\n case SignatureAlgorithm.rsa_1:\n return SignatureScheme.rsa_pkcs1_sha256;\n }\n })();\n if (!signatureScheme) throw new Error();\n log(\n this.dtls.sessionId,\n \"signatureScheme\",\n this.cipher.signatureHashAlgorithm?.signature,\n signatureScheme,\n );\n\n const certificateVerify = new CertificateVerify(signatureScheme, signed);\n const packets = this.createPacket([certificateVerify]);\n const buf = Buffer.concat(packets.map((v) => v.serialize()));\n return buf;\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 const localVerifyData = this.cipher.verifyData(cache);\n\n const finish = new Finished(localVerifyData);\n this.dtls.epoch = 1;\n const [packet] = this.createPacket([finish]);\n // log(\n // this.dtls.sessionId,\n // \"raw finish packet\",\n // packet.summary,\n // this.dtls.sortedHandshakeCache.map((h) => h.summary),\n // );\n\n this.dtls.recordSequenceNumber = 0;\n\n const buf = this.cipher.encryptPacket(packet).serialize();\n log(this.dtls.sessionId, \"finished\", this.cipher.cipher.summary);\n return buf;\n }\n}\n\nconst handlers: {\n [key: number]: (contexts: {\n dtls: DtlsContext;\n cipher: CipherContext;\n srtp: SrtpContext;\n }) => (message: any) => void;\n} = {};\n\nhandlers[HandshakeType.server_hello_2] =\n ({ cipher, srtp, dtls }) =>\n (message: ServerHello) => {\n log(dtls.sessionId, \"serverHello\", message.cipherSuite);\n cipher.remoteRandom = DtlsRandom.from(message.random);\n cipher.cipherSuite = message.cipherSuite;\n log(dtls.sessionId, \"selected cipherSuite\", cipher.cipherSuite);\n\n if (message.extensions) {\n message.extensions.forEach((extension) => {\n switch (extension.type) {\n case UseSRTP.type:\n {\n const useSrtp = UseSRTP.fromData(extension.data);\n const profile = SrtpContext.findMatchingSRTPProfile(\n useSrtp.profiles as Profile[],\n dtls.options.srtpProfiles || [],\n );\n log(dtls.sessionId, \"selected srtp profile\", profile);\n if (profile == undefined) return;\n srtp.srtpProfile = profile;\n }\n break;\n case ExtendedMasterSecret.type:\n dtls.remoteExtendedMasterSecret = true;\n break;\n case RenegotiationIndication.type:\n log(dtls.sessionId, \"RenegotiationIndication\");\n break;\n }\n });\n }\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.server_key_exchange_12] =\n ({ cipher, dtls }) =>\n (message: ServerKeyExchange) => {\n if (!cipher.localRandom || !cipher.remoteRandom) throw new Error();\n log(dtls.sessionId, \"ServerKeyExchange\", message);\n\n log(dtls.sessionId, \"selected curve\", message.namedCurve);\n cipher.remoteKeyPair = {\n curve: message.namedCurve,\n publicKey: message.publicKey,\n };\n cipher.localKeyPair = generateKeyPair(message.namedCurve);\n };\n\nhandlers[HandshakeType.certificate_request_13] =\n ({ dtls }) =>\n (message: ServerCertificateRequest) => {\n log(dtls.sessionId, \"certificate_request\", message);\n dtls.requestedCertificateTypes = message.certificateTypes;\n dtls.requestedSignatureAlgorithms = message.signatures;\n };\n\nhandlers[HandshakeType.server_hello_done_14] =\n ({ dtls }) =>\n (msg) => {\n log(dtls.sessionId, \"server_hello_done\", msg);\n };\n"]}
|
|
1
|
+
{"version":3,"file":"flight5.js","sourceRoot":"","sources":["../../../../../../dtls/src/flight/client/flight5.ts"],"names":[],"mappings":"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","sourcesContent":["import { SignatureAlgorithm, SignatureScheme } from \"../../cipher/const\";\nimport { createCipher } from \"../../cipher/create\";\nimport { generateKeyPair } from \"../../cipher/namedCurve\";\nimport {\n prfExtendedMasterSecret,\n prfMasterSecret,\n prfPreMasterSecret,\n} from \"../../cipher/prf\";\nimport type { CipherContext } from \"../../context/cipher\";\nimport type { DtlsContext } from \"../../context/dtls\";\nimport { SrtpContext } from \"../../context/srtp\";\nimport type { TransportContext } from \"../../context/transport\";\nimport { HandshakeType } from \"../../handshake/const\";\nimport { ExtendedMasterSecret } from \"../../handshake/extensions/extendedMasterSecret\";\nimport { RenegotiationIndication } from \"../../handshake/extensions/renegotiationIndication\";\nimport { UseSRTP } from \"../../handshake/extensions/useSrtp\";\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 { ServerCertificateRequest } from \"../../handshake/message/server/certificateRequest\";\nimport { ServerHello } from \"../../handshake/message/server/hello\";\nimport { ServerHelloDone } from \"../../handshake/message/server/helloDone\";\nimport { ServerKeyExchange } from \"../../handshake/message/server/keyExchange\";\nimport { DtlsRandom } from \"../../handshake/random\";\nimport { type SrtpProfile, debug } from \"../../imports/rtp\";\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(\n \"werift-dtls : packages/dtls/src/flight/client/flight5.ts : log\",\n);\n\nexport class Flight5 extends Flight {\n constructor(\n udp: TransportContext,\n dtls: DtlsContext,\n private cipher: CipherContext,\n private srtp: SrtpContext,\n ) {\n super(udp, dtls, 5, 7);\n }\n\n handleHandshake(handshake: FragmentedHandshake) {\n this.dtls.bufferHandshakeCache([handshake], false, 4);\n const message = (() => {\n switch (handshake.msg_type) {\n case HandshakeType.server_hello_2:\n return ServerHello.deSerialize(handshake.fragment);\n case HandshakeType.certificate_11:\n return Certificate.deSerialize(handshake.fragment);\n case HandshakeType.server_key_exchange_12:\n return ServerKeyExchange.deSerialize(handshake.fragment);\n case HandshakeType.certificate_request_13:\n return ServerCertificateRequest.deSerialize(handshake.fragment);\n case HandshakeType.server_hello_done_14:\n return ServerHelloDone.deSerialize(handshake.fragment);\n }\n })();\n\n if (message) {\n handlers[message.msgType]({\n dtls: this.dtls,\n cipher: this.cipher,\n srtp: this.srtp,\n })(message);\n }\n }\n\n async exec() {\n if (this.dtls.flight === 5) {\n log(this.dtls.sessionId, \"flight5 twice\");\n this.send(this.dtls.lastMessage);\n return;\n }\n this.dtls.flight = 5;\n\n const needCertificate = this.dtls.requestedCertificateTypes.length > 0;\n log(this.dtls.sessionId, \"send flight5\", needCertificate);\n\n const messages = [\n needCertificate && this.sendCertificate(),\n this.sendClientKeyExchange(),\n needCertificate && this.sendCertificateVerify(),\n this.sendChangeCipherSpec(),\n this.sendFinished(),\n ].filter((v) => v) as Buffer[];\n\n this.dtls.lastMessage = messages;\n await this.transmit(messages);\n }\n\n private sendCertificate() {\n const certificate = new Certificate([Buffer.from(this.cipher.localCert)]);\n\n const packets = this.createPacket([certificate]);\n\n const buf = Buffer.concat(packets.map((v) => v.serialize()));\n return buf;\n }\n\n private sendClientKeyExchange() {\n if (!this.cipher.localKeyPair) throw new Error();\n\n const clientKeyExchange = new ClientKeyExchange(\n this.cipher.localKeyPair.publicKey,\n );\n const packets = this.createPacket([clientKeyExchange]);\n const buf = Buffer.concat(packets.map((v) => v.serialize()));\n\n const localKeyPair = this.cipher.localKeyPair;\n const remoteKeyPair = this.cipher.remoteKeyPair;\n\n if (!remoteKeyPair.publicKey) throw new Error(\"not exist\");\n\n const preMasterSecret = prfPreMasterSecret(\n remoteKeyPair.publicKey,\n localKeyPair.privateKey,\n localKeyPair.curve,\n );\n\n log(\n this.dtls.sessionId,\n \"extendedMasterSecret\",\n this.dtls.options.extendedMasterSecret,\n this.dtls.remoteExtendedMasterSecret,\n );\n\n const handshakes = Buffer.concat(\n this.dtls.sortedHandshakeCache.map((v) => v.serialize()),\n );\n this.cipher.masterSecret =\n this.dtls.options.extendedMasterSecret &&\n this.dtls.remoteExtendedMasterSecret\n ? prfExtendedMasterSecret(preMasterSecret, handshakes)\n : prfMasterSecret(\n preMasterSecret,\n this.cipher.localRandom.serialize(),\n this.cipher.remoteRandom.serialize(),\n );\n\n this.cipher.cipher = createCipher(this.cipher.cipherSuite);\n this.cipher.cipher.init(\n this.cipher.masterSecret,\n this.cipher.remoteRandom.serialize(),\n this.cipher.localRandom.serialize(),\n );\n log(this.dtls.sessionId, \"cipher\", this.cipher.cipher.summary);\n\n return buf;\n }\n\n private sendCertificateVerify() {\n const cache = Buffer.concat(\n this.dtls.sortedHandshakeCache.map((v) => v.serialize()),\n );\n const signed = this.cipher.signatureData(cache, \"sha256\");\n const signatureScheme = (() => {\n switch (this.cipher.signatureHashAlgorithm?.signature) {\n case SignatureAlgorithm.ecdsa_3:\n return SignatureScheme.ecdsa_secp256r1_sha256;\n case SignatureAlgorithm.rsa_1:\n return SignatureScheme.rsa_pkcs1_sha256;\n }\n })();\n if (!signatureScheme) throw new Error();\n log(\n this.dtls.sessionId,\n \"signatureScheme\",\n this.cipher.signatureHashAlgorithm?.signature,\n signatureScheme,\n );\n\n const certificateVerify = new CertificateVerify(signatureScheme, signed);\n const packets = this.createPacket([certificateVerify]);\n const buf = Buffer.concat(packets.map((v) => v.serialize()));\n return buf;\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 const localVerifyData = this.cipher.verifyData(cache);\n\n const finish = new Finished(localVerifyData);\n this.dtls.epoch = 1;\n const [packet] = this.createPacket([finish]);\n // log(\n // this.dtls.sessionId,\n // \"raw finish packet\",\n // packet.summary,\n // this.dtls.sortedHandshakeCache.map((h) => h.summary),\n // );\n\n this.dtls.recordSequenceNumber = 0;\n\n const buf = this.cipher.encryptPacket(packet).serialize();\n log(this.dtls.sessionId, \"finished\", this.cipher.cipher.summary);\n return buf;\n }\n}\n\nconst handlers: {\n [key: number]: (contexts: {\n dtls: DtlsContext;\n cipher: CipherContext;\n srtp: SrtpContext;\n }) => (message: any) => void;\n} = {};\n\nhandlers[HandshakeType.server_hello_2] =\n ({ cipher, srtp, dtls }) =>\n (message: ServerHello) => {\n log(dtls.sessionId, \"serverHello\", message.cipherSuite);\n cipher.remoteRandom = DtlsRandom.from(message.random);\n cipher.cipherSuite = message.cipherSuite;\n log(dtls.sessionId, \"selected cipherSuite\", cipher.cipherSuite);\n\n if (message.extensions) {\n message.extensions.forEach((extension) => {\n switch (extension.type) {\n case UseSRTP.type:\n {\n const useSrtp = UseSRTP.fromData(extension.data);\n const profile = SrtpContext.findMatchingSRTPProfile(\n useSrtp.profiles as SrtpProfile[],\n dtls.options.srtpProfiles || [],\n );\n log(dtls.sessionId, \"selected srtp profile\", profile);\n if (profile == undefined) return;\n srtp.srtpProfile = profile;\n }\n break;\n case ExtendedMasterSecret.type:\n dtls.remoteExtendedMasterSecret = true;\n break;\n case RenegotiationIndication.type:\n log(dtls.sessionId, \"RenegotiationIndication\");\n break;\n }\n });\n }\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.server_key_exchange_12] =\n ({ cipher, dtls }) =>\n (message: ServerKeyExchange) => {\n if (!cipher.localRandom || !cipher.remoteRandom) throw new Error();\n log(dtls.sessionId, \"ServerKeyExchange\", message);\n\n log(dtls.sessionId, \"selected curve\", message.namedCurve);\n cipher.remoteKeyPair = {\n curve: message.namedCurve,\n publicKey: message.publicKey,\n };\n cipher.localKeyPair = generateKeyPair(message.namedCurve);\n };\n\nhandlers[HandshakeType.certificate_request_13] =\n ({ dtls }) =>\n (message: ServerCertificateRequest) => {\n log(dtls.sessionId, \"certificate_request\", message);\n dtls.requestedCertificateTypes = message.certificateTypes;\n dtls.requestedSignatureAlgorithms = message.signatures;\n };\n\nhandlers[HandshakeType.server_hello_done_14] =\n ({ dtls }) =>\n (msg) => {\n log(dtls.sessionId, \"server_hello_done\", msg);\n };\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"flight2.js","sourceRoot":"","sources":["../../../../../../dtls/src/flight/server/flight2.ts"],"names":[],"mappings":"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","sourcesContent":["import { randomBytes } from \"crypto\";\n\nimport {\n CipherSuite,\n NamedCurveAlgorithmList,\n type NamedCurveAlgorithms,\n SignatureAlgorithm,\n} from \"../../cipher/const\";\nimport { generateKeyPair } from \"../../cipher/namedCurve\";\nimport type { CipherContext } from \"../../context/cipher\";\nimport type { DtlsContext } from \"../../context/dtls\";\nimport { SrtpContext } from \"../../context/srtp\";\nimport type { 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 { ClientHello } from \"../../handshake/message/client/hello\";\nimport { ServerHelloVerifyRequest } from \"../../handshake/message/server/helloVerifyRequest\";\nimport { DtlsRandom } from \"../../handshake/random\";\nimport { type Profile, debug } from \"../../imports/rtp\";\nimport { createFragments, createPlaintext } from \"../../record/builder\";\nimport { ContentType } from \"../../record/const\";\n\nconst log = debug(\"werift-dtls : packages/dtls/flight/server/flight2.ts : log\");\n\n// HelloVerifyRequest do not retransmit\n\nexport const flight2 =\n (\n udp: TransportContext,\n dtls: DtlsContext,\n cipher: CipherContext,\n srtp: SrtpContext,\n ) =>\n (clientHello: ClientHello) => {\n log(\"dtls version\", clientHello.clientVersion);\n\n dtls.flight = 2;\n\n // if flight 2 restarts due to packet loss, sequence numbers are reused from the top:\n // https://datatracker.ietf.org/doc/html/rfc6347#section-4.2.2\n // The first message each side transmits in each handshake always has\n // message_seq = 0. Whenever each new message is generated, the\n // message_seq value is incremented by one. Note that in the case of a\n // rehandshake, this implies that the HelloRequest will have message_seq = 0\n // and the ServerHello will have message_seq = 1. When a message is\n // retransmitted, the same message_seq value is used.\n dtls.recordSequenceNumber = 0;\n dtls.sequenceNumber = 0;\n\n clientHello.extensions.forEach((extension) => {\n switch (extension.type) {\n case EllipticCurves.type:\n {\n const curves = EllipticCurves.fromData(extension.data).data;\n log(dtls.sessionId, \"curves\", curves);\n const curve = curves.filter((curve) =>\n NamedCurveAlgorithmList.includes(curve as any),\n )[0] as NamedCurveAlgorithms;\n cipher.namedCurve = curve;\n log(dtls.sessionId, \"curve selected\", cipher.namedCurve);\n }\n break;\n case Signature.type:\n {\n if (!cipher.signatureHashAlgorithm)\n throw new Error(\"need to set certificate\");\n\n const signatureHash = Signature.fromData(extension.data).data;\n log(dtls.sessionId, \"hash,signature\", signatureHash);\n const signature = signatureHash.find(\n (v) => v.signature === cipher.signatureHashAlgorithm?.signature,\n )?.signature;\n const hash = signatureHash.find(\n (v) => v.hash === cipher.signatureHashAlgorithm?.hash,\n )?.hash;\n if (signature == undefined || hash == undefined) {\n throw new Error(\"invalid signatureHash\");\n }\n }\n break;\n case UseSRTP.type:\n {\n if (!dtls.options?.srtpProfiles) return;\n if (dtls.options.srtpProfiles.length === 0) return;\n\n const useSrtp = UseSRTP.fromData(extension.data);\n log(dtls.sessionId, \"srtp profiles\", useSrtp.profiles);\n const profile = SrtpContext.findMatchingSRTPProfile(\n useSrtp.profiles as Profile[],\n dtls.options?.srtpProfiles,\n );\n if (!profile) {\n throw new Error();\n }\n srtp.srtpProfile = profile;\n log(dtls.sessionId, \"srtp profile selected\", srtp.srtpProfile);\n }\n break;\n case ExtendedMasterSecret.type:\n {\n dtls.remoteExtendedMasterSecret = true;\n }\n break;\n case RenegotiationIndication.type:\n {\n log(dtls.sessionId, \"RenegotiationIndication\", extension.data);\n }\n break;\n case 43:\n {\n // todo dtls1.3\n const data = extension.data.subarray(1);\n const versions = [...data].map((v) => v.toString(10));\n log(\"dtls supported version\", versions);\n }\n break;\n }\n });\n\n cipher.localRandom = new DtlsRandom();\n cipher.remoteRandom = DtlsRandom.from(clientHello.random);\n\n const suites = clientHello.cipherSuites;\n log(dtls.sessionId, \"cipher suites\", suites);\n const suite = (() => {\n switch (cipher.signatureHashAlgorithm?.signature) {\n case SignatureAlgorithm.ecdsa_3:\n return CipherSuite.TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256_49195;\n case SignatureAlgorithm.rsa_1:\n return CipherSuite.TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256_49199;\n }\n })();\n if (suite === undefined || !suites.includes(suite)) {\n throw new Error(\"dtls cipher suite negotiation failed\");\n }\n cipher.cipherSuite = suite;\n log(dtls.sessionId, \"selected cipherSuite\", cipher.cipherSuite);\n\n cipher.localKeyPair = generateKeyPair(cipher.namedCurve);\n\n dtls.cookie ||= randomBytes(20);\n const helloVerifyReq = new ServerHelloVerifyRequest(\n {\n major: 255 - 1,\n minor: 255 - 2,\n },\n dtls.cookie,\n );\n const fragments = createFragments(dtls)([helloVerifyReq]);\n const packets = createPlaintext(dtls)(\n fragments.map((fragment) => ({\n type: ContentType.handshake,\n fragment: fragment.serialize(),\n })),\n ++dtls.recordSequenceNumber,\n );\n\n const chunk = packets.map((v) => v.serialize());\n for (const buf of chunk) {\n udp.send(buf);\n }\n };\n"]}
|
|
1
|
+
{"version":3,"file":"flight2.js","sourceRoot":"","sources":["../../../../../../dtls/src/flight/server/flight2.ts"],"names":[],"mappings":"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","sourcesContent":["import { randomBytes } from \"crypto\";\n\nimport {\n CipherSuite,\n NamedCurveAlgorithmList,\n type NamedCurveAlgorithms,\n SignatureAlgorithm,\n} from \"../../cipher/const\";\nimport { generateKeyPair } from \"../../cipher/namedCurve\";\nimport type { CipherContext } from \"../../context/cipher\";\nimport type { DtlsContext } from \"../../context/dtls\";\nimport { SrtpContext } from \"../../context/srtp\";\nimport type { 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 { ClientHello } from \"../../handshake/message/client/hello\";\nimport { ServerHelloVerifyRequest } from \"../../handshake/message/server/helloVerifyRequest\";\nimport { DtlsRandom } from \"../../handshake/random\";\nimport { type SrtpProfile, debug } from \"../../imports/rtp\";\nimport { createFragments, createPlaintext } from \"../../record/builder\";\nimport { ContentType } from \"../../record/const\";\n\nconst log = debug(\"werift-dtls : packages/dtls/flight/server/flight2.ts : log\");\n\n// HelloVerifyRequest do not retransmit\n\nexport const flight2 =\n (\n udp: TransportContext,\n dtls: DtlsContext,\n cipher: CipherContext,\n srtp: SrtpContext,\n ) =>\n (clientHello: ClientHello) => {\n log(\"dtls version\", clientHello.clientVersion);\n\n dtls.flight = 2;\n\n // if flight 2 restarts due to packet loss, sequence numbers are reused from the top:\n // https://datatracker.ietf.org/doc/html/rfc6347#section-4.2.2\n // The first message each side transmits in each handshake always has\n // message_seq = 0. Whenever each new message is generated, the\n // message_seq value is incremented by one. Note that in the case of a\n // rehandshake, this implies that the HelloRequest will have message_seq = 0\n // and the ServerHello will have message_seq = 1. When a message is\n // retransmitted, the same message_seq value is used.\n dtls.recordSequenceNumber = 0;\n dtls.sequenceNumber = 0;\n\n clientHello.extensions.forEach((extension) => {\n switch (extension.type) {\n case EllipticCurves.type:\n {\n const curves = EllipticCurves.fromData(extension.data).data;\n log(dtls.sessionId, \"curves\", curves);\n const curve = curves.filter((curve) =>\n NamedCurveAlgorithmList.includes(curve as any),\n )[0] as NamedCurveAlgorithms;\n cipher.namedCurve = curve;\n log(dtls.sessionId, \"curve selected\", cipher.namedCurve);\n }\n break;\n case Signature.type:\n {\n if (!cipher.signatureHashAlgorithm)\n throw new Error(\"need to set certificate\");\n\n const signatureHash = Signature.fromData(extension.data).data;\n log(dtls.sessionId, \"hash,signature\", signatureHash);\n const signature = signatureHash.find(\n (v) => v.signature === cipher.signatureHashAlgorithm?.signature,\n )?.signature;\n const hash = signatureHash.find(\n (v) => v.hash === cipher.signatureHashAlgorithm?.hash,\n )?.hash;\n if (signature == undefined || hash == undefined) {\n throw new Error(\"invalid signatureHash\");\n }\n }\n break;\n case UseSRTP.type:\n {\n if (!dtls.options?.srtpProfiles) return;\n if (dtls.options.srtpProfiles.length === 0) return;\n\n const useSrtp = UseSRTP.fromData(extension.data);\n log(dtls.sessionId, \"srtp profiles\", useSrtp.profiles);\n const profile = SrtpContext.findMatchingSRTPProfile(\n useSrtp.profiles as SrtpProfile[],\n dtls.options?.srtpProfiles,\n );\n if (!profile) {\n throw new Error();\n }\n srtp.srtpProfile = profile;\n log(dtls.sessionId, \"srtp profile selected\", srtp.srtpProfile);\n }\n break;\n case ExtendedMasterSecret.type:\n {\n dtls.remoteExtendedMasterSecret = true;\n }\n break;\n case RenegotiationIndication.type:\n {\n log(dtls.sessionId, \"RenegotiationIndication\", extension.data);\n }\n break;\n case 43:\n {\n // todo dtls1.3\n const data = extension.data.subarray(1);\n const versions = [...data].map((v) => v.toString(10));\n log(\"dtls supported version\", versions);\n }\n break;\n }\n });\n\n cipher.localRandom = new DtlsRandom();\n cipher.remoteRandom = DtlsRandom.from(clientHello.random);\n\n const suites = clientHello.cipherSuites;\n log(dtls.sessionId, \"cipher suites\", suites);\n const suite = (() => {\n switch (cipher.signatureHashAlgorithm?.signature) {\n case SignatureAlgorithm.ecdsa_3:\n return CipherSuite.TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256_49195;\n case SignatureAlgorithm.rsa_1:\n return CipherSuite.TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256_49199;\n }\n })();\n if (suite === undefined || !suites.includes(suite)) {\n throw new Error(\"dtls cipher suite negotiation failed\");\n }\n cipher.cipherSuite = suite;\n log(dtls.sessionId, \"selected cipherSuite\", cipher.cipherSuite);\n\n cipher.localKeyPair = generateKeyPair(cipher.namedCurve);\n\n dtls.cookie ||= randomBytes(20);\n const helloVerifyReq = new ServerHelloVerifyRequest(\n {\n major: 255 - 1,\n minor: 255 - 2,\n },\n dtls.cookie,\n );\n const fragments = createFragments(dtls)([helloVerifyReq]);\n const packets = createPlaintext(dtls)(\n fragments.map((fragment) => ({\n type: ContentType.handshake,\n fragment: fragment.serialize(),\n })),\n ++dtls.recordSequenceNumber,\n );\n\n const chunk = packets.map((v) => v.serialize());\n for (const buf of chunk) {\n udp.send(buf);\n }\n };\n"]}
|
|
@@ -11,6 +11,6 @@ export declare class EllipticCurves {
|
|
|
11
11
|
static createEmpty(): EllipticCurves;
|
|
12
12
|
static fromData(buf: Buffer): EllipticCurves;
|
|
13
13
|
static deSerialize(buf: Buffer): EllipticCurves;
|
|
14
|
-
serialize(): Buffer
|
|
14
|
+
serialize(): Buffer<ArrayBuffer>;
|
|
15
15
|
get extension(): Extension;
|
|
16
16
|
}
|
|
@@ -9,9 +9,9 @@ export declare class RenegotiationIndication {
|
|
|
9
9
|
constructor(props?: Partial<RenegotiationIndication>);
|
|
10
10
|
static createEmpty(): RenegotiationIndication;
|
|
11
11
|
static deSerialize(buf: Buffer): RenegotiationIndication;
|
|
12
|
-
serialize(): Buffer
|
|
12
|
+
serialize(): Buffer<ArrayBuffer>;
|
|
13
13
|
get extension(): {
|
|
14
14
|
type: number;
|
|
15
|
-
data: Buffer
|
|
15
|
+
data: Buffer<ArrayBuffer>;
|
|
16
16
|
};
|
|
17
17
|
}
|
|
@@ -13,10 +13,10 @@ export declare class Signature {
|
|
|
13
13
|
constructor(props?: Partial<Signature>);
|
|
14
14
|
static createEmpty(): Signature;
|
|
15
15
|
static deSerialize(buf: Buffer): Signature;
|
|
16
|
-
serialize(): Buffer
|
|
16
|
+
serialize(): Buffer<ArrayBuffer>;
|
|
17
17
|
static fromData(buf: Buffer): Signature;
|
|
18
18
|
get extension(): {
|
|
19
19
|
type: number;
|
|
20
|
-
data: Buffer
|
|
20
|
+
data: Buffer<ArrayBuffer>;
|
|
21
21
|
};
|
|
22
22
|
}
|
|
@@ -12,7 +12,7 @@ export declare class UseSRTP {
|
|
|
12
12
|
constructor(props?: Partial<UseSRTP>);
|
|
13
13
|
static create(profiles: number[], mki: Buffer): UseSRTP;
|
|
14
14
|
static deSerialize(buf: Buffer): UseSRTP;
|
|
15
|
-
serialize(): Buffer
|
|
15
|
+
serialize(): Buffer<ArrayBuffer>;
|
|
16
16
|
static fromData(buf: Buffer): UseSRTP;
|
|
17
17
|
get extension(): Extension;
|
|
18
18
|
}
|
|
@@ -11,6 +11,6 @@ export declare class Certificate implements Handshake {
|
|
|
11
11
|
constructor(certificateList: Buffer[]);
|
|
12
12
|
static createEmpty(): Certificate;
|
|
13
13
|
static deSerialize(buf: Buffer): Certificate;
|
|
14
|
-
serialize(): Buffer
|
|
14
|
+
serialize(): Buffer<ArrayBuffer>;
|
|
15
15
|
toFragment(): FragmentedHandshake;
|
|
16
16
|
}
|
|
@@ -14,6 +14,6 @@ export declare class CertificateVerify implements Handshake {
|
|
|
14
14
|
constructor(algorithm: SignatureSchemes, signature: Buffer);
|
|
15
15
|
static createEmpty(): CertificateVerify;
|
|
16
16
|
static deSerialize(buf: Buffer): CertificateVerify;
|
|
17
|
-
serialize(): Buffer
|
|
17
|
+
serialize(): Buffer<ArrayBuffer>;
|
|
18
18
|
toFragment(): FragmentedHandshake;
|
|
19
19
|
}
|
|
@@ -41,6 +41,6 @@ export declare class ClientHello {
|
|
|
41
41
|
}, sessionId: Buffer, cookie: Buffer, cipherSuites: number[], compressionMethods: number[], extensions: Extension[]);
|
|
42
42
|
static createEmpty(): ClientHello;
|
|
43
43
|
static deSerialize(buf: Buffer): ClientHello;
|
|
44
|
-
serialize(): Buffer
|
|
44
|
+
serialize(): Buffer<ArrayBuffer>;
|
|
45
45
|
toFragment(): FragmentedHandshake;
|
|
46
46
|
}
|
|
@@ -11,6 +11,6 @@ export declare class ClientKeyExchange implements Handshake {
|
|
|
11
11
|
constructor(publicKey: Buffer);
|
|
12
12
|
static createEmpty(): ClientKeyExchange;
|
|
13
13
|
static deSerialize(buf: Buffer): ClientKeyExchange;
|
|
14
|
-
serialize(): Buffer
|
|
14
|
+
serialize(): Buffer<ArrayBuffer>;
|
|
15
15
|
toFragment(): FragmentedHandshake;
|
|
16
16
|
}
|
|
@@ -8,6 +8,6 @@ export declare class Finished implements Handshake {
|
|
|
8
8
|
constructor(verifyData: Buffer);
|
|
9
9
|
static createEmpty(): Finished;
|
|
10
10
|
static deSerialize(buf: Buffer): Finished;
|
|
11
|
-
serialize(): Buffer
|
|
11
|
+
serialize(): Buffer<ArrayBufferLike>;
|
|
12
12
|
toFragment(): FragmentedHandshake;
|
|
13
13
|
}
|
|
@@ -22,6 +22,6 @@ export declare class ServerCertificateRequest implements Handshake {
|
|
|
22
22
|
}[], authorities: number[]);
|
|
23
23
|
static createEmpty(): ServerCertificateRequest;
|
|
24
24
|
static deSerialize(buf: Buffer): ServerCertificateRequest;
|
|
25
|
-
serialize(): Buffer
|
|
25
|
+
serialize(): Buffer<ArrayBuffer>;
|
|
26
26
|
toFragment(): FragmentedHandshake;
|
|
27
27
|
}
|
|
@@ -27,6 +27,6 @@ export declare class ServerHello implements Handshake {
|
|
|
27
27
|
constructor(serverVersion: Version, random: Random, sessionId: Buffer, cipherSuite: CipherSuites, compressionMethod: number, extensions: Extension[]);
|
|
28
28
|
static createEmpty(): ServerHello;
|
|
29
29
|
static deSerialize(buf: Buffer): ServerHello;
|
|
30
|
-
serialize(): Buffer
|
|
30
|
+
serialize(): Buffer<ArrayBuffer>;
|
|
31
31
|
toFragment(): FragmentedHandshake;
|
|
32
32
|
}
|
|
@@ -7,6 +7,6 @@ export declare class ServerHelloDone implements Handshake {
|
|
|
7
7
|
static readonly spec: {};
|
|
8
8
|
static createEmpty(): ServerHelloDone;
|
|
9
9
|
static deSerialize(buf: Buffer): ServerHelloDone;
|
|
10
|
-
serialize(): Buffer
|
|
10
|
+
serialize(): Buffer<ArrayBuffer>;
|
|
11
11
|
toFragment(): FragmentedHandshake;
|
|
12
12
|
}
|
|
@@ -22,7 +22,7 @@ export declare class ServerHelloVerifyRequest implements Handshake {
|
|
|
22
22
|
}, cookie: Buffer);
|
|
23
23
|
static createEmpty(): ServerHelloVerifyRequest;
|
|
24
24
|
static deSerialize(buf: Buffer): ServerHelloVerifyRequest;
|
|
25
|
-
serialize(): Buffer
|
|
25
|
+
serialize(): Buffer<ArrayBuffer>;
|
|
26
26
|
get version(): {
|
|
27
27
|
major: number;
|
|
28
28
|
minor: number;
|
|
@@ -26,6 +26,6 @@ export declare class ServerKeyExchange implements Handshake {
|
|
|
26
26
|
constructor(ellipticCurveType: CurveTypes, namedCurve: NamedCurveAlgorithms, publicKeyLength: number, publicKey: Buffer, hashAlgorithm: number, signatureAlgorithm: number, signatureLength: number, signature: Buffer);
|
|
27
27
|
static createEmpty(): ServerKeyExchange;
|
|
28
28
|
static deSerialize(buf: Buffer): ServerKeyExchange;
|
|
29
|
-
serialize(): Buffer
|
|
29
|
+
serialize(): Buffer<ArrayBuffer>;
|
|
30
30
|
toFragment(): FragmentedHandshake;
|
|
31
31
|
}
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
export declare class DtlsRandom {
|
|
2
2
|
gmt_unix_time: number;
|
|
3
|
-
random_bytes: Buffer
|
|
3
|
+
random_bytes: Buffer<ArrayBufferLike>;
|
|
4
4
|
static readonly spec: {
|
|
5
5
|
gmt_unix_time: number;
|
|
6
6
|
random_bytes: any;
|
|
7
7
|
};
|
|
8
|
-
constructor(gmt_unix_time?: number, random_bytes?: Buffer);
|
|
8
|
+
constructor(gmt_unix_time?: number, random_bytes?: Buffer<ArrayBufferLike>);
|
|
9
9
|
static deSerialize(buf: Buffer): DtlsRandom;
|
|
10
10
|
static from(spec: typeof DtlsRandom.spec): DtlsRandom;
|
|
11
|
-
serialize(): Buffer
|
|
11
|
+
serialize(): Buffer<ArrayBuffer>;
|
|
12
12
|
}
|
|
@@ -18,7 +18,7 @@ export declare class FragmentedHandshake {
|
|
|
18
18
|
get summary(): any;
|
|
19
19
|
static createEmpty(): FragmentedHandshake;
|
|
20
20
|
static deSerialize(buf: Buffer): FragmentedHandshake;
|
|
21
|
-
serialize(): Buffer
|
|
21
|
+
serialize(): Buffer<ArrayBuffer>;
|
|
22
22
|
chunk(maxFragmentLength?: number): FragmentedHandshake[];
|
|
23
23
|
static assemble(messages: FragmentedHandshake[]): FragmentedHandshake;
|
|
24
24
|
static findAllFragments(fragments: FragmentedHandshake[], type: HandshakeType): FragmentedHandshake[];
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export
|
|
1
|
+
export interface DtlsPlaintextHeader {
|
|
2
2
|
contentType: number;
|
|
3
3
|
protocolVersion: {
|
|
4
4
|
major: number;
|
|
@@ -7,23 +7,6 @@ export declare class DtlsPlaintextHeader {
|
|
|
7
7
|
epoch: number;
|
|
8
8
|
sequenceNumber: number;
|
|
9
9
|
contentLen: number;
|
|
10
|
-
static readonly spec: {
|
|
11
|
-
contentType: number;
|
|
12
|
-
protocolVersion: {
|
|
13
|
-
major: number;
|
|
14
|
-
minor: number;
|
|
15
|
-
};
|
|
16
|
-
epoch: number;
|
|
17
|
-
sequenceNumber: number;
|
|
18
|
-
contentLen: number;
|
|
19
|
-
};
|
|
20
|
-
constructor(contentType: number, protocolVersion: {
|
|
21
|
-
major: number;
|
|
22
|
-
minor: number;
|
|
23
|
-
}, epoch: number, sequenceNumber: number, contentLen: number);
|
|
24
|
-
static createEmpty(): DtlsPlaintextHeader;
|
|
25
|
-
static deSerialize(buf: Buffer): DtlsPlaintextHeader;
|
|
26
|
-
serialize(): Buffer;
|
|
27
10
|
}
|
|
28
11
|
export declare class MACHeader {
|
|
29
12
|
epoch: number;
|
|
@@ -50,5 +33,5 @@ export declare class MACHeader {
|
|
|
50
33
|
}, contentLen: number);
|
|
51
34
|
static createEmpty(): MACHeader;
|
|
52
35
|
static deSerialize(buf: Buffer): MACHeader;
|
|
53
|
-
serialize(): Buffer
|
|
36
|
+
serialize(): Buffer<ArrayBuffer>;
|
|
54
37
|
}
|
|
@@ -1,67 +1,8 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.MACHeader =
|
|
3
|
+
exports.MACHeader = void 0;
|
|
4
4
|
const binary_data_1 = require("@shinyoshiaki/binary-data");
|
|
5
5
|
const binary_1 = require("../../handshake/binary");
|
|
6
|
-
class DtlsPlaintextHeader {
|
|
7
|
-
constructor(contentType, protocolVersion, epoch, sequenceNumber, contentLen) {
|
|
8
|
-
Object.defineProperty(this, "contentType", {
|
|
9
|
-
enumerable: true,
|
|
10
|
-
configurable: true,
|
|
11
|
-
writable: true,
|
|
12
|
-
value: contentType
|
|
13
|
-
});
|
|
14
|
-
Object.defineProperty(this, "protocolVersion", {
|
|
15
|
-
enumerable: true,
|
|
16
|
-
configurable: true,
|
|
17
|
-
writable: true,
|
|
18
|
-
value: protocolVersion
|
|
19
|
-
});
|
|
20
|
-
Object.defineProperty(this, "epoch", {
|
|
21
|
-
enumerable: true,
|
|
22
|
-
configurable: true,
|
|
23
|
-
writable: true,
|
|
24
|
-
value: epoch
|
|
25
|
-
});
|
|
26
|
-
Object.defineProperty(this, "sequenceNumber", {
|
|
27
|
-
enumerable: true,
|
|
28
|
-
configurable: true,
|
|
29
|
-
writable: true,
|
|
30
|
-
value: sequenceNumber
|
|
31
|
-
});
|
|
32
|
-
Object.defineProperty(this, "contentLen", {
|
|
33
|
-
enumerable: true,
|
|
34
|
-
configurable: true,
|
|
35
|
-
writable: true,
|
|
36
|
-
value: contentLen
|
|
37
|
-
});
|
|
38
|
-
}
|
|
39
|
-
static createEmpty() {
|
|
40
|
-
return new DtlsPlaintextHeader(undefined, undefined, undefined, undefined, undefined);
|
|
41
|
-
}
|
|
42
|
-
static deSerialize(buf) {
|
|
43
|
-
return new DtlsPlaintextHeader(
|
|
44
|
-
//@ts-ignore
|
|
45
|
-
...Object.values((0, binary_data_1.decode)(buf, DtlsPlaintextHeader.spec)));
|
|
46
|
-
}
|
|
47
|
-
serialize() {
|
|
48
|
-
const res = (0, binary_data_1.encode)(this, DtlsPlaintextHeader.spec).slice();
|
|
49
|
-
return Buffer.from(res);
|
|
50
|
-
}
|
|
51
|
-
}
|
|
52
|
-
exports.DtlsPlaintextHeader = DtlsPlaintextHeader;
|
|
53
|
-
Object.defineProperty(DtlsPlaintextHeader, "spec", {
|
|
54
|
-
enumerable: true,
|
|
55
|
-
configurable: true,
|
|
56
|
-
writable: true,
|
|
57
|
-
value: {
|
|
58
|
-
contentType: binary_data_1.types.uint8,
|
|
59
|
-
protocolVersion: binary_1.ProtocolVersion,
|
|
60
|
-
epoch: binary_data_1.types.uint16be,
|
|
61
|
-
sequenceNumber: binary_data_1.types.uint48be,
|
|
62
|
-
contentLen: binary_data_1.types.uint16be,
|
|
63
|
-
}
|
|
64
|
-
});
|
|
65
6
|
class MACHeader {
|
|
66
7
|
constructor(epoch, sequenceNumber, contentType, protocolVersion, contentLen) {
|
|
67
8
|
Object.defineProperty(this, "epoch", {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"header.js","sourceRoot":"","sources":["../../../../../../dtls/src/record/message/header.ts"],"names":[],"mappings":";;;AAAA,2DAAkE;
|
|
1
|
+
{"version":3,"file":"header.js","sourceRoot":"","sources":["../../../../../../dtls/src/record/message/header.ts"],"names":[],"mappings":";;;AAAA,2DAAkE;AAClE,mDAAyD;AAazD,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,IAAA,oBAAM,EAAC,GAAG,EAAE,SAAS,CAAC,IAAI,CAAC,CAAC,CAC9C,CAAC;IACJ,CAAC;IAED,SAAS;QACP,MAAM,GAAG,GAAG,IAAA,oBAAM,EAAC,IAAI,EAAE,SAAS,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,CAAC;QACjD,OAAO,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAC1B,CAAC;;AArCH,8BAsCC;AArCiB;;;;WAAO;QACrB,KAAK,EAAE,mBAAK,CAAC,QAAQ;QACrB,cAAc,EAAE,mBAAK,CAAC,QAAQ;QAC9B,WAAW,EAAE,mBAAK,CAAC,KAAK;QACxB,eAAe,EAAE,wBAAe;QAChC,UAAU,EAAE,mBAAK,CAAC,QAAQ;KAC3B;EANmB,CAMlB","sourcesContent":["import { decode, encode, types } from \"@shinyoshiaki/binary-data\";\nimport { ProtocolVersion } from \"../../handshake/binary\";\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 const res = encode(this, MACHeader.spec).slice();\n return Buffer.from(res);\n }\n}\n"]}
|
|
@@ -1,35 +1,14 @@
|
|
|
1
|
+
import { type DtlsPlaintextHeader } from "./header";
|
|
1
2
|
export declare class DtlsPlaintext {
|
|
2
|
-
recordLayerHeader:
|
|
3
|
+
recordLayerHeader: DtlsPlaintextHeader;
|
|
3
4
|
fragment: Buffer;
|
|
4
|
-
|
|
5
|
-
recordLayerHeader: {
|
|
6
|
-
contentType: number;
|
|
7
|
-
protocolVersion: {
|
|
8
|
-
major: number;
|
|
9
|
-
minor: number;
|
|
10
|
-
};
|
|
11
|
-
epoch: number;
|
|
12
|
-
sequenceNumber: number;
|
|
13
|
-
contentLen: number;
|
|
14
|
-
};
|
|
15
|
-
fragment: any;
|
|
16
|
-
};
|
|
17
|
-
constructor(recordLayerHeader: typeof DtlsPlaintext.spec.recordLayerHeader, fragment: Buffer);
|
|
5
|
+
constructor(recordLayerHeader: DtlsPlaintextHeader, fragment: Buffer);
|
|
18
6
|
get summary(): {
|
|
19
|
-
header:
|
|
20
|
-
contentType: number;
|
|
21
|
-
protocolVersion: {
|
|
22
|
-
major: number;
|
|
23
|
-
minor: number;
|
|
24
|
-
};
|
|
25
|
-
epoch: number;
|
|
26
|
-
sequenceNumber: number;
|
|
27
|
-
contentLen: number;
|
|
28
|
-
};
|
|
7
|
+
header: DtlsPlaintextHeader;
|
|
29
8
|
fragment: string;
|
|
30
9
|
};
|
|
31
10
|
static createEmpty(): DtlsPlaintext;
|
|
32
11
|
static deSerialize(buf: Buffer): DtlsPlaintext;
|
|
33
|
-
serialize(): Buffer
|
|
34
|
-
computeMACHeader(): Buffer
|
|
12
|
+
serialize(): Buffer<ArrayBuffer>;
|
|
13
|
+
computeMACHeader(): Buffer<ArrayBuffer>;
|
|
35
14
|
}
|
|
@@ -1,8 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.DtlsPlaintext = void 0;
|
|
4
|
-
/* eslint-disable @typescript-eslint/ban-ts-comment */
|
|
5
|
-
const binary_data_1 = require("@shinyoshiaki/binary-data");
|
|
6
4
|
const helper_1 = require("../../helper");
|
|
7
5
|
const header_1 = require("./header");
|
|
8
6
|
class DtlsPlaintext {
|
|
@@ -30,27 +28,47 @@ class DtlsPlaintext {
|
|
|
30
28
|
return new DtlsPlaintext(undefined, undefined);
|
|
31
29
|
}
|
|
32
30
|
static deSerialize(buf) {
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
31
|
+
if (buf.length < 13) {
|
|
32
|
+
throw new Error("Invalid DTLS record: buffer is too short");
|
|
33
|
+
}
|
|
34
|
+
const contentType = buf.readUInt8(0);
|
|
35
|
+
const majorVersion = buf.readUInt8(1);
|
|
36
|
+
const minorVersion = buf.readUInt8(2);
|
|
37
|
+
const epoch = buf.readUInt16BE(3);
|
|
38
|
+
// Read the 6-byte sequence number as a 48-bit integer
|
|
39
|
+
const sequenceNumber = buf.slice(5, 11).readUIntBE(0, 6);
|
|
40
|
+
const contentLen = buf.readUInt16BE(11);
|
|
41
|
+
// Ensure the buffer has enough data for the fragment
|
|
42
|
+
if (buf.length < 13 + contentLen) {
|
|
43
|
+
throw new Error("Invalid DTLS record: fragment length exceeds buffer");
|
|
44
|
+
}
|
|
45
|
+
const fragment = buf.slice(13, 13 + contentLen);
|
|
46
|
+
const r = new DtlsPlaintext({
|
|
47
|
+
contentType,
|
|
48
|
+
protocolVersion: { major: majorVersion, minor: minorVersion },
|
|
49
|
+
epoch,
|
|
50
|
+
sequenceNumber,
|
|
51
|
+
contentLen,
|
|
52
|
+
}, fragment);
|
|
36
53
|
return r;
|
|
37
54
|
}
|
|
38
55
|
serialize() {
|
|
39
|
-
const
|
|
40
|
-
|
|
56
|
+
const fragmentLength = this.fragment.length;
|
|
57
|
+
// 13 bytes for headers + fragment length
|
|
58
|
+
const totalLength = 13 + fragmentLength;
|
|
59
|
+
const buffer = Buffer.alloc(totalLength);
|
|
60
|
+
buffer.writeUInt8(this.recordLayerHeader.contentType, 0);
|
|
61
|
+
buffer.writeUInt8(this.recordLayerHeader.protocolVersion.major, 1);
|
|
62
|
+
buffer.writeUInt8(this.recordLayerHeader.protocolVersion.minor, 2);
|
|
63
|
+
buffer.writeUInt16BE(this.recordLayerHeader.epoch, 3);
|
|
64
|
+
buffer.writeUIntBE(this.recordLayerHeader.sequenceNumber, 5, 6);
|
|
65
|
+
buffer.writeUInt16BE(fragmentLength, 11);
|
|
66
|
+
this.fragment.copy(buffer, 13);
|
|
67
|
+
return buffer;
|
|
41
68
|
}
|
|
42
69
|
computeMACHeader() {
|
|
43
70
|
return new header_1.MACHeader(this.recordLayerHeader.epoch, this.recordLayerHeader.sequenceNumber, this.recordLayerHeader.contentType, this.recordLayerHeader.protocolVersion, this.recordLayerHeader.contentLen).serialize();
|
|
44
71
|
}
|
|
45
72
|
}
|
|
46
73
|
exports.DtlsPlaintext = DtlsPlaintext;
|
|
47
|
-
Object.defineProperty(DtlsPlaintext, "spec", {
|
|
48
|
-
enumerable: true,
|
|
49
|
-
configurable: true,
|
|
50
|
-
writable: true,
|
|
51
|
-
value: {
|
|
52
|
-
recordLayerHeader: header_1.DtlsPlaintextHeader.spec,
|
|
53
|
-
fragment: binary_data_1.types.buffer((context) => context.current.recordLayerHeader.contentLen),
|
|
54
|
-
}
|
|
55
|
-
});
|
|
56
74
|
//# sourceMappingURL=plaintext.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"plaintext.js","sourceRoot":"","sources":["../../../../../../dtls/src/record/message/plaintext.ts"],"names":[],"mappings":";;;AAAA,
|
|
1
|
+
{"version":3,"file":"plaintext.js","sourceRoot":"","sources":["../../../../../../dtls/src/record/message/plaintext.ts"],"names":[],"mappings":"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","sourcesContent":["import { dumpBuffer } from \"../../helper\";\nimport { type DtlsPlaintextHeader, MACHeader } from \"./header\";\n\nexport class DtlsPlaintext {\n constructor(\n public recordLayerHeader: DtlsPlaintextHeader,\n public fragment: Buffer,\n ) {}\n\n get summary() {\n return {\n header: this.recordLayerHeader,\n fragment: dumpBuffer(this.fragment),\n };\n }\n\n static createEmpty() {\n return new DtlsPlaintext(undefined as any, undefined as any);\n }\n\n static deSerialize(buf: Buffer) {\n if (buf.length < 13) {\n throw new Error(\"Invalid DTLS record: buffer is too short\");\n }\n\n const contentType = buf.readUInt8(0);\n const majorVersion = buf.readUInt8(1);\n const minorVersion = buf.readUInt8(2);\n const epoch = buf.readUInt16BE(3);\n\n // Read the 6-byte sequence number as a 48-bit integer\n const sequenceNumber = buf.slice(5, 11).readUIntBE(0, 6);\n\n const contentLen = buf.readUInt16BE(11);\n\n // Ensure the buffer has enough data for the fragment\n if (buf.length < 13 + contentLen) {\n throw new Error(\"Invalid DTLS record: fragment length exceeds buffer\");\n }\n\n const fragment = buf.slice(13, 13 + contentLen);\n\n const r = new DtlsPlaintext(\n {\n contentType,\n protocolVersion: { major: majorVersion, minor: minorVersion },\n epoch,\n sequenceNumber,\n contentLen,\n },\n fragment,\n );\n return r;\n }\n\n serialize() {\n const fragmentLength = this.fragment.length;\n // 13 bytes for headers + fragment length\n const totalLength = 13 + fragmentLength;\n\n const buffer = Buffer.alloc(totalLength);\n\n buffer.writeUInt8(this.recordLayerHeader.contentType, 0);\n buffer.writeUInt8(this.recordLayerHeader.protocolVersion.major, 1);\n buffer.writeUInt8(this.recordLayerHeader.protocolVersion.minor, 2);\n buffer.writeUInt16BE(this.recordLayerHeader.epoch, 3);\n buffer.writeUIntBE(this.recordLayerHeader.sequenceNumber, 5, 6);\n buffer.writeUInt16BE(fragmentLength, 11);\n this.fragment.copy(buffer, 13);\n\n return buffer;\n }\n\n computeMACHeader() {\n return new MACHeader(\n this.recordLayerHeader.epoch,\n this.recordLayerHeader.sequenceNumber,\n this.recordLayerHeader.contentType,\n this.recordLayerHeader.protocolVersion,\n this.recordLayerHeader.contentLen,\n ).serialize();\n }\n}\n"]}
|