@agentunion/fastaun-browser 0.2.19 → 0.3.0

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 (184) hide show
  1. package/CHANGELOG.md +50 -0
  2. package/_packed_docs/CHANGELOG.md +50 -0
  3. package/_packed_docs/agent.md/SCHEMA.md +173 -0
  4. package/_packed_docs/agent.md/examples/codeagent-claudecode.md +61 -0
  5. package/_packed_docs/agent.md/examples/human-developer.md +60 -0
  6. package/_packed_docs/agent.md/examples/openclaw-lobster.md +52 -0
  7. package/_packed_docs/agent.md/examples/signed-openclaw-lobster.md +43 -0
  8. package/_packed_docs/protocol/00-/346/200/273/350/247/210/344/270/216/345/210/206/345/261/202.md +205 -0
  9. package/_packed_docs/protocol/00A-/350/256/276/350/256/241/345/216/237/345/210/231-/344/270/272Agent/350/200/214/347/224/237.md +197 -0
  10. package/_packed_docs/protocol/01-/350/272/253/344/273/275/344/270/216/345/207/255/350/257/201/345/215/217/350/256/256-auth.md +549 -0
  11. package/_packed_docs/protocol/02-/350/257/201/344/271/246/344/270/216/344/277/241/344/273/273/344/275/223/347/263/273.md +810 -0
  12. package/_packed_docs/protocol/03-Gateway-/350/277/236/346/216/245/346/250/241/345/274/217.md +262 -0
  13. package/_packed_docs/protocol/04-Peer-/345/255/220/345/215/217/350/256/256.md +180 -0
  14. package/_packed_docs/protocol/05-Relay-/345/255/220/345/215/217/350/256/256.md +164 -0
  15. package/_packed_docs/protocol/06-/346/234/215/345/212/241/345/215/217/350/256/256.md +1135 -0
  16. package/_packed_docs/protocol/07-/351/224/231/350/257/257/347/240/201/344/270/216/347/212/266/346/200/201/346/234/272.md +234 -0
  17. package/_packed_docs/protocol/08-AUN-E2EE-Group.md +900 -0
  18. package/_packed_docs/protocol/08-AUN-E2EE.md +413 -0
  19. package/_packed_docs/protocol/09-/345/256/211/345/205/250/350/200/203/350/231/221.md +316 -0
  20. package/_packed_docs/protocol/10-Group-/345/255/220/345/215/217/350/256/256.md +804 -0
  21. package/_packed_docs/protocol/11-Storage-/345/255/220/345/215/217/350/256/256.md +271 -0
  22. package/_packed_docs/protocol/12-Stream-/345/255/220/345/215/217/350/256/256.md +329 -0
  23. package/_packed_docs/protocol/13-Agent/350/241/214/344/270/272/350/247/204/350/214/203.md +141 -0
  24. package/_packed_docs/protocol/14-/344/272/244/344/272/222/346/234/272/345/210/266-/345/223/215/345/272/224/346/250/241/345/274/217/344/270/216/350/207/252/344/270/273/346/250/241/345/274/217.md +170 -0
  25. package/_packed_docs/protocol/15-/347/246/273/347/272/277/346/216/250/351/200/201/351/200/232/347/237/245/345/215/217/350/256/256.md +419 -0
  26. package/_packed_docs/protocol/README.md +71 -0
  27. package/_packed_docs/protocol/agent.md/SCHEMA.md +118 -0
  28. package/_packed_docs/protocol/agent.md/examples/codeagent-claudecode.md +61 -0
  29. package/_packed_docs/protocol/agent.md/examples/human-developer.md +60 -0
  30. package/_packed_docs/protocol/agent.md/examples/openclaw-lobster.md +52 -0
  31. package/_packed_docs/protocol/aun-docs-guide.md +49 -0
  32. package/_packed_docs/protocol/index.md +124 -0
  33. package/_packed_docs/protocol//350/215/211/346/241/210-agent.md/347/255/276/345/220/215/345/215/217/350/256/256.md +205 -0
  34. package/_packed_docs/protocol//350/215/211/346/241/210-/346/213/222/347/273/235/344/277/241/345/217/267/345/215/217/350/256/256.md +249 -0
  35. package/_packed_docs/protocol//351/231/204/345/275/225A-/346/234/257/350/257/255/350/241/250.md +337 -0
  36. package/_packed_docs/protocol//351/231/204/345/275/225B-/346/211/251/345/261/225/346/200/247/346/214/207/345/215/227.md +80 -0
  37. package/_packed_docs/protocol//351/231/204/345/275/225C-/347/247/201/351/222/245/347/256/241/347/220/206/344/270/216/350/272/253/344/273/275/346/201/242/345/244/215.md +704 -0
  38. package/_packed_docs/protocol//351/231/204/345/275/225D-Root_CA_/346/262/273/347/220/206/346/234/272/345/210/266.md +620 -0
  39. package/_packed_docs/protocol//351/231/204/345/275/225E-Root_CA_/345/207/206/345/205/245/346/265/201/347/250/213.md +605 -0
  40. package/_packed_docs/protocol//351/231/204/345/275/225F-Issuer_CA_/347/224/263/350/257/267/346/265/201/347/250/213.md +548 -0
  41. package/_packed_docs/protocol//351/231/204/345/275/225G-AID_/345/255/244/345/204/277/351/242/204/351/230/262/344/270/216/346/225/221/346/217/264/346/234/272/345/210/266.md +513 -0
  42. package/_packed_docs/protocol//351/231/204/345/275/225H-Identity/346/234/215/345/212/241/345/256/236/347/216/260/346/214/207/345/215/227.md +619 -0
  43. package/_packed_docs/protocol//351/231/204/345/275/225I-/350/267/250/345/237/237/346/266/210/346/201/257/350/267/257/347/224/261/345/256/236/347/216/260/346/214/207/345/215/227.md +492 -0
  44. package/_packed_docs/protocol//351/231/204/345/275/225J-/345/256/242/346/210/267/347/253/257/346/216/245/345/205/245/347/244/272/344/276/213.md +402 -0
  45. package/_packed_docs/protocol//351/231/204/345/275/225K-Agent_Web/345/217/221/347/216/260/345/215/217/350/256/256.md +130 -0
  46. package/_packed_docs/protocol//351/231/204/345/275/225L-E2EE/345/256/236/347/216/260/346/214/207/345/215/227.md +267 -0
  47. package/_packed_docs/protocol//351/231/204/345/275/225M-JWT/350/256/244/350/257/201/345/256/236/347/216/260/346/214/207/345/215/227.md +367 -0
  48. package/_packed_docs/python-sdk-v2-only-changelog.md +189 -0
  49. package/_packed_docs/sdk/01-/345/277/253/351/200/237/345/274/200/345/247/213.md +223 -0
  50. package/_packed_docs/sdk/02-WebSocket/345/215/217/350/256/256.md +354 -0
  51. package/_packed_docs/sdk/03-/346/240/270/345/277/203/346/246/202/345/277/265.md +172 -0
  52. package/_packed_docs/sdk/04-/350/277/236/346/216/245/344/270/216/350/256/244/350/257/201.md +396 -0
  53. package/_packed_docs/sdk/05-E2EE/345/212/240/345/257/206/351/200/232/344/277/241.md +611 -0
  54. package/_packed_docs/sdk/06-API/346/211/213/345/206/214.md +1203 -0
  55. package/_packed_docs/sdk/07-/351/224/231/350/257/257/345/244/204/347/220/206.md +150 -0
  56. package/_packed_docs/sdk/08-/346/234/200/344/275/263/345/256/236/350/267/265.md +89 -0
  57. package/_packed_docs/sdk/09-custody-api-manual.md +445 -0
  58. package/_packed_docs/sdk/09-group-rpc-manual.md +1895 -0
  59. package/_packed_docs/sdk/09-message-rpc-manual.md +597 -0
  60. package/_packed_docs/sdk/09-meta-rpc-manual.md +142 -0
  61. package/_packed_docs/sdk/09-payload-reference.md +702 -0
  62. package/_packed_docs/sdk/09-storage-rpc-manual.md +408 -0
  63. package/_packed_docs/sdk/09-stream-rpc-manual.md +275 -0
  64. package/_packed_docs/sdk/AUN_DOCS_GUIDE.md +72 -0
  65. package/_packed_docs/sdk/INDEX.md +131 -0
  66. package/_packed_docs/sdk/README.md +307 -0
  67. package/dist/auth.d.ts +2 -1
  68. package/dist/auth.d.ts.map +1 -1
  69. package/dist/auth.js +33 -14
  70. package/dist/auth.js.map +1 -1
  71. package/dist/bundle.js +14300 -0
  72. package/dist/client.d.ts +200 -178
  73. package/dist/client.d.ts.map +1 -1
  74. package/dist/client.js +3096 -4019
  75. package/dist/client.js.map +1 -1
  76. package/dist/config.d.ts +0 -4
  77. package/dist/config.d.ts.map +1 -1
  78. package/dist/config.js +0 -4
  79. package/dist/config.js.map +1 -1
  80. package/dist/crypto.d.ts +8 -1
  81. package/dist/crypto.d.ts.map +1 -1
  82. package/dist/crypto.js +114 -1
  83. package/dist/crypto.js.map +1 -1
  84. package/dist/e2ee.d.ts +5 -210
  85. package/dist/e2ee.d.ts.map +1 -1
  86. package/dist/e2ee.js +4 -1379
  87. package/dist/e2ee.js.map +1 -1
  88. package/dist/index.d.ts +7 -3
  89. package/dist/index.d.ts.map +1 -1
  90. package/dist/index.js +5 -4
  91. package/dist/index.js.map +1 -1
  92. package/dist/namespaces/auth.d.ts +1 -0
  93. package/dist/namespaces/auth.d.ts.map +1 -1
  94. package/dist/namespaces/auth.js +23 -8
  95. package/dist/namespaces/auth.js.map +1 -1
  96. package/dist/protected-headers.d.ts +14 -0
  97. package/dist/protected-headers.d.ts.map +1 -0
  98. package/dist/protected-headers.js +47 -0
  99. package/dist/protected-headers.js.map +1 -0
  100. package/dist/seq-tracker.d.ts +7 -2
  101. package/dist/seq-tracker.d.ts.map +1 -1
  102. package/dist/seq-tracker.js +31 -10
  103. package/dist/seq-tracker.js.map +1 -1
  104. package/dist/transport.d.ts +9 -1
  105. package/dist/transport.d.ts.map +1 -1
  106. package/dist/transport.js +24 -0
  107. package/dist/transport.js.map +1 -1
  108. package/dist/v2/crypto/aead.d.ts +26 -0
  109. package/dist/v2/crypto/aead.d.ts.map +1 -0
  110. package/dist/v2/crypto/aead.js +63 -0
  111. package/dist/v2/crypto/aead.js.map +1 -0
  112. package/dist/v2/crypto/canonical.d.ts +21 -0
  113. package/dist/v2/crypto/canonical.d.ts.map +1 -0
  114. package/dist/v2/crypto/canonical.js +111 -0
  115. package/dist/v2/crypto/canonical.js.map +1 -0
  116. package/dist/v2/crypto/dh-path.d.ts +21 -0
  117. package/dist/v2/crypto/dh-path.d.ts.map +1 -0
  118. package/dist/v2/crypto/dh-path.js +50 -0
  119. package/dist/v2/crypto/dh-path.js.map +1 -0
  120. package/dist/v2/crypto/ecdh.d.ts +19 -0
  121. package/dist/v2/crypto/ecdh.d.ts.map +1 -0
  122. package/dist/v2/crypto/ecdh.js +101 -0
  123. package/dist/v2/crypto/ecdh.js.map +1 -0
  124. package/dist/v2/crypto/ecdsa.d.ts +16 -0
  125. package/dist/v2/crypto/ecdsa.d.ts.map +1 -0
  126. package/dist/v2/crypto/ecdsa.js +52 -0
  127. package/dist/v2/crypto/ecdsa.js.map +1 -0
  128. package/dist/v2/crypto/hkdf.d.ts +21 -0
  129. package/dist/v2/crypto/hkdf.d.ts.map +1 -0
  130. package/dist/v2/crypto/hkdf.js +32 -0
  131. package/dist/v2/crypto/hkdf.js.map +1 -0
  132. package/dist/v2/crypto/index.d.ts +9 -0
  133. package/dist/v2/crypto/index.d.ts.map +1 -0
  134. package/dist/v2/crypto/index.js +8 -0
  135. package/dist/v2/crypto/index.js.map +1 -0
  136. package/dist/v2/crypto/recipients.d.ts +43 -0
  137. package/dist/v2/crypto/recipients.d.ts.map +1 -0
  138. package/dist/v2/crypto/recipients.js +188 -0
  139. package/dist/v2/crypto/recipients.js.map +1 -0
  140. package/dist/v2/e2ee/decrypt.d.ts +13 -0
  141. package/dist/v2/e2ee/decrypt.d.ts.map +1 -0
  142. package/dist/v2/e2ee/decrypt.js +176 -0
  143. package/dist/v2/e2ee/decrypt.js.map +1 -0
  144. package/dist/v2/e2ee/encrypt-group.d.ts +14 -0
  145. package/dist/v2/e2ee/encrypt-group.d.ts.map +1 -0
  146. package/dist/v2/e2ee/encrypt-group.js +196 -0
  147. package/dist/v2/e2ee/encrypt-group.js.map +1 -0
  148. package/dist/v2/e2ee/encrypt-p2p.d.ts +15 -0
  149. package/dist/v2/e2ee/encrypt-p2p.d.ts.map +1 -0
  150. package/dist/v2/e2ee/encrypt-p2p.js +240 -0
  151. package/dist/v2/e2ee/encrypt-p2p.js.map +1 -0
  152. package/dist/v2/e2ee/index.d.ts +9 -0
  153. package/dist/v2/e2ee/index.d.ts.map +1 -0
  154. package/dist/v2/e2ee/index.js +9 -0
  155. package/dist/v2/e2ee/index.js.map +1 -0
  156. package/dist/v2/e2ee/metadata-auth.d.ts +9 -0
  157. package/dist/v2/e2ee/metadata-auth.d.ts.map +1 -0
  158. package/dist/v2/e2ee/metadata-auth.js +60 -0
  159. package/dist/v2/e2ee/metadata-auth.js.map +1 -0
  160. package/dist/v2/e2ee/types.d.ts +57 -0
  161. package/dist/v2/e2ee/types.d.ts.map +1 -0
  162. package/dist/v2/e2ee/types.js +7 -0
  163. package/dist/v2/e2ee/types.js.map +1 -0
  164. package/dist/v2/session/index.d.ts +4 -0
  165. package/dist/v2/session/index.d.ts.map +1 -0
  166. package/dist/v2/session/index.js +3 -0
  167. package/dist/v2/session/index.js.map +1 -0
  168. package/dist/v2/session/keystore.d.ts +48 -0
  169. package/dist/v2/session/keystore.d.ts.map +1 -0
  170. package/dist/v2/session/keystore.js +184 -0
  171. package/dist/v2/session/keystore.js.map +1 -0
  172. package/dist/v2/session/session.d.ts +98 -0
  173. package/dist/v2/session/session.d.ts.map +1 -0
  174. package/dist/v2/session/session.js +270 -0
  175. package/dist/v2/session/session.js.map +1 -0
  176. package/dist/v2/state/commitment.d.ts +10 -0
  177. package/dist/v2/state/commitment.d.ts.map +1 -0
  178. package/dist/v2/state/commitment.js +86 -0
  179. package/dist/v2/state/commitment.js.map +1 -0
  180. package/dist/v2/state/index.d.ts +2 -0
  181. package/dist/v2/state/index.d.ts.map +1 -0
  182. package/dist/v2/state/index.js +2 -0
  183. package/dist/v2/state/index.js.map +1 -0
  184. package/package.json +43 -37
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ecdh.js","sourceRoot":"","sources":["../../../src/v2/crypto/ecdh.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ /**
2
+ * ECDSA-SHA256 RAW 签名(RFC 6979 deterministic, r||s 64 字节)。
3
+ *
4
+ * @param privateKeyScalar 32 字节 P-256 私钥标量
5
+ * @param message 原始消息(noble 内部 SHA-256)
6
+ */
7
+ export declare function ecdsaSignRaw(privateKeyScalar: Uint8Array, message: Uint8Array): Promise<Uint8Array>;
8
+ /**
9
+ * ECDSA-SHA256 RAW 验签。
10
+ *
11
+ * @param publicKeyDer SPKI DER 公钥
12
+ * @param signatureRaw 64 字节 r||s
13
+ * @param message 原始消息(内部做 SHA-256)
14
+ */
15
+ export declare function ecdsaVerifyRaw(publicKeyDer: Uint8Array, signatureRaw: Uint8Array, message: Uint8Array): Promise<boolean>;
16
+ //# sourceMappingURL=ecdsa.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ecdsa.d.ts","sourceRoot":"","sources":["../../../src/v2/crypto/ecdsa.ts"],"names":[],"mappings":"AAeA;;;;;GAKG;AACH,wBAAsB,YAAY,CAChC,gBAAgB,EAAE,UAAU,EAC5B,OAAO,EAAE,UAAU,GAClB,OAAO,CAAC,UAAU,CAAC,CAWrB;AAED;;;;;;GAMG;AACH,wBAAsB,cAAc,CAClC,YAAY,EAAE,UAAU,EACxB,YAAY,EAAE,UAAU,EACxB,OAAO,EAAE,UAAU,GAClB,OAAO,CAAC,OAAO,CAAC,CAoBlB"}
@@ -0,0 +1,52 @@
1
+ /**
2
+ * AUN E2EE V2: ECDSA P-256 + SHA-256 RAW(r||s, 64B)
3
+ *
4
+ * 规范引用: §3.4 / §5.1 / §10
5
+ *
6
+ * 浏览器实现:
7
+ * - 签名:使用 @noble/curves p256(RFC 6979 deterministic),保持与 Python /
8
+ * Go SDK 字节一致。WebCrypto 的 ECDSA 签名是不确定性的(每次随机 k),
9
+ * 无法用于 golden 比对,因此签名走 noble。
10
+ * - 验签:用 WebCrypto subtle.verify,公钥从 SPKI DER 导入。
11
+ * - 哈希:noble p256.sign 默认 prehash=true(自带 SHA-256),与 Python /
12
+ * Go ECDSA-SHA256 行为一致;显式传 prehash 让意图更明确。
13
+ */
14
+ import { p256 } from '@noble/curves/nist.js';
15
+ /**
16
+ * ECDSA-SHA256 RAW 签名(RFC 6979 deterministic, r||s 64 字节)。
17
+ *
18
+ * @param privateKeyScalar 32 字节 P-256 私钥标量
19
+ * @param message 原始消息(noble 内部 SHA-256)
20
+ */
21
+ export async function ecdsaSignRaw(privateKeyScalar, message) {
22
+ if (privateKeyScalar.length !== 32) {
23
+ throw new Error(`ECDSA private key must be 32 bytes, got ${privateKeyScalar.length}`);
24
+ }
25
+ // noble v2: sign 直接返回 Uint8Array(默认 format='compact' 即 r||s 64B)
26
+ // lowS=false 与 Python cryptography / Go ecdsa 行为一致
27
+ const sig = p256.sign(message, privateKeyScalar, { lowS: false, prehash: true });
28
+ if (!(sig instanceof Uint8Array) || sig.length !== 64) {
29
+ throw new Error(`unexpected ECDSA signature shape: ${sig?.constructor?.name} len=${sig?.length}`);
30
+ }
31
+ return sig;
32
+ }
33
+ /**
34
+ * ECDSA-SHA256 RAW 验签。
35
+ *
36
+ * @param publicKeyDer SPKI DER 公钥
37
+ * @param signatureRaw 64 字节 r||s
38
+ * @param message 原始消息(内部做 SHA-256)
39
+ */
40
+ export async function ecdsaVerifyRaw(publicKeyDer, signatureRaw, message) {
41
+ if (signatureRaw.length !== 64)
42
+ return false;
43
+ try {
44
+ const pubKey = await crypto.subtle.importKey('spki', publicKeyDer.slice().buffer, { name: 'ECDSA', namedCurve: 'P-256' }, false, ['verify']);
45
+ const ok = await crypto.subtle.verify({ name: 'ECDSA', hash: { name: 'SHA-256' } }, pubKey, signatureRaw.slice().buffer, message.slice().buffer);
46
+ return Boolean(ok);
47
+ }
48
+ catch {
49
+ return false;
50
+ }
51
+ }
52
+ //# sourceMappingURL=ecdsa.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ecdsa.js","sourceRoot":"","sources":["../../../src/v2/crypto/ecdsa.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AACH,OAAO,EAAE,IAAI,EAAE,MAAM,uBAAuB,CAAC;AAE7C;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,YAAY,CAChC,gBAA4B,EAC5B,OAAmB;IAEnB,IAAI,gBAAgB,CAAC,MAAM,KAAK,EAAE,EAAE,CAAC;QACnC,MAAM,IAAI,KAAK,CAAC,2CAA2C,gBAAgB,CAAC,MAAM,EAAE,CAAC,CAAC;IACxF,CAAC;IACD,iEAAiE;IACjE,mDAAmD;IACnD,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,gBAAgB,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;IACjF,IAAI,CAAC,CAAC,GAAG,YAAY,UAAU,CAAC,IAAI,GAAG,CAAC,MAAM,KAAK,EAAE,EAAE,CAAC;QACtD,MAAM,IAAI,KAAK,CAAC,qCAAqC,GAAG,EAAE,WAAW,EAAE,IAAI,QAAS,GAA2B,EAAE,MAAM,EAAE,CAAC,CAAC;IAC7H,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CAClC,YAAwB,EACxB,YAAwB,EACxB,OAAmB;IAEnB,IAAI,YAAY,CAAC,MAAM,KAAK,EAAE;QAAE,OAAO,KAAK,CAAC;IAC7C,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,SAAS,CAC1C,MAAM,EACN,YAAY,CAAC,KAAK,EAAE,CAAC,MAAM,EAC3B,EAAE,IAAI,EAAE,OAAO,EAAE,UAAU,EAAE,OAAO,EAAE,EACtC,KAAK,EACL,CAAC,QAAQ,CAAC,CACX,CAAC;QACF,MAAM,EAAE,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,MAAM,CACnC,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,EAAE,EAC5C,MAAM,EACN,YAAY,CAAC,KAAK,EAAE,CAAC,MAAM,EAC3B,OAAO,CAAC,KAAK,EAAE,CAAC,MAAM,CACvB,CAAC;QACF,OAAO,OAAO,CAAC,EAAE,CAAC,CAAC;IACrB,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC"}
@@ -0,0 +1,21 @@
1
+ /**
2
+ * AUN E2EE V2: HKDF-SHA256
3
+ *
4
+ * 规范引用: §3.2 / §5.2 / §10
5
+ *
6
+ * 浏览器实现:使用 WebCrypto subtle.deriveBits 完成 HKDF。
7
+ * - salt 长度为 0 时按 RFC 5869 规则替换为 32 字节零(与 Python sdk 行为一致)。
8
+ * - info 必须是 BufferSource(Uint8Array 即可)。
9
+ * - 输出长度由 `length` 控制(字节数)。
10
+ */
11
+ /**
12
+ * 计算 HKDF-SHA256(ikm, salt, info, length)。
13
+ *
14
+ * @param ikm 输入密钥材料
15
+ * @param salt 盐(可空)
16
+ * @param info 上下文/信息字段
17
+ * @param length 输出字节数
18
+ * @returns 派生密钥
19
+ */
20
+ export declare function hkdfSha256(ikm: Uint8Array, salt: Uint8Array, info: Uint8Array, length: number): Promise<Uint8Array>;
21
+ //# sourceMappingURL=hkdf.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hkdf.d.ts","sourceRoot":"","sources":["../../../src/v2/crypto/hkdf.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH;;;;;;;;GAQG;AACH,wBAAsB,UAAU,CAC9B,GAAG,EAAE,UAAU,EACf,IAAI,EAAE,UAAU,EAChB,IAAI,EAAE,UAAU,EAChB,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,UAAU,CAAC,CAqBrB"}
@@ -0,0 +1,32 @@
1
+ /**
2
+ * AUN E2EE V2: HKDF-SHA256
3
+ *
4
+ * 规范引用: §3.2 / §5.2 / §10
5
+ *
6
+ * 浏览器实现:使用 WebCrypto subtle.deriveBits 完成 HKDF。
7
+ * - salt 长度为 0 时按 RFC 5869 规则替换为 32 字节零(与 Python sdk 行为一致)。
8
+ * - info 必须是 BufferSource(Uint8Array 即可)。
9
+ * - 输出长度由 `length` 控制(字节数)。
10
+ */
11
+ /**
12
+ * 计算 HKDF-SHA256(ikm, salt, info, length)。
13
+ *
14
+ * @param ikm 输入密钥材料
15
+ * @param salt 盐(可空)
16
+ * @param info 上下文/信息字段
17
+ * @param length 输出字节数
18
+ * @returns 派生密钥
19
+ */
20
+ export async function hkdfSha256(ikm, salt, info, length) {
21
+ const realSalt = salt.length === 0 ? new Uint8Array(32) : salt;
22
+ // ikm 必须是独立 ArrayBuffer,避免视图歧义
23
+ const baseKey = await crypto.subtle.importKey('raw', ikm.slice().buffer, 'HKDF', false, ['deriveBits']);
24
+ const bits = await crypto.subtle.deriveBits({
25
+ name: 'HKDF',
26
+ hash: 'SHA-256',
27
+ salt: realSalt.slice().buffer,
28
+ info: info.slice().buffer,
29
+ }, baseKey, length * 8);
30
+ return new Uint8Array(bits);
31
+ }
32
+ //# sourceMappingURL=hkdf.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hkdf.js","sourceRoot":"","sources":["../../../src/v2/crypto/hkdf.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH;;;;;;;;GAQG;AACH,MAAM,CAAC,KAAK,UAAU,UAAU,CAC9B,GAAe,EACf,IAAgB,EAChB,IAAgB,EAChB,MAAc;IAEd,MAAM,QAAQ,GAAG,IAAI,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,UAAU,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IAC/D,+BAA+B;IAC/B,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,SAAS,CAC3C,KAAK,EACL,GAAG,CAAC,KAAK,EAAE,CAAC,MAAM,EAClB,MAAM,EACN,KAAK,EACL,CAAC,YAAY,CAAC,CACf,CAAC;IACF,MAAM,IAAI,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,UAAU,CACzC;QACE,IAAI,EAAE,MAAM;QACZ,IAAI,EAAE,SAAS;QACf,IAAI,EAAE,QAAQ,CAAC,KAAK,EAAE,CAAC,MAAM;QAC7B,IAAI,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC,MAAM;KACZ,EACf,OAAO,EACP,MAAM,GAAG,CAAC,CACX,CAAC;IACF,OAAO,IAAI,UAAU,CAAC,IAAI,CAAC,CAAC;AAC9B,CAAC"}
@@ -0,0 +1,9 @@
1
+ export { canonicalJson } from './canonical';
2
+ export { ecdhComputeShared, generateP256Keypair, privateToPublicDer, } from './ecdh';
3
+ export { hkdfSha256 } from './hkdf';
4
+ export { aesGcmEncrypt, aesGcmDecrypt } from './aead';
5
+ export { ecdsaSignRaw, ecdsaVerifyRaw } from './ecdsa';
6
+ export { compute1DHWrap, compute3DHWrap, INFO_1DH, INFO_3DH, WRAP_KEY_LENGTH, } from './dh-path';
7
+ export { sortRecipients, computeLeafHash, computeMerkleRoot, computeMerkleProof, verifyMerkleProof, computeRecipientsDigest, } from './recipients';
8
+ export type { ProofStep } from './recipients';
9
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/v2/crypto/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EACL,iBAAiB,EACjB,mBAAmB,EACnB,kBAAkB,GACnB,MAAM,QAAQ,CAAC;AAChB,OAAO,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;AACpC,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,QAAQ,CAAC;AACtD,OAAO,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AACvD,OAAO,EACL,cAAc,EACd,cAAc,EACd,QAAQ,EACR,QAAQ,EACR,eAAe,GAChB,MAAM,WAAW,CAAC;AACnB,OAAO,EACL,cAAc,EACd,eAAe,EACf,iBAAiB,EACjB,kBAAkB,EAClB,iBAAiB,EACjB,uBAAuB,GACxB,MAAM,cAAc,CAAC;AACtB,YAAY,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC"}
@@ -0,0 +1,8 @@
1
+ export { canonicalJson } from './canonical';
2
+ export { ecdhComputeShared, generateP256Keypair, privateToPublicDer, } from './ecdh';
3
+ export { hkdfSha256 } from './hkdf';
4
+ export { aesGcmEncrypt, aesGcmDecrypt } from './aead';
5
+ export { ecdsaSignRaw, ecdsaVerifyRaw } from './ecdsa';
6
+ export { compute1DHWrap, compute3DHWrap, INFO_1DH, INFO_3DH, WRAP_KEY_LENGTH, } from './dh-path';
7
+ export { sortRecipients, computeLeafHash, computeMerkleRoot, computeMerkleProof, verifyMerkleProof, computeRecipientsDigest, } from './recipients';
8
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/v2/crypto/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EACL,iBAAiB,EACjB,mBAAmB,EACnB,kBAAkB,GACnB,MAAM,QAAQ,CAAC;AAChB,OAAO,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;AACpC,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,QAAQ,CAAC;AACtD,OAAO,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AACvD,OAAO,EACL,cAAc,EACd,cAAc,EACd,QAAQ,EACR,QAAQ,EACR,eAAe,GAChB,MAAM,WAAW,CAAC;AACnB,OAAO,EACL,cAAc,EACd,eAAe,EACf,iBAAiB,EACjB,kBAAkB,EAClB,iBAAiB,EACjB,uBAAuB,GACxB,MAAM,cAAc,CAAC"}
@@ -0,0 +1,43 @@
1
+ /**
2
+ * AUN E2EE V2: Recipients 排序与 Digest(Merkle root)
3
+ *
4
+ * 规范引用: §10.3 / §5.3
5
+ * - 二维数组(无 columns 表头);行按 (aid asc, device_id asc, role asc) 排序
6
+ * - 每行固定 8 字段: [aid, device_id, role, key_source, fp, spk_id, wrap_nonce, wrapped_key]
7
+ * - leaf = SHA256(LEAF_PREFIX || canonical row binary fields)
8
+ * - inner = SHA256(NODE_PREFIX || left || right)
9
+ * - 奇数节点复制最后一个
10
+ *
11
+ * 浏览器实现:使用 WebCrypto subtle.digest('SHA-256'),全链路 async。
12
+ * - wrap_nonce / wrapped_key 字段:优先 base64 解码(仅当长度为 4 的倍数且字符合法),
13
+ * 失败时回退 UTF-8 字节,与 Python `_decode_or_raw` 对齐。
14
+ */
15
+ /**
16
+ * 按 (aid asc, device_id asc, role asc) 排序 recipients 行(不修改入参)。
17
+ */
18
+ export declare function sortRecipients(rows: string[][]): string[][];
19
+ /**
20
+ * 计算单个 recipient 行的 leaf hash(32 字节)。
21
+ */
22
+ export declare function computeLeafHash(row: string[]): Promise<Uint8Array>;
23
+ /**
24
+ * Merkle root(hex),rows 必须已排序。
25
+ */
26
+ export declare function computeMerkleRoot(rows: string[][]): Promise<string>;
27
+ export interface ProofStep {
28
+ sibling: string;
29
+ position: 'L' | 'R';
30
+ }
31
+ /**
32
+ * 为 targetIndex 行生成 Merkle proof。
33
+ */
34
+ export declare function computeMerkleProof(rows: string[][], targetIndex: number): Promise<ProofStep[]>;
35
+ /**
36
+ * 验证 leaf + proof 重建出的 root 与期望值一致。
37
+ */
38
+ export declare function verifyMerkleProof(leaf: Uint8Array, proof: ProofStep[], expectedRootHex: string): Promise<boolean>;
39
+ /**
40
+ * 计算 recipients_digest(Merkle root)。调用方 MUST 先调 sortRecipients。
41
+ */
42
+ export declare function computeRecipientsDigest(rows: string[][]): Promise<string>;
43
+ //# sourceMappingURL=recipients.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"recipients.d.ts","sourceRoot":"","sources":["../../../src/v2/crypto/recipients.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AA8DH;;GAEG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,GAAG,MAAM,EAAE,EAAE,CAO3D;AAED;;GAEG;AACH,wBAAsB,eAAe,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,UAAU,CAAC,CA8BxE;AAMD;;GAEG;AACH,wBAAsB,iBAAiB,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CAczE;AAED,MAAM,WAAW,SAAS;IACxB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,GAAG,GAAG,GAAG,CAAC;CACrB;AAED;;GAEG;AACH,wBAAsB,kBAAkB,CACtC,IAAI,EAAE,MAAM,EAAE,EAAE,EAChB,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC,SAAS,EAAE,CAAC,CAsBtB;AAED;;GAEG;AACH,wBAAsB,iBAAiB,CACrC,IAAI,EAAE,UAAU,EAChB,KAAK,EAAE,SAAS,EAAE,EAClB,eAAe,EAAE,MAAM,GACtB,OAAO,CAAC,OAAO,CAAC,CAelB;AAED;;GAEG;AACH,wBAAsB,uBAAuB,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CAE/E"}
@@ -0,0 +1,188 @@
1
+ /**
2
+ * AUN E2EE V2: Recipients 排序与 Digest(Merkle root)
3
+ *
4
+ * 规范引用: §10.3 / §5.3
5
+ * - 二维数组(无 columns 表头);行按 (aid asc, device_id asc, role asc) 排序
6
+ * - 每行固定 8 字段: [aid, device_id, role, key_source, fp, spk_id, wrap_nonce, wrapped_key]
7
+ * - leaf = SHA256(LEAF_PREFIX || canonical row binary fields)
8
+ * - inner = SHA256(NODE_PREFIX || left || right)
9
+ * - 奇数节点复制最后一个
10
+ *
11
+ * 浏览器实现:使用 WebCrypto subtle.digest('SHA-256'),全链路 async。
12
+ * - wrap_nonce / wrapped_key 字段:优先 base64 解码(仅当长度为 4 的倍数且字符合法),
13
+ * 失败时回退 UTF-8 字节,与 Python `_decode_or_raw` 对齐。
14
+ */
15
+ const LEAF_PREFIX = new TextEncoder().encode('AUN-V2-RCPT-LEAF-v1');
16
+ const NODE_PREFIX = new TextEncoder().encode('AUN-V2-RCPT-NODE-v1');
17
+ async function sha256(data) {
18
+ const buf = await crypto.subtle.digest('SHA-256', data.slice().buffer);
19
+ return new Uint8Array(buf);
20
+ }
21
+ function bytesToHex(b) {
22
+ let s = '';
23
+ for (let i = 0; i < b.length; i++)
24
+ s += b[i].toString(16).padStart(2, '0');
25
+ return s;
26
+ }
27
+ function hexToBytes(s) {
28
+ if (s.length % 2 !== 0)
29
+ throw new Error('hex length must be even');
30
+ const out = new Uint8Array(s.length / 2);
31
+ for (let i = 0; i < out.length; i++) {
32
+ const hi = parseInt(s.charAt(i * 2), 16);
33
+ const lo = parseInt(s.charAt(i * 2 + 1), 16);
34
+ if (Number.isNaN(hi) || Number.isNaN(lo))
35
+ throw new Error('invalid hex char');
36
+ out[i] = (hi << 4) | lo;
37
+ }
38
+ return out;
39
+ }
40
+ function concat(...arrs) {
41
+ let total = 0;
42
+ for (const a of arrs)
43
+ total += a.length;
44
+ const out = new Uint8Array(total);
45
+ let pos = 0;
46
+ for (const a of arrs) {
47
+ out.set(a, pos);
48
+ pos += a.length;
49
+ }
50
+ return out;
51
+ }
52
+ /**
53
+ * 与 Python `_decode_or_raw` 行为一致:
54
+ * - 空串 → 空 bytes
55
+ * - 长度为 4 的倍数且仅含 base64 字符 → atob 解码
56
+ * - 其他情况 → UTF-8 编码
57
+ */
58
+ function decodeOrRaw(value) {
59
+ if (!value)
60
+ return new Uint8Array(0);
61
+ // 标准 base64:A-Z a-z 0-9 + / =,长度必须是 4 的倍数
62
+ if (value.length > 0 && value.length % 4 === 0 && /^[A-Za-z0-9+/]+={0,2}$/.test(value)) {
63
+ try {
64
+ const bin = atob(value);
65
+ const out = new Uint8Array(bin.length);
66
+ for (let i = 0; i < bin.length; i++)
67
+ out[i] = bin.charCodeAt(i);
68
+ return out;
69
+ }
70
+ catch {
71
+ // fall through
72
+ }
73
+ }
74
+ return new TextEncoder().encode(value);
75
+ }
76
+ /**
77
+ * 按 (aid asc, device_id asc, role asc) 排序 recipients 行(不修改入参)。
78
+ */
79
+ export function sortRecipients(rows) {
80
+ return [...rows].sort((a, b) => {
81
+ if (a[0] !== b[0])
82
+ return a[0] < b[0] ? -1 : 1;
83
+ if (a[1] !== b[1])
84
+ return a[1] < b[1] ? -1 : 1;
85
+ if (a[2] !== b[2])
86
+ return a[2] < b[2] ? -1 : 1;
87
+ return 0;
88
+ });
89
+ }
90
+ /**
91
+ * 计算单个 recipient 行的 leaf hash(32 字节)。
92
+ */
93
+ export async function computeLeafHash(row) {
94
+ const enc = (s) => new TextEncoder().encode(s ?? '');
95
+ const aid = enc(String(row[0] ?? ''));
96
+ const deviceId = enc(String(row[1] ?? ''));
97
+ const role = enc(String(row[2] ?? ''));
98
+ const keySource = enc(String(row[3] ?? ''));
99
+ const fp = enc(String(row[4] ?? ''));
100
+ const spkId = enc(String(row.length > 5 ? row[5] : ''));
101
+ const wrapNonce = decodeOrRaw(row.length > 6 ? String(row[6] ?? '') : '');
102
+ const wrappedKey = decodeOrRaw(row.length > 7 ? String(row[7] ?? '') : '');
103
+ const ZERO = Uint8Array.of(0);
104
+ const data = concat(LEAF_PREFIX, aid, ZERO, deviceId, ZERO, role, ZERO, keySource, ZERO, fp, ZERO, spkId, ZERO, wrapNonce, wrappedKey);
105
+ return sha256(data);
106
+ }
107
+ async function nodeHash(left, right) {
108
+ return sha256(concat(NODE_PREFIX, left, right));
109
+ }
110
+ /**
111
+ * Merkle root(hex),rows 必须已排序。
112
+ */
113
+ export async function computeMerkleRoot(rows) {
114
+ if (rows.length === 0)
115
+ return '';
116
+ let layer = [];
117
+ for (const r of rows)
118
+ layer.push(await computeLeafHash(r));
119
+ while (layer.length > 1) {
120
+ if (layer.length % 2 === 1)
121
+ layer.push(layer[layer.length - 1]);
122
+ const next = [];
123
+ for (let i = 0; i < layer.length; i += 2) {
124
+ next.push(await nodeHash(layer[i], layer[i + 1]));
125
+ }
126
+ layer = next;
127
+ }
128
+ return bytesToHex(layer[0]);
129
+ }
130
+ /**
131
+ * 为 targetIndex 行生成 Merkle proof。
132
+ */
133
+ export async function computeMerkleProof(rows, targetIndex) {
134
+ if (rows.length === 0 || targetIndex < 0 || targetIndex >= rows.length)
135
+ return [];
136
+ let layer = [];
137
+ for (const r of rows)
138
+ layer.push(await computeLeafHash(r));
139
+ let idx = targetIndex;
140
+ const proof = [];
141
+ while (layer.length > 1) {
142
+ if (layer.length % 2 === 1)
143
+ layer.push(layer[layer.length - 1]);
144
+ const siblingIdx = idx ^ 1;
145
+ proof.push({
146
+ sibling: bytesToHex(layer[siblingIdx]),
147
+ position: siblingIdx > idx ? 'R' : 'L',
148
+ });
149
+ const next = [];
150
+ for (let i = 0; i < layer.length; i += 2) {
151
+ next.push(await nodeHash(layer[i], layer[i + 1]));
152
+ }
153
+ layer = next;
154
+ idx = Math.floor(idx / 2);
155
+ }
156
+ return proof;
157
+ }
158
+ /**
159
+ * 验证 leaf + proof 重建出的 root 与期望值一致。
160
+ */
161
+ export async function verifyMerkleProof(leaf, proof, expectedRootHex) {
162
+ if (!expectedRootHex)
163
+ return false;
164
+ let cur = leaf;
165
+ for (const step of proof) {
166
+ let sibling;
167
+ try {
168
+ sibling = hexToBytes(step.sibling);
169
+ }
170
+ catch {
171
+ return false;
172
+ }
173
+ if (step.position === 'L')
174
+ cur = await nodeHash(sibling, cur);
175
+ else if (step.position === 'R')
176
+ cur = await nodeHash(cur, sibling);
177
+ else
178
+ return false;
179
+ }
180
+ return bytesToHex(cur) === expectedRootHex;
181
+ }
182
+ /**
183
+ * 计算 recipients_digest(Merkle root)。调用方 MUST 先调 sortRecipients。
184
+ */
185
+ export async function computeRecipientsDigest(rows) {
186
+ return computeMerkleRoot(rows);
187
+ }
188
+ //# sourceMappingURL=recipients.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"recipients.js","sourceRoot":"","sources":["../../../src/v2/crypto/recipients.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ /**
2
+ * 解密 V2 加密消息(P2P 或 Group)。
3
+ *
4
+ * @param envelope 完整 envelope dict
5
+ * @param selfAid 接收方 AID
6
+ * @param selfDeviceId 接收方 device_id
7
+ * @param selfIkPriv 接收方 IK 私钥(32B scalar)
8
+ * @param selfSpkPriv 接收方 SPK 私钥(32B scalar);undefined 表示无 SPK(1DH)
9
+ * @param senderPubDer 发送方 AID 主公钥(DER),用于验签
10
+ * @returns 解密后的 payload;null 表示找不到自己的 recipient 行
11
+ */
12
+ export declare function decryptMessage(envelope: Record<string, unknown>, selfAid: string, selfDeviceId: string, selfIkPriv: Uint8Array, selfSpkPriv: Uint8Array | undefined, senderPubDer: Uint8Array): Promise<Record<string, unknown> | null>;
13
+ //# sourceMappingURL=decrypt.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"decrypt.d.ts","sourceRoot":"","sources":["../../../src/v2/e2ee/decrypt.ts"],"names":[],"mappings":"AA2EA;;;;;;;;;;GAUG;AACH,wBAAsB,cAAc,CAClC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACjC,OAAO,EAAE,MAAM,EACf,YAAY,EAAE,MAAM,EACpB,UAAU,EAAE,UAAU,EACtB,WAAW,EAAE,UAAU,GAAG,SAAS,EACnC,YAAY,EAAE,UAAU,GACvB,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC,CA4FzC"}
@@ -0,0 +1,176 @@
1
+ /**
2
+ * AUN E2EE V2: 统一解密引擎(浏览器版,async)
3
+ *
4
+ * 支持 P2P 和 Group 消息解密(按 envelope.type 分流)。纯计算,无 IO。
5
+ *
6
+ * 规范引用: §4.6 / §5.5
7
+ *
8
+ * 参考实现: python/src/aun_core/v2/e2ee/decrypt.py
9
+ */
10
+ import { canonicalJson } from '../crypto/canonical';
11
+ import { ecdsaVerifyRaw } from '../crypto/ecdsa';
12
+ import { ecdhComputeShared } from '../crypto/ecdh';
13
+ import { hkdfSha256 } from '../crypto/hkdf';
14
+ import { aesGcmDecrypt } from '../crypto/aead';
15
+ import { computeLeafHash, computeMerkleRoot, verifyMerkleProof, } from '../crypto/recipients';
16
+ import { SUITE_NAME } from './types';
17
+ const encoder = new TextEncoder();
18
+ const INFO_3DH = encoder.encode('AUN-V2-3DH');
19
+ const INFO_1DH = encoder.encode('AUN-V2-1DH');
20
+ async function sha256(data) {
21
+ const buf = await crypto.subtle.digest('SHA-256', data.slice().buffer);
22
+ return new Uint8Array(buf);
23
+ }
24
+ function base64ToBytes(s) {
25
+ const bin = atob(s);
26
+ const out = new Uint8Array(bin.length);
27
+ for (let i = 0; i < bin.length; i++)
28
+ out[i] = bin.charCodeAt(i);
29
+ return out;
30
+ }
31
+ function hexToBytes(s) {
32
+ if (s.length % 2 !== 0)
33
+ throw new Error('hex length must be even');
34
+ const out = new Uint8Array(s.length / 2);
35
+ for (let i = 0; i < out.length; i++) {
36
+ const hi = parseInt(s.charAt(i * 2), 16);
37
+ const lo = parseInt(s.charAt(i * 2 + 1), 16);
38
+ if (Number.isNaN(hi) || Number.isNaN(lo))
39
+ throw new Error('invalid hex char');
40
+ out[i] = (hi << 4) | lo;
41
+ }
42
+ return out;
43
+ }
44
+ /**
45
+ * 解密 V2 加密消息(P2P 或 Group)。
46
+ *
47
+ * @param envelope 完整 envelope dict
48
+ * @param selfAid 接收方 AID
49
+ * @param selfDeviceId 接收方 device_id
50
+ * @param selfIkPriv 接收方 IK 私钥(32B scalar)
51
+ * @param selfSpkPriv 接收方 SPK 私钥(32B scalar);undefined 表示无 SPK(1DH)
52
+ * @param senderPubDer 发送方 AID 主公钥(DER),用于验签
53
+ * @returns 解密后的 payload;null 表示找不到自己的 recipient 行
54
+ */
55
+ export async function decryptMessage(envelope, selfAid, selfDeviceId, selfIkPriv, selfSpkPriv, senderPubDer) {
56
+ const env = envelope;
57
+ // 1. 验 sender_signature
58
+ if (!(await verifySenderSignature(env, senderPubDer))) {
59
+ throw new Error('sender_signature verification failed');
60
+ }
61
+ // 2. 找自己的 row(完整 recipients 数组 / 单个 recipient + merkle_proof)
62
+ let row = null;
63
+ if (Array.isArray(env.recipients)) {
64
+ const rows = env.recipients;
65
+ const expected = await computeMerkleRoot(rows);
66
+ if (expected !== env.recipients_digest) {
67
+ throw new Error('recipients_digest mismatch');
68
+ }
69
+ row = findMyRow(rows, selfAid, selfDeviceId);
70
+ if (!row)
71
+ return null;
72
+ }
73
+ else if (env.recipient && typeof env.recipient === 'object') {
74
+ const r = env.recipient;
75
+ row = [
76
+ r.aid ?? '',
77
+ r.device_id ?? '',
78
+ r.role ?? '',
79
+ r.key_source ?? '',
80
+ r.fp ?? '',
81
+ r.spk_id ?? '',
82
+ r.wrap_nonce ?? '',
83
+ r.wrapped_key ?? '',
84
+ ];
85
+ // 服务端拆分后存储:用 Merkle proof 验证 wrap 在签名集中
86
+ const proof = env.merkle_proof;
87
+ const expectedRoot = env.recipients_digest;
88
+ if (proof != null && expectedRoot) {
89
+ const leaf = await computeLeafHash(row);
90
+ const ok = await verifyMerkleProof(leaf, proof, expectedRoot);
91
+ if (!ok) {
92
+ // 服务端篡改/替换 wrap,拒绝
93
+ return null;
94
+ }
95
+ }
96
+ }
97
+ else {
98
+ return null;
99
+ }
100
+ // 3. wrap_salt = SHA256(canonical_aad || sender_session_pk_der || suite)[:16]
101
+ const senderSessionPkDer = base64ToBytes(env.sender_session_pk);
102
+ const aadBytes = canonicalJson(env.aad);
103
+ const suiteStr = env.suite ?? SUITE_NAME;
104
+ const suiteBytes = encoder.encode(suiteStr);
105
+ const saltInput = new Uint8Array(aadBytes.length + senderSessionPkDer.length + suiteBytes.length);
106
+ saltInput.set(aadBytes, 0);
107
+ saltInput.set(senderSessionPkDer, aadBytes.length);
108
+ saltInput.set(suiteBytes, aadBytes.length + senderSessionPkDer.length);
109
+ const wrapSalt = (await sha256(saltInput)).subarray(0, 16);
110
+ // 4. compute wrap_key
111
+ const wrapKey = await computeWrapKey(row, selfIkPriv, selfSpkPriv, senderSessionPkDer, senderPubDer, wrapSalt);
112
+ // 5. decrypt master_key(wrapped_key = ciphertext(32B) + tag(16B) = 48B)
113
+ const wrapNonce = base64ToBytes(row[6]);
114
+ const wrappedKey = base64ToBytes(row[7]);
115
+ if (wrappedKey.length < 16) {
116
+ throw new Error(`wrapped_key too short: ${wrappedKey.length}`);
117
+ }
118
+ const wrappedCt = wrappedKey.subarray(0, wrappedKey.length - 16);
119
+ const wrappedTag = wrappedKey.subarray(wrappedKey.length - 16);
120
+ const masterKey = await aesGcmDecrypt(wrapKey, wrapNonce, wrappedCt, wrappedTag, new Uint8Array(0));
121
+ // 6. decrypt body
122
+ const msgNonce = base64ToBytes(env.nonce);
123
+ const ct = base64ToBytes(env.ciphertext);
124
+ const tag = base64ToBytes(env.tag);
125
+ const plaintext = await aesGcmDecrypt(masterKey, msgNonce, ct, tag, aadBytes);
126
+ // 7. 解析 payload
127
+ return JSON.parse(new TextDecoder().decode(plaintext));
128
+ }
129
+ async function verifySenderSignature(env, senderPubDer) {
130
+ const sig = base64ToBytes(env.sender_signature);
131
+ const ct = base64ToBytes(env.ciphertext);
132
+ const tag = base64ToBytes(env.tag);
133
+ const aadBytes = canonicalJson(env.aad);
134
+ const digestBytes = hexToBytes(env.recipients_digest);
135
+ const signInput = new Uint8Array(ct.length + tag.length + aadBytes.length + digestBytes.length);
136
+ let pos = 0;
137
+ signInput.set(ct, pos);
138
+ pos += ct.length;
139
+ signInput.set(tag, pos);
140
+ pos += tag.length;
141
+ signInput.set(aadBytes, pos);
142
+ pos += aadBytes.length;
143
+ signInput.set(digestBytes, pos);
144
+ return ecdsaVerifyRaw(senderPubDer, sig, signInput);
145
+ }
146
+ function findMyRow(recipients, selfAid, selfDeviceId) {
147
+ for (const row of recipients) {
148
+ if (row[0] === selfAid && row[1] === selfDeviceId)
149
+ return row;
150
+ }
151
+ return null;
152
+ }
153
+ async function computeWrapKey(row, selfIkPriv, selfSpkPriv, senderSessionPkDer, senderMasterPkDer, salt) {
154
+ const spkId = row[5];
155
+ if (spkId && selfSpkPriv) {
156
+ // 3DH 接收方路径
157
+ // dh1 = ECDH(self_ik_priv, sender_session_pk)
158
+ // dh2 = ECDH(self_spk_priv, sender_master_pk)
159
+ // dh3 = ECDH(self_spk_priv, sender_session_pk)
160
+ const dh1 = await ecdhComputeShared(selfIkPriv, senderSessionPkDer);
161
+ const dh2 = await ecdhComputeShared(selfSpkPriv, senderMasterPkDer);
162
+ const dh3 = await ecdhComputeShared(selfSpkPriv, senderSessionPkDer);
163
+ if (dh1.length !== 32 || dh2.length !== 32 || dh3.length !== 32) {
164
+ throw new Error(`3DH expected 32B shares, got dh1=${dh1.length} dh2=${dh2.length} dh3=${dh3.length}`);
165
+ }
166
+ const ikm = new Uint8Array(96);
167
+ ikm.set(dh1, 0);
168
+ ikm.set(dh2, 32);
169
+ ikm.set(dh3, 64);
170
+ return hkdfSha256(ikm, salt, INFO_3DH, 32);
171
+ }
172
+ // 1DH 接收方路径
173
+ const dh1 = await ecdhComputeShared(selfIkPriv, senderSessionPkDer);
174
+ return hkdfSha256(dh1, salt, INFO_1DH, 32);
175
+ }
176
+ //# sourceMappingURL=decrypt.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"decrypt.js","sourceRoot":"","sources":["../../../src/v2/e2ee/decrypt.ts"],"names":[],"mappings":"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"}