@matter/protocol 0.12.6-alpha.0-20250304-03716637c → 0.13.0-alpha.0-20250304-d4a7592a4

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.
Files changed (80) hide show
  1. package/dist/cjs/common/Scanner.d.ts +25 -1
  2. package/dist/cjs/common/Scanner.d.ts.map +1 -1
  3. package/dist/cjs/common/Scanner.js +18 -1
  4. package/dist/cjs/common/Scanner.js.map +1 -1
  5. package/dist/cjs/mdns/MdnsBroadcaster.js +3 -3
  6. package/dist/cjs/mdns/MdnsConsts.d.ts.map +1 -1
  7. package/dist/cjs/mdns/MdnsScanner.d.ts.map +1 -1
  8. package/dist/cjs/mdns/MdnsScanner.js +1 -1
  9. package/dist/cjs/mdns/MdnsScanner.js.map +1 -1
  10. package/dist/cjs/peer/ControllerCommissioningFlow.d.ts.map +1 -1
  11. package/dist/cjs/peer/ControllerCommissioningFlow.js +55 -55
  12. package/dist/cjs/peer/ControllerCommissioningFlow.js.map +1 -1
  13. package/dist/cjs/session/Session.d.ts +33 -1
  14. package/dist/cjs/session/Session.d.ts.map +1 -1
  15. package/dist/cjs/session/Session.js +16 -3
  16. package/dist/cjs/session/Session.js.map +1 -1
  17. package/dist/cjs/session/SessionManager.d.ts.map +1 -1
  18. package/dist/cjs/session/SessionManager.js +14 -4
  19. package/dist/cjs/session/SessionManager.js.map +1 -1
  20. package/dist/cjs/session/case/CaseMessages.d.ts +15 -0
  21. package/dist/cjs/session/case/CaseMessages.d.ts.map +1 -1
  22. package/dist/cjs/session/case/CaseMessenger.d.ts +15 -0
  23. package/dist/cjs/session/case/CaseMessenger.d.ts.map +1 -1
  24. package/dist/cjs/session/pase/PaseClient.d.ts.map +1 -1
  25. package/dist/cjs/session/pase/PaseClient.js +7 -1
  26. package/dist/cjs/session/pase/PaseClient.js.map +1 -1
  27. package/dist/cjs/session/pase/PaseMessages.d.ts +21 -0
  28. package/dist/cjs/session/pase/PaseMessages.d.ts.map +1 -1
  29. package/dist/cjs/session/pase/PaseMessages.js +6 -1
  30. package/dist/cjs/session/pase/PaseMessages.js.map +1 -1
  31. package/dist/cjs/session/pase/PaseMessenger.d.ts +10 -0
  32. package/dist/cjs/session/pase/PaseMessenger.d.ts.map +1 -1
  33. package/dist/cjs/session/pase/PaseServer.d.ts.map +1 -1
  34. package/dist/cjs/session/pase/PaseServer.js +8 -2
  35. package/dist/cjs/session/pase/PaseServer.js.map +1 -1
  36. package/dist/esm/common/Scanner.d.ts +25 -1
  37. package/dist/esm/common/Scanner.d.ts.map +1 -1
  38. package/dist/esm/common/Scanner.js +18 -1
  39. package/dist/esm/common/Scanner.js.map +1 -1
  40. package/dist/esm/mdns/MdnsBroadcaster.js +3 -3
  41. package/dist/esm/mdns/MdnsConsts.d.ts.map +1 -1
  42. package/dist/esm/mdns/MdnsScanner.d.ts.map +1 -1
  43. package/dist/esm/mdns/MdnsScanner.js +1 -1
  44. package/dist/esm/mdns/MdnsScanner.js.map +1 -1
  45. package/dist/esm/peer/ControllerCommissioningFlow.d.ts.map +1 -1
  46. package/dist/esm/peer/ControllerCommissioningFlow.js +55 -55
  47. package/dist/esm/peer/ControllerCommissioningFlow.js.map +1 -1
  48. package/dist/esm/session/Session.d.ts +33 -1
  49. package/dist/esm/session/Session.d.ts.map +1 -1
  50. package/dist/esm/session/Session.js +16 -3
  51. package/dist/esm/session/Session.js.map +1 -1
  52. package/dist/esm/session/SessionManager.d.ts.map +1 -1
  53. package/dist/esm/session/SessionManager.js +15 -4
  54. package/dist/esm/session/SessionManager.js.map +1 -1
  55. package/dist/esm/session/case/CaseMessages.d.ts +15 -0
  56. package/dist/esm/session/case/CaseMessages.d.ts.map +1 -1
  57. package/dist/esm/session/case/CaseMessenger.d.ts +15 -0
  58. package/dist/esm/session/case/CaseMessenger.d.ts.map +1 -1
  59. package/dist/esm/session/pase/PaseClient.d.ts.map +1 -1
  60. package/dist/esm/session/pase/PaseClient.js +7 -1
  61. package/dist/esm/session/pase/PaseClient.js.map +1 -1
  62. package/dist/esm/session/pase/PaseMessages.d.ts +21 -0
  63. package/dist/esm/session/pase/PaseMessages.d.ts.map +1 -1
  64. package/dist/esm/session/pase/PaseMessages.js +16 -2
  65. package/dist/esm/session/pase/PaseMessages.js.map +1 -1
  66. package/dist/esm/session/pase/PaseMessenger.d.ts +10 -0
  67. package/dist/esm/session/pase/PaseMessenger.d.ts.map +1 -1
  68. package/dist/esm/session/pase/PaseServer.d.ts.map +1 -1
  69. package/dist/esm/session/pase/PaseServer.js +8 -2
  70. package/dist/esm/session/pase/PaseServer.js.map +1 -1
  71. package/package.json +6 -6
  72. package/src/common/Scanner.ts +18 -2
  73. package/src/mdns/MdnsBroadcaster.ts +3 -3
  74. package/src/mdns/MdnsScanner.ts +3 -2
  75. package/src/peer/ControllerCommissioningFlow.ts +55 -52
  76. package/src/session/Session.ts +50 -1
  77. package/src/session/SessionManager.ts +20 -2
  78. package/src/session/pase/PaseClient.ts +10 -1
  79. package/src/session/pase/PaseMessages.ts +17 -1
  80. package/src/session/pase/PaseServer.ts +11 -1
@@ -29,6 +29,11 @@ export declare class PaseServerMessenger extends SecureChannelMessenger {
29
29
  interactionModelRevision: import("#types").OptionalFieldType<number>;
30
30
  specificationVersion: import("#types").OptionalFieldType<number>;
31
31
  maxPathsPerInvoke: import("#types").OptionalFieldType<number>;
32
+ supportedTransports: import("#types").OptionalFieldType<import("#types").TypeFromPartialBitSchema<{
33
+ tcpClient: import("#types").BitFlag;
34
+ tcpServer: import("#types").BitFlag;
35
+ }>>;
36
+ maxTcpMessageSize: import("#types").OptionalFieldType<number>;
32
37
  }>>;
33
38
  }>;
34
39
  }>;
@@ -61,6 +66,11 @@ export declare class PaseClientMessenger extends SecureChannelMessenger {
61
66
  interactionModelRevision: import("#types").OptionalFieldType<number>;
62
67
  specificationVersion: import("#types").OptionalFieldType<number>;
63
68
  maxPathsPerInvoke: import("#types").OptionalFieldType<number>;
69
+ supportedTransports: import("#types").OptionalFieldType<import("#types").TypeFromPartialBitSchema<{
70
+ tcpClient: import("#types").BitFlag;
71
+ tcpServer: import("#types").BitFlag;
72
+ }>>;
73
+ maxTcpMessageSize: import("#types").OptionalFieldType<number>;
64
74
  }>>;
65
75
  }>;
66
76
  }>;
@@ -1 +1 @@
1
- {"version":3,"file":"PaseMessenger.d.ts","sourceRoot":"","sources":["../../../../src/session/pase/PaseMessenger.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EAAqB,cAAc,EAAE,MAAM,QAAQ,CAAC;AAC3D,OAAO,EAEH,sBAAsB,EACzB,MAAM,+CAA+C,CAAC;AACvD,OAAO,EACH,YAAY,EACZ,YAAY,EACZ,YAAY,EACZ,oBAAoB,EACpB,qBAAqB,EACxB,MAAM,mBAAmB,CAAC;AAE3B,eAAO,MAAM,mBAAmB,IAAI,CAAC;AACrC,eAAO,MAAM,aAAa,6BAAiD,CAAC;AAE5E,KAAK,iBAAiB,GAAG,cAAc,CAAC,OAAO,oBAAoB,CAAC,CAAC;AACrE,KAAK,kBAAkB,GAAG,cAAc,CAAC,OAAO,qBAAqB,CAAC,CAAC;AACvE,KAAK,SAAS,GAAG,cAAc,CAAC,OAAO,YAAY,CAAC,CAAC;AACrD,KAAK,SAAS,GAAG,cAAc,CAAC,OAAO,YAAY,CAAC,CAAC;AACrD,KAAK,SAAS,GAAG,cAAc,CAAC,OAAO,YAAY,CAAC,CAAC;AAErD,qBAAa,mBAAoB,SAAQ,sBAAsB;IACrD,qBAAqB;;;;;;;;;;;;;;;;;;IAQrB,sBAAsB,CAAC,QAAQ,EAAE,kBAAkB;IAMzD,aAAa;;;IAIb,aAAa,CAAC,SAAS,EAAE,SAAS;IAIlC,aAAa;;;CAGhB;AAED,qBAAa,mBAAoB,SAAQ,sBAAsB;IAC3D,qBAAqB,CAAC,OAAO,EAAE,iBAAiB;IAM1C,sBAAsB;;;;;;;;;;;;;;;;;;;;;IAQ5B,aAAa,CAAC,SAAS,EAAE,SAAS;IAIlC,aAAa;;;;IAIb,aAAa,CAAC,SAAS,EAAE,SAAS;CAGrC"}
1
+ {"version":3,"file":"PaseMessenger.d.ts","sourceRoot":"","sources":["../../../../src/session/pase/PaseMessenger.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EAAqB,cAAc,EAAE,MAAM,QAAQ,CAAC;AAC3D,OAAO,EAEH,sBAAsB,EACzB,MAAM,+CAA+C,CAAC;AACvD,OAAO,EACH,YAAY,EACZ,YAAY,EACZ,YAAY,EACZ,oBAAoB,EACpB,qBAAqB,EACxB,MAAM,mBAAmB,CAAC;AAE3B,eAAO,MAAM,mBAAmB,IAAI,CAAC;AACrC,eAAO,MAAM,aAAa,6BAAiD,CAAC;AAE5E,KAAK,iBAAiB,GAAG,cAAc,CAAC,OAAO,oBAAoB,CAAC,CAAC;AACrE,KAAK,kBAAkB,GAAG,cAAc,CAAC,OAAO,qBAAqB,CAAC,CAAC;AACvE,KAAK,SAAS,GAAG,cAAc,CAAC,OAAO,YAAY,CAAC,CAAC;AACrD,KAAK,SAAS,GAAG,cAAc,CAAC,OAAO,YAAY,CAAC,CAAC;AACrD,KAAK,SAAS,GAAG,cAAc,CAAC,OAAO,YAAY,CAAC,CAAC;AAErD,qBAAa,mBAAoB,SAAQ,sBAAsB;IACrD,qBAAqB;;;;;;;;;;;;;;;;;;;;;;;IAQrB,sBAAsB,CAAC,QAAQ,EAAE,kBAAkB;IAMzD,aAAa;;;IAIb,aAAa,CAAC,SAAS,EAAE,SAAS;IAIlC,aAAa;;;CAGhB;AAED,qBAAa,mBAAoB,SAAQ,sBAAsB;IAC3D,qBAAqB,CAAC,OAAO,EAAE,iBAAiB;IAM1C,sBAAsB;;;;;;;;;;;;;;;;;;;;;;;;;;IAQ5B,aAAa,CAAC,SAAS,EAAE,SAAS;IAIlC,aAAa;;;;IAIb,aAAa,CAAC,SAAS,EAAE,SAAS;CAGrC"}
@@ -1 +1 @@
1
- {"version":3,"file":"PaseServer.d.ts","sourceRoot":"","sources":["../../../../src/session/pase/PaseServer.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAKH,eAAe,EACf,eAAe,EAKlB,MAAM,UAAU,CAAC;AAClB,OAAO,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAE5D,OAAO,EAAE,eAAe,EAAE,MAAM,mCAAmC,CAAC;AACpE,OAAO,EAAE,eAAe,EAAE,MAAM,mCAAmC,CAAC;AAEpE,OAAO,EAAuB,mBAAmB,EAAiB,MAAM,oBAAoB,CAAC;AAS7F,qBAAa,oCAAqC,SAAQ,eAAe;CAAG;AAE5E,qBAAa,UAAW,YAAW,eAAe;;IAsB1C,OAAO,CAAC,QAAQ;IAChB,OAAO,CAAC,QAAQ,CAAC,EAAE;IACnB,OAAO,CAAC,QAAQ,CAAC,CAAC;IAClB,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAC;IAxBrC,QAAQ,CAAC,EAAE,KAA8B;WAK5B,OAAO,CAAC,QAAQ,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,EAAE,eAAe,EAAE,eAAe;IAKrG,MAAM,CAAC,qBAAqB,CACxB,QAAQ,EAAE,cAAc,EACxB,iBAAiB,EAAE,UAAU,EAC7B,eAAe,CAAC,EAAE,eAAe;gBAQzB,QAAQ,EAAE,cAAc,EACf,EAAE,EAAE,MAAM,EACV,CAAC,EAAE,UAAU,EACb,eAAe,CAAC,EAAE,eAAe,YAAA;IAGhD,aAAa,CAAC,QAAQ,EAAE,eAAe;YA0B/B,oBAAoB;IAmF5B,aAAa,CAAC,SAAS,EAAE,mBAAmB,EAAE,SAAS,UAAO;IAU9D,KAAK;CAGd"}
1
+ {"version":3,"file":"PaseServer.d.ts","sourceRoot":"","sources":["../../../../src/session/pase/PaseServer.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAKH,eAAe,EACf,eAAe,EAKlB,MAAM,UAAU,CAAC;AAClB,OAAO,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAE5D,OAAO,EAAE,eAAe,EAAE,MAAM,mCAAmC,CAAC;AACpE,OAAO,EAAE,eAAe,EAAE,MAAM,mCAAmC,CAAC;AAEpE,OAAO,EAAuB,mBAAmB,EAAiB,MAAM,oBAAoB,CAAC;AAS7F,qBAAa,oCAAqC,SAAQ,eAAe;CAAG;AAE5E,qBAAa,UAAW,YAAW,eAAe;;IAsB1C,OAAO,CAAC,QAAQ;IAChB,OAAO,CAAC,QAAQ,CAAC,EAAE;IACnB,OAAO,CAAC,QAAQ,CAAC,CAAC;IAClB,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAC;IAxBrC,QAAQ,CAAC,EAAE,KAA8B;WAK5B,OAAO,CAAC,QAAQ,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,EAAE,eAAe,EAAE,eAAe;IAKrG,MAAM,CAAC,qBAAqB,CACxB,QAAQ,EAAE,cAAc,EACxB,iBAAiB,EAAE,UAAU,EAC7B,eAAe,CAAC,EAAE,eAAe;gBAQzB,QAAQ,EAAE,cAAc,EACf,EAAE,EAAE,MAAM,EACV,CAAC,EAAE,UAAU,EACb,eAAe,CAAC,EAAE,eAAe,YAAA;IAGhD,aAAa,CAAC,QAAQ,EAAE,eAAe;YA0B/B,oBAAoB;IA6F5B,aAAa,CAAC,SAAS,EAAE,mBAAmB,EAAE,SAAS,UAAO;IAU9D,KAAK;CAGd"}
@@ -94,13 +94,19 @@ class PaseServer {
94
94
  }
95
95
  const responderSessionId = await this.sessions.getNextAvailableSessionId();
96
96
  const responderRandom = Crypto.getRandom();
97
+ const responderSessionParams = this.sessions.sessionParameters;
98
+ const tcpSupported = responderSessionParams.supportedTransports?.tcpClient || responderSessionParams.supportedTransports?.tcpServer || false;
97
99
  const responsePayload = await messenger.sendPbkdfParamResponse({
98
100
  initiatorRandom,
99
101
  responderRandom,
100
102
  responderSessionId,
101
103
  pbkdfParameters: hasPbkdfParameters ? void 0 : this.pbkdfParameters,
102
- responderSessionParams: this.sessions.sessionParameters
103
- // responder session parameters
104
+ responderSessionParams: {
105
+ ...responderSessionParams,
106
+ // The MAX_TCP_MESSAGE_SIZE field SHALL only be present if the SUPPORTED_TRANSPORTS field
107
+ // indicates that TCP is supported.
108
+ maxTcpMessageSize: tcpSupported ? responderSessionParams.maxTcpMessageSize : void 0
109
+ }
104
110
  });
105
111
  const spake2p = Spake2p.create(Crypto.hash([SPAKE_CONTEXT, requestPayload, responsePayload]), this.w0);
106
112
  const { x: X } = await messenger.readPasePake1();
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../src/session/pase/PaseServer.ts"],
4
- "mappings": "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",
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.12.6-alpha.0-20250304-03716637c",
3
+ "version": "0.13.0-alpha.0-20250304-d4a7592a4",
4
4
  "description": "Low-level APIs for Matter interaction",
5
5
  "keywords": [
6
6
  "iot",
@@ -40,14 +40,14 @@
40
40
  "#*": "./src/*"
41
41
  },
42
42
  "dependencies": {
43
- "@matter/general": "0.12.6-alpha.0-20250304-03716637c",
44
- "@matter/model": "0.12.6-alpha.0-20250304-03716637c",
45
- "@matter/types": "0.12.6-alpha.0-20250304-03716637c",
43
+ "@matter/general": "0.13.0-alpha.0-20250304-d4a7592a4",
44
+ "@matter/model": "0.13.0-alpha.0-20250304-d4a7592a4",
45
+ "@matter/types": "0.13.0-alpha.0-20250304-d4a7592a4",
46
46
  "@noble/curves": "^1.8.1"
47
47
  },
48
48
  "devDependencies": {
49
- "@matter/tools": "0.12.6-alpha.0-20250304-03716637c",
50
- "@matter/testing": "0.12.6-alpha.0-20250304-03716637c"
49
+ "@matter/tools": "0.13.0-alpha.0-20250304-d4a7592a4",
50
+ "@matter/testing": "0.13.0-alpha.0-20250304-d4a7592a4"
51
51
  },
52
52
  "files": [
53
53
  "dist/**/*",
@@ -5,9 +5,25 @@
5
5
  */
6
6
 
7
7
  import { BasicSet, ChannelType, Environment, Environmental, Lifespan, ServerAddress, ServerAddressIp } from "#general";
8
- import { DiscoveryCapabilitiesBitmap, NodeId, TypeFromPartialBitSchema, VendorId } from "#types";
8
+ import { BitFlag, BitmapSchema, DiscoveryCapabilitiesBitmap, NodeId, TypeFromPartialBitSchema, VendorId } from "#types";
9
9
  import { Fabric } from "../fabric/Fabric.js";
10
10
 
11
+ export const SupportedTransportsBitmap = {
12
+ // Bit 0 is reserved
13
+ /**
14
+ * TCP Client
15
+ * The advertising Node implements the TCP Client mode and MAY connect to a peer Node that is a TCP Server.
16
+ */
17
+ tcpClient: BitFlag(1),
18
+
19
+ /**
20
+ * TCP Server
21
+ * The advertising Node implements the TCP Server mode and SHALL listen for incoming TCP connections.
22
+ */
23
+ tcpServer: BitFlag(2),
24
+ };
25
+ export const SupportedTransportsSchema = BitmapSchema(SupportedTransportsBitmap);
26
+
11
27
  /**
12
28
  * All information exposed by a commissionable device via announcements.
13
29
  * The properties are named identical as in the Matter specification.
@@ -41,7 +57,7 @@ export type DiscoveryData = {
41
57
  SAT?: number;
42
58
 
43
59
  /** TCP supported */
44
- T?: number;
60
+ T?: number; // SupportedTransportsBitmap but comes in as number, so converted on usage
45
61
 
46
62
  /** ICD Long Idle Time operating mode supported */
47
63
  ICD?: number;
@@ -231,7 +231,7 @@ export class MdnsBroadcaster {
231
231
  `SII=${sessionIdleInterval}` /* Session Idle Interval */,
232
232
  `SAI=${sessionActiveInterval}` /* Session Active Interval */,
233
233
  `SAT=${sessionActiveThreshold}` /* Session Active Threshold */,
234
- //`T=${TCP_SUPPORTED}` /* TCP not supported */,
234
+ //`T=${TCP_SUPPORTED}` /* TODO TCP not supported */,
235
235
  `D=${discriminator}` /* Discriminator */,
236
236
  `CM=${mode}` /* Commission Mode */,
237
237
  `PH=${PairingHintBitmapSchema.encode(pairingHint)}` /* Pairing Hint */,
@@ -324,7 +324,7 @@ export class MdnsBroadcaster {
324
324
  `SII=${sessionIdleInterval}` /* Session Idle Interval */,
325
325
  `SAI=${sessionActiveInterval}` /* Session Active Interval */,
326
326
  `SAT=${sessionActiveThreshold}` /* Session Active Threshold */,
327
- //`T=${TCP_SUPPORTED}` /* TCP not supported */,
327
+ //`T=${TCP_SUPPORTED}` /* TODO TCP not supported */,
328
328
  //`ICD=${ICD_SUPPORTED}` /* ICD not supported */,
329
329
  ],
330
330
  deviceMatterQname,
@@ -387,7 +387,7 @@ export class MdnsBroadcaster {
387
387
  `SII=${sessionIdleInterval}` /* Session Idle Interval */,
388
388
  `SAI=${sessionActiveInterval}` /* Session Active Interval */,
389
389
  `SAT=${sessionActiveThreshold}` /* Session Active Threshold */,
390
- //`T=${TCP_SUPPORTED}` /* TCP not supported */,
390
+ //`T=${TCP_SUPPORTED}` /* TODO TCP not supported */,
391
391
  //`ICD=${ICD_SUPPORTED}` /* ICD not supported */,
392
392
  ]),
393
393
  ];
@@ -1316,8 +1316,9 @@ export class MdnsScanner implements Scanner {
1316
1316
  // Fill in some defaults for convenience
1317
1317
  if (result.T === undefined) {
1318
1318
  result.T = 0; // TCP not supported
1319
- } else if (result.T === 1) {
1320
- // Value 1 is reserved and should be handled as 0 according to Matter spec
1319
+ } else if (!(result.T & ~1 & 6)) {
1320
+ // Value 1 is reserved and should be handled as 0 according to Matter spec,
1321
+ // else check if tcpClient (Bit 1) or tcpServer (Bit 2) or both are supported, all other values are invalid
1321
1322
  result.T = 0; // TCP not supported
1322
1323
  }
1323
1324
  if (result.ICD === undefined) {
@@ -313,47 +313,50 @@ export class ControllerCommissioningFlow {
313
313
 
314
314
  // Step 1: is outside of this class and requires to have relevant information needed by next steps
315
315
  // Step 2: is about discovery which is already done before this starts here
316
- // Step 3: is the PASE session establishment which is done before this starts here
316
+ // TODO Step 3-5: Commissioner handles/prepares for T&C Ack, if supported
317
+ // Step 6: is the PASE session establishment which is done before this starts here
317
318
 
318
319
  this.#commissioningSteps.push({
319
- stepNumber: 4,
320
+ stepNumber: 7,
320
321
  subStepNumber: 1,
321
322
  name: "GeneralCommissioning.ArmFailsafe",
322
323
  stepLogic: () => this.#armFailsafe(),
323
324
  });
324
325
 
325
326
  this.#commissioningSteps.push({
326
- stepNumber: 5,
327
+ stepNumber: 8,
327
328
  subStepNumber: 1,
328
329
  name: "GeneralCommissioning.ConfigureRegulatoryInformation",
329
330
  stepLogic: () => this.#configureRegulatoryInformation(),
330
331
  });
331
332
 
332
333
  this.#commissioningSteps.push({
333
- stepNumber: 5,
334
+ stepNumber: 8,
334
335
  subStepNumber: 2,
335
336
  name: "TimeSynchronization.SynchronizeTime",
336
337
  stepLogic: () => this.#synchronizeTime(),
337
338
  });
338
339
 
340
+ // TODO Step 9: If device and Controller supports T&C Feature then User consent is handled
341
+
339
342
  this.#commissioningSteps.push({
340
- stepNumber: 6,
343
+ stepNumber: 10,
341
344
  subStepNumber: 1,
342
345
  name: "OperationalCredentials.DeviceAttestation",
343
346
  stepLogic: () => this.#deviceAttestation(),
344
347
  });
345
348
 
346
349
  this.#commissioningSteps.push({
347
- stepNumber: 7, // includes 7-9
350
+ stepNumber: 11, // includes 11-13
348
351
  subStepNumber: 1,
349
352
  name: "OperationalCredentials.Certificates",
350
353
  stepLogic: () => this.#certificates(),
351
354
  });
352
355
 
353
- // TODO Step 10: TimeSynchronization.SetTrustedTimeSource if supported
356
+ // TODO Step 14: TimeSynchronization.SetTrustedTimeSource if supported
354
357
 
355
358
  this.#commissioningSteps.push({
356
- stepNumber: 11,
359
+ stepNumber: 15,
357
360
  subStepNumber: 1,
358
361
  name: "AccessControl",
359
362
  stepLogic: () => this.#configureAccessControlLists(),
@@ -362,14 +365,14 @@ export class ControllerCommissioningFlow {
362
365
  // Care about Network commissioning only when we are on BLE, because else we are already on IP network
363
366
  if (this.#interactionClient.channelType === ChannelType.BLE) {
364
367
  this.#commissioningSteps.push({
365
- stepNumber: 12,
368
+ stepNumber: 16,
366
369
  subStepNumber: 1,
367
370
  name: "NetworkCommissioning.Validate",
368
371
  stepLogic: () => this.#validateNetwork(),
369
372
  });
370
373
  if (this.#commissioningOptions.wifiNetwork !== undefined) {
371
374
  this.#commissioningSteps.push({
372
- stepNumber: 12, // includes step 13
375
+ stepNumber: 16, // includes step 17
373
376
  subStepNumber: 2,
374
377
  name: "NetworkCommissioning.Wifi",
375
378
  reArmFailsafe: true,
@@ -378,7 +381,7 @@ export class ControllerCommissioningFlow {
378
381
  }
379
382
  if (this.#commissioningOptions.threadNetwork !== undefined) {
380
383
  this.#commissioningSteps.push({
381
- stepNumber: 12, // includes step 13
384
+ stepNumber: 16, // includes step 17
382
385
  subStepNumber: 3,
383
386
  name: "NetworkCommissioning.Thread",
384
387
  reArmFailsafe: true,
@@ -392,7 +395,7 @@ export class ControllerCommissioningFlow {
392
395
  }
393
396
 
394
397
  this.#commissioningSteps.push({
395
- stepNumber: 14, // includes step 15 (CASE connection)
398
+ stepNumber: 18, // includes step 19 (CASE connection)
396
399
  subStepNumber: 1,
397
400
  name: "Reconnect",
398
401
  reArmFailsafe: true,
@@ -400,14 +403,14 @@ export class ControllerCommissioningFlow {
400
403
  });
401
404
 
402
405
  this.#commissioningSteps.push({
403
- stepNumber: 16,
406
+ stepNumber: 20,
404
407
  subStepNumber: 1,
405
408
  name: "GeneralCommissioning.Complete",
406
409
  stepLogic: () => this.#completeCommissioning(),
407
410
  });
408
411
 
409
412
  this.#commissioningSteps.push({
410
- stepNumber: 17, // Should be allowed in Step 9, but Tasmota is not supporting this
413
+ stepNumber: 99, // Should be allowed in Step 13, but Tasmota is not supporting this
411
414
  subStepNumber: 1,
412
415
  name: "OperationalCredentials.UpdateFabricLabel",
413
416
  stepLogic: () => this.#updateFabricLabel(),
@@ -531,7 +534,7 @@ export class ControllerCommissioningFlow {
531
534
  }
532
535
 
533
536
  /**
534
- * Step 4
537
+ * Step 7
535
538
  * Commissioner SHALL re-arm the Fail-safe timer on the Commissionee to the desired commissioning
536
539
  * timeout within 60 seconds of the completion of PASE session establishment, using the
537
540
  * ArmFailSafe command (see Section 11.10.6.2, “ArmFailSafe Command”). A Commissioner MAY
@@ -579,7 +582,7 @@ export class ControllerCommissioningFlow {
579
582
  }
580
583
 
581
584
  /**
582
- * Step 5 - 1
585
+ * Step 8 - 1
583
586
  * Commissioner SHALL configure regulatory information if the Commissionee has at least one instance of
584
587
  * the Network Commissioning cluster on any endpoint with either the WI (i.e. Wi-Fi) or TH (i.e. Thread)
585
588
  * feature flags set in its FeatureMap, Commissioner SHALL configure regulatory information in the
@@ -650,7 +653,7 @@ export class ControllerCommissioningFlow {
650
653
  }
651
654
 
652
655
  /**
653
- * Step 5 - 2
656
+ * Step 8 - 2
654
657
  * Commissioner SHOULD configure UTC time, timezone, and DST offset, if the Commissionee supports the
655
658
  * time synchronization cluster.
656
659
  * ▪ The Commissioner SHOULD configure UTC time using the SetUTCTime command.
@@ -675,7 +678,7 @@ export class ControllerCommissioningFlow {
675
678
  }
676
679
 
677
680
  /**
678
- * Step 6
681
+ * Step 10
679
682
  * Commissioner SHALL establish the authenticity of the Commissionee as a certified Matter device
680
683
  * (see Section 6.2.3, “Device Attestation Procedure”).
681
684
  */
@@ -721,20 +724,20 @@ export class ControllerCommissioningFlow {
721
724
  }
722
725
 
723
726
  /**
724
- * Step 7-9
725
- * 7: Following the Device Attestation Procedure yielding a decision to proceed with commissioning, the Commissioner
726
- * SHALL request operational CSR from Commissionee using the CSRRequest command (see Section 11.17.6.5,
727
- * “CSRRequest Command”). The CSRRequest command will cause the generation of a new operational key pair at the
728
- * Commissionee.
729
- * 8: Commissioner SHALL generate or otherwise obtain an Operational Certificate containing Operational ID after
730
- * receiving the CSRResponse command from the Commissionee (see Section 11.17.6.5, “CSRRequest Command”), using
731
- * implementation-specific means.
732
- * 9: Commissioner SHALL install operational credentials (see Figure 40, “Node Operational Credentials
733
- * flow”) on the Commissionee using the AddTrustedRootCertificate and AddNOC commands,
734
- * and SHALL use the UpdateFabricLabel command to set a string that the user can recognize and
735
- * relate to this Commissioner/Administrator.
736
- * The AdminVendorId field of the AddNOC command SHALL be set to a value for which the Vendor Schema in
737
- * DCL contains the name and other information of the Commissioner’s manufacturer.
727
+ * Step 11-13
728
+ * 11: Following the Device Attestation Procedure yielding a decision to proceed with commissioning, the Commissioner
729
+ * SHALL request operational CSR from Commissionee using the CSRRequest command (see Section 11.17.6.5,
730
+ * “CSRRequest Command”). The CSRRequest command will cause the generation of a new operational key pair at the
731
+ * Commissionee.
732
+ * 12: Commissioner SHALL generate or otherwise obtain an Operational Certificate containing Operational ID after
733
+ * receiving the CSRResponse command from the Commissionee (see Section 11.17.6.5, “CSRRequest Command”), using
734
+ * implementation-specific means.
735
+ * 13: Commissioner SHALL install operational credentials (see Figure 40, “Node Operational Credentials
736
+ * flow”) on the Commissionee using the AddTrustedRootCertificate and AddNOC commands,
737
+ * and SHALL use the UpdateFabricLabel command to set a string that the user can recognize and
738
+ * relate to this Commissioner/Administrator.
739
+ * The AdminVendorId field of the AddNOC command SHALL be set to a value for which the Vendor Schema in
740
+ * DCL contains the name and other information of the Commissioner’s manufacturer.
738
741
  */
739
742
  async #certificates() {
740
743
  const operationalCredentialsClusterClient = this.#getClusterClient(OperationalCredentials.Cluster);
@@ -786,7 +789,7 @@ export class ControllerCommissioningFlow {
786
789
  }
787
790
 
788
791
  /**
789
- * Step 9 - 2
792
+ * Step 13-2 (we do as 99 at the end because)
790
793
  * The Administrator having established a CASE session with the Commissionee over the operational network in the
791
794
  * previous steps SHALL invoke the CommissioningComplete command (see Section 11.9.6.6,
792
795
  * “CommissioningComplete Command”). A success response after invocation of the CommissioningComplete command ends
@@ -822,7 +825,7 @@ export class ControllerCommissioningFlow {
822
825
  }
823
826
 
824
827
  /**
825
- * Step 11
828
+ * Step 15
826
829
  * Commissioner MAY configure the Access Control List (see Access Control Cluster) on the Commissionee in any way
827
830
  * it sees fit, if the singular entry added by the AddNOC command in the previous step granting Administer
828
831
  * privilege over CASE authentication type for the Node ID provided with the command is not sufficient to express
@@ -838,16 +841,17 @@ export class ControllerCommissioningFlow {
838
841
  }
839
842
 
840
843
  /**
841
- * Step 12-13
842
- * 12: If the Commissionee both supports it and requires it, the Commissioner SHALL configure the operational network
843
- * at the Commissionee using commands such as AddOrUpdateWiFiNetwork (see Section 11.8.7.3, “AddOrUpdateWiFiNetwork
844
- * Command”) and AddOrUpdateThreadNetwork (see Section 11.8.7.4, “AddOrUpdateThreadNetwork Command”).
845
- * A Commissionee requires network commissioning if it is not already on the desired operational network.
846
- * A Commissionee supports network commissioning if it has any NetworkCommissioning cluster instances.
847
- * A Commissioner MAY learn about the networks visible to the Commissionee using ScanNetworks command
848
- * (see Section 11.8.7.1, “ScanNetworks Command”).
849
- * 13: The Commissioner SHALL trigger the Commissionee to connect to the operational network using ConnectNetwork
850
- * command (see Section 11.8.7.9, “ConnectNetwork Command”) unless the Commissionee is already on the desired operational network.
844
+ * Step 16-17
845
+ * 16: If the Commissionee both supports it and requires it, the Commissioner SHALL configure the operational network
846
+ * at the Commissionee using commands such as AddOrUpdateWiFiNetwork (see Section 11.8.7.3, “AddOrUpdateWiFiNetwork
847
+ * Command”) and AddOrUpdateThreadNetwork (see Section 11.8.7.4, “AddOrUpdateThreadNetwork Command”).
848
+ * A Commissionee requires network commissioning if it is not already on the desired operational network.
849
+ * A Commissionee supports network commissioning if it has any NetworkCommissioning cluster instances.
850
+ * A Commissioner MAY learn about the networks visible to the Commissionee using ScanNetworks command
851
+ * (see Section 11.8.7.1, “ScanNetworks Command”).
852
+ * 17: The Commissioner SHALL trigger the Commissionee to connect to the operational network using ConnectNetwork
853
+ * command (see Section 11.8.7.9, “ConnectNetwork Command”) unless the Commissionee is already on the desired
854
+ * operational network.
851
855
  */
852
856
  async #validateNetwork() {
853
857
  if (
@@ -1158,13 +1162,12 @@ export class ControllerCommissioningFlow {
1158
1162
  }
1159
1163
 
1160
1164
  /**
1161
- * Step 14-15
1162
- * 14: Finalization of the Commissioning process begins. An Administrator configured in the ACL of the Commissionee
1163
- * by the Commissioner SHALL use Operational Discovery to discover the Commissionee. This Administrator MAY be
1164
- * the Commissioner itself, or another Node to which the Commissioner has delegated the task.
1165
- * 15: The Administrator SHALL open a CASE (see Section 4.13.2, “Certificate Authenticated Session Establishment
1166
- * (CASE)”) session with the Commissionee over the operational network.
1167
- *
1165
+ * Step 18-19
1166
+ * 18: Finalization of the Commissioning process begins. An Administrator configured in the ACL of the Commissionee
1167
+ * by the Commissioner SHALL use Operational Discovery to discover the Commissionee. This Administrator MAY be
1168
+ * the Commissioner itself, or another Node to which the Commissioner has delegated the task.
1169
+ * 19: The Administrator SHALL open a CASE (see Section 4.13.2, “Certificate Authenticated Session Establishment
1170
+ * (CASE)”) session with the Commissionee over the operational network.
1168
1171
  */
1169
1172
  async #reconnectWithDevice() {
1170
1173
  const isConcurrentFlow = this.#collectedCommissioningData.supportsConcurrentConnection !== false;
@@ -1226,7 +1229,7 @@ export class ControllerCommissioningFlow {
1226
1229
  }
1227
1230
 
1228
1231
  /**
1229
- * Step 16
1232
+ * Step 20
1230
1233
  * The Administrator having established a CASE session with the Commissionee over the operational network in the
1231
1234
  * previous steps SHALL invoke the CommissioningComplete command (see Section 11.9.6.6,
1232
1235
  * “CommissioningComplete Command”). A success response after invocation of the CommissioningComplete command ends
@@ -5,8 +5,9 @@
5
5
  */
6
6
 
7
7
  import { AsyncObservable, Time } from "#general";
8
- import { NodeId } from "#types";
8
+ import { NodeId, TypeFromPartialBitSchema } from "#types";
9
9
  import { DecodedMessage, DecodedPacket, Message, Packet } from "../codec/MessageCodec.js";
10
+ import { SupportedTransportsBitmap } from "../common/Scanner.js";
10
11
  import { Fabric } from "../fabric/Fabric.js";
11
12
  import { MessageCounter } from "../protocol/MessageCounter.js";
12
13
  import { MessageReceptionState } from "../protocol/MessageReceptionState.js";
@@ -45,14 +46,52 @@ export const FALLBACK_SPECIFICATION_VERSION = 0;
45
46
  */
46
47
  export const FALLBACK_MAX_PATHS_PER_INVOKE = 1;
47
48
 
49
+ export const FALLBACK_MAX_TCP_MESSAGE_SIZE = 64000;
50
+
48
51
  export interface SessionParameters {
52
+ /**
53
+ * Minimum amount of time between sender retries when the destination node is Idle.
54
+ * This SHALL be greater than or equal to the maximum amount of time a node may be
55
+ * non-responsive to incoming messages when Idle.
56
+ * Default: 500ms
57
+ */
49
58
  idleIntervalMs: number;
59
+
60
+ /**
61
+ * Minimum amount of time between sender retries when the destination node is Active.
62
+ * This SHALL be greater than or equal to the maximum amount of time a node may be
63
+ * non-responsive to incoming messages when Active.
64
+ * Default: 300ms
65
+ */
50
66
  activeIntervalMs: number;
67
+
68
+ /**
69
+ * Minimum amount of time the node SHOULD stay active after network activity.
70
+ * Default: 4000ms
71
+ */
51
72
  activeThresholdMs: number;
73
+
74
+ /** Version of Data Model for the Session parameters side where it appears. */
52
75
  dataModelRevision: number;
76
+
77
+ /** Version of Interaction Model for the Session parameters side where it appears. */
53
78
  interactionModelRevision: number;
79
+
80
+ /** Version of Specification for the Session parameters side where it appears. */
54
81
  specificationVersion: number;
82
+
83
+ /** The maximum number of elements in the InvokeRequests list that the Node is able to process. */
55
84
  maxPathsPerInvoke: number;
85
+
86
+ /** A bitmap of the supported transport protocols in addition to MRP. */
87
+ supportedTransports: TypeFromPartialBitSchema<typeof SupportedTransportsBitmap>;
88
+
89
+ /**
90
+ * Maximum size of the message carried over TCP, excluding the framing message length
91
+ * field, that the node is capable of receiving from its peer.
92
+ * Default: 64000 bytes
93
+ */
94
+ maxTcpMessageSize: number; // matter message and protocol overhead and such
56
95
  }
57
96
 
58
97
  export type SessionParameterOptions = Partial<SessionParameters>;
@@ -73,6 +112,8 @@ export abstract class Session {
73
112
  protected readonly maxPathsPerInvoke: number;
74
113
  protected readonly messageCounter: MessageCounter;
75
114
  protected readonly messageReceptionState: MessageReceptionState;
115
+ protected readonly supportedTransports: TypeFromPartialBitSchema<typeof SupportedTransportsBitmap>;
116
+ protected readonly maxTcpMessageSize: number;
76
117
 
77
118
  /**
78
119
  * If the ExchangeManager performs async work to clean up a session it sets this promise. This is because
@@ -101,6 +142,8 @@ export abstract class Session {
101
142
  interactionModelRevision = FALLBACK_INTERACTIONMODEL_REVISION,
102
143
  specificationVersion = FALLBACK_SPECIFICATION_VERSION,
103
144
  maxPathsPerInvoke = FALLBACK_MAX_PATHS_PER_INVOKE,
145
+ supportedTransports = {}, // no TCP support by default
146
+ maxTcpMessageSize = FALLBACK_MAX_TCP_MESSAGE_SIZE,
104
147
  } = {},
105
148
  setActiveTimestamp,
106
149
  } = args;
@@ -114,6 +157,8 @@ export abstract class Session {
114
157
  this.interactionModelRevision = interactionModelRevision;
115
158
  this.specificationVersion = specificationVersion;
116
159
  this.maxPathsPerInvoke = maxPathsPerInvoke;
160
+ this.supportedTransports = supportedTransports;
161
+ this.maxTcpMessageSize = maxTcpMessageSize;
117
162
  if (setActiveTimestamp) {
118
163
  this.activeTimestamp = this.timestamp;
119
164
  }
@@ -155,6 +200,8 @@ export abstract class Session {
155
200
  interactionModelRevision,
156
201
  specificationVersion,
157
202
  maxPathsPerInvoke,
203
+ supportedTransports,
204
+ maxTcpMessageSize,
158
205
  } = this;
159
206
  return {
160
207
  idleIntervalMs,
@@ -164,6 +211,8 @@ export abstract class Session {
164
211
  interactionModelRevision,
165
212
  specificationVersion,
166
213
  maxPathsPerInvoke,
214
+ supportedTransports,
215
+ maxTcpMessageSize,
167
216
  };
168
217
  }
169
218
 
@@ -26,6 +26,7 @@ import { Subscription } from "#interaction/Subscription.js";
26
26
  import { Specification } from "#model";
27
27
  import { PeerAddress, PeerAddressMap } from "#peer/PeerAddress.js";
28
28
  import { CaseAuthenticatedTag, DEFAULT_MAX_PATHS_PER_INVOKE, FabricId, FabricIndex, NodeId } from "#types";
29
+ import { SupportedTransportsSchema } from "../common/Scanner.js";
29
30
  import { Fabric } from "../fabric/Fabric.js";
30
31
  import { MessageCounter } from "../protocol/MessageCounter.js";
31
32
  import { InsecureSession } from "./InsecureSession.js";
@@ -34,6 +35,7 @@ import {
34
35
  FALLBACK_DATAMODEL_REVISION,
35
36
  FALLBACK_INTERACTIONMODEL_REVISION,
36
37
  FALLBACK_MAX_PATHS_PER_INVOKE,
38
+ FALLBACK_MAX_TCP_MESSAGE_SIZE,
37
39
  FALLBACK_SPECIFICATION_VERSION,
38
40
  Session,
39
41
  SESSION_ACTIVE_INTERVAL_MS,
@@ -53,6 +55,8 @@ const DEFAULT_SESSION_PARAMETERS = {
53
55
  interactionModelRevision: Specification.INTERACTION_MODEL_REVISION,
54
56
  specificationVersion: Specification.SPECIFICATION_VERSION,
55
57
  maxPathsPerInvoke: DEFAULT_MAX_PATHS_PER_INVOKE,
58
+ supportedTransports: {},
59
+ maxTcpMessageSize: FALLBACK_MAX_TCP_MESSAGE_SIZE,
56
60
  };
57
61
 
58
62
  export const UNICAST_UNSECURE_SESSION_ID = 0x0000;
@@ -80,6 +84,8 @@ type ResumptionStorageRecord = {
80
84
  interactionModelRevision: number;
81
85
  specificationVersion: number;
82
86
  maxPathsPerInvoke: number;
87
+ supportedTransports?: number;
88
+ maxTcpMessageSize?: number;
83
89
  };
84
90
  caseAuthenticatedTags?: CaseAuthenticatedTag[];
85
91
  };
@@ -115,7 +121,7 @@ export class SessionManager {
115
121
  #resumptionRecords = new PeerAddressMap<ResumptionRecord>();
116
122
  readonly #globalUnencryptedMessageCounter = new MessageCounter();
117
123
  readonly #subscriptionsChanged = Observable<[session: SecureSession, subscription: Subscription]>();
118
- #sessionParameters;
124
+ #sessionParameters: SessionParameters;
119
125
  readonly #resubmissionStarted = Observable<[session: Session]>();
120
126
  readonly #construction: Construction<SessionManager>;
121
127
  readonly #observers = new ObserverGroup();
@@ -443,7 +449,12 @@ export class SessionManager {
443
449
  resumptionId,
444
450
  fabricId: fabric.fabricId,
445
451
  peerNodeId: peerNodeId,
446
- sessionParameters,
452
+ sessionParameters: {
453
+ ...sessionParameters,
454
+ supportedTransports: sessionParameters.supportedTransports
455
+ ? SupportedTransportsSchema.encode(sessionParameters.supportedTransports)
456
+ : undefined,
457
+ },
447
458
  caseAuthenticatedTags,
448
459
  }) as ResumptionStorageRecord,
449
460
  ),
@@ -473,6 +484,8 @@ export class SessionManager {
473
484
  interactionModelRevision,
474
485
  specificationVersion,
475
486
  maxPathsPerInvoke,
487
+ supportedTransports,
488
+ maxTcpMessageSize,
476
489
  } = {},
477
490
  caseAuthenticatedTags,
478
491
  }) => {
@@ -503,6 +516,11 @@ export class SessionManager {
503
516
  interactionModelRevision: interactionModelRevision ?? FALLBACK_INTERACTIONMODEL_REVISION,
504
517
  specificationVersion: specificationVersion ?? FALLBACK_SPECIFICATION_VERSION,
505
518
  maxPathsPerInvoke: maxPathsPerInvoke ?? FALLBACK_MAX_PATHS_PER_INVOKE,
519
+ supportedTransports:
520
+ supportedTransports !== undefined
521
+ ? SupportedTransportsSchema.decode(supportedTransports)
522
+ : {},
523
+ maxTcpMessageSize: maxTcpMessageSize ?? FALLBACK_MAX_TCP_MESSAGE_SIZE,
506
524
  },
507
525
  caseAuthenticatedTags,
508
526
  });