@sebastienrousseau/crypto-lib 0.0.2 → 0.0.7

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 (243) hide show
  1. package/README.md +334 -185
  2. package/dist/accel/index.d.ts +11 -0
  3. package/dist/accel/index.d.ts.map +1 -0
  4. package/dist/accel/index.js +31 -0
  5. package/dist/accel/native-pqc-bridge.d.ts +18 -0
  6. package/dist/accel/native-pqc-bridge.d.ts.map +1 -0
  7. package/dist/accel/native-pqc-bridge.js +100 -0
  8. package/dist/accel/wasm-bridge.d.ts +35 -0
  9. package/dist/accel/wasm-bridge.d.ts.map +1 -0
  10. package/dist/accel/wasm-bridge.js +161 -0
  11. package/dist/accel/webcrypto-bridge.d.ts +32 -0
  12. package/dist/accel/webcrypto-bridge.d.ts.map +1 -0
  13. package/dist/accel/webcrypto-bridge.js +179 -0
  14. package/dist/accel/webcrypto-modern.d.ts +40 -0
  15. package/dist/accel/webcrypto-modern.d.ts.map +1 -0
  16. package/dist/accel/webcrypto-modern.js +213 -0
  17. package/dist/accel/worker-pool.d.ts +23 -0
  18. package/dist/accel/worker-pool.d.ts.map +1 -0
  19. package/dist/accel/worker-pool.js +119 -0
  20. package/dist/bin/cryptolib.d.ts +25 -0
  21. package/dist/bin/cryptolib.d.ts.map +1 -0
  22. package/dist/bin/cryptolib.js +87 -0
  23. package/dist/config/config.d.ts +8 -0
  24. package/dist/config/config.d.ts.map +1 -0
  25. package/dist/config/config.js +13 -0
  26. package/dist/crypto.d.ts +43 -0
  27. package/dist/crypto.d.ts.map +1 -0
  28. package/dist/crypto.js +107 -0
  29. package/dist/enums.d.ts +81 -0
  30. package/dist/enums.d.ts.map +1 -0
  31. package/dist/enums.js +82 -0
  32. package/dist/errors.d.ts +14 -0
  33. package/dist/errors.d.ts.map +1 -0
  34. package/dist/errors.js +22 -0
  35. package/dist/high-level/index.d.ts +11 -0
  36. package/dist/high-level/index.d.ts.map +1 -0
  37. package/dist/high-level/index.js +53 -0
  38. package/dist/high-level/key-wrap.d.ts +16 -0
  39. package/dist/high-level/key-wrap.d.ts.map +1 -0
  40. package/dist/high-level/key-wrap.js +93 -0
  41. package/dist/high-level/multi-recipient.d.ts +25 -0
  42. package/dist/high-level/multi-recipient.d.ts.map +1 -0
  43. package/dist/high-level/multi-recipient.js +122 -0
  44. package/dist/high-level/password-encrypt.d.ts +14 -0
  45. package/dist/high-level/password-encrypt.d.ts.map +1 -0
  46. package/dist/high-level/password-encrypt.js +93 -0
  47. package/dist/high-level/sealedbox.d.ts +13 -0
  48. package/dist/high-level/sealedbox.d.ts.map +1 -0
  49. package/dist/high-level/sealedbox.js +119 -0
  50. package/dist/high-level/secretbox.d.ts +7 -0
  51. package/dist/high-level/secretbox.d.ts.map +1 -0
  52. package/dist/high-level/secretbox.js +54 -0
  53. package/dist/index.d.ts +16 -2
  54. package/dist/index.d.ts.map +1 -1
  55. package/dist/index.js +61 -2
  56. package/dist/key/key.d.ts +10 -0
  57. package/dist/key/key.d.ts.map +1 -0
  58. package/dist/key/key.js +25 -0
  59. package/dist/key/keystore.d.ts +11 -0
  60. package/dist/key/keystore.d.ts.map +1 -0
  61. package/dist/key/keystore.js +87 -0
  62. package/dist/keys/index.d.ts +7 -0
  63. package/dist/keys/index.d.ts.map +1 -0
  64. package/dist/keys/index.js +22 -0
  65. package/dist/keys/keygen.d.ts +16 -0
  66. package/dist/keys/keygen.d.ts.map +1 -0
  67. package/dist/keys/keygen.js +128 -0
  68. package/dist/keys/keyring.d.ts +35 -0
  69. package/dist/keys/keyring.d.ts.map +1 -0
  70. package/dist/keys/keyring.js +136 -0
  71. package/dist/keys/serialize.d.ts +30 -0
  72. package/dist/keys/serialize.d.ts.map +1 -0
  73. package/dist/keys/serialize.js +120 -0
  74. package/dist/lib/decrypt.d.ts +5 -5
  75. package/dist/lib/decrypt.d.ts.map +1 -1
  76. package/dist/lib/decrypt.js +49 -39
  77. package/dist/lib/encrypt.d.ts +2 -5
  78. package/dist/lib/encrypt.d.ts.map +1 -1
  79. package/dist/lib/encrypt.js +34 -39
  80. package/dist/lib/generate.d.ts +2 -11
  81. package/dist/lib/generate.d.ts.map +1 -1
  82. package/dist/lib/generate.js +57 -29
  83. package/dist/lib/index.d.ts +10 -0
  84. package/dist/lib/index.d.ts.map +1 -0
  85. package/dist/lib/index.js +53 -0
  86. package/dist/lib/key-output.d.ts +7 -0
  87. package/dist/lib/key-output.d.ts.map +1 -0
  88. package/dist/lib/key-output.js +50 -0
  89. package/dist/lib/reformat.d.ts +9 -0
  90. package/dist/lib/reformat.d.ts.map +1 -0
  91. package/dist/lib/reformat.js +67 -0
  92. package/dist/lib/revoke.d.ts +3 -3
  93. package/dist/lib/revoke.d.ts.map +1 -1
  94. package/dist/lib/revoke.js +36 -28
  95. package/dist/lib/session.d.ts +5 -0
  96. package/dist/lib/session.d.ts.map +1 -0
  97. package/dist/lib/session.js +55 -0
  98. package/dist/lib/sign.d.ts +4 -0
  99. package/dist/lib/sign.d.ts.map +1 -0
  100. package/dist/lib/sign.js +63 -0
  101. package/dist/lib/verify.d.ts +5 -0
  102. package/dist/lib/verify.d.ts.map +1 -0
  103. package/dist/lib/verify.js +52 -0
  104. package/dist/modern/aead.d.ts +17 -0
  105. package/dist/modern/aead.d.ts.map +1 -0
  106. package/dist/modern/aead.js +51 -0
  107. package/dist/modern/aes.d.ts +35 -0
  108. package/dist/modern/aes.d.ts.map +1 -0
  109. package/dist/modern/aes.js +82 -0
  110. package/dist/modern/cost-limits.d.ts +11 -0
  111. package/dist/modern/cost-limits.d.ts.map +1 -0
  112. package/dist/modern/cost-limits.js +35 -0
  113. package/dist/modern/curves.d.ts +86 -0
  114. package/dist/modern/curves.d.ts.map +1 -0
  115. package/dist/modern/curves.js +171 -0
  116. package/dist/modern/ecdh.d.ts +11 -0
  117. package/dist/modern/ecdh.d.ts.map +1 -0
  118. package/dist/modern/ecdh.js +28 -0
  119. package/dist/modern/fn-dsa.d.ts +19 -0
  120. package/dist/modern/fn-dsa.d.ts.map +1 -0
  121. package/dist/modern/fn-dsa.js +57 -0
  122. package/dist/modern/hash.d.ts +13 -0
  123. package/dist/modern/hash.d.ts.map +1 -0
  124. package/dist/modern/hash.js +45 -0
  125. package/dist/modern/hpke.d.ts +47 -0
  126. package/dist/modern/hpke.d.ts.map +1 -0
  127. package/dist/modern/hpke.js +207 -0
  128. package/dist/modern/index.d.ts +40 -0
  129. package/dist/modern/index.d.ts.map +1 -0
  130. package/dist/modern/index.js +194 -0
  131. package/dist/modern/kdf.d.ts +23 -0
  132. package/dist/modern/kdf.d.ts.map +1 -0
  133. package/dist/modern/kdf.js +67 -0
  134. package/dist/modern/mac.d.ts +51 -0
  135. package/dist/modern/mac.d.ts.map +1 -0
  136. package/dist/modern/mac.js +119 -0
  137. package/dist/modern/password.d.ts +40 -0
  138. package/dist/modern/password.d.ts.map +1 -0
  139. package/dist/modern/password.js +123 -0
  140. package/dist/modern/pq-hash-sign.d.ts +18 -0
  141. package/dist/modern/pq-hash-sign.d.ts.map +1 -0
  142. package/dist/modern/pq-hash-sign.js +73 -0
  143. package/dist/modern/pq-kem.d.ts +88 -0
  144. package/dist/modern/pq-kem.d.ts.map +1 -0
  145. package/dist/modern/pq-kem.js +270 -0
  146. package/dist/modern/pq-sign.d.ts +30 -0
  147. package/dist/modern/pq-sign.d.ts.map +1 -0
  148. package/dist/modern/pq-sign.js +94 -0
  149. package/dist/modern/pq.d.ts +38 -0
  150. package/dist/modern/pq.d.ts.map +1 -0
  151. package/dist/modern/pq.js +80 -0
  152. package/dist/modern/signing.d.ts +16 -0
  153. package/dist/modern/signing.d.ts.map +1 -0
  154. package/dist/modern/signing.js +34 -0
  155. package/dist/protocols/index.d.ts +7 -0
  156. package/dist/protocols/index.d.ts.map +1 -0
  157. package/dist/protocols/index.js +46 -0
  158. package/dist/protocols/iso20022.d.ts +51 -0
  159. package/dist/protocols/iso20022.d.ts.map +1 -0
  160. package/dist/protocols/iso20022.js +145 -0
  161. package/dist/protocols/opaque/ake.d.ts +51 -0
  162. package/dist/protocols/opaque/ake.d.ts.map +1 -0
  163. package/dist/protocols/opaque/ake.js +102 -0
  164. package/dist/protocols/opaque/client.d.ts +45 -0
  165. package/dist/protocols/opaque/client.d.ts.map +1 -0
  166. package/dist/protocols/opaque/client.js +63 -0
  167. package/dist/protocols/opaque/config.d.ts +14 -0
  168. package/dist/protocols/opaque/config.d.ts.map +1 -0
  169. package/dist/protocols/opaque/config.js +18 -0
  170. package/dist/protocols/opaque/credentials.d.ts +29 -0
  171. package/dist/protocols/opaque/credentials.d.ts.map +1 -0
  172. package/dist/protocols/opaque/credentials.js +61 -0
  173. package/dist/protocols/opaque/envelope.d.ts +36 -0
  174. package/dist/protocols/opaque/envelope.d.ts.map +1 -0
  175. package/dist/protocols/opaque/envelope.js +77 -0
  176. package/dist/protocols/opaque/ksf.d.ts +15 -0
  177. package/dist/protocols/opaque/ksf.d.ts.map +1 -0
  178. package/dist/protocols/opaque/ksf.js +27 -0
  179. package/dist/protocols/opaque/messages.d.ts +61 -0
  180. package/dist/protocols/opaque/messages.d.ts.map +1 -0
  181. package/dist/protocols/opaque/messages.js +94 -0
  182. package/dist/protocols/opaque/server.d.ts +33 -0
  183. package/dist/protocols/opaque/server.d.ts.map +1 -0
  184. package/dist/protocols/opaque/server.js +74 -0
  185. package/dist/protocols/opaque/suite.d.ts +58 -0
  186. package/dist/protocols/opaque/suite.d.ts.map +1 -0
  187. package/dist/protocols/opaque/suite.js +115 -0
  188. package/dist/protocols/pake.d.ts +14 -0
  189. package/dist/protocols/pake.d.ts.map +1 -0
  190. package/dist/protocols/pake.js +33 -0
  191. package/dist/protocols/pqxdh.d.ts +53 -0
  192. package/dist/protocols/pqxdh.d.ts.map +1 -0
  193. package/dist/protocols/pqxdh.js +143 -0
  194. package/dist/protocols/ratchet.d.ts +52 -0
  195. package/dist/protocols/ratchet.d.ts.map +1 -0
  196. package/dist/protocols/ratchet.js +187 -0
  197. package/dist/protocols/threshold.d.ts +23 -0
  198. package/dist/protocols/threshold.d.ts.map +1 -0
  199. package/dist/protocols/threshold.js +191 -0
  200. package/dist/registry.d.ts +20 -0
  201. package/dist/registry.d.ts.map +1 -0
  202. package/dist/registry.js +399 -0
  203. package/dist/streaming/index.d.ts +7 -0
  204. package/dist/streaming/index.d.ts.map +1 -0
  205. package/dist/streaming/index.js +15 -0
  206. package/dist/streaming/stream-aead.d.ts +17 -0
  207. package/dist/streaming/stream-aead.d.ts.map +1 -0
  208. package/dist/streaming/stream-aead.js +125 -0
  209. package/dist/streaming/stream-hash.d.ts +9 -0
  210. package/dist/streaming/stream-hash.d.ts.map +1 -0
  211. package/dist/streaming/stream-hash.js +52 -0
  212. package/dist/streaming/web-streams.d.ts +17 -0
  213. package/dist/streaming/web-streams.d.ts.map +1 -0
  214. package/dist/streaming/web-streams.js +114 -0
  215. package/dist/tokens/index.d.ts +5 -0
  216. package/dist/tokens/index.d.ts.map +1 -0
  217. package/dist/tokens/index.js +15 -0
  218. package/dist/tokens/key-rotation.d.ts +20 -0
  219. package/dist/tokens/key-rotation.d.ts.map +1 -0
  220. package/dist/tokens/key-rotation.js +76 -0
  221. package/dist/tokens/paseto.d.ts +46 -0
  222. package/dist/tokens/paseto.d.ts.map +1 -0
  223. package/dist/tokens/paseto.js +200 -0
  224. package/dist/types/types.d.ts +57 -0
  225. package/dist/types/types.d.ts.map +1 -1
  226. package/dist/types/types.js +1 -0
  227. package/dist/utils.d.ts +13 -0
  228. package/dist/utils.d.ts.map +1 -0
  229. package/dist/utils.js +56 -0
  230. package/package.json +77 -130
  231. package/dist/COPYRIGHT +0 -15
  232. package/dist/Report.txt +0 -72
  233. package/dist/bin/crypto-lib.d.ts +0 -13
  234. package/dist/bin/crypto-lib.d.ts.map +0 -1
  235. package/dist/bin/crypto-lib.js +0 -52
  236. package/dist/bin/crypto-lib.js.map +0 -1
  237. package/dist/index.js.map +0 -1
  238. package/dist/lib/decrypt.js.map +0 -1
  239. package/dist/lib/encrypt.js.map +0 -1
  240. package/dist/lib/generate.js.map +0 -1
  241. package/dist/lib/revoke.js.map +0 -1
  242. package/dist/package.json +0 -131
  243. package/dist/types/types.js.map +0 -1
@@ -0,0 +1,270 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.RFC10024_CODEPOINTS = exports.RFC10024_SECP256R1_MLKEM768 = exports.RFC10024_X25519_MLKEM768 = void 0;
4
+ exports.normalizeHybridKemAlgorithm = normalizeHybridKemAlgorithm;
5
+ exports.mlKemKeygen = mlKemKeygen;
6
+ exports.mlKemEncapsulate = mlKemEncapsulate;
7
+ exports.mlKemDecapsulate = mlKemDecapsulate;
8
+ exports.hybridKemKeygen = hybridKemKeygen;
9
+ exports.hybridKemEncapsulate = hybridKemEncapsulate;
10
+ exports.hybridKemDecapsulate = hybridKemDecapsulate;
11
+ exports.p256MlKemKeygen = p256MlKemKeygen;
12
+ exports.p256MlKemEncapsulate = p256MlKemEncapsulate;
13
+ exports.p256MlKemDecapsulate = p256MlKemDecapsulate;
14
+ exports.x448MlKemKeygen = x448MlKemKeygen;
15
+ exports.x448MlKemEncapsulate = x448MlKemEncapsulate;
16
+ exports.x448MlKemDecapsulate = x448MlKemDecapsulate;
17
+ const ml_kem_js_1 = require("@noble/post-quantum/ml-kem.js");
18
+ const ed25519_js_1 = require("@noble/curves/ed25519.js");
19
+ const ed448_js_1 = require("@noble/curves/ed448.js");
20
+ const nist_js_1 = require("@noble/curves/nist.js");
21
+ const hkdf_js_1 = require("@noble/hashes/hkdf.js");
22
+ const sha2_js_1 = require("@noble/hashes/sha2.js");
23
+ const utils_js_1 = require("@noble/ciphers/utils.js");
24
+ exports.RFC10024_X25519_MLKEM768 = "X25519MLKEM768";
25
+ exports.RFC10024_SECP256R1_MLKEM768 = "SecP256r1MLKEM768";
26
+ exports.RFC10024_CODEPOINTS = {
27
+ [exports.RFC10024_SECP256R1_MLKEM768]: 0x11eb,
28
+ [exports.RFC10024_X25519_MLKEM768]: 0x11ec,
29
+ };
30
+ function normalizeHybridKemAlgorithm(name) {
31
+ if (name === exports.RFC10024_X25519_MLKEM768 ||
32
+ name === exports.RFC10024_SECP256R1_MLKEM768) {
33
+ throw new Error(`${name} (RFC 10024 TLS group) is not implemented by this library; ` +
34
+ "its hybrid KEMs use a different combiner and do not interoperate");
35
+ }
36
+ return name;
37
+ }
38
+ const HEX_RE = /^[0-9a-fA-F]*$/;
39
+ function assertHex(input, label) {
40
+ if (!HEX_RE.test(input)) {
41
+ throw new Error(`Invalid hex string for ${label}`);
42
+ }
43
+ return Buffer.from(input, "hex");
44
+ }
45
+ function getKem(level) {
46
+ switch (level) {
47
+ case 512:
48
+ return ml_kem_js_1.ml_kem512;
49
+ case 768:
50
+ return ml_kem_js_1.ml_kem768;
51
+ case 1024:
52
+ return ml_kem_js_1.ml_kem1024;
53
+ default:
54
+ throw new Error(`Unsupported ML-KEM level: ${level}. Supported: 512, 768, 1024`);
55
+ }
56
+ }
57
+ function algorithmName(level) {
58
+ return `ml-kem-${level}`;
59
+ }
60
+ function lengthPrefixed(bytes) {
61
+ const out = new Uint8Array(4 + bytes.length);
62
+ new DataView(out.buffer).setUint32(0, bytes.length, false);
63
+ out.set(bytes, 4);
64
+ return out;
65
+ }
66
+ function combineHybrid(t) {
67
+ const ikm = Buffer.concat([t.ssClassical, t.ssMlKem]);
68
+ const info = Buffer.concat([
69
+ lengthPrefixed(Buffer.from(`crypto-service/hybrid-kem/v2/${t.algorithm}`)),
70
+ lengthPrefixed(t.ctClassical),
71
+ lengthPrefixed(t.pkClassical),
72
+ lengthPrefixed(t.ctMlKem),
73
+ lengthPrefixed(t.pkMlKem),
74
+ ]);
75
+ return (0, hkdf_js_1.hkdf)(sha2_js_1.sha256, ikm, undefined, info, 32);
76
+ }
77
+ function toHex(bytes) {
78
+ return Buffer.from(bytes).toString("hex");
79
+ }
80
+ function hybridAlgorithmName(level) {
81
+ return `x25519-ml-kem-${level}`;
82
+ }
83
+ function mlKemKeygen(level) {
84
+ const kem = getKem(level);
85
+ const { publicKey, secretKey } = kem.keygen();
86
+ return {
87
+ publicKey: Buffer.from(publicKey).toString("hex"),
88
+ secretKey: Buffer.from(secretKey).toString("hex"),
89
+ algorithm: algorithmName(level),
90
+ };
91
+ }
92
+ function mlKemEncapsulate(level, publicKeyHex) {
93
+ const kem = getKem(level);
94
+ const publicKey = assertHex(publicKeyHex, "publicKey");
95
+ const { cipherText, sharedSecret } = kem.encapsulate(publicKey);
96
+ return {
97
+ ciphertext: Buffer.from(cipherText).toString("hex"),
98
+ sharedSecret: Buffer.from(sharedSecret).toString("hex"),
99
+ algorithm: algorithmName(level),
100
+ };
101
+ }
102
+ function mlKemDecapsulate(level, secretKeyHex, ciphertextHex) {
103
+ const kem = getKem(level);
104
+ const secretKey = assertHex(secretKeyHex, "secretKey");
105
+ const cipherText = assertHex(ciphertextHex, "ciphertext");
106
+ const sharedSecret = kem.decapsulate(cipherText, secretKey);
107
+ return {
108
+ sharedSecret: Buffer.from(sharedSecret).toString("hex"),
109
+ algorithm: algorithmName(level),
110
+ };
111
+ }
112
+ function hybridKemKeygen(kemLevel = 768) {
113
+ const kem = getKem(kemLevel);
114
+ const x25519Priv = (0, utils_js_1.randomBytes)(32);
115
+ const x25519Pub = ed25519_js_1.x25519.getPublicKey(x25519Priv);
116
+ const { publicKey: mlKemPub, secretKey: mlKemSec } = kem.keygen();
117
+ return {
118
+ x25519PrivateKey: Buffer.from(x25519Priv).toString("hex"),
119
+ x25519PublicKey: Buffer.from(x25519Pub).toString("hex"),
120
+ mlKemPublicKey: Buffer.from(mlKemPub).toString("hex"),
121
+ mlKemSecretKey: Buffer.from(mlKemSec).toString("hex"),
122
+ algorithm: hybridAlgorithmName(kemLevel),
123
+ };
124
+ }
125
+ function hybridKemEncapsulate(kemLevel, theirX25519Public, theirMlKemPublic) {
126
+ const kem = getKem(kemLevel);
127
+ const pkClassical = assertHex(theirX25519Public, "theirX25519Public");
128
+ const pkMlKem = assertHex(theirMlKemPublic, "theirMlKemPublic");
129
+ const ephemeralPriv = (0, utils_js_1.randomBytes)(32);
130
+ const ephemeralPub = ed25519_js_1.x25519.getPublicKey(ephemeralPriv);
131
+ const ssClassical = ed25519_js_1.x25519.getSharedSecret(ephemeralPriv, pkClassical);
132
+ const { cipherText, sharedSecret: ssMlKem } = kem.encapsulate(pkMlKem);
133
+ const algorithm = hybridAlgorithmName(kemLevel);
134
+ const derived = combineHybrid({
135
+ algorithm,
136
+ ssClassical,
137
+ ssMlKem,
138
+ ctClassical: ephemeralPub,
139
+ pkClassical,
140
+ ctMlKem: cipherText,
141
+ pkMlKem,
142
+ });
143
+ return {
144
+ x25519EphemeralPublic: toHex(ephemeralPub),
145
+ mlKemCiphertext: toHex(cipherText),
146
+ sharedSecret: toHex(derived),
147
+ algorithm,
148
+ };
149
+ }
150
+ function hybridKemDecapsulate(kemLevel, ourX25519Private, ourMlKemSecret, theirX25519Ephemeral, mlKemCiphertext) {
151
+ const kem = getKem(kemLevel);
152
+ const priv = assertHex(ourX25519Private, "ourX25519Private");
153
+ const ctClassical = assertHex(theirX25519Ephemeral, "theirX25519Ephemeral");
154
+ const ctMlKem = assertHex(mlKemCiphertext, "mlKemCiphertext");
155
+ const mlKemSecret = assertHex(ourMlKemSecret, "ourMlKemSecret");
156
+ const algorithm = hybridAlgorithmName(kemLevel);
157
+ const derived = combineHybrid({
158
+ algorithm,
159
+ ssClassical: ed25519_js_1.x25519.getSharedSecret(priv, ctClassical),
160
+ ssMlKem: kem.decapsulate(ctMlKem, mlKemSecret),
161
+ ctClassical,
162
+ pkClassical: ed25519_js_1.x25519.getPublicKey(priv),
163
+ ctMlKem,
164
+ pkMlKem: kem.getPublicKey(mlKemSecret),
165
+ });
166
+ return { sharedSecret: toHex(derived), algorithm };
167
+ }
168
+ function p256MlKemKeygen() {
169
+ const p256Priv = nist_js_1.p256.utils.randomSecretKey();
170
+ const p256Pub = nist_js_1.p256.getPublicKey(p256Priv, false);
171
+ const { publicKey: mlKemPub, secretKey: mlKemSec } = ml_kem_js_1.ml_kem768.keygen();
172
+ return {
173
+ p256PrivateKey: Buffer.from(p256Priv).toString("hex"),
174
+ p256PublicKey: Buffer.from(p256Pub).toString("hex"),
175
+ mlKemPublicKey: Buffer.from(mlKemPub).toString("hex"),
176
+ mlKemSecretKey: Buffer.from(mlKemSec).toString("hex"),
177
+ algorithm: "p256-ml-kem-768",
178
+ };
179
+ }
180
+ function p256MlKemEncapsulate(theirP256Public, theirMlKemPublic) {
181
+ const pkClassical = nist_js_1.p256.Point.fromBytes(assertHex(theirP256Public, "theirP256Public")).toBytes(false);
182
+ const pkMlKem = assertHex(theirMlKemPublic, "theirMlKemPublic");
183
+ const ephemeralPriv = nist_js_1.p256.utils.randomSecretKey();
184
+ const ephemeralPub = nist_js_1.p256.getPublicKey(ephemeralPriv, false);
185
+ const ssClassical = nist_js_1.p256.getSharedSecret(ephemeralPriv, pkClassical);
186
+ const { cipherText, sharedSecret: ssMlKem } = ml_kem_js_1.ml_kem768.encapsulate(pkMlKem);
187
+ const derived = combineHybrid({
188
+ algorithm: "p256-ml-kem-768",
189
+ ssClassical,
190
+ ssMlKem,
191
+ ctClassical: ephemeralPub,
192
+ pkClassical,
193
+ ctMlKem: cipherText,
194
+ pkMlKem,
195
+ });
196
+ return {
197
+ p256EphemeralPublic: toHex(ephemeralPub),
198
+ mlKemCiphertext: toHex(cipherText),
199
+ sharedSecret: toHex(derived),
200
+ algorithm: "p256-ml-kem-768",
201
+ };
202
+ }
203
+ function p256MlKemDecapsulate(ourP256Private, ourMlKemSecret, theirP256Ephemeral, mlKemCiphertext) {
204
+ const priv = assertHex(ourP256Private, "ourP256Private");
205
+ const ctClassical = assertHex(theirP256Ephemeral, "theirP256Ephemeral");
206
+ const ctMlKem = assertHex(mlKemCiphertext, "mlKemCiphertext");
207
+ const mlKemSecret = assertHex(ourMlKemSecret, "ourMlKemSecret");
208
+ const derived = combineHybrid({
209
+ algorithm: "p256-ml-kem-768",
210
+ ssClassical: nist_js_1.p256.getSharedSecret(priv, ctClassical),
211
+ ssMlKem: ml_kem_js_1.ml_kem768.decapsulate(ctMlKem, mlKemSecret),
212
+ ctClassical,
213
+ pkClassical: nist_js_1.p256.getPublicKey(priv, false),
214
+ ctMlKem,
215
+ pkMlKem: ml_kem_js_1.ml_kem768.getPublicKey(mlKemSecret),
216
+ });
217
+ return { sharedSecret: toHex(derived), algorithm: "p256-ml-kem-768" };
218
+ }
219
+ function x448MlKemKeygen() {
220
+ const x448Priv = ed448_js_1.x448.utils.randomSecretKey();
221
+ const x448Pub = ed448_js_1.x448.getPublicKey(x448Priv);
222
+ const { publicKey: mlKemPub, secretKey: mlKemSec } = ml_kem_js_1.ml_kem1024.keygen();
223
+ return {
224
+ x448PrivateKey: Buffer.from(x448Priv).toString("hex"),
225
+ x448PublicKey: Buffer.from(x448Pub).toString("hex"),
226
+ mlKemPublicKey: Buffer.from(mlKemPub).toString("hex"),
227
+ mlKemSecretKey: Buffer.from(mlKemSec).toString("hex"),
228
+ algorithm: "x448-ml-kem-1024",
229
+ };
230
+ }
231
+ function x448MlKemEncapsulate(theirX448Public, theirMlKemPublic) {
232
+ const pkClassical = assertHex(theirX448Public, "theirX448Public");
233
+ const pkMlKem = assertHex(theirMlKemPublic, "theirMlKemPublic");
234
+ const ephemeralPriv = ed448_js_1.x448.utils.randomSecretKey();
235
+ const ephemeralPub = ed448_js_1.x448.getPublicKey(ephemeralPriv);
236
+ const ssClassical = ed448_js_1.x448.getSharedSecret(ephemeralPriv, pkClassical);
237
+ const { cipherText, sharedSecret: ssMlKem } = ml_kem_js_1.ml_kem1024.encapsulate(pkMlKem);
238
+ const derived = combineHybrid({
239
+ algorithm: "x448-ml-kem-1024",
240
+ ssClassical,
241
+ ssMlKem,
242
+ ctClassical: ephemeralPub,
243
+ pkClassical,
244
+ ctMlKem: cipherText,
245
+ pkMlKem,
246
+ });
247
+ return {
248
+ x448EphemeralPublic: toHex(ephemeralPub),
249
+ mlKemCiphertext: toHex(cipherText),
250
+ sharedSecret: toHex(derived),
251
+ algorithm: "x448-ml-kem-1024",
252
+ };
253
+ }
254
+ function x448MlKemDecapsulate(ourX448Private, ourMlKemSecret, theirX448Ephemeral, mlKemCiphertext) {
255
+ const priv = assertHex(ourX448Private, "ourX448Private");
256
+ const ctClassical = assertHex(theirX448Ephemeral, "theirX448Ephemeral");
257
+ const ctMlKem = assertHex(mlKemCiphertext, "mlKemCiphertext");
258
+ const mlKemSecret = assertHex(ourMlKemSecret, "ourMlKemSecret");
259
+ const derived = combineHybrid({
260
+ algorithm: "x448-ml-kem-1024",
261
+ ssClassical: ed448_js_1.x448.getSharedSecret(priv, ctClassical),
262
+ ssMlKem: ml_kem_js_1.ml_kem1024.decapsulate(ctMlKem, mlKemSecret),
263
+ ctClassical,
264
+ pkClassical: ed448_js_1.x448.getPublicKey(priv),
265
+ ctMlKem,
266
+ pkMlKem: ml_kem_js_1.ml_kem1024.getPublicKey(mlKemSecret),
267
+ });
268
+ return { sharedSecret: toHex(derived), algorithm: "x448-ml-kem-1024" };
269
+ }
270
+ //# sourceMappingURL=pq-kem.js.map
@@ -0,0 +1,30 @@
1
+ export type MlDsaLevel = 44 | 65 | 87;
2
+ export type MlDsaAlgorithm = "ml-dsa-44" | "ml-dsa-65" | "ml-dsa-87";
3
+ export interface MlDsaKeyPairResult {
4
+ publicKey: string;
5
+ secretKey: string;
6
+ algorithm: MlDsaAlgorithm;
7
+ }
8
+ export interface MlDsaSignResult {
9
+ signature: string;
10
+ algorithm: MlDsaAlgorithm;
11
+ }
12
+ export interface MlDsaVerifyResult {
13
+ valid: boolean;
14
+ algorithm: MlDsaAlgorithm;
15
+ }
16
+ export interface HybridSignResult {
17
+ ed25519Signature: string;
18
+ mlDsaSignature: string;
19
+ algorithm: string;
20
+ }
21
+ export interface HybridVerifyResult {
22
+ valid: boolean;
23
+ algorithm: string;
24
+ }
25
+ export declare function mlDsaKeygen(level: MlDsaLevel): MlDsaKeyPairResult;
26
+ export declare function mlDsaSign(level: MlDsaLevel, secretKeyHex: string, message: string | Uint8Array): MlDsaSignResult;
27
+ export declare function mlDsaVerify(level: MlDsaLevel, publicKeyHex: string, message: string | Uint8Array, signatureHex: string): MlDsaVerifyResult;
28
+ export declare function hybridSign(secretKeyEd25519Hex: string, secretKeyMlDsaHex: string, message: string | Uint8Array, mlDsaLevel?: MlDsaLevel): HybridSignResult;
29
+ export declare function hybridVerify(pubKeyEd25519Hex: string, pubKeyMlDsaHex: string, message: string | Uint8Array, sigEd25519Hex: string, sigMlDsaHex: string, mlDsaLevel?: MlDsaLevel): HybridVerifyResult;
30
+ //# sourceMappingURL=pq-sign.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pq-sign.d.ts","sourceRoot":"","sources":["../../src/modern/pq-sign.ts"],"names":[],"mappings":"AAsBA,MAAM,MAAM,UAAU,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC;AAGtC,MAAM,MAAM,cAAc,GAAG,WAAW,GAAG,WAAW,GAAG,WAAW,CAAC;AAGrE,MAAM,WAAW,kBAAkB;IAEjC,SAAS,EAAE,MAAM,CAAC;IAElB,SAAS,EAAE,MAAM,CAAC;IAElB,SAAS,EAAE,cAAc,CAAC;CAC3B;AAGD,MAAM,WAAW,eAAe;IAE9B,SAAS,EAAE,MAAM,CAAC;IAElB,SAAS,EAAE,cAAc,CAAC;CAC3B;AAGD,MAAM,WAAW,iBAAiB;IAEhC,KAAK,EAAE,OAAO,CAAC;IAEf,SAAS,EAAE,cAAc,CAAC;CAC3B;AAGD,MAAM,WAAW,gBAAgB;IAE/B,gBAAgB,EAAE,MAAM,CAAC;IAEzB,cAAc,EAAE,MAAM,CAAC;IAEvB,SAAS,EAAE,MAAM,CAAC;CACnB;AAGD,MAAM,WAAW,kBAAkB;IAEjC,KAAK,EAAE,OAAO,CAAC;IAEf,SAAS,EAAE,MAAM,CAAC;CACnB;AA+CD,wBAAgB,WAAW,CAAC,KAAK,EAAE,UAAU,GAAG,kBAAkB,CAQjE;AAKD,wBAAgB,SAAS,CACvB,KAAK,EAAE,UAAU,EACjB,YAAY,EAAE,MAAM,EACpB,OAAO,EAAE,MAAM,GAAG,UAAU,GAC3B,eAAe,CASjB;AAKD,wBAAgB,WAAW,CACzB,KAAK,EAAE,UAAU,EACjB,YAAY,EAAE,MAAM,EACpB,OAAO,EAAE,MAAM,GAAG,UAAU,EAC5B,YAAY,EAAE,MAAM,GACnB,iBAAiB,CAUnB;AAYD,wBAAgB,UAAU,CACxB,mBAAmB,EAAE,MAAM,EAC3B,iBAAiB,EAAE,MAAM,EACzB,OAAO,EAAE,MAAM,GAAG,UAAU,EAC5B,UAAU,GAAE,UAAe,GAC1B,gBAAgB,CAclB;AAaD,wBAAgB,YAAY,CAC1B,gBAAgB,EAAE,MAAM,EACxB,cAAc,EAAE,MAAM,EACtB,OAAO,EAAE,MAAM,GAAG,UAAU,EAC5B,aAAa,EAAE,MAAM,EACrB,WAAW,EAAE,MAAM,EACnB,UAAU,GAAE,UAAe,GAC1B,kBAAkB,CAepB"}
@@ -0,0 +1,94 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.mlDsaKeygen = mlDsaKeygen;
4
+ exports.mlDsaSign = mlDsaSign;
5
+ exports.mlDsaVerify = mlDsaVerify;
6
+ exports.hybridSign = hybridSign;
7
+ exports.hybridVerify = hybridVerify;
8
+ const ml_dsa_js_1 = require("@noble/post-quantum/ml-dsa.js");
9
+ const ed25519_js_1 = require("@noble/curves/ed25519.js");
10
+ const HEX_RE = /^[0-9a-fA-F]*$/;
11
+ function assertHex(input, label) {
12
+ if (!HEX_RE.test(input)) {
13
+ throw new Error(`Invalid hex string for ${label}`);
14
+ }
15
+ return Buffer.from(input, "hex");
16
+ }
17
+ function toBytes(input) {
18
+ if (input instanceof Uint8Array)
19
+ return input;
20
+ return Buffer.from(input, "utf8");
21
+ }
22
+ function getDsa(level) {
23
+ switch (level) {
24
+ case 44:
25
+ return ml_dsa_js_1.ml_dsa44;
26
+ case 65:
27
+ return ml_dsa_js_1.ml_dsa65;
28
+ case 87:
29
+ return ml_dsa_js_1.ml_dsa87;
30
+ default:
31
+ throw new Error(`Unsupported ML-DSA level: ${level}. Supported: 44, 65, 87`);
32
+ }
33
+ }
34
+ function algorithmName(level) {
35
+ return `ml-dsa-${level}`;
36
+ }
37
+ function mlDsaKeygen(level) {
38
+ const dsa = getDsa(level);
39
+ const { publicKey, secretKey } = dsa.keygen();
40
+ return {
41
+ publicKey: Buffer.from(publicKey).toString("hex"),
42
+ secretKey: Buffer.from(secretKey).toString("hex"),
43
+ algorithm: algorithmName(level),
44
+ };
45
+ }
46
+ function mlDsaSign(level, secretKeyHex, message) {
47
+ const dsa = getDsa(level);
48
+ const secretKey = assertHex(secretKeyHex, "secretKey");
49
+ const msg = toBytes(message);
50
+ const signature = dsa.sign(msg, secretKey);
51
+ return {
52
+ signature: Buffer.from(signature).toString("hex"),
53
+ algorithm: algorithmName(level),
54
+ };
55
+ }
56
+ function mlDsaVerify(level, publicKeyHex, message, signatureHex) {
57
+ const dsa = getDsa(level);
58
+ const publicKey = assertHex(publicKeyHex, "publicKey");
59
+ const msg = toBytes(message);
60
+ const signature = assertHex(signatureHex, "signature");
61
+ const valid = dsa.verify(signature, msg, publicKey);
62
+ return {
63
+ valid,
64
+ algorithm: algorithmName(level),
65
+ };
66
+ }
67
+ function hybridSign(secretKeyEd25519Hex, secretKeyMlDsaHex, message, mlDsaLevel = 65) {
68
+ const dsa = getDsa(mlDsaLevel);
69
+ const ed25519Key = assertHex(secretKeyEd25519Hex, "secretKeyEd25519");
70
+ const mlDsaKey = assertHex(secretKeyMlDsaHex, "secretKeyMlDsa");
71
+ const msg = toBytes(message);
72
+ const ed25519Sig = ed25519_js_1.ed25519.sign(msg, ed25519Key);
73
+ const mlDsaSig = dsa.sign(msg, mlDsaKey);
74
+ return {
75
+ ed25519Signature: Buffer.from(ed25519Sig).toString("hex"),
76
+ mlDsaSignature: Buffer.from(mlDsaSig).toString("hex"),
77
+ algorithm: `ed25519-ml-dsa-${mlDsaLevel}`,
78
+ };
79
+ }
80
+ function hybridVerify(pubKeyEd25519Hex, pubKeyMlDsaHex, message, sigEd25519Hex, sigMlDsaHex, mlDsaLevel = 65) {
81
+ const dsa = getDsa(mlDsaLevel);
82
+ const ed25519Pub = assertHex(pubKeyEd25519Hex, "pubKeyEd25519");
83
+ const mlDsaPub = assertHex(pubKeyMlDsaHex, "pubKeyMlDsa");
84
+ const msg = toBytes(message);
85
+ const ed25519Sig = assertHex(sigEd25519Hex, "sigEd25519");
86
+ const mlDsaSig = assertHex(sigMlDsaHex, "sigMlDsa");
87
+ const ed25519Valid = ed25519_js_1.ed25519.verify(ed25519Sig, msg, ed25519Pub);
88
+ const mlDsaValid = dsa.verify(mlDsaSig, msg, mlDsaPub);
89
+ return {
90
+ valid: ed25519Valid && mlDsaValid,
91
+ algorithm: `ed25519-ml-dsa-${mlDsaLevel}`,
92
+ };
93
+ }
94
+ //# sourceMappingURL=pq-sign.js.map
@@ -0,0 +1,38 @@
1
+ export interface MlKemKeyPair {
2
+ publicKey: string;
3
+ secretKey: string;
4
+ algorithm: "ml-kem-768";
5
+ }
6
+ export interface MlKemEncapsulateResult {
7
+ ciphertext: string;
8
+ sharedSecret: string;
9
+ algorithm: "ml-kem-768";
10
+ }
11
+ export interface MlKemDecapsulateResult {
12
+ sharedSecret: string;
13
+ algorithm: "ml-kem-768";
14
+ }
15
+ export declare function mlKemGenerateKeyPair(): MlKemKeyPair;
16
+ export declare function mlKemEncapsulate(publicKeyHex: string): MlKemEncapsulateResult;
17
+ export declare function mlKemDecapsulate(secretKeyHex: string, ciphertextHex: string): MlKemDecapsulateResult;
18
+ export interface HybridKeyPair {
19
+ x25519PrivateKey: string;
20
+ x25519PublicKey: string;
21
+ mlKemPublicKey: string;
22
+ mlKemSecretKey: string;
23
+ algorithm: "x25519-ml-kem-768";
24
+ }
25
+ export interface HybridEncapsulateResult {
26
+ x25519EphemeralPublic: string;
27
+ mlKemCiphertext: string;
28
+ sharedSecret: string;
29
+ algorithm: "x25519-ml-kem-768";
30
+ }
31
+ export interface HybridDecapsulateResult {
32
+ sharedSecret: string;
33
+ algorithm: "x25519-ml-kem-768";
34
+ }
35
+ export declare function hybridGenerateKeyPair(): HybridKeyPair;
36
+ export declare function hybridEncapsulate(theirX25519Public: string, theirMlKemPublic: string): HybridEncapsulateResult;
37
+ export declare function hybridDecapsulate(ourX25519Private: string, ourMlKemSecret: string, theirX25519Ephemeral: string, mlKemCiphertext: string): HybridDecapsulateResult;
38
+ //# sourceMappingURL=pq.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pq.d.ts","sourceRoot":"","sources":["../../src/modern/pq.ts"],"names":[],"mappings":"AA2BA,MAAM,WAAW,YAAY;IAE3B,SAAS,EAAE,MAAM,CAAC;IAElB,SAAS,EAAE,MAAM,CAAC;IAElB,SAAS,EAAE,YAAY,CAAC;CACzB;AAGD,MAAM,WAAW,sBAAsB;IAErC,UAAU,EAAE,MAAM,CAAC;IAEnB,YAAY,EAAE,MAAM,CAAC;IAErB,SAAS,EAAE,YAAY,CAAC;CACzB;AAGD,MAAM,WAAW,sBAAsB;IAErC,YAAY,EAAE,MAAM,CAAC;IAErB,SAAS,EAAE,YAAY,CAAC;CACzB;AAKD,wBAAgB,oBAAoB,IAAI,YAAY,CAOnD;AAKD,wBAAgB,gBAAgB,CAAC,YAAY,EAAE,MAAM,GAAG,sBAAsB,CAQ7E;AAKD,wBAAgB,gBAAgB,CAC9B,YAAY,EAAE,MAAM,EACpB,aAAa,EAAE,MAAM,GACpB,sBAAsB,CAQxB;AAKD,MAAM,WAAW,aAAa;IAE5B,gBAAgB,EAAE,MAAM,CAAC;IAEzB,eAAe,EAAE,MAAM,CAAC;IAExB,cAAc,EAAE,MAAM,CAAC;IAEvB,cAAc,EAAE,MAAM,CAAC;IAEvB,SAAS,EAAE,mBAAmB,CAAC;CAChC;AAGD,MAAM,WAAW,uBAAuB;IAEtC,qBAAqB,EAAE,MAAM,CAAC;IAE9B,eAAe,EAAE,MAAM,CAAC;IAExB,YAAY,EAAE,MAAM,CAAC;IAErB,SAAS,EAAE,mBAAmB,CAAC;CAChC;AAGD,MAAM,WAAW,uBAAuB;IAEtC,YAAY,EAAE,MAAM,CAAC;IAErB,SAAS,EAAE,mBAAmB,CAAC;CAChC;AAKD,wBAAgB,qBAAqB,IAAI,aAAa,CAYrD;AASD,wBAAgB,iBAAiB,CAC/B,iBAAiB,EAAE,MAAM,EACzB,gBAAgB,EAAE,MAAM,GACvB,uBAAuB,CAiCzB;AAWD,wBAAgB,iBAAiB,CAC/B,gBAAgB,EAAE,MAAM,EACxB,cAAc,EAAE,MAAM,EACtB,oBAAoB,EAAE,MAAM,EAC5B,eAAe,EAAE,MAAM,GACtB,uBAAuB,CA8BzB"}
@@ -0,0 +1,80 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.mlKemGenerateKeyPair = mlKemGenerateKeyPair;
4
+ exports.mlKemEncapsulate = mlKemEncapsulate;
5
+ exports.mlKemDecapsulate = mlKemDecapsulate;
6
+ exports.hybridGenerateKeyPair = hybridGenerateKeyPair;
7
+ exports.hybridEncapsulate = hybridEncapsulate;
8
+ exports.hybridDecapsulate = hybridDecapsulate;
9
+ const ml_kem_js_1 = require("@noble/post-quantum/ml-kem.js");
10
+ const ed25519_js_1 = require("@noble/curves/ed25519.js");
11
+ const hkdf_js_1 = require("@noble/hashes/hkdf.js");
12
+ const sha2_js_1 = require("@noble/hashes/sha2.js");
13
+ const utils_js_1 = require("@noble/ciphers/utils.js");
14
+ function mlKemGenerateKeyPair() {
15
+ const { publicKey, secretKey } = ml_kem_js_1.ml_kem768.keygen();
16
+ return {
17
+ publicKey: Buffer.from(publicKey).toString("hex"),
18
+ secretKey: Buffer.from(secretKey).toString("hex"),
19
+ algorithm: "ml-kem-768",
20
+ };
21
+ }
22
+ function mlKemEncapsulate(publicKeyHex) {
23
+ const publicKey = Buffer.from(publicKeyHex, "hex");
24
+ const { cipherText, sharedSecret } = ml_kem_js_1.ml_kem768.encapsulate(publicKey);
25
+ return {
26
+ ciphertext: Buffer.from(cipherText).toString("hex"),
27
+ sharedSecret: Buffer.from(sharedSecret).toString("hex"),
28
+ algorithm: "ml-kem-768",
29
+ };
30
+ }
31
+ function mlKemDecapsulate(secretKeyHex, ciphertextHex) {
32
+ const secretKey = Buffer.from(secretKeyHex, "hex");
33
+ const cipherText = Buffer.from(ciphertextHex, "hex");
34
+ const sharedSecret = ml_kem_js_1.ml_kem768.decapsulate(cipherText, secretKey);
35
+ return {
36
+ sharedSecret: Buffer.from(sharedSecret).toString("hex"),
37
+ algorithm: "ml-kem-768",
38
+ };
39
+ }
40
+ function hybridGenerateKeyPair() {
41
+ const x25519Priv = (0, utils_js_1.randomBytes)(32);
42
+ const x25519Pub = ed25519_js_1.x25519.getPublicKey(x25519Priv);
43
+ const { publicKey: mlKemPub, secretKey: mlKemSec } = ml_kem_js_1.ml_kem768.keygen();
44
+ return {
45
+ x25519PrivateKey: Buffer.from(x25519Priv).toString("hex"),
46
+ x25519PublicKey: Buffer.from(x25519Pub).toString("hex"),
47
+ mlKemPublicKey: Buffer.from(mlKemPub).toString("hex"),
48
+ mlKemSecretKey: Buffer.from(mlKemSec).toString("hex"),
49
+ algorithm: "x25519-ml-kem-768",
50
+ };
51
+ }
52
+ function hybridEncapsulate(theirX25519Public, theirMlKemPublic) {
53
+ const ephemeralPriv = (0, utils_js_1.randomBytes)(32);
54
+ const ephemeralPub = ed25519_js_1.x25519.getPublicKey(ephemeralPriv);
55
+ const x25519Shared = ed25519_js_1.x25519.getSharedSecret(ephemeralPriv, Buffer.from(theirX25519Public, "hex"));
56
+ const { cipherText, sharedSecret: mlKemShared } = ml_kem_js_1.ml_kem768.encapsulate(Buffer.from(theirMlKemPublic, "hex"));
57
+ const combined = new Uint8Array(x25519Shared.length + mlKemShared.length);
58
+ combined.set(x25519Shared);
59
+ combined.set(mlKemShared, x25519Shared.length);
60
+ const derivedSecret = (0, hkdf_js_1.hkdf)(sha2_js_1.sha256, combined, undefined, new TextEncoder().encode("x25519-ml-kem-768-hybrid"), 32);
61
+ return {
62
+ x25519EphemeralPublic: Buffer.from(ephemeralPub).toString("hex"),
63
+ mlKemCiphertext: Buffer.from(cipherText).toString("hex"),
64
+ sharedSecret: Buffer.from(derivedSecret).toString("hex"),
65
+ algorithm: "x25519-ml-kem-768",
66
+ };
67
+ }
68
+ function hybridDecapsulate(ourX25519Private, ourMlKemSecret, theirX25519Ephemeral, mlKemCiphertext) {
69
+ const x25519Shared = ed25519_js_1.x25519.getSharedSecret(Buffer.from(ourX25519Private, "hex"), Buffer.from(theirX25519Ephemeral, "hex"));
70
+ const mlKemShared = ml_kem_js_1.ml_kem768.decapsulate(Buffer.from(mlKemCiphertext, "hex"), Buffer.from(ourMlKemSecret, "hex"));
71
+ const combined = new Uint8Array(x25519Shared.length + mlKemShared.length);
72
+ combined.set(x25519Shared);
73
+ combined.set(mlKemShared, x25519Shared.length);
74
+ const derivedSecret = (0, hkdf_js_1.hkdf)(sha2_js_1.sha256, combined, undefined, new TextEncoder().encode("x25519-ml-kem-768-hybrid"), 32);
75
+ return {
76
+ sharedSecret: Buffer.from(derivedSecret).toString("hex"),
77
+ algorithm: "x25519-ml-kem-768",
78
+ };
79
+ }
80
+ //# sourceMappingURL=pq.js.map
@@ -0,0 +1,16 @@
1
+ export interface Ed25519KeyPair {
2
+ privateKey: string;
3
+ publicKey: string;
4
+ }
5
+ export interface SignResult {
6
+ signature: string;
7
+ algorithm: "ed25519";
8
+ }
9
+ export interface VerifyResult {
10
+ valid: boolean;
11
+ algorithm: "ed25519";
12
+ }
13
+ export declare function generateEd25519KeyPair(): Ed25519KeyPair;
14
+ export declare function ed25519Sign(privateKey: string | Uint8Array, message: string | Uint8Array): SignResult;
15
+ export declare function ed25519Verify(publicKey: string | Uint8Array, message: string | Uint8Array, signature: string | Uint8Array): VerifyResult;
16
+ //# sourceMappingURL=signing.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"signing.d.ts","sourceRoot":"","sources":["../../src/modern/signing.ts"],"names":[],"mappings":"AAmBA,MAAM,WAAW,cAAc;IAE7B,UAAU,EAAE,MAAM,CAAC;IAEnB,SAAS,EAAE,MAAM,CAAC;CACnB;AAGD,MAAM,WAAW,UAAU;IAEzB,SAAS,EAAE,MAAM,CAAC;IAElB,SAAS,EAAE,SAAS,CAAC;CACtB;AAGD,MAAM,WAAW,YAAY;IAE3B,KAAK,EAAE,OAAO,CAAC;IAEf,SAAS,EAAE,SAAS,CAAC;CACtB;AAKD,wBAAgB,sBAAsB,IAAI,cAAc,CAQvD;AAKD,wBAAgB,WAAW,CACzB,UAAU,EAAE,MAAM,GAAG,UAAU,EAC/B,OAAO,EAAE,MAAM,GAAG,UAAU,GAC3B,UAAU,CAcZ;AAKD,wBAAgB,aAAa,CAC3B,SAAS,EAAE,MAAM,GAAG,UAAU,EAC9B,OAAO,EAAE,MAAM,GAAG,UAAU,EAC5B,SAAS,EAAE,MAAM,GAAG,UAAU,GAC7B,YAAY,CAWd"}
@@ -0,0 +1,34 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.generateEd25519KeyPair = generateEd25519KeyPair;
4
+ exports.ed25519Sign = ed25519Sign;
5
+ exports.ed25519Verify = ed25519Verify;
6
+ const ed25519_js_1 = require("@noble/curves/ed25519.js");
7
+ const utils_js_1 = require("@noble/ciphers/utils.js");
8
+ function generateEd25519KeyPair() {
9
+ const privateKey = (0, utils_js_1.randomBytes)(32);
10
+ const publicKey = ed25519_js_1.ed25519.getPublicKey(privateKey);
11
+ return {
12
+ privateKey: Buffer.from(privateKey).toString("hex"),
13
+ publicKey: Buffer.from(publicKey).toString("hex"),
14
+ };
15
+ }
16
+ function ed25519Sign(privateKey, message) {
17
+ const key = typeof privateKey === "string"
18
+ ? Buffer.from(privateKey, "hex")
19
+ : privateKey;
20
+ const msg = typeof message === "string" ? Buffer.from(message, "utf8") : message;
21
+ const signature = ed25519_js_1.ed25519.sign(msg, key);
22
+ return {
23
+ signature: Buffer.from(signature).toString("hex"),
24
+ algorithm: "ed25519",
25
+ };
26
+ }
27
+ function ed25519Verify(publicKey, message, signature) {
28
+ const key = typeof publicKey === "string" ? Buffer.from(publicKey, "hex") : publicKey;
29
+ const msg = typeof message === "string" ? Buffer.from(message, "utf8") : message;
30
+ const sig = typeof signature === "string" ? Buffer.from(signature, "hex") : signature;
31
+ const valid = ed25519_js_1.ed25519.verify(sig, msg, key);
32
+ return { valid, algorithm: "ed25519" };
33
+ }
34
+ //# sourceMappingURL=signing.js.map
@@ -0,0 +1,7 @@
1
+ export * as pqxdh from "./pqxdh";
2
+ export * as ratchet from "./ratchet";
3
+ export * as pake from "./pake";
4
+ export * as threshold from "./threshold";
5
+ export * as iso20022 from "./iso20022";
6
+ export * from "./iso20022";
7
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/protocols/index.ts"],"names":[],"mappings":"AAeA,OAAO,KAAK,KAAK,MAAM,SAAS,CAAC;AACjC,OAAO,KAAK,OAAO,MAAM,WAAW,CAAC;AACrC,OAAO,KAAK,IAAI,MAAM,QAAQ,CAAC;AAC/B,OAAO,KAAK,SAAS,MAAM,aAAa,CAAC;AACzC,OAAO,KAAK,QAAQ,MAAM,YAAY,CAAC;AACvC,cAAc,YAAY,CAAC"}
@@ -0,0 +1,46 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
36
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
37
+ };
38
+ Object.defineProperty(exports, "__esModule", { value: true });
39
+ exports.iso20022 = exports.threshold = exports.pake = exports.ratchet = exports.pqxdh = void 0;
40
+ exports.pqxdh = __importStar(require("./pqxdh"));
41
+ exports.ratchet = __importStar(require("./ratchet"));
42
+ exports.pake = __importStar(require("./pake"));
43
+ exports.threshold = __importStar(require("./threshold"));
44
+ exports.iso20022 = __importStar(require("./iso20022"));
45
+ __exportStar(require("./iso20022"), exports);
46
+ //# sourceMappingURL=index.js.map