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