@matter/protocol 0.15.0-alpha.0-20250616-4b3754906 → 0.15.0-alpha.0-20250619-df2264f15

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 (207) hide show
  1. package/dist/cjs/certificate/AttestationCertificateManager.d.ts.map +1 -1
  2. package/dist/cjs/certificate/AttestationCertificateManager.js +26 -22
  3. package/dist/cjs/certificate/AttestationCertificateManager.js.map +1 -1
  4. package/dist/cjs/certificate/CertificateAuthority.d.ts +1 -2
  5. package/dist/cjs/certificate/CertificateAuthority.d.ts.map +1 -1
  6. package/dist/cjs/certificate/CertificateAuthority.js +22 -29
  7. package/dist/cjs/certificate/CertificateAuthority.js.map +1 -1
  8. package/dist/cjs/certificate/DeviceCertification.d.ts.map +1 -1
  9. package/dist/cjs/certificate/DeviceCertification.js +2 -6
  10. package/dist/cjs/certificate/DeviceCertification.js.map +1 -1
  11. package/dist/cjs/certificate/index.d.ts +7 -2
  12. package/dist/cjs/certificate/index.d.ts.map +1 -1
  13. package/dist/cjs/certificate/index.js +14 -2
  14. package/dist/cjs/certificate/index.js.map +1 -1
  15. package/dist/cjs/certificate/kinds/AttestationCertificates.d.ts +34 -0
  16. package/dist/cjs/certificate/kinds/AttestationCertificates.d.ts.map +1 -0
  17. package/dist/cjs/certificate/kinds/AttestationCertificates.js +64 -0
  18. package/dist/cjs/certificate/kinds/AttestationCertificates.js.map +6 -0
  19. package/dist/cjs/certificate/kinds/CertificationDeclaration.d.ts +23 -0
  20. package/dist/cjs/certificate/kinds/CertificationDeclaration.d.ts.map +1 -0
  21. package/dist/cjs/certificate/kinds/CertificationDeclaration.js +86 -0
  22. package/dist/cjs/certificate/kinds/CertificationDeclaration.js.map +6 -0
  23. package/dist/cjs/certificate/kinds/Icac.d.ts +29 -0
  24. package/dist/cjs/certificate/kinds/Icac.d.ts.map +1 -0
  25. package/dist/cjs/certificate/kinds/Icac.js +138 -0
  26. package/dist/cjs/certificate/kinds/Icac.js.map +6 -0
  27. package/dist/cjs/certificate/kinds/Noc.d.ts +27 -0
  28. package/dist/cjs/certificate/kinds/Noc.d.ts.map +1 -0
  29. package/dist/cjs/certificate/kinds/Noc.js +148 -0
  30. package/dist/cjs/certificate/kinds/Noc.js.map +6 -0
  31. package/dist/cjs/certificate/kinds/OperationalBase.d.ts +24 -0
  32. package/dist/cjs/certificate/kinds/OperationalBase.d.ts.map +1 -0
  33. package/dist/cjs/certificate/kinds/OperationalBase.js +68 -0
  34. package/dist/cjs/certificate/kinds/OperationalBase.js.map +6 -0
  35. package/dist/cjs/certificate/kinds/Rcac.d.ts +25 -0
  36. package/dist/cjs/certificate/kinds/Rcac.d.ts.map +1 -0
  37. package/dist/cjs/certificate/kinds/Rcac.js +119 -0
  38. package/dist/cjs/certificate/kinds/Rcac.js.map +6 -0
  39. package/dist/cjs/certificate/kinds/X509Base.d.ts +92 -0
  40. package/dist/cjs/certificate/kinds/X509Base.d.ts.map +1 -0
  41. package/dist/cjs/certificate/kinds/X509Base.js +344 -0
  42. package/dist/cjs/certificate/kinds/X509Base.js.map +6 -0
  43. package/dist/cjs/certificate/kinds/common.d.ts +18 -0
  44. package/dist/cjs/certificate/kinds/common.d.ts.map +1 -0
  45. package/dist/cjs/certificate/kinds/common.js +42 -0
  46. package/dist/cjs/certificate/kinds/common.js.map +6 -0
  47. package/dist/cjs/certificate/kinds/definitions/asn.d.ts +25 -0
  48. package/dist/cjs/certificate/kinds/definitions/asn.d.ts.map +1 -0
  49. package/dist/cjs/certificate/kinds/definitions/asn.js +83 -0
  50. package/dist/cjs/certificate/kinds/definitions/asn.js.map +6 -0
  51. package/dist/cjs/certificate/kinds/definitions/attestation.d.ts +44 -0
  52. package/dist/cjs/certificate/kinds/definitions/attestation.d.ts.map +1 -0
  53. package/dist/cjs/certificate/kinds/definitions/attestation.js +22 -0
  54. package/dist/cjs/certificate/kinds/definitions/attestation.js.map +6 -0
  55. package/dist/cjs/certificate/kinds/definitions/base.d.ts +52 -0
  56. package/dist/cjs/certificate/kinds/definitions/base.d.ts.map +1 -0
  57. package/dist/cjs/certificate/kinds/definitions/base.js +43 -0
  58. package/dist/cjs/certificate/kinds/definitions/base.js.map +6 -0
  59. package/dist/cjs/certificate/kinds/definitions/certification-declaration.d.ts +18 -0
  60. package/dist/cjs/certificate/kinds/definitions/certification-declaration.d.ts.map +1 -0
  61. package/dist/cjs/certificate/kinds/definitions/certification-declaration.js +50 -0
  62. package/dist/cjs/certificate/kinds/definitions/certification-declaration.js.map +6 -0
  63. package/dist/cjs/certificate/kinds/definitions/operational.d.ts +368 -0
  64. package/dist/cjs/certificate/kinds/definitions/operational.d.ts.map +1 -0
  65. package/dist/cjs/certificate/kinds/definitions/operational.js +149 -0
  66. package/dist/cjs/certificate/kinds/definitions/operational.js.map +6 -0
  67. package/dist/cjs/certificate/kinds/index.d.ts +12 -0
  68. package/dist/cjs/certificate/kinds/index.d.ts.map +1 -0
  69. package/dist/cjs/certificate/kinds/index.js +29 -0
  70. package/dist/cjs/certificate/kinds/index.js.map +6 -0
  71. package/dist/cjs/fabric/Fabric.d.ts +1 -2
  72. package/dist/cjs/fabric/Fabric.d.ts.map +1 -1
  73. package/dist/cjs/fabric/Fabric.js +28 -31
  74. package/dist/cjs/fabric/Fabric.js.map +1 -1
  75. package/dist/cjs/peer/ControllerCommissioningFlow.d.ts.map +1 -1
  76. package/dist/cjs/peer/ControllerCommissioningFlow.js +2 -1
  77. package/dist/cjs/peer/ControllerCommissioningFlow.js.map +1 -1
  78. package/dist/cjs/session/case/CaseClient.d.ts.map +1 -1
  79. package/dist/cjs/session/case/CaseClient.js +3 -3
  80. package/dist/cjs/session/case/CaseClient.js.map +1 -1
  81. package/dist/cjs/session/case/CaseServer.d.ts.map +1 -1
  82. package/dist/cjs/session/case/CaseServer.js +2 -2
  83. package/dist/cjs/session/case/CaseServer.js.map +1 -1
  84. package/dist/esm/certificate/AttestationCertificateManager.d.ts.map +1 -1
  85. package/dist/esm/certificate/AttestationCertificateManager.js +20 -16
  86. package/dist/esm/certificate/AttestationCertificateManager.js.map +1 -1
  87. package/dist/esm/certificate/CertificateAuthority.d.ts +1 -2
  88. package/dist/esm/certificate/CertificateAuthority.d.ts.map +1 -1
  89. package/dist/esm/certificate/CertificateAuthority.js +18 -30
  90. package/dist/esm/certificate/CertificateAuthority.js.map +1 -1
  91. package/dist/esm/certificate/DeviceCertification.d.ts.map +1 -1
  92. package/dist/esm/certificate/DeviceCertification.js +2 -6
  93. package/dist/esm/certificate/DeviceCertification.js.map +1 -1
  94. package/dist/esm/certificate/index.d.ts +7 -2
  95. package/dist/esm/certificate/index.d.ts.map +1 -1
  96. package/dist/esm/certificate/index.js +10 -2
  97. package/dist/esm/certificate/index.js.map +1 -1
  98. package/dist/esm/certificate/kinds/AttestationCertificates.d.ts +34 -0
  99. package/dist/esm/certificate/kinds/AttestationCertificates.d.ts.map +1 -0
  100. package/dist/esm/certificate/kinds/AttestationCertificates.js +44 -0
  101. package/dist/esm/certificate/kinds/AttestationCertificates.js.map +6 -0
  102. package/dist/esm/certificate/kinds/CertificationDeclaration.d.ts +23 -0
  103. package/dist/esm/certificate/kinds/CertificationDeclaration.d.ts.map +1 -0
  104. package/dist/esm/certificate/kinds/CertificationDeclaration.js +66 -0
  105. package/dist/esm/certificate/kinds/CertificationDeclaration.js.map +6 -0
  106. package/dist/esm/certificate/kinds/Icac.d.ts +29 -0
  107. package/dist/esm/certificate/kinds/Icac.d.ts.map +1 -0
  108. package/dist/esm/certificate/kinds/Icac.js +118 -0
  109. package/dist/esm/certificate/kinds/Icac.js.map +6 -0
  110. package/dist/esm/certificate/kinds/Noc.d.ts +27 -0
  111. package/dist/esm/certificate/kinds/Noc.d.ts.map +1 -0
  112. package/dist/esm/certificate/kinds/Noc.js +128 -0
  113. package/dist/esm/certificate/kinds/Noc.js.map +6 -0
  114. package/dist/esm/certificate/kinds/OperationalBase.d.ts +24 -0
  115. package/dist/esm/certificate/kinds/OperationalBase.d.ts.map +1 -0
  116. package/dist/esm/certificate/kinds/OperationalBase.js +48 -0
  117. package/dist/esm/certificate/kinds/OperationalBase.js.map +6 -0
  118. package/dist/esm/certificate/kinds/Rcac.d.ts +25 -0
  119. package/dist/esm/certificate/kinds/Rcac.d.ts.map +1 -0
  120. package/dist/esm/certificate/kinds/Rcac.js +99 -0
  121. package/dist/esm/certificate/kinds/Rcac.js.map +6 -0
  122. package/dist/esm/certificate/kinds/X509Base.d.ts +92 -0
  123. package/dist/esm/certificate/kinds/X509Base.d.ts.map +1 -0
  124. package/dist/esm/certificate/kinds/X509Base.js +347 -0
  125. package/dist/esm/certificate/kinds/X509Base.js.map +6 -0
  126. package/dist/esm/certificate/kinds/common.d.ts +18 -0
  127. package/dist/esm/certificate/kinds/common.d.ts.map +1 -0
  128. package/dist/esm/certificate/kinds/common.js +22 -0
  129. package/dist/esm/certificate/kinds/common.js.map +6 -0
  130. package/dist/esm/certificate/kinds/definitions/asn.d.ts +25 -0
  131. package/dist/esm/certificate/kinds/definitions/asn.d.ts.map +1 -0
  132. package/dist/esm/certificate/kinds/definitions/asn.js +63 -0
  133. package/dist/esm/certificate/kinds/definitions/asn.js.map +6 -0
  134. package/dist/esm/certificate/kinds/definitions/attestation.d.ts +44 -0
  135. package/dist/esm/certificate/kinds/definitions/attestation.d.ts.map +1 -0
  136. package/dist/esm/certificate/kinds/definitions/attestation.js +6 -0
  137. package/dist/esm/certificate/kinds/definitions/attestation.js.map +6 -0
  138. package/dist/esm/certificate/kinds/definitions/base.d.ts +52 -0
  139. package/dist/esm/certificate/kinds/definitions/base.d.ts.map +1 -0
  140. package/dist/esm/certificate/kinds/definitions/base.js +23 -0
  141. package/dist/esm/certificate/kinds/definitions/base.js.map +6 -0
  142. package/dist/esm/certificate/kinds/definitions/certification-declaration.d.ts +18 -0
  143. package/dist/esm/certificate/kinds/definitions/certification-declaration.d.ts.map +1 -0
  144. package/dist/esm/certificate/kinds/definitions/certification-declaration.js +41 -0
  145. package/dist/esm/certificate/kinds/definitions/certification-declaration.js.map +6 -0
  146. package/dist/esm/certificate/kinds/definitions/operational.d.ts +368 -0
  147. package/dist/esm/certificate/kinds/definitions/operational.d.ts.map +1 -0
  148. package/dist/esm/certificate/kinds/definitions/operational.js +148 -0
  149. package/dist/esm/certificate/kinds/definitions/operational.js.map +6 -0
  150. package/dist/esm/certificate/kinds/index.d.ts +12 -0
  151. package/dist/esm/certificate/kinds/index.d.ts.map +1 -0
  152. package/dist/esm/certificate/kinds/index.js +12 -0
  153. package/dist/esm/certificate/kinds/index.js.map +6 -0
  154. package/dist/esm/fabric/Fabric.d.ts +1 -2
  155. package/dist/esm/fabric/Fabric.d.ts.map +1 -1
  156. package/dist/esm/fabric/Fabric.js +28 -36
  157. package/dist/esm/fabric/Fabric.js.map +1 -1
  158. package/dist/esm/peer/ControllerCommissioningFlow.d.ts.map +1 -1
  159. package/dist/esm/peer/ControllerCommissioningFlow.js +2 -1
  160. package/dist/esm/peer/ControllerCommissioningFlow.js.map +1 -1
  161. package/dist/esm/session/case/CaseClient.d.ts.map +1 -1
  162. package/dist/esm/session/case/CaseClient.js +3 -3
  163. package/dist/esm/session/case/CaseClient.js.map +1 -1
  164. package/dist/esm/session/case/CaseServer.d.ts.map +1 -1
  165. package/dist/esm/session/case/CaseServer.js +2 -2
  166. package/dist/esm/session/case/CaseServer.js.map +1 -1
  167. package/package.json +6 -6
  168. package/src/certificate/AttestationCertificateManager.ts +20 -16
  169. package/src/certificate/CertificateAuthority.ts +18 -35
  170. package/src/certificate/DeviceCertification.ts +2 -6
  171. package/src/certificate/index.ts +7 -2
  172. package/src/certificate/kinds/AttestationCertificates.ts +48 -0
  173. package/src/certificate/kinds/CertificationDeclaration.ts +91 -0
  174. package/src/certificate/kinds/Icac.ts +156 -0
  175. package/src/certificate/kinds/Noc.ts +164 -0
  176. package/src/certificate/kinds/OperationalBase.ts +72 -0
  177. package/src/certificate/kinds/Rcac.ts +126 -0
  178. package/src/certificate/kinds/X509Base.ts +380 -0
  179. package/src/certificate/kinds/common.ts +24 -0
  180. package/src/certificate/kinds/definitions/asn.ts +97 -0
  181. package/src/certificate/kinds/definitions/attestation.ts +46 -0
  182. package/src/certificate/kinds/definitions/base.ts +43 -0
  183. package/src/certificate/kinds/definitions/certification-declaration.ts +38 -0
  184. package/src/certificate/kinds/definitions/operational.ts +179 -0
  185. package/src/certificate/kinds/index.ts +12 -0
  186. package/src/fabric/Fabric.ts +28 -40
  187. package/src/peer/ControllerCommissioningFlow.ts +2 -1
  188. package/src/session/case/CaseClient.ts +3 -3
  189. package/src/session/case/CaseServer.ts +2 -2
  190. package/dist/cjs/certificate/CertificateManager.d.ts +0 -578
  191. package/dist/cjs/certificate/CertificateManager.d.ts.map +0 -1
  192. package/dist/cjs/certificate/CertificateManager.js +0 -843
  193. package/dist/cjs/certificate/CertificateManager.js.map +0 -6
  194. package/dist/cjs/certificate/CertificationDeclarationManager.d.ts +0 -11
  195. package/dist/cjs/certificate/CertificationDeclarationManager.d.ts.map +0 -1
  196. package/dist/cjs/certificate/CertificationDeclarationManager.js +0 -54
  197. package/dist/cjs/certificate/CertificationDeclarationManager.js.map +0 -6
  198. package/dist/esm/certificate/CertificateManager.d.ts +0 -578
  199. package/dist/esm/certificate/CertificateManager.d.ts.map +0 -1
  200. package/dist/esm/certificate/CertificateManager.js +0 -870
  201. package/dist/esm/certificate/CertificateManager.js.map +0 -6
  202. package/dist/esm/certificate/CertificationDeclarationManager.d.ts +0 -11
  203. package/dist/esm/certificate/CertificationDeclarationManager.d.ts.map +0 -1
  204. package/dist/esm/certificate/CertificationDeclarationManager.js +0 -34
  205. package/dist/esm/certificate/CertificationDeclarationManager.js.map +0 -6
  206. package/src/certificate/CertificateManager.ts +0 -1176
  207. package/src/certificate/CertificationDeclarationManager.ts +0 -52
@@ -0,0 +1,179 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2022-2025 Matter.js Authors
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+ import {
7
+ TlvArray,
8
+ TlvBitmap,
9
+ TlvBoolean,
10
+ TlvByteString,
11
+ TlvCaseAuthenticatedTag,
12
+ TlvFabricId,
13
+ TlvField,
14
+ TlvNodeId,
15
+ TlvObject,
16
+ TlvObjectWithMaxSize,
17
+ TlvOptionalField,
18
+ TlvOptionalRepeatedField,
19
+ TlvString,
20
+ TlvTaggedList,
21
+ TlvUInt16,
22
+ TlvUInt32,
23
+ TlvUInt64,
24
+ TlvUInt8,
25
+ TypeFromSchema,
26
+ } from "#types";
27
+ import { ExtensionKeyUsageBitmap } from "./base.js";
28
+
29
+ /**
30
+ * Matter specific Certificate Sizes
31
+ * @see {@link MatterSpecification.v13.Core} 6.1.3.
32
+ */
33
+ export const MAX_TLV_CERTIFICATE_SIZE = 400;
34
+
35
+ export const TlvCertificateExtension = TlvTaggedList({
36
+ basicConstraints: TlvField(
37
+ 1,
38
+ TlvObject({
39
+ isCa: TlvField(1, TlvBoolean),
40
+ pathLen: TlvOptionalField(2, TlvUInt8),
41
+ }),
42
+ ),
43
+ keyUsage: TlvField(2, TlvBitmap(TlvUInt16, ExtensionKeyUsageBitmap)),
44
+ extendedKeyUsage: TlvOptionalField(3, TlvArray(TlvUInt8)),
45
+ subjectKeyIdentifier: TlvField(4, TlvByteString.bound({ length: 20 })),
46
+ authorityKeyIdentifier: TlvField(5, TlvByteString.bound({ length: 20 })),
47
+ futureExtension: TlvOptionalRepeatedField(6, TlvByteString),
48
+ });
49
+
50
+ export type CertificateExtension = TypeFromSchema<typeof TlvCertificateExtension>;
51
+
52
+ /** Definitions for Matter Operational Certificates (RCAC, ICAC, NOC) */
53
+ export namespace OperationalCertificate {
54
+ /** All defined Matter fields for subject and issuer that we always allow optionally to be encoded */
55
+ const AllowedSubjectAndIssuerMatterFields = {
56
+ nodeId: TlvOptionalField(17, TlvNodeId),
57
+ firmwareSigningId: TlvOptionalField(18, TlvUInt32),
58
+ icacId: TlvOptionalField(19, TlvUInt64),
59
+ rcacId: TlvOptionalField(20, TlvUInt64),
60
+ fabricId: TlvOptionalField(21, TlvFabricId),
61
+ caseAuthenticatedTags: TlvOptionalRepeatedField(22, TlvCaseAuthenticatedTag, { maxLength: 3 }),
62
+ };
63
+
64
+ /**
65
+ * TLV schema for a generic subject or issuer field in a certificate. We handle all fields as optional here for the TLV
66
+ * parsing and check required fields in the logic to make sure we return the correct errors.
67
+ */
68
+ const TlvGenericMatterSubjectOrIssuerTaggedList = <T>(matterFields: T) => {
69
+ const fields = {
70
+ // Standard DNs
71
+ commonName: TlvOptionalField(1, TlvString),
72
+ sureName: TlvOptionalField(2, TlvString),
73
+ serialNum: TlvOptionalField(3, TlvString),
74
+ countryName: TlvOptionalField(4, TlvString),
75
+ localityName: TlvOptionalField(5, TlvString),
76
+ stateOrProvinceName: TlvOptionalField(6, TlvString),
77
+ orgName: TlvOptionalField(7, TlvString),
78
+ orgUnitName: TlvOptionalField(8, TlvString),
79
+ title: TlvOptionalField(9, TlvString),
80
+ name: TlvOptionalField(10, TlvString),
81
+ givenName: TlvOptionalField(11, TlvString),
82
+ initials: TlvOptionalField(12, TlvString),
83
+ genQualifier: TlvOptionalField(13, TlvString),
84
+ dnQualifier: TlvOptionalField(14, TlvString),
85
+ pseudonym: TlvOptionalField(15, TlvString),
86
+ domainComponent: TlvOptionalField(16, TlvString),
87
+
88
+ // Matter specific DNs
89
+ ...matterFields,
90
+
91
+ // Standard DNs when encoded as Printable String
92
+ commonNamePs: TlvOptionalField(129, TlvString),
93
+ sureNamePs: TlvOptionalField(130, TlvString),
94
+ serialNumPs: TlvOptionalField(131, TlvString),
95
+ countryNamePs: TlvOptionalField(132, TlvString),
96
+ localityNamePs: TlvOptionalField(133, TlvString),
97
+ stateOrProvinceNamePs: TlvOptionalField(134, TlvString),
98
+ orgNamePs: TlvOptionalField(135, TlvString),
99
+ orgUnitNamePs: TlvOptionalField(136, TlvString),
100
+ titlePs: TlvOptionalField(137, TlvString),
101
+ namePs: TlvOptionalField(138, TlvString),
102
+ givenNamePs: TlvOptionalField(139, TlvString),
103
+ initialsPs: TlvOptionalField(140, TlvString),
104
+ genQualifierPs: TlvOptionalField(141, TlvString),
105
+ dnQualifierPs: TlvOptionalField(142, TlvString),
106
+ pseudonymPs: TlvOptionalField(143, TlvString),
107
+ };
108
+ return TlvTaggedList(fields);
109
+ };
110
+
111
+ /**
112
+ * This generator enhances the generic Matter Certificate definition by allowing to override the subject and issuer
113
+ * fields. The overriding serves two needs:
114
+ * 1. to make some fields mandatory for the Tlv parsing and definition for the typescript types
115
+ * 2. have typing guidance when generating certificates ourself in code
116
+ *
117
+ * On Tlv definition level also all not specified allowed Matter Fields are optionally allowed and are decoded,
118
+ * re-encoded into Tlv and also encoded into ASN if the certificate is converted. Just the typing system do not know
119
+ * about them.
120
+ */
121
+ const BaseMatterCertificate = <S, I>(matterFields?: { subject?: S; issuer?: I }) =>
122
+ TlvObjectWithMaxSize(
123
+ {
124
+ serialNumber: TlvField(1, TlvByteString.bound({ maxLength: 20 })),
125
+ signatureAlgorithm: TlvField(2, TlvUInt8),
126
+ issuer: TlvField(
127
+ 3,
128
+ TlvGenericMatterSubjectOrIssuerTaggedList<I>({
129
+ ...AllowedSubjectAndIssuerMatterFields,
130
+ ...(matterFields?.issuer ?? {}),
131
+ } as I),
132
+ ),
133
+ notBefore: TlvField(4, TlvUInt32),
134
+ notAfter: TlvField(5, TlvUInt32),
135
+ subject: TlvField(
136
+ 6,
137
+ TlvGenericMatterSubjectOrIssuerTaggedList<S>({
138
+ ...AllowedSubjectAndIssuerMatterFields,
139
+ ...(matterFields?.subject ?? {}),
140
+ } as S),
141
+ ),
142
+ publicKeyAlgorithm: TlvField(7, TlvUInt8),
143
+ ellipticCurveIdentifier: TlvField(8, TlvUInt8),
144
+ ellipticCurvePublicKey: TlvField(9, TlvByteString),
145
+ extensions: TlvField(10, TlvCertificateExtension),
146
+ signature: TlvField(11, TlvByteString),
147
+ },
148
+ MAX_TLV_CERTIFICATE_SIZE,
149
+ );
150
+
151
+ export const TlvRcac = BaseMatterCertificate({
152
+ subject: {
153
+ rcacId: TlvField(20, TlvUInt64),
154
+ fabricId: TlvOptionalField(21, TlvFabricId),
155
+ },
156
+ issuer: AllowedSubjectAndIssuerMatterFields,
157
+ });
158
+
159
+ export const TlvNoc = BaseMatterCertificate({
160
+ subject: {
161
+ nodeId: TlvField(17, TlvNodeId),
162
+ fabricId: TlvField(21, TlvFabricId),
163
+ caseAuthenticatedTags: TlvOptionalRepeatedField(22, TlvCaseAuthenticatedTag, { maxLength: 3 }),
164
+ },
165
+ issuer: AllowedSubjectAndIssuerMatterFields,
166
+ });
167
+
168
+ export const TlvIcac = BaseMatterCertificate({
169
+ subject: {
170
+ icacId: TlvField(19, TlvUInt64),
171
+ fabricId: TlvOptionalField(21, TlvFabricId),
172
+ },
173
+ issuer: AllowedSubjectAndIssuerMatterFields,
174
+ });
175
+
176
+ export type Rcac = TypeFromSchema<typeof TlvRcac>;
177
+ export type Icac = TypeFromSchema<typeof TlvIcac>;
178
+ export type Noc = TypeFromSchema<typeof TlvNoc>;
179
+ }
@@ -0,0 +1,12 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2022-2025 Matter.js Authors
4
+ * SPDX-License-Identifier: Apache-2.0
5
+ */
6
+
7
+ export * from "./AttestationCertificates.js";
8
+ export * from "./CertificationDeclaration.js";
9
+ export * from "./Icac.js";
10
+ export * from "./Noc.js";
11
+ export * from "./Rcac.js";
12
+ export * from "./X509Base.js";
@@ -4,12 +4,7 @@
4
4
  * SPDX-License-Identifier: Apache-2.0
5
5
  */
6
6
 
7
- import {
8
- CertificateManager,
9
- TlvIntermediateCertificate,
10
- TlvOperationalCertificate,
11
- TlvRootCertificate,
12
- } from "#certificate/CertificateManager.js";
7
+ import { Icac, Noc, Rcac, X509Base } from "#certificate/index.js";
13
8
  import {
14
9
  BinaryKeyPair,
15
10
  Bytes,
@@ -49,7 +44,7 @@ export type ExposedFabricInformation = {
49
44
  };
50
45
 
51
46
  export class Fabric {
52
- readonly #certs: CertificateManager;
47
+ readonly #crypto: Crypto;
53
48
  readonly fabricIndex: FabricIndex;
54
49
  readonly fabricId: FabricId;
55
50
  readonly nodeId: NodeId;
@@ -71,11 +66,8 @@ export class Fabric {
71
66
  #persistCallback: ((isUpdate?: boolean) => MaybePromise<void>) | undefined;
72
67
  #storage?: StorageContext;
73
68
 
74
- constructor(certs: CertificateManager | Crypto, config: Fabric.Config) {
75
- if (!(certs instanceof CertificateManager)) {
76
- certs = new CertificateManager(certs);
77
- }
78
- this.#certs = certs;
69
+ constructor(crypto: Crypto, config: Fabric.Config) {
70
+ this.#crypto = crypto;
79
71
  this.fabricIndex = config.fabricIndex;
80
72
  this.fabricId = config.fabricId;
81
73
  this.nodeId = config.nodeId;
@@ -95,7 +87,7 @@ export class Fabric {
95
87
  }
96
88
 
97
89
  get crypto() {
98
- return this.#certs.crypto;
90
+ return this.#crypto;
99
91
  }
100
92
 
101
93
  get config(): Fabric.Config {
@@ -154,20 +146,19 @@ export class Fabric {
154
146
  }
155
147
 
156
148
  sign(data: Uint8Array) {
157
- return this.#certs.crypto.signEcdsa(this.#keyPair, data);
149
+ return this.crypto.signEcdsa(this.#keyPair, data);
158
150
  }
159
151
 
160
152
  async verifyCredentials(operationalCert: Uint8Array, intermediateCACert?: Uint8Array) {
161
- const rootCert = TlvRootCertificate.decode(this.rootCert);
162
- const nocCert = TlvOperationalCertificate.decode(operationalCert);
163
- const icaCert =
164
- intermediateCACert !== undefined ? TlvIntermediateCertificate.decode(intermediateCACert) : undefined;
153
+ const rootCert = Rcac.fromTlv(this.rootCert);
154
+ const nocCert = Noc.fromTlv(operationalCert);
155
+ const icaCert = intermediateCACert !== undefined ? Icac.fromTlv(intermediateCACert) : undefined;
165
156
  if (icaCert !== undefined) {
166
157
  // Validate ICACertificate against Root Certificate
167
- await this.#certs.verifyIntermediateCaCertificate(rootCert, icaCert);
158
+ await icaCert.verify(this.#crypto, rootCert);
168
159
  }
169
160
  // Validate NOC Certificate against ICA Certificate
170
- await this.#certs.verifyNodeOperationalCertificate(nocCert, rootCert, icaCert);
161
+ await nocCert.verify(this.#crypto, rootCert, icaCert);
171
162
  }
172
163
 
173
164
  matchesFabricIdAndRootPublicKey(fabricId: FabricId, rootPublicKey: Uint8Array) {
@@ -195,7 +186,7 @@ export class Fabric {
195
186
  * returns the time-wise valid operational keys for that groupId.
196
187
  */
197
188
  async currentDestinationIdFor(nodeId: NodeId, random: Uint8Array) {
198
- return await this.#certs.crypto.signHmac(
189
+ return await this.#crypto.signHmac(
199
190
  this.groups.keySets.currentKeyForId(0).key,
200
191
  this.#generateSalt(nodeId, random),
201
192
  );
@@ -208,9 +199,7 @@ export class Fabric {
208
199
  async destinationIdsFor(nodeId: NodeId, random: Uint8Array) {
209
200
  const salt = this.#generateSalt(nodeId, random);
210
201
  // Check all keys of keyset 0 - typically it is only the IPK
211
- const destinationIds = this.groups.keySets
212
- .allKeysForId(0)
213
- .map(({ key }) => this.#certs.crypto.signHmac(key, salt));
202
+ const destinationIds = this.groups.keySets.allKeysForId(0).map(({ key }) => this.#crypto.signHmac(key, salt));
214
203
  return await Promise.all(destinationIds);
215
204
  }
216
205
 
@@ -274,7 +263,7 @@ export class Fabric {
274
263
  }
275
264
 
276
265
  export class FabricBuilder {
277
- #certs: CertificateManager;
266
+ #crypto: Crypto;
278
267
  #keyPair: PrivateKey;
279
268
  #rootVendorId?: VendorId;
280
269
  #rootCert?: Uint8Array;
@@ -289,7 +278,7 @@ export class FabricBuilder {
289
278
  #label = "";
290
279
 
291
280
  constructor(crypto: Crypto, key: PrivateKey) {
292
- this.#certs = new CertificateManager(crypto);
281
+ this.#crypto = crypto;
293
282
  this.#keyPair = key;
294
283
  }
295
284
 
@@ -306,14 +295,14 @@ export class FabricBuilder {
306
295
  }
307
296
 
308
297
  createCertificateSigningRequest() {
309
- return this.#certs.createCertificateSigningRequest(this.#keyPair);
298
+ return X509Base.createCertificateSigningRequest(this.#crypto, this.#keyPair);
310
299
  }
311
300
 
312
301
  async setRootCert(rootCert: Uint8Array) {
313
- const decodedRootCertificate = TlvRootCertificate.decode(rootCert);
314
- await this.#certs.verifyRootCertificate(decodedRootCertificate);
302
+ const root = Rcac.fromTlv(rootCert);
303
+ await root.verify(this.#crypto);
315
304
  this.#rootCert = rootCert;
316
- this.#rootPublicKey = decodedRootCertificate.ellipticCurvePublicKey;
305
+ this.#rootPublicKey = root.cert.ellipticCurvePublicKey;
317
306
  return this;
318
307
  }
319
308
 
@@ -328,7 +317,7 @@ export class FabricBuilder {
328
317
  const {
329
318
  subject: { nodeId, fabricId, caseAuthenticatedTags },
330
319
  ellipticCurvePublicKey,
331
- } = TlvOperationalCertificate.decode(operationalCert);
320
+ } = Noc.fromTlv(operationalCert).cert;
332
321
  logger.debug(
333
322
  "Installing operational certificate",
334
323
  Diagnostic.dict({ nodeId, fabricId, caseAuthenticatedTags }),
@@ -345,14 +334,13 @@ export class FabricBuilder {
345
334
  throw new MatterFlowError("Root certificate needs to be set first");
346
335
  }
347
336
 
348
- const rootCert = TlvRootCertificate.decode(this.#rootCert);
349
- const nocCert = TlvOperationalCertificate.decode(operationalCert);
350
- const icaCert =
351
- intermediateCACert !== undefined ? TlvIntermediateCertificate.decode(intermediateCACert) : undefined;
337
+ const rootCert = Rcac.fromTlv(this.#rootCert);
338
+ const nocCert = Noc.fromTlv(operationalCert);
339
+ const icaCert = intermediateCACert !== undefined ? Icac.fromTlv(intermediateCACert) : undefined;
352
340
  if (icaCert !== undefined) {
353
- await this.#certs.verifyIntermediateCaCertificate(rootCert, icaCert);
341
+ await icaCert.verify(this.#crypto, rootCert);
354
342
  }
355
- await this.#certs.verifyNodeOperationalCertificate(nocCert, rootCert, icaCert);
343
+ await nocCert.verify(this.#crypto, rootCert, icaCert);
356
344
 
357
345
  this.#operationalCert = operationalCert;
358
346
  this.#intermediateCACert = intermediateCACert;
@@ -426,14 +414,14 @@ export class FabricBuilder {
426
414
  this.#fabricIndex = fabricIndex;
427
415
  const saltWriter = new DataWriter();
428
416
  saltWriter.writeUInt64(this.#fabricId);
429
- const operationalId = await this.#certs.crypto.createHkdfKey(
417
+ const operationalId = await this.#crypto.createHkdfKey(
430
418
  this.#rootPublicKey.slice(1),
431
419
  saltWriter.toByteArray(),
432
420
  COMPRESSED_FABRIC_ID_INFO,
433
421
  8,
434
422
  );
435
423
 
436
- return new Fabric(this.#certs, {
424
+ return new Fabric(this.#crypto, {
437
425
  fabricIndex: this.#fabricIndex,
438
426
  fabricId: this.#fabricId,
439
427
  nodeId: this.#nodeId,
@@ -444,7 +432,7 @@ export class FabricBuilder {
444
432
  rootVendorId: this.#rootVendorId,
445
433
  rootCert: this.#rootCert,
446
434
  identityProtectionKey: this.#identityProtectionKey, // Epoch Key
447
- operationalIdentityProtectionKey: await this.#certs.crypto.createHkdfKey(
435
+ operationalIdentityProtectionKey: await this.#crypto.createHkdfKey(
448
436
  this.#identityProtectionKey,
449
437
  operationalId,
450
438
  GROUP_SECURITY_INFO,
@@ -4,6 +4,7 @@
4
4
  * SPDX-License-Identifier: Apache-2.0
5
5
  */
6
6
 
7
+ import { X509Base } from "#certificate/index.js";
7
8
  import { BasicInformation } from "#clusters/basic-information";
8
9
  import { Descriptor } from "#clusters/descriptor";
9
10
  import { GeneralCommissioning } from "#clusters/general-commissioning";
@@ -808,7 +809,7 @@ export class ControllerCommissioningFlow {
808
809
  }
809
810
  // TODO: validate csrSignature using device public key
810
811
  const { certSigningRequest } = TlvCertSigningRequest.decode(nocsrElements);
811
- const operationalPublicKey = await this.ca.certs.getPublicKeyFromCsr(certSigningRequest);
812
+ const operationalPublicKey = await X509Base.getPublicKeyFromCsr(this.ca.crypto, certSigningRequest);
812
813
 
813
814
  await operationalCredentialsClusterClient.addTrustedRootCertificate(
814
815
  {
@@ -4,11 +4,11 @@
4
4
  * SPDX-License-Identifier: Apache-2.0
5
5
  */
6
6
 
7
+ import { Icac, Noc } from "#certificate/index.js";
7
8
  import { Bytes, Logger, PublicKey, UnexpectedDataError } from "#general";
8
9
  import { ChannelStatusResponseError } from "#securechannel/index.js";
9
10
  import { SessionManager } from "#session/SessionManager.js";
10
11
  import { NodeId, ProtocolStatusCode } from "#types";
11
- import { TlvIntermediateCertificate, TlvOperationalCertificate } from "../../certificate/CertificateManager.js";
12
12
  import { Fabric } from "../../fabric/Fabric.js";
13
13
  import { MessageExchange } from "../../protocol/MessageExchange.js";
14
14
  import {
@@ -171,7 +171,7 @@ export class CaseClient {
171
171
  const {
172
172
  ellipticCurvePublicKey: peerPublicKey,
173
173
  subject: { fabricId: peerFabricIdNOCert, nodeId: peerNodeIdNOCert },
174
- } = TlvOperationalCertificate.decode(peerNoc);
174
+ } = Noc.fromTlv(peerNoc).cert;
175
175
 
176
176
  await crypto.verifyEcdsa(PublicKey(peerPublicKey), peerSignatureData, peerSignature);
177
177
 
@@ -188,7 +188,7 @@ export class CaseClient {
188
188
  if (peerIcac !== undefined) {
189
189
  const {
190
190
  subject: { fabricId: peerFabricIdIcaCert },
191
- } = TlvIntermediateCertificate.decode(peerIcac);
191
+ } = Icac.fromTlv(peerIcac).cert;
192
192
 
193
193
  if (peerFabricIdIcaCert !== undefined && peerFabricIdIcaCert !== fabric.fabricId) {
194
194
  throw new UnexpectedDataError(
@@ -4,11 +4,11 @@
4
4
  * SPDX-License-Identifier: Apache-2.0
5
5
  */
6
6
 
7
+ import { Noc } from "#certificate/index.js";
7
8
  import { Bytes, Crypto, CryptoDecryptError, Logger, PublicKey, UnexpectedDataError } from "#general";
8
9
  import { TlvSessionParameters } from "#session/pase/PaseMessages.js";
9
10
  import { ResumptionRecord, SessionManager } from "#session/SessionManager.js";
10
11
  import { NodeId, ProtocolStatusCode, SECURE_CHANNEL_PROTOCOL_ID, TypeFromSchema } from "#types";
11
- import { TlvOperationalCertificate } from "../../certificate/CertificateManager.js";
12
12
  import { FabricManager, FabricNotFoundError } from "../../fabric/FabricManager.js";
13
13
  import { MessageExchange } from "../../protocol/MessageExchange.js";
14
14
  import { ProtocolHandler } from "../../protocol/ProtocolHandler.js";
@@ -248,7 +248,7 @@ export class CaseServer implements ProtocolHandler {
248
248
  const {
249
249
  ellipticCurvePublicKey: peerPublicKey,
250
250
  subject: { fabricId: peerFabricId, nodeId: peerNodeId, caseAuthenticatedTags },
251
- } = TlvOperationalCertificate.decode(peerNewOpCert);
251
+ } = Noc.fromTlv(peerNewOpCert).cert;
252
252
 
253
253
  if (fabric.fabricId !== peerFabricId) {
254
254
  throw new UnexpectedDataError(`Fabric ID mismatch: ${fabric.fabricId} !== ${peerFabricId}`);