@matter/protocol 0.14.1-alpha.0-20250605-9fc134af0 → 0.14.1-alpha.0-20250606-a9bcd03f9
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/dist/cjs/action/server/AccessControl.d.ts +5 -7
- package/dist/cjs/action/server/AccessControl.d.ts.map +1 -1
- package/dist/cjs/action/server/AccessControl.js.map +1 -1
- package/dist/cjs/action/server/AttributeWriteResponse.d.ts.map +1 -1
- package/dist/cjs/action/server/AttributeWriteResponse.js +23 -0
- package/dist/cjs/action/server/AttributeWriteResponse.js.map +1 -1
- package/dist/cjs/action/server/CommandInvokeResponse.d.ts.map +1 -1
- package/dist/cjs/action/server/CommandInvokeResponse.js +24 -1
- package/dist/cjs/action/server/CommandInvokeResponse.js.map +1 -1
- package/dist/cjs/action/server/DataResponse.d.ts +1 -1
- package/dist/cjs/action/server/DataResponse.d.ts.map +1 -1
- package/dist/cjs/action/server/Subject.d.ts +25 -0
- package/dist/cjs/action/server/Subject.d.ts.map +1 -0
- package/dist/cjs/action/server/Subject.js +54 -0
- package/dist/cjs/action/server/Subject.js.map +6 -0
- package/dist/cjs/action/server/index.d.ts +1 -0
- package/dist/cjs/action/server/index.d.ts.map +1 -1
- package/dist/cjs/action/server/index.js +1 -0
- package/dist/cjs/action/server/index.js.map +1 -1
- package/dist/cjs/certificate/DeviceCertification.d.ts +2 -2
- package/dist/cjs/certificate/DeviceCertification.d.ts.map +1 -1
- package/dist/cjs/certificate/DeviceCertification.js.map +1 -1
- package/dist/cjs/cluster/client/AttributeClient.d.ts +3 -3
- package/dist/cjs/cluster/client/AttributeClient.d.ts.map +1 -1
- package/dist/cjs/cluster/client/AttributeClient.js +14 -2
- package/dist/cjs/cluster/client/AttributeClient.js.map +1 -1
- package/dist/cjs/cluster/client/ClusterClient.d.ts +3 -2
- package/dist/cjs/cluster/client/ClusterClient.d.ts.map +1 -1
- package/dist/cjs/cluster/client/ClusterClient.js +60 -1
- package/dist/cjs/cluster/client/ClusterClient.js.map +1 -1
- package/dist/cjs/cluster/client/ClusterClientTypes.d.ts +33 -8
- package/dist/cjs/cluster/client/ClusterClientTypes.d.ts.map +1 -1
- package/dist/cjs/cluster/client/EventClient.d.ts +3 -3
- package/dist/cjs/cluster/client/EventClient.d.ts.map +1 -1
- package/dist/cjs/cluster/client/EventClient.js +7 -0
- package/dist/cjs/cluster/client/EventClient.js.map +1 -1
- package/dist/cjs/codec/MessageCodec.d.ts.map +1 -1
- package/dist/cjs/codec/MessageCodec.js +31 -6
- package/dist/cjs/codec/MessageCodec.js.map +1 -1
- package/dist/cjs/fabric/Fabric.d.ts +20 -30
- package/dist/cjs/fabric/Fabric.d.ts.map +1 -1
- package/dist/cjs/fabric/Fabric.js +38 -62
- package/dist/cjs/fabric/Fabric.js.map +2 -2
- package/dist/cjs/fabric/FabricManager.d.ts.map +1 -1
- package/dist/cjs/fabric/FabricManager.js +10 -4
- package/dist/cjs/fabric/FabricManager.js.map +1 -1
- package/dist/cjs/groups/FabricGroupsManager.d.ts +46 -0
- package/dist/cjs/groups/FabricGroupsManager.d.ts.map +1 -0
- package/dist/cjs/groups/FabricGroupsManager.js +155 -0
- package/dist/cjs/groups/FabricGroupsManager.js.map +6 -0
- package/dist/cjs/groups/Groups.d.ts +34 -0
- package/dist/cjs/groups/Groups.d.ts.map +1 -0
- package/dist/cjs/groups/Groups.js +89 -0
- package/dist/cjs/groups/Groups.js.map +6 -0
- package/dist/cjs/groups/KeySets.d.ts +64 -0
- package/dist/cjs/groups/KeySets.d.ts.map +1 -0
- package/dist/cjs/groups/KeySets.js +179 -0
- package/dist/cjs/groups/KeySets.js.map +6 -0
- package/dist/cjs/groups/MessagingState.d.ts +24 -0
- package/dist/cjs/groups/MessagingState.d.ts.map +1 -0
- package/dist/cjs/groups/MessagingState.js +91 -0
- package/dist/cjs/groups/MessagingState.js.map +6 -0
- package/dist/cjs/groups/index.d.ts +8 -0
- package/dist/cjs/groups/index.d.ts.map +1 -0
- package/dist/cjs/groups/index.js +25 -0
- package/dist/cjs/groups/index.js.map +6 -0
- package/dist/cjs/index.d.ts +1 -0
- package/dist/cjs/index.d.ts.map +1 -1
- package/dist/cjs/index.js +1 -0
- package/dist/cjs/index.js.map +1 -1
- package/dist/cjs/interaction/AccessControlManager.d.ts +4 -13
- package/dist/cjs/interaction/AccessControlManager.d.ts.map +1 -1
- package/dist/cjs/interaction/AccessControlManager.js +38 -47
- package/dist/cjs/interaction/AccessControlManager.js.map +1 -1
- package/dist/cjs/interaction/InteractionClient.d.ts +5 -4
- package/dist/cjs/interaction/InteractionClient.d.ts.map +1 -1
- package/dist/cjs/interaction/InteractionClient.js +53 -3
- package/dist/cjs/interaction/InteractionClient.js.map +1 -1
- package/dist/cjs/interaction/InteractionMessenger.d.ts.map +1 -1
- package/dist/cjs/interaction/InteractionMessenger.js +15 -0
- package/dist/cjs/interaction/InteractionMessenger.js.map +1 -1
- package/dist/cjs/interaction/Subscription.d.ts +3 -3
- package/dist/cjs/interaction/Subscription.d.ts.map +1 -1
- package/dist/cjs/interaction/Subscription.js.map +1 -1
- package/dist/cjs/peer/PeerAddress.d.ts +1 -0
- package/dist/cjs/peer/PeerAddress.d.ts.map +1 -1
- package/dist/cjs/peer/PeerAddress.js +5 -0
- package/dist/cjs/peer/PeerAddress.js.map +1 -1
- package/dist/cjs/peer/PeerSet.d.ts.map +1 -1
- package/dist/cjs/peer/PeerSet.js +31 -2
- package/dist/cjs/peer/PeerSet.js.map +1 -1
- package/dist/cjs/protocol/ChannelManager.d.ts.map +1 -1
- package/dist/cjs/protocol/ChannelManager.js +7 -8
- package/dist/cjs/protocol/ChannelManager.js.map +1 -1
- package/dist/cjs/protocol/ExchangeManager.d.ts.map +1 -1
- package/dist/cjs/protocol/ExchangeManager.js +39 -25
- package/dist/cjs/protocol/ExchangeManager.js.map +1 -1
- package/dist/cjs/protocol/MessageExchange.d.ts +1 -1
- package/dist/cjs/protocol/MessageExchange.d.ts.map +1 -1
- package/dist/cjs/protocol/MessageExchange.js +32 -4
- package/dist/cjs/protocol/MessageExchange.js.map +1 -1
- package/dist/cjs/protocol/MessageReceptionState.d.ts +1 -1
- package/dist/cjs/securechannel/SecureChannelProtocol.js +1 -1
- package/dist/cjs/securechannel/SecureChannelProtocol.js.map +1 -1
- package/dist/cjs/session/GroupSession.d.ts +56 -0
- package/dist/cjs/session/GroupSession.d.ts.map +1 -0
- package/dist/cjs/session/GroupSession.js +188 -0
- package/dist/cjs/session/GroupSession.js.map +6 -0
- package/dist/cjs/session/InsecureSession.d.ts +2 -1
- package/dist/cjs/session/InsecureSession.d.ts.map +1 -1
- package/dist/cjs/session/InsecureSession.js +3 -2
- package/dist/cjs/session/InsecureSession.js.map +1 -1
- package/dist/cjs/session/NodeSession.d.ts +88 -0
- package/dist/cjs/session/NodeSession.d.ts.map +1 -0
- package/dist/cjs/session/NodeSession.js +318 -0
- package/dist/cjs/session/NodeSession.js.map +6 -0
- package/dist/cjs/session/SecureSession.d.ts +10 -75
- package/dist/cjs/session/SecureSession.d.ts.map +1 -1
- package/dist/cjs/session/SecureSession.js +9 -280
- package/dist/cjs/session/SecureSession.js.map +2 -2
- package/dist/cjs/session/Session.d.ts +6 -5
- package/dist/cjs/session/Session.d.ts.map +1 -1
- package/dist/cjs/session/Session.js +11 -1
- package/dist/cjs/session/Session.js.map +1 -1
- package/dist/cjs/session/SessionManager.d.ts +27 -9
- package/dist/cjs/session/SessionManager.d.ts.map +1 -1
- package/dist/cjs/session/SessionManager.js +83 -5
- package/dist/cjs/session/SessionManager.js.map +2 -2
- package/dist/cjs/session/case/CaseClient.d.ts +1 -1
- package/dist/cjs/session/case/CaseClient.js +2 -2
- package/dist/cjs/session/case/CaseClient.js.map +1 -1
- package/dist/cjs/session/index.d.ts +2 -0
- package/dist/cjs/session/index.d.ts.map +1 -1
- package/dist/cjs/session/index.js +2 -0
- package/dist/cjs/session/index.js.map +1 -1
- package/dist/cjs/session/pase/PaseClient.d.ts +1 -1
- package/dist/esm/action/server/AccessControl.d.ts +5 -7
- package/dist/esm/action/server/AccessControl.d.ts.map +1 -1
- package/dist/esm/action/server/AccessControl.js.map +1 -1
- package/dist/esm/action/server/AttributeWriteResponse.d.ts.map +1 -1
- package/dist/esm/action/server/AttributeWriteResponse.js +23 -0
- package/dist/esm/action/server/AttributeWriteResponse.js.map +1 -1
- package/dist/esm/action/server/CommandInvokeResponse.d.ts.map +1 -1
- package/dist/esm/action/server/CommandInvokeResponse.js +24 -1
- package/dist/esm/action/server/CommandInvokeResponse.js.map +1 -1
- package/dist/esm/action/server/DataResponse.d.ts +1 -1
- package/dist/esm/action/server/DataResponse.d.ts.map +1 -1
- package/dist/esm/action/server/Subject.d.ts +25 -0
- package/dist/esm/action/server/Subject.d.ts.map +1 -0
- package/dist/esm/action/server/Subject.js +34 -0
- package/dist/esm/action/server/Subject.js.map +6 -0
- package/dist/esm/action/server/index.d.ts +1 -0
- package/dist/esm/action/server/index.d.ts.map +1 -1
- package/dist/esm/action/server/index.js +1 -0
- package/dist/esm/action/server/index.js.map +1 -1
- package/dist/esm/certificate/DeviceCertification.d.ts +2 -2
- package/dist/esm/certificate/DeviceCertification.d.ts.map +1 -1
- package/dist/esm/certificate/DeviceCertification.js.map +1 -1
- package/dist/esm/cluster/client/AttributeClient.d.ts +3 -3
- package/dist/esm/cluster/client/AttributeClient.d.ts.map +1 -1
- package/dist/esm/cluster/client/AttributeClient.js +13 -1
- package/dist/esm/cluster/client/AttributeClient.js.map +1 -1
- package/dist/esm/cluster/client/ClusterClient.d.ts +3 -2
- package/dist/esm/cluster/client/ClusterClient.d.ts.map +1 -1
- package/dist/esm/cluster/client/ClusterClient.js +61 -2
- package/dist/esm/cluster/client/ClusterClient.js.map +1 -1
- package/dist/esm/cluster/client/ClusterClientTypes.d.ts +33 -8
- package/dist/esm/cluster/client/ClusterClientTypes.d.ts.map +1 -1
- package/dist/esm/cluster/client/EventClient.d.ts +3 -3
- package/dist/esm/cluster/client/EventClient.d.ts.map +1 -1
- package/dist/esm/cluster/client/EventClient.js +7 -0
- package/dist/esm/cluster/client/EventClient.js.map +1 -1
- package/dist/esm/codec/MessageCodec.d.ts.map +1 -1
- package/dist/esm/codec/MessageCodec.js +41 -7
- package/dist/esm/codec/MessageCodec.js.map +1 -1
- package/dist/esm/fabric/Fabric.d.ts +20 -30
- package/dist/esm/fabric/Fabric.d.ts.map +1 -1
- package/dist/esm/fabric/Fabric.js +38 -62
- package/dist/esm/fabric/Fabric.js.map +2 -2
- package/dist/esm/fabric/FabricManager.d.ts.map +1 -1
- package/dist/esm/fabric/FabricManager.js +10 -4
- package/dist/esm/fabric/FabricManager.js.map +1 -1
- package/dist/esm/groups/FabricGroupsManager.d.ts +46 -0
- package/dist/esm/groups/FabricGroupsManager.d.ts.map +1 -0
- package/dist/esm/groups/FabricGroupsManager.js +135 -0
- package/dist/esm/groups/FabricGroupsManager.js.map +6 -0
- package/dist/esm/groups/Groups.d.ts +34 -0
- package/dist/esm/groups/Groups.d.ts.map +1 -0
- package/dist/esm/groups/Groups.js +69 -0
- package/dist/esm/groups/Groups.js.map +6 -0
- package/dist/esm/groups/KeySets.d.ts +64 -0
- package/dist/esm/groups/KeySets.d.ts.map +1 -0
- package/dist/esm/groups/KeySets.js +159 -0
- package/dist/esm/groups/KeySets.js.map +6 -0
- package/dist/esm/groups/MessagingState.d.ts +24 -0
- package/dist/esm/groups/MessagingState.d.ts.map +1 -0
- package/dist/esm/groups/MessagingState.js +71 -0
- package/dist/esm/groups/MessagingState.js.map +6 -0
- package/dist/esm/groups/index.d.ts +8 -0
- package/dist/esm/groups/index.d.ts.map +1 -0
- package/dist/esm/groups/index.js +8 -0
- package/dist/esm/groups/index.js.map +6 -0
- package/dist/esm/index.d.ts +1 -0
- package/dist/esm/index.d.ts.map +1 -1
- package/dist/esm/index.js +1 -0
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/interaction/AccessControlManager.d.ts +4 -13
- package/dist/esm/interaction/AccessControlManager.d.ts.map +1 -1
- package/dist/esm/interaction/AccessControlManager.js +39 -48
- package/dist/esm/interaction/AccessControlManager.js.map +1 -1
- package/dist/esm/interaction/InteractionClient.d.ts +5 -4
- package/dist/esm/interaction/InteractionClient.d.ts.map +1 -1
- package/dist/esm/interaction/InteractionClient.js +54 -4
- package/dist/esm/interaction/InteractionClient.js.map +1 -1
- package/dist/esm/interaction/InteractionMessenger.d.ts.map +1 -1
- package/dist/esm/interaction/InteractionMessenger.js +15 -0
- package/dist/esm/interaction/InteractionMessenger.js.map +1 -1
- package/dist/esm/interaction/Subscription.d.ts +3 -3
- package/dist/esm/interaction/Subscription.d.ts.map +1 -1
- package/dist/esm/interaction/Subscription.js.map +1 -1
- package/dist/esm/peer/PeerAddress.d.ts +1 -0
- package/dist/esm/peer/PeerAddress.d.ts.map +1 -1
- package/dist/esm/peer/PeerAddress.js +5 -0
- package/dist/esm/peer/PeerAddress.js.map +1 -1
- package/dist/esm/peer/PeerSet.d.ts.map +1 -1
- package/dist/esm/peer/PeerSet.js +33 -3
- package/dist/esm/peer/PeerSet.js.map +1 -1
- package/dist/esm/protocol/ChannelManager.d.ts.map +1 -1
- package/dist/esm/protocol/ChannelManager.js +7 -8
- package/dist/esm/protocol/ChannelManager.js.map +1 -1
- package/dist/esm/protocol/ExchangeManager.d.ts.map +1 -1
- package/dist/esm/protocol/ExchangeManager.js +41 -27
- package/dist/esm/protocol/ExchangeManager.js.map +1 -1
- package/dist/esm/protocol/MessageExchange.d.ts +1 -1
- package/dist/esm/protocol/MessageExchange.d.ts.map +1 -1
- package/dist/esm/protocol/MessageExchange.js +39 -5
- package/dist/esm/protocol/MessageExchange.js.map +1 -1
- package/dist/esm/protocol/MessageReceptionState.d.ts +1 -1
- package/dist/esm/securechannel/SecureChannelProtocol.js +2 -2
- package/dist/esm/securechannel/SecureChannelProtocol.js.map +1 -1
- package/dist/esm/session/GroupSession.d.ts +56 -0
- package/dist/esm/session/GroupSession.d.ts.map +1 -0
- package/dist/esm/session/GroupSession.js +177 -0
- package/dist/esm/session/GroupSession.js.map +6 -0
- package/dist/esm/session/InsecureSession.d.ts +2 -1
- package/dist/esm/session/InsecureSession.d.ts.map +1 -1
- package/dist/esm/session/InsecureSession.js +3 -2
- package/dist/esm/session/InsecureSession.js.map +1 -1
- package/dist/esm/session/NodeSession.d.ts +88 -0
- package/dist/esm/session/NodeSession.d.ts.map +1 -0
- package/dist/esm/session/NodeSession.js +298 -0
- package/dist/esm/session/NodeSession.js.map +6 -0
- package/dist/esm/session/SecureSession.d.ts +10 -75
- package/dist/esm/session/SecureSession.d.ts.map +1 -1
- package/dist/esm/session/SecureSession.js +10 -291
- package/dist/esm/session/SecureSession.js.map +2 -2
- package/dist/esm/session/Session.d.ts +6 -5
- package/dist/esm/session/Session.d.ts.map +1 -1
- package/dist/esm/session/Session.js +12 -2
- package/dist/esm/session/Session.js.map +1 -1
- package/dist/esm/session/SessionManager.d.ts +27 -9
- package/dist/esm/session/SessionManager.d.ts.map +1 -1
- package/dist/esm/session/SessionManager.js +84 -6
- package/dist/esm/session/SessionManager.js.map +1 -1
- package/dist/esm/session/case/CaseClient.d.ts +1 -1
- package/dist/esm/session/case/CaseClient.js +2 -2
- package/dist/esm/session/case/CaseClient.js.map +1 -1
- package/dist/esm/session/index.d.ts +2 -0
- package/dist/esm/session/index.d.ts.map +1 -1
- package/dist/esm/session/index.js +2 -0
- package/dist/esm/session/index.js.map +1 -1
- package/dist/esm/session/pase/PaseClient.d.ts +1 -1
- package/package.json +6 -6
- package/src/action/server/AccessControl.ts +4 -7
- package/src/action/server/AttributeWriteResponse.ts +29 -7
- package/src/action/server/CommandInvokeResponse.ts +28 -7
- package/src/action/server/DataResponse.ts +1 -1
- package/src/action/server/Subject.ts +45 -0
- package/src/action/server/index.ts +1 -0
- package/src/certificate/DeviceCertification.ts +2 -2
- package/src/cluster/client/AttributeClient.ts +15 -3
- package/src/cluster/client/ClusterClient.ts +90 -4
- package/src/cluster/client/ClusterClientTypes.ts +38 -9
- package/src/cluster/client/EventClient.ts +9 -2
- package/src/codec/MessageCodec.ts +49 -8
- package/src/fabric/Fabric.ts +51 -85
- package/src/fabric/FabricManager.ts +11 -4
- package/src/groups/FabricGroupsManager.ts +164 -0
- package/src/groups/Groups.ts +81 -0
- package/src/groups/KeySets.ts +194 -0
- package/src/groups/MessagingState.ts +76 -0
- package/src/groups/index.ts +8 -0
- package/src/index.ts +1 -0
- package/src/interaction/AccessControlManager.ts +49 -81
- package/src/interaction/InteractionClient.ts +66 -6
- package/src/interaction/InteractionMessenger.ts +15 -0
- package/src/interaction/Subscription.ts +3 -3
- package/src/peer/PeerAddress.ts +4 -0
- package/src/peer/PeerSet.ts +39 -4
- package/src/protocol/ChannelManager.ts +7 -9
- package/src/protocol/ExchangeManager.ts +51 -35
- package/src/protocol/MessageExchange.ts +42 -7
- package/src/protocol/MessageReceptionState.ts +2 -2
- package/src/securechannel/SecureChannelProtocol.ts +2 -2
- package/src/session/GroupSession.ts +223 -0
- package/src/session/InsecureSession.ts +3 -2
- package/src/session/NodeSession.ts +367 -0
- package/src/session/SecureSession.ts +14 -363
- package/src/session/Session.ts +17 -6
- package/src/session/SessionManager.ts +94 -14
- package/src/session/case/CaseClient.ts +2 -2
- package/src/session/index.ts +2 -3
|
@@ -18,296 +18,25 @@ var __copyProps = (to, from, except, desc) => {
|
|
|
18
18
|
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
19
19
|
var SecureSession_exports = {};
|
|
20
20
|
__export(SecureSession_exports, {
|
|
21
|
-
|
|
22
|
-
SecureSession: () => SecureSession,
|
|
23
|
-
assertSecureSession: () => assertSecureSession
|
|
21
|
+
SecureSession: () => SecureSession
|
|
24
22
|
});
|
|
25
23
|
module.exports = __toCommonJS(SecureSession_exports);
|
|
26
24
|
var import_general = require("#general");
|
|
27
|
-
var import_PeerAddress = require("#peer/PeerAddress.js");
|
|
28
|
-
var import_types = require("#types");
|
|
29
|
-
var import_MessageCodec = require("../codec/MessageCodec.js");
|
|
30
|
-
var import_ChannelManager = require("../protocol/ChannelManager.js");
|
|
31
|
-
var import_MessageCounter = require("../protocol/MessageCounter.js");
|
|
32
|
-
var import_MessageReceptionState = require("../protocol/MessageReceptionState.js");
|
|
33
25
|
var import_Session = require("./Session.js");
|
|
34
26
|
/**
|
|
35
27
|
* @license
|
|
36
28
|
* Copyright 2022-2025 Matter.js Authors
|
|
37
29
|
* SPDX-License-Identifier: Apache-2.0
|
|
38
30
|
*/
|
|
39
|
-
const logger = import_general.Logger.get("SecureSession");
|
|
40
|
-
const SESSION_KEYS_INFO = import_general.Bytes.fromString("SessionKeys");
|
|
41
|
-
const SESSION_RESUMPTION_KEYS_INFO = import_general.Bytes.fromString("SessionResumptionKeys");
|
|
42
|
-
class NoAssociatedFabricError extends import_types.StatusResponseError {
|
|
43
|
-
constructor(message) {
|
|
44
|
-
super(message, import_types.StatusCode.UnsupportedAccess);
|
|
45
|
-
}
|
|
46
|
-
}
|
|
47
31
|
class SecureSession extends import_Session.Session {
|
|
48
|
-
|
|
49
|
-
#closingAfterExchangeFinished = false;
|
|
50
|
-
#sendCloseMessageWhenClosing = true;
|
|
51
|
-
#id;
|
|
52
|
-
#isInitiator;
|
|
53
|
-
#fabric;
|
|
54
|
-
#peerNodeId;
|
|
55
|
-
#peerSessionId;
|
|
56
|
-
#decryptKey;
|
|
57
|
-
#encryptKey;
|
|
58
|
-
#attestationKey;
|
|
59
|
-
#caseAuthenticatedTags;
|
|
60
|
-
#isClosing = false;
|
|
61
|
-
supportsMRP = true;
|
|
62
|
-
static async create(args) {
|
|
63
|
-
const {
|
|
64
|
-
manager,
|
|
65
|
-
id,
|
|
66
|
-
fabric,
|
|
67
|
-
peerNodeId,
|
|
68
|
-
peerSessionId,
|
|
69
|
-
sharedSecret,
|
|
70
|
-
salt,
|
|
71
|
-
isInitiator,
|
|
72
|
-
isResumption,
|
|
73
|
-
peerSessionParameters,
|
|
74
|
-
caseAuthenticatedTags
|
|
75
|
-
} = args;
|
|
76
|
-
const keys = await import_general.Crypto.hkdf(
|
|
77
|
-
sharedSecret,
|
|
78
|
-
salt,
|
|
79
|
-
isResumption ? SESSION_RESUMPTION_KEYS_INFO : SESSION_KEYS_INFO,
|
|
80
|
-
import_general.CRYPTO_SYMMETRIC_KEY_LENGTH * 3
|
|
81
|
-
);
|
|
82
|
-
const decryptKey = isInitiator ? keys.slice(16, 32) : keys.slice(0, 16);
|
|
83
|
-
const encryptKey = isInitiator ? keys.slice(0, 16) : keys.slice(16, 32);
|
|
84
|
-
const attestationKey = keys.slice(32, 48);
|
|
85
|
-
return new SecureSession({
|
|
86
|
-
manager,
|
|
87
|
-
id,
|
|
88
|
-
fabric,
|
|
89
|
-
peerNodeId,
|
|
90
|
-
peerSessionId,
|
|
91
|
-
decryptKey,
|
|
92
|
-
encryptKey,
|
|
93
|
-
attestationKey,
|
|
94
|
-
sessionParameters: peerSessionParameters,
|
|
95
|
-
isInitiator,
|
|
96
|
-
caseAuthenticatedTags
|
|
97
|
-
});
|
|
98
|
-
}
|
|
99
|
-
constructor(args) {
|
|
100
|
-
super({
|
|
101
|
-
...args,
|
|
102
|
-
setActiveTimestamp: true,
|
|
103
|
-
// We always set the active timestamp for Secure sessions
|
|
104
|
-
// Can be changed to a PersistedMessageCounter if we implement session storage
|
|
105
|
-
messageCounter: new import_MessageCounter.MessageCounter(() => {
|
|
106
|
-
this.end(true, true).catch((error) => logger.error(`Error while closing session: ${error}`));
|
|
107
|
-
}),
|
|
108
|
-
messageReceptionState: new import_MessageReceptionState.MessageReceptionStateEncryptedWithoutRollover()
|
|
109
|
-
});
|
|
110
|
-
const {
|
|
111
|
-
manager,
|
|
112
|
-
id,
|
|
113
|
-
fabric,
|
|
114
|
-
peerNodeId,
|
|
115
|
-
peerSessionId,
|
|
116
|
-
decryptKey,
|
|
117
|
-
encryptKey,
|
|
118
|
-
attestationKey,
|
|
119
|
-
caseAuthenticatedTags,
|
|
120
|
-
isInitiator
|
|
121
|
-
} = args;
|
|
122
|
-
this.#id = id;
|
|
123
|
-
this.#fabric = fabric;
|
|
124
|
-
this.#peerNodeId = peerNodeId;
|
|
125
|
-
this.#peerSessionId = peerSessionId;
|
|
126
|
-
this.#decryptKey = decryptKey;
|
|
127
|
-
this.#encryptKey = encryptKey;
|
|
128
|
-
this.#attestationKey = attestationKey;
|
|
129
|
-
this.#caseAuthenticatedTags = caseAuthenticatedTags ?? [];
|
|
130
|
-
this.#isInitiator = isInitiator;
|
|
131
|
-
manager?.sessions.add(this);
|
|
132
|
-
fabric?.addSession(this);
|
|
133
|
-
logger.debug(
|
|
134
|
-
`Created secure ${this.isPase ? "PASE" : "CASE"} session for fabric index ${fabric?.fabricIndex}`,
|
|
135
|
-
this.name,
|
|
136
|
-
this.parameterDiagnostics()
|
|
137
|
-
);
|
|
138
|
-
}
|
|
139
|
-
parameterDiagnostics() {
|
|
140
|
-
return import_general.Diagnostic.dict(
|
|
141
|
-
{
|
|
142
|
-
SII: this.idleIntervalMs,
|
|
143
|
-
SAI: this.activeIntervalMs,
|
|
144
|
-
SAT: this.activeThresholdMs,
|
|
145
|
-
DMRev: this.dataModelRevision,
|
|
146
|
-
IMRev: this.interactionModelRevision,
|
|
147
|
-
spec: import_general.Diagnostic.hex(this.specificationVersion),
|
|
148
|
-
maxPaths: this.maxPathsPerInvoke,
|
|
149
|
-
CATs: this.#caseAuthenticatedTags
|
|
150
|
-
},
|
|
151
|
-
true
|
|
152
|
-
);
|
|
153
|
-
}
|
|
154
|
-
get caseAuthenticatedTags() {
|
|
155
|
-
return this.#caseAuthenticatedTags;
|
|
156
|
-
}
|
|
157
|
-
get closingAfterExchangeFinished() {
|
|
158
|
-
return this.#closingAfterExchangeFinished;
|
|
159
|
-
}
|
|
160
|
-
get sendCloseMessageWhenClosing() {
|
|
161
|
-
return this.#sendCloseMessageWhenClosing;
|
|
162
|
-
}
|
|
163
|
-
get isSecure() {
|
|
164
|
-
return true;
|
|
165
|
-
}
|
|
166
|
-
get isPase() {
|
|
167
|
-
return this.#peerNodeId === import_types.NodeId.UNSPECIFIED_NODE_ID;
|
|
168
|
-
}
|
|
169
|
-
get subscriptions() {
|
|
170
|
-
return this.#subscriptions;
|
|
171
|
-
}
|
|
172
|
-
get isInitiator() {
|
|
173
|
-
return this.#isInitiator;
|
|
174
|
-
}
|
|
175
|
-
get isClosing() {
|
|
176
|
-
return this.#isClosing;
|
|
177
|
-
}
|
|
178
|
-
async close(closeAfterExchangeFinished) {
|
|
179
|
-
if (closeAfterExchangeFinished === void 0) {
|
|
180
|
-
closeAfterExchangeFinished = this.isPeerActive();
|
|
181
|
-
}
|
|
182
|
-
await this.end(true, closeAfterExchangeFinished);
|
|
183
|
-
}
|
|
184
|
-
decode({ header, applicationPayload, messageExtension }, aad) {
|
|
185
|
-
if (header.hasMessageExtensions) {
|
|
186
|
-
logger.info(
|
|
187
|
-
`Message extensions are not supported. Ignoring ${messageExtension ? import_general.Bytes.toHex(messageExtension) : void 0}`
|
|
188
|
-
);
|
|
189
|
-
}
|
|
190
|
-
const nonce = this.generateNonce(header.securityFlags, header.messageId, this.#peerNodeId);
|
|
191
|
-
const message = import_MessageCodec.MessageCodec.decodePayload({
|
|
192
|
-
header,
|
|
193
|
-
applicationPayload: import_general.Crypto.decrypt(this.#decryptKey, applicationPayload, nonce, aad)
|
|
194
|
-
});
|
|
195
|
-
if (message.payloadHeader.hasSecuredExtension) {
|
|
196
|
-
logger.info(
|
|
197
|
-
`Secured extensions are not supported. Ignoring ${message.securityExtension ? import_general.Bytes.toHex(message.securityExtension) : void 0}`
|
|
198
|
-
);
|
|
199
|
-
}
|
|
200
|
-
return message;
|
|
201
|
-
}
|
|
202
|
-
encode(message) {
|
|
203
|
-
message.packetHeader.sessionId = this.#peerSessionId;
|
|
204
|
-
const { header, applicationPayload } = import_MessageCodec.MessageCodec.encodePayload(message);
|
|
205
|
-
const headerBytes = import_MessageCodec.MessageCodec.encodePacketHeader(message.packetHeader);
|
|
206
|
-
const securityFlags = headerBytes[3];
|
|
207
|
-
const sessionNodeId = this.isPase ? import_types.NodeId.UNSPECIFIED_NODE_ID : this.#fabric?.nodeId ?? import_types.NodeId.UNSPECIFIED_NODE_ID;
|
|
208
|
-
const nonce = this.generateNonce(securityFlags, header.messageId, sessionNodeId);
|
|
209
|
-
return { header, applicationPayload: import_general.Crypto.encrypt(this.#encryptKey, applicationPayload, nonce, headerBytes) };
|
|
210
|
-
}
|
|
211
|
-
get attestationChallengeKey() {
|
|
212
|
-
return this.#attestationKey;
|
|
213
|
-
}
|
|
214
|
-
get fabric() {
|
|
215
|
-
return this.#fabric;
|
|
216
|
-
}
|
|
217
|
-
addAssociatedFabric(fabric) {
|
|
218
|
-
if (this.#fabric !== void 0) {
|
|
219
|
-
throw new import_general.MatterFlowError("Session already has an associated Fabric. Cannot change this.");
|
|
220
|
-
}
|
|
221
|
-
this.#fabric = fabric;
|
|
222
|
-
}
|
|
223
|
-
get id() {
|
|
224
|
-
return this.#id;
|
|
225
|
-
}
|
|
226
|
-
get name() {
|
|
227
|
-
return `secure/${this.#id}`;
|
|
228
|
-
}
|
|
229
|
-
get peerSessionId() {
|
|
230
|
-
return this.#peerSessionId;
|
|
231
|
-
}
|
|
232
|
-
get nodeId() {
|
|
233
|
-
return this.#fabric?.nodeId ?? import_types.NodeId.UNSPECIFIED_NODE_ID;
|
|
234
|
-
}
|
|
235
|
-
get peerNodeId() {
|
|
236
|
-
return this.#peerNodeId;
|
|
237
|
-
}
|
|
238
|
-
get associatedFabric() {
|
|
239
|
-
if (this.#fabric === void 0) {
|
|
240
|
-
throw new NoAssociatedFabricError(
|
|
241
|
-
`${this.isPase ? "PASE " : ""}Session needs to have an associated Fabric for fabric sensitive data handling.`
|
|
242
|
-
);
|
|
243
|
-
}
|
|
244
|
-
return this.#fabric;
|
|
245
|
-
}
|
|
246
|
-
async clearSubscriptions(flushSubscriptions = false, cancelledByPeer = false) {
|
|
247
|
-
const subscriptions = [...this.#subscriptions];
|
|
248
|
-
for (const subscription of subscriptions) {
|
|
249
|
-
await subscription.close(flushSubscriptions, cancelledByPeer);
|
|
250
|
-
}
|
|
251
|
-
return subscriptions.length;
|
|
252
|
-
}
|
|
253
|
-
/** Ends a session. Outstanding subscription data will be flushed before the session is destroyed. */
|
|
254
|
-
async end(sendClose, closeAfterExchangeFinished = false) {
|
|
255
|
-
await this.clearSubscriptions(true);
|
|
256
|
-
await this.destroy(sendClose, closeAfterExchangeFinished);
|
|
257
|
-
}
|
|
258
|
-
/** Destroys a session. Outstanding subscription data will be discarded. */
|
|
259
|
-
async destroy(sendClose = false, closeAfterExchangeFinished = true) {
|
|
260
|
-
await this.clearSubscriptions(false);
|
|
261
|
-
this.#fabric?.removeSession(this);
|
|
262
|
-
if (!sendClose) {
|
|
263
|
-
this.#sendCloseMessageWhenClosing = false;
|
|
264
|
-
}
|
|
265
|
-
if (closeAfterExchangeFinished) {
|
|
266
|
-
logger.info(`Register Session ${this.name} to close when exchange is ended.`);
|
|
267
|
-
this.#closingAfterExchangeFinished = true;
|
|
268
|
-
} else {
|
|
269
|
-
this.#isClosing = true;
|
|
270
|
-
logger.info(`End ${this.isPase ? "PASE" : "CASE"} session ${this.name}`);
|
|
271
|
-
this.manager?.sessions.delete(this);
|
|
272
|
-
if (this.closer) {
|
|
273
|
-
try {
|
|
274
|
-
await this.closer;
|
|
275
|
-
} catch (error) {
|
|
276
|
-
import_ChannelManager.NoChannelError.accept(error);
|
|
277
|
-
} finally {
|
|
278
|
-
await this.destroyed.emit();
|
|
279
|
-
}
|
|
280
|
-
return;
|
|
281
|
-
}
|
|
282
|
-
await this.destroyed.emit();
|
|
283
|
-
}
|
|
284
|
-
}
|
|
285
|
-
/**
|
|
286
|
-
* The peer node's address.
|
|
287
|
-
*/
|
|
288
|
-
get peerAddress() {
|
|
289
|
-
return (0, import_PeerAddress.PeerAddress)({
|
|
290
|
-
fabricIndex: this.#fabric?.fabricIndex ?? import_types.FabricIndex.NO_FABRIC,
|
|
291
|
-
nodeId: this.#peerNodeId
|
|
292
|
-
});
|
|
293
|
-
}
|
|
294
|
-
/**
|
|
295
|
-
* Indicates whether a peer matches a specific address.
|
|
296
|
-
*/
|
|
297
|
-
peerIs(address) {
|
|
298
|
-
return (this.#fabric?.fabricIndex ?? import_types.FabricIndex.NO_FABRIC) === address.fabricIndex && this.#peerNodeId === address.nodeId;
|
|
299
|
-
}
|
|
300
|
-
generateNonce(securityFlags, messageId, nodeId) {
|
|
301
|
-
const writer = new import_general.DataWriter(import_general.Endian.Little);
|
|
302
|
-
writer.writeUInt8(securityFlags);
|
|
303
|
-
writer.writeUInt32(messageId);
|
|
304
|
-
writer.writeUInt64(nodeId);
|
|
305
|
-
return writer.toByteArray();
|
|
306
|
-
}
|
|
32
|
+
isSecure = true;
|
|
307
33
|
}
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
34
|
+
((SecureSession2) => {
|
|
35
|
+
function assert(session, errorText) {
|
|
36
|
+
if (!session?.isSecure) {
|
|
37
|
+
throw new import_general.MatterFlowError(errorText ?? "Insecure session in secure context");
|
|
38
|
+
}
|
|
311
39
|
}
|
|
312
|
-
|
|
40
|
+
SecureSession2.assert = assert;
|
|
41
|
+
})(SecureSession || (SecureSession = {}));
|
|
313
42
|
//# sourceMappingURL=SecureSession.js.map
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../src/session/SecureSession.ts"],
|
|
4
|
-
"mappings": ";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;
|
|
5
|
-
"names": []
|
|
4
|
+
"mappings": ";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAQA,qBAAgC;AAChC,qBAAwB;AATxB;AAAA;AAAA;AAAA;AAAA;AAWO,MAAe,sBAAsB,uBAAQ;AAAA,EACvC,WAAW;AAGxB;AAAA,CAEO,CAAUA,mBAAV;AACI,WAAS,OAAO,SAAmB,WAAsD;AAC5F,QAAI,CAAC,SAAS,UAAU;AACpB,YAAM,IAAI,+BAAgB,aAAa,oCAAoC;AAAA,IAC/E;AAAA,EACJ;AAJO,EAAAA,eAAS;AAAA,GADH;",
|
|
5
|
+
"names": ["SecureSession"]
|
|
6
6
|
}
|
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
*/
|
|
6
6
|
import { AsyncObservable } from "#general";
|
|
7
7
|
import { NodeId, TypeFromPartialBitSchema } from "#types";
|
|
8
|
-
import { DecodedMessage, DecodedPacket, Message, Packet } from "../codec/MessageCodec.js";
|
|
8
|
+
import { DecodedMessage, DecodedPacket, Message, Packet, SessionType } from "../codec/MessageCodec.js";
|
|
9
9
|
import { SupportedTransportsBitmap } from "../common/Scanner.js";
|
|
10
10
|
import { Fabric } from "../fabric/Fabric.js";
|
|
11
11
|
import { MessageCounter } from "../protocol/MessageCounter.js";
|
|
@@ -83,6 +83,7 @@ export declare abstract class Session {
|
|
|
83
83
|
timestamp: number;
|
|
84
84
|
readonly createdAt: number;
|
|
85
85
|
activeTimestamp: number;
|
|
86
|
+
abstract type: SessionType;
|
|
86
87
|
protected readonly idleIntervalMs: number;
|
|
87
88
|
protected readonly activeIntervalMs: number;
|
|
88
89
|
protected readonly activeThresholdMs: number;
|
|
@@ -91,7 +92,7 @@ export declare abstract class Session {
|
|
|
91
92
|
protected readonly specificationVersion: number;
|
|
92
93
|
protected readonly maxPathsPerInvoke: number;
|
|
93
94
|
protected readonly messageCounter: MessageCounter;
|
|
94
|
-
protected readonly messageReceptionState
|
|
95
|
+
protected readonly messageReceptionState?: MessageReceptionState;
|
|
95
96
|
protected readonly supportedTransports: TypeFromPartialBitSchema<typeof SupportedTransportsBitmap>;
|
|
96
97
|
protected readonly maxTcpMessageSize: number;
|
|
97
98
|
/**
|
|
@@ -103,7 +104,7 @@ export declare abstract class Session {
|
|
|
103
104
|
constructor(args: {
|
|
104
105
|
manager?: SessionManager;
|
|
105
106
|
messageCounter: MessageCounter;
|
|
106
|
-
messageReceptionState
|
|
107
|
+
messageReceptionState?: MessageReceptionState;
|
|
107
108
|
sessionParameters?: SessionParameterOptions;
|
|
108
109
|
setActiveTimestamp: boolean;
|
|
109
110
|
});
|
|
@@ -111,13 +112,13 @@ export declare abstract class Session {
|
|
|
111
112
|
notifyActivity(messageReceived: boolean): void;
|
|
112
113
|
isPeerActive(): boolean;
|
|
113
114
|
getIncrementedMessageCounter(): Promise<number>;
|
|
114
|
-
updateMessageCounter(messageCounter: number, _sourceNodeId?: NodeId): void;
|
|
115
|
+
updateMessageCounter(messageCounter: number, _sourceNodeId?: NodeId, _operationalKey?: Uint8Array): void;
|
|
116
|
+
protected static generateNonce(securityFlags: number, messageId: number, nodeId: NodeId): Uint8Array<ArrayBufferLike>;
|
|
115
117
|
/**
|
|
116
118
|
* The peer's session parameters.
|
|
117
119
|
*/
|
|
118
120
|
get parameters(): SessionParameters;
|
|
119
121
|
abstract isSecure: boolean;
|
|
120
|
-
abstract isPase: boolean;
|
|
121
122
|
abstract id: number;
|
|
122
123
|
abstract peerSessionId: number;
|
|
123
124
|
abstract nodeId: NodeId | undefined;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Session.d.ts","sourceRoot":"","sources":["../../../src/session/Session.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,eAAe,
|
|
1
|
+
{"version":3,"file":"Session.d.ts","sourceRoot":"","sources":["../../../src/session/Session.ts"],"names":[],"mappings":"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"}
|
|
@@ -116,9 +116,19 @@ class Session {
|
|
|
116
116
|
getIncrementedMessageCounter() {
|
|
117
117
|
return this.messageCounter.getIncrementedCounter();
|
|
118
118
|
}
|
|
119
|
-
updateMessageCounter(messageCounter, _sourceNodeId) {
|
|
119
|
+
updateMessageCounter(messageCounter, _sourceNodeId, _operationalKey) {
|
|
120
|
+
if (this.messageReceptionState === void 0) {
|
|
121
|
+
throw new import_general.InternalError("MessageReceptionState is not defined for this session");
|
|
122
|
+
}
|
|
120
123
|
this.messageReceptionState.updateMessageCounter(messageCounter);
|
|
121
124
|
}
|
|
125
|
+
static generateNonce(securityFlags, messageId, nodeId) {
|
|
126
|
+
const writer = new import_general.DataWriter(import_general.Endian.Little);
|
|
127
|
+
writer.writeUInt8(securityFlags);
|
|
128
|
+
writer.writeUInt32(messageId);
|
|
129
|
+
writer.writeUInt64(nodeId);
|
|
130
|
+
return writer.toByteArray();
|
|
131
|
+
}
|
|
122
132
|
/**
|
|
123
133
|
* The peer's session parameters.
|
|
124
134
|
*/
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../src/session/Session.ts"],
|
|
4
|
-
"mappings": ";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAMA,
|
|
4
|
+
"mappings": "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",
|
|
5
5
|
"names": []
|
|
6
6
|
}
|
|
@@ -3,14 +3,16 @@
|
|
|
3
3
|
* Copyright 2022-2025 Matter.js Authors
|
|
4
4
|
* SPDX-License-Identifier: Apache-2.0
|
|
5
5
|
*/
|
|
6
|
+
import { DecodedPacket } from "#codec/index.js";
|
|
6
7
|
import { FabricManager } from "#fabric/FabricManager.js";
|
|
7
8
|
import { BasicSet, Construction, Environment, Environmental, Observable, StorageContext } from "#general";
|
|
8
9
|
import { Subscription } from "#interaction/Subscription.js";
|
|
9
10
|
import { PeerAddress } from "#peer/PeerAddress.js";
|
|
11
|
+
import { GroupSession } from "#session/GroupSession.js";
|
|
10
12
|
import { CaseAuthenticatedTag, FabricIndex, NodeId } from "#types";
|
|
11
13
|
import { Fabric } from "../fabric/Fabric.js";
|
|
12
14
|
import { InsecureSession } from "./InsecureSession.js";
|
|
13
|
-
import {
|
|
15
|
+
import { NodeSession } from "./NodeSession.js";
|
|
14
16
|
import { Session, SessionParameterOptions, SessionParameters } from "./Session.js";
|
|
15
17
|
export declare const UNICAST_UNSECURE_SESSION_ID = 0;
|
|
16
18
|
export interface ResumptionRecord {
|
|
@@ -50,7 +52,7 @@ export declare class SessionManager {
|
|
|
50
52
|
/**
|
|
51
53
|
* Active secure sessions.
|
|
52
54
|
*/
|
|
53
|
-
get sessions(): BasicSet<
|
|
55
|
+
get sessions(): BasicSet<NodeSession, NodeSession>;
|
|
54
56
|
/**
|
|
55
57
|
* Active insecure sessions.
|
|
56
58
|
*/
|
|
@@ -70,7 +72,7 @@ export declare class SessionManager {
|
|
|
70
72
|
/**
|
|
71
73
|
* Emits when there is a change to the subscription set.
|
|
72
74
|
*/
|
|
73
|
-
get subscriptionsChanged(): Observable<[session:
|
|
75
|
+
get subscriptionsChanged(): Observable<[session: NodeSession, subscription: Subscription], void>;
|
|
74
76
|
/**
|
|
75
77
|
* Emits when resubmission is necessary due to timeout or network error.
|
|
76
78
|
*/
|
|
@@ -99,7 +101,7 @@ export declare class SessionManager {
|
|
|
99
101
|
isResumption: boolean;
|
|
100
102
|
peerSessionParameters?: SessionParameterOptions;
|
|
101
103
|
caseAuthenticatedTags?: CaseAuthenticatedTag[];
|
|
102
|
-
}): Promise<
|
|
104
|
+
}): Promise<NodeSession>;
|
|
103
105
|
/**
|
|
104
106
|
* Deletes a resumption record for a given address. Returns true if the record was deleted, false if it did not
|
|
105
107
|
* exist.
|
|
@@ -110,14 +112,30 @@ export declare class SessionManager {
|
|
|
110
112
|
* existed.
|
|
111
113
|
*/
|
|
112
114
|
deleteResumptionRecordsForFabric(fabric: Fabric): Promise<boolean>;
|
|
113
|
-
findOldestInactiveSession():
|
|
115
|
+
findOldestInactiveSession(): NodeSession;
|
|
114
116
|
getNextAvailableSessionId(): Promise<number>;
|
|
115
|
-
getSession(sessionId: number):
|
|
116
|
-
getPaseSession():
|
|
117
|
-
getSessionForNode(address: PeerAddress):
|
|
117
|
+
getSession(sessionId: number): NodeSession | undefined;
|
|
118
|
+
getPaseSession(): NodeSession;
|
|
119
|
+
getSessionForNode(address: PeerAddress): NodeSession | undefined;
|
|
118
120
|
removeAllSessionsForNode(address: PeerAddress, sendClose?: boolean, closeBeforeCreatedTimestamp?: number): Promise<void>;
|
|
119
121
|
getUnsecureSession(sourceNodeId?: NodeId): InsecureSession | undefined;
|
|
120
|
-
|
|
122
|
+
/**
|
|
123
|
+
* Creates or Returns a Group Session for a Group Peer Address.
|
|
124
|
+
* This is used for sending group messages because it returns the session for the current
|
|
125
|
+
* Group Epoch key. The Source Node Id is the own Node.
|
|
126
|
+
*/
|
|
127
|
+
groupSessionForAddress(address: PeerAddress): GroupSession;
|
|
128
|
+
/**
|
|
129
|
+
* Creates or Returns the Group session based on an incoming packet.
|
|
130
|
+
* The Session ID is determined by trying to decrypt te packet with possible keys.
|
|
131
|
+
*/
|
|
132
|
+
groupSessionFromPacket(packet: DecodedPacket, aad: Uint8Array): {
|
|
133
|
+
session: GroupSession;
|
|
134
|
+
message: import("#codec/index.js").DecodedMessage;
|
|
135
|
+
key: Uint8Array<ArrayBufferLike>;
|
|
136
|
+
};
|
|
137
|
+
registerGroupSession(session: GroupSession): void;
|
|
138
|
+
removeGroupSession(session: GroupSession): void;
|
|
121
139
|
findResumptionRecordById(resumptionId: Uint8Array): ResumptionRecord | undefined;
|
|
122
140
|
findResumptionRecordByAddress(address: PeerAddress): ResumptionRecord | undefined;
|
|
123
141
|
saveResumptionRecord(resumptionRecord: ResumptionRecord): Promise<void>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SessionManager.d.ts","sourceRoot":"","sources":["../../../src/session/SessionManager.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AACzD,OAAO,EACH,QAAQ,EAER,YAAY,EAEZ,WAAW,EACX,aAAa,EAMb,UAAU,EAEV,cAAc,EAEjB,MAAM,UAAU,CAAC;AAClB,OAAO,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAC;AAE5D,OAAO,EAAE,WAAW,EAAkB,MAAM,sBAAsB,CAAC;AACnE,OAAO,EAAE,oBAAoB,EAA0C,WAAW,
|
|
1
|
+
{"version":3,"file":"SessionManager.d.ts","sourceRoot":"","sources":["../../../src/session/SessionManager.ts"],"names":[],"mappings":"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"}
|
|
@@ -26,10 +26,13 @@ var import_FabricManager = require("#fabric/FabricManager.js");
|
|
|
26
26
|
var import_general = require("#general");
|
|
27
27
|
var import_model = require("#model");
|
|
28
28
|
var import_PeerAddress = require("#peer/PeerAddress.js");
|
|
29
|
+
var import_GroupSession = require("#session/GroupSession.js");
|
|
29
30
|
var import_types = require("#types");
|
|
31
|
+
var import_general2 = require("@matter/general");
|
|
30
32
|
var import_Scanner = require("../common/Scanner.js");
|
|
31
33
|
var import_MessageCounter = require("../protocol/MessageCounter.js");
|
|
32
34
|
var import_InsecureSession = require("./InsecureSession.js");
|
|
35
|
+
var import_NodeSession = require("./NodeSession.js");
|
|
33
36
|
var import_SecureSession = require("./SecureSession.js");
|
|
34
37
|
var import_Session = require("./Session.js");
|
|
35
38
|
/**
|
|
@@ -55,6 +58,7 @@ class SessionManager {
|
|
|
55
58
|
#context;
|
|
56
59
|
#insecureSessions = /* @__PURE__ */ new Map();
|
|
57
60
|
#sessions = new import_general.BasicSet();
|
|
61
|
+
#groupSessions = /* @__PURE__ */ new Map();
|
|
58
62
|
#nextSessionId = import_general.Crypto.getRandomUInt16();
|
|
59
63
|
#resumptionRecords = new import_PeerAddress.PeerAddressMap();
|
|
60
64
|
#globalUnencryptedMessageCounter = new import_MessageCounter.MessageCounter();
|
|
@@ -178,7 +182,7 @@ class SessionManager {
|
|
|
178
182
|
peerSessionParameters,
|
|
179
183
|
caseAuthenticatedTags
|
|
180
184
|
} = args;
|
|
181
|
-
const session = await
|
|
185
|
+
const session = await import_NodeSession.NodeSession.create({
|
|
182
186
|
manager: this,
|
|
183
187
|
id: sessionId,
|
|
184
188
|
fabric,
|
|
@@ -268,7 +272,7 @@ class SessionManager {
|
|
|
268
272
|
getPaseSession() {
|
|
269
273
|
this.#construction.assert();
|
|
270
274
|
return [...this.#sessions].find(
|
|
271
|
-
(session) => session
|
|
275
|
+
(session) => import_NodeSession.NodeSession.is(session) && session.isPase && !session.closingAfterExchangeFinished
|
|
272
276
|
);
|
|
273
277
|
}
|
|
274
278
|
getSessionForNode(address) {
|
|
@@ -298,9 +302,78 @@ class SessionManager {
|
|
|
298
302
|
}
|
|
299
303
|
return this.#insecureSessions.get(sourceNodeId);
|
|
300
304
|
}
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
305
|
+
/**
|
|
306
|
+
* Creates or Returns a Group Session for a Group Peer Address.
|
|
307
|
+
* This is used for sending group messages because it returns the session for the current
|
|
308
|
+
* Group Epoch key. The Source Node Id is the own Node.
|
|
309
|
+
*/
|
|
310
|
+
groupSessionForAddress(address) {
|
|
311
|
+
const groupId = import_types.GroupId.fromNodeId(address.nodeId);
|
|
312
|
+
import_types.GroupId.assertGroupId(groupId);
|
|
313
|
+
const fabric = this.fabricFor(address);
|
|
314
|
+
const { key, keySetId, sessionId } = fabric.groups.currentKeyForGroup(groupId);
|
|
315
|
+
if (sessionId === void 0 || key === void 0) {
|
|
316
|
+
throw new import_general2.UnexpectedDataError(
|
|
317
|
+
`No group session data found for group ${groupId} in fabric ${fabric.fabricId}.`
|
|
318
|
+
);
|
|
319
|
+
}
|
|
320
|
+
let session = this.#groupSessions.get(fabric.nodeId)?.get("id", sessionId);
|
|
321
|
+
if (session === void 0) {
|
|
322
|
+
session = new import_GroupSession.GroupSession({
|
|
323
|
+
manager: this,
|
|
324
|
+
id: sessionId,
|
|
325
|
+
fabric,
|
|
326
|
+
keySetId,
|
|
327
|
+
operationalGroupKey: key,
|
|
328
|
+
peerNodeId: address.nodeId
|
|
329
|
+
// The peer node ID is the group node ID
|
|
330
|
+
});
|
|
331
|
+
}
|
|
332
|
+
return session;
|
|
333
|
+
}
|
|
334
|
+
/**
|
|
335
|
+
* Creates or Returns the Group session based on an incoming packet.
|
|
336
|
+
* The Session ID is determined by trying to decrypt te packet with possible keys.
|
|
337
|
+
*/
|
|
338
|
+
groupSessionFromPacket(packet, aad) {
|
|
339
|
+
const groupId = packet.header.destGroupId;
|
|
340
|
+
if (groupId === void 0) {
|
|
341
|
+
throw new import_general2.UnexpectedDataError("Group ID is required for GroupSession fromPacket.");
|
|
342
|
+
}
|
|
343
|
+
import_types.GroupId.assertGroupId((0, import_types.GroupId)(groupId));
|
|
344
|
+
const { message, key, sessionId, sourceNodeId, keySetId, fabric } = import_GroupSession.GroupSession.decode(
|
|
345
|
+
this.#context.fabrics,
|
|
346
|
+
packet,
|
|
347
|
+
aad
|
|
348
|
+
);
|
|
349
|
+
let session = this.#groupSessions.get(sourceNodeId)?.get("id", sessionId);
|
|
350
|
+
if (session === void 0) {
|
|
351
|
+
session = new import_GroupSession.GroupSession({
|
|
352
|
+
manager: this,
|
|
353
|
+
id: sessionId,
|
|
354
|
+
fabric,
|
|
355
|
+
keySetId,
|
|
356
|
+
operationalGroupKey: key,
|
|
357
|
+
peerNodeId: sourceNodeId
|
|
358
|
+
});
|
|
359
|
+
}
|
|
360
|
+
return { session, message, key };
|
|
361
|
+
}
|
|
362
|
+
registerGroupSession(session) {
|
|
363
|
+
const sourceNodeId = session.peerNodeId;
|
|
364
|
+
const peerSessions = this.#groupSessions.get(sourceNodeId) ?? new import_general.BasicSet();
|
|
365
|
+
peerSessions.add(session);
|
|
366
|
+
this.#groupSessions.set(sourceNodeId, peerSessions);
|
|
367
|
+
}
|
|
368
|
+
removeGroupSession(session) {
|
|
369
|
+
const sourceNodeId = session.peerNodeId;
|
|
370
|
+
const peerSessions = this.#groupSessions.get(sourceNodeId);
|
|
371
|
+
if (peerSessions) {
|
|
372
|
+
peerSessions.delete(session);
|
|
373
|
+
if (peerSessions.size === 0) {
|
|
374
|
+
this.#groupSessions.delete(sourceNodeId);
|
|
375
|
+
}
|
|
376
|
+
}
|
|
304
377
|
}
|
|
305
378
|
findResumptionRecordById(resumptionId) {
|
|
306
379
|
this.#construction.assert();
|
|
@@ -427,6 +500,11 @@ class SessionManager {
|
|
|
427
500
|
for (const session of this.#insecureSessions.values()) {
|
|
428
501
|
closePromises.push(session?.end());
|
|
429
502
|
}
|
|
503
|
+
for (const sessions of this.#groupSessions.values()) {
|
|
504
|
+
for (const session of sessions) {
|
|
505
|
+
closePromises.push(session?.end());
|
|
506
|
+
}
|
|
507
|
+
}
|
|
430
508
|
await import_general.MatterAggregateError.allSettled(closePromises, "Error closing sessions").catch(
|
|
431
509
|
(error) => logger.error(error)
|
|
432
510
|
);
|