@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
|
@@ -68,7 +68,6 @@ export declare const ec: {
|
|
|
68
68
|
notImplemented: () => never;
|
|
69
69
|
p256: import("@noble/curves/_shortw_utils").CurveFnWithCreate;
|
|
70
70
|
};
|
|
71
|
-
export declare const CRYPTO_RANDOM_LENGTH = 32;
|
|
72
71
|
export declare const CRYPTO_ENCRYPT_ALGORITHM = "aes-128-ccm";
|
|
73
72
|
export declare const CRYPTO_HASH_ALGORITHM = "sha256";
|
|
74
73
|
export declare const CRYPTO_EC_CURVE = "prime256v1";
|
|
@@ -83,89 +82,64 @@ export type CryptoDsaEncoding = "ieee-p1363" | "der";
|
|
|
83
82
|
* AES-CCM implementation.
|
|
84
83
|
*
|
|
85
84
|
* If your platform does not fully implement Web Crypto, or offers a native implementation of AES-CCM, you can replace
|
|
86
|
-
* {@link
|
|
85
|
+
* the implementation in {@link Environment.default}.
|
|
87
86
|
*
|
|
88
87
|
* WARNING: The standard implementation is unaudited. See relevant warnings in StandardCrypto.ts.
|
|
89
88
|
*/
|
|
90
|
-
export
|
|
89
|
+
export declare abstract class Crypto {
|
|
91
90
|
/**
|
|
92
91
|
* The name used in log messages.
|
|
93
92
|
*/
|
|
94
|
-
implementationName: string;
|
|
93
|
+
abstract implementationName: string;
|
|
95
94
|
/**
|
|
96
95
|
* Encrypt using AES-CCM with constants limited to those required by Matter.
|
|
97
96
|
*/
|
|
98
|
-
encrypt(key: Uint8Array, data: Uint8Array, nonce: Uint8Array, aad?: Uint8Array): Uint8Array;
|
|
97
|
+
abstract encrypt(key: Uint8Array, data: Uint8Array, nonce: Uint8Array, aad?: Uint8Array): Uint8Array;
|
|
99
98
|
/**
|
|
100
99
|
* Decrypt using AES-CCM with constants limited to those required by Matter.
|
|
101
100
|
*/
|
|
102
|
-
decrypt(key: Uint8Array, data: Uint8Array, nonce: Uint8Array, aad?: Uint8Array): Uint8Array;
|
|
101
|
+
abstract decrypt(key: Uint8Array, data: Uint8Array, nonce: Uint8Array, aad?: Uint8Array): Uint8Array;
|
|
103
102
|
/**
|
|
104
|
-
*
|
|
103
|
+
* Create a random buffer from the most cryptographically-appropriate source available.
|
|
105
104
|
*/
|
|
106
|
-
|
|
105
|
+
abstract randomBytes(length: number): Uint8Array;
|
|
107
106
|
/**
|
|
108
107
|
* Compute the SHA-256 hash of a buffer.
|
|
109
108
|
*/
|
|
110
|
-
computeSha256(data: Uint8Array | Uint8Array[]): MaybePromise<Uint8Array>;
|
|
109
|
+
abstract computeSha256(data: Uint8Array | Uint8Array[]): MaybePromise<Uint8Array>;
|
|
111
110
|
/**
|
|
112
111
|
* Create a key from a secret using PBKDF2.
|
|
113
112
|
*/
|
|
114
|
-
createPbkdf2Key(secret: Uint8Array, salt: Uint8Array, iteration: number, keyLength: number): MaybePromise<Uint8Array>;
|
|
113
|
+
abstract createPbkdf2Key(secret: Uint8Array, salt: Uint8Array, iteration: number, keyLength: number): MaybePromise<Uint8Array>;
|
|
115
114
|
/**
|
|
116
115
|
* Create a key from a secret using HKDF.
|
|
117
116
|
*/
|
|
118
|
-
createHkdfKey(secret: Uint8Array, salt: Uint8Array, info: Uint8Array, length?: number): MaybePromise<Uint8Array>;
|
|
117
|
+
abstract createHkdfKey(secret: Uint8Array, salt: Uint8Array, info: Uint8Array, length?: number): MaybePromise<Uint8Array>;
|
|
119
118
|
/**
|
|
120
119
|
* Create an HMAC signature.
|
|
121
120
|
*/
|
|
122
|
-
signHmac(key: Uint8Array, data: Uint8Array): MaybePromise<Uint8Array>;
|
|
121
|
+
abstract signHmac(key: Uint8Array, data: Uint8Array): MaybePromise<Uint8Array>;
|
|
123
122
|
/**
|
|
124
123
|
* Create an ECDSA signature.
|
|
125
124
|
*/
|
|
126
|
-
signEcdsa(privateKey: JsonWebKey, data: Uint8Array | Uint8Array[], dsaEncoding?: CryptoDsaEncoding): MaybePromise<Uint8Array>;
|
|
125
|
+
abstract signEcdsa(privateKey: JsonWebKey, data: Uint8Array | Uint8Array[], dsaEncoding?: CryptoDsaEncoding): MaybePromise<Uint8Array>;
|
|
127
126
|
/**
|
|
128
127
|
* Authenticate an ECDSA signature.
|
|
129
128
|
*/
|
|
130
|
-
verifyEcdsa(publicKey: JsonWebKey, data: Uint8Array, signature: Uint8Array, dsaEncoding?: CryptoDsaEncoding): MaybePromise<void>;
|
|
129
|
+
abstract verifyEcdsa(publicKey: JsonWebKey, data: Uint8Array, signature: Uint8Array, dsaEncoding?: CryptoDsaEncoding): MaybePromise<void>;
|
|
131
130
|
/**
|
|
132
131
|
* Create a general-purpose EC key.
|
|
133
132
|
*/
|
|
134
|
-
createKeyPair(): MaybePromise<PrivateKey>;
|
|
133
|
+
abstract createKeyPair(): MaybePromise<PrivateKey>;
|
|
135
134
|
/**
|
|
136
135
|
* Compute the shared secret for a Diffie-Hellman exchange.
|
|
137
136
|
*/
|
|
138
|
-
generateDhSecret(key: PrivateKey, peerKey: PublicKey): MaybePromise<Uint8Array>;
|
|
137
|
+
abstract generateDhSecret(key: PrivateKey, peerKey: PublicKey): MaybePromise<Uint8Array>;
|
|
138
|
+
get randomUint8(): number;
|
|
139
|
+
get randomUint16(): number;
|
|
140
|
+
get randomUint32(): number;
|
|
141
|
+
get randomBigUint64(): bigint;
|
|
142
|
+
randomBigInt(size: number, maxValue?: bigint): bigint;
|
|
143
|
+
reportUsage(component?: string): void;
|
|
139
144
|
}
|
|
140
|
-
/**
|
|
141
|
-
* Crypto support functions.
|
|
142
|
-
*/
|
|
143
|
-
export declare const Crypto: {
|
|
144
|
-
/**
|
|
145
|
-
* The default crypto implementation.
|
|
146
|
-
*/
|
|
147
|
-
readonly default: Crypto;
|
|
148
|
-
get provider(): undefined | (() => Crypto);
|
|
149
|
-
/**
|
|
150
|
-
* Set the default crypto provider.
|
|
151
|
-
*/
|
|
152
|
-
set provider(provider: () => Crypto);
|
|
153
|
-
readonly implementationName: string;
|
|
154
|
-
encrypt(key: Uint8Array, data: Uint8Array, nonce: Uint8Array, aad?: Uint8Array): Uint8Array<ArrayBufferLike>;
|
|
155
|
-
decrypt(key: Uint8Array, data: Uint8Array, nonce: Uint8Array, aad?: Uint8Array): Uint8Array<ArrayBufferLike>;
|
|
156
|
-
getRandomData(length: number): Uint8Array<ArrayBufferLike>;
|
|
157
|
-
getRandom(): Uint8Array<ArrayBufferLike>;
|
|
158
|
-
getRandomUInt16(): number;
|
|
159
|
-
getRandomUInt32(): number;
|
|
160
|
-
getRandomBigUInt64(): bigint;
|
|
161
|
-
getRandomBigInt(size: number, maxValue?: bigint): bigint;
|
|
162
|
-
computeSha256(data: Uint8Array | Uint8Array[]): MaybePromise<Uint8Array<ArrayBufferLike>>;
|
|
163
|
-
createPbkdf2Key(secret: Uint8Array, salt: Uint8Array, iteration: number, keyLength: number): MaybePromise<Uint8Array<ArrayBufferLike>>;
|
|
164
|
-
createHkdfKey(secret: Uint8Array, salt: Uint8Array, info: Uint8Array, length?: number): MaybePromise<Uint8Array<ArrayBufferLike>>;
|
|
165
|
-
signHmac(key: Uint8Array, data: Uint8Array): MaybePromise<Uint8Array<ArrayBufferLike>>;
|
|
166
|
-
signEcdsa(privateKey: JsonWebKey, data: Uint8Array | Uint8Array[], dsaEncoding?: CryptoDsaEncoding): MaybePromise<Uint8Array<ArrayBufferLike>>;
|
|
167
|
-
verifyEcdsa(publicKey: JsonWebKey, data: Uint8Array, signature: Uint8Array, dsaEncoding?: CryptoDsaEncoding): MaybePromise<void>;
|
|
168
|
-
createKeyPair(): MaybePromise<PrivateKey>;
|
|
169
|
-
generateDhSecret(key: PrivateKey, peerKey: PublicKey): MaybePromise<Uint8Array<ArrayBufferLike>>;
|
|
170
|
-
};
|
|
171
145
|
//# sourceMappingURL=Crypto.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Crypto.d.ts","sourceRoot":"","sources":["../../../src/crypto/Crypto.ts"],"names":[],"mappings":"AAAA;;;;GAIG;
|
|
1
|
+
{"version":3,"file":"Crypto.d.ts","sourceRoot":"","sources":["../../../src/crypto/Crypto.ts"],"names":[],"mappings":"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"}
|
|
@@ -33,7 +33,6 @@ __export(Crypto_exports, {
|
|
|
33
33
|
CRYPTO_EC_KEY_BYTES: () => CRYPTO_EC_KEY_BYTES,
|
|
34
34
|
CRYPTO_ENCRYPT_ALGORITHM: () => CRYPTO_ENCRYPT_ALGORITHM,
|
|
35
35
|
CRYPTO_HASH_ALGORITHM: () => CRYPTO_HASH_ALGORITHM,
|
|
36
|
-
CRYPTO_RANDOM_LENGTH: () => CRYPTO_RANDOM_LENGTH,
|
|
37
36
|
CRYPTO_SYMMETRIC_KEY_LENGTH: () => CRYPTO_SYMMETRIC_KEY_LENGTH,
|
|
38
37
|
Crypto: () => Crypto,
|
|
39
38
|
ec: () => ec
|
|
@@ -41,13 +40,10 @@ __export(Crypto_exports, {
|
|
|
41
40
|
module.exports = __toCommonJS(Crypto_exports);
|
|
42
41
|
var import_Diagnostic = require("#log/Diagnostic.js");
|
|
43
42
|
var import_Logger = require("#log/Logger.js");
|
|
44
|
-
var
|
|
43
|
+
var import_Bytes = require("#util/Bytes.js");
|
|
45
44
|
var mod = __toESM(require("@noble/curves/abstract/modular"), 1);
|
|
46
45
|
var utils = __toESM(require("@noble/curves/abstract/utils"), 1);
|
|
47
46
|
var import_p256 = require("@noble/curves/p256");
|
|
48
|
-
var import_MatterError = require("../MatterError.js");
|
|
49
|
-
var import_Bytes = require("../util/Bytes.js");
|
|
50
|
-
var import_DataReader = require("../util/DataReader.js");
|
|
51
47
|
/**
|
|
52
48
|
* @license
|
|
53
49
|
* Copyright 2022-2025 Matter.js Authors
|
|
@@ -58,7 +54,6 @@ const ec = {
|
|
|
58
54
|
...utils,
|
|
59
55
|
...mod
|
|
60
56
|
};
|
|
61
|
-
const CRYPTO_RANDOM_LENGTH = 32;
|
|
62
57
|
const CRYPTO_ENCRYPT_ALGORITHM = "aes-128-ccm";
|
|
63
58
|
const CRYPTO_HASH_ALGORITHM = "sha256";
|
|
64
59
|
const CRYPTO_EC_CURVE = "prime256v1";
|
|
@@ -66,106 +61,34 @@ const CRYPTO_EC_KEY_BYTES = 32;
|
|
|
66
61
|
const CRYPTO_AUTH_TAG_LENGTH = 16;
|
|
67
62
|
const CRYPTO_SYMMETRIC_KEY_LENGTH = 16;
|
|
68
63
|
const logger = import_Logger.Logger.get("Crypto");
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
get
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
defaultInstance = defaultProvider();
|
|
84
|
-
if (logImplementationName) {
|
|
85
|
-
logger.debug("Using", import_Diagnostic.Diagnostic.strong(defaultInstance.implementationName), "cryptography implementation");
|
|
86
|
-
}
|
|
87
|
-
return defaultInstance;
|
|
88
|
-
},
|
|
89
|
-
get provider() {
|
|
90
|
-
return defaultProvider;
|
|
91
|
-
},
|
|
92
|
-
/**
|
|
93
|
-
* Set the default crypto provider.
|
|
94
|
-
*/
|
|
95
|
-
set provider(provider) {
|
|
96
|
-
if (defaultProvider === provider) {
|
|
97
|
-
return;
|
|
98
|
-
}
|
|
99
|
-
defaultProvider = void 0;
|
|
100
|
-
defaultProvider = provider;
|
|
101
|
-
},
|
|
102
|
-
get implementationName() {
|
|
103
|
-
return Crypto.default.implementationName;
|
|
104
|
-
},
|
|
105
|
-
encrypt(key, data, nonce, aad) {
|
|
106
|
-
return Crypto.default.encrypt(key, data, nonce, aad);
|
|
107
|
-
},
|
|
108
|
-
decrypt(key, data, nonce, aad) {
|
|
109
|
-
return Crypto.default.decrypt(key, data, nonce, aad);
|
|
110
|
-
},
|
|
111
|
-
getRandomData(length) {
|
|
112
|
-
return Crypto.default.getRandomData(length);
|
|
113
|
-
},
|
|
114
|
-
getRandom() {
|
|
115
|
-
return Crypto.default.getRandomData(CRYPTO_RANDOM_LENGTH);
|
|
116
|
-
},
|
|
117
|
-
getRandomUInt16() {
|
|
118
|
-
return new import_DataReader.DataReader(Crypto.default.getRandomData(2), import_Bytes.Endian.Little).readUInt16();
|
|
119
|
-
},
|
|
120
|
-
getRandomUInt32() {
|
|
121
|
-
return new import_DataReader.DataReader(Crypto.default.getRandomData(4), import_Bytes.Endian.Little).readUInt32();
|
|
122
|
-
},
|
|
123
|
-
getRandomBigUInt64() {
|
|
124
|
-
return new import_DataReader.DataReader(Crypto.default.getRandomData(8), import_Bytes.Endian.Little).readUInt64();
|
|
125
|
-
},
|
|
126
|
-
getRandomBigInt(size, maxValue) {
|
|
127
|
-
const { bytesToNumberBE } = ec;
|
|
64
|
+
class Crypto {
|
|
65
|
+
get randomUint8() {
|
|
66
|
+
return this.randomBytes(1)[0];
|
|
67
|
+
}
|
|
68
|
+
get randomUint16() {
|
|
69
|
+
return new DataView(this.randomBytes(2).buffer).getUint16(0);
|
|
70
|
+
}
|
|
71
|
+
get randomUint32() {
|
|
72
|
+
return new DataView(this.randomBytes(4).buffer).getUint32(0);
|
|
73
|
+
}
|
|
74
|
+
get randomBigUint64() {
|
|
75
|
+
return new DataView(this.randomBytes(8).buffer).getBigUint64(0);
|
|
76
|
+
}
|
|
77
|
+
randomBigInt(size, maxValue) {
|
|
128
78
|
if (maxValue === void 0) {
|
|
129
|
-
return
|
|
79
|
+
return import_Bytes.Bytes.asBigInt(this.randomBytes(size));
|
|
130
80
|
}
|
|
131
81
|
while (true) {
|
|
132
|
-
const random =
|
|
82
|
+
const random = import_Bytes.Bytes.asBigInt(this.randomBytes(size));
|
|
133
83
|
if (random < maxValue) return random;
|
|
134
84
|
}
|
|
135
|
-
},
|
|
136
|
-
computeSha256(data) {
|
|
137
|
-
return Crypto.default.computeSha256(data);
|
|
138
|
-
},
|
|
139
|
-
createPbkdf2Key(secret, salt, iteration, keyLength) {
|
|
140
|
-
return Crypto.default.createPbkdf2Key(secret, salt, iteration, keyLength);
|
|
141
|
-
},
|
|
142
|
-
createHkdfKey(secret, salt, info, length) {
|
|
143
|
-
return Crypto.default.createHkdfKey(secret, salt, info, length);
|
|
144
|
-
},
|
|
145
|
-
signHmac(key, data) {
|
|
146
|
-
return Crypto.default.signHmac(key, data);
|
|
147
|
-
},
|
|
148
|
-
signEcdsa(privateKey, data, dsaEncoding) {
|
|
149
|
-
return Crypto.default.signEcdsa(privateKey, data, dsaEncoding);
|
|
150
|
-
},
|
|
151
|
-
verifyEcdsa(publicKey, data, signature, dsaEncoding) {
|
|
152
|
-
return Crypto.default.verifyEcdsa(publicKey, data, signature, dsaEncoding);
|
|
153
|
-
},
|
|
154
|
-
createKeyPair() {
|
|
155
|
-
return Crypto.default.createKeyPair();
|
|
156
|
-
},
|
|
157
|
-
generateDhSecret(key, peerKey) {
|
|
158
|
-
return Crypto.default.generateDhSecret(key, peerKey);
|
|
159
85
|
}
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
if (typeof MatterHooks !== "undefined") {
|
|
167
|
-
logImplementationName = true;
|
|
168
|
-
MatterHooks.cryptoSetup?.(Crypto);
|
|
86
|
+
reportUsage(component) {
|
|
87
|
+
const message = ["Using", import_Diagnostic.Diagnostic.strong(this.implementationName), "crypto implementation"];
|
|
88
|
+
if (component) {
|
|
89
|
+
message.push("for", component);
|
|
90
|
+
}
|
|
91
|
+
logger.debug(...message);
|
|
169
92
|
}
|
|
170
|
-
}
|
|
93
|
+
}
|
|
171
94
|
//# sourceMappingURL=Crypto.js.map
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../src/crypto/Crypto.ts"],
|
|
4
|
-
"mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;
|
|
4
|
+
"mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAOA,wBAA2B;AAC3B,oBAAuB;AACvB,mBAAsB;AAEtB,UAAqB;AACrB,YAAuB;AACvB,kBAAqB;AAbrB;AAAA;AAAA;AAAA;AAAA;AAgBO,MAAM,KAAK;AAAA,EACd;AAAA,EACA,GAAG;AAAA,EACH,GAAG;AACP;AAEO,MAAM,2BAA2B;AACjC,MAAM,wBAAwB;AAC9B,MAAM,kBAAkB;AACxB,MAAM,sBAAsB;AAC5B,MAAM,yBAAyB;AAC/B,MAAM,8BAA8B;AAG3C,MAAM,SAAS,qBAAO,IAAI,QAAQ;AAa3B,MAAe,OAAO;AAAA,EAgFzB,IAAI,cAAc;AACd,WAAO,KAAK,YAAY,CAAC,EAAE,CAAC;AAAA,EAChC;AAAA,EAEA,IAAI,eAAe;AACf,WAAO,IAAI,SAAS,KAAK,YAAY,CAAC,EAAE,MAAM,EAAE,UAAU,CAAC;AAAA,EAC/D;AAAA,EAEA,IAAI,eAAe;AACf,WAAO,IAAI,SAAS,KAAK,YAAY,CAAC,EAAE,MAAM,EAAE,UAAU,CAAC;AAAA,EAC/D;AAAA,EAEA,IAAI,kBAAkB;AAClB,WAAO,IAAI,SAAS,KAAK,YAAY,CAAC,EAAE,MAAM,EAAE,aAAa,CAAC;AAAA,EAClE;AAAA,EAEA,aAAa,MAAc,UAAmB;AAC1C,QAAI,aAAa,QAAW;AACxB,aAAO,mBAAM,SAAS,KAAK,YAAY,IAAI,CAAC;AAAA,IAChD;AAEA,WAAO,MAAM;AACT,YAAM,SAAS,mBAAM,SAAS,KAAK,YAAY,IAAI,CAAC;AACpD,UAAI,SAAS,SAAU,QAAO;AAAA,IAClC;AAAA,EACJ;AAAA,EAEA,YAAY,WAAoB;AAC5B,UAAM,UAAU,CAAC,SAAS,6BAAW,OAAO,KAAK,kBAAkB,GAAG,uBAAuB;AAC7F,QAAI,WAAW;AACX,cAAQ,KAAK,OAAO,SAAS;AAAA,IACjC;AACA,WAAO,MAAM,GAAG,OAAO;AAAA,EAC3B;AACJ;",
|
|
5
5
|
"names": []
|
|
6
6
|
}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright 2022-2025 Project CHIP Authors
|
|
4
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
5
|
+
*/
|
|
6
|
+
import { Crypto } from "./Crypto.js";
|
|
7
|
+
/**
|
|
8
|
+
* WARNING: ONLY FOR USE IN PROTECTED TESTING ENVIRONMENTS WHERE SECURITY IS NOT A CONCERN
|
|
9
|
+
*
|
|
10
|
+
* A {@link Crypto} with sources of entropy replaced to produce stable values based on an input index.
|
|
11
|
+
*
|
|
12
|
+
* This is useful in testing environments where Matter logic is difficult to test with true entropy.
|
|
13
|
+
*
|
|
14
|
+
* Depending on implementation some methods may need further mocking to remove entropy entirely. Mocking is sufficient
|
|
15
|
+
* for current testing purposes.
|
|
16
|
+
*/
|
|
17
|
+
export interface MockCrypto extends Crypto {
|
|
18
|
+
/**
|
|
19
|
+
* The index of the random space. May be modified to adjust computations going forward.
|
|
20
|
+
*/
|
|
21
|
+
index: number;
|
|
22
|
+
}
|
|
23
|
+
export declare function MockCrypto(index?: number, implementation?: new () => Crypto): MockCrypto;
|
|
24
|
+
//# sourceMappingURL=MockCrypto.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MockCrypto.d.ts","sourceRoot":"","sources":["../../../src/crypto/MockCrypto.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EAAE,MAAM,EAAM,MAAM,aAAa,CAAC;AAIzC;;;;;;;;;GASG;AACH,MAAM,WAAW,UAAW,SAAQ,MAAM;IACtC;;OAEG;IACH,KAAK,EAAE,MAAM,CAAC;CACjB;AAED,wBAAgB,UAAU,CAAC,KAAK,GAAE,MAAa,EAAE,cAAc,GAAE,UAAU,MAAuB,GAkC7E,UAAU,CAC9B"}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __defProp = Object.defineProperty;
|
|
3
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
|
+
var __export = (target, all) => {
|
|
7
|
+
for (var name in all)
|
|
8
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
9
|
+
};
|
|
10
|
+
var __copyProps = (to, from, except, desc) => {
|
|
11
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
12
|
+
for (let key of __getOwnPropNames(from))
|
|
13
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
14
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
15
|
+
}
|
|
16
|
+
return to;
|
|
17
|
+
};
|
|
18
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
19
|
+
var MockCrypto_exports = {};
|
|
20
|
+
__export(MockCrypto_exports, {
|
|
21
|
+
MockCrypto: () => MockCrypto
|
|
22
|
+
});
|
|
23
|
+
module.exports = __toCommonJS(MockCrypto_exports);
|
|
24
|
+
var import_MatterError = require("#MatterError.js");
|
|
25
|
+
var import_Crypto = require("./Crypto.js");
|
|
26
|
+
var import_Key = require("./Key.js");
|
|
27
|
+
var import_StandardCrypto = require("./StandardCrypto.js");
|
|
28
|
+
/**
|
|
29
|
+
* @license
|
|
30
|
+
* Copyright 2022-2025 Project CHIP Authors
|
|
31
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
32
|
+
*/
|
|
33
|
+
function MockCrypto(index = 128, implementation = import_StandardCrypto.StandardCrypto) {
|
|
34
|
+
if (index < 0 || index > 255) {
|
|
35
|
+
throw new import_MatterError.ImplementationError(`Index for stable crypto must be 0-255`);
|
|
36
|
+
}
|
|
37
|
+
const crypto = new implementation();
|
|
38
|
+
crypto.randomBytes = function getRandomDataNONENTROPIC(length) {
|
|
39
|
+
const result = new Uint8Array(length);
|
|
40
|
+
result.fill(index);
|
|
41
|
+
return result;
|
|
42
|
+
};
|
|
43
|
+
crypto.createKeyPair = function getRandomDataNONENTROPIC() {
|
|
44
|
+
const privateBits = import_Crypto.ec.mapHashToField(new Uint8Array(crypto.randomBytes(48)), import_Crypto.ec.p256.CURVE.n);
|
|
45
|
+
return (0, import_Key.Key)({
|
|
46
|
+
kty: import_Key.KeyType.EC,
|
|
47
|
+
crv: import_Key.CurveType.p256,
|
|
48
|
+
privateBits
|
|
49
|
+
});
|
|
50
|
+
};
|
|
51
|
+
Object.defineProperty(crypto, "index", {
|
|
52
|
+
get() {
|
|
53
|
+
return index;
|
|
54
|
+
},
|
|
55
|
+
set(newIndex) {
|
|
56
|
+
index = newIndex % 256;
|
|
57
|
+
}
|
|
58
|
+
});
|
|
59
|
+
return crypto;
|
|
60
|
+
}
|
|
61
|
+
//# sourceMappingURL=MockCrypto.js.map
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../src/crypto/MockCrypto.ts"],
|
|
4
|
+
"mappings": ";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAMA,yBAAoC;AACpC,oBAA2B;AAC3B,iBAAoD;AACpD,4BAA+B;AAT/B;AAAA;AAAA;AAAA;AAAA;AA4BO,SAAS,WAAW,QAAgB,KAAM,iBAAmC,sCAAgB;AAChG,MAAI,QAAQ,KAAK,QAAQ,KAAK;AAC1B,UAAM,IAAI,uCAAoB,uCAAuC;AAAA,EACzE;AAEA,QAAM,SAAS,IAAI,eAAe;AAGlC,SAAO,cAAc,SAAS,yBAAyB,QAAQ;AAC3D,UAAM,SAAS,IAAI,WAAW,MAAM;AACpC,WAAO,KAAK,KAAK;AACjB,WAAO;AAAA,EACX;AAGA,SAAO,gBAAgB,SAAS,2BAA2B;AACvD,UAAM,cAAc,iBAAG,eAAe,IAAI,WAAW,OAAO,YAAY,EAAE,CAAC,GAAG,iBAAG,KAAK,MAAM,CAAC;AAC7F,eAAO,gBAAI;AAAA,MACP,KAAK,mBAAQ;AAAA,MACb,KAAK,qBAAU;AAAA,MACf;AAAA,IACJ,CAAC;AAAA,EACL;AAEA,SAAO,eAAe,QAAQ,SAAS;AAAA,IACnC,MAAM;AACF,aAAO;AAAA,IACX;AAAA,IAEA,IAAI,UAAkB;AAClB,cAAQ,WAAW;AAAA,IACvB;AAAA,EACJ,CAAC;AAED,SAAO;AACX;",
|
|
5
|
+
"names": []
|
|
6
|
+
}
|
|
@@ -3,24 +3,23 @@
|
|
|
3
3
|
* Copyright 2022-2025 Matter.js Authors
|
|
4
4
|
* SPDX-License-Identifier: Apache-2.0
|
|
5
5
|
*/
|
|
6
|
+
import { Crypto } from "./Crypto.js";
|
|
6
7
|
export interface PbkdfParameters {
|
|
7
8
|
iterations: number;
|
|
8
9
|
salt: Uint8Array;
|
|
9
10
|
}
|
|
10
11
|
export declare class Spake2p {
|
|
11
|
-
private
|
|
12
|
-
|
|
13
|
-
private readonly w0;
|
|
14
|
-
static computeW0W1({ iterations, salt }: PbkdfParameters, pin: number): Promise<{
|
|
12
|
+
#private;
|
|
13
|
+
static computeW0W1(crypto: Crypto, { iterations, salt }: PbkdfParameters, pin: number): Promise<{
|
|
15
14
|
w0: bigint;
|
|
16
15
|
w1: bigint;
|
|
17
16
|
}>;
|
|
18
|
-
static computeW0L(pbkdfParameters: PbkdfParameters, pin: number): Promise<{
|
|
17
|
+
static computeW0L(crypto: Crypto, pbkdfParameters: PbkdfParameters, pin: number): Promise<{
|
|
19
18
|
w0: bigint;
|
|
20
19
|
L: Uint8Array<ArrayBufferLike>;
|
|
21
20
|
}>;
|
|
22
|
-
static create(context: Uint8Array, w0: bigint): Spake2p;
|
|
23
|
-
constructor(context: Uint8Array, random: bigint, w0: bigint);
|
|
21
|
+
static create(crypto: Crypto, context: Uint8Array, w0: bigint): Spake2p;
|
|
22
|
+
constructor(crypto: Crypto, context: Uint8Array, random: bigint, w0: bigint);
|
|
24
23
|
computeX(): Uint8Array;
|
|
25
24
|
computeY(): Uint8Array;
|
|
26
25
|
computeSecretAndVerifiersFromY(w1: bigint, X: Uint8Array, Y: Uint8Array): Promise<{
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Spake2p.d.ts","sourceRoot":"","sources":["../../../src/crypto/Spake2p.ts"],"names":[],"mappings":"AAAA;;;;GAIG;
|
|
1
|
+
{"version":3,"file":"Spake2p.d.ts","sourceRoot":"","sources":["../../../src/crypto/Spake2p.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAKH,OAAO,EAAE,MAAM,EAAM,MAAM,aAAa,CAAC;AAgBzC,MAAM,WAAW,eAAe;IAC5B,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,UAAU,CAAC;CACpB;AAED,qBAAa,OAAO;;WAMH,WAAW,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE,UAAU,EAAE,IAAI,EAAE,EAAE,eAAe,EAAE,GAAG,EAAE,MAAM;;;;WAS9E,UAAU,CAAC,MAAM,EAAE,MAAM,EAAE,eAAe,EAAE,eAAe,EAAE,GAAG,EAAE,MAAM;;;;IAMrF,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,UAAU,EAAE,EAAE,EAAE,MAAM;gBAKjD,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM;IAO3E,QAAQ,IAAI,UAAU;IAKtB,QAAQ,IAAI,UAAU;IAKhB,8BAA8B,CAAC,EAAE,EAAE,MAAM,EAAE,CAAC,EAAE,UAAU,EAAE,CAAC,EAAE,UAAU;;;;;IAavE,8BAA8B,CAAC,CAAC,EAAE,UAAU,EAAE,CAAC,EAAE,UAAU,EAAE,CAAC,EAAE,UAAU;;;;;YAalE,yBAAyB;IAevC,OAAO,CAAC,qBAAqB;IAe7B,OAAO,CAAC,YAAY;CAIvB"}
|
|
@@ -41,34 +41,39 @@ const M = ProjectivePoint.fromHex("02886e2f97ace46e55ba9dd7242579f2993b64e16ef3d
|
|
|
41
41
|
const N = ProjectivePoint.fromHex("03d8bbd6c639c62937b04d997f38c3770719c629d7014d49a24b4f98baa1292b49");
|
|
42
42
|
const CRYPTO_W_SIZE_BYTES = import_CryptoConstants.CRYPTO_GROUP_SIZE_BYTES + 8;
|
|
43
43
|
class Spake2p {
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
}
|
|
49
|
-
static async computeW0W1({ iterations, salt }, pin) {
|
|
44
|
+
#crypto;
|
|
45
|
+
#context;
|
|
46
|
+
#random;
|
|
47
|
+
#w0;
|
|
48
|
+
static async computeW0W1(crypto, { iterations, salt }, pin) {
|
|
50
49
|
const pinWriter = new import_DataWriter.DataWriter(import_Bytes.Endian.Little);
|
|
51
50
|
pinWriter.writeUInt32(pin);
|
|
52
|
-
const ws = await
|
|
51
|
+
const ws = await crypto.createPbkdf2Key(pinWriter.toByteArray(), salt, iterations, CRYPTO_W_SIZE_BYTES * 2);
|
|
53
52
|
const w0 = mod(bytesToNumberBE(ws.slice(0, 40)), P256_CURVE.n);
|
|
54
53
|
const w1 = mod(bytesToNumberBE(ws.slice(40, 80)), P256_CURVE.n);
|
|
55
54
|
return { w0, w1 };
|
|
56
55
|
}
|
|
57
|
-
static async computeW0L(pbkdfParameters, pin) {
|
|
58
|
-
const { w0, w1 } = await this.computeW0W1(pbkdfParameters, pin);
|
|
56
|
+
static async computeW0L(crypto, pbkdfParameters, pin) {
|
|
57
|
+
const { w0, w1 } = await this.computeW0W1(crypto, pbkdfParameters, pin);
|
|
59
58
|
const L = ProjectivePoint.BASE.multiply(w1).toRawBytes(false);
|
|
60
59
|
return { w0, L };
|
|
61
60
|
}
|
|
62
|
-
static create(context, w0) {
|
|
63
|
-
const random =
|
|
64
|
-
return new Spake2p(context, random, w0);
|
|
61
|
+
static create(crypto, context, w0) {
|
|
62
|
+
const random = crypto.randomBigInt(32, P256_CURVE.Fp.ORDER);
|
|
63
|
+
return new Spake2p(crypto, context, random, w0);
|
|
64
|
+
}
|
|
65
|
+
constructor(crypto, context, random, w0) {
|
|
66
|
+
this.#crypto = crypto;
|
|
67
|
+
this.#context = context;
|
|
68
|
+
this.#random = random;
|
|
69
|
+
this.#w0 = w0;
|
|
65
70
|
}
|
|
66
71
|
computeX() {
|
|
67
|
-
const X = ProjectivePoint.BASE.multiply(this
|
|
72
|
+
const X = ProjectivePoint.BASE.multiply(this.#random).add(M.multiply(this.#w0));
|
|
68
73
|
return X.toRawBytes(false);
|
|
69
74
|
}
|
|
70
75
|
computeY() {
|
|
71
|
-
const Y = ProjectivePoint.BASE.multiply(this
|
|
76
|
+
const Y = ProjectivePoint.BASE.multiply(this.#random).add(N.multiply(this.#w0));
|
|
72
77
|
return Y.toRawBytes(false);
|
|
73
78
|
}
|
|
74
79
|
async computeSecretAndVerifiersFromY(w1, X, Y) {
|
|
@@ -78,8 +83,8 @@ class Spake2p {
|
|
|
78
83
|
} catch (error) {
|
|
79
84
|
throw new import_MatterError.InternalError(`Y is not on the curve: ${error.message}`);
|
|
80
85
|
}
|
|
81
|
-
const yNwo = YPoint.add(N.multiply(this
|
|
82
|
-
const Z = yNwo.multiply(this
|
|
86
|
+
const yNwo = YPoint.add(N.multiply(this.#w0).negate());
|
|
87
|
+
const Z = yNwo.multiply(this.#random);
|
|
83
88
|
const V = yNwo.multiply(w1);
|
|
84
89
|
return this.computeSecretAndVerifiers(X, Y, Z.toRawBytes(false), V.toRawBytes(false));
|
|
85
90
|
}
|
|
@@ -91,24 +96,24 @@ class Spake2p {
|
|
|
91
96
|
} catch (error) {
|
|
92
97
|
throw new import_MatterError.InternalError(`X is not on the curve: ${error.message}`);
|
|
93
98
|
}
|
|
94
|
-
const Z = XPoint.add(M.multiply(this
|
|
95
|
-
const V = LPoint.multiply(this
|
|
99
|
+
const Z = XPoint.add(M.multiply(this.#w0).negate()).multiply(this.#random);
|
|
100
|
+
const V = LPoint.multiply(this.#random);
|
|
96
101
|
return this.computeSecretAndVerifiers(X, Y, Z.toRawBytes(false), V.toRawBytes(false));
|
|
97
102
|
}
|
|
98
103
|
async computeSecretAndVerifiers(X, Y, Z, V) {
|
|
99
104
|
const TT_HASH = await this.computeTranscriptHash(X, Y, Z, V);
|
|
100
105
|
const Ka = TT_HASH.slice(0, 16);
|
|
101
106
|
const Ke = TT_HASH.slice(16, 32);
|
|
102
|
-
const KcAB = await
|
|
107
|
+
const KcAB = await this.#crypto.createHkdfKey(Ka, new Uint8Array(0), import_Bytes.Bytes.fromString("ConfirmationKeys"), 32);
|
|
103
108
|
const KcA = KcAB.slice(0, 16);
|
|
104
109
|
const KcB = KcAB.slice(16, 32);
|
|
105
|
-
const hAY = await
|
|
106
|
-
const hBX = await
|
|
110
|
+
const hAY = await this.#crypto.signHmac(KcA, Y);
|
|
111
|
+
const hBX = await this.#crypto.signHmac(KcB, X);
|
|
107
112
|
return { Ke, hAY, hBX };
|
|
108
113
|
}
|
|
109
114
|
computeTranscriptHash(X, Y, Z, V) {
|
|
110
115
|
const TTwriter = new import_DataWriter.DataWriter(import_Bytes.Endian.Little);
|
|
111
|
-
this.addToContext(TTwriter, this
|
|
116
|
+
this.addToContext(TTwriter, this.#context);
|
|
112
117
|
this.addToContext(TTwriter, import_Bytes.Bytes.fromString(""));
|
|
113
118
|
this.addToContext(TTwriter, import_Bytes.Bytes.fromString(""));
|
|
114
119
|
this.addToContext(TTwriter, M.toRawBytes(false));
|
|
@@ -117,8 +122,8 @@ class Spake2p {
|
|
|
117
122
|
this.addToContext(TTwriter, Y);
|
|
118
123
|
this.addToContext(TTwriter, Z);
|
|
119
124
|
this.addToContext(TTwriter, V);
|
|
120
|
-
this.addToContext(TTwriter, numberToBytesBE(this
|
|
121
|
-
return
|
|
125
|
+
this.addToContext(TTwriter, numberToBytesBE(this.#w0, 32));
|
|
126
|
+
return this.#crypto.computeSha256(TTwriter.toByteArray());
|
|
122
127
|
}
|
|
123
128
|
addToContext(TTwriter, data) {
|
|
124
129
|
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,yBAA8B;AAC9B,mBAA8B;AAC9B,wBAA2B;AAC3B,oBAA2B;AAC3B,6BAAwC;AAVxC;AAAA;AAAA;AAAA;AAAA;AAYA,MAAM;AAAA,EACF,MAAM,EAAE,iBAAiB,OAAO,WAAW;AAAA,EAC3C;AAAA,EACA;AAAA,EACA;AACJ,IAAI;AAGJ,MAAM,IAAI,gBAAgB,QAAQ,oEAAoE;AACtG,MAAM,IAAI,gBAAgB,QAAQ,oEAAoE;AAEtG,MAAM,sBAAsB,iDAA0B;AAO/C,MAAM,QAAQ;AAAA,
|
|
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"}
|