@matter/general 0.15.0-alpha.0-20250613-a55f991d4 → 0.15.0-alpha.0-20250616-4b3754906
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/crypto/Crypto.d.ts +21 -47
- package/dist/cjs/crypto/Crypto.d.ts.map +1 -1
- package/dist/cjs/crypto/Crypto.js +24 -101
- package/dist/cjs/crypto/Crypto.js.map +1 -1
- package/dist/cjs/crypto/MockCrypto.d.ts +24 -0
- package/dist/cjs/crypto/MockCrypto.d.ts.map +1 -0
- package/dist/cjs/crypto/MockCrypto.js +61 -0
- package/dist/cjs/crypto/MockCrypto.js.map +6 -0
- package/dist/cjs/crypto/Spake2p.d.ts +6 -7
- package/dist/cjs/crypto/Spake2p.d.ts.map +1 -1
- package/dist/cjs/crypto/Spake2p.js +29 -24
- package/dist/cjs/crypto/Spake2p.js.map +1 -1
- package/dist/cjs/crypto/StandardCrypto.d.ts +2 -2
- package/dist/cjs/crypto/StandardCrypto.d.ts.map +1 -1
- package/dist/cjs/crypto/StandardCrypto.js +4 -8
- package/dist/cjs/crypto/StandardCrypto.js.map +1 -1
- package/dist/cjs/crypto/index.d.ts +1 -1
- package/dist/cjs/crypto/index.d.ts.map +1 -1
- package/dist/cjs/crypto/index.js +1 -1
- package/dist/cjs/crypto/index.js.map +1 -1
- package/dist/cjs/util/Bytes.d.ts +1 -0
- package/dist/cjs/util/Bytes.d.ts.map +1 -1
- package/dist/cjs/util/Bytes.js +22 -0
- package/dist/cjs/util/Bytes.js.map +1 -1
- package/dist/esm/crypto/Crypto.d.ts +21 -47
- package/dist/esm/crypto/Crypto.d.ts.map +1 -1
- package/dist/esm/crypto/Crypto.js +24 -101
- package/dist/esm/crypto/Crypto.js.map +1 -1
- package/dist/esm/crypto/MockCrypto.d.ts +24 -0
- package/dist/esm/crypto/MockCrypto.d.ts.map +1 -0
- package/dist/esm/crypto/MockCrypto.js +41 -0
- package/dist/esm/crypto/MockCrypto.js.map +6 -0
- package/dist/esm/crypto/Spake2p.d.ts +6 -7
- package/dist/esm/crypto/Spake2p.d.ts.map +1 -1
- package/dist/esm/crypto/Spake2p.js +30 -25
- package/dist/esm/crypto/Spake2p.js.map +1 -1
- package/dist/esm/crypto/StandardCrypto.d.ts +2 -2
- package/dist/esm/crypto/StandardCrypto.d.ts.map +1 -1
- package/dist/esm/crypto/StandardCrypto.js +4 -8
- package/dist/esm/crypto/StandardCrypto.js.map +1 -1
- package/dist/esm/crypto/index.d.ts +1 -1
- package/dist/esm/crypto/index.d.ts.map +1 -1
- package/dist/esm/crypto/index.js +1 -1
- package/dist/esm/util/Bytes.d.ts +1 -0
- package/dist/esm/util/Bytes.d.ts.map +1 -1
- package/dist/esm/util/Bytes.js +22 -0
- package/dist/esm/util/Bytes.js.map +1 -1
- package/package.json +2 -2
- package/src/crypto/Crypto.ts +46 -146
- package/src/crypto/MockCrypto.ts +64 -0
- package/src/crypto/Spake2p.ts +30 -24
- package/src/crypto/StandardCrypto.ts +6 -10
- package/src/crypto/index.ts +1 -1
- package/src/util/Bytes.ts +22 -0
- package/dist/cjs/crypto/nonentropic.d.ts +0 -16
- package/dist/cjs/crypto/nonentropic.d.ts.map +0 -1
- package/dist/cjs/crypto/nonentropic.js +0 -70
- package/dist/cjs/crypto/nonentropic.js.map +0 -6
- package/dist/esm/crypto/nonentropic.d.ts +0 -16
- package/dist/esm/crypto/nonentropic.d.ts.map +0 -1
- package/dist/esm/crypto/nonentropic.js +0 -50
- package/dist/esm/crypto/nonentropic.js.map +0 -6
- package/src/crypto/nonentropic.ts +0 -65
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
import { InternalError } from "../MatterError.js";
|
|
7
7
|
import { Bytes, Endian } from "../util/Bytes.js";
|
|
8
8
|
import { DataWriter } from "../util/DataWriter.js";
|
|
9
|
-
import {
|
|
9
|
+
import { ec } from "./Crypto.js";
|
|
10
10
|
import { CRYPTO_GROUP_SIZE_BYTES } from "./CryptoConstants.js";
|
|
11
11
|
const {
|
|
12
12
|
p256: { ProjectivePoint, CURVE: P256_CURVE },
|
|
@@ -18,34 +18,39 @@ const M = ProjectivePoint.fromHex("02886e2f97ace46e55ba9dd7242579f2993b64e16ef3d
|
|
|
18
18
|
const N = ProjectivePoint.fromHex("03d8bbd6c639c62937b04d997f38c3770719c629d7014d49a24b4f98baa1292b49");
|
|
19
19
|
const CRYPTO_W_SIZE_BYTES = CRYPTO_GROUP_SIZE_BYTES + 8;
|
|
20
20
|
class Spake2p {
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
}
|
|
26
|
-
static async computeW0W1({ iterations, salt }, pin) {
|
|
21
|
+
#crypto;
|
|
22
|
+
#context;
|
|
23
|
+
#random;
|
|
24
|
+
#w0;
|
|
25
|
+
static async computeW0W1(crypto, { iterations, salt }, pin) {
|
|
27
26
|
const pinWriter = new DataWriter(Endian.Little);
|
|
28
27
|
pinWriter.writeUInt32(pin);
|
|
29
|
-
const ws = await
|
|
28
|
+
const ws = await crypto.createPbkdf2Key(pinWriter.toByteArray(), salt, iterations, CRYPTO_W_SIZE_BYTES * 2);
|
|
30
29
|
const w0 = mod(bytesToNumberBE(ws.slice(0, 40)), P256_CURVE.n);
|
|
31
30
|
const w1 = mod(bytesToNumberBE(ws.slice(40, 80)), P256_CURVE.n);
|
|
32
31
|
return { w0, w1 };
|
|
33
32
|
}
|
|
34
|
-
static async computeW0L(pbkdfParameters, pin) {
|
|
35
|
-
const { w0, w1 } = await this.computeW0W1(pbkdfParameters, pin);
|
|
33
|
+
static async computeW0L(crypto, pbkdfParameters, pin) {
|
|
34
|
+
const { w0, w1 } = await this.computeW0W1(crypto, pbkdfParameters, pin);
|
|
36
35
|
const L = ProjectivePoint.BASE.multiply(w1).toRawBytes(false);
|
|
37
36
|
return { w0, L };
|
|
38
37
|
}
|
|
39
|
-
static create(context, w0) {
|
|
40
|
-
const random =
|
|
41
|
-
return new Spake2p(context, random, w0);
|
|
38
|
+
static create(crypto, context, w0) {
|
|
39
|
+
const random = crypto.randomBigInt(32, P256_CURVE.Fp.ORDER);
|
|
40
|
+
return new Spake2p(crypto, context, random, w0);
|
|
41
|
+
}
|
|
42
|
+
constructor(crypto, context, random, w0) {
|
|
43
|
+
this.#crypto = crypto;
|
|
44
|
+
this.#context = context;
|
|
45
|
+
this.#random = random;
|
|
46
|
+
this.#w0 = w0;
|
|
42
47
|
}
|
|
43
48
|
computeX() {
|
|
44
|
-
const X = ProjectivePoint.BASE.multiply(this
|
|
49
|
+
const X = ProjectivePoint.BASE.multiply(this.#random).add(M.multiply(this.#w0));
|
|
45
50
|
return X.toRawBytes(false);
|
|
46
51
|
}
|
|
47
52
|
computeY() {
|
|
48
|
-
const Y = ProjectivePoint.BASE.multiply(this
|
|
53
|
+
const Y = ProjectivePoint.BASE.multiply(this.#random).add(N.multiply(this.#w0));
|
|
49
54
|
return Y.toRawBytes(false);
|
|
50
55
|
}
|
|
51
56
|
async computeSecretAndVerifiersFromY(w1, X, Y) {
|
|
@@ -55,8 +60,8 @@ class Spake2p {
|
|
|
55
60
|
} catch (error) {
|
|
56
61
|
throw new InternalError(`Y is not on the curve: ${error.message}`);
|
|
57
62
|
}
|
|
58
|
-
const yNwo = YPoint.add(N.multiply(this
|
|
59
|
-
const Z = yNwo.multiply(this
|
|
63
|
+
const yNwo = YPoint.add(N.multiply(this.#w0).negate());
|
|
64
|
+
const Z = yNwo.multiply(this.#random);
|
|
60
65
|
const V = yNwo.multiply(w1);
|
|
61
66
|
return this.computeSecretAndVerifiers(X, Y, Z.toRawBytes(false), V.toRawBytes(false));
|
|
62
67
|
}
|
|
@@ -68,24 +73,24 @@ class Spake2p {
|
|
|
68
73
|
} catch (error) {
|
|
69
74
|
throw new InternalError(`X is not on the curve: ${error.message}`);
|
|
70
75
|
}
|
|
71
|
-
const Z = XPoint.add(M.multiply(this
|
|
72
|
-
const V = LPoint.multiply(this
|
|
76
|
+
const Z = XPoint.add(M.multiply(this.#w0).negate()).multiply(this.#random);
|
|
77
|
+
const V = LPoint.multiply(this.#random);
|
|
73
78
|
return this.computeSecretAndVerifiers(X, Y, Z.toRawBytes(false), V.toRawBytes(false));
|
|
74
79
|
}
|
|
75
80
|
async computeSecretAndVerifiers(X, Y, Z, V) {
|
|
76
81
|
const TT_HASH = await this.computeTranscriptHash(X, Y, Z, V);
|
|
77
82
|
const Ka = TT_HASH.slice(0, 16);
|
|
78
83
|
const Ke = TT_HASH.slice(16, 32);
|
|
79
|
-
const KcAB = await
|
|
84
|
+
const KcAB = await this.#crypto.createHkdfKey(Ka, new Uint8Array(0), Bytes.fromString("ConfirmationKeys"), 32);
|
|
80
85
|
const KcA = KcAB.slice(0, 16);
|
|
81
86
|
const KcB = KcAB.slice(16, 32);
|
|
82
|
-
const hAY = await
|
|
83
|
-
const hBX = await
|
|
87
|
+
const hAY = await this.#crypto.signHmac(KcA, Y);
|
|
88
|
+
const hBX = await this.#crypto.signHmac(KcB, X);
|
|
84
89
|
return { Ke, hAY, hBX };
|
|
85
90
|
}
|
|
86
91
|
computeTranscriptHash(X, Y, Z, V) {
|
|
87
92
|
const TTwriter = new DataWriter(Endian.Little);
|
|
88
|
-
this.addToContext(TTwriter, this
|
|
93
|
+
this.addToContext(TTwriter, this.#context);
|
|
89
94
|
this.addToContext(TTwriter, Bytes.fromString(""));
|
|
90
95
|
this.addToContext(TTwriter, Bytes.fromString(""));
|
|
91
96
|
this.addToContext(TTwriter, M.toRawBytes(false));
|
|
@@ -94,8 +99,8 @@ class Spake2p {
|
|
|
94
99
|
this.addToContext(TTwriter, Y);
|
|
95
100
|
this.addToContext(TTwriter, Z);
|
|
96
101
|
this.addToContext(TTwriter, V);
|
|
97
|
-
this.addToContext(TTwriter, numberToBytesBE(this
|
|
98
|
-
return
|
|
102
|
+
this.addToContext(TTwriter, numberToBytesBE(this.#w0, 32));
|
|
103
|
+
return this.#crypto.computeSha256(TTwriter.toByteArray());
|
|
99
104
|
}
|
|
100
105
|
addToContext(TTwriter, data) {
|
|
101
106
|
TTwriter.writeUInt64(data.length);
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../src/crypto/Spake2p.ts"],
|
|
4
|
-
"mappings": "AAAA;AAAA;AAAA;AAAA;AAAA;AAMA,SAAS,qBAAqB;AAC9B,SAAS,OAAO,cAAc;AAC9B,SAAS,kBAAkB;AAC3B,
|
|
4
|
+
"mappings": "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",
|
|
5
5
|
"names": []
|
|
6
6
|
}
|
|
@@ -15,10 +15,10 @@ import { PrivateKey, PublicKey } from "./Key.js";
|
|
|
15
15
|
* Web Crypto doesn't support AES-CCM required by Matter so fall back to a JS implementation for that. See relevant
|
|
16
16
|
* warnings in the "aes" subdirectory.
|
|
17
17
|
*/
|
|
18
|
-
export declare class StandardCrypto
|
|
18
|
+
export declare class StandardCrypto extends Crypto {
|
|
19
19
|
implementationName: string;
|
|
20
20
|
static provider(): StandardCrypto;
|
|
21
|
-
|
|
21
|
+
randomBytes(length: number): Uint8Array;
|
|
22
22
|
encrypt(key: Uint8Array, data: Uint8Array, nonce: Uint8Array, associatedData?: Uint8Array): Uint8Array<ArrayBufferLike>;
|
|
23
23
|
decrypt(key: Uint8Array, data: Uint8Array, nonce: Uint8Array, associatedData?: Uint8Array): Uint8Array<ArrayBufferLike>;
|
|
24
24
|
computeSha256(buffer: Uint8Array | Uint8Array[]): Promise<Uint8Array<ArrayBuffer>>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"StandardCrypto.d.ts","sourceRoot":"","sources":["../../../src/crypto/StandardCrypto.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAMH,OAAO,EAAE,MAAM,EAA+B,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAErF,OAAO,EAA2B,UAAU,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAU1E;;;;;;;;GAQG;AACH,qBAAa,cAAe,
|
|
1
|
+
{"version":3,"file":"StandardCrypto.d.ts","sourceRoot":"","sources":["../../../src/crypto/StandardCrypto.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAMH,OAAO,EAAE,MAAM,EAA+B,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAErF,OAAO,EAA2B,UAAU,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAU1E;;;;;;;;GAQG;AACH,qBAAa,cAAe,SAAQ,MAAM;IACtC,kBAAkB,SAAQ;IAE1B,MAAM,CAAC,QAAQ;IAIf,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,UAAU;IAMvC,OAAO,CAAC,GAAG,EAAE,UAAU,EAAE,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,UAAU,EAAE,cAAc,CAAC,EAAE,UAAU;IAKzF,OAAO,CAAC,GAAG,EAAE,UAAU,EAAE,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,UAAU,EAAE,cAAc,CAAC,EAAE,UAAU;IAKnF,aAAa,CAAC,MAAM,EAAE,UAAU,GAAG,UAAU,EAAE;IAO/C,eAAe,CAAC,MAAM,EAAE,UAAU,EAAE,IAAI,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM;IAe1F,aAAa,CACf,MAAM,EAAE,UAAU,EAClB,IAAI,EAAE,UAAU,EAChB,IAAI,EAAE,UAAU,EAChB,MAAM,GAAE,MAAoC;IAgB1C,QAAQ,CAAC,MAAM,EAAE,UAAU,EAAE,IAAI,EAAE,UAAU;IAK7C,SAAS,CAAC,GAAG,EAAE,UAAU,EAAE,IAAI,EAAE,UAAU,GAAG,UAAU,EAAE,EAAE,WAAW,CAAC,EAAE,iBAAiB;IA+B3F,WAAW,CAAC,GAAG,EAAE,UAAU,EAAE,IAAI,EAAE,UAAU,EAAE,SAAS,EAAE,UAAU,EAAE,WAAW,CAAC,EAAE,iBAAiB;IA2BrG,aAAa;IA2Bb,gBAAgB,CAAC,GAAG,EAAE,UAAU,EAAE,OAAO,EAAE,SAAS;CAkC7D"}
|
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
* SPDX-License-Identifier: Apache-2.0
|
|
6
6
|
*/
|
|
7
7
|
import { DerBigUint, DerCodec, DerError } from "#codec/DerCodec.js";
|
|
8
|
-
import {
|
|
8
|
+
import { Environment } from "#environment/Environment.js";
|
|
9
9
|
import { Bytes } from "#util/Bytes.js";
|
|
10
10
|
import { Ccm } from "./aes/Ccm.js";
|
|
11
11
|
import { Crypto, CRYPTO_SYMMETRIC_KEY_LENGTH } from "./Crypto.js";
|
|
@@ -17,12 +17,12 @@ const SIGNATURE_ALGORITHM = {
|
|
|
17
17
|
namedCurve: "P-256",
|
|
18
18
|
hash: { name: "SHA-256" }
|
|
19
19
|
};
|
|
20
|
-
class StandardCrypto {
|
|
20
|
+
class StandardCrypto extends Crypto {
|
|
21
21
|
implementationName = "JS";
|
|
22
22
|
static provider() {
|
|
23
23
|
return new StandardCrypto();
|
|
24
24
|
}
|
|
25
|
-
|
|
25
|
+
randomBytes(length) {
|
|
26
26
|
const result = new Uint8Array(length);
|
|
27
27
|
crypto.getRandomValues(result);
|
|
28
28
|
return result;
|
|
@@ -170,11 +170,6 @@ class StandardCrypto {
|
|
|
170
170
|
return new Uint8Array(secret);
|
|
171
171
|
}
|
|
172
172
|
}
|
|
173
|
-
if (globalThis.crypto?.subtle?.[Symbol.toStringTag] === "SubtleCrypto") {
|
|
174
|
-
Boot.init(() => {
|
|
175
|
-
Crypto.provider = StandardCrypto.provider;
|
|
176
|
-
});
|
|
177
|
-
}
|
|
178
173
|
async function importKey(...params) {
|
|
179
174
|
try {
|
|
180
175
|
return await crypto.subtle.importKey(...params);
|
|
@@ -182,6 +177,7 @@ async function importKey(...params) {
|
|
|
182
177
|
throw new KeyInputError("Invalid key", { cause });
|
|
183
178
|
}
|
|
184
179
|
}
|
|
180
|
+
Environment.default.set(Crypto, new StandardCrypto());
|
|
185
181
|
export {
|
|
186
182
|
StandardCrypto
|
|
187
183
|
};
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../src/crypto/StandardCrypto.ts"],
|
|
4
|
-
"mappings": "AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAOA,SAAS,YAAY,UAAU,gBAAgB;AAC/C,SAAS,
|
|
4
|
+
"mappings": "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",
|
|
5
5
|
"names": []
|
|
6
6
|
}
|
|
@@ -7,7 +7,7 @@ export * from "./Crypto.js";
|
|
|
7
7
|
export * from "./CryptoConstants.js";
|
|
8
8
|
export * from "./CryptoError.js";
|
|
9
9
|
export * from "./Key.js";
|
|
10
|
-
export * from "./
|
|
10
|
+
export * from "./MockCrypto.js";
|
|
11
11
|
export * from "./Spake2p.js";
|
|
12
12
|
export * from "./StandardCrypto.js";
|
|
13
13
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/crypto/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,cAAc,aAAa,CAAC;AAC5B,cAAc,sBAAsB,CAAC;AACrC,cAAc,kBAAkB,CAAC;AACjC,cAAc,UAAU,CAAC;AACzB,cAAc,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/crypto/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,cAAc,aAAa,CAAC;AAC5B,cAAc,sBAAsB,CAAC;AACrC,cAAc,kBAAkB,CAAC;AACjC,cAAc,UAAU,CAAC;AACzB,cAAc,iBAAiB,CAAC;AAChC,cAAc,cAAc,CAAC;AAC7B,cAAc,qBAAqB,CAAC"}
|
package/dist/esm/crypto/index.js
CHANGED
|
@@ -7,7 +7,7 @@ export * from "./Crypto.js";
|
|
|
7
7
|
export * from "./CryptoConstants.js";
|
|
8
8
|
export * from "./CryptoError.js";
|
|
9
9
|
export * from "./Key.js";
|
|
10
|
-
export * from "./
|
|
10
|
+
export * from "./MockCrypto.js";
|
|
11
11
|
export * from "./Spake2p.js";
|
|
12
12
|
export * from "./StandardCrypto.js";
|
|
13
13
|
//# sourceMappingURL=index.js.map
|
package/dist/esm/util/Bytes.d.ts
CHANGED
|
@@ -25,5 +25,6 @@ export declare namespace Bytes {
|
|
|
25
25
|
function fromBase64(base64String: string): Uint8Array<ArrayBuffer>;
|
|
26
26
|
function fromString(string: string): Uint8Array<ArrayBufferLike>;
|
|
27
27
|
function concat(...arrays: Uint8Array[]): Uint8Array;
|
|
28
|
+
function asBigInt(bytes: Uint8Array): bigint;
|
|
28
29
|
}
|
|
29
30
|
//# sourceMappingURL=Bytes.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Bytes.d.ts","sourceRoot":"","sources":["../../../src/util/Bytes.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,oBAAY,MAAM;IACd,MAAM,IAAA;IACN,GAAG,IAAA;CACN;AAED;;;;GAIG;AACH,wBAAgB,EAAE,CAAC,OAAO,EAAE,oBAAoB,EAAE,GAAG,MAAM,EAAE,OAAO,EAAE,2BAYrE;AAED;;GAEG;AACH,yBAAiB,KAAK,CAAC;IACnB,SAAgB,KAAK,CAAC,KAAK,EAAE,UAAU,UAKtC;IAED,SAAgB,QAAQ,CAAC,KAAK,EAAE,UAAU,UAIzC;IAED,SAAgB,UAAU,CAAC,KAAK,EAAE,UAAU,6BAE3C;IAED,SAAgB,QAAQ,CAAC,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,UAAU,WAG9D;IAED,SAAgB,OAAO,CAAC,SAAS,EAAE,MAAM,2BAMxC;IAED,SAAgB,UAAU,CAAC,YAAY,EAAE,MAAM,2BAQ9C;IAED,SAAgB,UAAU,CAAC,MAAM,EAAE,MAAM,+BAExC;IAED,SAAgB,MAAM,CAAC,GAAG,MAAM,EAAE,UAAU,EAAE,GAAG,UAAU,CAU1D;CACJ"}
|
|
1
|
+
{"version":3,"file":"Bytes.d.ts","sourceRoot":"","sources":["../../../src/util/Bytes.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH,oBAAY,MAAM;IACd,MAAM,IAAA;IACN,GAAG,IAAA;CACN;AAED;;;;GAIG;AACH,wBAAgB,EAAE,CAAC,OAAO,EAAE,oBAAoB,EAAE,GAAG,MAAM,EAAE,OAAO,EAAE,2BAYrE;AAED;;GAEG;AACH,yBAAiB,KAAK,CAAC;IACnB,SAAgB,KAAK,CAAC,KAAK,EAAE,UAAU,UAKtC;IAED,SAAgB,QAAQ,CAAC,KAAK,EAAE,UAAU,UAIzC;IAED,SAAgB,UAAU,CAAC,KAAK,EAAE,UAAU,6BAE3C;IAED,SAAgB,QAAQ,CAAC,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,UAAU,WAG9D;IAED,SAAgB,OAAO,CAAC,SAAS,EAAE,MAAM,2BAMxC;IAED,SAAgB,UAAU,CAAC,YAAY,EAAE,MAAM,2BAQ9C;IAED,SAAgB,UAAU,CAAC,MAAM,EAAE,MAAM,+BAExC;IAED,SAAgB,MAAM,CAAC,GAAG,MAAM,EAAE,UAAU,EAAE,GAAG,UAAU,CAU1D;IAED,SAAgB,QAAQ,CAAC,KAAK,EAAE,UAAU,UAoBzC;CACJ"}
|
package/dist/esm/util/Bytes.js
CHANGED
|
@@ -80,6 +80,28 @@ var Bytes;
|
|
|
80
80
|
return result;
|
|
81
81
|
}
|
|
82
82
|
Bytes2.concat = concat;
|
|
83
|
+
function asBigInt(bytes) {
|
|
84
|
+
const view = new DataView(bytes.buffer);
|
|
85
|
+
let result = 0n;
|
|
86
|
+
for (let i = 0; i < bytes.length; ) {
|
|
87
|
+
const remaining = bytes.length - i;
|
|
88
|
+
if (remaining >= 8) {
|
|
89
|
+
result = (result << 64n) + view.getBigUint64(i);
|
|
90
|
+
i += 8;
|
|
91
|
+
} else if (remaining >= 4) {
|
|
92
|
+
result = (result << 32n) + BigInt(view.getUint32(i));
|
|
93
|
+
i += 4;
|
|
94
|
+
} else if (remaining >= 2) {
|
|
95
|
+
result = (result << 16n) + BigInt(view.getUint16(i));
|
|
96
|
+
i += 2;
|
|
97
|
+
} else {
|
|
98
|
+
result = (result << 8n) + BigInt(view.getUint8(i));
|
|
99
|
+
i++;
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
return result;
|
|
103
|
+
}
|
|
104
|
+
Bytes2.asBigInt = asBigInt;
|
|
83
105
|
})(Bytes || (Bytes = {}));
|
|
84
106
|
export {
|
|
85
107
|
Bytes,
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../src/util/Bytes.ts"],
|
|
4
|
-
"mappings": "AAAA;AAAA;AAAA;AAAA;AAAA;AAMA,SAAS,2BAA2B;AAE7B,IAAK,SAAL,kBAAKA,YAAL;AACH,EAAAA,gBAAA;AACA,EAAAA,gBAAA;AAFQ,SAAAA;AAAA,GAAA;AAUL,SAAS,GAAG,YAAkC,QAAmB;AACpE,MAAI,QAAQ,WAAW,KAAK,OAAO,WAAW,GAAG;AAC7C,WAAO,MAAM,QAAQ,QAAQ,CAAC,CAAC;AAAA,EACnC;AACA,QAAM,QAAQ,MAAc;AAC5B,WAAS,IAAI,GAAG,IAAI,QAAQ,QAAQ,KAAK;AACrC,UAAM,KAAK,QAAQ,CAAC,CAAC;AACrB,QAAI,IAAI,OAAO,QAAQ;AACnB,YAAM,KAAK,GAAG,OAAO,CAAC,CAAC,EAAE;AAAA,IAC7B;AAAA,EACJ;AACA,SAAO,MAAM,QAAQ,MAAM,KAAK,EAAE,CAAC;AACvC;AAKO,IAAU;AAAA,CAAV,CAAUC,WAAV;AACI,WAAS,MAAM,OAAmB;AACrC,UAAM,WAAW,IAAI,MAAc;AACnC,aAAS,SAAS,MAAM;AACxB,UAAM,QAAQ,UAAQ,SAAS,KAAK,KAAK,SAAS,EAAE,EAAE,SAAS,GAAG,GAAG,CAAC,CAAC;AACvE,WAAO,SAAS,KAAK,EAAE;AAAA,EAC3B;AALO,EAAAA,OAAS;AAOT,WAAS,SAAS,OAAmB;AACxC,QAAI,SAAS;AACb,UAAM,QAAQ,UAAS,UAAU,OAAO,aAAa,IAAI,CAAE;AAC3D,WAAO,KAAK,MAAM;AAAA,EACtB;AAJO,EAAAA,OAAS;AAMT,WAAS,WAAW,OAAmB;AAC1C,WAAO,IAAI,SAAS,MAAM,QAAQ,MAAM,YAAY,MAAM,UAAU;AAAA,EACxE;AAFO,EAAAA,OAAS;AAIT,WAAS,SAAS,QAAoB,QAAoB;AAC7D,QAAI,OAAO,WAAW,OAAO,OAAQ,QAAO;AAC5C,WAAO,OAAO,MAAM,CAAC,OAAO,UAAU,OAAO,KAAK,MAAM,KAAK;AAAA,EACjE;AAHO,EAAAA,OAAS;AAKT,WAAS,QAAQ,WAAmB;AACvC,QAAI,UAAU,WAAW,EAAG,QAAO,IAAI,WAAW,CAAC;AACnD,QAAI,UAAU,SAAS,MAAM,EAAG,OAAM,IAAI,oBAAoB,wCAAwC;AACtG,UAAM,QAAQ,UAAU,MAAM,SAAS,GAAG,IAAI,aAAW,SAAS,SAAS,EAAE,CAAC;AAC9E,QAAI,UAAU,OAAW,OAAM,IAAI,oBAAoB,iCAAiC;AACxF,WAAO,WAAW,KAAK,KAAK;AAAA,EAChC;AANO,EAAAA,OAAS;AAQT,WAAS,WAAW,cAAsB;AAC7C,UAAM,MAAM,KAAK,YAAY;AAC7B,QAAI,SAAS;AACb,aAAS,IAAI,GAAG,IAAI,IAAI,QAAQ,KAAK;AACjC,YAAM,MAAM,IAAI,WAAW,CAAC,EAAE,SAAS,EAAE;AACzC,gBAAU,IAAI,WAAW,IAAI,MAAM,MAAM;AAAA,IAC7C;AACA,WAAO,QAAQ,MAAM;AAAA,EACzB;AARO,EAAAA,OAAS;AAUT,WAAS,WAAW,QAAgB;AACvC,WAAO,IAAI,YAAY,EAAE,OAAO,MAAM;AAAA,EAC1C;AAFO,EAAAA,OAAS;AAIT,WAAS,UAAU,QAAkC;AACxD,QAAI,SAAS;AACb,WAAO,QAAQ,WAAU,UAAU,MAAM,MAAO;AAChD,UAAM,SAAS,IAAI,WAAW,MAAM;AACpC,QAAI,SAAS;AACb,WAAO,QAAQ,WAAS;AACpB,aAAO,IAAI,OAAO,MAAM;AACxB,gBAAU,MAAM;AAAA,IACpB,CAAC;AACD,WAAO;AAAA,EACX;AAVO,EAAAA,OAAS;AAAA,
|
|
4
|
+
"mappings": "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",
|
|
5
5
|
"names": ["Endian", "Bytes"]
|
|
6
6
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@matter/general",
|
|
3
|
-
"version": "0.15.0-alpha.0-
|
|
3
|
+
"version": "0.15.0-alpha.0-20250616-4b3754906",
|
|
4
4
|
"description": "Non-Matter support for Matter.js",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"iot",
|
|
@@ -36,7 +36,7 @@
|
|
|
36
36
|
"@noble/curves": "^1.9.2"
|
|
37
37
|
},
|
|
38
38
|
"devDependencies": {
|
|
39
|
-
"@matter/testing": "0.15.0-alpha.0-
|
|
39
|
+
"@matter/testing": "0.15.0-alpha.0-20250616-4b3754906"
|
|
40
40
|
},
|
|
41
41
|
"files": [
|
|
42
42
|
"dist/**/*",
|
package/src/crypto/Crypto.ts
CHANGED
|
@@ -4,16 +4,14 @@
|
|
|
4
4
|
* SPDX-License-Identifier: Apache-2.0
|
|
5
5
|
*/
|
|
6
6
|
|
|
7
|
+
import type { Environment } from "#environment/Environment.js";
|
|
7
8
|
import { Diagnostic } from "#log/Diagnostic.js";
|
|
8
9
|
import { Logger } from "#log/Logger.js";
|
|
9
|
-
import {
|
|
10
|
+
import { Bytes } from "#util/Bytes.js";
|
|
10
11
|
import { MaybePromise } from "#util/Promises.js";
|
|
11
12
|
import * as mod from "@noble/curves/abstract/modular";
|
|
12
13
|
import * as utils from "@noble/curves/abstract/utils";
|
|
13
14
|
import { p256 } from "@noble/curves/p256";
|
|
14
|
-
import { NoProviderError } from "../MatterError.js";
|
|
15
|
-
import { Endian } from "../util/Bytes.js";
|
|
16
|
-
import { DataReader } from "../util/DataReader.js";
|
|
17
15
|
import { PrivateKey, PublicKey } from "./Key.js";
|
|
18
16
|
|
|
19
17
|
export const ec = {
|
|
@@ -22,7 +20,6 @@ export const ec = {
|
|
|
22
20
|
...mod,
|
|
23
21
|
};
|
|
24
22
|
|
|
25
|
-
export const CRYPTO_RANDOM_LENGTH = 32;
|
|
26
23
|
export const CRYPTO_ENCRYPT_ALGORITHM = "aes-128-ccm";
|
|
27
24
|
export const CRYPTO_HASH_ALGORITHM = "sha256";
|
|
28
25
|
export const CRYPTO_EC_CURVE = "prime256v1";
|
|
@@ -40,40 +37,40 @@ const logger = Logger.get("Crypto");
|
|
|
40
37
|
* AES-CCM implementation.
|
|
41
38
|
*
|
|
42
39
|
* If your platform does not fully implement Web Crypto, or offers a native implementation of AES-CCM, you can replace
|
|
43
|
-
* {@link
|
|
40
|
+
* the implementation in {@link Environment.default}.
|
|
44
41
|
*
|
|
45
42
|
* WARNING: The standard implementation is unaudited. See relevant warnings in StandardCrypto.ts.
|
|
46
43
|
*/
|
|
47
|
-
export
|
|
44
|
+
export abstract class Crypto {
|
|
48
45
|
/**
|
|
49
46
|
* The name used in log messages.
|
|
50
47
|
*/
|
|
51
|
-
implementationName: string;
|
|
48
|
+
abstract implementationName: string;
|
|
52
49
|
|
|
53
50
|
/**
|
|
54
51
|
* Encrypt using AES-CCM with constants limited to those required by Matter.
|
|
55
52
|
*/
|
|
56
|
-
encrypt(key: Uint8Array, data: Uint8Array, nonce: Uint8Array, aad?: Uint8Array): Uint8Array;
|
|
53
|
+
abstract encrypt(key: Uint8Array, data: Uint8Array, nonce: Uint8Array, aad?: Uint8Array): Uint8Array;
|
|
57
54
|
|
|
58
55
|
/**
|
|
59
56
|
* Decrypt using AES-CCM with constants limited to those required by Matter.
|
|
60
57
|
*/
|
|
61
|
-
decrypt(key: Uint8Array, data: Uint8Array, nonce: Uint8Array, aad?: Uint8Array): Uint8Array;
|
|
58
|
+
abstract decrypt(key: Uint8Array, data: Uint8Array, nonce: Uint8Array, aad?: Uint8Array): Uint8Array;
|
|
62
59
|
|
|
63
60
|
/**
|
|
64
|
-
*
|
|
61
|
+
* Create a random buffer from the most cryptographically-appropriate source available.
|
|
65
62
|
*/
|
|
66
|
-
|
|
63
|
+
abstract randomBytes(length: number): Uint8Array;
|
|
67
64
|
|
|
68
65
|
/**
|
|
69
66
|
* Compute the SHA-256 hash of a buffer.
|
|
70
67
|
*/
|
|
71
|
-
computeSha256(data: Uint8Array | Uint8Array[]): MaybePromise<Uint8Array>;
|
|
68
|
+
abstract computeSha256(data: Uint8Array | Uint8Array[]): MaybePromise<Uint8Array>;
|
|
72
69
|
|
|
73
70
|
/**
|
|
74
71
|
* Create a key from a secret using PBKDF2.
|
|
75
72
|
*/
|
|
76
|
-
createPbkdf2Key(
|
|
73
|
+
abstract createPbkdf2Key(
|
|
77
74
|
secret: Uint8Array,
|
|
78
75
|
salt: Uint8Array,
|
|
79
76
|
iteration: number,
|
|
@@ -83,17 +80,22 @@ export interface Crypto {
|
|
|
83
80
|
/**
|
|
84
81
|
* Create a key from a secret using HKDF.
|
|
85
82
|
*/
|
|
86
|
-
createHkdfKey(
|
|
83
|
+
abstract createHkdfKey(
|
|
84
|
+
secret: Uint8Array,
|
|
85
|
+
salt: Uint8Array,
|
|
86
|
+
info: Uint8Array,
|
|
87
|
+
length?: number,
|
|
88
|
+
): MaybePromise<Uint8Array>;
|
|
87
89
|
|
|
88
90
|
/**
|
|
89
91
|
* Create an HMAC signature.
|
|
90
92
|
*/
|
|
91
|
-
signHmac(key: Uint8Array, data: Uint8Array): MaybePromise<Uint8Array>;
|
|
93
|
+
abstract signHmac(key: Uint8Array, data: Uint8Array): MaybePromise<Uint8Array>;
|
|
92
94
|
|
|
93
95
|
/**
|
|
94
96
|
* Create an ECDSA signature.
|
|
95
97
|
*/
|
|
96
|
-
signEcdsa(
|
|
98
|
+
abstract signEcdsa(
|
|
97
99
|
privateKey: JsonWebKey,
|
|
98
100
|
data: Uint8Array | Uint8Array[],
|
|
99
101
|
dsaEncoding?: CryptoDsaEncoding,
|
|
@@ -102,7 +104,7 @@ export interface Crypto {
|
|
|
102
104
|
/**
|
|
103
105
|
* Authenticate an ECDSA signature.
|
|
104
106
|
*/
|
|
105
|
-
verifyEcdsa(
|
|
107
|
+
abstract verifyEcdsa(
|
|
106
108
|
publicKey: JsonWebKey,
|
|
107
109
|
data: Uint8Array,
|
|
108
110
|
signature: Uint8Array,
|
|
@@ -112,147 +114,45 @@ export interface Crypto {
|
|
|
112
114
|
/**
|
|
113
115
|
* Create a general-purpose EC key.
|
|
114
116
|
*/
|
|
115
|
-
createKeyPair(): MaybePromise<PrivateKey>;
|
|
117
|
+
abstract createKeyPair(): MaybePromise<PrivateKey>;
|
|
116
118
|
|
|
117
119
|
/**
|
|
118
120
|
* Compute the shared secret for a Diffie-Hellman exchange.
|
|
119
121
|
*/
|
|
120
|
-
generateDhSecret(key: PrivateKey, peerKey: PublicKey): MaybePromise<Uint8Array>;
|
|
121
|
-
}
|
|
122
|
-
|
|
123
|
-
let logImplementationName = true;
|
|
124
|
-
let defaultInstance: undefined | Crypto;
|
|
125
|
-
let defaultProvider: undefined | (() => Crypto);
|
|
126
|
-
|
|
127
|
-
/**
|
|
128
|
-
* Crypto support functions.
|
|
129
|
-
*/
|
|
130
|
-
export const Crypto = {
|
|
131
|
-
/**
|
|
132
|
-
* The default crypto implementation.
|
|
133
|
-
*/
|
|
134
|
-
get default() {
|
|
135
|
-
if (defaultInstance) {
|
|
136
|
-
return defaultInstance;
|
|
137
|
-
}
|
|
138
|
-
|
|
139
|
-
if (defaultProvider === undefined) {
|
|
140
|
-
throw new NoProviderError("There is no cryptography implementation installed");
|
|
141
|
-
}
|
|
142
|
-
|
|
143
|
-
defaultInstance = defaultProvider();
|
|
144
|
-
|
|
145
|
-
if (logImplementationName) {
|
|
146
|
-
logger.debug("Using", Diagnostic.strong(defaultInstance.implementationName), "cryptography implementation");
|
|
147
|
-
}
|
|
148
|
-
|
|
149
|
-
return defaultInstance;
|
|
150
|
-
},
|
|
151
|
-
|
|
152
|
-
get provider(): undefined | (() => Crypto) {
|
|
153
|
-
return defaultProvider;
|
|
154
|
-
},
|
|
155
|
-
|
|
156
|
-
/**
|
|
157
|
-
* Set the default crypto provider.
|
|
158
|
-
*/
|
|
159
|
-
set provider(provider: () => Crypto) {
|
|
160
|
-
if (defaultProvider === provider) {
|
|
161
|
-
return;
|
|
162
|
-
}
|
|
163
|
-
defaultProvider = undefined;
|
|
164
|
-
defaultProvider = provider;
|
|
165
|
-
},
|
|
166
|
-
|
|
167
|
-
get implementationName() {
|
|
168
|
-
return Crypto.default.implementationName;
|
|
169
|
-
},
|
|
122
|
+
abstract generateDhSecret(key: PrivateKey, peerKey: PublicKey): MaybePromise<Uint8Array>;
|
|
170
123
|
|
|
171
|
-
|
|
172
|
-
return
|
|
173
|
-
}
|
|
174
|
-
|
|
175
|
-
decrypt(key: Uint8Array, data: Uint8Array, nonce: Uint8Array, aad?: Uint8Array) {
|
|
176
|
-
return Crypto.default.decrypt(key, data, nonce, aad);
|
|
177
|
-
},
|
|
178
|
-
|
|
179
|
-
getRandomData(length: number) {
|
|
180
|
-
return Crypto.default.getRandomData(length);
|
|
181
|
-
},
|
|
182
|
-
|
|
183
|
-
getRandom() {
|
|
184
|
-
return Crypto.default.getRandomData(CRYPTO_RANDOM_LENGTH);
|
|
185
|
-
},
|
|
124
|
+
get randomUint8() {
|
|
125
|
+
return this.randomBytes(1)[0];
|
|
126
|
+
}
|
|
186
127
|
|
|
187
|
-
|
|
188
|
-
return new
|
|
189
|
-
}
|
|
128
|
+
get randomUint16() {
|
|
129
|
+
return new DataView(this.randomBytes(2).buffer).getUint16(0);
|
|
130
|
+
}
|
|
190
131
|
|
|
191
|
-
|
|
192
|
-
return new
|
|
193
|
-
}
|
|
132
|
+
get randomUint32() {
|
|
133
|
+
return new DataView(this.randomBytes(4).buffer).getUint32(0);
|
|
134
|
+
}
|
|
194
135
|
|
|
195
|
-
|
|
196
|
-
return new
|
|
197
|
-
}
|
|
136
|
+
get randomBigUint64() {
|
|
137
|
+
return new DataView(this.randomBytes(8).buffer).getBigUint64(0);
|
|
138
|
+
}
|
|
198
139
|
|
|
199
|
-
|
|
200
|
-
const { bytesToNumberBE } = ec;
|
|
140
|
+
randomBigInt(size: number, maxValue?: bigint) {
|
|
201
141
|
if (maxValue === undefined) {
|
|
202
|
-
return
|
|
142
|
+
return Bytes.asBigInt(this.randomBytes(size));
|
|
203
143
|
}
|
|
144
|
+
|
|
204
145
|
while (true) {
|
|
205
|
-
const random =
|
|
146
|
+
const random = Bytes.asBigInt(this.randomBytes(size));
|
|
206
147
|
if (random < maxValue) return random;
|
|
207
148
|
}
|
|
208
|
-
}
|
|
209
|
-
|
|
210
|
-
computeSha256(data: Uint8Array | Uint8Array[]) {
|
|
211
|
-
return Crypto.default.computeSha256(data);
|
|
212
|
-
},
|
|
213
|
-
|
|
214
|
-
createPbkdf2Key(secret: Uint8Array, salt: Uint8Array, iteration: number, keyLength: number) {
|
|
215
|
-
return Crypto.default.createPbkdf2Key(secret, salt, iteration, keyLength);
|
|
216
|
-
},
|
|
217
|
-
|
|
218
|
-
createHkdfKey(secret: Uint8Array, salt: Uint8Array, info: Uint8Array, length?: number) {
|
|
219
|
-
return Crypto.default.createHkdfKey(secret, salt, info, length);
|
|
220
|
-
},
|
|
221
|
-
|
|
222
|
-
signHmac(key: Uint8Array, data: Uint8Array) {
|
|
223
|
-
return Crypto.default.signHmac(key, data);
|
|
224
|
-
},
|
|
225
|
-
|
|
226
|
-
signEcdsa(privateKey: JsonWebKey, data: Uint8Array | Uint8Array[], dsaEncoding?: CryptoDsaEncoding) {
|
|
227
|
-
return Crypto.default.signEcdsa(privateKey, data, dsaEncoding);
|
|
228
|
-
},
|
|
229
|
-
|
|
230
|
-
verifyEcdsa(publicKey: JsonWebKey, data: Uint8Array, signature: Uint8Array, dsaEncoding?: CryptoDsaEncoding) {
|
|
231
|
-
return Crypto.default.verifyEcdsa(publicKey, data, signature, dsaEncoding);
|
|
232
|
-
},
|
|
233
|
-
|
|
234
|
-
createKeyPair() {
|
|
235
|
-
return Crypto.default.createKeyPair();
|
|
236
|
-
},
|
|
237
|
-
|
|
238
|
-
generateDhSecret(key: PrivateKey, peerKey: PublicKey) {
|
|
239
|
-
return Crypto.default.generateDhSecret(key, peerKey);
|
|
240
|
-
},
|
|
241
|
-
};
|
|
242
|
-
|
|
243
|
-
Crypto satisfies Crypto;
|
|
244
|
-
|
|
245
|
-
Boot.init(() => {
|
|
246
|
-
logImplementationName = true;
|
|
247
|
-
defaultInstance = undefined;
|
|
248
|
-
defaultProvider = undefined;
|
|
249
|
-
|
|
250
|
-
// Testing framework configuration
|
|
251
|
-
if (typeof MatterHooks !== "undefined") {
|
|
252
|
-
// Crypto access occurs before log messages are intercepted so do not log implementation in test environment
|
|
253
|
-
logImplementationName = true;
|
|
149
|
+
}
|
|
254
150
|
|
|
255
|
-
|
|
256
|
-
|
|
151
|
+
reportUsage(component?: string) {
|
|
152
|
+
const message = ["Using", Diagnostic.strong(this.implementationName), "crypto implementation"];
|
|
153
|
+
if (component) {
|
|
154
|
+
message.push("for", component);
|
|
155
|
+
}
|
|
156
|
+
logger.debug(...message);
|
|
257
157
|
}
|
|
258
|
-
}
|
|
158
|
+
}
|