@matter/thread-br-client 0.0.1 → 0.17.5-alpha.0-20260706-fd4c49e2e
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/LICENSE +201 -0
- package/README.md +5 -5
- package/dist/cjs/coap/CoapClient.d.ts +2 -2
- package/dist/cjs/coap/CoapClient.d.ts.map +1 -1
- package/dist/cjs/coap/CoapClient.js +9 -16
- package/dist/cjs/coap/CoapClient.js.map +1 -1
- package/dist/cjs/coap/CoapMessage.d.ts +11 -6
- package/dist/cjs/coap/CoapMessage.d.ts.map +1 -1
- package/dist/cjs/coap/CoapMessage.js +8 -5
- package/dist/cjs/coap/CoapMessage.js.map +1 -1
- package/dist/cjs/commissioner/Commissioner.d.ts.map +1 -1
- package/dist/cjs/commissioner/Commissioner.js +5 -2
- package/dist/cjs/commissioner/Commissioner.js.map +1 -1
- package/dist/cjs/commissioner/LeadKa.d.ts +3 -3
- package/dist/cjs/commissioner/LeadKa.d.ts.map +1 -1
- package/dist/cjs/commissioner/LeadKa.js +1 -1
- package/dist/cjs/commissioner/LeadKa.js.map +1 -1
- package/dist/cjs/commissioner/LeadPet.d.ts +3 -2
- package/dist/cjs/commissioner/LeadPet.d.ts.map +1 -1
- package/dist/cjs/commissioner/LeadPet.js +4 -3
- package/dist/cjs/commissioner/LeadPet.js.map +1 -1
- package/dist/cjs/credentials/ThreadCredentialsRegistry.d.ts +5 -5
- package/dist/cjs/credentials/ThreadCredentialsRegistry.d.ts.map +1 -1
- package/dist/cjs/credentials/ThreadCredentialsRegistry.js +10 -9
- package/dist/cjs/credentials/ThreadCredentialsRegistry.js.map +1 -1
- package/dist/cjs/credentials/ThreadNetworkCredentials.d.ts +4 -3
- package/dist/cjs/credentials/ThreadNetworkCredentials.d.ts.map +1 -1
- package/dist/cjs/crypto/AesCmacPrf128.d.ts +4 -14
- package/dist/cjs/crypto/AesCmacPrf128.d.ts.map +1 -1
- package/dist/cjs/crypto/AesCmacPrf128.js +7 -71
- package/dist/cjs/crypto/AesCmacPrf128.js.map +2 -2
- package/dist/cjs/crypto/Pbkdf2AesCmac.d.ts +5 -4
- package/dist/cjs/crypto/Pbkdf2AesCmac.d.ts.map +1 -1
- package/dist/cjs/crypto/Pbkdf2AesCmac.js +5 -4
- package/dist/cjs/crypto/Pbkdf2AesCmac.js.map +1 -1
- package/dist/cjs/crypto/Pskc.d.ts +4 -3
- package/dist/cjs/crypto/Pskc.d.ts.map +1 -1
- package/dist/cjs/crypto/Pskc.js +6 -5
- package/dist/cjs/crypto/Pskc.js.map +1 -1
- package/dist/cjs/crypto/index.d.ts +1 -1
- package/dist/cjs/crypto/index.d.ts.map +1 -1
- package/dist/cjs/crypto/index.js +0 -1
- package/dist/cjs/crypto/index.js.map +1 -1
- package/dist/cjs/dataset/OperationalDataset.d.ts +10 -10
- package/dist/cjs/dataset/OperationalDataset.d.ts.map +1 -1
- package/dist/cjs/dataset/OperationalDataset.js +32 -31
- package/dist/cjs/dataset/OperationalDataset.js.map +1 -1
- package/dist/cjs/dataset/SecurityPolicy.d.ts +3 -2
- package/dist/cjs/dataset/SecurityPolicy.d.ts.map +1 -1
- package/dist/cjs/dataset/SecurityPolicy.js +5 -4
- package/dist/cjs/dataset/SecurityPolicy.js.map +1 -1
- package/dist/cjs/diagnostic/DiagnosticResponse.d.ts +5 -4
- package/dist/cjs/diagnostic/DiagnosticResponse.d.ts.map +1 -1
- package/dist/cjs/diagnostic/DiagnosticSource.d.ts +2 -2
- package/dist/cjs/diagnostic/DiagnosticSource.d.ts.map +1 -1
- package/dist/cjs/diagnostic/MeshCopDiagnosticSource.d.ts +7 -3
- package/dist/cjs/diagnostic/MeshCopDiagnosticSource.d.ts.map +1 -1
- package/dist/cjs/diagnostic/MeshCopDiagnosticSource.js +48 -43
- package/dist/cjs/diagnostic/MeshCopDiagnosticSource.js.map +1 -1
- package/dist/cjs/diagnostic/connectMeshcop.d.ts.map +1 -1
- package/dist/cjs/diagnostic/connectMeshcop.js +5 -12
- package/dist/cjs/diagnostic/connectMeshcop.js.map +1 -1
- package/dist/cjs/diagnostic/errors.d.ts +1 -1
- package/dist/cjs/diagnostic/errors.d.ts.map +1 -1
- package/dist/cjs/discovery/BorderRouterRegistry.d.ts.map +1 -1
- package/dist/cjs/discovery/BorderRouterRegistry.js +2 -4
- package/dist/cjs/discovery/BorderRouterRegistry.js.map +1 -1
- package/dist/cjs/dtls/channel/DtlsConnectOpts.d.ts +3 -3
- package/dist/cjs/dtls/channel/DtlsConnectOpts.d.ts.map +1 -1
- package/dist/cjs/dtls/channel/NobleDtlsChannel.d.ts.map +1 -1
- package/dist/cjs/dtls/channel/NobleDtlsChannel.js +89 -58
- package/dist/cjs/dtls/channel/NobleDtlsChannel.js.map +1 -1
- package/dist/cjs/dtls/ecjpake/EcJpakePms.d.ts +5 -4
- package/dist/cjs/dtls/ecjpake/EcJpakePms.d.ts.map +1 -1
- package/dist/cjs/dtls/ecjpake/EcJpakePms.js +4 -5
- package/dist/cjs/dtls/ecjpake/EcJpakePms.js.map +1 -1
- package/dist/cjs/dtls/ecjpake/EcJpakeRound.d.ts +16 -15
- package/dist/cjs/dtls/ecjpake/EcJpakeRound.d.ts.map +1 -1
- package/dist/cjs/dtls/ecjpake/EcJpakeRound.js +40 -29
- package/dist/cjs/dtls/ecjpake/EcJpakeRound.js.map +1 -1
- package/dist/cjs/dtls/ecjpake/SchnorrZkp.d.ts +10 -9
- package/dist/cjs/dtls/ecjpake/SchnorrZkp.d.ts.map +1 -1
- package/dist/cjs/dtls/ecjpake/SchnorrZkp.js +17 -13
- package/dist/cjs/dtls/ecjpake/SchnorrZkp.js.map +1 -1
- package/dist/cjs/dtls/handshake/ChangeCipherSpec.d.ts +2 -1
- package/dist/cjs/dtls/handshake/ChangeCipherSpec.d.ts.map +1 -1
- package/dist/cjs/dtls/handshake/ChangeCipherSpec.js +3 -1
- package/dist/cjs/dtls/handshake/ChangeCipherSpec.js.map +1 -1
- package/dist/cjs/dtls/handshake/ClientHelloMessage.d.ts +27 -4
- package/dist/cjs/dtls/handshake/ClientHelloMessage.d.ts.map +1 -1
- package/dist/cjs/dtls/handshake/ClientHelloMessage.js +3 -1
- package/dist/cjs/dtls/handshake/ClientHelloMessage.js.map +1 -1
- package/dist/cjs/dtls/handshake/ClientKeyExchangeMessage.d.ts +2 -1
- package/dist/cjs/dtls/handshake/ClientKeyExchangeMessage.d.ts.map +1 -1
- package/dist/cjs/dtls/handshake/ClientKeyExchangeMessage.js.map +1 -1
- package/dist/cjs/dtls/handshake/DtlsClient.d.ts +9 -6
- package/dist/cjs/dtls/handshake/DtlsClient.d.ts.map +1 -1
- package/dist/cjs/dtls/handshake/DtlsClient.js +99 -77
- package/dist/cjs/dtls/handshake/DtlsClient.js.map +1 -1
- package/dist/cjs/dtls/handshake/FinishedMessage.d.ts +10 -3
- package/dist/cjs/dtls/handshake/FinishedMessage.d.ts.map +1 -1
- package/dist/cjs/dtls/handshake/FinishedMessage.js +4 -2
- package/dist/cjs/dtls/handshake/FinishedMessage.js.map +1 -1
- package/dist/cjs/dtls/handshake/HandshakeMessage.d.ts +5 -4
- package/dist/cjs/dtls/handshake/HandshakeMessage.d.ts.map +1 -1
- package/dist/cjs/dtls/handshake/HandshakeMessage.js +13 -11
- package/dist/cjs/dtls/handshake/HandshakeMessage.js.map +1 -1
- package/dist/cjs/dtls/handshake/HelloVerifyRequestMessage.d.ts +19 -2
- package/dist/cjs/dtls/handshake/HelloVerifyRequestMessage.d.ts.map +1 -1
- package/dist/cjs/dtls/handshake/HelloVerifyRequestMessage.js +3 -1
- package/dist/cjs/dtls/handshake/HelloVerifyRequestMessage.js.map +1 -1
- package/dist/cjs/dtls/handshake/ServerHelloDoneMessage.d.ts +2 -1
- package/dist/cjs/dtls/handshake/ServerHelloDoneMessage.d.ts.map +1 -1
- package/dist/cjs/dtls/handshake/ServerHelloDoneMessage.js +3 -2
- package/dist/cjs/dtls/handshake/ServerHelloDoneMessage.js.map +1 -1
- package/dist/cjs/dtls/handshake/ServerHelloMessage.d.ts +4 -3
- package/dist/cjs/dtls/handshake/ServerHelloMessage.d.ts.map +1 -1
- package/dist/cjs/dtls/handshake/ServerHelloMessage.js +3 -1
- package/dist/cjs/dtls/handshake/ServerHelloMessage.js.map +1 -1
- package/dist/cjs/dtls/handshake/ServerKeyExchangeMessage.d.ts +2 -1
- package/dist/cjs/dtls/handshake/ServerKeyExchangeMessage.d.ts.map +1 -1
- package/dist/cjs/dtls/handshake/ServerKeyExchangeMessage.js.map +1 -1
- package/dist/cjs/dtls/prf/HandshakeTranscript.d.ts +7 -5
- package/dist/cjs/dtls/prf/HandshakeTranscript.d.ts.map +1 -1
- package/dist/cjs/dtls/prf/HandshakeTranscript.js +14 -9
- package/dist/cjs/dtls/prf/HandshakeTranscript.js.map +1 -1
- package/dist/cjs/dtls/prf/TlsPrf.d.ts +23 -22
- package/dist/cjs/dtls/prf/TlsPrf.d.ts.map +1 -1
- package/dist/cjs/dtls/prf/TlsPrf.js +33 -30
- package/dist/cjs/dtls/prf/TlsPrf.js.map +1 -1
- package/dist/cjs/dtls/record/AesCcm8.d.ts +13 -12
- package/dist/cjs/dtls/record/AesCcm8.d.ts.map +1 -1
- package/dist/cjs/dtls/record/AesCcm8.js +12 -34
- package/dist/cjs/dtls/record/AesCcm8.js.map +1 -1
- package/dist/cjs/dtls/record/DtlsCipherState.d.ts +11 -10
- package/dist/cjs/dtls/record/DtlsCipherState.d.ts.map +1 -1
- package/dist/cjs/dtls/record/DtlsCipherState.js +10 -6
- package/dist/cjs/dtls/record/DtlsCipherState.js.map +1 -1
- package/dist/cjs/dtls/record/DtlsRecord.d.ts +10 -10
- package/dist/cjs/dtls/record/DtlsRecord.d.ts.map +1 -1
- package/dist/cjs/dtls/record/DtlsRecord.js +10 -8
- package/dist/cjs/dtls/record/DtlsRecord.js.map +1 -1
- package/dist/cjs/otbr-rest/OtbrRestCapability.d.ts +3 -4
- package/dist/cjs/otbr-rest/OtbrRestCapability.d.ts.map +1 -1
- package/dist/cjs/otbr-rest/OtbrRestClient.d.ts +27 -8
- package/dist/cjs/otbr-rest/OtbrRestClient.d.ts.map +1 -1
- package/dist/cjs/otbr-rest/OtbrRestClient.js +50 -20
- package/dist/cjs/otbr-rest/OtbrRestClient.js.map +1 -1
- package/dist/cjs/otbr-rest/OtbrRestDiagnosticSource.d.ts +2 -1
- package/dist/cjs/otbr-rest/OtbrRestDiagnosticSource.d.ts.map +1 -1
- package/dist/cjs/otbr-rest/OtbrRestDiagnosticSource.js +3 -3
- package/dist/cjs/otbr-rest/OtbrRestDiagnosticSource.js.map +1 -1
- package/dist/cjs/otbr-rest/OtbrRestProbe.d.ts +6 -4
- package/dist/cjs/otbr-rest/OtbrRestProbe.d.ts.map +1 -1
- package/dist/cjs/otbr-rest/OtbrRestProbe.js +11 -43
- package/dist/cjs/otbr-rest/OtbrRestProbe.js.map +1 -1
- package/dist/cjs/otbr-rest/caseNormalizer.d.ts +7 -0
- package/dist/cjs/otbr-rest/caseNormalizer.d.ts.map +1 -1
- package/dist/cjs/otbr-rest/caseNormalizer.js +11 -0
- package/dist/cjs/otbr-rest/caseNormalizer.js.map +1 -1
- package/dist/cjs/otbr-rest/parseHexBytes.d.ts +22 -0
- package/dist/cjs/otbr-rest/parseHexBytes.d.ts.map +1 -0
- package/dist/cjs/otbr-rest/parseHexBytes.js +50 -0
- package/dist/cjs/otbr-rest/parseHexBytes.js.map +6 -0
- package/dist/cjs/otbr-rest/translation.d.ts +2 -1
- package/dist/cjs/otbr-rest/translation.d.ts.map +1 -1
- package/dist/cjs/otbr-rest/translation.js +20 -22
- package/dist/cjs/otbr-rest/translation.js.map +1 -1
- package/dist/cjs/selection/selectBr.d.ts +8 -4
- package/dist/cjs/selection/selectBr.d.ts.map +1 -1
- package/dist/cjs/selection/selectBr.js +6 -5
- package/dist/cjs/selection/selectBr.js.map +1 -1
- package/dist/cjs/selection/withExtPanIdLock.d.ts +2 -1
- package/dist/cjs/selection/withExtPanIdLock.d.ts.map +1 -1
- package/dist/cjs/selection/withExtPanIdLock.js.map +1 -1
- package/dist/cjs/tlv/BasicTlvCodec.d.ts +4 -4
- package/dist/cjs/tlv/BasicTlvCodec.d.ts.map +1 -1
- package/dist/cjs/tlv/BasicTlvCodec.js +13 -11
- package/dist/cjs/tlv/BasicTlvCodec.js.map +1 -1
- package/dist/cjs/tlv/NetworkDiagnosticTlv.d.ts +3 -2
- package/dist/cjs/tlv/NetworkDiagnosticTlv.d.ts.map +1 -1
- package/dist/cjs/tlv/NetworkDiagnosticTlv.js.map +1 -1
- package/dist/cjs/tlv/TypeListTlv.d.ts +3 -2
- package/dist/cjs/tlv/TypeListTlv.d.ts.map +1 -1
- package/dist/cjs/tlv/TypeListTlv.js +1 -1
- package/dist/cjs/tlv/TypeListTlv.js.map +1 -1
- package/dist/cjs/tlv/diag/ChildIpv6AddressList.d.ts +3 -2
- package/dist/cjs/tlv/diag/ChildIpv6AddressList.d.ts.map +1 -1
- package/dist/cjs/tlv/diag/ChildIpv6AddressList.js +5 -3
- package/dist/cjs/tlv/diag/ChildIpv6AddressList.js.map +1 -1
- package/dist/cjs/tlv/diag/ChildTable.d.ts +3 -2
- package/dist/cjs/tlv/diag/ChildTable.d.ts.map +1 -1
- package/dist/cjs/tlv/diag/ChildTable.js +7 -6
- package/dist/cjs/tlv/diag/ChildTable.js.map +1 -1
- package/dist/cjs/tlv/diag/Connectivity.d.ts +3 -2
- package/dist/cjs/tlv/diag/Connectivity.d.ts.map +1 -1
- package/dist/cjs/tlv/diag/Connectivity.js +14 -14
- package/dist/cjs/tlv/diag/Connectivity.js.map +1 -1
- package/dist/cjs/tlv/diag/Ipv6AddressList.d.ts +3 -2
- package/dist/cjs/tlv/diag/Ipv6AddressList.d.ts.map +1 -1
- package/dist/cjs/tlv/diag/Ipv6AddressList.js +6 -5
- package/dist/cjs/tlv/diag/Ipv6AddressList.js.map +1 -1
- package/dist/cjs/tlv/diag/LeaderData.d.ts +3 -2
- package/dist/cjs/tlv/diag/LeaderData.d.ts.map +1 -1
- package/dist/cjs/tlv/diag/LeaderData.js +8 -7
- package/dist/cjs/tlv/diag/LeaderData.js.map +1 -1
- package/dist/cjs/tlv/diag/MacCounters.d.ts +3 -2
- package/dist/cjs/tlv/diag/MacCounters.d.ts.map +1 -1
- package/dist/cjs/tlv/diag/MacCounters.js +12 -11
- package/dist/cjs/tlv/diag/MacCounters.js.map +1 -1
- package/dist/cjs/tlv/diag/MleCounters.d.ts +3 -2
- package/dist/cjs/tlv/diag/MleCounters.d.ts.map +1 -1
- package/dist/cjs/tlv/diag/MleCounters.js +18 -17
- package/dist/cjs/tlv/diag/MleCounters.js.map +1 -1
- package/dist/cjs/tlv/diag/Mode.d.ts +3 -2
- package/dist/cjs/tlv/diag/Mode.d.ts.map +1 -1
- package/dist/cjs/tlv/diag/Mode.js +5 -3
- package/dist/cjs/tlv/diag/Mode.js.map +1 -1
- package/dist/cjs/tlv/diag/NetworkData.d.ts +7 -6
- package/dist/cjs/tlv/diag/NetworkData.d.ts.map +1 -1
- package/dist/cjs/tlv/diag/NetworkData.js +23 -18
- package/dist/cjs/tlv/diag/NetworkData.js.map +1 -1
- package/dist/cjs/tlv/diag/Primitives.d.ts +15 -14
- package/dist/cjs/tlv/diag/Primitives.d.ts.map +1 -1
- package/dist/cjs/tlv/diag/Primitives.js +25 -19
- package/dist/cjs/tlv/diag/Primitives.js.map +1 -1
- package/dist/cjs/tlv/diag/Route64.d.ts +3 -2
- package/dist/cjs/tlv/diag/Route64.d.ts.map +1 -1
- package/dist/cjs/tlv/diag/Route64.js +8 -7
- package/dist/cjs/tlv/diag/Route64.js.map +1 -1
- package/dist/cjs/tlv/diag/RouterNeighbor.d.ts +3 -2
- package/dist/cjs/tlv/diag/RouterNeighbor.d.ts.map +1 -1
- package/dist/cjs/tlv/diag/RouterNeighbor.js +13 -11
- package/dist/cjs/tlv/diag/RouterNeighbor.js.map +1 -1
- package/dist/cjs/tlv/diag/Timeout.d.ts +3 -2
- package/dist/cjs/tlv/diag/Timeout.d.ts.map +1 -1
- package/dist/cjs/tlv/diag/Timeout.js +4 -3
- package/dist/cjs/tlv/diag/Timeout.js.map +1 -1
- package/dist/cjs/tlv/diag/VendorInfo.d.ts +13 -12
- package/dist/cjs/tlv/diag/VendorInfo.d.ts.map +1 -1
- package/dist/cjs/tlv/diag/VendorInfo.js +4 -3
- package/dist/cjs/tlv/diag/VendorInfo.js.map +1 -1
- package/dist/cjs/tlv/meshcop/Ip6AddressTlv.d.ts +3 -2
- package/dist/cjs/tlv/meshcop/Ip6AddressTlv.d.ts.map +1 -1
- package/dist/cjs/tlv/meshcop/Ip6AddressTlv.js +7 -4
- package/dist/cjs/tlv/meshcop/Ip6AddressTlv.js.map +1 -1
- package/dist/cjs/tlv/meshcop/UdpEncapsulationTlv.d.ts +4 -3
- package/dist/cjs/tlv/meshcop/UdpEncapsulationTlv.d.ts.map +1 -1
- package/dist/cjs/tlv/meshcop/UdpEncapsulationTlv.js +9 -7
- package/dist/cjs/tlv/meshcop/UdpEncapsulationTlv.js.map +1 -1
- package/dist/cjs/util/meshLocalAddr.d.ts +5 -4
- package/dist/cjs/util/meshLocalAddr.d.ts.map +1 -1
- package/dist/cjs/util/meshLocalAddr.js +6 -4
- package/dist/cjs/util/meshLocalAddr.js.map +1 -1
- package/dist/esm/coap/CoapClient.d.ts +2 -2
- package/dist/esm/coap/CoapClient.d.ts.map +1 -1
- package/dist/esm/coap/CoapClient.js +11 -17
- package/dist/esm/coap/CoapClient.js.map +1 -1
- package/dist/esm/coap/CoapMessage.d.ts +11 -6
- package/dist/esm/coap/CoapMessage.d.ts.map +1 -1
- package/dist/esm/coap/CoapMessage.js +8 -5
- package/dist/esm/coap/CoapMessage.js.map +1 -1
- package/dist/esm/commissioner/Commissioner.d.ts.map +1 -1
- package/dist/esm/commissioner/Commissioner.js +5 -2
- package/dist/esm/commissioner/Commissioner.js.map +1 -1
- package/dist/esm/commissioner/LeadKa.d.ts +3 -3
- package/dist/esm/commissioner/LeadKa.d.ts.map +1 -1
- package/dist/esm/commissioner/LeadKa.js +2 -2
- package/dist/esm/commissioner/LeadKa.js.map +1 -1
- package/dist/esm/commissioner/LeadPet.d.ts +3 -2
- package/dist/esm/commissioner/LeadPet.d.ts.map +1 -1
- package/dist/esm/commissioner/LeadPet.js +4 -3
- package/dist/esm/commissioner/LeadPet.js.map +1 -1
- package/dist/esm/credentials/ThreadCredentialsRegistry.d.ts +5 -5
- package/dist/esm/credentials/ThreadCredentialsRegistry.d.ts.map +1 -1
- package/dist/esm/credentials/ThreadCredentialsRegistry.js +10 -9
- package/dist/esm/credentials/ThreadCredentialsRegistry.js.map +1 -1
- package/dist/esm/credentials/ThreadNetworkCredentials.d.ts +4 -3
- package/dist/esm/credentials/ThreadNetworkCredentials.d.ts.map +1 -1
- package/dist/esm/crypto/AesCmacPrf128.d.ts +4 -14
- package/dist/esm/crypto/AesCmacPrf128.d.ts.map +1 -1
- package/dist/esm/crypto/AesCmacPrf128.js +8 -72
- package/dist/esm/crypto/AesCmacPrf128.js.map +2 -2
- package/dist/esm/crypto/Pbkdf2AesCmac.d.ts +5 -4
- package/dist/esm/crypto/Pbkdf2AesCmac.d.ts.map +1 -1
- package/dist/esm/crypto/Pbkdf2AesCmac.js +6 -5
- package/dist/esm/crypto/Pbkdf2AesCmac.js.map +1 -1
- package/dist/esm/crypto/Pskc.d.ts +4 -3
- package/dist/esm/crypto/Pskc.d.ts.map +1 -1
- package/dist/esm/crypto/Pskc.js +7 -6
- package/dist/esm/crypto/Pskc.js.map +1 -1
- package/dist/esm/crypto/index.d.ts +1 -1
- package/dist/esm/crypto/index.d.ts.map +1 -1
- package/dist/esm/crypto/index.js +1 -2
- package/dist/esm/crypto/index.js.map +1 -1
- package/dist/esm/dataset/OperationalDataset.d.ts +10 -10
- package/dist/esm/dataset/OperationalDataset.d.ts.map +1 -1
- package/dist/esm/dataset/OperationalDataset.js +32 -31
- package/dist/esm/dataset/OperationalDataset.js.map +1 -1
- package/dist/esm/dataset/SecurityPolicy.d.ts +3 -2
- package/dist/esm/dataset/SecurityPolicy.d.ts.map +1 -1
- package/dist/esm/dataset/SecurityPolicy.js +6 -5
- package/dist/esm/dataset/SecurityPolicy.js.map +1 -1
- package/dist/esm/diagnostic/DiagnosticResponse.d.ts +5 -4
- package/dist/esm/diagnostic/DiagnosticResponse.d.ts.map +1 -1
- package/dist/esm/diagnostic/DiagnosticSource.d.ts +2 -2
- package/dist/esm/diagnostic/DiagnosticSource.d.ts.map +1 -1
- package/dist/esm/diagnostic/MeshCopDiagnosticSource.d.ts +7 -3
- package/dist/esm/diagnostic/MeshCopDiagnosticSource.d.ts.map +1 -1
- package/dist/esm/diagnostic/MeshCopDiagnosticSource.js +49 -43
- package/dist/esm/diagnostic/MeshCopDiagnosticSource.js.map +1 -1
- package/dist/esm/diagnostic/connectMeshcop.d.ts.map +1 -1
- package/dist/esm/diagnostic/connectMeshcop.js +6 -13
- package/dist/esm/diagnostic/connectMeshcop.js.map +1 -1
- package/dist/esm/diagnostic/errors.d.ts +1 -1
- package/dist/esm/diagnostic/errors.d.ts.map +1 -1
- package/dist/esm/discovery/BorderRouterRegistry.d.ts.map +1 -1
- package/dist/esm/discovery/BorderRouterRegistry.js +2 -4
- package/dist/esm/discovery/BorderRouterRegistry.js.map +1 -1
- package/dist/esm/dtls/channel/DtlsConnectOpts.d.ts +3 -3
- package/dist/esm/dtls/channel/DtlsConnectOpts.d.ts.map +1 -1
- package/dist/esm/dtls/channel/NobleDtlsChannel.d.ts.map +1 -1
- package/dist/esm/dtls/channel/NobleDtlsChannel.js +90 -58
- package/dist/esm/dtls/channel/NobleDtlsChannel.js.map +1 -1
- package/dist/esm/dtls/ecjpake/EcJpakePms.d.ts +5 -4
- package/dist/esm/dtls/ecjpake/EcJpakePms.d.ts.map +1 -1
- package/dist/esm/dtls/ecjpake/EcJpakePms.js +5 -6
- package/dist/esm/dtls/ecjpake/EcJpakePms.js.map +1 -1
- package/dist/esm/dtls/ecjpake/EcJpakeRound.d.ts +16 -15
- package/dist/esm/dtls/ecjpake/EcJpakeRound.d.ts.map +1 -1
- package/dist/esm/dtls/ecjpake/EcJpakeRound.js +41 -30
- package/dist/esm/dtls/ecjpake/EcJpakeRound.js.map +1 -1
- package/dist/esm/dtls/ecjpake/SchnorrZkp.d.ts +10 -9
- package/dist/esm/dtls/ecjpake/SchnorrZkp.d.ts.map +1 -1
- package/dist/esm/dtls/ecjpake/SchnorrZkp.js +18 -14
- package/dist/esm/dtls/ecjpake/SchnorrZkp.js.map +1 -1
- package/dist/esm/dtls/handshake/ChangeCipherSpec.d.ts +2 -1
- package/dist/esm/dtls/handshake/ChangeCipherSpec.d.ts.map +1 -1
- package/dist/esm/dtls/handshake/ChangeCipherSpec.js +3 -1
- package/dist/esm/dtls/handshake/ChangeCipherSpec.js.map +1 -1
- package/dist/esm/dtls/handshake/ClientHelloMessage.d.ts +27 -4
- package/dist/esm/dtls/handshake/ClientHelloMessage.d.ts.map +1 -1
- package/dist/esm/dtls/handshake/ClientHelloMessage.js +4 -2
- package/dist/esm/dtls/handshake/ClientHelloMessage.js.map +1 -1
- package/dist/esm/dtls/handshake/ClientKeyExchangeMessage.d.ts +2 -1
- package/dist/esm/dtls/handshake/ClientKeyExchangeMessage.d.ts.map +1 -1
- package/dist/esm/dtls/handshake/ClientKeyExchangeMessage.js.map +1 -1
- package/dist/esm/dtls/handshake/DtlsClient.d.ts +9 -6
- package/dist/esm/dtls/handshake/DtlsClient.d.ts.map +1 -1
- package/dist/esm/dtls/handshake/DtlsClient.js +100 -78
- package/dist/esm/dtls/handshake/DtlsClient.js.map +1 -1
- package/dist/esm/dtls/handshake/FinishedMessage.d.ts +10 -3
- package/dist/esm/dtls/handshake/FinishedMessage.d.ts.map +1 -1
- package/dist/esm/dtls/handshake/FinishedMessage.js +5 -3
- package/dist/esm/dtls/handshake/FinishedMessage.js.map +1 -1
- package/dist/esm/dtls/handshake/HandshakeMessage.d.ts +5 -4
- package/dist/esm/dtls/handshake/HandshakeMessage.d.ts.map +1 -1
- package/dist/esm/dtls/handshake/HandshakeMessage.js +14 -12
- package/dist/esm/dtls/handshake/HandshakeMessage.js.map +1 -1
- package/dist/esm/dtls/handshake/HelloVerifyRequestMessage.d.ts +19 -2
- package/dist/esm/dtls/handshake/HelloVerifyRequestMessage.d.ts.map +1 -1
- package/dist/esm/dtls/handshake/HelloVerifyRequestMessage.js +3 -1
- package/dist/esm/dtls/handshake/HelloVerifyRequestMessage.js.map +1 -1
- package/dist/esm/dtls/handshake/ServerHelloDoneMessage.d.ts +2 -1
- package/dist/esm/dtls/handshake/ServerHelloDoneMessage.d.ts.map +1 -1
- package/dist/esm/dtls/handshake/ServerHelloDoneMessage.js +3 -2
- package/dist/esm/dtls/handshake/ServerHelloDoneMessage.js.map +1 -1
- package/dist/esm/dtls/handshake/ServerHelloMessage.d.ts +4 -3
- package/dist/esm/dtls/handshake/ServerHelloMessage.d.ts.map +1 -1
- package/dist/esm/dtls/handshake/ServerHelloMessage.js +3 -1
- package/dist/esm/dtls/handshake/ServerHelloMessage.js.map +1 -1
- package/dist/esm/dtls/handshake/ServerKeyExchangeMessage.d.ts +2 -1
- package/dist/esm/dtls/handshake/ServerKeyExchangeMessage.d.ts.map +1 -1
- package/dist/esm/dtls/handshake/ServerKeyExchangeMessage.js.map +1 -1
- package/dist/esm/dtls/prf/HandshakeTranscript.d.ts +7 -5
- package/dist/esm/dtls/prf/HandshakeTranscript.d.ts.map +1 -1
- package/dist/esm/dtls/prf/HandshakeTranscript.js +15 -10
- package/dist/esm/dtls/prf/HandshakeTranscript.js.map +1 -1
- package/dist/esm/dtls/prf/TlsPrf.d.ts +23 -22
- package/dist/esm/dtls/prf/TlsPrf.d.ts.map +1 -1
- package/dist/esm/dtls/prf/TlsPrf.js +34 -31
- package/dist/esm/dtls/prf/TlsPrf.js.map +1 -1
- package/dist/esm/dtls/record/AesCcm8.d.ts +13 -12
- package/dist/esm/dtls/record/AesCcm8.d.ts.map +1 -1
- package/dist/esm/dtls/record/AesCcm8.js +13 -35
- package/dist/esm/dtls/record/AesCcm8.js.map +1 -1
- package/dist/esm/dtls/record/DtlsCipherState.d.ts +11 -10
- package/dist/esm/dtls/record/DtlsCipherState.d.ts.map +1 -1
- package/dist/esm/dtls/record/DtlsCipherState.js +11 -7
- package/dist/esm/dtls/record/DtlsCipherState.js.map +1 -1
- package/dist/esm/dtls/record/DtlsRecord.d.ts +10 -10
- package/dist/esm/dtls/record/DtlsRecord.d.ts.map +1 -1
- package/dist/esm/dtls/record/DtlsRecord.js +11 -9
- package/dist/esm/dtls/record/DtlsRecord.js.map +1 -1
- package/dist/esm/otbr-rest/OtbrRestCapability.d.ts +3 -4
- package/dist/esm/otbr-rest/OtbrRestCapability.d.ts.map +1 -1
- package/dist/esm/otbr-rest/OtbrRestClient.d.ts +27 -8
- package/dist/esm/otbr-rest/OtbrRestClient.d.ts.map +1 -1
- package/dist/esm/otbr-rest/OtbrRestClient.js +51 -21
- package/dist/esm/otbr-rest/OtbrRestClient.js.map +1 -1
- package/dist/esm/otbr-rest/OtbrRestDiagnosticSource.d.ts +2 -1
- package/dist/esm/otbr-rest/OtbrRestDiagnosticSource.d.ts.map +1 -1
- package/dist/esm/otbr-rest/OtbrRestDiagnosticSource.js +4 -4
- package/dist/esm/otbr-rest/OtbrRestDiagnosticSource.js.map +1 -1
- package/dist/esm/otbr-rest/OtbrRestProbe.d.ts +6 -4
- package/dist/esm/otbr-rest/OtbrRestProbe.d.ts.map +1 -1
- package/dist/esm/otbr-rest/OtbrRestProbe.js +12 -44
- package/dist/esm/otbr-rest/OtbrRestProbe.js.map +1 -1
- package/dist/esm/otbr-rest/caseNormalizer.d.ts +7 -0
- package/dist/esm/otbr-rest/caseNormalizer.d.ts.map +1 -1
- package/dist/esm/otbr-rest/caseNormalizer.js +11 -0
- package/dist/esm/otbr-rest/caseNormalizer.js.map +1 -1
- package/dist/esm/otbr-rest/parseHexBytes.d.ts +22 -0
- package/dist/esm/otbr-rest/parseHexBytes.d.ts.map +1 -0
- package/dist/esm/otbr-rest/parseHexBytes.js +30 -0
- package/dist/esm/otbr-rest/parseHexBytes.js.map +6 -0
- package/dist/esm/otbr-rest/translation.d.ts +2 -1
- package/dist/esm/otbr-rest/translation.d.ts.map +1 -1
- package/dist/esm/otbr-rest/translation.js +16 -18
- package/dist/esm/otbr-rest/translation.js.map +1 -1
- package/dist/esm/selection/selectBr.d.ts +8 -4
- package/dist/esm/selection/selectBr.d.ts.map +1 -1
- package/dist/esm/selection/selectBr.js +6 -5
- package/dist/esm/selection/selectBr.js.map +1 -1
- package/dist/esm/selection/withExtPanIdLock.d.ts +2 -1
- package/dist/esm/selection/withExtPanIdLock.d.ts.map +1 -1
- package/dist/esm/selection/withExtPanIdLock.js.map +1 -1
- package/dist/esm/tlv/BasicTlvCodec.d.ts +4 -4
- package/dist/esm/tlv/BasicTlvCodec.d.ts.map +1 -1
- package/dist/esm/tlv/BasicTlvCodec.js +14 -12
- package/dist/esm/tlv/BasicTlvCodec.js.map +1 -1
- package/dist/esm/tlv/NetworkDiagnosticTlv.d.ts +3 -2
- package/dist/esm/tlv/NetworkDiagnosticTlv.d.ts.map +1 -1
- package/dist/esm/tlv/NetworkDiagnosticTlv.js.map +1 -1
- package/dist/esm/tlv/TypeListTlv.d.ts +3 -2
- package/dist/esm/tlv/TypeListTlv.d.ts.map +1 -1
- package/dist/esm/tlv/TypeListTlv.js +2 -2
- package/dist/esm/tlv/TypeListTlv.js.map +1 -1
- package/dist/esm/tlv/diag/ChildIpv6AddressList.d.ts +3 -2
- package/dist/esm/tlv/diag/ChildIpv6AddressList.d.ts.map +1 -1
- package/dist/esm/tlv/diag/ChildIpv6AddressList.js +5 -3
- package/dist/esm/tlv/diag/ChildIpv6AddressList.js.map +1 -1
- package/dist/esm/tlv/diag/ChildTable.d.ts +3 -2
- package/dist/esm/tlv/diag/ChildTable.d.ts.map +1 -1
- package/dist/esm/tlv/diag/ChildTable.js +8 -7
- package/dist/esm/tlv/diag/ChildTable.js.map +1 -1
- package/dist/esm/tlv/diag/Connectivity.d.ts +3 -2
- package/dist/esm/tlv/diag/Connectivity.d.ts.map +1 -1
- package/dist/esm/tlv/diag/Connectivity.js +14 -14
- package/dist/esm/tlv/diag/Connectivity.js.map +1 -1
- package/dist/esm/tlv/diag/Ipv6AddressList.d.ts +3 -2
- package/dist/esm/tlv/diag/Ipv6AddressList.d.ts.map +1 -1
- package/dist/esm/tlv/diag/Ipv6AddressList.js +7 -6
- package/dist/esm/tlv/diag/Ipv6AddressList.js.map +1 -1
- package/dist/esm/tlv/diag/LeaderData.d.ts +3 -2
- package/dist/esm/tlv/diag/LeaderData.d.ts.map +1 -1
- package/dist/esm/tlv/diag/LeaderData.js +9 -8
- package/dist/esm/tlv/diag/LeaderData.js.map +1 -1
- package/dist/esm/tlv/diag/MacCounters.d.ts +3 -2
- package/dist/esm/tlv/diag/MacCounters.d.ts.map +1 -1
- package/dist/esm/tlv/diag/MacCounters.js +13 -12
- package/dist/esm/tlv/diag/MacCounters.js.map +1 -1
- package/dist/esm/tlv/diag/MleCounters.d.ts +3 -2
- package/dist/esm/tlv/diag/MleCounters.d.ts.map +1 -1
- package/dist/esm/tlv/diag/MleCounters.js +19 -18
- package/dist/esm/tlv/diag/MleCounters.js.map +1 -1
- package/dist/esm/tlv/diag/Mode.d.ts +3 -2
- package/dist/esm/tlv/diag/Mode.d.ts.map +1 -1
- package/dist/esm/tlv/diag/Mode.js +5 -3
- package/dist/esm/tlv/diag/Mode.js.map +1 -1
- package/dist/esm/tlv/diag/NetworkData.d.ts +7 -6
- package/dist/esm/tlv/diag/NetworkData.d.ts.map +1 -1
- package/dist/esm/tlv/diag/NetworkData.js +23 -18
- package/dist/esm/tlv/diag/NetworkData.js.map +1 -1
- package/dist/esm/tlv/diag/Primitives.d.ts +15 -14
- package/dist/esm/tlv/diag/Primitives.d.ts.map +1 -1
- package/dist/esm/tlv/diag/Primitives.js +26 -20
- package/dist/esm/tlv/diag/Primitives.js.map +1 -1
- package/dist/esm/tlv/diag/Route64.d.ts +3 -2
- package/dist/esm/tlv/diag/Route64.d.ts.map +1 -1
- package/dist/esm/tlv/diag/Route64.js +9 -8
- package/dist/esm/tlv/diag/Route64.js.map +1 -1
- package/dist/esm/tlv/diag/RouterNeighbor.d.ts +3 -2
- package/dist/esm/tlv/diag/RouterNeighbor.d.ts.map +1 -1
- package/dist/esm/tlv/diag/RouterNeighbor.js +13 -11
- package/dist/esm/tlv/diag/RouterNeighbor.js.map +1 -1
- package/dist/esm/tlv/diag/Timeout.d.ts +3 -2
- package/dist/esm/tlv/diag/Timeout.d.ts.map +1 -1
- package/dist/esm/tlv/diag/Timeout.js +5 -4
- package/dist/esm/tlv/diag/Timeout.js.map +1 -1
- package/dist/esm/tlv/diag/VendorInfo.d.ts +13 -12
- package/dist/esm/tlv/diag/VendorInfo.d.ts.map +1 -1
- package/dist/esm/tlv/diag/VendorInfo.js +5 -4
- package/dist/esm/tlv/diag/VendorInfo.js.map +1 -1
- package/dist/esm/tlv/meshcop/Ip6AddressTlv.d.ts +3 -2
- package/dist/esm/tlv/meshcop/Ip6AddressTlv.d.ts.map +1 -1
- package/dist/esm/tlv/meshcop/Ip6AddressTlv.js +7 -4
- package/dist/esm/tlv/meshcop/Ip6AddressTlv.js.map +1 -1
- package/dist/esm/tlv/meshcop/UdpEncapsulationTlv.d.ts +4 -3
- package/dist/esm/tlv/meshcop/UdpEncapsulationTlv.d.ts.map +1 -1
- package/dist/esm/tlv/meshcop/UdpEncapsulationTlv.js +10 -8
- package/dist/esm/tlv/meshcop/UdpEncapsulationTlv.js.map +1 -1
- package/dist/esm/util/meshLocalAddr.d.ts +5 -4
- package/dist/esm/util/meshLocalAddr.d.ts.map +1 -1
- package/dist/esm/util/meshLocalAddr.js +7 -5
- package/dist/esm/util/meshLocalAddr.js.map +1 -1
- package/package.json +5 -5
- package/src/coap/CoapClient.ts +13 -20
- package/src/coap/CoapMessage.ts +17 -9
- package/src/commissioner/Commissioner.ts +5 -2
- package/src/commissioner/LeadKa.ts +4 -4
- package/src/commissioner/LeadPet.ts +6 -5
- package/src/credentials/ThreadCredentialsRegistry.ts +14 -13
- package/src/credentials/ThreadNetworkCredentials.ts +5 -3
- package/src/crypto/AesCmacPrf128.ts +10 -87
- package/src/crypto/Pbkdf2AesCmac.ts +14 -10
- package/src/crypto/Pskc.ts +7 -6
- package/src/crypto/index.ts +1 -1
- package/src/dataset/OperationalDataset.ts +48 -47
- package/src/dataset/SecurityPolicy.ts +8 -7
- package/src/diagnostic/DiagnosticResponse.ts +5 -4
- package/src/diagnostic/DiagnosticSource.ts +2 -2
- package/src/diagnostic/MeshCopDiagnosticSource.ts +80 -64
- package/src/diagnostic/connectMeshcop.ts +6 -14
- package/src/diagnostic/errors.ts +1 -1
- package/src/discovery/BorderRouterRegistry.ts +2 -4
- package/src/dtls/channel/DtlsConnectOpts.ts +3 -3
- package/src/dtls/channel/NobleDtlsChannel.ts +96 -60
- package/src/dtls/ecjpake/EcJpakePms.ts +5 -6
- package/src/dtls/ecjpake/EcJpakeRound.ts +57 -37
- package/src/dtls/ecjpake/SchnorrZkp.ts +43 -30
- package/src/dtls/handshake/ChangeCipherSpec.ts +3 -1
- package/src/dtls/handshake/ClientHelloMessage.ts +8 -6
- package/src/dtls/handshake/ClientKeyExchangeMessage.ts +2 -1
- package/src/dtls/handshake/DtlsClient.ts +119 -95
- package/src/dtls/handshake/FinishedMessage.ts +5 -3
- package/src/dtls/handshake/HandshakeMessage.ts +18 -16
- package/src/dtls/handshake/HelloVerifyRequestMessage.ts +3 -1
- package/src/dtls/handshake/ServerHelloDoneMessage.ts +5 -3
- package/src/dtls/handshake/ServerHelloMessage.ts +5 -3
- package/src/dtls/handshake/ServerKeyExchangeMessage.ts +2 -1
- package/src/dtls/prf/HandshakeTranscript.ts +18 -11
- package/src/dtls/prf/TlsPrf.ts +68 -54
- package/src/dtls/record/AesCcm8.ts +23 -49
- package/src/dtls/record/DtlsCipherState.ts +20 -16
- package/src/dtls/record/DtlsRecord.ts +17 -15
- package/src/otbr-rest/OtbrRestCapability.ts +4 -4
- package/src/otbr-rest/OtbrRestClient.ts +64 -29
- package/src/otbr-rest/OtbrRestDiagnosticSource.ts +5 -5
- package/src/otbr-rest/OtbrRestProbe.ts +12 -47
- package/src/otbr-rest/caseNormalizer.ts +17 -0
- package/src/otbr-rest/parseHexBytes.ts +47 -0
- package/src/otbr-rest/translation.ts +24 -22
- package/src/selection/selectBr.ts +26 -13
- package/src/selection/withExtPanIdLock.ts +1 -1
- package/src/tlv/BasicTlvCodec.ts +17 -15
- package/src/tlv/NetworkDiagnosticTlv.ts +3 -2
- package/src/tlv/TypeListTlv.ts +4 -4
- package/src/tlv/diag/ChildIpv6AddressList.ts +8 -5
- package/src/tlv/diag/ChildTable.ts +10 -9
- package/src/tlv/diag/Connectivity.ts +16 -16
- package/src/tlv/diag/Ipv6AddressList.ts +9 -8
- package/src/tlv/diag/LeaderData.ts +11 -10
- package/src/tlv/diag/MacCounters.ts +15 -14
- package/src/tlv/diag/MleCounters.ts +21 -20
- package/src/tlv/diag/Mode.ts +7 -5
- package/src/tlv/diag/NetworkData.ts +31 -26
- package/src/tlv/diag/Primitives.ts +42 -36
- package/src/tlv/diag/Route64.ts +11 -10
- package/src/tlv/diag/RouterNeighbor.ts +16 -13
- package/src/tlv/diag/Timeout.ts +7 -6
- package/src/tlv/diag/VendorInfo.ts +19 -18
- package/src/tlv/meshcop/Ip6AddressTlv.ts +9 -6
- package/src/tlv/meshcop/UdpEncapsulationTlv.ts +13 -11
- package/src/util/meshLocalAddr.ts +10 -8
|
@@ -9,6 +9,7 @@ import {
|
|
|
9
9
|
Crypto,
|
|
10
10
|
type Duration,
|
|
11
11
|
type Entropy,
|
|
12
|
+
errorOf,
|
|
12
13
|
ImplementationError,
|
|
13
14
|
InternalError,
|
|
14
15
|
Logger,
|
|
@@ -102,8 +103,16 @@ export class NobleDtlsChannel implements DtlsChannel {
|
|
|
102
103
|
|
|
103
104
|
#udp: UdpSocket | undefined;
|
|
104
105
|
#client: DtlsClient | undefined;
|
|
106
|
+
#crypto: Crypto | undefined;
|
|
105
107
|
#retransmit: DtlsRetransmitTimer | undefined;
|
|
106
108
|
|
|
109
|
+
/**
|
|
110
|
+
* Serializes every DtlsClient / record-codec interaction. UDP `onData` fires
|
|
111
|
+
* sequentially but async handlers interleave at each `await`; chaining onto this
|
|
112
|
+
* promise guarantees datagrams and retransmits never re-enter the client concurrently.
|
|
113
|
+
*/
|
|
114
|
+
#inbound: Promise<void> = Promise.resolve();
|
|
115
|
+
|
|
107
116
|
/** Established cipher state (snapshot of the DtlsClient's after handshake). */
|
|
108
117
|
#cipherState: DtlsCipherState | undefined;
|
|
109
118
|
#connected = false;
|
|
@@ -153,14 +162,18 @@ export class NobleDtlsChannel implements DtlsChannel {
|
|
|
153
162
|
|
|
154
163
|
const environment = this.#opts.environment;
|
|
155
164
|
const network = environment.get(Network);
|
|
156
|
-
const
|
|
165
|
+
const crypto = environment.get(Crypto);
|
|
166
|
+
this.#crypto = crypto;
|
|
157
167
|
const udp = await network.createUdpSocket({ type: this.#udpType, listeningPort: 0 });
|
|
158
168
|
if (this.#closed) {
|
|
159
169
|
await udp.close();
|
|
160
170
|
throw new ImplementationError("NobleDtlsChannel.connect: closed");
|
|
161
171
|
}
|
|
162
172
|
this.#udp = udp;
|
|
163
|
-
udp.onData((_netInterface, _peerAddress, _peerPort, data) =>
|
|
173
|
+
udp.onData((_netInterface, _peerAddress, _peerPort, data) => {
|
|
174
|
+
const bytes = Bytes.of(data);
|
|
175
|
+
this.#enqueue(() => this.#onDatagram(bytes));
|
|
176
|
+
});
|
|
164
177
|
|
|
165
178
|
const initialRetransmit: Duration =
|
|
166
179
|
this.#opts.initialRetransmitMs !== undefined
|
|
@@ -170,9 +183,10 @@ export class NobleDtlsChannel implements DtlsChannel {
|
|
|
170
183
|
this.#opts.maxRetransmitMs !== undefined ? Millis(this.#opts.maxRetransmitMs) : DEFAULT_MAX_RETRANSMIT;
|
|
171
184
|
|
|
172
185
|
const clientCfg: DtlsClientConfig = {
|
|
186
|
+
crypto,
|
|
173
187
|
password: this.#opts.password,
|
|
174
|
-
random: this.#opts.random ?? (() => defaultRandom(
|
|
175
|
-
ephemeralScalar: this.#opts.ephemeralScalar ?? (() => defaultEphemeralScalar(
|
|
188
|
+
random: this.#opts.random ?? (() => defaultRandom(crypto)),
|
|
189
|
+
ephemeralScalar: this.#opts.ephemeralScalar ?? (() => defaultEphemeralScalar(crypto)),
|
|
176
190
|
initialRetransmitMs: initialRetransmit,
|
|
177
191
|
maxRetransmitMs: maxRetransmit,
|
|
178
192
|
mtu: this.#opts.mtu ?? DEFAULT_MTU,
|
|
@@ -184,7 +198,7 @@ export class NobleDtlsChannel implements DtlsChannel {
|
|
|
184
198
|
initialMs: initialRetransmit,
|
|
185
199
|
maxMs: maxRetransmit,
|
|
186
200
|
maxRetransmits: this.#opts.maxRetransmits ?? DEFAULT_MAX_RETRANSMITS,
|
|
187
|
-
onRetransmit: () => this.#onRetransmit(),
|
|
201
|
+
onRetransmit: () => this.#enqueue(() => this.#onRetransmit()),
|
|
188
202
|
onGiveUp: () => this.#fail(new DtlsError("NobleDtlsChannel: handshake gave up after max retransmits")),
|
|
189
203
|
});
|
|
190
204
|
|
|
@@ -197,14 +211,9 @@ export class NobleDtlsChannel implements DtlsChannel {
|
|
|
197
211
|
this.#fail(new TimeoutError(`NobleDtlsChannel: connect timed out after ${connectTimeout}ms`)),
|
|
198
212
|
).start();
|
|
199
213
|
|
|
200
|
-
// Drive the first flight
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
this.#sendRecords(step.records);
|
|
204
|
-
this.#retransmit.armNewFlight();
|
|
205
|
-
} catch (e) {
|
|
206
|
-
this.#fail(e instanceof Error ? e : new InternalError(String(e)));
|
|
207
|
-
}
|
|
214
|
+
// Drive the first flight on the same serialization queue as inbound/retransmit,
|
|
215
|
+
// so a datagram arriving mid-`start()` cannot re-enter the client concurrently.
|
|
216
|
+
this.#enqueue(() => this.#startHandshake());
|
|
208
217
|
|
|
209
218
|
try {
|
|
210
219
|
await connectPromise;
|
|
@@ -223,18 +232,22 @@ export class NobleDtlsChannel implements DtlsChannel {
|
|
|
223
232
|
}
|
|
224
233
|
const cipherState = this.#cipherState;
|
|
225
234
|
const udp = this.#udp;
|
|
226
|
-
|
|
235
|
+
const crypto = this.#crypto;
|
|
236
|
+
if (cipherState === undefined || udp === undefined || crypto === undefined) {
|
|
227
237
|
throw new InternalError("NobleDtlsChannel.send: missing cipher state or transport");
|
|
228
238
|
}
|
|
229
239
|
const seq = cipherState.nextWriteSeq();
|
|
230
|
-
const record =
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
240
|
+
const record = Bytes.of(
|
|
241
|
+
await DtlsRecord.encode(
|
|
242
|
+
crypto,
|
|
243
|
+
{
|
|
244
|
+
type: ContentType.APPLICATION_DATA,
|
|
245
|
+
epoch: cipherState.writeEpoch,
|
|
246
|
+
sequenceNumber: seq,
|
|
247
|
+
fragment: Bytes.of(bytes),
|
|
248
|
+
},
|
|
249
|
+
cipherState,
|
|
250
|
+
),
|
|
238
251
|
);
|
|
239
252
|
await this.#sendDatagram(udp, record);
|
|
240
253
|
}
|
|
@@ -285,17 +298,21 @@ export class NobleDtlsChannel implements DtlsChannel {
|
|
|
285
298
|
// Best-effort close_notify alert at epoch 1 if armed.
|
|
286
299
|
const cipherState = this.#cipherState;
|
|
287
300
|
const udp = this.#udp;
|
|
288
|
-
|
|
301
|
+
const crypto = this.#crypto;
|
|
302
|
+
if (this.#connected && cipherState !== undefined && udp !== undefined && crypto !== undefined) {
|
|
289
303
|
try {
|
|
290
304
|
const seq = cipherState.nextWriteSeq();
|
|
291
|
-
const alertRecord =
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
305
|
+
const alertRecord = Bytes.of(
|
|
306
|
+
await DtlsRecord.encode(
|
|
307
|
+
crypto,
|
|
308
|
+
{
|
|
309
|
+
type: ContentType.ALERT,
|
|
310
|
+
epoch: cipherState.writeEpoch,
|
|
311
|
+
sequenceNumber: seq,
|
|
312
|
+
fragment: Uint8Array.of(ALERT_LEVEL_WARNING, ALERT_DESC_CLOSE_NOTIFY),
|
|
313
|
+
},
|
|
314
|
+
cipherState,
|
|
315
|
+
),
|
|
299
316
|
);
|
|
300
317
|
await this.#sendDatagram(udp, alertRecord).catch(() => {});
|
|
301
318
|
} catch {
|
|
@@ -337,28 +354,50 @@ export class NobleDtlsChannel implements DtlsChannel {
|
|
|
337
354
|
// -----------------------------------------------------------------------
|
|
338
355
|
// Internals
|
|
339
356
|
|
|
340
|
-
|
|
357
|
+
/**
|
|
358
|
+
* Chain `work` onto the single serialization queue. The `.catch` routes any error to
|
|
359
|
+
* {@link #fail} (which rejects the pending connect / settles the channel error state)
|
|
360
|
+
* and keeps the queue alive — errors surface, never swallowed.
|
|
361
|
+
*/
|
|
362
|
+
#enqueue(work: () => Promise<void>): void {
|
|
363
|
+
this.#inbound = this.#inbound.then(work).catch(err => this.#fail(errorOf(err)));
|
|
364
|
+
}
|
|
365
|
+
|
|
366
|
+
async #startHandshake(): Promise<void> {
|
|
367
|
+
const client = this.#client;
|
|
368
|
+
const retransmit = this.#retransmit;
|
|
369
|
+
if (client === undefined || retransmit === undefined) {
|
|
370
|
+
throw new InternalError("NobleDtlsChannel: start before client/timer initialised");
|
|
371
|
+
}
|
|
372
|
+
const step = await client.start();
|
|
373
|
+
if (this.#closed) {
|
|
374
|
+
return;
|
|
375
|
+
}
|
|
376
|
+
this.#sendRecords(step.records);
|
|
377
|
+
retransmit.armNewFlight();
|
|
378
|
+
}
|
|
379
|
+
|
|
380
|
+
async #onDatagram(bytes: Uint8Array): Promise<void> {
|
|
341
381
|
if (this.#closed) {
|
|
342
382
|
return;
|
|
343
383
|
}
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
this.#handleHandshakeDatagram(bytes);
|
|
349
|
-
}
|
|
350
|
-
} catch (e) {
|
|
351
|
-
this.#fail(e instanceof Error ? e : new InternalError(String(e)));
|
|
384
|
+
if (this.#connected) {
|
|
385
|
+
await this.#handleAppDatagram(bytes);
|
|
386
|
+
} else {
|
|
387
|
+
await this.#handleHandshakeDatagram(bytes);
|
|
352
388
|
}
|
|
353
389
|
}
|
|
354
390
|
|
|
355
|
-
#handleHandshakeDatagram(bytes: Uint8Array): void {
|
|
391
|
+
async #handleHandshakeDatagram(bytes: Uint8Array): Promise<void> {
|
|
356
392
|
const client = this.#client;
|
|
357
393
|
const retransmit = this.#retransmit;
|
|
358
394
|
if (client === undefined || retransmit === undefined) {
|
|
359
395
|
throw new InternalError("NobleDtlsChannel: handshake datagram before client/timer initialised");
|
|
360
396
|
}
|
|
361
|
-
const step = client.onDatagram(bytes);
|
|
397
|
+
const step = await client.onDatagram(bytes);
|
|
398
|
+
if (this.#closed) {
|
|
399
|
+
return;
|
|
400
|
+
}
|
|
362
401
|
// RFC 6347 §4.2.4: receiving the next flight implicitly acknowledges the previous one.
|
|
363
402
|
retransmit.cancel();
|
|
364
403
|
if (step.records.length > 0) {
|
|
@@ -377,9 +416,10 @@ export class NobleDtlsChannel implements DtlsChannel {
|
|
|
377
416
|
}
|
|
378
417
|
}
|
|
379
418
|
|
|
380
|
-
#handleAppDatagram(bytes: Uint8Array): void {
|
|
419
|
+
async #handleAppDatagram(bytes: Uint8Array): Promise<void> {
|
|
381
420
|
const cipherState = this.#cipherState;
|
|
382
|
-
|
|
421
|
+
const crypto = this.#crypto;
|
|
422
|
+
if (cipherState === undefined || crypto === undefined) {
|
|
383
423
|
throw new InternalError("NobleDtlsChannel: post-handshake datagram with no cipher state");
|
|
384
424
|
}
|
|
385
425
|
let p = 0;
|
|
@@ -395,7 +435,7 @@ export class NobleDtlsChannel implements DtlsChannel {
|
|
|
395
435
|
const slice = bytes.subarray(p, recordEnd);
|
|
396
436
|
let record: DtlsRecord;
|
|
397
437
|
try {
|
|
398
|
-
({ record } = DtlsRecord.decode(slice, cipherState));
|
|
438
|
+
({ record } = await DtlsRecord.decode(crypto, slice, cipherState));
|
|
399
439
|
} catch (e) {
|
|
400
440
|
// RFC 6347 §4.1.2.6: a replayed/old-sequence record is benign (normal UDP
|
|
401
441
|
// duplication) — drop just this record and keep processing the datagram.
|
|
@@ -408,16 +448,17 @@ export class NobleDtlsChannel implements DtlsChannel {
|
|
|
408
448
|
throw e;
|
|
409
449
|
}
|
|
410
450
|
if (record.type === ContentType.APPLICATION_DATA) {
|
|
411
|
-
this.#deliverPlaintext(record.fragment);
|
|
451
|
+
this.#deliverPlaintext(Bytes.of(record.fragment));
|
|
412
452
|
} else if (record.type === ContentType.ALERT) {
|
|
453
|
+
const alertFragment = Bytes.of(record.fragment);
|
|
413
454
|
// close_notify (level=1, desc=0) ends the session; other alerts surface as errors.
|
|
414
|
-
if (
|
|
455
|
+
if (alertFragment.length >= 2 && alertFragment[1] === ALERT_DESC_CLOSE_NOTIFY) {
|
|
415
456
|
this.#fail(new DtlsError("NobleDtlsChannel: peer sent close_notify"));
|
|
416
457
|
return;
|
|
417
458
|
}
|
|
418
459
|
this.#fail(
|
|
419
460
|
new DtlsError(
|
|
420
|
-
`NobleDtlsChannel: peer alert level=${
|
|
461
|
+
`NobleDtlsChannel: peer alert level=${alertFragment[0] ?? -1} desc=${alertFragment[1] ?? -1}`,
|
|
421
462
|
),
|
|
422
463
|
);
|
|
423
464
|
return;
|
|
@@ -441,20 +482,16 @@ export class NobleDtlsChannel implements DtlsChannel {
|
|
|
441
482
|
}
|
|
442
483
|
}
|
|
443
484
|
|
|
444
|
-
#onRetransmit(): void {
|
|
485
|
+
async #onRetransmit(): Promise<void> {
|
|
445
486
|
const client = this.#client;
|
|
446
487
|
if (client === undefined || this.#connected || this.#closed) {
|
|
447
488
|
return;
|
|
448
489
|
}
|
|
449
|
-
|
|
450
|
-
|
|
451
|
-
this.#sendRecords(step.records);
|
|
452
|
-
} catch (e) {
|
|
453
|
-
this.#fail(e instanceof Error ? e : new InternalError(String(e)));
|
|
454
|
-
}
|
|
490
|
+
const step = await client.onRetransmit();
|
|
491
|
+
this.#sendRecords(step.records);
|
|
455
492
|
}
|
|
456
493
|
|
|
457
|
-
#sendRecords(records:
|
|
494
|
+
#sendRecords(records: Bytes[]): void {
|
|
458
495
|
const udp = this.#udp;
|
|
459
496
|
if (udp === undefined) {
|
|
460
497
|
throw new InternalError("NobleDtlsChannel: send before bind");
|
|
@@ -469,7 +506,8 @@ export class NobleDtlsChannel implements DtlsChannel {
|
|
|
469
506
|
const datagrams = new Array<Uint8Array>();
|
|
470
507
|
let acc = new Array<Uint8Array>();
|
|
471
508
|
let accLen = 0;
|
|
472
|
-
for (const
|
|
509
|
+
for (const rawRecord of records) {
|
|
510
|
+
const record = Bytes.of(rawRecord);
|
|
473
511
|
if (accLen > 0 && accLen + record.length > mtu) {
|
|
474
512
|
datagrams.push(concatBuffers(acc));
|
|
475
513
|
acc = [];
|
|
@@ -482,9 +520,7 @@ export class NobleDtlsChannel implements DtlsChannel {
|
|
|
482
520
|
datagrams.push(concatBuffers(acc));
|
|
483
521
|
}
|
|
484
522
|
for (const dg of datagrams) {
|
|
485
|
-
void this.#sendDatagram(udp, dg).catch(e =>
|
|
486
|
-
this.#fail(e instanceof Error ? e : new InternalError(String(e))),
|
|
487
|
-
);
|
|
523
|
+
void this.#sendDatagram(udp, dg).catch(e => this.#fail(errorOf(e)));
|
|
488
524
|
}
|
|
489
525
|
}
|
|
490
526
|
|
|
@@ -4,9 +4,8 @@
|
|
|
4
4
|
* SPDX-License-Identifier: Apache-2.0
|
|
5
5
|
*/
|
|
6
6
|
|
|
7
|
-
import { InternalError } from "@matter/general";
|
|
7
|
+
import { Bytes, Crypto, InternalError } from "@matter/general";
|
|
8
8
|
import { p256 } from "@noble/curves/nist.js";
|
|
9
|
-
import { sha256 } from "@noble/hashes/sha2.js";
|
|
10
9
|
import { DtlsError } from "../channel/DtlsChannel.js";
|
|
11
10
|
|
|
12
11
|
const Point = p256.Point;
|
|
@@ -35,7 +34,7 @@ const COORDINATE_BYTES = 32;
|
|
|
35
34
|
* TLS 1.2 PRF takes over (Phase 0c.5 / DTLS layer).
|
|
36
35
|
*/
|
|
37
36
|
export const EcJpakePms = {
|
|
38
|
-
derive(args: { Xp:
|
|
37
|
+
async derive(crypto: Crypto, args: { Xp: Bytes; Xp2: Bytes; xm2: bigint; s: bigint }): Promise<Bytes> {
|
|
39
38
|
const { Xp, Xp2, xm2, s } = args;
|
|
40
39
|
if (xm2 <= 0n || xm2 >= N) {
|
|
41
40
|
throw new InternalError("xm2 must be in [1, n-1]");
|
|
@@ -43,8 +42,8 @@ export const EcJpakePms = {
|
|
|
43
42
|
if (s <= 0n) {
|
|
44
43
|
throw new InternalError("s (password as integer) must be positive");
|
|
45
44
|
}
|
|
46
|
-
const Xp_pt = Point.fromBytes(Xp);
|
|
47
|
-
const Xp2_pt = Point.fromBytes(Xp2);
|
|
45
|
+
const Xp_pt = Point.fromBytes(Bytes.of(Xp));
|
|
46
|
+
const Xp2_pt = Point.fromBytes(Bytes.of(Xp2));
|
|
48
47
|
if (Xp_pt.is0() || Xp2_pt.is0()) {
|
|
49
48
|
throw new DtlsError("peer points must not be the point at infinity");
|
|
50
49
|
}
|
|
@@ -60,6 +59,6 @@ export const EcJpakePms = {
|
|
|
60
59
|
// 0x04 || X(32) || Y(32) — slice X out at offset 1.
|
|
61
60
|
const sec1 = K.toBytes(false);
|
|
62
61
|
const xBytes = sec1.subarray(1, 1 + COORDINATE_BYTES);
|
|
63
|
-
return
|
|
62
|
+
return Bytes.of(await crypto.computeHash(xBytes));
|
|
64
63
|
},
|
|
65
64
|
} as const;
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
* SPDX-License-Identifier: Apache-2.0
|
|
5
5
|
*/
|
|
6
6
|
|
|
7
|
-
import { InternalError } from "@matter/general";
|
|
7
|
+
import { Bytes, Crypto, InternalError } from "@matter/general";
|
|
8
8
|
import { p256 } from "@noble/curves/nist.js";
|
|
9
9
|
import { DtlsError } from "../channel/DtlsChannel.js";
|
|
10
10
|
import { SchnorrZkp, type SchnorrZkpGenerator } from "./SchnorrZkp.js";
|
|
@@ -22,7 +22,7 @@ import { SchnorrZkp, type SchnorrZkpGenerator } from "./SchnorrZkp.js";
|
|
|
22
22
|
*/
|
|
23
23
|
export interface EcJpakeKeyKP {
|
|
24
24
|
/** SEC1-uncompressed public key `X = x*G`. */
|
|
25
|
-
X:
|
|
25
|
+
X: Bytes;
|
|
26
26
|
/** Schnorr ZKP proving knowledge of `x`. */
|
|
27
27
|
zkp: SchnorrZkp;
|
|
28
28
|
}
|
|
@@ -57,38 +57,44 @@ function readSlice(bytes: Uint8Array, offset: number, length: number): Uint8Arra
|
|
|
57
57
|
}
|
|
58
58
|
|
|
59
59
|
function validateKeyKP(keyKP: EcJpakeKeyKP): void {
|
|
60
|
-
|
|
60
|
+
const X = Bytes.of(keyKP.X);
|
|
61
|
+
const V = Bytes.of(keyKP.zkp.V);
|
|
62
|
+
const r = Bytes.of(keyKP.zkp.r);
|
|
63
|
+
if (X.length !== POINT_LEN || X[0] !== 0x04) {
|
|
61
64
|
throw new InternalError("X must be SEC1-uncompressed P-256 (65 bytes, 0x04 prefix)");
|
|
62
65
|
}
|
|
63
|
-
if (
|
|
66
|
+
if (V.length !== POINT_LEN || V[0] !== 0x04) {
|
|
64
67
|
throw new InternalError("ZKP.V must be SEC1-uncompressed P-256 (65 bytes, 0x04 prefix)");
|
|
65
68
|
}
|
|
66
|
-
if (
|
|
67
|
-
throw new InternalError(`ZKP.r length must be 1..255, got ${
|
|
69
|
+
if (r.length === 0 || r.length > 255) {
|
|
70
|
+
throw new InternalError(`ZKP.r length must be 1..255, got ${r.length}`);
|
|
68
71
|
}
|
|
69
72
|
// Minimal-encoding invariant: leading byte must be non-zero (except r === 0,
|
|
70
73
|
// already excluded above). mbedTLS produces the minimal form via mbedtls_mpi_size,
|
|
71
74
|
// so ours must too if we want byte-identical output.
|
|
72
|
-
if (
|
|
75
|
+
if (r[0] === 0x00) {
|
|
73
76
|
throw new InternalError("ZKP.r must be minimal big-endian (no leading zero)");
|
|
74
77
|
}
|
|
75
78
|
}
|
|
76
79
|
|
|
77
80
|
function keyKpEncodedLength(keyKP: EcJpakeKeyKP): number {
|
|
78
|
-
return 1 + POINT_LEN + 1 + POINT_LEN + 1 + keyKP.zkp.r.
|
|
81
|
+
return 1 + POINT_LEN + 1 + POINT_LEN + 1 + keyKP.zkp.r.byteLength;
|
|
79
82
|
}
|
|
80
83
|
|
|
81
84
|
function writeKeyKP(keyKP: EcJpakeKeyKP, out: Uint8Array, offset: number): number {
|
|
85
|
+
const X = Bytes.of(keyKP.X);
|
|
86
|
+
const V = Bytes.of(keyKP.zkp.V);
|
|
87
|
+
const r = Bytes.of(keyKP.zkp.r);
|
|
82
88
|
let p = offset;
|
|
83
89
|
out[p++] = POINT_LEN;
|
|
84
|
-
out.set(
|
|
90
|
+
out.set(X, p);
|
|
85
91
|
p += POINT_LEN;
|
|
86
92
|
out[p++] = POINT_LEN;
|
|
87
|
-
out.set(
|
|
93
|
+
out.set(V, p);
|
|
88
94
|
p += POINT_LEN;
|
|
89
|
-
out[p++] =
|
|
90
|
-
out.set(
|
|
91
|
-
p +=
|
|
95
|
+
out[p++] = r.length;
|
|
96
|
+
out.set(r, p);
|
|
97
|
+
p += r.length;
|
|
92
98
|
return p;
|
|
93
99
|
}
|
|
94
100
|
|
|
@@ -137,22 +143,25 @@ export const EcJpakeRound = {
|
|
|
137
143
|
*
|
|
138
144
|
* `id` is `ECJPAKE_ID_CLIENT` for the joiner and `ECJPAKE_ID_SERVER` for the commissioner.
|
|
139
145
|
*/
|
|
140
|
-
buildRound1(
|
|
146
|
+
async buildRound1(
|
|
147
|
+
crypto: Crypto,
|
|
148
|
+
args: { x1: bigint; x2: bigint; v1: bigint; v2: bigint; id: string },
|
|
149
|
+
): Promise<{
|
|
141
150
|
kp1: EcJpakeKeyKP;
|
|
142
151
|
kp2: EcJpakeKeyKP;
|
|
143
|
-
} {
|
|
152
|
+
}> {
|
|
144
153
|
const { x1, x2, v1, v2, id } = args;
|
|
145
154
|
const X1 = Point.BASE.multiply(x1).toBytes(false);
|
|
146
155
|
const X2 = Point.BASE.multiply(x2).toBytes(false);
|
|
147
|
-
const zkp1 = SchnorrZkp.generate({ privateKey: x1, publicKey: X1, ephemeral: v1, id });
|
|
148
|
-
const zkp2 = SchnorrZkp.generate({ privateKey: x2, publicKey: X2, ephemeral: v2, id });
|
|
156
|
+
const zkp1 = await SchnorrZkp.generate(crypto, { privateKey: x1, publicKey: X1, ephemeral: v1, id });
|
|
157
|
+
const zkp2 = await SchnorrZkp.generate(crypto, { privateKey: x2, publicKey: X2, ephemeral: v2, id });
|
|
149
158
|
return {
|
|
150
159
|
kp1: { X: X1, zkp: zkp1 },
|
|
151
160
|
kp2: { X: X2, zkp: zkp2 },
|
|
152
161
|
};
|
|
153
162
|
},
|
|
154
163
|
|
|
155
|
-
serializeRound1(kp1: EcJpakeKeyKP, kp2: EcJpakeKeyKP):
|
|
164
|
+
serializeRound1(kp1: EcJpakeKeyKP, kp2: EcJpakeKeyKP): Bytes {
|
|
156
165
|
validateKeyKP(kp1);
|
|
157
166
|
validateKeyKP(kp2);
|
|
158
167
|
const out = new Uint8Array(keyKpEncodedLength(kp1) + keyKpEncodedLength(kp2));
|
|
@@ -161,11 +170,12 @@ export const EcJpakeRound = {
|
|
|
161
170
|
return out;
|
|
162
171
|
},
|
|
163
172
|
|
|
164
|
-
parseRound1(bytes:
|
|
165
|
-
const
|
|
166
|
-
const
|
|
167
|
-
|
|
168
|
-
|
|
173
|
+
parseRound1(bytes: Bytes): { kp1: EcJpakeKeyKP; kp2: EcJpakeKeyKP } {
|
|
174
|
+
const buf = Bytes.of(bytes);
|
|
175
|
+
const first = readKeyKP(buf, 0);
|
|
176
|
+
const second = readKeyKP(buf, first.nextOffset);
|
|
177
|
+
if (second.nextOffset !== buf.length) {
|
|
178
|
+
throw new DtlsError(`trailing bytes after round-1 pair: ${buf.length - second.nextOffset} extra`);
|
|
169
179
|
}
|
|
170
180
|
return { kp1: first.kp, kp2: second.kp };
|
|
171
181
|
},
|
|
@@ -176,8 +186,11 @@ export const EcJpakeRound = {
|
|
|
176
186
|
* Both sides use the same formula by symmetry — for the client `Xp1 = X3`,
|
|
177
187
|
* `Xp2 = X4`, `Xm1 = X1`; for the server `Xp1 = X1`, `Xp2 = X2`, `Xm1 = X3`.
|
|
178
188
|
*/
|
|
179
|
-
composeRound2Generator(args: { Xp1:
|
|
180
|
-
const
|
|
189
|
+
composeRound2Generator(args: { Xp1: Bytes; Xp2: Bytes; Xm1: Bytes }): SchnorrZkpGenerator {
|
|
190
|
+
const Xp1 = Bytes.of(args.Xp1);
|
|
191
|
+
const Xp2 = Bytes.of(args.Xp2);
|
|
192
|
+
const Xm1 = Bytes.of(args.Xm1);
|
|
193
|
+
const point = Point.fromBytes(Xp1).add(Point.fromBytes(Xp2)).add(Point.fromBytes(Xm1));
|
|
181
194
|
if (point.is0()) {
|
|
182
195
|
throw new DtlsError("round-2 generator G' must not be the point at infinity");
|
|
183
196
|
}
|
|
@@ -193,7 +206,10 @@ export const EcJpakeRound = {
|
|
|
193
206
|
* Caller-supplied `v` makes output deterministic for testing; production
|
|
194
207
|
* callers must source `v` from a CSPRNG.
|
|
195
208
|
*/
|
|
196
|
-
buildRound2(
|
|
209
|
+
async buildRound2(
|
|
210
|
+
crypto: Crypto,
|
|
211
|
+
args: { xm2: bigint; s: bigint; v: bigint; id: string; generator: SchnorrZkpGenerator },
|
|
212
|
+
): Promise<EcJpakeKeyKP> {
|
|
197
213
|
const { xm2, s, v, id, generator } = args;
|
|
198
214
|
if (xm2 <= 0n || xm2 >= N) {
|
|
199
215
|
throw new InternalError("xm2 must be in [1, n-1]");
|
|
@@ -207,7 +223,7 @@ export const EcJpakeRound = {
|
|
|
207
223
|
}
|
|
208
224
|
const Xm = generator.point.multiply(xm);
|
|
209
225
|
const XmBytes = Xm.toBytes(false);
|
|
210
|
-
const zkp = SchnorrZkp.generate({
|
|
226
|
+
const zkp = await SchnorrZkp.generate(crypto, {
|
|
211
227
|
privateKey: xm,
|
|
212
228
|
publicKey: XmBytes,
|
|
213
229
|
ephemeral: v,
|
|
@@ -225,7 +241,7 @@ export const EcJpakeRound = {
|
|
|
225
241
|
* Server-side messages (ServerKeyExchange) use `true`; client-side
|
|
226
242
|
* (ClientKeyExchange) uses `false`.
|
|
227
243
|
*/
|
|
228
|
-
serializeRound2(kp: EcJpakeKeyKP, options: { prependEcParameters: boolean }):
|
|
244
|
+
serializeRound2(kp: EcJpakeKeyKP, options: { prependEcParameters: boolean }): Bytes {
|
|
229
245
|
validateKeyKP(kp);
|
|
230
246
|
const headerLen = options.prependEcParameters ? 3 : 0;
|
|
231
247
|
const out = new Uint8Array(headerLen + keyKpEncodedLength(kp));
|
|
@@ -244,24 +260,25 @@ export const EcJpakeRound = {
|
|
|
244
260
|
* is the client reading ServerKeyExchange, and `false` when the parser is the
|
|
245
261
|
* server reading ClientKeyExchange.
|
|
246
262
|
*/
|
|
247
|
-
parseRound2(bytes:
|
|
263
|
+
parseRound2(bytes: Bytes, options: { expectEcParameters: boolean }): EcJpakeKeyKP {
|
|
264
|
+
const buf = Bytes.of(bytes);
|
|
248
265
|
let p = 0;
|
|
249
266
|
if (options.expectEcParameters) {
|
|
250
|
-
if (
|
|
267
|
+
if (buf.length < 3) {
|
|
251
268
|
throw new DtlsError("round-2 message too short for ECParameters header");
|
|
252
269
|
}
|
|
253
|
-
if (
|
|
270
|
+
if (buf[0] !== 0x03 || buf[1] !== 0x00 || buf[2] !== 0x17) {
|
|
254
271
|
throw new DtlsError(
|
|
255
|
-
`expected ECParameters{named_curve, secp256r1} (03 00 17), got ${Array.from(
|
|
272
|
+
`expected ECParameters{named_curve, secp256r1} (03 00 17), got ${Array.from(buf.subarray(0, 3))
|
|
256
273
|
.map(b => b.toString(16).padStart(2, "0"))
|
|
257
274
|
.join(" ")}`,
|
|
258
275
|
);
|
|
259
276
|
}
|
|
260
277
|
p = 3;
|
|
261
278
|
}
|
|
262
|
-
const { kp, nextOffset } = readKeyKP(
|
|
263
|
-
if (nextOffset !==
|
|
264
|
-
throw new DtlsError(`trailing bytes after round-2 message: ${
|
|
279
|
+
const { kp, nextOffset } = readKeyKP(buf, p);
|
|
280
|
+
if (nextOffset !== buf.length) {
|
|
281
|
+
throw new DtlsError(`trailing bytes after round-2 message: ${buf.length - nextOffset} extra`);
|
|
265
282
|
}
|
|
266
283
|
return kp;
|
|
267
284
|
},
|
|
@@ -272,8 +289,11 @@ export const EcJpakeRound = {
|
|
|
272
289
|
* on any verification failure — including malformed bytes — to mirror the
|
|
273
290
|
* round-1 `SchnorrZkp.verify` contract.
|
|
274
291
|
*/
|
|
275
|
-
verifyRound2Zkp(
|
|
292
|
+
async verifyRound2Zkp(
|
|
293
|
+
crypto: Crypto,
|
|
294
|
+
args: { kp: EcJpakeKeyKP; generator: SchnorrZkpGenerator; peerId: string },
|
|
295
|
+
): Promise<boolean> {
|
|
276
296
|
const { kp, generator, peerId } = args;
|
|
277
|
-
return SchnorrZkp.verify({ zkp: kp.zkp, publicKey: kp.X, id: peerId, generator });
|
|
297
|
+
return await SchnorrZkp.verify(crypto, { zkp: kp.zkp, publicKey: kp.X, id: peerId, generator });
|
|
278
298
|
},
|
|
279
299
|
} as const;
|