@matter/general 0.14.1-alpha.0-20250606-a9bcd03f9 → 0.15.0-alpha.0-20250612-ddd428561
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/codec/DerCodec.d.ts +12 -17
- package/dist/cjs/codec/DerCodec.d.ts.map +1 -1
- package/dist/cjs/codec/DerCodec.js +90 -51
- package/dist/cjs/codec/DerCodec.js.map +1 -1
- package/dist/cjs/codec/DerTypes.js +1 -1
- package/dist/cjs/codec/DnsCodec.d.ts +5 -5
- package/dist/cjs/crypto/Crypto.d.ts +111 -62
- package/dist/cjs/crypto/Crypto.d.ts.map +1 -1
- package/dist/cjs/crypto/Crypto.js +92 -31
- package/dist/cjs/crypto/Crypto.js.map +1 -1
- package/dist/cjs/crypto/CryptoError.d.ts +32 -0
- package/dist/cjs/crypto/CryptoError.d.ts.map +1 -0
- package/dist/cjs/crypto/CryptoError.js +44 -0
- package/dist/cjs/crypto/CryptoError.js.map +6 -0
- package/dist/cjs/crypto/Key.d.ts +2 -2
- package/dist/cjs/crypto/Key.d.ts.map +1 -1
- package/dist/cjs/crypto/Key.js +15 -16
- package/dist/cjs/crypto/Key.js.map +1 -1
- package/dist/cjs/crypto/Spake2p.js +5 -5
- package/dist/cjs/crypto/Spake2p.js.map +1 -1
- package/dist/cjs/crypto/StandardCrypto.d.ts +33 -0
- package/dist/cjs/crypto/StandardCrypto.d.ts.map +1 -0
- package/dist/cjs/crypto/StandardCrypto.js +208 -0
- package/dist/cjs/crypto/StandardCrypto.js.map +6 -0
- package/dist/cjs/crypto/aes/Aes.d.ts +21 -0
- package/dist/cjs/crypto/aes/Aes.d.ts.map +1 -0
- package/dist/cjs/crypto/aes/Aes.js +132 -0
- package/dist/cjs/crypto/aes/Aes.js.map +6 -0
- package/dist/cjs/crypto/aes/Ccm.d.ts +71 -0
- package/dist/cjs/crypto/aes/Ccm.d.ts.map +1 -0
- package/dist/cjs/crypto/aes/Ccm.js +194 -0
- package/dist/cjs/crypto/aes/Ccm.js.map +6 -0
- package/dist/cjs/crypto/aes/WordArray.d.ts +30 -0
- package/dist/cjs/crypto/aes/WordArray.d.ts.map +1 -0
- package/dist/cjs/crypto/aes/WordArray.js +91 -0
- package/dist/cjs/crypto/aes/WordArray.js.map +6 -0
- package/dist/cjs/crypto/index.d.ts +3 -0
- package/dist/cjs/crypto/index.d.ts.map +1 -1
- package/dist/cjs/crypto/index.js +3 -0
- package/dist/cjs/crypto/index.js.map +1 -1
- package/dist/cjs/crypto/nonentropic.d.ts +16 -0
- package/dist/cjs/crypto/nonentropic.d.ts.map +1 -0
- package/dist/cjs/crypto/nonentropic.js +70 -0
- package/dist/cjs/crypto/nonentropic.js.map +6 -0
- package/dist/cjs/environment/Environment.d.ts.map +1 -1
- package/dist/cjs/environment/Environment.js +1 -5
- package/dist/cjs/environment/Environment.js.map +1 -1
- package/dist/cjs/environment/RuntimeService.d.ts +2 -4
- package/dist/cjs/environment/RuntimeService.d.ts.map +1 -1
- package/dist/cjs/environment/RuntimeService.js +4 -4
- package/dist/cjs/environment/RuntimeService.js.map +1 -1
- package/dist/cjs/environment/VariableService.d.ts.map +1 -1
- package/dist/cjs/environment/VariableService.js +1 -0
- package/dist/cjs/environment/VariableService.js.map +1 -1
- package/dist/cjs/log/LogFormat.js +17 -11
- package/dist/cjs/log/LogFormat.js.map +1 -1
- package/dist/cjs/net/Network.d.ts +0 -1
- package/dist/cjs/net/Network.d.ts.map +1 -1
- package/dist/cjs/net/Network.js +0 -4
- package/dist/cjs/net/Network.js.map +1 -1
- package/dist/cjs/time/Time.d.ts.map +1 -1
- package/dist/cjs/time/Time.js +2 -2
- package/dist/cjs/time/Time.js.map +1 -1
- package/dist/cjs/util/Bytes.d.ts +6 -0
- package/dist/cjs/util/Bytes.d.ts.map +1 -1
- package/dist/cjs/util/Bytes.js +15 -1
- package/dist/cjs/util/Bytes.js.map +1 -1
- package/dist/cjs/util/DataWriter.d.ts +1 -1
- package/dist/cjs/util/DataWriter.js +2 -2
- package/dist/cjs/util/DataWriter.js.map +1 -1
- package/dist/cjs/util/DeepCopy.js +1 -1
- package/dist/cjs/util/DeepCopy.js.map +1 -1
- package/dist/cjs/util/GeneratedClass.d.ts +3 -3
- package/dist/cjs/util/GeneratedClass.d.ts.map +1 -1
- package/dist/cjs/util/GeneratedClass.js +99 -73
- package/dist/cjs/util/GeneratedClass.js.map +2 -2
- package/dist/cjs/util/Number.d.ts +0 -1
- package/dist/cjs/util/Number.d.ts.map +1 -1
- package/dist/cjs/util/Number.js +0 -4
- package/dist/cjs/util/Number.js.map +1 -1
- package/dist/esm/codec/DerCodec.d.ts +12 -17
- package/dist/esm/codec/DerCodec.d.ts.map +1 -1
- package/dist/esm/codec/DerCodec.js +90 -51
- package/dist/esm/codec/DerCodec.js.map +1 -1
- package/dist/esm/codec/DerTypes.js +2 -2
- package/dist/esm/codec/DnsCodec.d.ts +5 -5
- package/dist/esm/crypto/Crypto.d.ts +111 -62
- package/dist/esm/crypto/Crypto.d.ts.map +1 -1
- package/dist/esm/crypto/Crypto.js +93 -32
- package/dist/esm/crypto/Crypto.js.map +1 -1
- package/dist/esm/crypto/CryptoError.d.ts +32 -0
- package/dist/esm/crypto/CryptoError.d.ts.map +1 -0
- package/dist/esm/crypto/CryptoError.js +24 -0
- package/dist/esm/crypto/CryptoError.js.map +6 -0
- package/dist/esm/crypto/Key.d.ts +2 -2
- package/dist/esm/crypto/Key.d.ts.map +1 -1
- package/dist/esm/crypto/Key.js +15 -16
- package/dist/esm/crypto/Key.js.map +1 -1
- package/dist/esm/crypto/Spake2p.js +5 -5
- package/dist/esm/crypto/Spake2p.js.map +1 -1
- package/dist/esm/crypto/StandardCrypto.d.ts +33 -0
- package/dist/esm/crypto/StandardCrypto.d.ts.map +1 -0
- package/dist/esm/crypto/StandardCrypto.js +188 -0
- package/dist/esm/crypto/StandardCrypto.js.map +6 -0
- package/dist/esm/crypto/aes/Aes.d.ts +21 -0
- package/dist/esm/crypto/aes/Aes.d.ts.map +1 -0
- package/dist/esm/crypto/aes/Aes.js +112 -0
- package/dist/esm/crypto/aes/Aes.js.map +6 -0
- package/dist/esm/crypto/aes/Ccm.d.ts +71 -0
- package/dist/esm/crypto/aes/Ccm.d.ts.map +1 -0
- package/dist/esm/crypto/aes/Ccm.js +174 -0
- package/dist/esm/crypto/aes/Ccm.js.map +6 -0
- package/dist/esm/crypto/aes/WordArray.d.ts +30 -0
- package/dist/esm/crypto/aes/WordArray.d.ts.map +1 -0
- package/dist/esm/crypto/aes/WordArray.js +71 -0
- package/dist/esm/crypto/aes/WordArray.js.map +6 -0
- package/dist/esm/crypto/index.d.ts +3 -0
- package/dist/esm/crypto/index.d.ts.map +1 -1
- package/dist/esm/crypto/index.js +3 -0
- package/dist/esm/crypto/index.js.map +1 -1
- package/dist/esm/crypto/nonentropic.d.ts +16 -0
- package/dist/esm/crypto/nonentropic.d.ts.map +1 -0
- package/dist/esm/crypto/nonentropic.js +50 -0
- package/dist/esm/crypto/nonentropic.js.map +6 -0
- package/dist/esm/environment/Environment.d.ts.map +1 -1
- package/dist/esm/environment/Environment.js +1 -5
- package/dist/esm/environment/Environment.js.map +1 -1
- package/dist/esm/environment/RuntimeService.d.ts +2 -4
- package/dist/esm/environment/RuntimeService.d.ts.map +1 -1
- package/dist/esm/environment/RuntimeService.js +4 -4
- package/dist/esm/environment/RuntimeService.js.map +1 -1
- package/dist/esm/environment/VariableService.d.ts.map +1 -1
- package/dist/esm/environment/VariableService.js +1 -0
- package/dist/esm/environment/VariableService.js.map +1 -1
- package/dist/esm/log/LogFormat.js +17 -11
- package/dist/esm/log/LogFormat.js.map +1 -1
- package/dist/esm/net/Network.d.ts +0 -1
- package/dist/esm/net/Network.d.ts.map +1 -1
- package/dist/esm/net/Network.js +1 -5
- package/dist/esm/net/Network.js.map +1 -1
- package/dist/esm/time/Time.d.ts.map +1 -1
- package/dist/esm/time/Time.js +2 -2
- package/dist/esm/time/Time.js.map +1 -1
- package/dist/esm/util/Bytes.d.ts +6 -0
- package/dist/esm/util/Bytes.d.ts.map +1 -1
- package/dist/esm/util/Bytes.js +15 -1
- package/dist/esm/util/Bytes.js.map +1 -1
- package/dist/esm/util/DataWriter.d.ts +1 -1
- package/dist/esm/util/DataWriter.js +3 -3
- package/dist/esm/util/DataWriter.js.map +1 -1
- package/dist/esm/util/DeepCopy.js +1 -1
- package/dist/esm/util/DeepCopy.js.map +1 -1
- package/dist/esm/util/GeneratedClass.d.ts +3 -3
- package/dist/esm/util/GeneratedClass.d.ts.map +1 -1
- package/dist/esm/util/GeneratedClass.js +97 -71
- package/dist/esm/util/GeneratedClass.js.map +2 -2
- package/dist/esm/util/Number.d.ts +0 -1
- package/dist/esm/util/Number.d.ts.map +1 -1
- package/dist/esm/util/Number.js +0 -4
- package/dist/esm/util/Number.js.map +1 -1
- package/package.json +3 -3
- package/src/codec/DerCodec.ts +106 -52
- package/src/codec/DerTypes.ts +2 -2
- package/src/crypto/Crypto.ts +196 -76
- package/src/crypto/CryptoError.ts +32 -0
- package/src/crypto/Key.ts +17 -18
- package/src/crypto/Spake2p.ts +5 -5
- package/src/crypto/StandardCrypto.ts +252 -0
- package/src/crypto/aes/Aes.ts +210 -0
- package/src/crypto/aes/Ccm.ts +350 -0
- package/src/crypto/aes/README.md +4 -0
- package/src/crypto/aes/WordArray.ts +105 -0
- package/src/crypto/index.ts +3 -0
- package/src/crypto/nonentropic.ts +65 -0
- package/src/environment/Environment.ts +1 -6
- package/src/environment/RuntimeService.ts +5 -5
- package/src/environment/VariableService.ts +1 -0
- package/src/log/LogFormat.ts +19 -11
- package/src/net/Network.ts +1 -7
- package/src/time/Time.ts +4 -4
- package/src/util/Bytes.ts +19 -0
- package/src/util/DataWriter.ts +3 -3
- package/src/util/DeepCopy.ts +2 -2
- package/src/util/GeneratedClass.ts +161 -102
- package/src/util/Number.ts +0 -4
|
@@ -0,0 +1,188 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
*
|
|
4
|
+
* Portions copyright 2022-2023 Project CHIP Authors
|
|
5
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
6
|
+
*/
|
|
7
|
+
import { DerBigUint, DerCodec, DerError } from "#codec/DerCodec.js";
|
|
8
|
+
import { Boot } from "#util/Boot.js";
|
|
9
|
+
import { Bytes } from "#util/Bytes.js";
|
|
10
|
+
import { Ccm } from "./aes/Ccm.js";
|
|
11
|
+
import { Crypto, CRYPTO_SYMMETRIC_KEY_LENGTH } from "./Crypto.js";
|
|
12
|
+
import { CryptoVerifyError, KeyInputError } from "./CryptoError.js";
|
|
13
|
+
import { CurveType, Key, KeyType } from "./Key.js";
|
|
14
|
+
const subtle = globalThis.crypto.subtle;
|
|
15
|
+
const SIGNATURE_ALGORITHM = {
|
|
16
|
+
name: "ECDSA",
|
|
17
|
+
namedCurve: "P-256",
|
|
18
|
+
hash: { name: "SHA-256" }
|
|
19
|
+
};
|
|
20
|
+
class StandardCrypto {
|
|
21
|
+
implementationName = "JS";
|
|
22
|
+
static provider() {
|
|
23
|
+
return new StandardCrypto();
|
|
24
|
+
}
|
|
25
|
+
getRandomData(length) {
|
|
26
|
+
const result = new Uint8Array(length);
|
|
27
|
+
crypto.getRandomValues(result);
|
|
28
|
+
return result;
|
|
29
|
+
}
|
|
30
|
+
encrypt(key, data, nonce, associatedData) {
|
|
31
|
+
const ccm = Ccm(key);
|
|
32
|
+
return ccm.encrypt({ pt: data, nonce, adata: associatedData });
|
|
33
|
+
}
|
|
34
|
+
decrypt(key, data, nonce, associatedData) {
|
|
35
|
+
const ccm = Ccm(key);
|
|
36
|
+
return ccm.decrypt({ ct: data, nonce, adata: associatedData });
|
|
37
|
+
}
|
|
38
|
+
async computeSha256(buffer) {
|
|
39
|
+
if (Array.isArray(buffer)) {
|
|
40
|
+
buffer = Bytes.concat(...buffer);
|
|
41
|
+
}
|
|
42
|
+
return new Uint8Array(await subtle.digest("SHA-256", buffer));
|
|
43
|
+
}
|
|
44
|
+
async createPbkdf2Key(secret, salt, iteration, keyLength) {
|
|
45
|
+
const key = await importKey("raw", secret, "PBKDF2", false, ["deriveBits"]);
|
|
46
|
+
const bits = await subtle.deriveBits(
|
|
47
|
+
{
|
|
48
|
+
name: "PBKDF2",
|
|
49
|
+
hash: "SHA-256",
|
|
50
|
+
salt,
|
|
51
|
+
iterations: iteration
|
|
52
|
+
},
|
|
53
|
+
key,
|
|
54
|
+
keyLength * 8
|
|
55
|
+
);
|
|
56
|
+
return new Uint8Array(bits);
|
|
57
|
+
}
|
|
58
|
+
async createHkdfKey(secret, salt, info, length = CRYPTO_SYMMETRIC_KEY_LENGTH) {
|
|
59
|
+
const key = await importKey("raw", secret, "HKDF", false, ["deriveBits"]);
|
|
60
|
+
const bits = await subtle.deriveBits(
|
|
61
|
+
{
|
|
62
|
+
name: "HKDF",
|
|
63
|
+
hash: "SHA-256",
|
|
64
|
+
salt,
|
|
65
|
+
info
|
|
66
|
+
},
|
|
67
|
+
key,
|
|
68
|
+
8 * length
|
|
69
|
+
);
|
|
70
|
+
return new Uint8Array(bits);
|
|
71
|
+
}
|
|
72
|
+
async signHmac(secret, data) {
|
|
73
|
+
const key = await importKey("raw", secret, { name: "HMAC", hash: "SHA-256" }, false, ["sign"]);
|
|
74
|
+
return new Uint8Array(await subtle.sign("HMAC", key, data));
|
|
75
|
+
}
|
|
76
|
+
async signEcdsa(key, data, dsaEncoding) {
|
|
77
|
+
if (Array.isArray(data)) {
|
|
78
|
+
data = Bytes.concat(...data);
|
|
79
|
+
}
|
|
80
|
+
const { crv, kty, d, x, y } = key;
|
|
81
|
+
key = {
|
|
82
|
+
kty,
|
|
83
|
+
crv,
|
|
84
|
+
d,
|
|
85
|
+
x,
|
|
86
|
+
y,
|
|
87
|
+
ext: true,
|
|
88
|
+
// Required by some subtle implementations to sign
|
|
89
|
+
key_ops: ["sign"]
|
|
90
|
+
};
|
|
91
|
+
const subtleKey = await importKey("jwk", key, SIGNATURE_ALGORITHM, false, ["sign"]);
|
|
92
|
+
const ieeeP1363 = await subtle.sign(SIGNATURE_ALGORITHM, subtleKey, data);
|
|
93
|
+
if (dsaEncoding !== "der") return new Uint8Array(ieeeP1363);
|
|
94
|
+
const bytesPerComponent = ieeeP1363.byteLength / 2;
|
|
95
|
+
return DerCodec.encode({
|
|
96
|
+
r: DerBigUint(ieeeP1363.slice(0, bytesPerComponent)),
|
|
97
|
+
s: DerBigUint(ieeeP1363.slice(bytesPerComponent))
|
|
98
|
+
});
|
|
99
|
+
}
|
|
100
|
+
async verifyEcdsa(key, data, signature, dsaEncoding) {
|
|
101
|
+
const { crv, kty, x, y } = key;
|
|
102
|
+
key = { crv, kty, x, y };
|
|
103
|
+
const subtleKey = await importKey("jwk", key, SIGNATURE_ALGORITHM, false, ["verify"]);
|
|
104
|
+
if (dsaEncoding === "der") {
|
|
105
|
+
try {
|
|
106
|
+
const decoded = DerCodec.decode(signature);
|
|
107
|
+
const r = DerCodec.decodeBigUint(decoded?._elements?.[0], 32);
|
|
108
|
+
const s = DerCodec.decodeBigUint(decoded?._elements?.[1], 32);
|
|
109
|
+
signature = Bytes.concat(r, s);
|
|
110
|
+
} catch (cause) {
|
|
111
|
+
DerError.accept(cause);
|
|
112
|
+
throw new CryptoVerifyError("Invalid DER signature", { cause });
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
const verified = await subtle.verify(SIGNATURE_ALGORITHM, subtleKey, signature, data);
|
|
116
|
+
if (!verified) {
|
|
117
|
+
throw new CryptoVerifyError("Signature verification failed");
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
async createKeyPair() {
|
|
121
|
+
const subtleKey = await subtle.generateKey(
|
|
122
|
+
{
|
|
123
|
+
// We must specify either ECDH or ECDSA to get an EC key but we may use the key for either (but not for
|
|
124
|
+
// both)
|
|
125
|
+
name: "ECDH",
|
|
126
|
+
namedCurve: "P-256"
|
|
127
|
+
},
|
|
128
|
+
true,
|
|
129
|
+
// We must also specify usage but will drop this on export
|
|
130
|
+
["deriveKey"]
|
|
131
|
+
);
|
|
132
|
+
const key = await subtle.exportKey("jwk", subtleKey.privateKey);
|
|
133
|
+
return Key({
|
|
134
|
+
kty: KeyType.EC,
|
|
135
|
+
crv: CurveType.p256,
|
|
136
|
+
d: key.d,
|
|
137
|
+
x: key.x,
|
|
138
|
+
y: key.y
|
|
139
|
+
});
|
|
140
|
+
}
|
|
141
|
+
async generateDhSecret(key, peerKey) {
|
|
142
|
+
const subtleKey = await importKey(
|
|
143
|
+
"jwk",
|
|
144
|
+
key,
|
|
145
|
+
{
|
|
146
|
+
name: "ECDH",
|
|
147
|
+
namedCurve: "P-256"
|
|
148
|
+
},
|
|
149
|
+
false,
|
|
150
|
+
["deriveBits"]
|
|
151
|
+
);
|
|
152
|
+
const subtlePeerKey = await importKey(
|
|
153
|
+
"jwk",
|
|
154
|
+
peerKey,
|
|
155
|
+
{
|
|
156
|
+
name: "ECDH",
|
|
157
|
+
namedCurve: "P-256"
|
|
158
|
+
},
|
|
159
|
+
false,
|
|
160
|
+
[]
|
|
161
|
+
);
|
|
162
|
+
const secret = await subtle.deriveBits(
|
|
163
|
+
{
|
|
164
|
+
name: "ECDH",
|
|
165
|
+
public: subtlePeerKey
|
|
166
|
+
},
|
|
167
|
+
subtleKey,
|
|
168
|
+
256
|
|
169
|
+
);
|
|
170
|
+
return new Uint8Array(secret);
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
if (globalThis.crypto?.subtle?.[Symbol.toStringTag] === "SubtleCrypto") {
|
|
174
|
+
Boot.init(() => {
|
|
175
|
+
Crypto.provider = StandardCrypto.provider;
|
|
176
|
+
});
|
|
177
|
+
}
|
|
178
|
+
async function importKey(...params) {
|
|
179
|
+
try {
|
|
180
|
+
return await crypto.subtle.importKey(...params);
|
|
181
|
+
} catch (cause) {
|
|
182
|
+
throw new KeyInputError("Invalid key", { cause });
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
export {
|
|
186
|
+
StandardCrypto
|
|
187
|
+
};
|
|
188
|
+
//# sourceMappingURL=StandardCrypto.js.map
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../src/crypto/StandardCrypto.ts"],
|
|
4
|
+
"mappings": "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",
|
|
5
|
+
"names": []
|
|
6
|
+
}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright 2022-2025 Project CHIP Authors
|
|
4
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
5
|
+
*/
|
|
6
|
+
/**
|
|
7
|
+
* SJCL: https://github.com/bitwiseshiftleft/sjcl/blob/master/core/aes.js
|
|
8
|
+
*
|
|
9
|
+
* OpenSSL: https://github.com/openssl/openssl/blob/master/crypto/aes/aes_core.c
|
|
10
|
+
*/
|
|
11
|
+
import { WordArray } from "./WordArray.js";
|
|
12
|
+
/**
|
|
13
|
+
* AES core block cipher implementation.
|
|
14
|
+
*
|
|
15
|
+
* WARNING: Unaudited. Consider platform replacement if available.
|
|
16
|
+
*/
|
|
17
|
+
export declare function Aes(key: Uint8Array): {
|
|
18
|
+
encrypt(pt: WordArray, ct?: WordArray): WordArray;
|
|
19
|
+
decrypt(ct: WordArray, pt?: WordArray): WordArray;
|
|
20
|
+
};
|
|
21
|
+
//# sourceMappingURL=Aes.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Aes.d.ts","sourceRoot":"","sources":["../../../../src/crypto/aes/Aes.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH;;;;GAIG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAE3C;;;;GAIG;AACH,wBAAgB,GAAG,CAAC,GAAG,EAAE,UAAU;gBAIf,SAAS;gBAIT,SAAS;EAI5B"}
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright 2022-2025 Project CHIP Authors
|
|
4
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
5
|
+
*/
|
|
6
|
+
import { WordArray } from "./WordArray.js";
|
|
7
|
+
function Aes(key) {
|
|
8
|
+
const { encryptKey, decryptKey } = expandKey(key);
|
|
9
|
+
return {
|
|
10
|
+
encrypt(pt, ct = pt) {
|
|
11
|
+
return crypt(pt, ct, encryptKey, Tables.enc);
|
|
12
|
+
},
|
|
13
|
+
decrypt(ct, pt = ct) {
|
|
14
|
+
return crypt(ct, pt, decryptKey, Tables.dec);
|
|
15
|
+
}
|
|
16
|
+
};
|
|
17
|
+
}
|
|
18
|
+
let etabs, dtabs;
|
|
19
|
+
const Tables = {
|
|
20
|
+
get enc() {
|
|
21
|
+
if (!etabs) {
|
|
22
|
+
generateTables();
|
|
23
|
+
}
|
|
24
|
+
return etabs;
|
|
25
|
+
},
|
|
26
|
+
get dec() {
|
|
27
|
+
if (!dtabs) {
|
|
28
|
+
generateTables();
|
|
29
|
+
}
|
|
30
|
+
return dtabs;
|
|
31
|
+
}
|
|
32
|
+
};
|
|
33
|
+
const mixNames = ["mix1", "mix2", "mix3", "mix4"];
|
|
34
|
+
function generateTables() {
|
|
35
|
+
etabs = Tables2();
|
|
36
|
+
dtabs = Tables2();
|
|
37
|
+
const d = Table(), th = Table();
|
|
38
|
+
let i, x, xInv, x2, x4, x8, s, tEnc, tDec;
|
|
39
|
+
for (i = 0; i < 256; i++) {
|
|
40
|
+
th[(d[i] = i << 1 ^ (i >> 7) * 283) ^ i] = i;
|
|
41
|
+
}
|
|
42
|
+
for (x = xInv = 0; !etabs.sbox[x]; x ^= x2 || 1, xInv = th[xInv] || 1) {
|
|
43
|
+
s = xInv ^ xInv << 1 ^ xInv << 2 ^ xInv << 3 ^ xInv << 4;
|
|
44
|
+
s = s >> 8 ^ s & 255 ^ 99;
|
|
45
|
+
etabs.sbox[x] = s;
|
|
46
|
+
dtabs.sbox[s] = x;
|
|
47
|
+
x8 = d[x4 = d[x2 = d[x]]];
|
|
48
|
+
tDec = x8 * 16843009 ^ x4 * 65537 ^ x2 * 257 ^ x * 16843008;
|
|
49
|
+
tEnc = d[s] * 257 ^ s * 16843008;
|
|
50
|
+
for (const name of mixNames) {
|
|
51
|
+
etabs[name][x] = tEnc = tEnc << 24 ^ tEnc >>> 8;
|
|
52
|
+
dtabs[name][s] = tDec = tDec << 24 ^ tDec >>> 8;
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
function Tables2() {
|
|
56
|
+
return Object.fromEntries([...mixNames, "sbox"].map((k) => [k, Table()]));
|
|
57
|
+
}
|
|
58
|
+
function Table() {
|
|
59
|
+
return WordArray(256);
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
function crypt(input, output, roundKeys, tabs) {
|
|
63
|
+
const decrypt = tabs === dtabs, numRounds = roundKeys.length / 4 - 2;
|
|
64
|
+
const { mix1, mix2, mix3, mix4, sbox } = tabs;
|
|
65
|
+
let a = input[0] ^ roundKeys[0], b = input[decrypt ? 3 : 1] ^ roundKeys[1], c = input[2] ^ roundKeys[2], d = input[decrypt ? 1 : 3] ^ roundKeys[3], roundKeyAt = 4;
|
|
66
|
+
for (let i = 0; i < numRounds; i++) {
|
|
67
|
+
const atemp = mix1[a >>> 24] ^ mix2[b >> 16 & 255] ^ mix3[c >> 8 & 255] ^ mix4[d & 255] ^ roundKeys[roundKeyAt++];
|
|
68
|
+
const btemp = mix1[b >>> 24] ^ mix2[c >> 16 & 255] ^ mix3[d >> 8 & 255] ^ mix4[a & 255] ^ roundKeys[roundKeyAt++];
|
|
69
|
+
const ctemp = mix1[c >>> 24] ^ mix2[d >> 16 & 255] ^ mix3[a >> 8 & 255] ^ mix4[b & 255] ^ roundKeys[roundKeyAt++];
|
|
70
|
+
d = mix1[d >>> 24] ^ mix2[a >> 16 & 255] ^ mix3[b >> 8 & 255] ^ mix4[c & 255] ^ roundKeys[roundKeyAt++];
|
|
71
|
+
a = atemp;
|
|
72
|
+
b = btemp;
|
|
73
|
+
c = ctemp;
|
|
74
|
+
}
|
|
75
|
+
for (let i = 0; i < 4; i++) {
|
|
76
|
+
output[decrypt ? 3 & -i : i] = sbox[a >>> 24] << 24 ^ sbox[b >> 16 & 255] << 16 ^ sbox[c >> 8 & 255] << 8 ^ sbox[d & 255] ^ roundKeys[roundKeyAt++];
|
|
77
|
+
const atemp = a;
|
|
78
|
+
a = b;
|
|
79
|
+
b = c;
|
|
80
|
+
c = d;
|
|
81
|
+
d = atemp;
|
|
82
|
+
}
|
|
83
|
+
return output;
|
|
84
|
+
}
|
|
85
|
+
function expandKey(key) {
|
|
86
|
+
const inputLength = key.length / 4, roundsNeeded = inputLength + 7, wordsNeeded = roundsNeeded * 4, encryptKey = WordArray.fromByteArray(key, wordsNeeded), sbox = Tables.enc.sbox;
|
|
87
|
+
for (let i = inputLength, rcon = 1; i < wordsNeeded; i++) {
|
|
88
|
+
let temp = encryptKey[i - 1];
|
|
89
|
+
if (i % inputLength === 0 || inputLength === 8 && i % inputLength === 4) {
|
|
90
|
+
temp = sbox[temp >>> 24] << 24 ^ sbox[temp >> 16 & 255] << 16 ^ sbox[temp >> 8 & 255] << 8 ^ sbox[temp & 255];
|
|
91
|
+
if (i % inputLength === 0) {
|
|
92
|
+
temp = temp << 8 ^ temp >>> 24 ^ rcon << 24;
|
|
93
|
+
rcon = rcon << 1 ^ (rcon >> 7) * 283;
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
encryptKey[i] = encryptKey[i - inputLength] ^ temp;
|
|
97
|
+
}
|
|
98
|
+
const { mix1, mix2, mix3, mix4 } = Tables.dec, decryptKey = WordArray(encryptKey.length);
|
|
99
|
+
for (let i = encryptKey.length, j = 0; i; j++, i--) {
|
|
100
|
+
const tmp = encryptKey[j & 3 ? i : i - 4];
|
|
101
|
+
if (i <= 4 || j < 4) {
|
|
102
|
+
decryptKey[j] = tmp;
|
|
103
|
+
} else {
|
|
104
|
+
decryptKey[j] = mix1[sbox[tmp >>> 24]] ^ mix2[sbox[tmp >> 16 & 255]] ^ mix3[sbox[tmp >> 8 & 255]] ^ mix4[sbox[tmp & 255]];
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
return { encryptKey, decryptKey };
|
|
108
|
+
}
|
|
109
|
+
export {
|
|
110
|
+
Aes
|
|
111
|
+
};
|
|
112
|
+
//# sourceMappingURL=Aes.js.map
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../src/crypto/aes/Aes.ts"],
|
|
4
|
+
"mappings": "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",
|
|
5
|
+
"names": ["Tables"]
|
|
6
|
+
}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright 2022-2025 Project CHIP Authors
|
|
4
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
5
|
+
*/
|
|
6
|
+
/**
|
|
7
|
+
* WARNING: Unaudited. Consider platform replacement if available.
|
|
8
|
+
*
|
|
9
|
+
* This AES-CCM implementation is tailored for Matter:
|
|
10
|
+
*
|
|
11
|
+
* * Only supports 2-byte length
|
|
12
|
+
*
|
|
13
|
+
* * Only supports 13-byte nonce
|
|
14
|
+
*
|
|
15
|
+
* * Stores the MIC in the ciphertext buffer following the ciphertext
|
|
16
|
+
*
|
|
17
|
+
* * Our AES implementation supports multiple key sizes but only 16 bytes are legal
|
|
18
|
+
*
|
|
19
|
+
* We take a few approaches to improve performance:
|
|
20
|
+
*
|
|
21
|
+
* * Uses singletons for temporary working buffers to avoid GC
|
|
22
|
+
*
|
|
23
|
+
* * Uses Uint8Array, Int32Array and DataView depending on which is most efficient while addressing platform byte order
|
|
24
|
+
*
|
|
25
|
+
* * Performs data conversion one block at a time rather than converting entire input/output buffer
|
|
26
|
+
*
|
|
27
|
+
* * Functions are monomorphic and should JIT well
|
|
28
|
+
*
|
|
29
|
+
* Implementation notes:
|
|
30
|
+
*
|
|
31
|
+
* * Data operations operate on 128-bit blocks, either as bytes or as 4 32-bit words in platform byte order. We share
|
|
32
|
+
* underlying memory for both formats, but on little-endian platforms they are not directly interchangeable without a
|
|
33
|
+
* round-trip through a DataView
|
|
34
|
+
*
|
|
35
|
+
* * We encode words as a signed Int32Array because JS bit operations operate on signed 32-bit integers and a
|
|
36
|
+
* Uint32Array would require manually casting from signed to unsigned
|
|
37
|
+
*
|
|
38
|
+
* * Use of singleton buffers require this code to be synchronous. If that were to change we would need to convert to a
|
|
39
|
+
* buffer pool
|
|
40
|
+
*
|
|
41
|
+
* * Some functions only modify singleton buffers and thus do not directly return a value
|
|
42
|
+
*
|
|
43
|
+
* * We use {@link DataView} to read/write words where possible. However, byte buffers may not align to word
|
|
44
|
+
* boundaries. We detect this case and manually read/write the last word
|
|
45
|
+
*/
|
|
46
|
+
export declare function Ccm(key: Uint8Array): {
|
|
47
|
+
encrypt(input: Ccm.EncryptInput): Uint8Array;
|
|
48
|
+
decrypt(input: Ccm.DecryptInput): Uint8Array;
|
|
49
|
+
};
|
|
50
|
+
export declare namespace Ccm {
|
|
51
|
+
interface Input {
|
|
52
|
+
nonce: Uint8Array;
|
|
53
|
+
adata: Uint8Array | undefined;
|
|
54
|
+
}
|
|
55
|
+
interface EncryptInput extends Input {
|
|
56
|
+
/**
|
|
57
|
+
* Plaintext
|
|
58
|
+
*/
|
|
59
|
+
pt: Uint8Array;
|
|
60
|
+
}
|
|
61
|
+
interface DecryptInput extends Input {
|
|
62
|
+
/**
|
|
63
|
+
* Ciphertext + tag
|
|
64
|
+
*/
|
|
65
|
+
ct: Uint8Array;
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
export declare const BYTES_IN_LENGTH = 2;
|
|
69
|
+
export declare const MAX_CIPHERTEXT_LENGTH: number;
|
|
70
|
+
export declare const MAX_PLAINTEXT_LENGTH: number;
|
|
71
|
+
//# sourceMappingURL=Ccm.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Ccm.d.ts","sourceRoot":"","sources":["../../../../src/crypto/aes/Ccm.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAeH;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAuCG;AACH,wBAAgB,GAAG,CAAC,GAAG,EAAE,UAAU;mBAIZ,GAAG,CAAC,YAAY,GAAG,UAAU;mBA8B7B,GAAG,CAAC,YAAY,GAAG,UAAU;EA6JnD;AAED,yBAAiB,GAAG,CAAC;IACjB,UAAiB,KAAK;QAClB,KAAK,EAAE,UAAU,CAAC;QAClB,KAAK,EAAE,UAAU,GAAG,SAAS,CAAC;KACjC;IAED,UAAiB,YAAa,SAAQ,KAAK;QACvC;;WAEG;QACH,EAAE,EAAE,UAAU,CAAC;KAClB;IAED,UAAiB,YAAa,SAAQ,KAAK;QACvC;;WAEG;QACH,EAAE,EAAE,UAAU,CAAC;KAClB;CACJ;AAED,eAAO,MAAM,eAAe,IAAI,CAAC;AACjC,eAAO,MAAM,qBAAqB,QAAmC,CAAC;AACtE,eAAO,MAAM,oBAAoB,QAAuD,CAAC"}
|
|
@@ -0,0 +1,174 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright 2022-2025 Project CHIP Authors
|
|
4
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
5
|
+
*/
|
|
6
|
+
import { CRYPTO_AEAD_MIC_LENGTH_BYTES, CRYPTO_AEAD_NONCE_LENGTH_BYTES } from "#crypto/CryptoConstants.js";
|
|
7
|
+
import { CryptoInputError } from "#crypto/CryptoError.js";
|
|
8
|
+
import { Aes } from "./Aes.js";
|
|
9
|
+
import { WordArray } from "./WordArray.js";
|
|
10
|
+
function Ccm(key) {
|
|
11
|
+
const aes = Aes(key);
|
|
12
|
+
return {
|
|
13
|
+
encrypt(input) {
|
|
14
|
+
validateNonceAndAdata(input);
|
|
15
|
+
const ptLength = input.pt.length;
|
|
16
|
+
if (ptLength > MAX_PLAINTEXT_LENGTH) {
|
|
17
|
+
throw new CryptoInputError(
|
|
18
|
+
`Cannot encrypt plaintext exceeding maximum length of ${MAX_PLAINTEXT_LENGTH}`
|
|
19
|
+
);
|
|
20
|
+
}
|
|
21
|
+
const ptView = new DataView(input.pt.buffer);
|
|
22
|
+
const ct = new Uint8Array(ptLength + CRYPTO_AEAD_MIC_LENGTH_BYTES);
|
|
23
|
+
const ctView = new DataView(ct.buffer);
|
|
24
|
+
cbcMac(input, ptView, ptLength);
|
|
25
|
+
ctr(input, ptView, ctView, ptLength, computedMic);
|
|
26
|
+
for (let i = 0; i < computedMic.words.length; i++) {
|
|
27
|
+
ctView.setInt32(input.pt.length + i * 4, computedMic.words[i]);
|
|
28
|
+
}
|
|
29
|
+
return ct;
|
|
30
|
+
},
|
|
31
|
+
decrypt(input) {
|
|
32
|
+
validateNonceAndAdata(input);
|
|
33
|
+
if (input.ct.length > MAX_CIPHERTEXT_LENGTH) {
|
|
34
|
+
throw new CryptoInputError(
|
|
35
|
+
`Cannot decrypt ciphertext longer than maximum length of ${MAX_CIPHERTEXT_LENGTH}`
|
|
36
|
+
);
|
|
37
|
+
}
|
|
38
|
+
const ptLength = input.ct.length - CRYPTO_AEAD_MIC_LENGTH_BYTES;
|
|
39
|
+
if (ptLength < 0) {
|
|
40
|
+
throw new CryptoInputError(
|
|
41
|
+
`Cannot decrypt ciphertext shorter than minimum length of ${CRYPTO_AEAD_MIC_LENGTH_BYTES}`
|
|
42
|
+
);
|
|
43
|
+
}
|
|
44
|
+
const ctView = new DataView(input.ct.buffer, input.ct.byteOffset, ptLength);
|
|
45
|
+
WordArray.bytesToBlock(
|
|
46
|
+
new DataView(input.ct.buffer, input.ct.byteOffset, input.ct.byteLength),
|
|
47
|
+
inputMic.words,
|
|
48
|
+
ptLength
|
|
49
|
+
);
|
|
50
|
+
const pt = new Uint8Array(ptLength);
|
|
51
|
+
const ptView = new DataView(pt.buffer);
|
|
52
|
+
ctr(input, ctView, ptView, ptLength, inputMic);
|
|
53
|
+
cbcMac(input, ptView, ptLength);
|
|
54
|
+
for (let i = 0; i < computedMic.words.length; i++) {
|
|
55
|
+
if (inputMic.words[i] !== computedMic.words[i]) {
|
|
56
|
+
throw new CryptoInputError("Message authentication failed due to invalid signature");
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
return pt;
|
|
60
|
+
}
|
|
61
|
+
};
|
|
62
|
+
function cbcMac(input, pt, ptLength) {
|
|
63
|
+
const adataLength = input.adata?.length;
|
|
64
|
+
computedMic.bytes[0] = (adataLength ? 1 << 6 : 0) | CRYPTO_AEAD_MIC_LENGTH_BYTES - 2 << 2 | BYTES_IN_LENGTH - 1;
|
|
65
|
+
computedMic.bytes.set(input.nonce, 1);
|
|
66
|
+
WordArray.bytesToBlock(computedMic.view, computedMic.words);
|
|
67
|
+
computedMic.words[3] = computedMic.words[3] & 4294901760 | ptLength;
|
|
68
|
+
aes.encrypt(computedMic.words);
|
|
69
|
+
if (adataLength) {
|
|
70
|
+
tempBlock1.view.setInt16(0, input.adata.length);
|
|
71
|
+
for (let i = 0; i < 14; i++) {
|
|
72
|
+
tempBlock1.bytes[i + 2] = i < adataLength ? input.adata[i] : 0;
|
|
73
|
+
}
|
|
74
|
+
WordArray.bytesToBlock(tempBlock1.view, tempBlock1.words);
|
|
75
|
+
add();
|
|
76
|
+
if (adataLength > 14) {
|
|
77
|
+
const adataView = new DataView(input.adata.buffer);
|
|
78
|
+
for (let i = 14; i < adataLength; i += 16) {
|
|
79
|
+
WordArray.bytesToBlock(adataView, tempBlock1.words, i);
|
|
80
|
+
add();
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
if (ptLength) {
|
|
85
|
+
for (let i = 0; i < ptLength; i += 16) {
|
|
86
|
+
WordArray.bytesToBlock(pt, tempBlock1.words, i);
|
|
87
|
+
add();
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
function add() {
|
|
91
|
+
computedMic.words[0] ^= tempBlock1.words[0];
|
|
92
|
+
computedMic.words[1] ^= tempBlock1.words[1];
|
|
93
|
+
computedMic.words[2] ^= tempBlock1.words[2];
|
|
94
|
+
computedMic.words[3] ^= tempBlock1.words[3];
|
|
95
|
+
aes.encrypt(computedMic.words);
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
function ctr(input, from, to, ptLength, mic) {
|
|
99
|
+
tempBlock1.bytes[0] = BYTES_IN_LENGTH - 1;
|
|
100
|
+
tempBlock1.bytes.set(input.nonce, 1);
|
|
101
|
+
tempBlock1.bytes[14] = 0;
|
|
102
|
+
tempBlock1.bytes[15] = 0;
|
|
103
|
+
WordArray.bytesToBlock(tempBlock1.view, ctrBlock.words);
|
|
104
|
+
aes.encrypt(ctrBlock.words, tempBlock1.words);
|
|
105
|
+
mic.words[0] ^= tempBlock1.words[0];
|
|
106
|
+
mic.words[1] ^= tempBlock1.words[1];
|
|
107
|
+
mic.words[2] ^= tempBlock1.words[2];
|
|
108
|
+
mic.words[3] ^= tempBlock1.words[3];
|
|
109
|
+
for (let i = 0; i < ptLength; ) {
|
|
110
|
+
ctrBlock.words[3]++;
|
|
111
|
+
WordArray.bytesToBlock(from, tempBlock1.words, i);
|
|
112
|
+
aes.encrypt(ctrBlock.words, tempBlock2.words);
|
|
113
|
+
for (let j = 0; j < 4 && i < ptLength; j++, i += 4) {
|
|
114
|
+
const tempWord = tempBlock2.words[j];
|
|
115
|
+
if (i + 4 < ptLength) {
|
|
116
|
+
to.setInt32(i, from.getInt32(i) ^ tempWord);
|
|
117
|
+
} else {
|
|
118
|
+
const partial = WordArray.readPartialWord(from, i, ptLength - i) ^ tempWord;
|
|
119
|
+
WordArray.writePartialWord(partial, to, i, ptLength - i);
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
const BYTES_IN_LENGTH = 2;
|
|
126
|
+
const MAX_CIPHERTEXT_LENGTH = Math.pow(2, BYTES_IN_LENGTH * 8);
|
|
127
|
+
const MAX_PLAINTEXT_LENGTH = MAX_CIPHERTEXT_LENGTH - CRYPTO_AEAD_MIC_LENGTH_BYTES;
|
|
128
|
+
class SingletonBuffer {
|
|
129
|
+
#words;
|
|
130
|
+
#bytes;
|
|
131
|
+
#view;
|
|
132
|
+
get words() {
|
|
133
|
+
if (this.#words === void 0) {
|
|
134
|
+
this.#words = new Int32Array(4);
|
|
135
|
+
}
|
|
136
|
+
return this.#words;
|
|
137
|
+
}
|
|
138
|
+
get bytes() {
|
|
139
|
+
if (this.#bytes === void 0) {
|
|
140
|
+
this.#bytes = new Uint8Array(this.words.buffer);
|
|
141
|
+
}
|
|
142
|
+
return this.#bytes;
|
|
143
|
+
}
|
|
144
|
+
/**
|
|
145
|
+
* The word and byte views of the buffer above are insufficient because we must account for platform endianness. So
|
|
146
|
+
* we also make a DataView available.
|
|
147
|
+
*/
|
|
148
|
+
get view() {
|
|
149
|
+
if (this.#view === void 0) {
|
|
150
|
+
this.#view = new DataView(this.words.buffer);
|
|
151
|
+
}
|
|
152
|
+
return this.#view;
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
const computedMic = new SingletonBuffer();
|
|
156
|
+
const inputMic = new SingletonBuffer();
|
|
157
|
+
const ctrBlock = new SingletonBuffer();
|
|
158
|
+
const tempBlock1 = new SingletonBuffer();
|
|
159
|
+
const tempBlock2 = new SingletonBuffer();
|
|
160
|
+
function validateNonceAndAdata(input) {
|
|
161
|
+
if (input.nonce.length !== CRYPTO_AEAD_NONCE_LENGTH_BYTES) {
|
|
162
|
+
throw new CryptoInputError("Nonce must be 13 bytes");
|
|
163
|
+
}
|
|
164
|
+
if (input.adata && input.adata.length > 65535) {
|
|
165
|
+
throw new CryptoInputError(`Associated adata exceeds maximum length of ${MAX_PLAINTEXT_LENGTH}`);
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
export {
|
|
169
|
+
BYTES_IN_LENGTH,
|
|
170
|
+
Ccm,
|
|
171
|
+
MAX_CIPHERTEXT_LENGTH,
|
|
172
|
+
MAX_PLAINTEXT_LENGTH
|
|
173
|
+
};
|
|
174
|
+
//# sourceMappingURL=Ccm.js.map
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../src/crypto/aes/Ccm.ts"],
|
|
4
|
+
"mappings": "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",
|
|
5
|
+
"names": []
|
|
6
|
+
}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright 2022-2025 Project CHIP Authors
|
|
4
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
5
|
+
*/
|
|
6
|
+
/**
|
|
7
|
+
* A 32-bit word array for AES algorithm.
|
|
8
|
+
*
|
|
9
|
+
* Note that we use signed integers so we can use JS bit shifts with signed 32-bit numbers.
|
|
10
|
+
*/
|
|
11
|
+
export type WordArray = Int32Array;
|
|
12
|
+
export declare function WordArray(length: number): WordArray;
|
|
13
|
+
export declare namespace WordArray {
|
|
14
|
+
function fromByteArray(bytes: Uint8Array, alignment?: number): WordArray;
|
|
15
|
+
function fromByteView(bytes: DataView, alignment?: number): WordArray;
|
|
16
|
+
/**
|
|
17
|
+
* Copy bytes into a 4-word block. If the input bytes is too short sets missing bytes to zero.
|
|
18
|
+
*/
|
|
19
|
+
function bytesToBlock(bytes: DataView, block: WordArray, byteOffset?: number): void;
|
|
20
|
+
/**
|
|
21
|
+
* Read a word from a byte array that may be smaller than four bytes. On little-endian platforms, flips the byte
|
|
22
|
+
* order.
|
|
23
|
+
*/
|
|
24
|
+
function readPartialWord(bytes: DataView, offset: number, bytesAvailable?: number): number;
|
|
25
|
+
/**
|
|
26
|
+
* Inverse of {@link writePartialWord}.
|
|
27
|
+
*/
|
|
28
|
+
function writePartialWord(word: number, bytes: DataView, offset: number, bytesAvailable?: number): void;
|
|
29
|
+
}
|
|
30
|
+
//# sourceMappingURL=WordArray.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"WordArray.d.ts","sourceRoot":"","sources":["../../../../src/crypto/aes/WordArray.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH;;;;GAIG;AACH,MAAM,MAAM,SAAS,GAAG,UAAU,CAAC;AAEnC,wBAAgB,SAAS,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAEnD;AAKD,yBAAiB,SAAS,CAAC;IACvB,SAAgB,aAAa,CAAC,KAAK,EAAE,UAAU,EAAE,SAAS,SAAI,aAE7D;IAED,SAAgB,YAAY,CAAC,KAAK,EAAE,QAAQ,EAAE,SAAS,SAAI,aAiB1D;IAED;;OAEG;IACH,SAAgB,YAAY,CAAC,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,SAAS,EAAE,UAAU,CAAC,EAAE,MAAM,QAalF;IAED;;;OAGG;IACH,SAAgB,eAAe,CAC3B,KAAK,EAAE,QAAQ,EACf,MAAM,EAAE,MAAM,EACd,cAAc,SAA4B,GAC3C,MAAM,CAYR;IAED;;OAEG;IACH,SAAgB,gBAAgB,CAC5B,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,QAAQ,EACf,MAAM,EAAE,MAAM,EACd,cAAc,SAAyC,QAY1D;CACJ"}
|