@matter/protocol 0.14.1-alpha.0-20250605-9fc134af0 → 0.14.1-alpha.0-20250607-a93593303
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 +66 -1
- package/dist/cjs/cluster/client/ClusterClient.js.map +1 -1
- package/dist/cjs/cluster/client/ClusterClientTypes.d.ts +36 -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 +67 -2
- package/dist/esm/cluster/client/ClusterClient.js.map +1 -1
- package/dist/esm/cluster/client/ClusterClientTypes.d.ts +36 -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 +97 -4
- package/src/cluster/client/ClusterClientTypes.ts +45 -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
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright 2022-2025 Matter.js Authors
|
|
4
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
5
|
+
*/
|
|
6
|
+
import { Bytes, Crypto, InternalError, MatterFlowError } from "#general";
|
|
7
|
+
import { KeySets } from "#groups/KeySets.js";
|
|
8
|
+
import { MessagingState } from "#groups/MessagingState.js";
|
|
9
|
+
import { Groups } from "./Groups.js";
|
|
10
|
+
const GROUP_SECURITY_INFO = Bytes.fromString("GroupKey v1.0");
|
|
11
|
+
class FabricGroupsManager {
|
|
12
|
+
#fabric;
|
|
13
|
+
#groups;
|
|
14
|
+
#messagingState;
|
|
15
|
+
/** Operationally enhanced variants of the group key sets based on their ID. */
|
|
16
|
+
#keySets = new KeySets();
|
|
17
|
+
constructor(fabric, storage) {
|
|
18
|
+
this.#fabric = fabric;
|
|
19
|
+
this.#groups = new Groups(fabric, this.#keySets);
|
|
20
|
+
this.#messagingState = new MessagingState(storage);
|
|
21
|
+
this.#keySets.add({
|
|
22
|
+
groupKeySetId: 0,
|
|
23
|
+
epochKey0: fabric.identityProtectionKey,
|
|
24
|
+
operationalEpochKey0: fabric.operationalIdentityProtectionKey,
|
|
25
|
+
epochStartTime0: 0,
|
|
26
|
+
// 0 is always ok, but only for the IPK key
|
|
27
|
+
groupSessionId0: null,
|
|
28
|
+
epochKey1: null,
|
|
29
|
+
operationalEpochKey1: null,
|
|
30
|
+
epochStartTime1: null,
|
|
31
|
+
groupSessionId1: null,
|
|
32
|
+
epochKey2: null,
|
|
33
|
+
operationalEpochKey2: null,
|
|
34
|
+
epochStartTime2: null,
|
|
35
|
+
groupSessionId2: null,
|
|
36
|
+
groupKeySecurityPolicy: 0,
|
|
37
|
+
// GroupKeyManagement.GroupKeySecurityPolicy.TrustFirst, the other option is provisional
|
|
38
|
+
groupKeyMulticastPolicy: 0
|
|
39
|
+
// GroupKeyManagement.GroupKeyMulticastPolicy.PerGroupId, provisional!
|
|
40
|
+
});
|
|
41
|
+
if (storage !== void 0) {
|
|
42
|
+
this.storage = storage;
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
set storage(storage) {
|
|
46
|
+
this.#messagingState.storage = storage;
|
|
47
|
+
}
|
|
48
|
+
/** Operative lookup of the group key sets by their id. */
|
|
49
|
+
get keySets() {
|
|
50
|
+
return this.#keySets;
|
|
51
|
+
}
|
|
52
|
+
get messaging() {
|
|
53
|
+
return this.#messagingState;
|
|
54
|
+
}
|
|
55
|
+
/** Operative lookup of the group key set id and the key by a group session Id. */
|
|
56
|
+
get sessions() {
|
|
57
|
+
return this.#keySets.sessions;
|
|
58
|
+
}
|
|
59
|
+
get groupKeyIdMap() {
|
|
60
|
+
return this.#groups.idMap;
|
|
61
|
+
}
|
|
62
|
+
set groupKeyIdMap(map) {
|
|
63
|
+
this.#groups.idMap = map;
|
|
64
|
+
}
|
|
65
|
+
get endpoints() {
|
|
66
|
+
return this.#groups.endpointMap;
|
|
67
|
+
}
|
|
68
|
+
currentKeyForGroup(groupId) {
|
|
69
|
+
return this.#groups.currentKeyForId(groupId);
|
|
70
|
+
}
|
|
71
|
+
subjectForGroup(id, keySetId) {
|
|
72
|
+
return this.#groups.subjectForGroup(id, keySetId);
|
|
73
|
+
}
|
|
74
|
+
multicastAddressFor(groupId) {
|
|
75
|
+
return this.#groups.multicastAddress(groupId);
|
|
76
|
+
}
|
|
77
|
+
/*
|
|
78
|
+
TODO for Controller to generate new epochs
|
|
79
|
+
addGroupEpoch(groupKeySetId: number, startTimeMs = Time.nowMs()) {
|
|
80
|
+
// TODO for Controller to generate new epochs
|
|
81
|
+
const epochKey = Crypto.getRandomData(CRYPTO_SYMMETRIC_KEY_LENGTH);
|
|
82
|
+
const operationalEpochKey = Crypto.hkdf(epochKey, this.#fabric.operationalId, GROUP_SECURITY_INFO);
|
|
83
|
+
const epochStartTime = startTimeMs * 1000;
|
|
84
|
+
logger.debug(`addGroupEpoch: epochStartTime=${epochStartTime}`, operationalEpochKey);
|
|
85
|
+
// TODO extend in structure and such
|
|
86
|
+
}
|
|
87
|
+
*/
|
|
88
|
+
/**
|
|
89
|
+
* Sets new group key set data and pre-calculates all operative data like session ids and operational keys.
|
|
90
|
+
* Overwriting the existing one if it exists.
|
|
91
|
+
*/
|
|
92
|
+
async setFromGroupKeySet(groupKeySet) {
|
|
93
|
+
const { groupKeySetId, epochKey0, epochKey1, epochKey2 } = groupKeySet;
|
|
94
|
+
if (epochKey0 === null) {
|
|
95
|
+
throw new MatterFlowError("EpochKey0 must be set");
|
|
96
|
+
}
|
|
97
|
+
await this.#cleanUpCounters(groupKeySetId);
|
|
98
|
+
const operationalId = this.#fabric.operationalId;
|
|
99
|
+
const operationalEpochKey0 = await Crypto.hkdf(epochKey0, operationalId, GROUP_SECURITY_INFO);
|
|
100
|
+
const operationalEpochKey1 = epochKey1 !== null ? await Crypto.hkdf(epochKey1, operationalId, GROUP_SECURITY_INFO) : null;
|
|
101
|
+
const operationalEpochKey2 = epochKey2 !== null ? await Crypto.hkdf(epochKey2, operationalId, GROUP_SECURITY_INFO) : null;
|
|
102
|
+
this.#keySets.add({
|
|
103
|
+
...groupKeySet,
|
|
104
|
+
operationalEpochKey0,
|
|
105
|
+
groupSessionId0: await this.#keySets.sessionIdFromKey(operationalEpochKey0),
|
|
106
|
+
operationalEpochKey1,
|
|
107
|
+
groupSessionId1: operationalEpochKey1 !== null ? await this.#keySets.sessionIdFromKey(operationalEpochKey1) : null,
|
|
108
|
+
operationalEpochKey2,
|
|
109
|
+
groupSessionId2: operationalEpochKey2 !== null ? await this.#keySets.sessionIdFromKey(operationalEpochKey2) : null
|
|
110
|
+
});
|
|
111
|
+
}
|
|
112
|
+
/** Removes a group key set by its id and cleans up the counters and data. */
|
|
113
|
+
async removeGroupKeySet(groupKeySetId) {
|
|
114
|
+
if (groupKeySetId === 0) {
|
|
115
|
+
throw new InternalError("Cannot remove the group key set 0.");
|
|
116
|
+
}
|
|
117
|
+
await this.#cleanUpCounters(groupKeySetId, true);
|
|
118
|
+
return this.#keySets.delete("groupKeySetId", groupKeySetId);
|
|
119
|
+
}
|
|
120
|
+
/** Cleans up the counters and data for a group key set by its id. */
|
|
121
|
+
async #cleanUpCounters(groupKeySetId, forDelete = false) {
|
|
122
|
+
if (this.#keySets.forId(groupKeySetId) === void 0) {
|
|
123
|
+
return;
|
|
124
|
+
}
|
|
125
|
+
const operationalKeys = this.#keySets.allKeysForId(groupKeySetId);
|
|
126
|
+
for (const { key } of operationalKeys) {
|
|
127
|
+
await this.#messagingState.removeCounter(key, forDelete);
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
export {
|
|
132
|
+
FabricGroupsManager,
|
|
133
|
+
GROUP_SECURITY_INFO
|
|
134
|
+
};
|
|
135
|
+
//# sourceMappingURL=FabricGroupsManager.js.map
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../src/groups/FabricGroupsManager.ts"],
|
|
4
|
+
"mappings": "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",
|
|
5
|
+
"names": []
|
|
6
|
+
}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright 2022-2025 Matter.js Authors
|
|
4
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
5
|
+
*/
|
|
6
|
+
import { Subject } from "#action/index.js";
|
|
7
|
+
import { Fabric } from "#fabric/Fabric.js";
|
|
8
|
+
import { BasicMap } from "#general";
|
|
9
|
+
import { EndpointNumber, GroupId } from "#types";
|
|
10
|
+
import { KeySets, OperationalKeySet } from "./KeySets.js";
|
|
11
|
+
export declare class Groups {
|
|
12
|
+
#private;
|
|
13
|
+
/** Operational variant of the group table, maps group Ids to a list of enabled endpoints. */
|
|
14
|
+
readonly endpointMap: Map<GroupId, EndpointNumber[]>;
|
|
15
|
+
constructor(fabric: Fabric, keySets: KeySets<OperationalKeySet>);
|
|
16
|
+
/** Operative lookup of the group key sets by a group id and to react on added removed groups. */
|
|
17
|
+
get idMap(): BasicMap<GroupId, number>;
|
|
18
|
+
/** Updates the group key id map when changed in Group Key Management Cluster. Only changes are taken over. */
|
|
19
|
+
set idMap(map: Map<GroupId, number>);
|
|
20
|
+
subjectForGroup(id: GroupId, keySetId: number): Subject;
|
|
21
|
+
/** Returns the multicast address for a given group id for this fabric. */
|
|
22
|
+
multicastAddress(groupId: GroupId): string;
|
|
23
|
+
/**
|
|
24
|
+
* Returns the current operational group key for a given group id and returns the keys, start time and
|
|
25
|
+
* their session IDs.
|
|
26
|
+
*/
|
|
27
|
+
currentKeyForId(groupId: GroupId): {
|
|
28
|
+
keySetId: number;
|
|
29
|
+
key: Uint8Array;
|
|
30
|
+
sessionId?: number;
|
|
31
|
+
startTime: number | bigint;
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
//# sourceMappingURL=Groups.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Groups.d.ts","sourceRoot":"","sources":["../../../src/groups/Groups.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,EAAE,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAC3C,OAAO,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAC3C,OAAO,EAAE,QAAQ,EAAsD,MAAM,UAAU,CAAC;AACxF,OAAO,EAAE,cAAc,EAAE,OAAO,EAAE,MAAM,QAAQ,CAAC;AACjD,OAAO,EAAE,OAAO,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AAE1D,qBAAa,MAAM;;IAOf,6FAA6F;IAC7F,QAAQ,CAAC,WAAW,iCAAwC;gBAEhD,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,CAAC,iBAAiB,CAAC;IAK/D,iGAAiG;IACjG,IAAI,KAAK,IAAI,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC,CAErC;IAED,8GAA8G;IAC9G,IAAI,KAAK,CAAC,GAAG,EAAE,GAAG,CAAC,OAAO,EAAE,MAAM,CAAC,EAUlC;IAED,eAAe,CAAC,EAAE,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM;IAQ7C,0EAA0E;IAC1E,gBAAgB,CAAC,OAAO,EAAE,OAAO;IAgBjC;;;OAGG;IACH,eAAe,CAAC,OAAO,EAAE,OAAO;;;;;;CAOnC"}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright 2022-2025 Matter.js Authors
|
|
4
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
5
|
+
*/
|
|
6
|
+
import { Subject } from "#action/index.js";
|
|
7
|
+
import { BasicMap, DataWriter, ImplementationError, ipv6BytesToString } from "#general";
|
|
8
|
+
import { GroupId } from "#types";
|
|
9
|
+
class Groups {
|
|
10
|
+
#fabric;
|
|
11
|
+
#keySets;
|
|
12
|
+
/** Operational variant of the group key map attribute from Group Key Management cluster, maps group Ids to key sets. */
|
|
13
|
+
#groupKeyIdMap = new BasicMap();
|
|
14
|
+
/** Operational variant of the group table, maps group Ids to a list of enabled endpoints. */
|
|
15
|
+
endpointMap = /* @__PURE__ */ new Map();
|
|
16
|
+
constructor(fabric, keySets) {
|
|
17
|
+
this.#fabric = fabric;
|
|
18
|
+
this.#keySets = keySets;
|
|
19
|
+
}
|
|
20
|
+
/** Operative lookup of the group key sets by a group id and to react on added removed groups. */
|
|
21
|
+
get idMap() {
|
|
22
|
+
return this.#groupKeyIdMap;
|
|
23
|
+
}
|
|
24
|
+
/** Updates the group key id map when changed in Group Key Management Cluster. Only changes are taken over. */
|
|
25
|
+
set idMap(map) {
|
|
26
|
+
for (const [groupId, keySetId] of map.entries()) {
|
|
27
|
+
this.#groupKeyIdMap.set(groupId, keySetId);
|
|
28
|
+
}
|
|
29
|
+
for (const groupId of this.#groupKeyIdMap.keys()) {
|
|
30
|
+
if (!map.has(groupId)) {
|
|
31
|
+
this.#groupKeyIdMap.delete(groupId);
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
subjectForGroup(id, keySetId) {
|
|
36
|
+
return Subject.Group({
|
|
37
|
+
id,
|
|
38
|
+
hasValidMapping: this.idMap.get(id) === keySetId,
|
|
39
|
+
endpoints: this.endpointMap.get(id) ?? []
|
|
40
|
+
});
|
|
41
|
+
}
|
|
42
|
+
/** Returns the multicast address for a given group id for this fabric. */
|
|
43
|
+
multicastAddress(groupId) {
|
|
44
|
+
GroupId.assertGroupId(groupId);
|
|
45
|
+
const writer = new DataWriter();
|
|
46
|
+
writer.writeUInt16(65333);
|
|
47
|
+
writer.writeUInt16(64);
|
|
48
|
+
writer.writeUInt8(253);
|
|
49
|
+
writer.writeUInt64(this.#fabric.fabricId);
|
|
50
|
+
writer.writeUInt8(0);
|
|
51
|
+
writer.writeUInt16(GroupId(groupId));
|
|
52
|
+
return ipv6BytesToString(writer.toByteArray());
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Returns the current operational group key for a given group id and returns the keys, start time and
|
|
56
|
+
* their session IDs.
|
|
57
|
+
*/
|
|
58
|
+
currentKeyForId(groupId) {
|
|
59
|
+
const keySetId = this.#groupKeyIdMap.get(groupId);
|
|
60
|
+
if (keySetId === void 0) {
|
|
61
|
+
throw new ImplementationError(`No group key set found for groupId ${groupId}.`);
|
|
62
|
+
}
|
|
63
|
+
return { ...this.#keySets.currentKeyForId(keySetId), keySetId };
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
export {
|
|
67
|
+
Groups
|
|
68
|
+
};
|
|
69
|
+
//# sourceMappingURL=Groups.js.map
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../src/groups/Groups.ts"],
|
|
4
|
+
"mappings": "AAAA;AAAA;AAAA;AAAA;AAAA;AAKA,SAAS,eAAe;AAExB,SAAS,UAAU,YAAY,qBAAqB,yBAAyB;AAC7E,SAAyB,eAAe;AAGjC,MAAM,OAAO;AAAA,EAChB;AAAA,EACA;AAAA;AAAA,EAGS,iBAAiB,IAAI,SAA0B;AAAA;AAAA,EAG/C,cAAc,oBAAI,IAA+B;AAAA,EAE1D,YAAY,QAAgB,SAAqC;AAC7D,SAAK,UAAU;AACf,SAAK,WAAW;AAAA,EACpB;AAAA;AAAA,EAGA,IAAI,QAAmC;AACnC,WAAO,KAAK;AAAA,EAChB;AAAA;AAAA,EAGA,IAAI,MAAM,KAA2B;AACjC,eAAW,CAAC,SAAS,QAAQ,KAAK,IAAI,QAAQ,GAAG;AAC7C,WAAK,eAAe,IAAI,SAAS,QAAQ;AAAA,IAC7C;AACA,eAAW,WAAW,KAAK,eAAe,KAAK,GAAG;AAC9C,UAAI,CAAC,IAAI,IAAI,OAAO,GAAG;AAEnB,aAAK,eAAe,OAAO,OAAO;AAAA,MACtC;AAAA,IACJ;AAAA,EACJ;AAAA,EAEA,gBAAgB,IAAa,UAAkB;AAC3C,WAAO,QAAQ,MAAM;AAAA,MACjB;AAAA,MACA,iBAAiB,KAAK,MAAM,IAAI,EAAE,MAAM;AAAA,MACxC,WAAW,KAAK,YAAY,IAAI,EAAE,KAAK,CAAC;AAAA,IAC5C,CAAC;AAAA,EACL;AAAA;AAAA,EAGA,iBAAiB,SAAkB;AAC/B,YAAQ,cAAc,OAAO;AAK7B,UAAM,SAAS,IAAI,WAAW;AAC9B,WAAO,YAAY,KAAM;AACzB,WAAO,YAAY,EAAM;AACzB,WAAO,WAAW,GAAI;AACtB,WAAO,YAAY,KAAK,QAAQ,QAAQ;AACxC,WAAO,WAAW,CAAI;AACtB,WAAO,YAAY,QAAQ,OAAO,CAAC;AACnC,WAAO,kBAAkB,OAAO,YAAY,CAAC;AAAA,EACjD;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,gBAAgB,SAAkB;AAC9B,UAAM,WAAW,KAAK,eAAe,IAAI,OAAO;AAChD,QAAI,aAAa,QAAW;AACxB,YAAM,IAAI,oBAAoB,sCAAsC,OAAO,GAAG;AAAA,IAClF;AACA,WAAO,EAAE,GAAG,KAAK,SAAS,gBAAgB,QAAQ,GAAG,SAAS;AAAA,EAClE;AACJ;",
|
|
5
|
+
"names": []
|
|
6
|
+
}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright 2022-2025 Matter.js Authors
|
|
4
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
5
|
+
*/
|
|
6
|
+
import type { GroupKeyManagement } from "#clusters/group-key-management";
|
|
7
|
+
import { BasicSet } from "#general";
|
|
8
|
+
export declare const GROUP_KEY_INFO: Uint8Array<ArrayBufferLike>;
|
|
9
|
+
export declare class KeySets<T extends OperationalKeySet> extends BasicSet<T> {
|
|
10
|
+
#private;
|
|
11
|
+
get sessions(): Map<number, {
|
|
12
|
+
keySetId: number;
|
|
13
|
+
key: Uint8Array;
|
|
14
|
+
}[]>;
|
|
15
|
+
add(item: T): void;
|
|
16
|
+
delete<F extends keyof T>(itemOrField: T | F, value?: T[F]): boolean;
|
|
17
|
+
forId(groupKeySetId: number): OperationalKeySet | undefined;
|
|
18
|
+
/**
|
|
19
|
+
* Return an operative list of operational keys, start time and their session IDs for a specified
|
|
20
|
+
* group key set id. This is mainly used for receiving messages.
|
|
21
|
+
*/
|
|
22
|
+
allKeysForId(keySetId: number): {
|
|
23
|
+
key: Uint8Array;
|
|
24
|
+
sessionId?: number;
|
|
25
|
+
startTime: number | bigint;
|
|
26
|
+
}[];
|
|
27
|
+
/**
|
|
28
|
+
* Returns the current operational group key for a given group KeySet Id and returns the keys, start time and
|
|
29
|
+
* their session IDs. This is mainly used for sending messages.
|
|
30
|
+
*/
|
|
31
|
+
currentKeyForId(keySetId: number): {
|
|
32
|
+
key: Uint8Array;
|
|
33
|
+
sessionId?: number;
|
|
34
|
+
startTime: number | bigint;
|
|
35
|
+
};
|
|
36
|
+
/**
|
|
37
|
+
* Returns the group key set for a given group key set id in the official data format from the Group key Management
|
|
38
|
+
* cluster.
|
|
39
|
+
*/
|
|
40
|
+
asGroupKeySet(groupKeySetId: number): {
|
|
41
|
+
groupKeySetId: number;
|
|
42
|
+
epochKey0: Uint8Array<ArrayBufferLike> | null;
|
|
43
|
+
epochStartTime0: number | bigint | null;
|
|
44
|
+
epochKey1: Uint8Array<ArrayBufferLike> | null;
|
|
45
|
+
epochStartTime1: number | bigint | null;
|
|
46
|
+
epochKey2: Uint8Array<ArrayBufferLike> | null;
|
|
47
|
+
epochStartTime2: number | bigint | null;
|
|
48
|
+
groupKeySecurityPolicy: GroupKeyManagement.GroupKeySecurityPolicy;
|
|
49
|
+
groupKeyMulticastPolicy: GroupKeyManagement.GroupKeyMulticastPolicy | undefined;
|
|
50
|
+
} | undefined;
|
|
51
|
+
/** Calculates a group session id based on the operational group key. */
|
|
52
|
+
sessionIdFromKey(operationalGroupKey: Uint8Array): Promise<number>;
|
|
53
|
+
}
|
|
54
|
+
export type GroupKeySet = GroupKeyManagement.GroupKeySet;
|
|
55
|
+
/** Enhanced structure of GroupKeySet to include operational data for easier operational processing. */
|
|
56
|
+
export type OperationalKeySet = GroupKeySet & {
|
|
57
|
+
operationalEpochKey0: Uint8Array;
|
|
58
|
+
groupSessionId0: number | null;
|
|
59
|
+
operationalEpochKey1: Uint8Array | null;
|
|
60
|
+
groupSessionId1: number | null;
|
|
61
|
+
operationalEpochKey2: Uint8Array | null;
|
|
62
|
+
groupSessionId2: number | null;
|
|
63
|
+
};
|
|
64
|
+
//# sourceMappingURL=KeySets.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"KeySets.d.ts","sourceRoot":"","sources":["../../../src/groups/KeySets.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,gCAAgC,CAAC;AACzE,OAAO,EAAE,QAAQ,EAAyE,MAAM,UAAU,CAAC;AAE3G,eAAO,MAAM,cAAc,6BAAmC,CAAC;AAE/D,qBAAa,OAAO,CAAC,CAAC,SAAS,iBAAiB,CAAE,SAAQ,QAAQ,CAAC,CAAC,CAAC;;IAIjE,IAAI,QAAQ;kBAFqC,MAAM;aAAO,UAAU;SAIvE;IAEQ,GAAG,CAAC,IAAI,EAAE,CAAC,GAAG,IAAI;IAMlB,MAAM,CAAC,CAAC,SAAS,MAAM,CAAC,EAAE,WAAW,EAAE,CAAC,GAAG,CAAC,EAAE,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,OAAO;IAQ7E,KAAK,CAAC,aAAa,EAAE,MAAM,GAAG,iBAAiB,GAAG,SAAS;IAI3D;;;OAGG;IACH,YAAY,CAAC,QAAQ,EAAE,MAAM;aAKY,UAAU;oBAAc,MAAM;mBAAa,MAAM,GAAG,MAAM;;IA8BnG;;;OAGG;IACH,eAAe,CAAC,QAAQ,EAAE,MAAM;aAlCS,UAAU;oBAAc,MAAM;mBAAa,MAAM,GAAG,MAAM;;IA+DnG;;;OAGG;IACH,aAAa,CAAC,aAAa,EAAE,MAAM;;;;;;;;;;;IA6BnC,wEAAwE;IAClE,gBAAgB,CAAC,mBAAmB,EAAE,UAAU;CAsCzD;AAED,MAAM,MAAM,WAAW,GAAG,kBAAkB,CAAC,WAAW,CAAC;AAEzD,uGAAuG;AACvG,MAAM,MAAM,iBAAiB,GAAG,WAAW,GAAG;IAC1C,oBAAoB,EAAE,UAAU,CAAC;IACjC,eAAe,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,oBAAoB,EAAE,UAAU,GAAG,IAAI,CAAC;IACxC,eAAe,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,oBAAoB,EAAE,UAAU,GAAG,IAAI,CAAC;IACxC,eAAe,EAAE,MAAM,GAAG,IAAI,CAAC;CAClC,CAAC"}
|
|
@@ -0,0 +1,159 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright 2022-2025 Matter.js Authors
|
|
4
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
5
|
+
*/
|
|
6
|
+
import { BasicSet, Bytes, Crypto, DataReader, ImplementationError, MatterFlowError, Time } from "#general";
|
|
7
|
+
const GROUP_KEY_INFO = Bytes.fromString("GroupKeyHash");
|
|
8
|
+
class KeySets extends BasicSet {
|
|
9
|
+
/** Operational enhanced structure for fast access based on the group session id. */
|
|
10
|
+
#sessions = /* @__PURE__ */ new Map();
|
|
11
|
+
get sessions() {
|
|
12
|
+
return this.#sessions;
|
|
13
|
+
}
|
|
14
|
+
add(item) {
|
|
15
|
+
this.delete("groupKeySetId", item.groupKeySetId);
|
|
16
|
+
super.add(item);
|
|
17
|
+
this.#updateSessions();
|
|
18
|
+
}
|
|
19
|
+
delete(itemOrField, value) {
|
|
20
|
+
const deleted = super.delete(itemOrField, value);
|
|
21
|
+
if (deleted) {
|
|
22
|
+
this.#updateSessions();
|
|
23
|
+
}
|
|
24
|
+
return deleted;
|
|
25
|
+
}
|
|
26
|
+
forId(groupKeySetId) {
|
|
27
|
+
return this.get("groupKeySetId", groupKeySetId);
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Return an operative list of operational keys, start time and their session IDs for a specified
|
|
31
|
+
* group key set id. This is mainly used for receiving messages.
|
|
32
|
+
*/
|
|
33
|
+
allKeysForId(keySetId) {
|
|
34
|
+
const groupKeySet = this.forId(keySetId);
|
|
35
|
+
if (groupKeySet === void 0) {
|
|
36
|
+
throw new MatterFlowError(`GroupKeySet for groupKeySet ${keySetId} not found.`);
|
|
37
|
+
}
|
|
38
|
+
const operationalKeys = Array();
|
|
39
|
+
const {
|
|
40
|
+
operationalEpochKey0,
|
|
41
|
+
groupSessionId0,
|
|
42
|
+
epochStartTime0,
|
|
43
|
+
operationalEpochKey1,
|
|
44
|
+
groupSessionId1,
|
|
45
|
+
epochStartTime1,
|
|
46
|
+
operationalEpochKey2,
|
|
47
|
+
groupSessionId2,
|
|
48
|
+
epochStartTime2
|
|
49
|
+
} = groupKeySet;
|
|
50
|
+
if (operationalEpochKey0 === null || epochStartTime0 === null || keySetId !== 0 && groupSessionId0 === null) {
|
|
51
|
+
throw new MatterFlowError(`EpochKey0 for groupKeySet ${keySetId} not found.`);
|
|
52
|
+
}
|
|
53
|
+
operationalKeys.push({
|
|
54
|
+
key: operationalEpochKey0,
|
|
55
|
+
sessionId: groupSessionId0 !== null ? groupSessionId0 : void 0,
|
|
56
|
+
startTime: epochStartTime0
|
|
57
|
+
});
|
|
58
|
+
if (operationalEpochKey1 !== null && groupSessionId1 !== null && epochStartTime1 !== null) {
|
|
59
|
+
operationalKeys.push({ key: operationalEpochKey1, sessionId: groupSessionId1, startTime: epochStartTime1 });
|
|
60
|
+
}
|
|
61
|
+
if (operationalEpochKey2 !== null && groupSessionId2 !== null && epochStartTime2 !== null) {
|
|
62
|
+
operationalKeys.push({ key: operationalEpochKey2, sessionId: groupSessionId2, startTime: epochStartTime2 });
|
|
63
|
+
}
|
|
64
|
+
return operationalKeys;
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Returns the current operational group key for a given group KeySet Id and returns the keys, start time and
|
|
68
|
+
* their session IDs. This is mainly used for sending messages.
|
|
69
|
+
*/
|
|
70
|
+
currentKeyForId(keySetId) {
|
|
71
|
+
const operationalKeys = this.allKeysForId(keySetId);
|
|
72
|
+
if (operationalKeys.length === 0) {
|
|
73
|
+
throw new MatterFlowError(`No operational keys found for groupKeySet ${keySetId}.`);
|
|
74
|
+
}
|
|
75
|
+
if (keySetId === 0) {
|
|
76
|
+
if (operationalKeys.length > 2) {
|
|
77
|
+
return operationalKeys[1];
|
|
78
|
+
}
|
|
79
|
+
return operationalKeys[0];
|
|
80
|
+
} else {
|
|
81
|
+
const now = Time.nowUs();
|
|
82
|
+
const relevantKeys = operationalKeys.filter(({ startTime }) => startTime <= now);
|
|
83
|
+
if (relevantKeys.length === 0) {
|
|
84
|
+
throw new ImplementationError(
|
|
85
|
+
`No operational keys found for groupKeySet ${keySetId} that are not in the future.`
|
|
86
|
+
);
|
|
87
|
+
}
|
|
88
|
+
return relevantKeys[operationalKeys.length - 1];
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* Returns the group key set for a given group key set id in the official data format from the Group key Management
|
|
93
|
+
* cluster.
|
|
94
|
+
*/
|
|
95
|
+
asGroupKeySet(groupKeySetId) {
|
|
96
|
+
const groupKeySet = this.forId(groupKeySetId);
|
|
97
|
+
if (groupKeySet === void 0) {
|
|
98
|
+
return void 0;
|
|
99
|
+
}
|
|
100
|
+
const {
|
|
101
|
+
epochKey0,
|
|
102
|
+
epochStartTime0,
|
|
103
|
+
epochKey1,
|
|
104
|
+
epochStartTime1,
|
|
105
|
+
epochKey2,
|
|
106
|
+
epochStartTime2,
|
|
107
|
+
groupKeySecurityPolicy,
|
|
108
|
+
groupKeyMulticastPolicy
|
|
109
|
+
} = groupKeySet;
|
|
110
|
+
return {
|
|
111
|
+
groupKeySetId,
|
|
112
|
+
epochKey0,
|
|
113
|
+
epochStartTime0,
|
|
114
|
+
epochKey1,
|
|
115
|
+
epochStartTime1,
|
|
116
|
+
epochKey2,
|
|
117
|
+
epochStartTime2,
|
|
118
|
+
groupKeySecurityPolicy,
|
|
119
|
+
groupKeyMulticastPolicy
|
|
120
|
+
};
|
|
121
|
+
}
|
|
122
|
+
/** Calculates a group session id based on the operational group key. */
|
|
123
|
+
async sessionIdFromKey(operationalGroupKey) {
|
|
124
|
+
const groupKeyHash = await Crypto.hkdf(operationalGroupKey, new Uint8Array(), GROUP_KEY_INFO, 2);
|
|
125
|
+
return new DataReader(groupKeyHash).readUInt16();
|
|
126
|
+
}
|
|
127
|
+
/**
|
|
128
|
+
* Updates the group session map based on the current group key sets.
|
|
129
|
+
* This is used to quickly find the operational keys by their group session id.
|
|
130
|
+
*/
|
|
131
|
+
#updateSessions() {
|
|
132
|
+
this.#sessions.clear();
|
|
133
|
+
for (const [id, keySet] of this.mapOf("groupKeySetId").entries()) {
|
|
134
|
+
if (id === 0) {
|
|
135
|
+
continue;
|
|
136
|
+
}
|
|
137
|
+
if (keySet.groupSessionId0 !== null) {
|
|
138
|
+
const list = this.#sessions.get(keySet.groupSessionId0) ?? [];
|
|
139
|
+
list.push({ key: keySet.operationalEpochKey0, keySetId: id });
|
|
140
|
+
this.#sessions.set(keySet.groupSessionId0, list);
|
|
141
|
+
}
|
|
142
|
+
if (keySet.groupSessionId1 !== null && keySet.operationalEpochKey1 !== null) {
|
|
143
|
+
const list = this.#sessions.get(keySet.groupSessionId1) ?? [];
|
|
144
|
+
list.push({ key: keySet.operationalEpochKey1, keySetId: id });
|
|
145
|
+
this.#sessions.set(keySet.groupSessionId1, list);
|
|
146
|
+
}
|
|
147
|
+
if (keySet.groupSessionId2 !== null && keySet.operationalEpochKey2 !== null) {
|
|
148
|
+
const list = this.#sessions.get(keySet.groupSessionId2) ?? [];
|
|
149
|
+
list.push({ key: keySet.operationalEpochKey2, keySetId: id });
|
|
150
|
+
this.#sessions.set(keySet.groupSessionId2, list);
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
export {
|
|
156
|
+
GROUP_KEY_INFO,
|
|
157
|
+
KeySets
|
|
158
|
+
};
|
|
159
|
+
//# sourceMappingURL=KeySets.js.map
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../src/groups/KeySets.ts"],
|
|
4
|
+
"mappings": "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",
|
|
5
|
+
"names": []
|
|
6
|
+
}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright 2022-2025 Matter.js Authors
|
|
4
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
5
|
+
*/
|
|
6
|
+
import { StorageContext } from "#general";
|
|
7
|
+
import { PersistedMessageCounter } from "#protocol/MessageCounter.js";
|
|
8
|
+
import { MessageReceptionStateEncryptedWithRollover } from "#protocol/MessageReceptionState.js";
|
|
9
|
+
import { NodeId } from "#types";
|
|
10
|
+
export declare class MessagingState {
|
|
11
|
+
#private;
|
|
12
|
+
constructor(storage?: StorageContext);
|
|
13
|
+
set storage(storage: StorageContext);
|
|
14
|
+
/**
|
|
15
|
+
* Return the message counter for sending messages to a group with the given operational key.
|
|
16
|
+
*/
|
|
17
|
+
counterFor(operationalKey: Uint8Array): PersistedMessageCounter;
|
|
18
|
+
removeCounter(key: Uint8Array, forDelete?: boolean): Promise<void>;
|
|
19
|
+
/**
|
|
20
|
+
* Returns the message reception state for a given source node id and operational key.
|
|
21
|
+
*/
|
|
22
|
+
receptionStateFor(sourceNodeId: NodeId, operationalKey: Uint8Array): MessageReceptionStateEncryptedWithRollover;
|
|
23
|
+
}
|
|
24
|
+
//# sourceMappingURL=MessagingState.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MessagingState.d.ts","sourceRoot":"","sources":["../../../src/groups/MessagingState.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,EAA6C,cAAc,EAAE,MAAM,UAAU,CAAC;AACrF,OAAO,EAAE,uBAAuB,EAAE,MAAM,6BAA6B,CAAC;AACtE,OAAO,EAAE,0CAA0C,EAAE,MAAM,oCAAoC,CAAC;AAChG,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAEhC,qBAAa,cAAc;;gBAaX,OAAO,CAAC,EAAE,cAAc;IAMpC,IAAI,OAAO,CAAC,OAAO,EAAE,cAAc,EAKlC;IAED;;OAEG;IACH,UAAU,CAAC,cAAc,EAAE,UAAU;IAa/B,aAAa,CAAC,GAAG,EAAE,UAAU,EAAE,SAAS,UAAQ;IAStD;;OAEG;IACH,iBAAiB,CAAC,YAAY,EAAE,MAAM,EAAE,cAAc,EAAE,UAAU;CAWrE"}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright 2022-2025 Matter.js Authors
|
|
4
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
5
|
+
*/
|
|
6
|
+
import { Bytes, ImplementationError, InternalError } from "#general";
|
|
7
|
+
import { PersistedMessageCounter } from "#protocol/MessageCounter.js";
|
|
8
|
+
import { MessageReceptionStateEncryptedWithRollover } from "#protocol/MessageReceptionState.js";
|
|
9
|
+
class MessagingState {
|
|
10
|
+
/**
|
|
11
|
+
* Message counter for sending data messages to a group per Operational key. No need to scope to a source node
|
|
12
|
+
* because we are the sending node
|
|
13
|
+
* TODO: For management: Make sure to start rotating the key early enough that a former counter-value is not used
|
|
14
|
+
* again for the same key.
|
|
15
|
+
*/
|
|
16
|
+
#groupDataCounters = /* @__PURE__ */ new Map();
|
|
17
|
+
/** Message reception state for data messages per Operational key and source node. */
|
|
18
|
+
#messageDataReceptionState = /* @__PURE__ */ new Map();
|
|
19
|
+
#storage;
|
|
20
|
+
constructor(storage) {
|
|
21
|
+
if (storage !== void 0) {
|
|
22
|
+
this.#storage = storage;
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
set storage(storage) {
|
|
26
|
+
if (this.#storage !== void 0) {
|
|
27
|
+
throw new InternalError("Storage context can only be set once.");
|
|
28
|
+
}
|
|
29
|
+
this.#storage = storage;
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Return the message counter for sending messages to a group with the given operational key.
|
|
33
|
+
*/
|
|
34
|
+
counterFor(operationalKey) {
|
|
35
|
+
if (!this.#storage) {
|
|
36
|
+
throw new ImplementationError("Group session cannot be created without storage context.");
|
|
37
|
+
}
|
|
38
|
+
const operationalKeyHex = Bytes.toHex(operationalKey);
|
|
39
|
+
let counter = this.#groupDataCounters.get(operationalKeyHex);
|
|
40
|
+
if (counter === void 0) {
|
|
41
|
+
counter = new PersistedMessageCounter(this.#storage, `${operationalKeyHex}-data`);
|
|
42
|
+
this.#groupDataCounters.set(operationalKeyHex, counter);
|
|
43
|
+
}
|
|
44
|
+
return counter;
|
|
45
|
+
}
|
|
46
|
+
async removeCounter(key, forDelete = false) {
|
|
47
|
+
const operationalKeyHex = Bytes.toHex(key);
|
|
48
|
+
this.#groupDataCounters.delete(operationalKeyHex);
|
|
49
|
+
if (forDelete) {
|
|
50
|
+
await this.#storage?.delete(`${operationalKeyHex}-data`);
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Returns the message reception state for a given source node id and operational key.
|
|
55
|
+
*/
|
|
56
|
+
receptionStateFor(sourceNodeId, operationalKey) {
|
|
57
|
+
const operationalKeyHex = Bytes.toHex(operationalKey);
|
|
58
|
+
let receptionState = this.#messageDataReceptionState.get(operationalKeyHex)?.get(sourceNodeId);
|
|
59
|
+
if (receptionState === void 0) {
|
|
60
|
+
receptionState = new MessageReceptionStateEncryptedWithRollover();
|
|
61
|
+
const keyMap = this.#messageDataReceptionState.get(operationalKeyHex) ?? /* @__PURE__ */ new Map();
|
|
62
|
+
keyMap.set(sourceNodeId, receptionState);
|
|
63
|
+
this.#messageDataReceptionState.set(operationalKeyHex, keyMap);
|
|
64
|
+
}
|
|
65
|
+
return receptionState;
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
export {
|
|
69
|
+
MessagingState
|
|
70
|
+
};
|
|
71
|
+
//# sourceMappingURL=MessagingState.js.map
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../src/groups/MessagingState.ts"],
|
|
4
|
+
"mappings": "AAAA;AAAA;AAAA;AAAA;AAAA;AAKA,SAAS,OAAO,qBAAqB,qBAAqC;AAC1E,SAAS,+BAA+B;AACxC,SAAS,kDAAkD;AAGpD,MAAM,eAAe;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOf,qBAAqB,oBAAI,IAAqC;AAAA;AAAA,EAG9D,6BAA6B,oBAAI,IAAqE;AAAA,EAC/G;AAAA,EAEA,YAAY,SAA0B;AAClC,QAAI,YAAY,QAAW;AACvB,WAAK,WAAW;AAAA,IACpB;AAAA,EACJ;AAAA,EAEA,IAAI,QAAQ,SAAyB;AACjC,QAAI,KAAK,aAAa,QAAW;AAC7B,YAAM,IAAI,cAAc,uCAAuC;AAAA,IACnE;AACA,SAAK,WAAW;AAAA,EACpB;AAAA;AAAA;AAAA;AAAA,EAKA,WAAW,gBAA4B;AACnC,QAAI,CAAC,KAAK,UAAU;AAChB,YAAM,IAAI,oBAAoB,0DAA0D;AAAA,IAC5F;AACA,UAAM,oBAAoB,MAAM,MAAM,cAAc;AACpD,QAAI,UAAU,KAAK,mBAAmB,IAAI,iBAAiB;AAC3D,QAAI,YAAY,QAAW;AACvB,gBAAU,IAAI,wBAAwB,KAAK,UAAU,GAAG,iBAAiB,OAAO;AAChF,WAAK,mBAAmB,IAAI,mBAAmB,OAAO;AAAA,IAC1D;AACA,WAAO;AAAA,EACX;AAAA,EAEA,MAAM,cAAc,KAAiB,YAAY,OAAO;AACpD,UAAM,oBAAoB,MAAM,MAAM,GAAG;AACzC,SAAK,mBAAmB,OAAO,iBAAiB;AAChD,QAAI,WAAW;AAEX,YAAM,KAAK,UAAU,OAAO,GAAG,iBAAiB,OAAO;AAAA,IAC3D;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA,EAKA,kBAAkB,cAAsB,gBAA4B;AAChE,UAAM,oBAAoB,MAAM,MAAM,cAAc;AACpD,QAAI,iBAAiB,KAAK,2BAA2B,IAAI,iBAAiB,GAAG,IAAI,YAAY;AAC7F,QAAI,mBAAmB,QAAW;AAC9B,uBAAiB,IAAI,2CAA2C;AAChE,YAAM,SAAS,KAAK,2BAA2B,IAAI,iBAAiB,KAAK,oBAAI,IAAI;AACjF,aAAO,IAAI,cAAc,cAAc;AACvC,WAAK,2BAA2B,IAAI,mBAAmB,MAAM;AAAA,IACjE;AACA,WAAO;AAAA,EACX;AACJ;",
|
|
5
|
+
"names": []
|
|
6
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/groups/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,cAAc,0BAA0B,CAAC;AACzC,cAAc,cAAc,CAAC"}
|
package/dist/esm/index.d.ts
CHANGED
|
@@ -11,6 +11,7 @@ export * from "./codec/index.js";
|
|
|
11
11
|
export * from "./common/index.js";
|
|
12
12
|
export * from "./events/index.js";
|
|
13
13
|
export * from "./fabric/index.js";
|
|
14
|
+
export * from "./groups/index.js";
|
|
14
15
|
export * from "./interaction/index.js";
|
|
15
16
|
export * from "./mdns/index.js";
|
|
16
17
|
export * from "./peer/index.js";
|
package/dist/esm/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,cAAc,mBAAmB,CAAC;AAClC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,wBAAwB,CAAC;AACvC,cAAc,oBAAoB,CAAC;AACnC,cAAc,kBAAkB,CAAC;AACjC,cAAc,mBAAmB,CAAC;AAClC,cAAc,mBAAmB,CAAC;AAClC,cAAc,mBAAmB,CAAC;AAClC,cAAc,wBAAwB,CAAC;AACvC,cAAc,iBAAiB,CAAC;AAChC,cAAc,iBAAiB,CAAC;AAChC,cAAc,qBAAqB,CAAC;AACpC,cAAc,0BAA0B,CAAC;AACzC,cAAc,oBAAoB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,cAAc,mBAAmB,CAAC;AAClC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,wBAAwB,CAAC;AACvC,cAAc,oBAAoB,CAAC;AACnC,cAAc,kBAAkB,CAAC;AACjC,cAAc,mBAAmB,CAAC;AAClC,cAAc,mBAAmB,CAAC;AAClC,cAAc,mBAAmB,CAAC;AAClC,cAAc,mBAAmB,CAAC;AAClC,cAAc,wBAAwB,CAAC;AACvC,cAAc,iBAAiB,CAAC;AAChC,cAAc,iBAAiB,CAAC;AAChC,cAAc,qBAAqB,CAAC;AACpC,cAAc,0BAA0B,CAAC;AACzC,cAAc,oBAAoB,CAAC"}
|