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