@matter/protocol 0.17.6-alpha.0-20260715-3585d95fe → 0.17.6
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/peer/RebootResubscribeArmer.d.ts.map +1 -1
- package/dist/cjs/peer/RebootResubscribeArmer.js +1 -1
- package/dist/cjs/peer/RebootResubscribeArmer.js.map +1 -1
- package/dist/cjs/protocol/MessageReceptionState.d.ts +11 -0
- package/dist/cjs/protocol/MessageReceptionState.d.ts.map +1 -1
- package/dist/cjs/protocol/MessageReceptionState.js +17 -3
- package/dist/cjs/protocol/MessageReceptionState.js.map +1 -1
- package/dist/esm/peer/RebootResubscribeArmer.d.ts.map +1 -1
- package/dist/esm/peer/RebootResubscribeArmer.js +1 -1
- package/dist/esm/peer/RebootResubscribeArmer.js.map +1 -1
- package/dist/esm/protocol/MessageReceptionState.d.ts +11 -0
- package/dist/esm/protocol/MessageReceptionState.d.ts.map +1 -1
- package/dist/esm/protocol/MessageReceptionState.js +17 -3
- package/dist/esm/protocol/MessageReceptionState.js.map +1 -1
- package/package.json +5 -5
- package/src/peer/RebootResubscribeArmer.ts +5 -3
- package/src/protocol/MessageReceptionState.ts +19 -2
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"RebootResubscribeArmer.d.ts","sourceRoot":"","sources":["../../../src/peer/RebootResubscribeArmer.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,mBAAmB,EAAE,MAAM,oDAAoD,CAAC;AACzF,OAAO,EAAE,WAAW,EAAkB,MAAM,sBAAsB,CAAC;AAGnE,OAAO,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;
|
|
1
|
+
{"version":3,"file":"RebootResubscribeArmer.d.ts","sourceRoot":"","sources":["../../../src/peer/RebootResubscribeArmer.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,mBAAmB,EAAE,MAAM,oDAAoD,CAAC;AACzF,OAAO,EAAE,WAAW,EAAkB,MAAM,sBAAsB,CAAC;AAGnE,OAAO,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAsB5D;;;;;;;GAOG;AACH,qBAAa,sBAAsB;;IAM/B,YAAY,QAAQ,EAAE,cAAc,EAAE,aAAa,EAAE,mBAAmB,EAIvE;IAED,GAAG,CAAC,WAAW,EAAE,WAAW,QAmB3B;IAED,MAAM,CAAC,WAAW,EAAE,WAAW,QAS9B;IAmFD,CAAC,MAAM,CAAC,OAAO,CAAC,SAOf;CACJ"}
|
|
@@ -31,7 +31,7 @@ var import_general = require("@matter/general");
|
|
|
31
31
|
*/
|
|
32
32
|
const logger = import_general.Logger.get("RebootResubscribeArmer");
|
|
33
33
|
const DEFAULT_REBOOT_RESUBSCRIBE_GRACE = (0, import_general.Seconds)(30);
|
|
34
|
-
const EXPECTED_RETURN_TIMEOUT = (0, import_general.Minutes)(
|
|
34
|
+
const EXPECTED_RETURN_TIMEOUT = (0, import_general.Minutes)(3);
|
|
35
35
|
class RebootResubscribeArmer {
|
|
36
36
|
#sessions;
|
|
37
37
|
#subscriptions;
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../src/peer/RebootResubscribeArmer.ts"],
|
|
4
|
-
"mappings": ";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAOA,yBAA4C;AAC5C,oCAAsC;AAGtC,qBAAgF;AAXhF;AAAA;AAAA;AAAA;AAAA;AAaA,MAAM,SAAS,sBAAO,IAAI,wBAAwB;AAGlD,MAAM,uCAAmC,wBAAQ,EAAE;
|
|
4
|
+
"mappings": "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",
|
|
5
5
|
"names": []
|
|
6
6
|
}
|
|
@@ -20,6 +20,11 @@ export declare class MessageReceptionStateEncryptedWithoutRollover extends Messa
|
|
|
20
20
|
protected maximumMessageCounter: number | undefined;
|
|
21
21
|
private messageCounterBitmap;
|
|
22
22
|
constructor(messageCounter?: number);
|
|
23
|
+
/**
|
|
24
|
+
* Bitmap seeded when the window is first anchored to a counter. All-1s for encrypted messages marks every
|
|
25
|
+
* sub-max counter as already-received (replay protection).
|
|
26
|
+
*/
|
|
27
|
+
protected get initialBitmap(): number;
|
|
23
28
|
/** Initialize the message counter state. */
|
|
24
29
|
private initialize;
|
|
25
30
|
/**
|
|
@@ -60,6 +65,12 @@ export declare class MessageReceptionStateEncryptedWithRollover extends MessageR
|
|
|
60
65
|
* back the window to the current location.
|
|
61
66
|
*/
|
|
62
67
|
export declare class MessageReceptionStateUnencryptedWithRollover extends MessageReceptionStateEncryptedWithoutRollover {
|
|
68
|
+
/**
|
|
69
|
+
* Empty window: no sub-max counters have been received yet, so legitimately reordered messages below the first
|
|
70
|
+
* observed counter stay acceptable. Unencrypted duplicate detection is not a security control, so this loses
|
|
71
|
+
* nothing; matches the CHIP reference implementation, which has never seeded a full window.
|
|
72
|
+
*/
|
|
73
|
+
protected get initialBitmap(): number;
|
|
63
74
|
protected calculateDiff(messageCounter: number): number;
|
|
64
75
|
}
|
|
65
76
|
//# sourceMappingURL=MessageReceptionState.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MessageReceptionState.d.ts","sourceRoot":"","sources":["../../../src/protocol/MessageReceptionState.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAiB,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAS7D,qBAAa,qBAAsB,SAAQ,WAAW;CAAG;AAEzD,8BAAsB,qBAAqB;IACvC,QAAQ,CAAC,oBAAoB,CAAC,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;CAC/D;AAED;;;;;;GAMG;AACH,qBAAa,6CAA8C,SAAQ,qBAAqB;IACpF,SAAS,CAAC,qBAAqB,EAAE,MAAM,GAAG,SAAS,CAAC;IACpD,OAAO,CAAC,oBAAoB,
|
|
1
|
+
{"version":3,"file":"MessageReceptionState.d.ts","sourceRoot":"","sources":["../../../src/protocol/MessageReceptionState.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAiB,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAS7D,qBAAa,qBAAsB,SAAQ,WAAW;CAAG;AAEzD,8BAAsB,qBAAqB;IACvC,QAAQ,CAAC,oBAAoB,CAAC,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;CAC/D;AAED;;;;;;GAMG;AACH,qBAAa,6CAA8C,SAAQ,qBAAqB;IACpF,SAAS,CAAC,qBAAqB,EAAE,MAAM,GAAG,SAAS,CAAC;IACpD,OAAO,CAAC,oBAAoB,CAAsB;IAElD,YAAY,cAAc,CAAC,EAAE,MAAM,EAKlC;IAED;;;OAGG;IACH,SAAS,KAAK,aAAa,IAAI,MAAM,CAEpC;IAED,4CAA4C;IAC5C,OAAO,CAAC,UAAU;IAKlB;;;;;;;OAOG;IACH,SAAS,CAAC,aAAa,CAAC,cAAc,EAAE,MAAM,UAK7C;IAED,iDAAiD;IACjD,OAAO,CAAC,6BAA6B;IAqBrC,6CAA6C;IAC7C,OAAO,CAAC,6BAA6B;IAarC,2DAA2D;IAC3D,OAAO,CAAC,sBAAsB;IAK9B;;OAEG;IACH,oBAAoB,CAAC,cAAc,EAAE,MAAM,QA0B1C;CACJ;AAED;;;;;GAKG;AACH,qBAAa,0CAA2C,SAAQ,6CAA6C;IACzG,UAAmB,aAAa,CAAC,cAAc,EAAE,MAAM,UAsBtD;CACJ;AAED;;;;;;;GAOG;AACH,qBAAa,4CAA6C,SAAQ,6CAA6C;IAC3G;;;;OAIG;IACH,cAAuB,aAAa,IAAI,MAAM,CAE7C;IAED,UAAmB,aAAa,CAAC,cAAc,EAAE,MAAM,UAyBtD;CACJ"}
|
|
@@ -40,18 +40,24 @@ class MessageReceptionState {
|
|
|
40
40
|
}
|
|
41
41
|
class MessageReceptionStateEncryptedWithoutRollover extends MessageReceptionState {
|
|
42
42
|
maximumMessageCounter;
|
|
43
|
-
messageCounterBitmap =
|
|
44
|
-
// All bits set to 1
|
|
43
|
+
messageCounterBitmap = this.initialBitmap;
|
|
45
44
|
constructor(messageCounter) {
|
|
46
45
|
super();
|
|
47
46
|
if (messageCounter !== void 0) {
|
|
48
47
|
this.initialize(messageCounter);
|
|
49
48
|
}
|
|
50
49
|
}
|
|
50
|
+
/**
|
|
51
|
+
* Bitmap seeded when the window is first anchored to a counter. All-1s for encrypted messages marks every
|
|
52
|
+
* sub-max counter as already-received (replay protection).
|
|
53
|
+
*/
|
|
54
|
+
get initialBitmap() {
|
|
55
|
+
return 4294967295;
|
|
56
|
+
}
|
|
51
57
|
/** Initialize the message counter state. */
|
|
52
58
|
initialize(messageCounter) {
|
|
53
59
|
this.maximumMessageCounter = messageCounter;
|
|
54
|
-
this.messageCounterBitmap =
|
|
60
|
+
this.messageCounterBitmap = this.initialBitmap;
|
|
55
61
|
}
|
|
56
62
|
/**
|
|
57
63
|
* Calculate plain diff without rollover.
|
|
@@ -145,6 +151,14 @@ class MessageReceptionStateEncryptedWithRollover extends MessageReceptionStateEn
|
|
|
145
151
|
}
|
|
146
152
|
}
|
|
147
153
|
class MessageReceptionStateUnencryptedWithRollover extends MessageReceptionStateEncryptedWithoutRollover {
|
|
154
|
+
/**
|
|
155
|
+
* Empty window: no sub-max counters have been received yet, so legitimately reordered messages below the first
|
|
156
|
+
* observed counter stay acceptable. Unencrypted duplicate detection is not a security control, so this loses
|
|
157
|
+
* nothing; matches the CHIP reference implementation, which has never seeded a full window.
|
|
158
|
+
*/
|
|
159
|
+
get initialBitmap() {
|
|
160
|
+
return 0;
|
|
161
|
+
}
|
|
148
162
|
calculateDiff(messageCounter) {
|
|
149
163
|
if (this.maximumMessageCounter === void 0) {
|
|
150
164
|
return 0;
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../src/protocol/MessageReceptionState.ts"],
|
|
4
|
-
"mappings": ";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAMA,qBAA2C;AAC3C,4BAAwC;AAPxC;AAAA;AAAA;AAAA;AAAA;AAUA,MAAM,8BAA8B,KAAK,IAAI,GAAG,EAAE;AAGlD,MAAM,0BAA0B;AAEzB,MAAM,8BAA8B,2BAAY;AAAC;AAEjD,MAAe,sBAAsB;AAE5C;AASO,MAAM,sDAAsD,sBAAsB;AAAA,EAC3E;AAAA,EACF,uBAAuB;AAAA
|
|
4
|
+
"mappings": "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",
|
|
5
5
|
"names": []
|
|
6
6
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"RebootResubscribeArmer.d.ts","sourceRoot":"","sources":["../../../src/peer/RebootResubscribeArmer.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,mBAAmB,EAAE,MAAM,oDAAoD,CAAC;AACzF,OAAO,EAAE,WAAW,EAAkB,MAAM,sBAAsB,CAAC;AAGnE,OAAO,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;
|
|
1
|
+
{"version":3,"file":"RebootResubscribeArmer.d.ts","sourceRoot":"","sources":["../../../src/peer/RebootResubscribeArmer.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,mBAAmB,EAAE,MAAM,oDAAoD,CAAC;AACzF,OAAO,EAAE,WAAW,EAAkB,MAAM,sBAAsB,CAAC;AAGnE,OAAO,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAsB5D;;;;;;;GAOG;AACH,qBAAa,sBAAsB;;IAM/B,YAAY,QAAQ,EAAE,cAAc,EAAE,aAAa,EAAE,mBAAmB,EAIvE;IAED,GAAG,CAAC,WAAW,EAAE,WAAW,QAmB3B;IAED,MAAM,CAAC,WAAW,EAAE,WAAW,QAS9B;IAmFD,CAAC,MAAM,CAAC,OAAO,CAAC,SAOf;CACJ"}
|
|
@@ -8,7 +8,7 @@ import { PeerUnresponsiveError } from "#peer/PeerCommunicationError.js";
|
|
|
8
8
|
import { Logger, Minutes, ObserverGroup, Seconds, Time } from "@matter/general";
|
|
9
9
|
const logger = Logger.get("RebootResubscribeArmer");
|
|
10
10
|
const DEFAULT_REBOOT_RESUBSCRIBE_GRACE = Seconds(30);
|
|
11
|
-
const EXPECTED_RETURN_TIMEOUT = Minutes(
|
|
11
|
+
const EXPECTED_RETURN_TIMEOUT = Minutes(3);
|
|
12
12
|
class RebootResubscribeArmer {
|
|
13
13
|
#sessions;
|
|
14
14
|
#subscriptions;
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../src/peer/RebootResubscribeArmer.ts"],
|
|
4
|
-
"mappings": "AAAA;AAAA;AAAA;AAAA;AAAA;AAOA,SAAS,aAAa,sBAAsB;AAC5C,SAAS,6BAA6B;AAGtC,SAAS,QAAQ,SAAS,eAAe,SAAS,YAA8B;AAEhF,MAAM,SAAS,OAAO,IAAI,wBAAwB;AAGlD,MAAM,mCAAmC,QAAQ,EAAE;
|
|
4
|
+
"mappings": "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",
|
|
5
5
|
"names": []
|
|
6
6
|
}
|
|
@@ -20,6 +20,11 @@ export declare class MessageReceptionStateEncryptedWithoutRollover extends Messa
|
|
|
20
20
|
protected maximumMessageCounter: number | undefined;
|
|
21
21
|
private messageCounterBitmap;
|
|
22
22
|
constructor(messageCounter?: number);
|
|
23
|
+
/**
|
|
24
|
+
* Bitmap seeded when the window is first anchored to a counter. All-1s for encrypted messages marks every
|
|
25
|
+
* sub-max counter as already-received (replay protection).
|
|
26
|
+
*/
|
|
27
|
+
protected get initialBitmap(): number;
|
|
23
28
|
/** Initialize the message counter state. */
|
|
24
29
|
private initialize;
|
|
25
30
|
/**
|
|
@@ -60,6 +65,12 @@ export declare class MessageReceptionStateEncryptedWithRollover extends MessageR
|
|
|
60
65
|
* back the window to the current location.
|
|
61
66
|
*/
|
|
62
67
|
export declare class MessageReceptionStateUnencryptedWithRollover extends MessageReceptionStateEncryptedWithoutRollover {
|
|
68
|
+
/**
|
|
69
|
+
* Empty window: no sub-max counters have been received yet, so legitimately reordered messages below the first
|
|
70
|
+
* observed counter stay acceptable. Unencrypted duplicate detection is not a security control, so this loses
|
|
71
|
+
* nothing; matches the CHIP reference implementation, which has never seeded a full window.
|
|
72
|
+
*/
|
|
73
|
+
protected get initialBitmap(): number;
|
|
63
74
|
protected calculateDiff(messageCounter: number): number;
|
|
64
75
|
}
|
|
65
76
|
//# sourceMappingURL=MessageReceptionState.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MessageReceptionState.d.ts","sourceRoot":"","sources":["../../../src/protocol/MessageReceptionState.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAiB,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAS7D,qBAAa,qBAAsB,SAAQ,WAAW;CAAG;AAEzD,8BAAsB,qBAAqB;IACvC,QAAQ,CAAC,oBAAoB,CAAC,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;CAC/D;AAED;;;;;;GAMG;AACH,qBAAa,6CAA8C,SAAQ,qBAAqB;IACpF,SAAS,CAAC,qBAAqB,EAAE,MAAM,GAAG,SAAS,CAAC;IACpD,OAAO,CAAC,oBAAoB,
|
|
1
|
+
{"version":3,"file":"MessageReceptionState.d.ts","sourceRoot":"","sources":["../../../src/protocol/MessageReceptionState.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAiB,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAS7D,qBAAa,qBAAsB,SAAQ,WAAW;CAAG;AAEzD,8BAAsB,qBAAqB;IACvC,QAAQ,CAAC,oBAAoB,CAAC,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;CAC/D;AAED;;;;;;GAMG;AACH,qBAAa,6CAA8C,SAAQ,qBAAqB;IACpF,SAAS,CAAC,qBAAqB,EAAE,MAAM,GAAG,SAAS,CAAC;IACpD,OAAO,CAAC,oBAAoB,CAAsB;IAElD,YAAY,cAAc,CAAC,EAAE,MAAM,EAKlC;IAED;;;OAGG;IACH,SAAS,KAAK,aAAa,IAAI,MAAM,CAEpC;IAED,4CAA4C;IAC5C,OAAO,CAAC,UAAU;IAKlB;;;;;;;OAOG;IACH,SAAS,CAAC,aAAa,CAAC,cAAc,EAAE,MAAM,UAK7C;IAED,iDAAiD;IACjD,OAAO,CAAC,6BAA6B;IAqBrC,6CAA6C;IAC7C,OAAO,CAAC,6BAA6B;IAarC,2DAA2D;IAC3D,OAAO,CAAC,sBAAsB;IAK9B;;OAEG;IACH,oBAAoB,CAAC,cAAc,EAAE,MAAM,QA0B1C;CACJ;AAED;;;;;GAKG;AACH,qBAAa,0CAA2C,SAAQ,6CAA6C;IACzG,UAAmB,aAAa,CAAC,cAAc,EAAE,MAAM,UAsBtD;CACJ;AAED;;;;;;;GAOG;AACH,qBAAa,4CAA6C,SAAQ,6CAA6C;IAC3G;;;;OAIG;IACH,cAAuB,aAAa,IAAI,MAAM,CAE7C;IAED,UAAmB,aAAa,CAAC,cAAc,EAAE,MAAM,UAyBtD;CACJ"}
|
|
@@ -13,18 +13,24 @@ class MessageReceptionState {
|
|
|
13
13
|
}
|
|
14
14
|
class MessageReceptionStateEncryptedWithoutRollover extends MessageReceptionState {
|
|
15
15
|
maximumMessageCounter;
|
|
16
|
-
messageCounterBitmap =
|
|
17
|
-
// All bits set to 1
|
|
16
|
+
messageCounterBitmap = this.initialBitmap;
|
|
18
17
|
constructor(messageCounter) {
|
|
19
18
|
super();
|
|
20
19
|
if (messageCounter !== void 0) {
|
|
21
20
|
this.initialize(messageCounter);
|
|
22
21
|
}
|
|
23
22
|
}
|
|
23
|
+
/**
|
|
24
|
+
* Bitmap seeded when the window is first anchored to a counter. All-1s for encrypted messages marks every
|
|
25
|
+
* sub-max counter as already-received (replay protection).
|
|
26
|
+
*/
|
|
27
|
+
get initialBitmap() {
|
|
28
|
+
return 4294967295;
|
|
29
|
+
}
|
|
24
30
|
/** Initialize the message counter state. */
|
|
25
31
|
initialize(messageCounter) {
|
|
26
32
|
this.maximumMessageCounter = messageCounter;
|
|
27
|
-
this.messageCounterBitmap =
|
|
33
|
+
this.messageCounterBitmap = this.initialBitmap;
|
|
28
34
|
}
|
|
29
35
|
/**
|
|
30
36
|
* Calculate plain diff without rollover.
|
|
@@ -118,6 +124,14 @@ class MessageReceptionStateEncryptedWithRollover extends MessageReceptionStateEn
|
|
|
118
124
|
}
|
|
119
125
|
}
|
|
120
126
|
class MessageReceptionStateUnencryptedWithRollover extends MessageReceptionStateEncryptedWithoutRollover {
|
|
127
|
+
/**
|
|
128
|
+
* Empty window: no sub-max counters have been received yet, so legitimately reordered messages below the first
|
|
129
|
+
* observed counter stay acceptable. Unencrypted duplicate detection is not a security control, so this loses
|
|
130
|
+
* nothing; matches the CHIP reference implementation, which has never seeded a full window.
|
|
131
|
+
*/
|
|
132
|
+
get initialBitmap() {
|
|
133
|
+
return 0;
|
|
134
|
+
}
|
|
121
135
|
calculateDiff(messageCounter) {
|
|
122
136
|
if (this.maximumMessageCounter === void 0) {
|
|
123
137
|
return 0;
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../src/protocol/MessageReceptionState.ts"],
|
|
4
|
-
"mappings": "AAAA;AAAA;AAAA;AAAA;AAAA;AAMA,SAAS,eAAe,mBAAmB;AAC3C,SAAS,+BAA+B;AAGxC,MAAM,8BAA8B,KAAK,IAAI,GAAG,EAAE;AAGlD,MAAM,0BAA0B;AAEzB,MAAM,8BAA8B,YAAY;AAAC;AAEjD,MAAe,sBAAsB;AAE5C;AASO,MAAM,sDAAsD,sBAAsB;AAAA,EAC3E;AAAA,EACF,uBAAuB;AAAA
|
|
4
|
+
"mappings": "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",
|
|
5
5
|
"names": []
|
|
6
6
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@matter/protocol",
|
|
3
|
-
"version": "0.17.6
|
|
3
|
+
"version": "0.17.6",
|
|
4
4
|
"description": "Low-level APIs for Matter interaction",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"iot",
|
|
@@ -35,12 +35,12 @@
|
|
|
35
35
|
"#*": "./src/*"
|
|
36
36
|
},
|
|
37
37
|
"dependencies": {
|
|
38
|
-
"@matter/general": "0.17.6
|
|
39
|
-
"@matter/model": "0.17.6
|
|
40
|
-
"@matter/types": "0.17.6
|
|
38
|
+
"@matter/general": "0.17.6",
|
|
39
|
+
"@matter/model": "0.17.6",
|
|
40
|
+
"@matter/types": "0.17.6"
|
|
41
41
|
},
|
|
42
42
|
"devDependencies": {
|
|
43
|
-
"@matter/testing": "0.17.6
|
|
43
|
+
"@matter/testing": "0.17.6"
|
|
44
44
|
},
|
|
45
45
|
"files": [
|
|
46
46
|
"dist/**/*",
|
|
@@ -17,10 +17,12 @@ const logger = Logger.get("RebootResubscribeArmer");
|
|
|
17
17
|
const DEFAULT_REBOOT_RESUBSCRIBE_GRACE = Seconds(30);
|
|
18
18
|
|
|
19
19
|
/**
|
|
20
|
-
* How long we wait for an armed device to re-establish a session before assuming it restarted silently
|
|
21
|
-
*
|
|
20
|
+
* How long we wait for an armed device to re-establish a session before assuming it restarted silently and forcing
|
|
21
|
+
* recovery. A device applying an update has normally rebooted and returned within this window, so it is a backstop
|
|
22
|
+
* rather than the common path; kept short so a silently-restarted device recovers well before the full subscription
|
|
23
|
+
* liveness timeout.
|
|
22
24
|
*/
|
|
23
|
-
const EXPECTED_RETURN_TIMEOUT = Minutes(
|
|
25
|
+
const EXPECTED_RETURN_TIMEOUT = Minutes(3);
|
|
24
26
|
|
|
25
27
|
interface ArmState {
|
|
26
28
|
newSessionAt?: Timestamp;
|
|
@@ -28,7 +28,7 @@ export abstract class MessageReceptionState {
|
|
|
28
28
|
*/
|
|
29
29
|
export class MessageReceptionStateEncryptedWithoutRollover extends MessageReceptionState {
|
|
30
30
|
protected maximumMessageCounter: number | undefined;
|
|
31
|
-
private messageCounterBitmap =
|
|
31
|
+
private messageCounterBitmap = this.initialBitmap;
|
|
32
32
|
|
|
33
33
|
constructor(messageCounter?: number) {
|
|
34
34
|
super();
|
|
@@ -37,10 +37,18 @@ export class MessageReceptionStateEncryptedWithoutRollover extends MessageRecept
|
|
|
37
37
|
}
|
|
38
38
|
}
|
|
39
39
|
|
|
40
|
+
/**
|
|
41
|
+
* Bitmap seeded when the window is first anchored to a counter. All-1s for encrypted messages marks every
|
|
42
|
+
* sub-max counter as already-received (replay protection).
|
|
43
|
+
*/
|
|
44
|
+
protected get initialBitmap(): number {
|
|
45
|
+
return 0xffffffff;
|
|
46
|
+
}
|
|
47
|
+
|
|
40
48
|
/** Initialize the message counter state. */
|
|
41
49
|
private initialize(messageCounter: number) {
|
|
42
50
|
this.maximumMessageCounter = messageCounter;
|
|
43
|
-
this.messageCounterBitmap =
|
|
51
|
+
this.messageCounterBitmap = this.initialBitmap;
|
|
44
52
|
}
|
|
45
53
|
|
|
46
54
|
/**
|
|
@@ -173,6 +181,15 @@ export class MessageReceptionStateEncryptedWithRollover extends MessageReception
|
|
|
173
181
|
* back the window to the current location.
|
|
174
182
|
*/
|
|
175
183
|
export class MessageReceptionStateUnencryptedWithRollover extends MessageReceptionStateEncryptedWithoutRollover {
|
|
184
|
+
/**
|
|
185
|
+
* Empty window: no sub-max counters have been received yet, so legitimately reordered messages below the first
|
|
186
|
+
* observed counter stay acceptable. Unencrypted duplicate detection is not a security control, so this loses
|
|
187
|
+
* nothing; matches the CHIP reference implementation, which has never seeded a full window.
|
|
188
|
+
*/
|
|
189
|
+
protected override get initialBitmap(): number {
|
|
190
|
+
return 0;
|
|
191
|
+
}
|
|
192
|
+
|
|
176
193
|
protected override calculateDiff(messageCounter: number) {
|
|
177
194
|
if (this.maximumMessageCounter === undefined) {
|
|
178
195
|
return 0;
|