@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.
- package/dist/cjs/certificate/AttestationCertificateManager.d.ts.map +1 -1
- package/dist/cjs/certificate/AttestationCertificateManager.js +26 -22
- package/dist/cjs/certificate/AttestationCertificateManager.js.map +1 -1
- package/dist/cjs/certificate/CertificateAuthority.d.ts +1 -2
- package/dist/cjs/certificate/CertificateAuthority.d.ts.map +1 -1
- package/dist/cjs/certificate/CertificateAuthority.js +22 -29
- package/dist/cjs/certificate/CertificateAuthority.js.map +1 -1
- package/dist/cjs/certificate/DeviceCertification.d.ts.map +1 -1
- package/dist/cjs/certificate/DeviceCertification.js +2 -6
- package/dist/cjs/certificate/DeviceCertification.js.map +1 -1
- package/dist/cjs/certificate/index.d.ts +7 -2
- package/dist/cjs/certificate/index.d.ts.map +1 -1
- package/dist/cjs/certificate/index.js +14 -2
- package/dist/cjs/certificate/index.js.map +1 -1
- package/dist/cjs/certificate/kinds/AttestationCertificates.d.ts +34 -0
- package/dist/cjs/certificate/kinds/AttestationCertificates.d.ts.map +1 -0
- package/dist/cjs/certificate/kinds/AttestationCertificates.js +64 -0
- package/dist/cjs/certificate/kinds/AttestationCertificates.js.map +6 -0
- package/dist/cjs/certificate/kinds/CertificationDeclaration.d.ts +23 -0
- package/dist/cjs/certificate/kinds/CertificationDeclaration.d.ts.map +1 -0
- package/dist/cjs/certificate/kinds/CertificationDeclaration.js +86 -0
- package/dist/cjs/certificate/kinds/CertificationDeclaration.js.map +6 -0
- package/dist/cjs/certificate/kinds/Icac.d.ts +29 -0
- package/dist/cjs/certificate/kinds/Icac.d.ts.map +1 -0
- package/dist/cjs/certificate/kinds/Icac.js +138 -0
- package/dist/cjs/certificate/kinds/Icac.js.map +6 -0
- package/dist/cjs/certificate/kinds/Noc.d.ts +27 -0
- package/dist/cjs/certificate/kinds/Noc.d.ts.map +1 -0
- package/dist/cjs/certificate/kinds/Noc.js +148 -0
- package/dist/cjs/certificate/kinds/Noc.js.map +6 -0
- package/dist/cjs/certificate/kinds/OperationalBase.d.ts +24 -0
- package/dist/cjs/certificate/kinds/OperationalBase.d.ts.map +1 -0
- package/dist/cjs/certificate/kinds/OperationalBase.js +68 -0
- package/dist/cjs/certificate/kinds/OperationalBase.js.map +6 -0
- package/dist/cjs/certificate/kinds/Rcac.d.ts +25 -0
- package/dist/cjs/certificate/kinds/Rcac.d.ts.map +1 -0
- package/dist/cjs/certificate/kinds/Rcac.js +119 -0
- package/dist/cjs/certificate/kinds/Rcac.js.map +6 -0
- package/dist/cjs/certificate/kinds/X509Base.d.ts +92 -0
- package/dist/cjs/certificate/kinds/X509Base.d.ts.map +1 -0
- package/dist/cjs/certificate/kinds/X509Base.js +344 -0
- package/dist/cjs/certificate/kinds/X509Base.js.map +6 -0
- package/dist/cjs/certificate/kinds/common.d.ts +18 -0
- package/dist/cjs/certificate/kinds/common.d.ts.map +1 -0
- package/dist/cjs/certificate/kinds/common.js +42 -0
- package/dist/cjs/certificate/kinds/common.js.map +6 -0
- package/dist/cjs/certificate/kinds/definitions/asn.d.ts +25 -0
- package/dist/cjs/certificate/kinds/definitions/asn.d.ts.map +1 -0
- package/dist/cjs/certificate/kinds/definitions/asn.js +83 -0
- package/dist/cjs/certificate/kinds/definitions/asn.js.map +6 -0
- package/dist/cjs/certificate/kinds/definitions/attestation.d.ts +44 -0
- package/dist/cjs/certificate/kinds/definitions/attestation.d.ts.map +1 -0
- package/dist/cjs/certificate/kinds/definitions/attestation.js +22 -0
- package/dist/cjs/certificate/kinds/definitions/attestation.js.map +6 -0
- package/dist/cjs/certificate/kinds/definitions/base.d.ts +52 -0
- package/dist/cjs/certificate/kinds/definitions/base.d.ts.map +1 -0
- package/dist/cjs/certificate/kinds/definitions/base.js +43 -0
- package/dist/cjs/certificate/kinds/definitions/base.js.map +6 -0
- package/dist/cjs/certificate/kinds/definitions/certification-declaration.d.ts +18 -0
- package/dist/cjs/certificate/kinds/definitions/certification-declaration.d.ts.map +1 -0
- package/dist/cjs/certificate/kinds/definitions/certification-declaration.js +50 -0
- package/dist/cjs/certificate/kinds/definitions/certification-declaration.js.map +6 -0
- package/dist/cjs/certificate/kinds/definitions/operational.d.ts +368 -0
- package/dist/cjs/certificate/kinds/definitions/operational.d.ts.map +1 -0
- package/dist/cjs/certificate/kinds/definitions/operational.js +149 -0
- package/dist/cjs/certificate/kinds/definitions/operational.js.map +6 -0
- package/dist/cjs/certificate/kinds/index.d.ts +12 -0
- package/dist/cjs/certificate/kinds/index.d.ts.map +1 -0
- package/dist/cjs/certificate/kinds/index.js +29 -0
- package/dist/cjs/certificate/kinds/index.js.map +6 -0
- package/dist/cjs/fabric/Fabric.d.ts +1 -2
- package/dist/cjs/fabric/Fabric.d.ts.map +1 -1
- package/dist/cjs/fabric/Fabric.js +28 -31
- package/dist/cjs/fabric/Fabric.js.map +1 -1
- package/dist/cjs/peer/ControllerCommissioningFlow.d.ts.map +1 -1
- package/dist/cjs/peer/ControllerCommissioningFlow.js +2 -1
- package/dist/cjs/peer/ControllerCommissioningFlow.js.map +1 -1
- package/dist/cjs/session/case/CaseClient.d.ts.map +1 -1
- package/dist/cjs/session/case/CaseClient.js +3 -3
- package/dist/cjs/session/case/CaseClient.js.map +1 -1
- package/dist/cjs/session/case/CaseServer.d.ts.map +1 -1
- package/dist/cjs/session/case/CaseServer.js +2 -2
- package/dist/cjs/session/case/CaseServer.js.map +1 -1
- package/dist/esm/certificate/AttestationCertificateManager.d.ts.map +1 -1
- package/dist/esm/certificate/AttestationCertificateManager.js +20 -16
- package/dist/esm/certificate/AttestationCertificateManager.js.map +1 -1
- package/dist/esm/certificate/CertificateAuthority.d.ts +1 -2
- package/dist/esm/certificate/CertificateAuthority.d.ts.map +1 -1
- package/dist/esm/certificate/CertificateAuthority.js +18 -30
- package/dist/esm/certificate/CertificateAuthority.js.map +1 -1
- package/dist/esm/certificate/DeviceCertification.d.ts.map +1 -1
- package/dist/esm/certificate/DeviceCertification.js +2 -6
- package/dist/esm/certificate/DeviceCertification.js.map +1 -1
- package/dist/esm/certificate/index.d.ts +7 -2
- package/dist/esm/certificate/index.d.ts.map +1 -1
- package/dist/esm/certificate/index.js +10 -2
- package/dist/esm/certificate/index.js.map +1 -1
- package/dist/esm/certificate/kinds/AttestationCertificates.d.ts +34 -0
- package/dist/esm/certificate/kinds/AttestationCertificates.d.ts.map +1 -0
- package/dist/esm/certificate/kinds/AttestationCertificates.js +44 -0
- package/dist/esm/certificate/kinds/AttestationCertificates.js.map +6 -0
- package/dist/esm/certificate/kinds/CertificationDeclaration.d.ts +23 -0
- package/dist/esm/certificate/kinds/CertificationDeclaration.d.ts.map +1 -0
- package/dist/esm/certificate/kinds/CertificationDeclaration.js +66 -0
- package/dist/esm/certificate/kinds/CertificationDeclaration.js.map +6 -0
- package/dist/esm/certificate/kinds/Icac.d.ts +29 -0
- package/dist/esm/certificate/kinds/Icac.d.ts.map +1 -0
- package/dist/esm/certificate/kinds/Icac.js +118 -0
- package/dist/esm/certificate/kinds/Icac.js.map +6 -0
- package/dist/esm/certificate/kinds/Noc.d.ts +27 -0
- package/dist/esm/certificate/kinds/Noc.d.ts.map +1 -0
- package/dist/esm/certificate/kinds/Noc.js +128 -0
- package/dist/esm/certificate/kinds/Noc.js.map +6 -0
- package/dist/esm/certificate/kinds/OperationalBase.d.ts +24 -0
- package/dist/esm/certificate/kinds/OperationalBase.d.ts.map +1 -0
- package/dist/esm/certificate/kinds/OperationalBase.js +48 -0
- package/dist/esm/certificate/kinds/OperationalBase.js.map +6 -0
- package/dist/esm/certificate/kinds/Rcac.d.ts +25 -0
- package/dist/esm/certificate/kinds/Rcac.d.ts.map +1 -0
- package/dist/esm/certificate/kinds/Rcac.js +99 -0
- package/dist/esm/certificate/kinds/Rcac.js.map +6 -0
- package/dist/esm/certificate/kinds/X509Base.d.ts +92 -0
- package/dist/esm/certificate/kinds/X509Base.d.ts.map +1 -0
- package/dist/esm/certificate/kinds/X509Base.js +347 -0
- package/dist/esm/certificate/kinds/X509Base.js.map +6 -0
- package/dist/esm/certificate/kinds/common.d.ts +18 -0
- package/dist/esm/certificate/kinds/common.d.ts.map +1 -0
- package/dist/esm/certificate/kinds/common.js +22 -0
- package/dist/esm/certificate/kinds/common.js.map +6 -0
- package/dist/esm/certificate/kinds/definitions/asn.d.ts +25 -0
- package/dist/esm/certificate/kinds/definitions/asn.d.ts.map +1 -0
- package/dist/esm/certificate/kinds/definitions/asn.js +63 -0
- package/dist/esm/certificate/kinds/definitions/asn.js.map +6 -0
- package/dist/esm/certificate/kinds/definitions/attestation.d.ts +44 -0
- package/dist/esm/certificate/kinds/definitions/attestation.d.ts.map +1 -0
- package/dist/esm/certificate/kinds/definitions/attestation.js +6 -0
- package/dist/esm/certificate/kinds/definitions/attestation.js.map +6 -0
- package/dist/esm/certificate/kinds/definitions/base.d.ts +52 -0
- package/dist/esm/certificate/kinds/definitions/base.d.ts.map +1 -0
- package/dist/esm/certificate/kinds/definitions/base.js +23 -0
- package/dist/esm/certificate/kinds/definitions/base.js.map +6 -0
- package/dist/esm/certificate/kinds/definitions/certification-declaration.d.ts +18 -0
- package/dist/esm/certificate/kinds/definitions/certification-declaration.d.ts.map +1 -0
- package/dist/esm/certificate/kinds/definitions/certification-declaration.js +41 -0
- package/dist/esm/certificate/kinds/definitions/certification-declaration.js.map +6 -0
- package/dist/esm/certificate/kinds/definitions/operational.d.ts +368 -0
- package/dist/esm/certificate/kinds/definitions/operational.d.ts.map +1 -0
- package/dist/esm/certificate/kinds/definitions/operational.js +148 -0
- package/dist/esm/certificate/kinds/definitions/operational.js.map +6 -0
- package/dist/esm/certificate/kinds/index.d.ts +12 -0
- package/dist/esm/certificate/kinds/index.d.ts.map +1 -0
- package/dist/esm/certificate/kinds/index.js +12 -0
- package/dist/esm/certificate/kinds/index.js.map +6 -0
- package/dist/esm/fabric/Fabric.d.ts +1 -2
- package/dist/esm/fabric/Fabric.d.ts.map +1 -1
- package/dist/esm/fabric/Fabric.js +28 -36
- package/dist/esm/fabric/Fabric.js.map +1 -1
- package/dist/esm/peer/ControllerCommissioningFlow.d.ts.map +1 -1
- package/dist/esm/peer/ControllerCommissioningFlow.js +2 -1
- package/dist/esm/peer/ControllerCommissioningFlow.js.map +1 -1
- package/dist/esm/session/case/CaseClient.d.ts.map +1 -1
- package/dist/esm/session/case/CaseClient.js +3 -3
- package/dist/esm/session/case/CaseClient.js.map +1 -1
- package/dist/esm/session/case/CaseServer.d.ts.map +1 -1
- package/dist/esm/session/case/CaseServer.js +2 -2
- package/dist/esm/session/case/CaseServer.js.map +1 -1
- package/package.json +6 -6
- package/src/certificate/AttestationCertificateManager.ts +20 -16
- package/src/certificate/CertificateAuthority.ts +18 -35
- package/src/certificate/DeviceCertification.ts +2 -6
- package/src/certificate/index.ts +7 -2
- package/src/certificate/kinds/AttestationCertificates.ts +48 -0
- package/src/certificate/kinds/CertificationDeclaration.ts +91 -0
- package/src/certificate/kinds/Icac.ts +156 -0
- package/src/certificate/kinds/Noc.ts +164 -0
- package/src/certificate/kinds/OperationalBase.ts +72 -0
- package/src/certificate/kinds/Rcac.ts +126 -0
- package/src/certificate/kinds/X509Base.ts +380 -0
- package/src/certificate/kinds/common.ts +24 -0
- package/src/certificate/kinds/definitions/asn.ts +97 -0
- package/src/certificate/kinds/definitions/attestation.ts +46 -0
- package/src/certificate/kinds/definitions/base.ts +43 -0
- package/src/certificate/kinds/definitions/certification-declaration.ts +38 -0
- package/src/certificate/kinds/definitions/operational.ts +179 -0
- package/src/certificate/kinds/index.ts +12 -0
- package/src/fabric/Fabric.ts +28 -40
- package/src/peer/ControllerCommissioningFlow.ts +2 -1
- package/src/session/case/CaseClient.ts +3 -3
- package/src/session/case/CaseServer.ts +2 -2
- package/dist/cjs/certificate/CertificateManager.d.ts +0 -578
- package/dist/cjs/certificate/CertificateManager.d.ts.map +0 -1
- package/dist/cjs/certificate/CertificateManager.js +0 -843
- package/dist/cjs/certificate/CertificateManager.js.map +0 -6
- package/dist/cjs/certificate/CertificationDeclarationManager.d.ts +0 -11
- package/dist/cjs/certificate/CertificationDeclarationManager.d.ts.map +0 -1
- package/dist/cjs/certificate/CertificationDeclarationManager.js +0 -54
- package/dist/cjs/certificate/CertificationDeclarationManager.js.map +0 -6
- package/dist/esm/certificate/CertificateManager.d.ts +0 -578
- package/dist/esm/certificate/CertificateManager.d.ts.map +0 -1
- package/dist/esm/certificate/CertificateManager.js +0 -870
- package/dist/esm/certificate/CertificateManager.js.map +0 -6
- package/dist/esm/certificate/CertificationDeclarationManager.d.ts +0 -11
- package/dist/esm/certificate/CertificationDeclarationManager.d.ts.map +0 -1
- package/dist/esm/certificate/CertificationDeclarationManager.js +0 -34
- package/dist/esm/certificate/CertificationDeclarationManager.js.map +0 -6
- package/src/certificate/CertificateManager.ts +0 -1176
- 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";
|
package/src/fabric/Fabric.ts
CHANGED
|
@@ -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 #
|
|
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(
|
|
75
|
-
|
|
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.#
|
|
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
|
|
149
|
+
return this.crypto.signEcdsa(this.#keyPair, data);
|
|
158
150
|
}
|
|
159
151
|
|
|
160
152
|
async verifyCredentials(operationalCert: Uint8Array, intermediateCACert?: Uint8Array) {
|
|
161
|
-
const rootCert =
|
|
162
|
-
const nocCert =
|
|
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.#
|
|
158
|
+
await icaCert.verify(this.#crypto, rootCert);
|
|
168
159
|
}
|
|
169
160
|
// Validate NOC Certificate against ICA Certificate
|
|
170
|
-
await this.#
|
|
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.#
|
|
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
|
-
#
|
|
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.#
|
|
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
|
|
298
|
+
return X509Base.createCertificateSigningRequest(this.#crypto, this.#keyPair);
|
|
310
299
|
}
|
|
311
300
|
|
|
312
301
|
async setRootCert(rootCert: Uint8Array) {
|
|
313
|
-
const
|
|
314
|
-
await this.#
|
|
302
|
+
const root = Rcac.fromTlv(rootCert);
|
|
303
|
+
await root.verify(this.#crypto);
|
|
315
304
|
this.#rootCert = rootCert;
|
|
316
|
-
this.#rootPublicKey =
|
|
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
|
-
} =
|
|
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 =
|
|
349
|
-
const nocCert =
|
|
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.#
|
|
341
|
+
await icaCert.verify(this.#crypto, rootCert);
|
|
354
342
|
}
|
|
355
|
-
await this.#
|
|
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.#
|
|
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.#
|
|
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.#
|
|
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.
|
|
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
|
-
} =
|
|
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
|
-
} =
|
|
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
|
-
} =
|
|
251
|
+
} = Noc.fromTlv(peerNewOpCert).cert;
|
|
252
252
|
|
|
253
253
|
if (fabric.fabricId !== peerFabricId) {
|
|
254
254
|
throw new UnexpectedDataError(`Fabric ID mismatch: ${fabric.fabricId} !== ${peerFabricId}`);
|