@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.
Files changed (185) hide show
  1. package/dist/cjs/codec/DerCodec.d.ts +12 -17
  2. package/dist/cjs/codec/DerCodec.d.ts.map +1 -1
  3. package/dist/cjs/codec/DerCodec.js +90 -51
  4. package/dist/cjs/codec/DerCodec.js.map +1 -1
  5. package/dist/cjs/codec/DerTypes.js +1 -1
  6. package/dist/cjs/codec/DnsCodec.d.ts +5 -5
  7. package/dist/cjs/crypto/Crypto.d.ts +111 -62
  8. package/dist/cjs/crypto/Crypto.d.ts.map +1 -1
  9. package/dist/cjs/crypto/Crypto.js +92 -31
  10. package/dist/cjs/crypto/Crypto.js.map +1 -1
  11. package/dist/cjs/crypto/CryptoError.d.ts +32 -0
  12. package/dist/cjs/crypto/CryptoError.d.ts.map +1 -0
  13. package/dist/cjs/crypto/CryptoError.js +44 -0
  14. package/dist/cjs/crypto/CryptoError.js.map +6 -0
  15. package/dist/cjs/crypto/Key.d.ts +2 -2
  16. package/dist/cjs/crypto/Key.d.ts.map +1 -1
  17. package/dist/cjs/crypto/Key.js +15 -16
  18. package/dist/cjs/crypto/Key.js.map +1 -1
  19. package/dist/cjs/crypto/Spake2p.js +5 -5
  20. package/dist/cjs/crypto/Spake2p.js.map +1 -1
  21. package/dist/cjs/crypto/StandardCrypto.d.ts +33 -0
  22. package/dist/cjs/crypto/StandardCrypto.d.ts.map +1 -0
  23. package/dist/cjs/crypto/StandardCrypto.js +208 -0
  24. package/dist/cjs/crypto/StandardCrypto.js.map +6 -0
  25. package/dist/cjs/crypto/aes/Aes.d.ts +21 -0
  26. package/dist/cjs/crypto/aes/Aes.d.ts.map +1 -0
  27. package/dist/cjs/crypto/aes/Aes.js +132 -0
  28. package/dist/cjs/crypto/aes/Aes.js.map +6 -0
  29. package/dist/cjs/crypto/aes/Ccm.d.ts +71 -0
  30. package/dist/cjs/crypto/aes/Ccm.d.ts.map +1 -0
  31. package/dist/cjs/crypto/aes/Ccm.js +194 -0
  32. package/dist/cjs/crypto/aes/Ccm.js.map +6 -0
  33. package/dist/cjs/crypto/aes/WordArray.d.ts +30 -0
  34. package/dist/cjs/crypto/aes/WordArray.d.ts.map +1 -0
  35. package/dist/cjs/crypto/aes/WordArray.js +91 -0
  36. package/dist/cjs/crypto/aes/WordArray.js.map +6 -0
  37. package/dist/cjs/crypto/index.d.ts +3 -0
  38. package/dist/cjs/crypto/index.d.ts.map +1 -1
  39. package/dist/cjs/crypto/index.js +3 -0
  40. package/dist/cjs/crypto/index.js.map +1 -1
  41. package/dist/cjs/crypto/nonentropic.d.ts +16 -0
  42. package/dist/cjs/crypto/nonentropic.d.ts.map +1 -0
  43. package/dist/cjs/crypto/nonentropic.js +70 -0
  44. package/dist/cjs/crypto/nonentropic.js.map +6 -0
  45. package/dist/cjs/environment/Environment.d.ts.map +1 -1
  46. package/dist/cjs/environment/Environment.js +1 -5
  47. package/dist/cjs/environment/Environment.js.map +1 -1
  48. package/dist/cjs/environment/RuntimeService.d.ts +2 -4
  49. package/dist/cjs/environment/RuntimeService.d.ts.map +1 -1
  50. package/dist/cjs/environment/RuntimeService.js +4 -4
  51. package/dist/cjs/environment/RuntimeService.js.map +1 -1
  52. package/dist/cjs/environment/VariableService.d.ts.map +1 -1
  53. package/dist/cjs/environment/VariableService.js +1 -0
  54. package/dist/cjs/environment/VariableService.js.map +1 -1
  55. package/dist/cjs/log/LogFormat.js +17 -11
  56. package/dist/cjs/log/LogFormat.js.map +1 -1
  57. package/dist/cjs/net/Network.d.ts +0 -1
  58. package/dist/cjs/net/Network.d.ts.map +1 -1
  59. package/dist/cjs/net/Network.js +0 -4
  60. package/dist/cjs/net/Network.js.map +1 -1
  61. package/dist/cjs/time/Time.d.ts.map +1 -1
  62. package/dist/cjs/time/Time.js +2 -2
  63. package/dist/cjs/time/Time.js.map +1 -1
  64. package/dist/cjs/util/Bytes.d.ts +6 -0
  65. package/dist/cjs/util/Bytes.d.ts.map +1 -1
  66. package/dist/cjs/util/Bytes.js +15 -1
  67. package/dist/cjs/util/Bytes.js.map +1 -1
  68. package/dist/cjs/util/DataWriter.d.ts +1 -1
  69. package/dist/cjs/util/DataWriter.js +2 -2
  70. package/dist/cjs/util/DataWriter.js.map +1 -1
  71. package/dist/cjs/util/DeepCopy.js +1 -1
  72. package/dist/cjs/util/DeepCopy.js.map +1 -1
  73. package/dist/cjs/util/GeneratedClass.d.ts +3 -3
  74. package/dist/cjs/util/GeneratedClass.d.ts.map +1 -1
  75. package/dist/cjs/util/GeneratedClass.js +99 -73
  76. package/dist/cjs/util/GeneratedClass.js.map +2 -2
  77. package/dist/cjs/util/Number.d.ts +0 -1
  78. package/dist/cjs/util/Number.d.ts.map +1 -1
  79. package/dist/cjs/util/Number.js +0 -4
  80. package/dist/cjs/util/Number.js.map +1 -1
  81. package/dist/esm/codec/DerCodec.d.ts +12 -17
  82. package/dist/esm/codec/DerCodec.d.ts.map +1 -1
  83. package/dist/esm/codec/DerCodec.js +90 -51
  84. package/dist/esm/codec/DerCodec.js.map +1 -1
  85. package/dist/esm/codec/DerTypes.js +2 -2
  86. package/dist/esm/codec/DnsCodec.d.ts +5 -5
  87. package/dist/esm/crypto/Crypto.d.ts +111 -62
  88. package/dist/esm/crypto/Crypto.d.ts.map +1 -1
  89. package/dist/esm/crypto/Crypto.js +93 -32
  90. package/dist/esm/crypto/Crypto.js.map +1 -1
  91. package/dist/esm/crypto/CryptoError.d.ts +32 -0
  92. package/dist/esm/crypto/CryptoError.d.ts.map +1 -0
  93. package/dist/esm/crypto/CryptoError.js +24 -0
  94. package/dist/esm/crypto/CryptoError.js.map +6 -0
  95. package/dist/esm/crypto/Key.d.ts +2 -2
  96. package/dist/esm/crypto/Key.d.ts.map +1 -1
  97. package/dist/esm/crypto/Key.js +15 -16
  98. package/dist/esm/crypto/Key.js.map +1 -1
  99. package/dist/esm/crypto/Spake2p.js +5 -5
  100. package/dist/esm/crypto/Spake2p.js.map +1 -1
  101. package/dist/esm/crypto/StandardCrypto.d.ts +33 -0
  102. package/dist/esm/crypto/StandardCrypto.d.ts.map +1 -0
  103. package/dist/esm/crypto/StandardCrypto.js +188 -0
  104. package/dist/esm/crypto/StandardCrypto.js.map +6 -0
  105. package/dist/esm/crypto/aes/Aes.d.ts +21 -0
  106. package/dist/esm/crypto/aes/Aes.d.ts.map +1 -0
  107. package/dist/esm/crypto/aes/Aes.js +112 -0
  108. package/dist/esm/crypto/aes/Aes.js.map +6 -0
  109. package/dist/esm/crypto/aes/Ccm.d.ts +71 -0
  110. package/dist/esm/crypto/aes/Ccm.d.ts.map +1 -0
  111. package/dist/esm/crypto/aes/Ccm.js +174 -0
  112. package/dist/esm/crypto/aes/Ccm.js.map +6 -0
  113. package/dist/esm/crypto/aes/WordArray.d.ts +30 -0
  114. package/dist/esm/crypto/aes/WordArray.d.ts.map +1 -0
  115. package/dist/esm/crypto/aes/WordArray.js +71 -0
  116. package/dist/esm/crypto/aes/WordArray.js.map +6 -0
  117. package/dist/esm/crypto/index.d.ts +3 -0
  118. package/dist/esm/crypto/index.d.ts.map +1 -1
  119. package/dist/esm/crypto/index.js +3 -0
  120. package/dist/esm/crypto/index.js.map +1 -1
  121. package/dist/esm/crypto/nonentropic.d.ts +16 -0
  122. package/dist/esm/crypto/nonentropic.d.ts.map +1 -0
  123. package/dist/esm/crypto/nonentropic.js +50 -0
  124. package/dist/esm/crypto/nonentropic.js.map +6 -0
  125. package/dist/esm/environment/Environment.d.ts.map +1 -1
  126. package/dist/esm/environment/Environment.js +1 -5
  127. package/dist/esm/environment/Environment.js.map +1 -1
  128. package/dist/esm/environment/RuntimeService.d.ts +2 -4
  129. package/dist/esm/environment/RuntimeService.d.ts.map +1 -1
  130. package/dist/esm/environment/RuntimeService.js +4 -4
  131. package/dist/esm/environment/RuntimeService.js.map +1 -1
  132. package/dist/esm/environment/VariableService.d.ts.map +1 -1
  133. package/dist/esm/environment/VariableService.js +1 -0
  134. package/dist/esm/environment/VariableService.js.map +1 -1
  135. package/dist/esm/log/LogFormat.js +17 -11
  136. package/dist/esm/log/LogFormat.js.map +1 -1
  137. package/dist/esm/net/Network.d.ts +0 -1
  138. package/dist/esm/net/Network.d.ts.map +1 -1
  139. package/dist/esm/net/Network.js +1 -5
  140. package/dist/esm/net/Network.js.map +1 -1
  141. package/dist/esm/time/Time.d.ts.map +1 -1
  142. package/dist/esm/time/Time.js +2 -2
  143. package/dist/esm/time/Time.js.map +1 -1
  144. package/dist/esm/util/Bytes.d.ts +6 -0
  145. package/dist/esm/util/Bytes.d.ts.map +1 -1
  146. package/dist/esm/util/Bytes.js +15 -1
  147. package/dist/esm/util/Bytes.js.map +1 -1
  148. package/dist/esm/util/DataWriter.d.ts +1 -1
  149. package/dist/esm/util/DataWriter.js +3 -3
  150. package/dist/esm/util/DataWriter.js.map +1 -1
  151. package/dist/esm/util/DeepCopy.js +1 -1
  152. package/dist/esm/util/DeepCopy.js.map +1 -1
  153. package/dist/esm/util/GeneratedClass.d.ts +3 -3
  154. package/dist/esm/util/GeneratedClass.d.ts.map +1 -1
  155. package/dist/esm/util/GeneratedClass.js +97 -71
  156. package/dist/esm/util/GeneratedClass.js.map +2 -2
  157. package/dist/esm/util/Number.d.ts +0 -1
  158. package/dist/esm/util/Number.d.ts.map +1 -1
  159. package/dist/esm/util/Number.js +0 -4
  160. package/dist/esm/util/Number.js.map +1 -1
  161. package/package.json +3 -3
  162. package/src/codec/DerCodec.ts +106 -52
  163. package/src/codec/DerTypes.ts +2 -2
  164. package/src/crypto/Crypto.ts +196 -76
  165. package/src/crypto/CryptoError.ts +32 -0
  166. package/src/crypto/Key.ts +17 -18
  167. package/src/crypto/Spake2p.ts +5 -5
  168. package/src/crypto/StandardCrypto.ts +252 -0
  169. package/src/crypto/aes/Aes.ts +210 -0
  170. package/src/crypto/aes/Ccm.ts +350 -0
  171. package/src/crypto/aes/README.md +4 -0
  172. package/src/crypto/aes/WordArray.ts +105 -0
  173. package/src/crypto/index.ts +3 -0
  174. package/src/crypto/nonentropic.ts +65 -0
  175. package/src/environment/Environment.ts +1 -6
  176. package/src/environment/RuntimeService.ts +5 -5
  177. package/src/environment/VariableService.ts +1 -0
  178. package/src/log/LogFormat.ts +19 -11
  179. package/src/net/Network.ts +1 -7
  180. package/src/time/Time.ts +4 -4
  181. package/src/util/Bytes.ts +19 -0
  182. package/src/util/DataWriter.ts +3 -3
  183. package/src/util/DeepCopy.ts +2 -2
  184. package/src/util/GeneratedClass.ts +161 -102
  185. package/src/util/Number.ts +0 -4
@@ -0,0 +1,208 @@
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 StandardCrypto_exports = {};
20
+ __export(StandardCrypto_exports, {
21
+ StandardCrypto: () => StandardCrypto
22
+ });
23
+ module.exports = __toCommonJS(StandardCrypto_exports);
24
+ var import_DerCodec = require("#codec/DerCodec.js");
25
+ var import_Boot = require("#util/Boot.js");
26
+ var import_Bytes = require("#util/Bytes.js");
27
+ var import_Ccm = require("./aes/Ccm.js");
28
+ var import_Crypto = require("./Crypto.js");
29
+ var import_CryptoError = require("./CryptoError.js");
30
+ var import_Key = require("./Key.js");
31
+ /**
32
+ * @license
33
+ *
34
+ * Portions copyright 2022-2023 Project CHIP Authors
35
+ * SPDX-License-Identifier: Apache-2.0
36
+ */
37
+ const subtle = globalThis.crypto.subtle;
38
+ const SIGNATURE_ALGORITHM = {
39
+ name: "ECDSA",
40
+ namedCurve: "P-256",
41
+ hash: { name: "SHA-256" }
42
+ };
43
+ class StandardCrypto {
44
+ implementationName = "JS";
45
+ static provider() {
46
+ return new StandardCrypto();
47
+ }
48
+ getRandomData(length) {
49
+ const result = new Uint8Array(length);
50
+ crypto.getRandomValues(result);
51
+ return result;
52
+ }
53
+ encrypt(key, data, nonce, associatedData) {
54
+ const ccm = (0, import_Ccm.Ccm)(key);
55
+ return ccm.encrypt({ pt: data, nonce, adata: associatedData });
56
+ }
57
+ decrypt(key, data, nonce, associatedData) {
58
+ const ccm = (0, import_Ccm.Ccm)(key);
59
+ return ccm.decrypt({ ct: data, nonce, adata: associatedData });
60
+ }
61
+ async computeSha256(buffer) {
62
+ if (Array.isArray(buffer)) {
63
+ buffer = import_Bytes.Bytes.concat(...buffer);
64
+ }
65
+ return new Uint8Array(await subtle.digest("SHA-256", buffer));
66
+ }
67
+ async createPbkdf2Key(secret, salt, iteration, keyLength) {
68
+ const key = await importKey("raw", secret, "PBKDF2", false, ["deriveBits"]);
69
+ const bits = await subtle.deriveBits(
70
+ {
71
+ name: "PBKDF2",
72
+ hash: "SHA-256",
73
+ salt,
74
+ iterations: iteration
75
+ },
76
+ key,
77
+ keyLength * 8
78
+ );
79
+ return new Uint8Array(bits);
80
+ }
81
+ async createHkdfKey(secret, salt, info, length = import_Crypto.CRYPTO_SYMMETRIC_KEY_LENGTH) {
82
+ const key = await importKey("raw", secret, "HKDF", false, ["deriveBits"]);
83
+ const bits = await subtle.deriveBits(
84
+ {
85
+ name: "HKDF",
86
+ hash: "SHA-256",
87
+ salt,
88
+ info
89
+ },
90
+ key,
91
+ 8 * length
92
+ );
93
+ return new Uint8Array(bits);
94
+ }
95
+ async signHmac(secret, data) {
96
+ const key = await importKey("raw", secret, { name: "HMAC", hash: "SHA-256" }, false, ["sign"]);
97
+ return new Uint8Array(await subtle.sign("HMAC", key, data));
98
+ }
99
+ async signEcdsa(key, data, dsaEncoding) {
100
+ if (Array.isArray(data)) {
101
+ data = import_Bytes.Bytes.concat(...data);
102
+ }
103
+ const { crv, kty, d, x, y } = key;
104
+ key = {
105
+ kty,
106
+ crv,
107
+ d,
108
+ x,
109
+ y,
110
+ ext: true,
111
+ // Required by some subtle implementations to sign
112
+ key_ops: ["sign"]
113
+ };
114
+ const subtleKey = await importKey("jwk", key, SIGNATURE_ALGORITHM, false, ["sign"]);
115
+ const ieeeP1363 = await subtle.sign(SIGNATURE_ALGORITHM, subtleKey, data);
116
+ if (dsaEncoding !== "der") return new Uint8Array(ieeeP1363);
117
+ const bytesPerComponent = ieeeP1363.byteLength / 2;
118
+ return import_DerCodec.DerCodec.encode({
119
+ r: (0, import_DerCodec.DerBigUint)(ieeeP1363.slice(0, bytesPerComponent)),
120
+ s: (0, import_DerCodec.DerBigUint)(ieeeP1363.slice(bytesPerComponent))
121
+ });
122
+ }
123
+ async verifyEcdsa(key, data, signature, dsaEncoding) {
124
+ const { crv, kty, x, y } = key;
125
+ key = { crv, kty, x, y };
126
+ const subtleKey = await importKey("jwk", key, SIGNATURE_ALGORITHM, false, ["verify"]);
127
+ if (dsaEncoding === "der") {
128
+ try {
129
+ const decoded = import_DerCodec.DerCodec.decode(signature);
130
+ const r = import_DerCodec.DerCodec.decodeBigUint(decoded?._elements?.[0], 32);
131
+ const s = import_DerCodec.DerCodec.decodeBigUint(decoded?._elements?.[1], 32);
132
+ signature = import_Bytes.Bytes.concat(r, s);
133
+ } catch (cause) {
134
+ import_DerCodec.DerError.accept(cause);
135
+ throw new import_CryptoError.CryptoVerifyError("Invalid DER signature", { cause });
136
+ }
137
+ }
138
+ const verified = await subtle.verify(SIGNATURE_ALGORITHM, subtleKey, signature, data);
139
+ if (!verified) {
140
+ throw new import_CryptoError.CryptoVerifyError("Signature verification failed");
141
+ }
142
+ }
143
+ async createKeyPair() {
144
+ const subtleKey = await subtle.generateKey(
145
+ {
146
+ // We must specify either ECDH or ECDSA to get an EC key but we may use the key for either (but not for
147
+ // both)
148
+ name: "ECDH",
149
+ namedCurve: "P-256"
150
+ },
151
+ true,
152
+ // We must also specify usage but will drop this on export
153
+ ["deriveKey"]
154
+ );
155
+ const key = await subtle.exportKey("jwk", subtleKey.privateKey);
156
+ return (0, import_Key.Key)({
157
+ kty: import_Key.KeyType.EC,
158
+ crv: import_Key.CurveType.p256,
159
+ d: key.d,
160
+ x: key.x,
161
+ y: key.y
162
+ });
163
+ }
164
+ async generateDhSecret(key, peerKey) {
165
+ const subtleKey = await importKey(
166
+ "jwk",
167
+ key,
168
+ {
169
+ name: "ECDH",
170
+ namedCurve: "P-256"
171
+ },
172
+ false,
173
+ ["deriveBits"]
174
+ );
175
+ const subtlePeerKey = await importKey(
176
+ "jwk",
177
+ peerKey,
178
+ {
179
+ name: "ECDH",
180
+ namedCurve: "P-256"
181
+ },
182
+ false,
183
+ []
184
+ );
185
+ const secret = await subtle.deriveBits(
186
+ {
187
+ name: "ECDH",
188
+ public: subtlePeerKey
189
+ },
190
+ subtleKey,
191
+ 256
192
+ );
193
+ return new Uint8Array(secret);
194
+ }
195
+ }
196
+ if (globalThis.crypto?.subtle?.[Symbol.toStringTag] === "SubtleCrypto") {
197
+ import_Boot.Boot.init(() => {
198
+ import_Crypto.Crypto.provider = StandardCrypto.provider;
199
+ });
200
+ }
201
+ async function importKey(...params) {
202
+ try {
203
+ return await crypto.subtle.importKey(...params);
204
+ } catch (cause) {
205
+ throw new import_CryptoError.KeyInputError("Invalid key", { cause });
206
+ }
207
+ }
208
+ //# 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,132 @@
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 Aes_exports = {};
20
+ __export(Aes_exports, {
21
+ Aes: () => Aes
22
+ });
23
+ module.exports = __toCommonJS(Aes_exports);
24
+ var import_WordArray = require("./WordArray.js");
25
+ /**
26
+ * @license
27
+ * Copyright 2022-2025 Project CHIP Authors
28
+ * SPDX-License-Identifier: Apache-2.0
29
+ */
30
+ function Aes(key) {
31
+ const { encryptKey, decryptKey } = expandKey(key);
32
+ return {
33
+ encrypt(pt, ct = pt) {
34
+ return crypt(pt, ct, encryptKey, Tables.enc);
35
+ },
36
+ decrypt(ct, pt = ct) {
37
+ return crypt(ct, pt, decryptKey, Tables.dec);
38
+ }
39
+ };
40
+ }
41
+ let etabs, dtabs;
42
+ const Tables = {
43
+ get enc() {
44
+ if (!etabs) {
45
+ generateTables();
46
+ }
47
+ return etabs;
48
+ },
49
+ get dec() {
50
+ if (!dtabs) {
51
+ generateTables();
52
+ }
53
+ return dtabs;
54
+ }
55
+ };
56
+ const mixNames = ["mix1", "mix2", "mix3", "mix4"];
57
+ function generateTables() {
58
+ etabs = Tables2();
59
+ dtabs = Tables2();
60
+ const d = Table(), th = Table();
61
+ let i, x, xInv, x2, x4, x8, s, tEnc, tDec;
62
+ for (i = 0; i < 256; i++) {
63
+ th[(d[i] = i << 1 ^ (i >> 7) * 283) ^ i] = i;
64
+ }
65
+ for (x = xInv = 0; !etabs.sbox[x]; x ^= x2 || 1, xInv = th[xInv] || 1) {
66
+ s = xInv ^ xInv << 1 ^ xInv << 2 ^ xInv << 3 ^ xInv << 4;
67
+ s = s >> 8 ^ s & 255 ^ 99;
68
+ etabs.sbox[x] = s;
69
+ dtabs.sbox[s] = x;
70
+ x8 = d[x4 = d[x2 = d[x]]];
71
+ tDec = x8 * 16843009 ^ x4 * 65537 ^ x2 * 257 ^ x * 16843008;
72
+ tEnc = d[s] * 257 ^ s * 16843008;
73
+ for (const name of mixNames) {
74
+ etabs[name][x] = tEnc = tEnc << 24 ^ tEnc >>> 8;
75
+ dtabs[name][s] = tDec = tDec << 24 ^ tDec >>> 8;
76
+ }
77
+ }
78
+ function Tables2() {
79
+ return Object.fromEntries([...mixNames, "sbox"].map((k) => [k, Table()]));
80
+ }
81
+ function Table() {
82
+ return (0, import_WordArray.WordArray)(256);
83
+ }
84
+ }
85
+ function crypt(input, output, roundKeys, tabs) {
86
+ const decrypt = tabs === dtabs, numRounds = roundKeys.length / 4 - 2;
87
+ const { mix1, mix2, mix3, mix4, sbox } = tabs;
88
+ 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;
89
+ for (let i = 0; i < numRounds; i++) {
90
+ const atemp = mix1[a >>> 24] ^ mix2[b >> 16 & 255] ^ mix3[c >> 8 & 255] ^ mix4[d & 255] ^ roundKeys[roundKeyAt++];
91
+ const btemp = mix1[b >>> 24] ^ mix2[c >> 16 & 255] ^ mix3[d >> 8 & 255] ^ mix4[a & 255] ^ roundKeys[roundKeyAt++];
92
+ const ctemp = mix1[c >>> 24] ^ mix2[d >> 16 & 255] ^ mix3[a >> 8 & 255] ^ mix4[b & 255] ^ roundKeys[roundKeyAt++];
93
+ d = mix1[d >>> 24] ^ mix2[a >> 16 & 255] ^ mix3[b >> 8 & 255] ^ mix4[c & 255] ^ roundKeys[roundKeyAt++];
94
+ a = atemp;
95
+ b = btemp;
96
+ c = ctemp;
97
+ }
98
+ for (let i = 0; i < 4; i++) {
99
+ output[decrypt ? 3 & -i : i] = sbox[a >>> 24] << 24 ^ sbox[b >> 16 & 255] << 16 ^ sbox[c >> 8 & 255] << 8 ^ sbox[d & 255] ^ roundKeys[roundKeyAt++];
100
+ const atemp = a;
101
+ a = b;
102
+ b = c;
103
+ c = d;
104
+ d = atemp;
105
+ }
106
+ return output;
107
+ }
108
+ function expandKey(key) {
109
+ const inputLength = key.length / 4, roundsNeeded = inputLength + 7, wordsNeeded = roundsNeeded * 4, encryptKey = import_WordArray.WordArray.fromByteArray(key, wordsNeeded), sbox = Tables.enc.sbox;
110
+ for (let i = inputLength, rcon = 1; i < wordsNeeded; i++) {
111
+ let temp = encryptKey[i - 1];
112
+ if (i % inputLength === 0 || inputLength === 8 && i % inputLength === 4) {
113
+ temp = sbox[temp >>> 24] << 24 ^ sbox[temp >> 16 & 255] << 16 ^ sbox[temp >> 8 & 255] << 8 ^ sbox[temp & 255];
114
+ if (i % inputLength === 0) {
115
+ temp = temp << 8 ^ temp >>> 24 ^ rcon << 24;
116
+ rcon = rcon << 1 ^ (rcon >> 7) * 283;
117
+ }
118
+ }
119
+ encryptKey[i] = encryptKey[i - inputLength] ^ temp;
120
+ }
121
+ const { mix1, mix2, mix3, mix4 } = Tables.dec, decryptKey = (0, import_WordArray.WordArray)(encryptKey.length);
122
+ for (let i = encryptKey.length, j = 0; i; j++, i--) {
123
+ const tmp = encryptKey[j & 3 ? i : i - 4];
124
+ if (i <= 4 || j < 4) {
125
+ decryptKey[j] = tmp;
126
+ } else {
127
+ decryptKey[j] = mix1[sbox[tmp >>> 24]] ^ mix2[sbox[tmp >> 16 & 255]] ^ mix3[sbox[tmp >> 8 & 255]] ^ mix4[sbox[tmp & 255]];
128
+ }
129
+ }
130
+ return { encryptKey, decryptKey };
131
+ }
132
+ //# 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,194 @@
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 Ccm_exports = {};
20
+ __export(Ccm_exports, {
21
+ BYTES_IN_LENGTH: () => BYTES_IN_LENGTH,
22
+ Ccm: () => Ccm,
23
+ MAX_CIPHERTEXT_LENGTH: () => MAX_CIPHERTEXT_LENGTH,
24
+ MAX_PLAINTEXT_LENGTH: () => MAX_PLAINTEXT_LENGTH
25
+ });
26
+ module.exports = __toCommonJS(Ccm_exports);
27
+ var import_CryptoConstants = require("#crypto/CryptoConstants.js");
28
+ var import_CryptoError = require("#crypto/CryptoError.js");
29
+ var import_Aes = require("./Aes.js");
30
+ var import_WordArray = require("./WordArray.js");
31
+ /**
32
+ * @license
33
+ * Copyright 2022-2025 Project CHIP Authors
34
+ * SPDX-License-Identifier: Apache-2.0
35
+ */
36
+ function Ccm(key) {
37
+ const aes = (0, import_Aes.Aes)(key);
38
+ return {
39
+ encrypt(input) {
40
+ validateNonceAndAdata(input);
41
+ const ptLength = input.pt.length;
42
+ if (ptLength > MAX_PLAINTEXT_LENGTH) {
43
+ throw new import_CryptoError.CryptoInputError(
44
+ `Cannot encrypt plaintext exceeding maximum length of ${MAX_PLAINTEXT_LENGTH}`
45
+ );
46
+ }
47
+ const ptView = new DataView(input.pt.buffer);
48
+ const ct = new Uint8Array(ptLength + import_CryptoConstants.CRYPTO_AEAD_MIC_LENGTH_BYTES);
49
+ const ctView = new DataView(ct.buffer);
50
+ cbcMac(input, ptView, ptLength);
51
+ ctr(input, ptView, ctView, ptLength, computedMic);
52
+ for (let i = 0; i < computedMic.words.length; i++) {
53
+ ctView.setInt32(input.pt.length + i * 4, computedMic.words[i]);
54
+ }
55
+ return ct;
56
+ },
57
+ decrypt(input) {
58
+ validateNonceAndAdata(input);
59
+ if (input.ct.length > MAX_CIPHERTEXT_LENGTH) {
60
+ throw new import_CryptoError.CryptoInputError(
61
+ `Cannot decrypt ciphertext longer than maximum length of ${MAX_CIPHERTEXT_LENGTH}`
62
+ );
63
+ }
64
+ const ptLength = input.ct.length - import_CryptoConstants.CRYPTO_AEAD_MIC_LENGTH_BYTES;
65
+ if (ptLength < 0) {
66
+ throw new import_CryptoError.CryptoInputError(
67
+ `Cannot decrypt ciphertext shorter than minimum length of ${import_CryptoConstants.CRYPTO_AEAD_MIC_LENGTH_BYTES}`
68
+ );
69
+ }
70
+ const ctView = new DataView(input.ct.buffer, input.ct.byteOffset, ptLength);
71
+ import_WordArray.WordArray.bytesToBlock(
72
+ new DataView(input.ct.buffer, input.ct.byteOffset, input.ct.byteLength),
73
+ inputMic.words,
74
+ ptLength
75
+ );
76
+ const pt = new Uint8Array(ptLength);
77
+ const ptView = new DataView(pt.buffer);
78
+ ctr(input, ctView, ptView, ptLength, inputMic);
79
+ cbcMac(input, ptView, ptLength);
80
+ for (let i = 0; i < computedMic.words.length; i++) {
81
+ if (inputMic.words[i] !== computedMic.words[i]) {
82
+ throw new import_CryptoError.CryptoInputError("Message authentication failed due to invalid signature");
83
+ }
84
+ }
85
+ return pt;
86
+ }
87
+ };
88
+ function cbcMac(input, pt, ptLength) {
89
+ const adataLength = input.adata?.length;
90
+ computedMic.bytes[0] = (adataLength ? 1 << 6 : 0) | import_CryptoConstants.CRYPTO_AEAD_MIC_LENGTH_BYTES - 2 << 2 | BYTES_IN_LENGTH - 1;
91
+ computedMic.bytes.set(input.nonce, 1);
92
+ import_WordArray.WordArray.bytesToBlock(computedMic.view, computedMic.words);
93
+ computedMic.words[3] = computedMic.words[3] & 4294901760 | ptLength;
94
+ aes.encrypt(computedMic.words);
95
+ if (adataLength) {
96
+ tempBlock1.view.setInt16(0, input.adata.length);
97
+ for (let i = 0; i < 14; i++) {
98
+ tempBlock1.bytes[i + 2] = i < adataLength ? input.adata[i] : 0;
99
+ }
100
+ import_WordArray.WordArray.bytesToBlock(tempBlock1.view, tempBlock1.words);
101
+ add();
102
+ if (adataLength > 14) {
103
+ const adataView = new DataView(input.adata.buffer);
104
+ for (let i = 14; i < adataLength; i += 16) {
105
+ import_WordArray.WordArray.bytesToBlock(adataView, tempBlock1.words, i);
106
+ add();
107
+ }
108
+ }
109
+ }
110
+ if (ptLength) {
111
+ for (let i = 0; i < ptLength; i += 16) {
112
+ import_WordArray.WordArray.bytesToBlock(pt, tempBlock1.words, i);
113
+ add();
114
+ }
115
+ }
116
+ function add() {
117
+ computedMic.words[0] ^= tempBlock1.words[0];
118
+ computedMic.words[1] ^= tempBlock1.words[1];
119
+ computedMic.words[2] ^= tempBlock1.words[2];
120
+ computedMic.words[3] ^= tempBlock1.words[3];
121
+ aes.encrypt(computedMic.words);
122
+ }
123
+ }
124
+ function ctr(input, from, to, ptLength, mic) {
125
+ tempBlock1.bytes[0] = BYTES_IN_LENGTH - 1;
126
+ tempBlock1.bytes.set(input.nonce, 1);
127
+ tempBlock1.bytes[14] = 0;
128
+ tempBlock1.bytes[15] = 0;
129
+ import_WordArray.WordArray.bytesToBlock(tempBlock1.view, ctrBlock.words);
130
+ aes.encrypt(ctrBlock.words, tempBlock1.words);
131
+ mic.words[0] ^= tempBlock1.words[0];
132
+ mic.words[1] ^= tempBlock1.words[1];
133
+ mic.words[2] ^= tempBlock1.words[2];
134
+ mic.words[3] ^= tempBlock1.words[3];
135
+ for (let i = 0; i < ptLength; ) {
136
+ ctrBlock.words[3]++;
137
+ import_WordArray.WordArray.bytesToBlock(from, tempBlock1.words, i);
138
+ aes.encrypt(ctrBlock.words, tempBlock2.words);
139
+ for (let j = 0; j < 4 && i < ptLength; j++, i += 4) {
140
+ const tempWord = tempBlock2.words[j];
141
+ if (i + 4 < ptLength) {
142
+ to.setInt32(i, from.getInt32(i) ^ tempWord);
143
+ } else {
144
+ const partial = import_WordArray.WordArray.readPartialWord(from, i, ptLength - i) ^ tempWord;
145
+ import_WordArray.WordArray.writePartialWord(partial, to, i, ptLength - i);
146
+ }
147
+ }
148
+ }
149
+ }
150
+ }
151
+ const BYTES_IN_LENGTH = 2;
152
+ const MAX_CIPHERTEXT_LENGTH = Math.pow(2, BYTES_IN_LENGTH * 8);
153
+ const MAX_PLAINTEXT_LENGTH = MAX_CIPHERTEXT_LENGTH - import_CryptoConstants.CRYPTO_AEAD_MIC_LENGTH_BYTES;
154
+ class SingletonBuffer {
155
+ #words;
156
+ #bytes;
157
+ #view;
158
+ get words() {
159
+ if (this.#words === void 0) {
160
+ this.#words = new Int32Array(4);
161
+ }
162
+ return this.#words;
163
+ }
164
+ get bytes() {
165
+ if (this.#bytes === void 0) {
166
+ this.#bytes = new Uint8Array(this.words.buffer);
167
+ }
168
+ return this.#bytes;
169
+ }
170
+ /**
171
+ * The word and byte views of the buffer above are insufficient because we must account for platform endianness. So
172
+ * we also make a DataView available.
173
+ */
174
+ get view() {
175
+ if (this.#view === void 0) {
176
+ this.#view = new DataView(this.words.buffer);
177
+ }
178
+ return this.#view;
179
+ }
180
+ }
181
+ const computedMic = new SingletonBuffer();
182
+ const inputMic = new SingletonBuffer();
183
+ const ctrBlock = new SingletonBuffer();
184
+ const tempBlock1 = new SingletonBuffer();
185
+ const tempBlock2 = new SingletonBuffer();
186
+ function validateNonceAndAdata(input) {
187
+ if (input.nonce.length !== import_CryptoConstants.CRYPTO_AEAD_NONCE_LENGTH_BYTES) {
188
+ throw new import_CryptoError.CryptoInputError("Nonce must be 13 bytes");
189
+ }
190
+ if (input.adata && input.adata.length > 65535) {
191
+ throw new import_CryptoError.CryptoInputError(`Associated adata exceeds maximum length of ${MAX_PLAINTEXT_LENGTH}`);
192
+ }
193
+ }
194
+ //# 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
+ }