@matterbridge/core 3.5.3
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/LICENSE +202 -0
- package/README.md +22 -0
- package/dist/cli.d.ts +29 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +268 -0
- package/dist/cli.js.map +1 -0
- package/dist/cliEmitter.d.ts +50 -0
- package/dist/cliEmitter.d.ts.map +1 -0
- package/dist/cliEmitter.js +49 -0
- package/dist/cliEmitter.js.map +1 -0
- package/dist/cliHistory.d.ts +48 -0
- package/dist/cliHistory.d.ts.map +1 -0
- package/dist/cliHistory.js +826 -0
- package/dist/cliHistory.js.map +1 -0
- package/dist/clusters/export.d.ts +2 -0
- package/dist/clusters/export.d.ts.map +1 -0
- package/dist/clusters/export.js +3 -0
- package/dist/clusters/export.js.map +1 -0
- package/dist/crypto/attestationDecoder.d.ts +180 -0
- package/dist/crypto/attestationDecoder.d.ts.map +1 -0
- package/dist/crypto/attestationDecoder.js +176 -0
- package/dist/crypto/attestationDecoder.js.map +1 -0
- package/dist/crypto/declarationDecoder.d.ts +72 -0
- package/dist/crypto/declarationDecoder.d.ts.map +1 -0
- package/dist/crypto/declarationDecoder.js +241 -0
- package/dist/crypto/declarationDecoder.js.map +1 -0
- package/dist/crypto/extract/342/200/220cert/342/200/220extensions.d.ts +9 -0
- package/dist/crypto/extract/342/200/220cert/342/200/220extensions.d.ts.map +1 -0
- package/dist/crypto/extract/342/200/220cert/342/200/220extensions.js +120 -0
- package/dist/crypto/extract/342/200/220cert/342/200/220extensions.js.map +1 -0
- package/dist/crypto/read-extensions.d.ts +2 -0
- package/dist/crypto/read-extensions.d.ts.map +1 -0
- package/dist/crypto/read-extensions.js +81 -0
- package/dist/crypto/read-extensions.js.map +1 -0
- package/dist/crypto/testData.d.ts +31 -0
- package/dist/crypto/testData.d.ts.map +1 -0
- package/dist/crypto/testData.js +131 -0
- package/dist/crypto/testData.js.map +1 -0
- package/dist/crypto/walk-der.d.ts +2 -0
- package/dist/crypto/walk-der.d.ts.map +1 -0
- package/dist/crypto/walk-der.js +165 -0
- package/dist/crypto/walk-der.js.map +1 -0
- package/dist/deviceManager.d.ts +135 -0
- package/dist/deviceManager.d.ts.map +1 -0
- package/dist/deviceManager.js +270 -0
- package/dist/deviceManager.js.map +1 -0
- package/dist/devices/airConditioner.d.ts +98 -0
- package/dist/devices/airConditioner.d.ts.map +1 -0
- package/dist/devices/airConditioner.js +74 -0
- package/dist/devices/airConditioner.js.map +1 -0
- package/dist/devices/basicVideoPlayer.d.ts +88 -0
- package/dist/devices/basicVideoPlayer.d.ts.map +1 -0
- package/dist/devices/basicVideoPlayer.js +155 -0
- package/dist/devices/basicVideoPlayer.js.map +1 -0
- package/dist/devices/batteryStorage.d.ts +48 -0
- package/dist/devices/batteryStorage.d.ts.map +1 -0
- package/dist/devices/batteryStorage.js +75 -0
- package/dist/devices/batteryStorage.js.map +1 -0
- package/dist/devices/castingVideoPlayer.d.ts +79 -0
- package/dist/devices/castingVideoPlayer.d.ts.map +1 -0
- package/dist/devices/castingVideoPlayer.js +101 -0
- package/dist/devices/castingVideoPlayer.js.map +1 -0
- package/dist/devices/cooktop.d.ts +61 -0
- package/dist/devices/cooktop.d.ts.map +1 -0
- package/dist/devices/cooktop.js +77 -0
- package/dist/devices/cooktop.js.map +1 -0
- package/dist/devices/dishwasher.d.ts +71 -0
- package/dist/devices/dishwasher.d.ts.map +1 -0
- package/dist/devices/dishwasher.js +130 -0
- package/dist/devices/dishwasher.js.map +1 -0
- package/dist/devices/evse.d.ts +76 -0
- package/dist/devices/evse.d.ts.map +1 -0
- package/dist/devices/evse.js +156 -0
- package/dist/devices/evse.js.map +1 -0
- package/dist/devices/export.d.ts +19 -0
- package/dist/devices/export.d.ts.map +1 -0
- package/dist/devices/export.js +23 -0
- package/dist/devices/export.js.map +1 -0
- package/dist/devices/extractorHood.d.ts +46 -0
- package/dist/devices/extractorHood.d.ts.map +1 -0
- package/dist/devices/extractorHood.js +78 -0
- package/dist/devices/extractorHood.js.map +1 -0
- package/dist/devices/heatPump.d.ts +47 -0
- package/dist/devices/heatPump.d.ts.map +1 -0
- package/dist/devices/heatPump.js +84 -0
- package/dist/devices/heatPump.js.map +1 -0
- package/dist/devices/laundryDryer.d.ts +67 -0
- package/dist/devices/laundryDryer.d.ts.map +1 -0
- package/dist/devices/laundryDryer.js +106 -0
- package/dist/devices/laundryDryer.js.map +1 -0
- package/dist/devices/laundryWasher.d.ts +81 -0
- package/dist/devices/laundryWasher.d.ts.map +1 -0
- package/dist/devices/laundryWasher.js +147 -0
- package/dist/devices/laundryWasher.js.map +1 -0
- package/dist/devices/microwaveOven.d.ts +168 -0
- package/dist/devices/microwaveOven.d.ts.map +1 -0
- package/dist/devices/microwaveOven.js +179 -0
- package/dist/devices/microwaveOven.js.map +1 -0
- package/dist/devices/oven.d.ts +105 -0
- package/dist/devices/oven.d.ts.map +1 -0
- package/dist/devices/oven.js +190 -0
- package/dist/devices/oven.js.map +1 -0
- package/dist/devices/refrigerator.d.ts +118 -0
- package/dist/devices/refrigerator.d.ts.map +1 -0
- package/dist/devices/refrigerator.js +186 -0
- package/dist/devices/refrigerator.js.map +1 -0
- package/dist/devices/roboticVacuumCleaner.d.ts +112 -0
- package/dist/devices/roboticVacuumCleaner.d.ts.map +1 -0
- package/dist/devices/roboticVacuumCleaner.js +268 -0
- package/dist/devices/roboticVacuumCleaner.js.map +1 -0
- package/dist/devices/solarPower.d.ts +40 -0
- package/dist/devices/solarPower.d.ts.map +1 -0
- package/dist/devices/solarPower.js +59 -0
- package/dist/devices/solarPower.js.map +1 -0
- package/dist/devices/speaker.d.ts +87 -0
- package/dist/devices/speaker.d.ts.map +1 -0
- package/dist/devices/speaker.js +120 -0
- package/dist/devices/speaker.js.map +1 -0
- package/dist/devices/temperatureControl.d.ts +166 -0
- package/dist/devices/temperatureControl.d.ts.map +1 -0
- package/dist/devices/temperatureControl.js +78 -0
- package/dist/devices/temperatureControl.js.map +1 -0
- package/dist/devices/waterHeater.d.ts +111 -0
- package/dist/devices/waterHeater.d.ts.map +1 -0
- package/dist/devices/waterHeater.js +166 -0
- package/dist/devices/waterHeater.js.map +1 -0
- package/dist/dgram/export.d.ts +2 -0
- package/dist/dgram/export.d.ts.map +1 -0
- package/dist/dgram/export.js +2 -0
- package/dist/dgram/export.js.map +1 -0
- package/dist/export.d.ts +32 -0
- package/dist/export.d.ts.map +1 -0
- package/dist/export.js +39 -0
- package/dist/export.js.map +1 -0
- package/dist/frontend.d.ts +248 -0
- package/dist/frontend.d.ts.map +1 -0
- package/dist/frontend.js +2605 -0
- package/dist/frontend.js.map +1 -0
- package/dist/helpers.d.ts +48 -0
- package/dist/helpers.d.ts.map +1 -0
- package/dist/helpers.js +161 -0
- package/dist/helpers.js.map +1 -0
- package/dist/jestutils/export.d.ts +2 -0
- package/dist/jestutils/export.d.ts.map +1 -0
- package/dist/jestutils/export.js +2 -0
- package/dist/jestutils/export.js.map +1 -0
- package/dist/jestutils/jestHelpers.d.ts +349 -0
- package/dist/jestutils/jestHelpers.d.ts.map +1 -0
- package/dist/jestutils/jestHelpers.js +980 -0
- package/dist/jestutils/jestHelpers.js.map +1 -0
- package/dist/matter/behaviors.d.ts +2 -0
- package/dist/matter/behaviors.d.ts.map +1 -0
- package/dist/matter/behaviors.js +3 -0
- package/dist/matter/behaviors.js.map +1 -0
- package/dist/matter/clusters.d.ts +2 -0
- package/dist/matter/clusters.d.ts.map +1 -0
- package/dist/matter/clusters.js +3 -0
- package/dist/matter/clusters.js.map +1 -0
- package/dist/matter/devices.d.ts +2 -0
- package/dist/matter/devices.d.ts.map +1 -0
- package/dist/matter/devices.js +3 -0
- package/dist/matter/devices.js.map +1 -0
- package/dist/matter/endpoints.d.ts +2 -0
- package/dist/matter/endpoints.d.ts.map +1 -0
- package/dist/matter/endpoints.js +3 -0
- package/dist/matter/endpoints.js.map +1 -0
- package/dist/matter/export.d.ts +4 -0
- package/dist/matter/export.d.ts.map +1 -0
- package/dist/matter/export.js +5 -0
- package/dist/matter/export.js.map +1 -0
- package/dist/matter/types.d.ts +2 -0
- package/dist/matter/types.d.ts.map +1 -0
- package/dist/matter/types.js +3 -0
- package/dist/matter/types.js.map +1 -0
- package/dist/matterNode.d.ts +341 -0
- package/dist/matterNode.d.ts.map +1 -0
- package/dist/matterNode.js +1329 -0
- package/dist/matterNode.js.map +1 -0
- package/dist/matterbridge.d.ts +544 -0
- package/dist/matterbridge.d.ts.map +1 -0
- package/dist/matterbridge.js +2880 -0
- package/dist/matterbridge.js.map +1 -0
- package/dist/matterbridgeAccessoryPlatform.d.ts +49 -0
- package/dist/matterbridgeAccessoryPlatform.d.ts.map +1 -0
- package/dist/matterbridgeAccessoryPlatform.js +80 -0
- package/dist/matterbridgeAccessoryPlatform.js.map +1 -0
- package/dist/matterbridgeBehaviors.d.ts +2428 -0
- package/dist/matterbridgeBehaviors.d.ts.map +1 -0
- package/dist/matterbridgeBehaviors.js +620 -0
- package/dist/matterbridgeBehaviors.js.map +1 -0
- package/dist/matterbridgeDeviceTypes.d.ts +744 -0
- package/dist/matterbridgeDeviceTypes.d.ts.map +1 -0
- package/dist/matterbridgeDeviceTypes.js +1312 -0
- package/dist/matterbridgeDeviceTypes.js.map +1 -0
- package/dist/matterbridgeDynamicPlatform.d.ts +49 -0
- package/dist/matterbridgeDynamicPlatform.d.ts.map +1 -0
- package/dist/matterbridgeDynamicPlatform.js +80 -0
- package/dist/matterbridgeDynamicPlatform.js.map +1 -0
- package/dist/matterbridgeEndpoint.d.ts +1548 -0
- package/dist/matterbridgeEndpoint.d.ts.map +1 -0
- package/dist/matterbridgeEndpoint.js +2883 -0
- package/dist/matterbridgeEndpoint.js.map +1 -0
- package/dist/matterbridgeEndpointHelpers.d.ts +1855 -0
- package/dist/matterbridgeEndpointHelpers.d.ts.map +1 -0
- package/dist/matterbridgeEndpointHelpers.js +1270 -0
- package/dist/matterbridgeEndpointHelpers.js.map +1 -0
- package/dist/matterbridgeEndpointTypes.d.ts +172 -0
- package/dist/matterbridgeEndpointTypes.d.ts.map +1 -0
- package/dist/matterbridgeEndpointTypes.js +28 -0
- package/dist/matterbridgeEndpointTypes.js.map +1 -0
- package/dist/matterbridgePlatform.d.ts +520 -0
- package/dist/matterbridgePlatform.d.ts.map +1 -0
- package/dist/matterbridgePlatform.js +921 -0
- package/dist/matterbridgePlatform.js.map +1 -0
- package/dist/mb_coap.d.ts +24 -0
- package/dist/mb_coap.d.ts.map +1 -0
- package/dist/mb_coap.js +89 -0
- package/dist/mb_coap.js.map +1 -0
- package/dist/mb_health.d.ts +77 -0
- package/dist/mb_health.d.ts.map +1 -0
- package/dist/mb_health.js +147 -0
- package/dist/mb_health.js.map +1 -0
- package/dist/mb_mdns.d.ts +24 -0
- package/dist/mb_mdns.d.ts.map +1 -0
- package/dist/mb_mdns.js +285 -0
- package/dist/mb_mdns.js.map +1 -0
- package/dist/pluginManager.d.ts +388 -0
- package/dist/pluginManager.d.ts.map +1 -0
- package/dist/pluginManager.js +1574 -0
- package/dist/pluginManager.js.map +1 -0
- package/dist/spawn.d.ts +33 -0
- package/dist/spawn.d.ts.map +1 -0
- package/dist/spawn.js +165 -0
- package/dist/spawn.js.map +1 -0
- package/dist/utils/export.d.ts +2 -0
- package/dist/utils/export.d.ts.map +1 -0
- package/dist/utils/export.js +2 -0
- package/dist/utils/export.js.map +1 -0
- package/dist/workers/brand.d.ts +25 -0
- package/dist/workers/brand.d.ts.map +1 -0
- package/dist/workers/brand.extend.d.ts +10 -0
- package/dist/workers/brand.extend.d.ts.map +1 -0
- package/dist/workers/brand.extend.js +15 -0
- package/dist/workers/brand.extend.js.map +1 -0
- package/dist/workers/brand.invalid.d.ts +9 -0
- package/dist/workers/brand.invalid.d.ts.map +1 -0
- package/dist/workers/brand.invalid.js +19 -0
- package/dist/workers/brand.invalid.js.map +1 -0
- package/dist/workers/brand.js +67 -0
- package/dist/workers/brand.js.map +1 -0
- package/dist/workers/clusterTypes.d.ts +47 -0
- package/dist/workers/clusterTypes.d.ts.map +1 -0
- package/dist/workers/clusterTypes.js +57 -0
- package/dist/workers/clusterTypes.js.map +1 -0
- package/dist/workers/frontendWorker.d.ts +2 -0
- package/dist/workers/frontendWorker.d.ts.map +1 -0
- package/dist/workers/frontendWorker.js +90 -0
- package/dist/workers/frontendWorker.js.map +1 -0
- package/dist/workers/helloWorld.d.ts +2 -0
- package/dist/workers/helloWorld.d.ts.map +1 -0
- package/dist/workers/helloWorld.js +135 -0
- package/dist/workers/helloWorld.js.map +1 -0
- package/dist/workers/matterWorker.d.ts +2 -0
- package/dist/workers/matterWorker.d.ts.map +1 -0
- package/dist/workers/matterWorker.js +104 -0
- package/dist/workers/matterWorker.js.map +1 -0
- package/dist/workers/matterbridgeWorker.d.ts +2 -0
- package/dist/workers/matterbridgeWorker.d.ts.map +1 -0
- package/dist/workers/matterbridgeWorker.js +75 -0
- package/dist/workers/matterbridgeWorker.js.map +1 -0
- package/dist/workers/messageLab.d.ts +134 -0
- package/dist/workers/messageLab.d.ts.map +1 -0
- package/dist/workers/messageLab.js +129 -0
- package/dist/workers/messageLab.js.map +1 -0
- package/dist/workers/testWorker.d.ts +2 -0
- package/dist/workers/testWorker.d.ts.map +1 -0
- package/dist/workers/testWorker.js +45 -0
- package/dist/workers/testWorker.js.map +1 -0
- package/dist/workers/usage.d.ts +19 -0
- package/dist/workers/usage.d.ts.map +1 -0
- package/dist/workers/usage.js +140 -0
- package/dist/workers/usage.js.map +1 -0
- package/dist/workers/workerManager.d.ts +115 -0
- package/dist/workers/workerManager.d.ts.map +1 -0
- package/dist/workers/workerManager.js +464 -0
- package/dist/workers/workerManager.js.map +1 -0
- package/dist/workers/workerServer.d.ts +126 -0
- package/dist/workers/workerServer.d.ts.map +1 -0
- package/dist/workers/workerServer.js +340 -0
- package/dist/workers/workerServer.js.map +1 -0
- package/dist/workers/workerTypes.d.ts +23 -0
- package/dist/workers/workerTypes.d.ts.map +1 -0
- package/dist/workers/workerTypes.js +3 -0
- package/dist/workers/workerTypes.js.map +1 -0
- package/package.json +120 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cliHistory.js","sourceRoot":"","sources":["../src/cliHistory.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"export.d.ts","sourceRoot":"","sources":["../../src/clusters/export.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"export.js","sourceRoot":"","sources":["../../src/clusters/export.ts"],"names":[],"mappings":";AAAA,oGAAoG"}
|
|
@@ -0,0 +1,180 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* This file contains the Device Attestation Certificate (DAC) functions.
|
|
3
|
+
*
|
|
4
|
+
* @file attestationDecoder.ts
|
|
5
|
+
* @author Luca Liguori
|
|
6
|
+
* @created 2025-05-08
|
|
7
|
+
* @version 1.0.0
|
|
8
|
+
* @license Apache-2.0
|
|
9
|
+
*
|
|
10
|
+
* Copyright 2025, 2026, 2027 Luca Liguori.
|
|
11
|
+
*
|
|
12
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
13
|
+
* you may not use this file except in compliance with the License.
|
|
14
|
+
* You may obtain a copy of the License at
|
|
15
|
+
*
|
|
16
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
17
|
+
*
|
|
18
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
19
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
20
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
21
|
+
* See the License for the specific language governing permissions and
|
|
22
|
+
* limitations under the License. *
|
|
23
|
+
*/
|
|
24
|
+
/**
|
|
25
|
+
6.2.2. Device Attestation Certificate (DAC)
|
|
26
|
+
All commissionable Matter Nodes SHALL include a Device Attestation Certificate (DAC) and corresponding
|
|
27
|
+
private key, unique to that Device. The DAC is used in the Device Attestation process, as
|
|
28
|
+
part of Commissioning a Commissionee into a Fabric. The DAC SHALL be a DER-encoded X.509v3-
|
|
29
|
+
compliant certificate as defined in RFC 5280 and SHALL be issued by a Product Attestation Intermediate
|
|
30
|
+
(PAI) that chains directly to an approved Product Attestation Authority (PAA), and therefore
|
|
31
|
+
SHALL have a certification path length of 2.
|
|
32
|
+
*/
|
|
33
|
+
/**
|
|
34
|
+
* Matter R1.4 — “Certificate Common Conventions” (Table 62)
|
|
35
|
+
* ---------------------------------------------------------
|
|
36
|
+
* Object identifiers for the Matter–specific Relative-Distinguished-Name (RDN)
|
|
37
|
+
* attributes that may appear in X.509 Subject / Issuer DNs as UTF8String or
|
|
38
|
+
* PrintableString encoded scalars.
|
|
39
|
+
*/
|
|
40
|
+
export interface MatterOidInfo {
|
|
41
|
+
/** Dot-notation OID, e.g. "1.3.6.1.4.1.37244.4.1.1" */
|
|
42
|
+
readonly oid: string;
|
|
43
|
+
/** Maximum scalar length in *octets* (see Matter 1.4, §6.1.1) */
|
|
44
|
+
readonly maxOctets: number;
|
|
45
|
+
/** Fixed string length in the DN (hexadecimal, upper-case) */
|
|
46
|
+
readonly dnStringLen: number;
|
|
47
|
+
/** Allowed ASN.1 string types when encoded in DER */
|
|
48
|
+
readonly asn1Types: readonly ('UTF8String' | 'PrintableString')[];
|
|
49
|
+
}
|
|
50
|
+
export declare const MatterOids: {
|
|
51
|
+
/** 17 — matter-node-id */
|
|
52
|
+
readonly nodeId: {
|
|
53
|
+
readonly oid: "1.3.6.1.4.1.37244.4.1.1";
|
|
54
|
+
readonly maxOctets: 8;
|
|
55
|
+
readonly dnStringLen: 16;
|
|
56
|
+
readonly asn1Types: readonly ["UTF8String"];
|
|
57
|
+
};
|
|
58
|
+
/** 18 — matter-firmware-signing-id */
|
|
59
|
+
readonly firmwareSigningId: {
|
|
60
|
+
readonly oid: "1.3.6.1.4.1.37244.4.1.2";
|
|
61
|
+
readonly maxOctets: 8;
|
|
62
|
+
readonly dnStringLen: 16;
|
|
63
|
+
readonly asn1Types: readonly ["UTF8String"];
|
|
64
|
+
};
|
|
65
|
+
/** 19 — matter-icac-id */
|
|
66
|
+
readonly icacId: {
|
|
67
|
+
readonly oid: "1.3.6.1.4.1.37244.4.1.3";
|
|
68
|
+
readonly maxOctets: 8;
|
|
69
|
+
readonly dnStringLen: 16;
|
|
70
|
+
readonly asn1Types: readonly ["UTF8String"];
|
|
71
|
+
};
|
|
72
|
+
/** 20 — matter-rcac-id */
|
|
73
|
+
readonly rcacId: {
|
|
74
|
+
readonly oid: "1.3.6.1.4.1.37244.4.1.4";
|
|
75
|
+
readonly maxOctets: 8;
|
|
76
|
+
readonly dnStringLen: 16;
|
|
77
|
+
readonly asn1Types: readonly ["UTF8String"];
|
|
78
|
+
};
|
|
79
|
+
/** 21 — matter-fabric-id */
|
|
80
|
+
readonly fabricId: {
|
|
81
|
+
readonly oid: "1.3.6.1.4.1.37244.4.1.5";
|
|
82
|
+
readonly maxOctets: 8;
|
|
83
|
+
readonly dnStringLen: 16;
|
|
84
|
+
readonly asn1Types: readonly ["UTF8String"];
|
|
85
|
+
};
|
|
86
|
+
/** 22 — matter-noc-cat */
|
|
87
|
+
readonly nocCat: {
|
|
88
|
+
readonly oid: "1.3.6.1.4.1.37244.4.1.6";
|
|
89
|
+
readonly maxOctets: 4;
|
|
90
|
+
readonly dnStringLen: 8;
|
|
91
|
+
readonly asn1Types: readonly ["UTF8String"];
|
|
92
|
+
};
|
|
93
|
+
/** matter-oid-vid (Vendor ID) */
|
|
94
|
+
readonly vendorId: {
|
|
95
|
+
readonly oid: "1.3.6.1.4.1.37244.2.1";
|
|
96
|
+
readonly maxOctets: 2;
|
|
97
|
+
readonly dnStringLen: 4;
|
|
98
|
+
readonly asn1Types: readonly ["UTF8String", "PrintableString"];
|
|
99
|
+
};
|
|
100
|
+
/** matter-oid-pid (Product ID) */
|
|
101
|
+
readonly productId: {
|
|
102
|
+
readonly oid: "1.3.6.1.4.1.37244.2.2";
|
|
103
|
+
readonly maxOctets: 2;
|
|
104
|
+
readonly dnStringLen: 4;
|
|
105
|
+
readonly asn1Types: readonly ["UTF8String", "PrintableString"];
|
|
106
|
+
};
|
|
107
|
+
};
|
|
108
|
+
export declare const oid2Key: Record<string, keyof typeof MatterOids>;
|
|
109
|
+
/**
|
|
110
|
+
* Return the canonical Matter key (e.g. `"nodeId"`) for an arbitrary OID string,
|
|
111
|
+
* or `undefined` if the OID is not part of the Matter RDN set.
|
|
112
|
+
*
|
|
113
|
+
* @param {string} oid The OID string to look up (e.g. "1.3.6.1.4.1.37244.4.1.1")
|
|
114
|
+
*
|
|
115
|
+
* @returns {keyof typeof MatterOids | undefined} The corresponding Matter key, or `undefined` if not found
|
|
116
|
+
*/
|
|
117
|
+
export declare function matterKeyFromOid(oid: string): keyof typeof MatterOids | undefined;
|
|
118
|
+
type DistinguishedName = Record<string, string>;
|
|
119
|
+
type Hex = string;
|
|
120
|
+
export interface DecodedCertificate {
|
|
121
|
+
/** Subject — e.g. { CN: "Matter Test PAA", O: "…" } */
|
|
122
|
+
subject: DistinguishedName;
|
|
123
|
+
/** Issuer — usually identical for a self-signed root */
|
|
124
|
+
issuer: DistinguishedName;
|
|
125
|
+
/** Serial number as hexadecimal (uppercase, no “0x” prefix) */
|
|
126
|
+
serialNumber: string;
|
|
127
|
+
/** UTC “not before” date */
|
|
128
|
+
notBefore: Date;
|
|
129
|
+
/** UTC “not after” date */
|
|
130
|
+
notAfter: Date;
|
|
131
|
+
/** Public key (SPKI) in PEM form */
|
|
132
|
+
publicKeyPEM: string;
|
|
133
|
+
fingerprintSHA256?: Hex;
|
|
134
|
+
signatureAlgorithm?: string;
|
|
135
|
+
keyUsage?: string[];
|
|
136
|
+
basicConstraints?: {
|
|
137
|
+
ca: boolean;
|
|
138
|
+
pathLen?: number;
|
|
139
|
+
};
|
|
140
|
+
authorityKeyId?: Hex;
|
|
141
|
+
subjectKeyId?: Hex;
|
|
142
|
+
rawDER?: Buffer;
|
|
143
|
+
}
|
|
144
|
+
/**
|
|
145
|
+
* Decode a PEM-encoded X.509 certificate and return the most useful fields.
|
|
146
|
+
*
|
|
147
|
+
* @param {string} pem X.509 certificate in PEM form (may contain other PEM blocks)
|
|
148
|
+
* @param {string} [debug] Optional debug label for logging
|
|
149
|
+
* @throws {Error} If no CERTIFICATE block is found or the input is invalid
|
|
150
|
+
* @returns {DecodedCertificate} An object with the decoded certificate information:
|
|
151
|
+
*/
|
|
152
|
+
export declare function decodeX509Certificate(pem: string, debug?: string): DecodedCertificate;
|
|
153
|
+
export interface DecodedEcPrivateKey {
|
|
154
|
+
/** PEM block exactly as supplied (useful for re-export) */
|
|
155
|
+
pem: string;
|
|
156
|
+
/** Curve name, e.g. 'prime256v1' (secp256r1) */
|
|
157
|
+
curve: string;
|
|
158
|
+
/** Private scalar *d* in hex (uppercase, no “0x”) */
|
|
159
|
+
dHex: string;
|
|
160
|
+
/** Public key derived from the private part, SPKI/PEM form */
|
|
161
|
+
publicKeyPEM: string;
|
|
162
|
+
}
|
|
163
|
+
/**
|
|
164
|
+
* Decode an EC private key PEM (PKCS#8 or SEC1) and expose the essentials.
|
|
165
|
+
*
|
|
166
|
+
* @param {string} pem The key in PEM form (may contain extra blocks)
|
|
167
|
+
* @returns {DecodedEcPrivateKey} An object with the decoded key information:
|
|
168
|
+
* @throws {Error} If no EC PRIVATE KEY / PRIVATE KEY block is found
|
|
169
|
+
*/
|
|
170
|
+
export declare function decodeEcPrivateKey(pem: string): DecodedEcPrivateKey;
|
|
171
|
+
/**
|
|
172
|
+
* Convert a DER-encoded certificate (hex or base64) to PEM format.
|
|
173
|
+
*
|
|
174
|
+
* @param {string} hex DER-encoded certificate in hex or base64 form
|
|
175
|
+
* @throws {Error} If the input is not valid DER
|
|
176
|
+
* @returns {string} PEM-encoded certificate
|
|
177
|
+
*/
|
|
178
|
+
export declare function derHexToPem(hex: string): string;
|
|
179
|
+
export {};
|
|
180
|
+
//# sourceMappingURL=attestationDecoder.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"attestationDecoder.d.ts","sourceRoot":"","sources":["../../src/crypto/attestationDecoder.ts"],"names":[],"mappings":"AACA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAIH;;;;;;;;GAQG;AAEH;;;;;;GAMG;AAEH,MAAM,WAAW,aAAa;IAC5B,uDAAuD;IACvD,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,iEAAiE;IACjE,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,8DAA8D;IAC9D,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,qDAAqD;IACrD,QAAQ,CAAC,SAAS,EAAE,SAAS,CAAC,YAAY,GAAG,iBAAiB,CAAC,EAAE,CAAC;CACnE;AAGD,eAAO,MAAM,UAAU;IACrB,0BAA0B;;;;;;;IAE1B,sCAAsC;;;;;;;IAEtC,0BAA0B;;;;;;;IAE1B,0BAA0B;;;;;;;IAE1B,4BAA4B;;;;;;;IAE5B,0BAA0B;;;;;;;IAE1B,iCAAiC;;;;;;;IAEjC,kCAAkC;;;;;;;CAEc,CAAC;AAMnD,eAAO,MAAM,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,OAAO,UAAU,CAO3D,CAAC;AAEF;;;;;;;GAOG;AACH,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,OAAO,UAAU,GAAG,SAAS,CAEjF;AAED,KAAK,iBAAiB,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;AAChD,KAAK,GAAG,GAAG,MAAM,CAAC;AAElB,MAAM,WAAW,kBAAkB;IACjC,uDAAuD;IACvD,OAAO,EAAE,iBAAiB,CAAC;IAC3B,wDAAwD;IACxD,MAAM,EAAE,iBAAiB,CAAC;IAC1B,+DAA+D;IAC/D,YAAY,EAAE,MAAM,CAAC;IACrB,4BAA4B;IAC5B,SAAS,EAAE,IAAI,CAAC;IAChB,2BAA2B;IAC3B,QAAQ,EAAE,IAAI,CAAC;IACf,oCAAoC;IACpC,YAAY,EAAE,MAAM,CAAC;IAGrB,iBAAiB,CAAC,EAAE,GAAG,CAAC;IACxB,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;IACpB,gBAAgB,CAAC,EAAE;QAAE,EAAE,EAAE,OAAO,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IACrD,cAAc,CAAC,EAAE,GAAG,CAAC;IACrB,YAAY,CAAC,EAAE,GAAG,CAAC;IACnB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AA4BD;;;;;;;GAOG;AACH,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,kBAAkB,CAyBrF;AAED,MAAM,WAAW,mBAAmB;IAClC,2DAA2D;IAC3D,GAAG,EAAE,MAAM,CAAC;IACZ,gDAAgD;IAChD,KAAK,EAAE,MAAM,CAAC;IACd,qDAAqD;IACrD,IAAI,EAAE,MAAM,CAAC;IACb,8DAA8D;IAC9D,YAAY,EAAE,MAAM,CAAC;CACtB;AAED;;;;;;GAMG;AACH,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,MAAM,GAAG,mBAAmB,CA4BnE;AAED;;;;;;GAMG;AACH,wBAAgB,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAmB/C"}
|
|
@@ -0,0 +1,176 @@
|
|
|
1
|
+
/* eslint-disable no-console */
|
|
2
|
+
/**
|
|
3
|
+
* This file contains the Device Attestation Certificate (DAC) functions.
|
|
4
|
+
*
|
|
5
|
+
* @file attestationDecoder.ts
|
|
6
|
+
* @author Luca Liguori
|
|
7
|
+
* @created 2025-05-08
|
|
8
|
+
* @version 1.0.0
|
|
9
|
+
* @license Apache-2.0
|
|
10
|
+
*
|
|
11
|
+
* Copyright 2025, 2026, 2027 Luca Liguori.
|
|
12
|
+
*
|
|
13
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
14
|
+
* you may not use this file except in compliance with the License.
|
|
15
|
+
* You may obtain a copy of the License at
|
|
16
|
+
*
|
|
17
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
18
|
+
*
|
|
19
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
20
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
21
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
22
|
+
* See the License for the specific language governing permissions and
|
|
23
|
+
* limitations under the License. *
|
|
24
|
+
*/
|
|
25
|
+
import { X509Certificate, createPrivateKey, createPublicKey } from 'node:crypto';
|
|
26
|
+
/* prettier-ignore */
|
|
27
|
+
export const MatterOids = {
|
|
28
|
+
/** 17 — matter-node-id */
|
|
29
|
+
nodeId: { oid: '1.3.6.1.4.1.37244.4.1.1', maxOctets: 8, dnStringLen: 16, asn1Types: ['UTF8String'] },
|
|
30
|
+
/** 18 — matter-firmware-signing-id */
|
|
31
|
+
firmwareSigningId: { oid: '1.3.6.1.4.1.37244.4.1.2', maxOctets: 8, dnStringLen: 16, asn1Types: ['UTF8String'] },
|
|
32
|
+
/** 19 — matter-icac-id */
|
|
33
|
+
icacId: { oid: '1.3.6.1.4.1.37244.4.1.3', maxOctets: 8, dnStringLen: 16, asn1Types: ['UTF8String'] },
|
|
34
|
+
/** 20 — matter-rcac-id */
|
|
35
|
+
rcacId: { oid: '1.3.6.1.4.1.37244.4.1.4', maxOctets: 8, dnStringLen: 16, asn1Types: ['UTF8String'] },
|
|
36
|
+
/** 21 — matter-fabric-id */
|
|
37
|
+
fabricId: { oid: '1.3.6.1.4.1.37244.4.1.5', maxOctets: 8, dnStringLen: 16, asn1Types: ['UTF8String'] },
|
|
38
|
+
/** 22 — matter-noc-cat */
|
|
39
|
+
nocCat: { oid: '1.3.6.1.4.1.37244.4.1.6', maxOctets: 4, dnStringLen: 8, asn1Types: ['UTF8String'] },
|
|
40
|
+
/** matter-oid-vid (Vendor ID) */
|
|
41
|
+
vendorId: { oid: '1.3.6.1.4.1.37244.2.1', maxOctets: 2, dnStringLen: 4, asn1Types: ['UTF8String', 'PrintableString'] },
|
|
42
|
+
/** matter-oid-pid (Product ID) */
|
|
43
|
+
productId: { oid: '1.3.6.1.4.1.37244.2.2', maxOctets: 2, dnStringLen: 4, asn1Types: ['UTF8String', 'PrintableString'] },
|
|
44
|
+
};
|
|
45
|
+
/* ──────────────────────────────────────────────────────────────────────────
|
|
46
|
+
* Quick look-up: OID → canonical Matter key (e.g. "1.3.6.1.4.1.37244.4.1.1"
|
|
47
|
+
* ⇒ "nodeId").
|
|
48
|
+
* ------------------------------------------------------------------------- */
|
|
49
|
+
export const oid2Key = Object.keys(MatterOids).reduce((acc, key) => {
|
|
50
|
+
const oid = MatterOids[key].oid;
|
|
51
|
+
acc[oid] = key;
|
|
52
|
+
return acc;
|
|
53
|
+
}, {});
|
|
54
|
+
/**
|
|
55
|
+
* Return the canonical Matter key (e.g. `"nodeId"`) for an arbitrary OID string,
|
|
56
|
+
* or `undefined` if the OID is not part of the Matter RDN set.
|
|
57
|
+
*
|
|
58
|
+
* @param {string} oid The OID string to look up (e.g. "1.3.6.1.4.1.37244.4.1.1")
|
|
59
|
+
*
|
|
60
|
+
* @returns {keyof typeof MatterOids | undefined} The corresponding Matter key, or `undefined` if not found
|
|
61
|
+
*/
|
|
62
|
+
export function matterKeyFromOid(oid) {
|
|
63
|
+
return oid2Key[oid];
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
*
|
|
67
|
+
* Parse a Distinguished Name (DN) string into a structured object.
|
|
68
|
+
*
|
|
69
|
+
* @param {string} dn The DN string to parse (e.g. "CN=Test, O=Example")
|
|
70
|
+
* @returns {DistinguishedName} An object mapping attribute names to their values
|
|
71
|
+
*/
|
|
72
|
+
function parseDN(dn) {
|
|
73
|
+
// split on comma **or** newline, skip empty fragments
|
|
74
|
+
const rdns = dn.split(/\s*(?:,|\n)+\s*/).filter(Boolean);
|
|
75
|
+
const entries = rdns.map((rdn) => {
|
|
76
|
+
const [attr, ...rest] = rdn.split('=');
|
|
77
|
+
return [attr.trim(), rest.join('=').trim()];
|
|
78
|
+
});
|
|
79
|
+
const obj = Object.fromEntries(entries);
|
|
80
|
+
// Map Matter-specific OIDs to their canonical keys (vid, pid, …)
|
|
81
|
+
for (const [attr, value] of entries) {
|
|
82
|
+
const mk = matterKeyFromOid(attr);
|
|
83
|
+
if (mk)
|
|
84
|
+
obj[mk] = value;
|
|
85
|
+
}
|
|
86
|
+
return obj;
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* Decode a PEM-encoded X.509 certificate and return the most useful fields.
|
|
90
|
+
*
|
|
91
|
+
* @param {string} pem X.509 certificate in PEM form (may contain other PEM blocks)
|
|
92
|
+
* @param {string} [debug] Optional debug label for logging
|
|
93
|
+
* @throws {Error} If no CERTIFICATE block is found or the input is invalid
|
|
94
|
+
* @returns {DecodedCertificate} An object with the decoded certificate information:
|
|
95
|
+
*/
|
|
96
|
+
export function decodeX509Certificate(pem, debug) {
|
|
97
|
+
// Extract the first CERTIFICATE block we find
|
|
98
|
+
const block = /-----BEGIN CERTIFICATE-----[^-]+-----END CERTIFICATE-----/s.exec(pem);
|
|
99
|
+
if (!block)
|
|
100
|
+
throw new Error('No CERTIFICATE block found in the supplied PEM data');
|
|
101
|
+
// Let 'node:crypto' do the magic
|
|
102
|
+
const cert = new X509Certificate(block[0]);
|
|
103
|
+
// Re-encode the public key as PEM so we can re-use it easily
|
|
104
|
+
const publicKeyPEM = cert.publicKey.export({
|
|
105
|
+
type: 'spki',
|
|
106
|
+
format: 'pem',
|
|
107
|
+
});
|
|
108
|
+
const decoded = {
|
|
109
|
+
subject: parseDN(cert.subject),
|
|
110
|
+
issuer: parseDN(cert.issuer),
|
|
111
|
+
serialNumber: cert.serialNumber.toUpperCase(),
|
|
112
|
+
notBefore: new Date(cert.validFrom),
|
|
113
|
+
notAfter: new Date(cert.validTo),
|
|
114
|
+
publicKeyPEM,
|
|
115
|
+
// fingerprintSHA256: cert.fingerprint256.replace(/:/g, ''),
|
|
116
|
+
};
|
|
117
|
+
if (debug)
|
|
118
|
+
console.log(`Decoded ${debug}:\n`, decoded);
|
|
119
|
+
return decoded;
|
|
120
|
+
}
|
|
121
|
+
/**
|
|
122
|
+
* Decode an EC private key PEM (PKCS#8 or SEC1) and expose the essentials.
|
|
123
|
+
*
|
|
124
|
+
* @param {string} pem The key in PEM form (may contain extra blocks)
|
|
125
|
+
* @returns {DecodedEcPrivateKey} An object with the decoded key information:
|
|
126
|
+
* @throws {Error} If no EC PRIVATE KEY / PRIVATE KEY block is found
|
|
127
|
+
*/
|
|
128
|
+
export function decodeEcPrivateKey(pem) {
|
|
129
|
+
const keyBlock = /-----BEGIN (?:EC )?PRIVATE KEY-----[^-]+-----END (?:EC )?PRIVATE KEY-----/s.exec(pem);
|
|
130
|
+
if (!keyBlock)
|
|
131
|
+
throw new Error('No EC PRIVATE KEY block found in the supplied PEM');
|
|
132
|
+
// -- Private key material ---------------------------------------------------
|
|
133
|
+
const priv = createPrivateKey(keyBlock[0]);
|
|
134
|
+
const curve = priv.asymmetricKeyDetails.namedCurve;
|
|
135
|
+
// Grab the raw 32-byte scalar “d” (works for P-256)
|
|
136
|
+
const pkcs8Der = priv.export({ format: 'der', type: 'pkcs8' });
|
|
137
|
+
const d = pkcs8Der
|
|
138
|
+
.subarray(pkcs8Der.length - 32)
|
|
139
|
+
.toString('hex')
|
|
140
|
+
.toUpperCase();
|
|
141
|
+
// -- Derive & export the matching public key --------------------------------
|
|
142
|
+
const publicKeyPEM = createPublicKey(priv).export({
|
|
143
|
+
format: 'pem',
|
|
144
|
+
type: 'spki',
|
|
145
|
+
});
|
|
146
|
+
return {
|
|
147
|
+
pem: keyBlock[0],
|
|
148
|
+
curve,
|
|
149
|
+
dHex: d,
|
|
150
|
+
publicKeyPEM,
|
|
151
|
+
};
|
|
152
|
+
}
|
|
153
|
+
/**
|
|
154
|
+
* Convert a DER-encoded certificate (hex or base64) to PEM format.
|
|
155
|
+
*
|
|
156
|
+
* @param {string} hex DER-encoded certificate in hex or base64 form
|
|
157
|
+
* @throws {Error} If the input is not valid DER
|
|
158
|
+
* @returns {string} PEM-encoded certificate
|
|
159
|
+
*/
|
|
160
|
+
export function derHexToPem(hex) {
|
|
161
|
+
// 1️⃣ sanitise → drop whitespace & optional “0x”
|
|
162
|
+
const clean = hex.replace(/[^0-9a-f]/gi, '');
|
|
163
|
+
if (clean.length % 2 !== 0) {
|
|
164
|
+
throw new Error('Hex string has an odd length — not valid DER');
|
|
165
|
+
}
|
|
166
|
+
// 2️⃣ hex → Buffer
|
|
167
|
+
const der = Buffer.from(clean, 'hex');
|
|
168
|
+
// 3️⃣ Buffer → Base64 → insert \n every 64 chars (RFC 7468)
|
|
169
|
+
const b64Wrapped = der
|
|
170
|
+
.toString('base64')
|
|
171
|
+
.replace(/(.{64})/g, '$1\n')
|
|
172
|
+
.replace(/\n+$/, ''); // strip trailing newline
|
|
173
|
+
// 4️⃣ wrap with PEM armor
|
|
174
|
+
return `-----BEGIN CERTIFICATE-----\n${b64Wrapped}\n-----END CERTIFICATE-----\n`;
|
|
175
|
+
}
|
|
176
|
+
//# sourceMappingURL=attestationDecoder.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"attestationDecoder.js","sourceRoot":"","sources":["../../src/crypto/attestationDecoder.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* This file contains the Certification Declaration functions.
|
|
3
|
+
*
|
|
4
|
+
* @file certificate.ts
|
|
5
|
+
* @author Luca Liguori
|
|
6
|
+
* created 2025-05-08
|
|
7
|
+
* version 1.0.0
|
|
8
|
+
*
|
|
9
|
+
* Copyright 2025, 2026, 2027 Luca Liguori.
|
|
10
|
+
*
|
|
11
|
+
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
12
|
+
* you may not use this file except in compliance with the License.
|
|
13
|
+
* You may obtain a copy of the License at
|
|
14
|
+
*
|
|
15
|
+
* http://www.apache.org/licenses/LICENSE-2.0
|
|
16
|
+
*
|
|
17
|
+
* Unless required by applicable law or agreed to in writing, software
|
|
18
|
+
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
19
|
+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
20
|
+
* See the License for the specific language governing permissions and
|
|
21
|
+
* limitations under the License. *
|
|
22
|
+
*/
|
|
23
|
+
/**
|
|
24
|
+
* Decode a Matter Certification Declaration (CD) without external deps.
|
|
25
|
+
*
|
|
26
|
+
* Works on:
|
|
27
|
+
* • raw DER (Buffer or Uint8Array)
|
|
28
|
+
* • base-64 string
|
|
29
|
+
* • hex string (whitespace / “0x” are tolerated)
|
|
30
|
+
*
|
|
31
|
+
* Returns only the TLV payload. Does **NOT** verify the CMS signature.
|
|
32
|
+
*
|
|
33
|
+
* Connectivity Standards Alliance — Matter 1.4, § 6.3
|
|
34
|
+
* --------------------------------------------------------------------
|
|
35
|
+
*/
|
|
36
|
+
/**
|
|
37
|
+
* Decode a Matter Certification-Declaration (CMS Signed-Data → TLV payload)
|
|
38
|
+
* without external dependencies.
|
|
39
|
+
*
|
|
40
|
+
* © 2025 Luca Liguori – Apache-2.0
|
|
41
|
+
*/
|
|
42
|
+
export interface CertificationDeclaration {
|
|
43
|
+
formatVersion: number;
|
|
44
|
+
vendorId: number;
|
|
45
|
+
productIds: number[];
|
|
46
|
+
deviceTypeId: number;
|
|
47
|
+
certificateId: string;
|
|
48
|
+
securityLevel: number;
|
|
49
|
+
securityInformation: number;
|
|
50
|
+
versionNumber: number;
|
|
51
|
+
certificationType: number;
|
|
52
|
+
dacOriginVid?: number;
|
|
53
|
+
dacOriginPid?: number;
|
|
54
|
+
authorizedPaaList?: string[];
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Parse the Matter-TLV payload according to spec §6.3.
|
|
58
|
+
*
|
|
59
|
+
* @param {Buffer} tlv - The TLV payload to decode.
|
|
60
|
+
* @param {boolean} [debug] - Enable debug output.
|
|
61
|
+
* @returns {CertificationDeclaration} The decoded Certification Declaration.
|
|
62
|
+
*/
|
|
63
|
+
export declare function decodeCdTlv(tlv: Buffer, debug?: boolean): CertificationDeclaration;
|
|
64
|
+
/**
|
|
65
|
+
* Decode a Matter Certification-Declaration.
|
|
66
|
+
*
|
|
67
|
+
* @param {Buffer | Uint8Array | string} src - The source data to decode.
|
|
68
|
+
* @param {boolean} [debug] - Enable debug output.
|
|
69
|
+
* @returns {CertificationDeclaration} The decoded Certification Declaration.
|
|
70
|
+
*/
|
|
71
|
+
export declare function decodeCertificationDeclaration(src: Buffer | Uint8Array | string, debug?: boolean): CertificationDeclaration;
|
|
72
|
+
//# sourceMappingURL=declarationDecoder.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"declarationDecoder.d.ts","sourceRoot":"","sources":["../../src/crypto/declarationDecoder.ts"],"names":[],"mappings":"AAGA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAyEH;;;;;;;;;;;;GAYG;AAKH;;;;;GAKG;AAEH,MAAM,WAAW,wBAAwB;IACvC,aAAa,EAAE,MAAM,CAAC;IACtB,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,YAAY,EAAE,MAAM,CAAC;IACrB,aAAa,EAAE,MAAM,CAAC;IACtB,aAAa,EAAE,MAAM,CAAC;IACtB,mBAAmB,EAAE,MAAM,CAAC;IAC5B,aAAa,EAAE,MAAM,CAAC;IACtB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,iBAAiB,CAAC,EAAE,MAAM,EAAE,CAAC;CAC9B;AA6ED;;;;;;GAMG;AACH,wBAAgB,WAAW,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,UAAQ,GAAG,wBAAwB,CA6GhF;AAED;;;;;;GAMG;AACH,wBAAgB,8BAA8B,CAAC,GAAG,EAAE,MAAM,GAAG,UAAU,GAAG,MAAM,EAAE,KAAK,UAAQ,GAAG,wBAAwB,CAUzH"}
|