@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 MAYO-5 signature algorithm implementation
3
+ * @module algorithms/sig/mayo/mayo-5
4
+ * @description
5
+ * MAYO-5 is a multivariate signature scheme based on the Oil and Vinegar problem.
6
+ * It provides compact signatures with NIST security level 5.
7
+ *
8
+ * Key features:
9
+ * - Multivariate cryptography (Oil and Vinegar)
10
+ * - Security Level 5 (256-bit classical, quantum-resistant)
11
+ * - Compact signatures (964 bytes)
12
+ * - Small secret keys (40 bytes)
13
+ *
14
+ * @see {@link https://pqmayo.org/} - MAYO 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/mayo-5.deno.js`
25
+ : `../../../../dist/mayo-5.min.js`;
26
+
27
+ const module = await import(modulePath);
28
+ return module.default;
29
+ }
30
+
31
+ /**
32
+ * MAYO-5-INFO algorithm constants and metadata
33
+ * @type {{readonly name: 'MAYO-5', readonly identifier: 'MAYO-5', readonly type: 'sig', readonly securityLevel: 5, readonly standardized: false, readonly description: string, readonly keySize: {readonly publicKey: 5554, readonly secretKey: 40, readonly signature: 964}}}
34
+ */
35
+ export const MAYO_5_INFO = {
36
+ name: 'MAYO-5',
37
+ identifier: 'MAYO-5',
38
+ type: 'sig',
39
+ securityLevel: 5,
40
+ standardized: false,
41
+ description: 'MAYO-5 multivariate signature scheme (NIST Level 5, 256-bit quantum security)',
42
+ keySize: {
43
+ publicKey: 5554,
44
+ secretKey: 40,
45
+ signature: 964
46
+ }
47
+ };
48
+
49
+ /**
50
+ * Factory function to create a MAYO-5 signature instance
51
+ *
52
+ * @async
53
+ * @function createMAYO5
54
+ * @returns {Promise<MAYO5>} Initialized MAYO-5 instance
55
+ * @throws {LibOQSInitError} If module initialization fails
56
+ *
57
+ * @example
58
+ * import { createMAYO5 } from '@oqs/liboqs-js';
59
+ *
60
+ * const sig = await createMAYO5();
61
+ * const { publicKey, secretKey } = sig.generateKeyPair();
62
+ * sig.destroy();
63
+ */
64
+ export async function createMAYO5() {
65
+ const moduleFactory = await loadModule();
66
+ const wasmModule = await moduleFactory();
67
+ wasmModule._OQS_init();
68
+
69
+ const algoName = MAYO_5_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('MAYO-5', 'Failed to create SIG instance');
79
+ }
80
+
81
+ return new MAYO5(wasmModule, sigPtr);
82
+ }
83
+
84
+ /**
85
+ * MAYO-5 digital signature wrapper class
86
+ *
87
+ * @class MAYO5
88
+ * @description
89
+ * High-level wrapper for MAYO-5 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 createMAYO5();
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 MAYO5 {
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 MAYO-5 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); // 5554 bytes
140
+ * console.log('Secret key:', secretKey.length); // 40 bytes
141
+ */
142
+ generateKeyPair() {
143
+ this.#checkDestroyed();
144
+
145
+ const publicKey = new Uint8Array(MAYO_5_INFO.keySize.publicKey);
146
+ const secretKey = new Uint8Array(MAYO_5_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', 'MAYO-5', '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 (40 bytes)
174
+ * @returns {Uint8Array} Digital signature (up to 964 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); // 964 bytes
183
+ */
184
+ sign(message, secretKey) {
185
+ this.#checkDestroyed();
186
+ this.#validateMessage(message);
187
+ this.#validateSecretKey(secretKey);
188
+
189
+ const signature = new Uint8Array(MAYO_5_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', 'MAYO-5', '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 (5554 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 MAYO_5_INFO} Algorithm metadata
309
+ *
310
+ * @example
311
+ * console.log(sig.info.name); // 'MAYO-5'
312
+ * console.log(sig.info.securityLevel); // 5
313
+ * console.log(sig.info.keySize); // { publicKey: 5554, secretKey: 40, signature: 964 }
314
+ */
315
+ get info() {
316
+ return MAYO_5_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', 'MAYO-5');
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
+ 'MAYO-5'
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 !== MAYO_5_INFO.keySize.publicKey) {
350
+ throw new LibOQSValidationError(
351
+ `Invalid public key: expected ${MAYO_5_INFO.keySize.publicKey} bytes, got ${publicKey?.length ?? 'null'}`,
352
+ 'MAYO-5'
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 !== MAYO_5_INFO.keySize.secretKey) {
364
+ throw new LibOQSValidationError(
365
+ `Invalid secret key: expected ${MAYO_5_INFO.keySize.secretKey} bytes, got ${secretKey?.length ?? 'null'}`,
366
+ 'MAYO-5'
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
+ 'MAYO-5'
381
+ );
382
+ }
383
+ if (signature.length === 0 || signature.length > MAYO_5_INFO.keySize.signature) {
384
+ throw new LibOQSValidationError(
385
+ `Invalid signature length: expected up to ${MAYO_5_INFO.keySize.signature} bytes, got ${signature.length}`,
386
+ 'MAYO-5'
387
+ );
388
+ }
389
+ }
390
+ }