@oqs/liboqs-js 0.15.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 (317) hide show
  1. package/LICENSE.md +50 -0
  2. package/README.md +829 -0
  3. package/bin/cli.js +16 -0
  4. package/dist/classic-mceliece-348864.deno.js +0 -0
  5. package/dist/classic-mceliece-348864.min.js +0 -0
  6. package/dist/classic-mceliece-348864f.deno.js +0 -0
  7. package/dist/classic-mceliece-348864f.min.js +0 -0
  8. package/dist/classic-mceliece-460896.deno.js +0 -0
  9. package/dist/classic-mceliece-460896.min.js +0 -0
  10. package/dist/classic-mceliece-460896f.deno.js +0 -0
  11. package/dist/classic-mceliece-460896f.min.js +0 -0
  12. package/dist/classic-mceliece-6688128.deno.js +0 -0
  13. package/dist/classic-mceliece-6688128.min.js +0 -0
  14. package/dist/classic-mceliece-6688128f.deno.js +0 -0
  15. package/dist/classic-mceliece-6688128f.min.js +0 -0
  16. package/dist/classic-mceliece-6960119.deno.js +0 -0
  17. package/dist/classic-mceliece-6960119.min.js +0 -0
  18. package/dist/classic-mceliece-6960119f.deno.js +0 -0
  19. package/dist/classic-mceliece-6960119f.min.js +0 -0
  20. package/dist/classic-mceliece-8192128.deno.js +0 -0
  21. package/dist/classic-mceliece-8192128.min.js +0 -0
  22. package/dist/classic-mceliece-8192128f.deno.js +0 -0
  23. package/dist/classic-mceliece-8192128f.min.js +0 -0
  24. package/dist/cross-rsdp-128-balanced.deno.js +0 -0
  25. package/dist/cross-rsdp-128-balanced.min.js +0 -0
  26. package/dist/cross-rsdp-128-fast.deno.js +0 -0
  27. package/dist/cross-rsdp-128-fast.min.js +0 -0
  28. package/dist/cross-rsdp-128-small.deno.js +0 -0
  29. package/dist/cross-rsdp-128-small.min.js +0 -0
  30. package/dist/cross-rsdp-192-balanced.deno.js +0 -0
  31. package/dist/cross-rsdp-192-balanced.min.js +0 -0
  32. package/dist/cross-rsdp-192-fast.deno.js +0 -0
  33. package/dist/cross-rsdp-192-fast.min.js +0 -0
  34. package/dist/cross-rsdp-192-small.deno.js +0 -0
  35. package/dist/cross-rsdp-192-small.min.js +0 -0
  36. package/dist/cross-rsdp-256-balanced.deno.js +0 -0
  37. package/dist/cross-rsdp-256-balanced.min.js +0 -0
  38. package/dist/cross-rsdp-256-fast.deno.js +0 -0
  39. package/dist/cross-rsdp-256-fast.min.js +0 -0
  40. package/dist/cross-rsdp-256-small.deno.js +0 -0
  41. package/dist/cross-rsdp-256-small.min.js +0 -0
  42. package/dist/cross-rsdpg-128-balanced.deno.js +0 -0
  43. package/dist/cross-rsdpg-128-balanced.min.js +0 -0
  44. package/dist/cross-rsdpg-128-fast.deno.js +0 -0
  45. package/dist/cross-rsdpg-128-fast.min.js +0 -0
  46. package/dist/cross-rsdpg-128-small.deno.js +0 -0
  47. package/dist/cross-rsdpg-128-small.min.js +0 -0
  48. package/dist/cross-rsdpg-192-balanced.deno.js +0 -0
  49. package/dist/cross-rsdpg-192-balanced.min.js +0 -0
  50. package/dist/cross-rsdpg-192-fast.deno.js +0 -0
  51. package/dist/cross-rsdpg-192-fast.min.js +0 -0
  52. package/dist/cross-rsdpg-192-small.deno.js +0 -0
  53. package/dist/cross-rsdpg-192-small.min.js +0 -0
  54. package/dist/cross-rsdpg-256-balanced.deno.js +0 -0
  55. package/dist/cross-rsdpg-256-balanced.min.js +0 -0
  56. package/dist/cross-rsdpg-256-fast.deno.js +0 -0
  57. package/dist/cross-rsdpg-256-fast.min.js +0 -0
  58. package/dist/cross-rsdpg-256-small.deno.js +0 -0
  59. package/dist/cross-rsdpg-256-small.min.js +0 -0
  60. package/dist/falcon-1024.deno.js +0 -0
  61. package/dist/falcon-1024.min.js +0 -0
  62. package/dist/falcon-512.deno.js +0 -0
  63. package/dist/falcon-512.min.js +0 -0
  64. package/dist/falcon-padded-1024.deno.js +0 -0
  65. package/dist/falcon-padded-1024.min.js +0 -0
  66. package/dist/falcon-padded-512.deno.js +0 -0
  67. package/dist/falcon-padded-512.min.js +0 -0
  68. package/dist/frodokem-1344-aes.deno.js +0 -0
  69. package/dist/frodokem-1344-aes.min.js +0 -0
  70. package/dist/frodokem-1344-shake.deno.js +0 -0
  71. package/dist/frodokem-1344-shake.min.js +0 -0
  72. package/dist/frodokem-640-aes.deno.js +0 -0
  73. package/dist/frodokem-640-aes.min.js +0 -0
  74. package/dist/frodokem-640-shake.deno.js +0 -0
  75. package/dist/frodokem-640-shake.min.js +0 -0
  76. package/dist/frodokem-976-aes.deno.js +0 -0
  77. package/dist/frodokem-976-aes.min.js +0 -0
  78. package/dist/frodokem-976-shake.deno.js +0 -0
  79. package/dist/frodokem-976-shake.min.js +0 -0
  80. package/dist/hqc-128.deno.js +0 -0
  81. package/dist/hqc-128.min.js +0 -0
  82. package/dist/hqc-192.deno.js +0 -0
  83. package/dist/hqc-192.min.js +0 -0
  84. package/dist/hqc-256.deno.js +0 -0
  85. package/dist/hqc-256.min.js +0 -0
  86. package/dist/kyber-1024.deno.js +0 -0
  87. package/dist/kyber-1024.min.js +0 -0
  88. package/dist/kyber-512.deno.js +0 -0
  89. package/dist/kyber-512.min.js +0 -0
  90. package/dist/kyber-768.deno.js +0 -0
  91. package/dist/kyber-768.min.js +0 -0
  92. package/dist/mayo-1.deno.js +0 -0
  93. package/dist/mayo-1.min.js +0 -0
  94. package/dist/mayo-2.deno.js +0 -0
  95. package/dist/mayo-2.min.js +0 -0
  96. package/dist/mayo-3.deno.js +0 -0
  97. package/dist/mayo-3.min.js +0 -0
  98. package/dist/mayo-5.deno.js +0 -0
  99. package/dist/mayo-5.min.js +0 -0
  100. package/dist/ml-dsa-44.deno.js +0 -0
  101. package/dist/ml-dsa-44.min.js +0 -0
  102. package/dist/ml-dsa-65.deno.js +0 -0
  103. package/dist/ml-dsa-65.min.js +0 -0
  104. package/dist/ml-dsa-87.deno.js +0 -0
  105. package/dist/ml-dsa-87.min.js +0 -0
  106. package/dist/ml-kem-1024.deno.js +0 -0
  107. package/dist/ml-kem-1024.min.js +0 -0
  108. package/dist/ml-kem-512.deno.js +0 -0
  109. package/dist/ml-kem-512.min.js +0 -0
  110. package/dist/ml-kem-768.deno.js +0 -0
  111. package/dist/ml-kem-768.min.js +0 -0
  112. package/dist/ntru-hps-2048-509.deno.js +0 -0
  113. package/dist/ntru-hps-2048-509.min.js +0 -0
  114. package/dist/ntru-hps-2048-677.deno.js +0 -0
  115. package/dist/ntru-hps-2048-677.min.js +0 -0
  116. package/dist/ntru-hps-4096-1229.deno.js +0 -0
  117. package/dist/ntru-hps-4096-1229.min.js +0 -0
  118. package/dist/ntru-hps-4096-821.deno.js +0 -0
  119. package/dist/ntru-hps-4096-821.min.js +0 -0
  120. package/dist/ntru-hrss-1373.deno.js +0 -0
  121. package/dist/ntru-hrss-1373.min.js +0 -0
  122. package/dist/ntru-hrss-701.deno.js +0 -0
  123. package/dist/ntru-hrss-701.min.js +0 -0
  124. package/dist/ov-iii-pkc-skc.deno.js +0 -0
  125. package/dist/ov-iii-pkc-skc.min.js +0 -0
  126. package/dist/ov-iii-pkc.deno.js +0 -0
  127. package/dist/ov-iii-pkc.min.js +0 -0
  128. package/dist/ov-iii.deno.js +0 -0
  129. package/dist/ov-iii.min.js +0 -0
  130. package/dist/ov-ip-pkc-skc.deno.js +0 -0
  131. package/dist/ov-ip-pkc-skc.min.js +0 -0
  132. package/dist/ov-ip-pkc.deno.js +0 -0
  133. package/dist/ov-ip-pkc.min.js +0 -0
  134. package/dist/ov-ip.deno.js +0 -0
  135. package/dist/ov-ip.min.js +0 -0
  136. package/dist/ov-is-pkc-skc.deno.js +0 -0
  137. package/dist/ov-is-pkc-skc.min.js +0 -0
  138. package/dist/ov-is-pkc.deno.js +0 -0
  139. package/dist/ov-is-pkc.min.js +0 -0
  140. package/dist/ov-is.deno.js +0 -0
  141. package/dist/ov-is.min.js +0 -0
  142. package/dist/ov-v-pkc-skc.deno.js +0 -0
  143. package/dist/ov-v-pkc-skc.min.js +0 -0
  144. package/dist/ov-v-pkc.deno.js +0 -0
  145. package/dist/ov-v-pkc.min.js +0 -0
  146. package/dist/ov-v.deno.js +0 -0
  147. package/dist/ov-v.min.js +0 -0
  148. package/dist/slh-dsa-sha2-128f.deno.js +0 -0
  149. package/dist/slh-dsa-sha2-128f.min.js +0 -0
  150. package/dist/slh-dsa-sha2-128s.deno.js +0 -0
  151. package/dist/slh-dsa-sha2-128s.min.js +0 -0
  152. package/dist/slh-dsa-sha2-192f.deno.js +0 -0
  153. package/dist/slh-dsa-sha2-192f.min.js +0 -0
  154. package/dist/slh-dsa-sha2-192s.deno.js +0 -0
  155. package/dist/slh-dsa-sha2-192s.min.js +0 -0
  156. package/dist/slh-dsa-sha2-256f.deno.js +0 -0
  157. package/dist/slh-dsa-sha2-256f.min.js +0 -0
  158. package/dist/slh-dsa-sha2-256s.deno.js +0 -0
  159. package/dist/slh-dsa-sha2-256s.min.js +0 -0
  160. package/dist/slh-dsa-shake-128f.deno.js +0 -0
  161. package/dist/slh-dsa-shake-128f.min.js +0 -0
  162. package/dist/slh-dsa-shake-128s.deno.js +0 -0
  163. package/dist/slh-dsa-shake-128s.min.js +0 -0
  164. package/dist/slh-dsa-shake-192f.deno.js +0 -0
  165. package/dist/slh-dsa-shake-192f.min.js +0 -0
  166. package/dist/slh-dsa-shake-192s.deno.js +0 -0
  167. package/dist/slh-dsa-shake-192s.min.js +0 -0
  168. package/dist/slh-dsa-shake-256f.deno.js +0 -0
  169. package/dist/slh-dsa-shake-256f.min.js +0 -0
  170. package/dist/slh-dsa-shake-256s.deno.js +0 -0
  171. package/dist/slh-dsa-shake-256s.min.js +0 -0
  172. package/dist/snova-24-5-4-esk.deno.js +0 -0
  173. package/dist/snova-24-5-4-esk.min.js +0 -0
  174. package/dist/snova-24-5-4-shake-esk.deno.js +0 -0
  175. package/dist/snova-24-5-4-shake-esk.min.js +0 -0
  176. package/dist/snova-24-5-4-shake.deno.js +0 -0
  177. package/dist/snova-24-5-4-shake.min.js +0 -0
  178. package/dist/snova-24-5-4.deno.js +0 -0
  179. package/dist/snova-24-5-4.min.js +0 -0
  180. package/dist/snova-24-5-5.deno.js +0 -0
  181. package/dist/snova-24-5-5.min.js +0 -0
  182. package/dist/snova-25-8-3.deno.js +0 -0
  183. package/dist/snova-25-8-3.min.js +0 -0
  184. package/dist/snova-29-6-5.deno.js +0 -0
  185. package/dist/snova-29-6-5.min.js +0 -0
  186. package/dist/snova-37-17-2.deno.js +0 -0
  187. package/dist/snova-37-17-2.min.js +0 -0
  188. package/dist/snova-37-8-4.deno.js +0 -0
  189. package/dist/snova-37-8-4.min.js +0 -0
  190. package/dist/snova-49-11-3.deno.js +0 -0
  191. package/dist/snova-49-11-3.min.js +0 -0
  192. package/dist/snova-56-25-2.deno.js +0 -0
  193. package/dist/snova-56-25-2.min.js +0 -0
  194. package/dist/snova-60-10-4.deno.js +0 -0
  195. package/dist/snova-60-10-4.min.js +0 -0
  196. package/dist/sntrup761.deno.js +0 -0
  197. package/dist/sntrup761.min.js +0 -0
  198. package/package.json +108 -0
  199. package/src/algorithms/kem/classic-mceliece/classic-mceliece-348864.js +336 -0
  200. package/src/algorithms/kem/classic-mceliece/classic-mceliece-348864f.js +336 -0
  201. package/src/algorithms/kem/classic-mceliece/classic-mceliece-460896.js +336 -0
  202. package/src/algorithms/kem/classic-mceliece/classic-mceliece-460896f.js +336 -0
  203. package/src/algorithms/kem/classic-mceliece/classic-mceliece-6688128.js +336 -0
  204. package/src/algorithms/kem/classic-mceliece/classic-mceliece-6688128f.js +336 -0
  205. package/src/algorithms/kem/classic-mceliece/classic-mceliece-6960119.js +336 -0
  206. package/src/algorithms/kem/classic-mceliece/classic-mceliece-6960119f.js +336 -0
  207. package/src/algorithms/kem/classic-mceliece/classic-mceliece-8192128.js +336 -0
  208. package/src/algorithms/kem/classic-mceliece/classic-mceliece-8192128f.js +336 -0
  209. package/src/algorithms/kem/frodokem/efrodokem-1344-aes.js +366 -0
  210. package/src/algorithms/kem/frodokem/efrodokem-1344-shake.js +366 -0
  211. package/src/algorithms/kem/frodokem/efrodokem-640-aes.js +366 -0
  212. package/src/algorithms/kem/frodokem/efrodokem-640-shake.js +366 -0
  213. package/src/algorithms/kem/frodokem/efrodokem-976-aes.js +366 -0
  214. package/src/algorithms/kem/frodokem/efrodokem-976-shake.js +366 -0
  215. package/src/algorithms/kem/frodokem/frodokem-1344-aes.js +366 -0
  216. package/src/algorithms/kem/frodokem/frodokem-1344-shake.js +366 -0
  217. package/src/algorithms/kem/frodokem/frodokem-640-aes.js +366 -0
  218. package/src/algorithms/kem/frodokem/frodokem-640-shake.js +366 -0
  219. package/src/algorithms/kem/frodokem/frodokem-976-aes.js +366 -0
  220. package/src/algorithms/kem/frodokem/frodokem-976-shake.js +366 -0
  221. package/src/algorithms/kem/hqc/hqc-128.js +366 -0
  222. package/src/algorithms/kem/hqc/hqc-192.js +366 -0
  223. package/src/algorithms/kem/hqc/hqc-256.js +366 -0
  224. package/src/algorithms/kem/kyber/kyber-1024.js +349 -0
  225. package/src/algorithms/kem/kyber/kyber-512.js +347 -0
  226. package/src/algorithms/kem/kyber/kyber-768.js +348 -0
  227. package/src/algorithms/kem/ml-kem/ml-kem-1024.js +345 -0
  228. package/src/algorithms/kem/ml-kem/ml-kem-512.js +345 -0
  229. package/src/algorithms/kem/ml-kem/ml-kem-768.js +344 -0
  230. package/src/algorithms/kem/ntru/ntru-hps-2048-509.js +366 -0
  231. package/src/algorithms/kem/ntru/ntru-hps-2048-677.js +366 -0
  232. package/src/algorithms/kem/ntru/ntru-hps-4096-1229.js +366 -0
  233. package/src/algorithms/kem/ntru/ntru-hps-4096-821.js +366 -0
  234. package/src/algorithms/kem/ntru/ntru-hrss-1373.js +366 -0
  235. package/src/algorithms/kem/ntru/ntru-hrss-701.js +366 -0
  236. package/src/algorithms/kem/ntru/sntrup761.js +367 -0
  237. package/src/algorithms/sig/cross/cross-rsdp-128-balanced.js +391 -0
  238. package/src/algorithms/sig/cross/cross-rsdp-128-fast.js +391 -0
  239. package/src/algorithms/sig/cross/cross-rsdp-128-small.js +391 -0
  240. package/src/algorithms/sig/cross/cross-rsdp-192-balanced.js +391 -0
  241. package/src/algorithms/sig/cross/cross-rsdp-192-fast.js +391 -0
  242. package/src/algorithms/sig/cross/cross-rsdp-192-small.js +391 -0
  243. package/src/algorithms/sig/cross/cross-rsdp-256-balanced.js +391 -0
  244. package/src/algorithms/sig/cross/cross-rsdp-256-fast.js +391 -0
  245. package/src/algorithms/sig/cross/cross-rsdp-256-small.js +391 -0
  246. package/src/algorithms/sig/cross/cross-rsdpg-128-balanced.js +391 -0
  247. package/src/algorithms/sig/cross/cross-rsdpg-128-fast.js +391 -0
  248. package/src/algorithms/sig/cross/cross-rsdpg-128-small.js +391 -0
  249. package/src/algorithms/sig/cross/cross-rsdpg-192-balanced.js +391 -0
  250. package/src/algorithms/sig/cross/cross-rsdpg-192-fast.js +391 -0
  251. package/src/algorithms/sig/cross/cross-rsdpg-192-small.js +391 -0
  252. package/src/algorithms/sig/cross/cross-rsdpg-256-balanced.js +391 -0
  253. package/src/algorithms/sig/cross/cross-rsdpg-256-fast.js +391 -0
  254. package/src/algorithms/sig/cross/cross-rsdpg-256-small.js +391 -0
  255. package/src/algorithms/sig/falcon/falcon-1024.js +378 -0
  256. package/src/algorithms/sig/falcon/falcon-512.js +379 -0
  257. package/src/algorithms/sig/falcon/falcon-padded-1024.js +380 -0
  258. package/src/algorithms/sig/falcon/falcon-padded-512.js +380 -0
  259. package/src/algorithms/sig/mayo/mayo-1.js +390 -0
  260. package/src/algorithms/sig/mayo/mayo-2.js +390 -0
  261. package/src/algorithms/sig/mayo/mayo-3.js +390 -0
  262. package/src/algorithms/sig/mayo/mayo-5.js +390 -0
  263. package/src/algorithms/sig/ml-dsa/ml-dsa-44.js +338 -0
  264. package/src/algorithms/sig/ml-dsa/ml-dsa-65.js +338 -0
  265. package/src/algorithms/sig/ml-dsa/ml-dsa-87.js +338 -0
  266. package/src/algorithms/sig/slh-dsa/slh-dsa-sha2-128f.js +367 -0
  267. package/src/algorithms/sig/slh-dsa/slh-dsa-sha2-128s.js +367 -0
  268. package/src/algorithms/sig/slh-dsa/slh-dsa-sha2-192f.js +367 -0
  269. package/src/algorithms/sig/slh-dsa/slh-dsa-sha2-192s.js +367 -0
  270. package/src/algorithms/sig/slh-dsa/slh-dsa-sha2-256f.js +367 -0
  271. package/src/algorithms/sig/slh-dsa/slh-dsa-sha2-256s.js +367 -0
  272. package/src/algorithms/sig/slh-dsa/slh-dsa-shake-128f.js +367 -0
  273. package/src/algorithms/sig/slh-dsa/slh-dsa-shake-128s.js +367 -0
  274. package/src/algorithms/sig/slh-dsa/slh-dsa-shake-192f.js +367 -0
  275. package/src/algorithms/sig/slh-dsa/slh-dsa-shake-192s.js +367 -0
  276. package/src/algorithms/sig/slh-dsa/slh-dsa-shake-256f.js +367 -0
  277. package/src/algorithms/sig/slh-dsa/slh-dsa-shake-256s.js +367 -0
  278. package/src/algorithms/sig/snova/snova-24-5-4-esk.js +391 -0
  279. package/src/algorithms/sig/snova/snova-24-5-4-shake-esk.js +391 -0
  280. package/src/algorithms/sig/snova/snova-24-5-4-shake.js +391 -0
  281. package/src/algorithms/sig/snova/snova-24-5-4.js +391 -0
  282. package/src/algorithms/sig/snova/snova-24-5-5.js +391 -0
  283. package/src/algorithms/sig/snova/snova-25-8-3.js +391 -0
  284. package/src/algorithms/sig/snova/snova-29-6-5.js +391 -0
  285. package/src/algorithms/sig/snova/snova-37-17-2.js +391 -0
  286. package/src/algorithms/sig/snova/snova-37-8-4.js +391 -0
  287. package/src/algorithms/sig/snova/snova-49-11-3.js +391 -0
  288. package/src/algorithms/sig/snova/snova-56-25-2.js +391 -0
  289. package/src/algorithms/sig/snova/snova-60-10-4.js +391 -0
  290. package/src/algorithms/sig/uov/ov-iii-pkc-skc.js +390 -0
  291. package/src/algorithms/sig/uov/ov-iii-pkc.js +390 -0
  292. package/src/algorithms/sig/uov/ov-iii.js +390 -0
  293. package/src/algorithms/sig/uov/ov-ip-pkc-skc.js +390 -0
  294. package/src/algorithms/sig/uov/ov-ip-pkc.js +390 -0
  295. package/src/algorithms/sig/uov/ov-ip.js +390 -0
  296. package/src/algorithms/sig/uov/ov-is-pkc-skc.js +390 -0
  297. package/src/algorithms/sig/uov/ov-is-pkc.js +390 -0
  298. package/src/algorithms/sig/uov/ov-is.js +390 -0
  299. package/src/algorithms/sig/uov/ov-v-pkc-skc.js +390 -0
  300. package/src/algorithms/sig/uov/ov-v-pkc.js +390 -0
  301. package/src/algorithms/sig/uov/ov-v.js +390 -0
  302. package/src/cli/algorithms.js +254 -0
  303. package/src/cli/commands/info.js +35 -0
  304. package/src/cli/commands/kem.js +91 -0
  305. package/src/cli/commands/list.js +30 -0
  306. package/src/cli/commands/sig.js +98 -0
  307. package/src/cli/index.js +86 -0
  308. package/src/cli/io.js +147 -0
  309. package/src/cli/parser.js +64 -0
  310. package/src/core/errors.js +75 -0
  311. package/src/core/validation.js +28 -0
  312. package/src/index.js +164 -0
  313. package/src/kem.js +60 -0
  314. package/src/sig.js +87 -0
  315. package/src/types/algorithms.d.ts +1543 -0
  316. package/src/types/errors.d.ts +60 -0
  317. package/src/types/index.d.ts +9 -0
@@ -0,0 +1,378 @@
1
+ /**
2
+ * @fileoverview Falcon-1024 signature algorithm implementation
3
+ * @module algorithms/sig/falcon/falcon-1024
4
+ * @description
5
+ * Falcon-1024 is a lattice-based signature scheme providing NIST security level 5.
6
+ * It offers compact signatures and fast verification, based on NTRU lattices and Fast Fourier sampling.
7
+ *
8
+ * Key features:
9
+ * - Compact signatures (~1462 bytes average)
10
+ * - Fast verification
11
+ * - Security Level 5 (256-bit classical, quantum-resistant)
12
+ * - Variable-length signatures
13
+ *
14
+ * @see {@link https://falcon-sign.info/} - Falcon specification
15
+ */
16
+
17
+ import { LibOQSError, LibOQSInitError, LibOQSOperationError, LibOQSValidationError } from '../../../core/errors.js';
18
+ import { isUint8Array } from '../../../core/validation.js';
19
+
20
+ // Dynamic module loading for cross-runtime compatibility
21
+ async function loadModule() {
22
+ const isDeno = typeof Deno !== 'undefined';
23
+ const modulePath = isDeno
24
+ ? `../../../../dist/falcon-1024.deno.js`
25
+ : `../../../../dist/falcon-1024.min.js`;
26
+
27
+ const module = await import(modulePath);
28
+ return module.default;
29
+ }
30
+
31
+ /**
32
+ * FALCON-1024-INFO algorithm constants and metadata
33
+ * @type {{readonly name: 'Falcon-1024', readonly identifier: 'Falcon-1024', readonly type: 'sig', readonly securityLevel: 5, readonly standardized: false, readonly description: string, readonly keySize: {readonly publicKey: 1793, readonly secretKey: 2305, readonly signature: 1462}}}
34
+ */
35
+ export const FALCON_1024_INFO = {
36
+ name: 'Falcon-1024',
37
+ identifier: 'Falcon-1024',
38
+ type: 'sig',
39
+ securityLevel: 5,
40
+ standardized: false,
41
+ description: 'Falcon-1024 lattice-based signature (NIST Level 5, 256-bit quantum security)',
42
+ keySize: {
43
+ publicKey: 1793,
44
+ secretKey: 2305,
45
+ signature: 1462
46
+ }
47
+ };
48
+
49
+ /**
50
+ * Factory function to create a Falcon-1024 signature instance
51
+ *
52
+ * @async
53
+ * @function createFalcon1024
54
+ * @returns {Promise<Falcon1024>} Initialized Falcon-1024 instance
55
+ * @throws {LibOQSInitError} If module initialization fails
56
+ *
57
+ * @example
58
+ * import { createFalcon1024 } from '@oqs/liboqs-js';
59
+ *
60
+ * const sig = await createFalcon1024();
61
+ * const { publicKey, secretKey } = sig.generateKeyPair();
62
+ * sig.destroy();
63
+ */
64
+ export async function createFalcon1024() {
65
+ const moduleFactory = await loadModule();
66
+ const wasmModule = await moduleFactory();
67
+ wasmModule._OQS_init();
68
+
69
+ const algoName = FALCON_1024_INFO.identifier;
70
+ const nameLen = wasmModule.lengthBytesUTF8(algoName);
71
+ const namePtr = wasmModule._malloc(nameLen + 1);
72
+ wasmModule.stringToUTF8(algoName, namePtr, nameLen + 1);
73
+
74
+ const sigPtr = wasmModule._OQS_SIG_new(namePtr);
75
+ wasmModule._free(namePtr);
76
+ if (!sigPtr) {
77
+ throw new LibOQSInitError('Falcon-1024', 'Failed to create SIG instance');
78
+ }
79
+
80
+ return new Falcon1024(wasmModule, sigPtr);
81
+ }
82
+
83
+ /**
84
+ * Falcon-1024 signature algorithm wrapper class
85
+ *
86
+ * @class Falcon1024
87
+ * @description
88
+ * High-level wrapper for Falcon-1024 signature operations. Provides secure key generation,
89
+ * message signing, and signature verification with automatic memory management.
90
+ *
91
+ * Memory Management:
92
+ * - All WASM memory is managed internally
93
+ * - Call destroy() when finished to free resources
94
+ * - Do not use instance after calling destroy()
95
+ *
96
+ * @example
97
+ * const sig = await createFalcon1024();
98
+ *
99
+ * // Generate keypair
100
+ * const { publicKey, secretKey } = sig.generateKeyPair();
101
+ *
102
+ * // Sign message
103
+ * const message = new TextEncoder().encode('Hello, quantum world!');
104
+ * const signature = sig.sign(message, secretKey);
105
+ *
106
+ * // Verify signature
107
+ * const isValid = sig.verify(message, signature, publicKey);
108
+ * console.log('Valid:', isValid); // true
109
+ *
110
+ * // Cleanup
111
+ * sig.destroy();
112
+ */
113
+ export class Falcon1024 {
114
+ /** @type {Object} @private */ #wasmModule;
115
+ /** @type {number} @private */ #sigPtr;
116
+ /** @type {boolean} @private */ #destroyed = false;
117
+
118
+ /**
119
+ * @private
120
+ * @constructor
121
+ * @param {Object} wasmModule - Emscripten WASM module
122
+ * @param {number} sigPtr - Pointer to OQS_SIG structure
123
+ */
124
+ constructor(wasmModule, sigPtr) {
125
+ this.#wasmModule = wasmModule;
126
+ this.#sigPtr = sigPtr;
127
+ }
128
+
129
+ /**
130
+ * Generate a new Falcon-1024 keypair
131
+ *
132
+ * @async
133
+ * @returns {{publicKey: Uint8Array, secretKey: Uint8Array}}
134
+ * @throws {LibOQSError} If instance is destroyed
135
+ * @throws {LibOQSOperationError} If key generation fails
136
+ *
137
+ * @example
138
+ * const { publicKey, secretKey } = sig.generateKeyPair();
139
+ * console.log('Public key:', publicKey.length); // 1793 bytes
140
+ * console.log('Secret key:', secretKey.length); // 2305 bytes
141
+ */
142
+ generateKeyPair() {
143
+ this.#checkDestroyed();
144
+
145
+ const publicKeyPtr = this.#wasmModule._malloc(FALCON_1024_INFO.keySize.publicKey);
146
+ const secretKeyPtr = this.#wasmModule._malloc(FALCON_1024_INFO.keySize.secretKey);
147
+
148
+ try {
149
+ const result = this.#wasmModule._OQS_SIG_keypair(this.#sigPtr, publicKeyPtr, secretKeyPtr);
150
+
151
+ if (result !== 0) {
152
+ throw new LibOQSOperationError('generateKeyPair', 'Falcon-1024', 'Key generation failed');
153
+ }
154
+
155
+ const publicKey = new Uint8Array(
156
+ this.#wasmModule.HEAPU8.buffer,
157
+ publicKeyPtr,
158
+ FALCON_1024_INFO.keySize.publicKey
159
+ ).slice();
160
+
161
+ const secretKey = new Uint8Array(
162
+ this.#wasmModule.HEAPU8.buffer,
163
+ secretKeyPtr,
164
+ FALCON_1024_INFO.keySize.secretKey
165
+ ).slice();
166
+
167
+ return { publicKey, secretKey };
168
+ } finally {
169
+ this.#wasmModule._free(publicKeyPtr);
170
+ this.#wasmModule._free(secretKeyPtr);
171
+ }
172
+ }
173
+
174
+ /**
175
+ * Sign a message with Falcon-1024
176
+ *
177
+ * @async
178
+ * @param {Uint8Array} message - Message to sign (any length)
179
+ * @param {Uint8Array} secretKey - Secret key (2305 bytes)
180
+ * @returns {Uint8Array} Signature (variable length, max 1462 bytes)
181
+ * @throws {LibOQSError} If instance is destroyed
182
+ * @throws {LibOQSValidationError} If secret key size is invalid
183
+ * @throws {LibOQSOperationError} If signing fails
184
+ *
185
+ * @example
186
+ * const message = new TextEncoder().encode('Sign this message');
187
+ * const signature = sig.sign(message, secretKey);
188
+ * console.log('Signature length:', signature.length); // ~1462 bytes (variable)
189
+ */
190
+ sign(message, secretKey) {
191
+ this.#checkDestroyed();
192
+ this.#validateSecretKey(secretKey);
193
+
194
+ const messagePtr = this.#wasmModule._malloc(message.length);
195
+ const secretKeyPtr = this.#wasmModule._malloc(FALCON_1024_INFO.keySize.secretKey);
196
+ const signaturePtr = this.#wasmModule._malloc(FALCON_1024_INFO.keySize.signature);
197
+ const signatureLenPtr = this.#wasmModule._malloc(8);
198
+
199
+ try {
200
+ this.#wasmModule.HEAPU8.set(message, messagePtr);
201
+ this.#wasmModule.HEAPU8.set(secretKey, secretKeyPtr);
202
+
203
+ const result = this.#wasmModule._OQS_SIG_sign(
204
+ this.#sigPtr,
205
+ signaturePtr,
206
+ signatureLenPtr,
207
+ messagePtr,
208
+ message.length,
209
+ secretKeyPtr
210
+ );
211
+
212
+ if (result !== 0) {
213
+ throw new LibOQSOperationError('sign', 'Falcon-1024', 'Signature generation failed');
214
+ }
215
+
216
+ const signatureLen = this.#wasmModule.getValue(signatureLenPtr, 'i32');
217
+
218
+ const signature = new Uint8Array(
219
+ this.#wasmModule.HEAPU8.buffer,
220
+ signaturePtr,
221
+ signatureLen
222
+ ).slice();
223
+
224
+ return signature;
225
+ } finally {
226
+ this.#wasmModule._free(messagePtr);
227
+ this.#wasmModule._free(secretKeyPtr);
228
+ this.#wasmModule._free(signaturePtr);
229
+ this.#wasmModule._free(signatureLenPtr);
230
+ }
231
+ }
232
+
233
+ /**
234
+ * Verify a Falcon-1024 signature
235
+ *
236
+ * @async
237
+ * @param {Uint8Array} message - Original message
238
+ * @param {Uint8Array} signature - Signature to verify
239
+ * @param {Uint8Array} publicKey - Public key (1793 bytes)
240
+ * @returns {boolean} True if signature is valid, false otherwise
241
+ * @throws {LibOQSError} If instance is destroyed
242
+ * @throws {LibOQSValidationError} If public key or signature size is invalid
243
+ *
244
+ * @example
245
+ * const isValid = sig.verify(message, signature, publicKey);
246
+ * if (isValid) {
247
+ * console.log('Signature is valid!');
248
+ * } else {
249
+ * console.log('Signature verification failed');
250
+ * }
251
+ */
252
+ verify(message, signature, publicKey) {
253
+ this.#checkDestroyed();
254
+ this.#validatePublicKey(publicKey);
255
+ this.#validateSignature(signature);
256
+
257
+ const messagePtr = this.#wasmModule._malloc(message.length);
258
+ const signaturePtr = this.#wasmModule._malloc(signature.length);
259
+ const publicKeyPtr = this.#wasmModule._malloc(FALCON_1024_INFO.keySize.publicKey);
260
+
261
+ try {
262
+ this.#wasmModule.HEAPU8.set(message, messagePtr);
263
+ this.#wasmModule.HEAPU8.set(signature, signaturePtr);
264
+ this.#wasmModule.HEAPU8.set(publicKey, publicKeyPtr);
265
+
266
+ const result = this.#wasmModule._OQS_SIG_verify(
267
+ this.#sigPtr,
268
+ messagePtr,
269
+ message.length,
270
+ signaturePtr,
271
+ signature.length,
272
+ publicKeyPtr
273
+ );
274
+
275
+ return result === 0;
276
+ } finally {
277
+ this.#wasmModule._free(messagePtr);
278
+ this.#wasmModule._free(signaturePtr);
279
+ this.#wasmModule._free(publicKeyPtr);
280
+ }
281
+ }
282
+
283
+ /**
284
+ * Free WASM resources
285
+ *
286
+ * @description
287
+ * Releases all WASM memory associated with this instance.
288
+ * The instance cannot be used after calling destroy().
289
+ *
290
+ * @example
291
+ * sig.destroy();
292
+ * // sig is now unusable
293
+ */
294
+ destroy() {
295
+ if (!this.#destroyed && this.#sigPtr) {
296
+ this.#wasmModule._OQS_SIG_free(this.#sigPtr);
297
+ this.#sigPtr = null;
298
+ this.#destroyed = true;
299
+ }
300
+ }
301
+
302
+ /**
303
+ * Enables automatic cleanup via `using` declarations
304
+ * @example
305
+ * using instance = await create...();
306
+ * // automatically cleaned up at end of scope
307
+ */
308
+ [Symbol.dispose]() {
309
+ this.destroy();
310
+ }
311
+
312
+ /**
313
+ * Get algorithm information
314
+ *
315
+ * @readonly
316
+ * @returns {typeof FALCON_1024_INFO} Algorithm metadata
317
+ *
318
+ * @example
319
+ * console.log(sig.info.name); // 'Falcon-1024'
320
+ * console.log(sig.info.securityLevel); // 5
321
+ * console.log(sig.info.keySize); // { publicKey: 1793, secretKey: 2305, signature: 1462 }
322
+ */
323
+ get info() {
324
+ return FALCON_1024_INFO;
325
+ }
326
+
327
+ /**
328
+ * @private
329
+ * @throws {LibOQSError} If instance is destroyed
330
+ */
331
+ #checkDestroyed() {
332
+ if (this.#destroyed) {
333
+ throw new LibOQSError('Instance has been destroyed', 'Falcon-1024');
334
+ }
335
+ }
336
+
337
+ /**
338
+ * @private
339
+ * @param {Uint8Array} publicKey
340
+ * @throws {LibOQSValidationError} If public key size is invalid
341
+ */
342
+ #validatePublicKey(publicKey) {
343
+ if (!isUint8Array(publicKey) || publicKey.length !== FALCON_1024_INFO.keySize.publicKey) {
344
+ throw new LibOQSValidationError(
345
+ `Invalid public key size: expected ${FALCON_1024_INFO.keySize.publicKey} bytes, got ${publicKey.length}`,
346
+ 'Falcon-1024'
347
+ );
348
+ }
349
+ }
350
+
351
+ /**
352
+ * @private
353
+ * @param {Uint8Array} secretKey
354
+ * @throws {LibOQSValidationError} If secret key size is invalid
355
+ */
356
+ #validateSecretKey(secretKey) {
357
+ if (!isUint8Array(secretKey) || secretKey.length !== FALCON_1024_INFO.keySize.secretKey) {
358
+ throw new LibOQSValidationError(
359
+ `Invalid secret key size: expected ${FALCON_1024_INFO.keySize.secretKey} bytes, got ${secretKey.length}`,
360
+ 'Falcon-1024'
361
+ );
362
+ }
363
+ }
364
+
365
+ /**
366
+ * @private
367
+ * @param {Uint8Array} signature
368
+ * @throws {LibOQSValidationError} If signature size is invalid
369
+ */
370
+ #validateSignature(signature) {
371
+ if (!isUint8Array(signature) || signature.length === 0 || signature.length > FALCON_1024_INFO.keySize.signature) {
372
+ throw new LibOQSValidationError(
373
+ `Invalid signature size: expected 1-${FALCON_1024_INFO.keySize.signature} bytes, got ${signature.length}`,
374
+ 'Falcon-1024'
375
+ );
376
+ }
377
+ }
378
+ }