visaljs 0.0.0-stage → 0.0.2

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 (520) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +45 -2
  3. package/cli.js +8084 -0
  4. package/node/include/js_node.h +46 -0
  5. package/node/prelude/async_hooks.js +88 -0
  6. package/node/prelude/buffer.js +31 -0
  7. package/node/prelude/crypto.js +114 -0
  8. package/node/prelude/events.js +227 -0
  9. package/node/prelude/fs.js +79 -0
  10. package/node/prelude/http.js +536 -0
  11. package/node/prelude/http2.js +30 -0
  12. package/node/prelude/internal/crypto/asym.js +333 -0
  13. package/node/prelude/internal/crypto/cipher.js +205 -0
  14. package/node/prelude/internal/crypto/hash.js +137 -0
  15. package/node/prelude/internal/crypto/kdf.js +182 -0
  16. package/node/prelude/internal/crypto/keys.js +603 -0
  17. package/node/prelude/internal/crypto/random.js +118 -0
  18. package/node/prelude/internal/crypto/util.js +76 -0
  19. package/node/prelude/internal/errors.js +88 -0
  20. package/node/prelude/internal/querystring.js +105 -0
  21. package/node/prelude/module.js +53 -0
  22. package/node/prelude/net.js +51 -0
  23. package/node/prelude/os.js +129 -0
  24. package/node/prelude/path.js +257 -0
  25. package/node/prelude/process.js +21 -0
  26. package/node/prelude/querystring.js +469 -0
  27. package/node/prelude/stream.js +1327 -0
  28. package/node/prelude/stream_promises.js +7 -0
  29. package/node/prelude/stream_web.js +6 -0
  30. package/node/prelude/string_decoder.js +236 -0
  31. package/node/prelude/tty.js +18 -0
  32. package/node/prelude/url.js +1156 -0
  33. package/node/prelude/util.js +64 -0
  34. package/node/prelude/zlib.js +81 -0
  35. package/node/src/host_fs.c +126 -0
  36. package/node/src/host_http.c +486 -0
  37. package/node/src/host_os.c +505 -0
  38. package/node/src/host_sys.c +78 -0
  39. package/node/third_party/libuv/LICENSE +19 -0
  40. package/node/third_party/libuv/include/uv/aix.h +32 -0
  41. package/node/third_party/libuv/include/uv/bsd.h +34 -0
  42. package/node/third_party/libuv/include/uv/darwin.h +61 -0
  43. package/node/third_party/libuv/include/uv/errno.h +483 -0
  44. package/node/third_party/libuv/include/uv/linux.h +34 -0
  45. package/node/third_party/libuv/include/uv/os390.h +33 -0
  46. package/node/third_party/libuv/include/uv/posix.h +31 -0
  47. package/node/third_party/libuv/include/uv/sunos.h +44 -0
  48. package/node/third_party/libuv/include/uv/threadpool.h +37 -0
  49. package/node/third_party/libuv/include/uv/tree.h +521 -0
  50. package/node/third_party/libuv/include/uv/unix.h +512 -0
  51. package/node/third_party/libuv/include/uv/version.h +43 -0
  52. package/node/third_party/libuv/include/uv/win.h +698 -0
  53. package/node/third_party/libuv/include/uv.h +1990 -0
  54. package/node/third_party/libuv/src/fs-poll.c +290 -0
  55. package/node/third_party/libuv/src/heap-inl.h +245 -0
  56. package/node/third_party/libuv/src/idna.c +560 -0
  57. package/node/third_party/libuv/src/idna.h +31 -0
  58. package/node/third_party/libuv/src/inet.c +298 -0
  59. package/node/third_party/libuv/src/queue.h +90 -0
  60. package/node/third_party/libuv/src/random.c +123 -0
  61. package/node/third_party/libuv/src/strscpy.c +38 -0
  62. package/node/third_party/libuv/src/strscpy.h +39 -0
  63. package/node/third_party/libuv/src/strtok.c +52 -0
  64. package/node/third_party/libuv/src/strtok.h +27 -0
  65. package/node/third_party/libuv/src/thread-common.c +175 -0
  66. package/node/third_party/libuv/src/threadpool.c +419 -0
  67. package/node/third_party/libuv/src/timer.c +200 -0
  68. package/node/third_party/libuv/src/unix/async.c +418 -0
  69. package/node/third_party/libuv/src/unix/bsd-ifaddrs.c +164 -0
  70. package/node/third_party/libuv/src/unix/core.c +2104 -0
  71. package/node/third_party/libuv/src/unix/darwin-proctitle.c +176 -0
  72. package/node/third_party/libuv/src/unix/darwin-stub.h +97 -0
  73. package/node/third_party/libuv/src/unix/darwin-syscalls.h +17 -0
  74. package/node/third_party/libuv/src/unix/darwin.c +237 -0
  75. package/node/third_party/libuv/src/unix/dl.c +80 -0
  76. package/node/third_party/libuv/src/unix/fs.c +2303 -0
  77. package/node/third_party/libuv/src/unix/fsevents.c +906 -0
  78. package/node/third_party/libuv/src/unix/getaddrinfo.c +252 -0
  79. package/node/third_party/libuv/src/unix/getnameinfo.c +121 -0
  80. package/node/third_party/libuv/src/unix/internal.h +530 -0
  81. package/node/third_party/libuv/src/unix/kqueue.c +667 -0
  82. package/node/third_party/libuv/src/unix/linux.c +2761 -0
  83. package/node/third_party/libuv/src/unix/loop-watcher.c +68 -0
  84. package/node/third_party/libuv/src/unix/loop.c +240 -0
  85. package/node/third_party/libuv/src/unix/pipe.c +555 -0
  86. package/node/third_party/libuv/src/unix/poll.c +159 -0
  87. package/node/third_party/libuv/src/unix/process.c +1123 -0
  88. package/node/third_party/libuv/src/unix/procfs-exepath.c +45 -0
  89. package/node/third_party/libuv/src/unix/proctitle.c +157 -0
  90. package/node/third_party/libuv/src/unix/random-devurandom.c +93 -0
  91. package/node/third_party/libuv/src/unix/random-getentropy.c +57 -0
  92. package/node/third_party/libuv/src/unix/random-getrandom.c +86 -0
  93. package/node/third_party/libuv/src/unix/random-sysctl-linux.c +99 -0
  94. package/node/third_party/libuv/src/unix/signal.c +581 -0
  95. package/node/third_party/libuv/src/unix/stream.c +1567 -0
  96. package/node/third_party/libuv/src/unix/tcp.c +673 -0
  97. package/node/third_party/libuv/src/unix/thread.c +975 -0
  98. package/node/third_party/libuv/src/unix/tty.c +510 -0
  99. package/node/third_party/libuv/src/unix/udp.c +1434 -0
  100. package/node/third_party/libuv/src/uv-common.c +1051 -0
  101. package/node/third_party/libuv/src/uv-common.h +474 -0
  102. package/node/third_party/libuv/src/uv-data-getter-setters.c +119 -0
  103. package/node/third_party/libuv/src/version.c +45 -0
  104. package/node/third_party/llhttp/LICENSE +22 -0
  105. package/node/third_party/llhttp/api.c +509 -0
  106. package/node/third_party/llhttp/http.c +170 -0
  107. package/node/third_party/llhttp/llhttp.c +10099 -0
  108. package/node/third_party/llhttp/llhttp.h +907 -0
  109. package/package.json +25 -4
  110. package/runtime/include/js_atoms.gen.h +68 -0
  111. package/runtime/include/js_atoms.h +54 -0
  112. package/runtime/include/js_bigint.h +93 -0
  113. package/runtime/include/js_buffer.h +79 -0
  114. package/runtime/include/js_builtins.h +168 -0
  115. package/runtime/include/js_console.h +58 -0
  116. package/runtime/include/js_convert.h +22 -0
  117. package/runtime/include/js_core.def +188 -0
  118. package/runtime/include/js_crypto.h +58 -0
  119. package/runtime/include/js_error.h +37 -0
  120. package/runtime/include/js_exception.h +65 -0
  121. package/runtime/include/js_function.h +167 -0
  122. package/runtime/include/js_gc.h +195 -0
  123. package/runtime/include/js_generator.h +96 -0
  124. package/runtime/include/js_host.h +19 -0
  125. package/runtime/include/js_jobs.h +84 -0
  126. package/runtime/include/js_module.h +16 -0
  127. package/runtime/include/js_object.h +384 -0
  128. package/runtime/include/js_ops.h +111 -0
  129. package/runtime/include/js_promise.h +45 -0
  130. package/runtime/include/js_regexp.h +25 -0
  131. package/runtime/include/js_runtime.h +30 -0
  132. package/runtime/include/js_symbol.h +62 -0
  133. package/runtime/include/js_web.h +110 -0
  134. package/runtime/include/jscell.h +48 -0
  135. package/runtime/include/jscontext.h +240 -0
  136. package/runtime/include/jsnum.h +42 -0
  137. package/runtime/include/jsstring.h +161 -0
  138. package/runtime/include/jsvalue.h +142 -0
  139. package/runtime/src/arguments.c +115 -0
  140. package/runtime/src/array.c +1145 -0
  141. package/runtime/src/arraybuffer.c +608 -0
  142. package/runtime/src/async_iter.c +479 -0
  143. package/runtime/src/atoms.c +157 -0
  144. package/runtime/src/base64.c +107 -0
  145. package/runtime/src/bigint.c +1189 -0
  146. package/runtime/src/blob.c +371 -0
  147. package/runtime/src/buffer.c +1357 -0
  148. package/runtime/src/builtin_table.c +100 -0
  149. package/runtime/src/builtins.c +987 -0
  150. package/runtime/src/builtins_util.h +53 -0
  151. package/runtime/src/collections.c +912 -0
  152. package/runtime/src/components.c +28 -0
  153. package/runtime/src/console.c +637 -0
  154. package/runtime/src/convert.c +82 -0
  155. package/runtime/src/core_all.c +21 -0
  156. package/runtime/src/crypto.c +116 -0
  157. package/runtime/src/crypto_asym.c +644 -0
  158. package/runtime/src/crypto_cipher.c +671 -0
  159. package/runtime/src/crypto_hash.c +260 -0
  160. package/runtime/src/crypto_host.c +414 -0
  161. package/runtime/src/crypto_internal.h +304 -0
  162. package/runtime/src/crypto_kdf.c +143 -0
  163. package/runtime/src/crypto_key.c +171 -0
  164. package/runtime/src/crypto_pkey.c +794 -0
  165. package/runtime/src/crypto_subtle.c +1675 -0
  166. package/runtime/src/date.c +940 -0
  167. package/runtime/src/domexception.c +169 -0
  168. package/runtime/src/elements.c +312 -0
  169. package/runtime/src/elements.h +45 -0
  170. package/runtime/src/encoding.c +485 -0
  171. package/runtime/src/error.c +297 -0
  172. package/runtime/src/events.c +793 -0
  173. package/runtime/src/exception.c +56 -0
  174. package/runtime/src/fetch.c +772 -0
  175. package/runtime/src/function.c +530 -0
  176. package/runtime/src/gc.c +803 -0
  177. package/runtime/src/generator.c +218 -0
  178. package/runtime/src/global.c +119 -0
  179. package/runtime/src/headers.c +557 -0
  180. package/runtime/src/inspect.c +1792 -0
  181. package/runtime/src/internal.h +80 -0
  182. package/runtime/src/iterate.c +94 -0
  183. package/runtime/src/iterator.c +409 -0
  184. package/runtime/src/jobs.c +337 -0
  185. package/runtime/src/jsnum.c +353 -0
  186. package/runtime/src/json.c +1028 -0
  187. package/runtime/src/math.c +243 -0
  188. package/runtime/src/module.c +336 -0
  189. package/runtime/src/number.c +176 -0
  190. package/runtime/src/object.c +1265 -0
  191. package/runtime/src/ops.c +322 -0
  192. package/runtime/src/os.c +196 -0
  193. package/runtime/src/os.h +29 -0
  194. package/runtime/src/process.c +432 -0
  195. package/runtime/src/promise.c +721 -0
  196. package/runtime/src/proxy.c +570 -0
  197. package/runtime/src/reflect.c +194 -0
  198. package/runtime/src/regexp.c +1141 -0
  199. package/runtime/src/regexp_anchor.h +34 -0
  200. package/runtime/src/regexp_message.h +32 -0
  201. package/runtime/src/shape.c +294 -0
  202. package/runtime/src/shape.h +46 -0
  203. package/runtime/src/streams.c +1046 -0
  204. package/runtime/src/streams.h +47 -0
  205. package/runtime/src/string.c +364 -0
  206. package/runtime/src/string_builtins.c +837 -0
  207. package/runtime/src/symbol.c +143 -0
  208. package/runtime/src/test_host.c +59 -0
  209. package/runtime/src/typedarray.c +1330 -0
  210. package/runtime/src/tznames.gen.h +712 -0
  211. package/runtime/src/uri.c +169 -0
  212. package/runtime/src/url.c +2116 -0
  213. package/runtime/src/weak.c +486 -0
  214. package/runtime/src/web.c +214 -0
  215. package/runtime/src/wrapper.c +59 -0
  216. package/runtime/src/writable.c +1486 -0
  217. package/runtime/third_party/ada-idna/LICENSE-MIT +18 -0
  218. package/runtime/third_party/ada-idna/README.md +27 -0
  219. package/runtime/third_party/ada-idna/convert.mjs +83 -0
  220. package/runtime/third_party/ada-idna/idna.c +416 -0
  221. package/runtime/third_party/ada-idna/idna.h +15 -0
  222. package/runtime/third_party/ada-idna/idna_tables.h +2657 -0
  223. package/runtime/third_party/bearssl/LICENSE.txt +21 -0
  224. package/runtime/third_party/bearssl/README.txt +136 -0
  225. package/runtime/third_party/bearssl/VERSION +1 -0
  226. package/runtime/third_party/bearssl/inc/bearssl.h +183 -0
  227. package/runtime/third_party/bearssl/inc/bearssl_aead.h +1059 -0
  228. package/runtime/third_party/bearssl/inc/bearssl_block.h +2618 -0
  229. package/runtime/third_party/bearssl/inc/bearssl_ec.h +967 -0
  230. package/runtime/third_party/bearssl/inc/bearssl_hash.h +1346 -0
  231. package/runtime/third_party/bearssl/inc/bearssl_hmac.h +241 -0
  232. package/runtime/third_party/bearssl/inc/bearssl_kdf.h +284 -0
  233. package/runtime/third_party/bearssl/inc/bearssl_pem.h +294 -0
  234. package/runtime/third_party/bearssl/inc/bearssl_prf.h +150 -0
  235. package/runtime/third_party/bearssl/inc/bearssl_rand.h +397 -0
  236. package/runtime/third_party/bearssl/inc/bearssl_rsa.h +1655 -0
  237. package/runtime/third_party/bearssl/inc/bearssl_ssl.h +4296 -0
  238. package/runtime/third_party/bearssl/inc/bearssl_x509.h +1474 -0
  239. package/runtime/third_party/bearssl/src/aead/ccm.c +346 -0
  240. package/runtime/third_party/bearssl/src/aead/eax.c +525 -0
  241. package/runtime/third_party/bearssl/src/aead/gcm.c +318 -0
  242. package/runtime/third_party/bearssl/src/codec/ccopy.c +44 -0
  243. package/runtime/third_party/bearssl/src/codec/dec16be.c +38 -0
  244. package/runtime/third_party/bearssl/src/codec/dec16le.c +38 -0
  245. package/runtime/third_party/bearssl/src/codec/dec32be.c +38 -0
  246. package/runtime/third_party/bearssl/src/codec/dec32le.c +38 -0
  247. package/runtime/third_party/bearssl/src/codec/dec64be.c +38 -0
  248. package/runtime/third_party/bearssl/src/codec/dec64le.c +38 -0
  249. package/runtime/third_party/bearssl/src/codec/enc16be.c +38 -0
  250. package/runtime/third_party/bearssl/src/codec/enc16le.c +38 -0
  251. package/runtime/third_party/bearssl/src/codec/enc32be.c +38 -0
  252. package/runtime/third_party/bearssl/src/codec/enc32le.c +38 -0
  253. package/runtime/third_party/bearssl/src/codec/enc64be.c +38 -0
  254. package/runtime/third_party/bearssl/src/codec/enc64le.c +38 -0
  255. package/runtime/third_party/bearssl/src/codec/pemdec.c +526 -0
  256. package/runtime/third_party/bearssl/src/codec/pemdec.t0 +314 -0
  257. package/runtime/third_party/bearssl/src/codec/pemenc.c +173 -0
  258. package/runtime/third_party/bearssl/src/config.h +247 -0
  259. package/runtime/third_party/bearssl/src/ec/ec_all_m15.c +121 -0
  260. package/runtime/third_party/bearssl/src/ec/ec_all_m31.c +171 -0
  261. package/runtime/third_party/bearssl/src/ec/ec_c25519_i15.c +398 -0
  262. package/runtime/third_party/bearssl/src/ec/ec_c25519_i31.c +390 -0
  263. package/runtime/third_party/bearssl/src/ec/ec_c25519_m15.c +1478 -0
  264. package/runtime/third_party/bearssl/src/ec/ec_c25519_m31.c +800 -0
  265. package/runtime/third_party/bearssl/src/ec/ec_c25519_m62.c +605 -0
  266. package/runtime/third_party/bearssl/src/ec/ec_c25519_m64.c +831 -0
  267. package/runtime/third_party/bearssl/src/ec/ec_curve25519.c +46 -0
  268. package/runtime/third_party/bearssl/src/ec/ec_default.c +36 -0
  269. package/runtime/third_party/bearssl/src/ec/ec_keygen.c +86 -0
  270. package/runtime/third_party/bearssl/src/ec/ec_p256_m15.c +2124 -0
  271. package/runtime/third_party/bearssl/src/ec/ec_p256_m31.c +1469 -0
  272. package/runtime/third_party/bearssl/src/ec/ec_p256_m62.c +1765 -0
  273. package/runtime/third_party/bearssl/src/ec/ec_p256_m64.c +1781 -0
  274. package/runtime/third_party/bearssl/src/ec/ec_prime_i15.c +824 -0
  275. package/runtime/third_party/bearssl/src/ec/ec_prime_i31.c +826 -0
  276. package/runtime/third_party/bearssl/src/ec/ec_pubkey.c +85 -0
  277. package/runtime/third_party/bearssl/src/ec/ec_secp256r1.c +51 -0
  278. package/runtime/third_party/bearssl/src/ec/ec_secp384r1.c +57 -0
  279. package/runtime/third_party/bearssl/src/ec/ec_secp521r1.c +64 -0
  280. package/runtime/third_party/bearssl/src/ec/ecdsa_atr.c +134 -0
  281. package/runtime/third_party/bearssl/src/ec/ecdsa_default_sign_asn1.c +36 -0
  282. package/runtime/third_party/bearssl/src/ec/ecdsa_default_sign_raw.c +36 -0
  283. package/runtime/third_party/bearssl/src/ec/ecdsa_default_vrfy_asn1.c +36 -0
  284. package/runtime/third_party/bearssl/src/ec/ecdsa_default_vrfy_raw.c +36 -0
  285. package/runtime/third_party/bearssl/src/ec/ecdsa_i15_bits.c +47 -0
  286. package/runtime/third_party/bearssl/src/ec/ecdsa_i15_sign_asn1.c +45 -0
  287. package/runtime/third_party/bearssl/src/ec/ecdsa_i15_sign_raw.c +174 -0
  288. package/runtime/third_party/bearssl/src/ec/ecdsa_i15_vrfy_asn1.c +48 -0
  289. package/runtime/third_party/bearssl/src/ec/ecdsa_i15_vrfy_raw.c +166 -0
  290. package/runtime/third_party/bearssl/src/ec/ecdsa_i31_bits.c +47 -0
  291. package/runtime/third_party/bearssl/src/ec/ecdsa_i31_sign_asn1.c +45 -0
  292. package/runtime/third_party/bearssl/src/ec/ecdsa_i31_sign_raw.c +173 -0
  293. package/runtime/third_party/bearssl/src/ec/ecdsa_i31_vrfy_asn1.c +48 -0
  294. package/runtime/third_party/bearssl/src/ec/ecdsa_i31_vrfy_raw.c +165 -0
  295. package/runtime/third_party/bearssl/src/ec/ecdsa_rta.c +121 -0
  296. package/runtime/third_party/bearssl/src/hash/dig_oid.c +84 -0
  297. package/runtime/third_party/bearssl/src/hash/dig_size.c +50 -0
  298. package/runtime/third_party/bearssl/src/hash/ghash_ctmul.c +345 -0
  299. package/runtime/third_party/bearssl/src/hash/ghash_ctmul32.c +251 -0
  300. package/runtime/third_party/bearssl/src/hash/ghash_ctmul64.c +154 -0
  301. package/runtime/third_party/bearssl/src/hash/ghash_pclmul.c +389 -0
  302. package/runtime/third_party/bearssl/src/hash/ghash_pwr8.c +411 -0
  303. package/runtime/third_party/bearssl/src/hash/md5.c +208 -0
  304. package/runtime/third_party/bearssl/src/hash/md5sha1.c +141 -0
  305. package/runtime/third_party/bearssl/src/hash/mgf1.c +56 -0
  306. package/runtime/third_party/bearssl/src/hash/multihash.c +166 -0
  307. package/runtime/third_party/bearssl/src/hash/sha1.c +191 -0
  308. package/runtime/third_party/bearssl/src/hash/sha2big.c +285 -0
  309. package/runtime/third_party/bearssl/src/hash/sha2small.c +341 -0
  310. package/runtime/third_party/bearssl/src/inner.h +2577 -0
  311. package/runtime/third_party/bearssl/src/int/i15_add.c +46 -0
  312. package/runtime/third_party/bearssl/src/int/i15_bitlen.c +44 -0
  313. package/runtime/third_party/bearssl/src/int/i15_decmod.c +124 -0
  314. package/runtime/third_party/bearssl/src/int/i15_decode.c +56 -0
  315. package/runtime/third_party/bearssl/src/int/i15_decred.c +100 -0
  316. package/runtime/third_party/bearssl/src/int/i15_encode.c +56 -0
  317. package/runtime/third_party/bearssl/src/int/i15_fmont.c +59 -0
  318. package/runtime/third_party/bearssl/src/int/i15_iszero.c +39 -0
  319. package/runtime/third_party/bearssl/src/int/i15_moddiv.c +465 -0
  320. package/runtime/third_party/bearssl/src/int/i15_modpow.c +50 -0
  321. package/runtime/third_party/bearssl/src/int/i15_modpow2.c +160 -0
  322. package/runtime/third_party/bearssl/src/int/i15_montmul.c +184 -0
  323. package/runtime/third_party/bearssl/src/int/i15_mulacc.c +61 -0
  324. package/runtime/third_party/bearssl/src/int/i15_muladd.c +173 -0
  325. package/runtime/third_party/bearssl/src/int/i15_ninv15.c +38 -0
  326. package/runtime/third_party/bearssl/src/int/i15_reduce.c +66 -0
  327. package/runtime/third_party/bearssl/src/int/i15_rshift.c +47 -0
  328. package/runtime/third_party/bearssl/src/int/i15_sub.c +46 -0
  329. package/runtime/third_party/bearssl/src/int/i15_tmont.c +36 -0
  330. package/runtime/third_party/bearssl/src/int/i31_add.c +46 -0
  331. package/runtime/third_party/bearssl/src/int/i31_bitlen.c +44 -0
  332. package/runtime/third_party/bearssl/src/int/i31_decmod.c +124 -0
  333. package/runtime/third_party/bearssl/src/int/i31_decode.c +57 -0
  334. package/runtime/third_party/bearssl/src/int/i31_decred.c +103 -0
  335. package/runtime/third_party/bearssl/src/int/i31_encode.c +79 -0
  336. package/runtime/third_party/bearssl/src/int/i31_fmont.c +60 -0
  337. package/runtime/third_party/bearssl/src/int/i31_iszero.c +39 -0
  338. package/runtime/third_party/bearssl/src/int/i31_moddiv.c +488 -0
  339. package/runtime/third_party/bearssl/src/int/i31_modpow.c +65 -0
  340. package/runtime/third_party/bearssl/src/int/i31_modpow2.c +160 -0
  341. package/runtime/third_party/bearssl/src/int/i31_montmul.c +127 -0
  342. package/runtime/third_party/bearssl/src/int/i31_mulacc.c +74 -0
  343. package/runtime/third_party/bearssl/src/int/i31_muladd.c +157 -0
  344. package/runtime/third_party/bearssl/src/int/i31_ninv31.c +39 -0
  345. package/runtime/third_party/bearssl/src/int/i31_reduce.c +66 -0
  346. package/runtime/third_party/bearssl/src/int/i31_rshift.c +47 -0
  347. package/runtime/third_party/bearssl/src/int/i31_sub.c +46 -0
  348. package/runtime/third_party/bearssl/src/int/i31_tmont.c +36 -0
  349. package/runtime/third_party/bearssl/src/int/i32_add.c +51 -0
  350. package/runtime/third_party/bearssl/src/int/i32_bitlen.c +44 -0
  351. package/runtime/third_party/bearssl/src/int/i32_decmod.c +77 -0
  352. package/runtime/third_party/bearssl/src/int/i32_decode.c +63 -0
  353. package/runtime/third_party/bearssl/src/int/i32_decred.c +107 -0
  354. package/runtime/third_party/bearssl/src/int/i32_div32.c +56 -0
  355. package/runtime/third_party/bearssl/src/int/i32_encode.c +72 -0
  356. package/runtime/third_party/bearssl/src/int/i32_fmont.c +60 -0
  357. package/runtime/third_party/bearssl/src/int/i32_iszero.c +39 -0
  358. package/runtime/third_party/bearssl/src/int/i32_modpow.c +65 -0
  359. package/runtime/third_party/bearssl/src/int/i32_montmul.c +69 -0
  360. package/runtime/third_party/bearssl/src/int/i32_mulacc.c +56 -0
  361. package/runtime/third_party/bearssl/src/int/i32_muladd.c +138 -0
  362. package/runtime/third_party/bearssl/src/int/i32_ninv32.c +39 -0
  363. package/runtime/third_party/bearssl/src/int/i32_reduce.c +66 -0
  364. package/runtime/third_party/bearssl/src/int/i32_sub.c +51 -0
  365. package/runtime/third_party/bearssl/src/int/i32_tmont.c +36 -0
  366. package/runtime/third_party/bearssl/src/int/i62_modpow2.c +493 -0
  367. package/runtime/third_party/bearssl/src/kdf/hkdf.c +107 -0
  368. package/runtime/third_party/bearssl/src/kdf/shake.c +590 -0
  369. package/runtime/third_party/bearssl/src/mac/hmac.c +122 -0
  370. package/runtime/third_party/bearssl/src/mac/hmac_ct.c +193 -0
  371. package/runtime/third_party/bearssl/src/rand/aesctr_drbg.c +206 -0
  372. package/runtime/third_party/bearssl/src/rand/hmac_drbg.c +157 -0
  373. package/runtime/third_party/bearssl/src/rand/sysrng.c +252 -0
  374. package/runtime/third_party/bearssl/src/rsa/rsa_default_keygen.c +38 -0
  375. package/runtime/third_party/bearssl/src/rsa/rsa_default_modulus.c +36 -0
  376. package/runtime/third_party/bearssl/src/rsa/rsa_default_oaep_decrypt.c +38 -0
  377. package/runtime/third_party/bearssl/src/rsa/rsa_default_oaep_encrypt.c +38 -0
  378. package/runtime/third_party/bearssl/src/rsa/rsa_default_pkcs1_sign.c +38 -0
  379. package/runtime/third_party/bearssl/src/rsa/rsa_default_pkcs1_vrfy.c +38 -0
  380. package/runtime/third_party/bearssl/src/rsa/rsa_default_priv.c +38 -0
  381. package/runtime/third_party/bearssl/src/rsa/rsa_default_privexp.c +36 -0
  382. package/runtime/third_party/bearssl/src/rsa/rsa_default_pss_sign.c +38 -0
  383. package/runtime/third_party/bearssl/src/rsa/rsa_default_pss_vrfy.c +38 -0
  384. package/runtime/third_party/bearssl/src/rsa/rsa_default_pub.c +38 -0
  385. package/runtime/third_party/bearssl/src/rsa/rsa_default_pubexp.c +36 -0
  386. package/runtime/third_party/bearssl/src/rsa/rsa_i15_keygen.c +583 -0
  387. package/runtime/third_party/bearssl/src/rsa/rsa_i15_modulus.c +99 -0
  388. package/runtime/third_party/bearssl/src/rsa/rsa_i15_oaep_decrypt.c +41 -0
  389. package/runtime/third_party/bearssl/src/rsa/rsa_i15_oaep_encrypt.c +44 -0
  390. package/runtime/third_party/bearssl/src/rsa/rsa_i15_pkcs1_sign.c +37 -0
  391. package/runtime/third_party/bearssl/src/rsa/rsa_i15_pkcs1_vrfy.c +43 -0
  392. package/runtime/third_party/bearssl/src/rsa/rsa_i15_priv.c +209 -0
  393. package/runtime/third_party/bearssl/src/rsa/rsa_i15_privexp.c +320 -0
  394. package/runtime/third_party/bearssl/src/rsa/rsa_i15_pss_sign.c +40 -0
  395. package/runtime/third_party/bearssl/src/rsa/rsa_i15_pss_vrfy.c +44 -0
  396. package/runtime/third_party/bearssl/src/rsa/rsa_i15_pub.c +113 -0
  397. package/runtime/third_party/bearssl/src/rsa/rsa_i15_pubexp.c +152 -0
  398. package/runtime/third_party/bearssl/src/rsa/rsa_i31_keygen.c +37 -0
  399. package/runtime/third_party/bearssl/src/rsa/rsa_i31_keygen_inner.c +608 -0
  400. package/runtime/third_party/bearssl/src/rsa/rsa_i31_modulus.c +99 -0
  401. package/runtime/third_party/bearssl/src/rsa/rsa_i31_oaep_decrypt.c +41 -0
  402. package/runtime/third_party/bearssl/src/rsa/rsa_i31_oaep_encrypt.c +44 -0
  403. package/runtime/third_party/bearssl/src/rsa/rsa_i31_pkcs1_sign.c +37 -0
  404. package/runtime/third_party/bearssl/src/rsa/rsa_i31_pkcs1_vrfy.c +43 -0
  405. package/runtime/third_party/bearssl/src/rsa/rsa_i31_priv.c +203 -0
  406. package/runtime/third_party/bearssl/src/rsa/rsa_i31_privexp.c +318 -0
  407. package/runtime/third_party/bearssl/src/rsa/rsa_i31_pss_sign.c +40 -0
  408. package/runtime/third_party/bearssl/src/rsa/rsa_i31_pss_vrfy.c +44 -0
  409. package/runtime/third_party/bearssl/src/rsa/rsa_i31_pub.c +106 -0
  410. package/runtime/third_party/bearssl/src/rsa/rsa_i31_pubexp.c +152 -0
  411. package/runtime/third_party/bearssl/src/rsa/rsa_i32_oaep_decrypt.c +41 -0
  412. package/runtime/third_party/bearssl/src/rsa/rsa_i32_oaep_encrypt.c +44 -0
  413. package/runtime/third_party/bearssl/src/rsa/rsa_i32_pkcs1_sign.c +37 -0
  414. package/runtime/third_party/bearssl/src/rsa/rsa_i32_pkcs1_vrfy.c +43 -0
  415. package/runtime/third_party/bearssl/src/rsa/rsa_i32_priv.c +160 -0
  416. package/runtime/third_party/bearssl/src/rsa/rsa_i32_pss_sign.c +40 -0
  417. package/runtime/third_party/bearssl/src/rsa/rsa_i32_pss_vrfy.c +44 -0
  418. package/runtime/third_party/bearssl/src/rsa/rsa_i32_pub.c +77 -0
  419. package/runtime/third_party/bearssl/src/rsa/rsa_i62_keygen.c +57 -0
  420. package/runtime/third_party/bearssl/src/rsa/rsa_i62_oaep_decrypt.c +61 -0
  421. package/runtime/third_party/bearssl/src/rsa/rsa_i62_oaep_encrypt.c +64 -0
  422. package/runtime/third_party/bearssl/src/rsa/rsa_i62_pkcs1_sign.c +57 -0
  423. package/runtime/third_party/bearssl/src/rsa/rsa_i62_pkcs1_vrfy.c +63 -0
  424. package/runtime/third_party/bearssl/src/rsa/rsa_i62_priv.c +223 -0
  425. package/runtime/third_party/bearssl/src/rsa/rsa_i62_pss_sign.c +60 -0
  426. package/runtime/third_party/bearssl/src/rsa/rsa_i62_pss_vrfy.c +64 -0
  427. package/runtime/third_party/bearssl/src/rsa/rsa_i62_pub.c +125 -0
  428. package/runtime/third_party/bearssl/src/rsa/rsa_oaep_pad.c +112 -0
  429. package/runtime/third_party/bearssl/src/rsa/rsa_oaep_unpad.c +145 -0
  430. package/runtime/third_party/bearssl/src/rsa/rsa_pkcs1_sig_pad.c +100 -0
  431. package/runtime/third_party/bearssl/src/rsa/rsa_pkcs1_sig_unpad.c +121 -0
  432. package/runtime/third_party/bearssl/src/rsa/rsa_pss_sig_pad.c +106 -0
  433. package/runtime/third_party/bearssl/src/rsa/rsa_pss_sig_unpad.c +121 -0
  434. package/runtime/third_party/bearssl/src/rsa/rsa_ssl_decrypt.c +52 -0
  435. package/runtime/third_party/bearssl/src/settings.c +306 -0
  436. package/runtime/third_party/bearssl/src/symcipher/aes_big_cbcdec.c +69 -0
  437. package/runtime/third_party/bearssl/src/symcipher/aes_big_cbcenc.c +67 -0
  438. package/runtime/third_party/bearssl/src/symcipher/aes_big_ctr.c +84 -0
  439. package/runtime/third_party/bearssl/src/symcipher/aes_big_ctrcbc.c +142 -0
  440. package/runtime/third_party/bearssl/src/symcipher/aes_big_dec.c +254 -0
  441. package/runtime/third_party/bearssl/src/symcipher/aes_big_enc.c +157 -0
  442. package/runtime/third_party/bearssl/src/symcipher/aes_common.c +112 -0
  443. package/runtime/third_party/bearssl/src/symcipher/aes_ct.c +328 -0
  444. package/runtime/third_party/bearssl/src/symcipher/aes_ct64.c +398 -0
  445. package/runtime/third_party/bearssl/src/symcipher/aes_ct64_cbcdec.c +104 -0
  446. package/runtime/third_party/bearssl/src/symcipher/aes_ct64_cbcenc.c +81 -0
  447. package/runtime/third_party/bearssl/src/symcipher/aes_ct64_ctr.c +114 -0
  448. package/runtime/third_party/bearssl/src/symcipher/aes_ct64_ctrcbc.c +433 -0
  449. package/runtime/third_party/bearssl/src/symcipher/aes_ct64_dec.c +159 -0
  450. package/runtime/third_party/bearssl/src/symcipher/aes_ct64_enc.c +115 -0
  451. package/runtime/third_party/bearssl/src/symcipher/aes_ct_cbcdec.c +111 -0
  452. package/runtime/third_party/bearssl/src/symcipher/aes_ct_cbcenc.c +91 -0
  453. package/runtime/third_party/bearssl/src/symcipher/aes_ct_ctr.c +116 -0
  454. package/runtime/third_party/bearssl/src/symcipher/aes_ct_ctrcbc.c +422 -0
  455. package/runtime/third_party/bearssl/src/symcipher/aes_ct_dec.c +170 -0
  456. package/runtime/third_party/bearssl/src/symcipher/aes_ct_enc.c +112 -0
  457. package/runtime/third_party/bearssl/src/symcipher/aes_pwr8.c +445 -0
  458. package/runtime/third_party/bearssl/src/symcipher/aes_pwr8_cbcdec.c +670 -0
  459. package/runtime/third_party/bearssl/src/symcipher/aes_pwr8_cbcenc.c +417 -0
  460. package/runtime/third_party/bearssl/src/symcipher/aes_pwr8_ctr.c +717 -0
  461. package/runtime/third_party/bearssl/src/symcipher/aes_pwr8_ctrcbc.c +946 -0
  462. package/runtime/third_party/bearssl/src/symcipher/aes_small_cbcdec.c +69 -0
  463. package/runtime/third_party/bearssl/src/symcipher/aes_small_cbcenc.c +67 -0
  464. package/runtime/third_party/bearssl/src/symcipher/aes_small_ctr.c +84 -0
  465. package/runtime/third_party/bearssl/src/symcipher/aes_small_ctrcbc.c +142 -0
  466. package/runtime/third_party/bearssl/src/symcipher/aes_small_dec.c +176 -0
  467. package/runtime/third_party/bearssl/src/symcipher/aes_small_enc.c +129 -0
  468. package/runtime/third_party/bearssl/src/symcipher/aes_x86ni.c +240 -0
  469. package/runtime/third_party/bearssl/src/symcipher/aes_x86ni_cbcdec.c +223 -0
  470. package/runtime/third_party/bearssl/src/symcipher/aes_x86ni_cbcenc.c +122 -0
  471. package/runtime/third_party/bearssl/src/symcipher/aes_x86ni_ctr.c +211 -0
  472. package/runtime/third_party/bearssl/src/symcipher/aes_x86ni_ctrcbc.c +596 -0
  473. package/runtime/third_party/bearssl/src/symcipher/chacha20_ct.c +106 -0
  474. package/runtime/third_party/bearssl/src/symcipher/chacha20_sse2.c +237 -0
  475. package/runtime/third_party/bearssl/src/symcipher/des_ct.c +411 -0
  476. package/runtime/third_party/bearssl/src/symcipher/des_ct_cbcdec.c +87 -0
  477. package/runtime/third_party/bearssl/src/symcipher/des_ct_cbcenc.c +69 -0
  478. package/runtime/third_party/bearssl/src/symcipher/des_support.c +166 -0
  479. package/runtime/third_party/bearssl/src/symcipher/des_tab.c +310 -0
  480. package/runtime/third_party/bearssl/src/symcipher/des_tab_cbcdec.c +85 -0
  481. package/runtime/third_party/bearssl/src/symcipher/des_tab_cbcenc.c +67 -0
  482. package/runtime/third_party/bearssl/src/symcipher/poly1305_ctmul.c +260 -0
  483. package/runtime/third_party/bearssl/src/symcipher/poly1305_ctmul32.c +297 -0
  484. package/runtime/third_party/bearssl/src/symcipher/poly1305_ctmulq.c +475 -0
  485. package/runtime/third_party/bearssl/src/symcipher/poly1305_i15.c +221 -0
  486. package/runtime/third_party/bearssl/src/x509/asn1.t0 +757 -0
  487. package/runtime/third_party/bearssl/src/x509/asn1enc.c +93 -0
  488. package/runtime/third_party/bearssl/src/x509/encode_ec_pk8der.c +110 -0
  489. package/runtime/third_party/bearssl/src/x509/encode_ec_rawder.c +161 -0
  490. package/runtime/third_party/bearssl/src/x509/encode_rsa_pk8der.c +97 -0
  491. package/runtime/third_party/bearssl/src/x509/encode_rsa_rawder.c +96 -0
  492. package/runtime/third_party/bearssl/src/x509/skey_decoder.c +653 -0
  493. package/runtime/third_party/bearssl/src/x509/skey_decoder.t0 +376 -0
  494. package/runtime/third_party/bearssl/src/x509/x509_decoder.c +776 -0
  495. package/runtime/third_party/bearssl/src/x509/x509_decoder.t0 +324 -0
  496. package/runtime/third_party/bearssl/src/x509/x509_knownkey.c +105 -0
  497. package/runtime/third_party/bearssl/src/x509/x509_minimal.c +1722 -0
  498. package/runtime/third_party/bearssl/src/x509/x509_minimal.t0 +1526 -0
  499. package/runtime/third_party/bearssl/src/x509/x509_minimal_full.c +59 -0
  500. package/runtime/third_party/quickjs-dtoa/LICENSE +22 -0
  501. package/runtime/third_party/quickjs-dtoa/README.md +23 -0
  502. package/runtime/third_party/quickjs-dtoa/dtoa.c +1640 -0
  503. package/runtime/third_party/quickjs-dtoa/dtoa.h +83 -0
  504. package/runtime/third_party/quickjs-dtoa/dtoa_compat.h +89 -0
  505. package/runtime/third_party/quickjs-regexp/LICENSE +22 -0
  506. package/runtime/third_party/quickjs-regexp/README.md +22 -0
  507. package/runtime/third_party/quickjs-regexp/cutils.c +641 -0
  508. package/runtime/third_party/quickjs-regexp/cutils.h +457 -0
  509. package/runtime/third_party/quickjs-regexp/libregexp-opcode.h +73 -0
  510. package/runtime/third_party/quickjs-regexp/libregexp.c +3448 -0
  511. package/runtime/third_party/quickjs-regexp/libregexp.h +65 -0
  512. package/runtime/third_party/quickjs-regexp/libunicode-table.h +5206 -0
  513. package/runtime/third_party/quickjs-regexp/libunicode.c +2124 -0
  514. package/runtime/third_party/quickjs-regexp/libunicode.h +196 -0
  515. package/runtime/third_party/v8-ieee754/LICENSE +61 -0
  516. package/runtime/third_party/v8-ieee754/README.md +22 -0
  517. package/runtime/third_party/v8-ieee754/convert.py +84 -0
  518. package/runtime/third_party/v8-ieee754/ieee754.c +3030 -0
  519. package/runtime/third_party/v8-ieee754/ieee754.h +27 -0
  520. package/runtime/tools/regexp_compile.c +90 -0
@@ -0,0 +1,794 @@
1
+ /* Asymmetric keys (ADR 0018): RSA, RSA-PSS, EC (P-256, P-384, P-521) and X25519 keys in the key
2
+ * record (crypto_internal.h), their DER encodings (SPKI, PKCS#8, PKCS#1, SEC1, and the public key
3
+ * of an X.509 certificate) with a small DER reader and writer of our own, and their generation on
4
+ * BearSSL. node:crypto's KeyObject is built on the primitives at the end; Web Crypto's keys share
5
+ * the record. PEM and JWK are the prelude's (base64 in JS), over the DER and the parts here. */
6
+ #include <stdlib.h>
7
+ #include <string.h>
8
+
9
+ #include "builtins_util.h"
10
+ #include "crypto_internal.h"
11
+ #include "internal.h"
12
+ #include "js_buffer.h"
13
+ #include "js_crypto.h"
14
+ #include "js_exception.h"
15
+ #include "js_ops.h"
16
+ #include "js_web.h"
17
+ #include "jscontext.h"
18
+ #include "jsstring.h"
19
+
20
+ /* ---- DER ---------------------------------------------------------------------------------------- */
21
+
22
+ enum { DER_INT = 0x02, DER_BIT_STRING = 0x03, DER_OCTET_STRING = 0x04, DER_NULL = 0x05, DER_OID = 0x06, DER_SEQ = 0x30 };
23
+ #define DER_CTX(n) (0xA0 | (n)) /* [n], constructed */
24
+
25
+ typedef struct Der {
26
+ const uint8_t *p;
27
+ size_t n;
28
+ } Der;
29
+
30
+ /* The next TLV of `in` (definite lengths only), its tag and contents. */
31
+ static bool der_read(Der *in, uint8_t *tag, Der *content) {
32
+ if (in->n < 2) return false;
33
+ *tag = in->p[0];
34
+ size_t len = in->p[1], at = 2;
35
+ if (len & 0x80) {
36
+ size_t bytes = len & 0x7F;
37
+ if (bytes == 0 || bytes > 4 || in->n < 2 + bytes) return false;
38
+ len = 0;
39
+ for (size_t i = 0; i < bytes; i++) len = len << 8 | in->p[2 + i];
40
+ at += bytes;
41
+ }
42
+ if (in->n - at < len) return false;
43
+ content->p = in->p + at;
44
+ content->n = len;
45
+ in->p += at + len;
46
+ in->n -= at + len;
47
+ return true;
48
+ }
49
+
50
+ static bool der_expect(Der *in, uint8_t want, Der *content) {
51
+ uint8_t tag;
52
+ Der save = *in;
53
+ if (!der_read(in, &tag, content) || tag != want) {
54
+ *in = save;
55
+ return false;
56
+ }
57
+ return true;
58
+ }
59
+
60
+ /* An optional [n]: read when it is next. */
61
+ static bool der_optional(Der *in, uint8_t want, Der *content) {
62
+ if (in->n == 0 || in->p[0] != want) return false;
63
+ return der_expect(in, want, content);
64
+ }
65
+
66
+ /* A non-negative INTEGER's magnitude, without its leading zeros. */
67
+ static bool der_uint(Der *in, Der *v) {
68
+ if (!der_expect(in, DER_INT, v) || v->n == 0 || (v->p[0] & 0x80)) return false;
69
+ while (v->n > 1 && v->p[0] == 0) v->p++, v->n--;
70
+ return true;
71
+ }
72
+
73
+ static bool der_small_uint(Der *in, uint32_t *out) {
74
+ Der v;
75
+ if (!der_uint(in, &v) || v.n > 4) return false;
76
+ *out = 0;
77
+ for (size_t i = 0; i < v.n; i++) *out = *out << 8 | v.p[i];
78
+ return true;
79
+ }
80
+
81
+ static bool der_oid_is(Der oid, const uint8_t *want, size_t n) { return oid.n == n && memcmp(oid.p, want, n) == 0; }
82
+
83
+ /* The writer: TLVs appended to a buffer; a constructed one is built in its own and wrapped. */
84
+ static void w_raw(JSBytesOut *o, const uint8_t *p, size_t n) {
85
+ if (o->n + n > o->cap) {
86
+ size_t cap = o->cap ? o->cap : 128;
87
+ while (cap < o->n + n) cap *= 2;
88
+ uint8_t *q = realloc(o->p, cap);
89
+ if (!q) js_fatal("out of memory in crypto");
90
+ o->p = q;
91
+ o->cap = cap;
92
+ }
93
+ if (n) memcpy(o->p + o->n, p, n);
94
+ o->n += n;
95
+ }
96
+
97
+ static void w_tlv(JSBytesOut *o, uint8_t tag, const uint8_t *p, size_t n) {
98
+ uint8_t h[6];
99
+ size_t k = 0;
100
+ h[k++] = tag;
101
+ if (n < 0x80) h[k++] = (uint8_t)n;
102
+ else if (n < 0x100) h[k++] = 0x81, h[k++] = (uint8_t)n;
103
+ else if (n < 0x10000) h[k++] = 0x82, h[k++] = (uint8_t)(n >> 8), h[k++] = (uint8_t)n;
104
+ else h[k++] = 0x83, h[k++] = (uint8_t)(n >> 16), h[k++] = (uint8_t)(n >> 8), h[k++] = (uint8_t)n;
105
+ w_raw(o, h, k);
106
+ w_raw(o, p, n);
107
+ }
108
+
109
+ /* Wraps `inner` (freed) as one TLV of `o`. */
110
+ static void w_wrap(JSBytesOut *o, uint8_t tag, JSBytesOut *inner) {
111
+ w_tlv(o, tag, inner->p, inner->n);
112
+ free(inner->p);
113
+ memset(inner, 0, sizeof *inner);
114
+ }
115
+
116
+ /* An unsigned big-endian integer: minimal, a zero byte in front when the high bit is set. */
117
+ static void w_uint(JSBytesOut *o, const uint8_t *p, size_t n) {
118
+ while (n > 1 && p[0] == 0) p++, n--;
119
+ if (n == 0) {
120
+ static const uint8_t zero = 0;
121
+ w_tlv(o, DER_INT, &zero, 1);
122
+ return;
123
+ }
124
+ if (p[0] & 0x80) {
125
+ uint8_t *t = malloc(n + 1);
126
+ if (!t) js_fatal("out of memory in crypto");
127
+ t[0] = 0;
128
+ memcpy(t + 1, p, n);
129
+ w_tlv(o, DER_INT, t, n + 1);
130
+ free(t);
131
+ } else {
132
+ w_tlv(o, DER_INT, p, n);
133
+ }
134
+ }
135
+
136
+ static void w_small_uint(JSBytesOut *o, uint32_t v) {
137
+ uint8_t b[4] = { (uint8_t)(v >> 24), (uint8_t)(v >> 16), (uint8_t)(v >> 8), (uint8_t)v };
138
+ w_uint(o, b, 4);
139
+ }
140
+
141
+ /* ---- Identifiers ------------------------------------------------------------------------------- */
142
+
143
+ static const uint8_t OID_RSA[] = { 0x2A, 0x86, 0x48, 0x86, 0xF7, 0x0D, 0x01, 0x01, 0x01 };
144
+ static const uint8_t OID_RSA_PSS[] = { 0x2A, 0x86, 0x48, 0x86, 0xF7, 0x0D, 0x01, 0x01, 0x0A };
145
+ static const uint8_t OID_MGF1[] = { 0x2A, 0x86, 0x48, 0x86, 0xF7, 0x0D, 0x01, 0x01, 0x08 };
146
+ static const uint8_t OID_EC[] = { 0x2A, 0x86, 0x48, 0xCE, 0x3D, 0x02, 0x01 };
147
+ static const uint8_t OID_X25519[] = { 0x2B, 0x65, 0x6E };
148
+
149
+ static const struct {
150
+ int curve; /* BR_EC_* */
151
+ const char *name; /* Node's (OpenSSL's) */
152
+ const char *jwk; /* JWK's crv */
153
+ uint8_t size; /* bytes of a coordinate or scalar */
154
+ uint8_t oid_len;
155
+ const uint8_t *oid;
156
+ } CURVES[] = {
157
+ { BR_EC_secp256r1, "prime256v1", "P-256", 32, 8, (const uint8_t *)"\x2A\x86\x48\xCE\x3D\x03\x01\x07" },
158
+ { BR_EC_secp384r1, "secp384r1", "P-384", 48, 5, (const uint8_t *)"\x2B\x81\x04\x00\x22" },
159
+ { BR_EC_secp521r1, "secp521r1", "P-521", 66, 5, (const uint8_t *)"\x2B\x81\x04\x00\x23" },
160
+ };
161
+
162
+ static int curve_index(int curve) {
163
+ for (int i = 0; i < (int)JS_COUNTOF(CURVES); i++)
164
+ if (CURVES[i].curve == curve) return i;
165
+ return -1;
166
+ }
167
+
168
+ static int curve_by_oid(Der oid) {
169
+ for (int i = 0; i < (int)JS_COUNTOF(CURVES); i++)
170
+ if (der_oid_is(oid, CURVES[i].oid, CURVES[i].oid_len)) return CURVES[i].curve;
171
+ return -1;
172
+ }
173
+
174
+ /* The hash of a DER AlgorithmIdentifier's OID (the JSHashAlg's, which is length-prefixed). */
175
+ static const JSHashAlg *hash_by_oid(Der oid) {
176
+ static const char *const names[] = { "sha1", "sha224", "sha256", "sha384", "sha512", "sha512-224", "sha512-256", "md5" };
177
+ for (size_t i = 0; i < JS_COUNTOF(names); i++) {
178
+ const JSHashAlg *h = js_hash_by_name(names[i]);
179
+ if (h->oid && der_oid_is(oid, h->oid + 1, h->oid[0])) return h;
180
+ }
181
+ return NULL;
182
+ }
183
+
184
+ /* ---- Errors (the prelude words them, as Node's do) --------------------------------------------- */
185
+
186
+ enum {
187
+ KEY_ERR_DECODE = 1, /* not a key the decoder takes: "DECODER routines::unsupported" */
188
+ KEY_ERR_TAG, /* bad DER: "asn1 encoding routines::wrong tag" */
189
+ KEY_ERR_KEY_TYPE, /* a key type BearSSL doesn't have (Ed25519, DSA, …) */
190
+ KEY_ERR_ENCODING, /* an encoding the key's type can't have (pkcs1 of an EC key) */
191
+ KEY_ERR_GENERATE, /* parameters key generation rejects */
192
+ };
193
+
194
+ /* ---- The key's parts ---------------------------------------------------------------------------- */
195
+
196
+ static void set_part(JSKeyData *k, int i, Der v) { js_key_part_set(&k->part[i], v.p, v.n); }
197
+
198
+ /* A scalar or coordinate in a fixed size (zeros in front). */
199
+ static void set_part_fixed(JSKeyData *k, int i, const uint8_t *p, size_t n, size_t size) {
200
+ while (n > size && p[0] == 0) p++, n--;
201
+ uint8_t buf[66] = { 0 };
202
+ if (n > size) n = size;
203
+ memcpy(buf + size - n, p, n);
204
+ js_key_part_set(&k->part[i], buf, size);
205
+ }
206
+
207
+ /* A private scalar as BearSSL takes it: X25519's reversed (BearSSL reads Curve25519 scalars
208
+ * big-endian; RFC 7748, OpenSSL and Node keep them little-endian, as the key record does). */
209
+ void js_ec_scalar_for_bearssl(const JSKeyData *k, uint8_t *out) {
210
+ const JSKeyPart *x = &k->part[JS_EC_PRIV];
211
+ for (size_t i = 0; i < x->n; i++) out[i] = k->curve == BR_EC_curve25519 ? x->p[x->n - 1 - i] : x->p[i];
212
+ }
213
+
214
+ /* The EC public point from the private scalar. */
215
+ static bool ec_compute_pub(JSKeyData *k) {
216
+ uint8_t scalar[66];
217
+ js_ec_scalar_for_bearssl(k, scalar);
218
+ br_ec_private_key sk = { k->curve, scalar, k->part[JS_EC_PRIV].n };
219
+ uint8_t pub[BR_EC_KBUF_PUB_MAX_SIZE];
220
+ br_ec_public_key pk;
221
+ size_t n = br_ec_compute_pub(br_ec_get_default(), &pk, pub, &sk);
222
+ if (!n) return false;
223
+ js_key_part_set(&k->part[JS_EC_PUB], pk.q, pk.qlen);
224
+ return true;
225
+ }
226
+
227
+ /* ---- Decoding ----------------------------------------------------------------------------------- */
228
+
229
+ /* RSASSA-PSS-params: present (true) or absent; their fields, with the defaults. */
230
+ static bool pss_params(JSKeyData *k, Der params) {
231
+ Der seq, f, alg, oid;
232
+ if (!der_expect(&params, DER_SEQ, &seq)) return false;
233
+ k->pss_params = true;
234
+ k->pss_hash = js_hash_by_name("sha1");
235
+ k->pss_mgf1 = k->pss_hash;
236
+ k->pss_salt = 20;
237
+ if (der_optional(&seq, DER_CTX(0), &f)) {
238
+ if (!der_expect(&f, DER_SEQ, &alg) || !der_expect(&alg, DER_OID, &oid) || !(k->pss_hash = hash_by_oid(oid))) return false;
239
+ }
240
+ if (der_optional(&seq, DER_CTX(1), &f)) {
241
+ Der mgf, inner;
242
+ if (!der_expect(&f, DER_SEQ, &mgf) || !der_expect(&mgf, DER_OID, &oid) || !der_oid_is(oid, OID_MGF1, sizeof OID_MGF1)) return false;
243
+ if (!der_expect(&mgf, DER_SEQ, &inner) || !der_expect(&inner, DER_OID, &oid) || !(k->pss_mgf1 = hash_by_oid(oid))) return false;
244
+ }
245
+ if (der_optional(&seq, DER_CTX(2), &f) && !der_small_uint(&f, &k->pss_salt)) return false;
246
+ return true;
247
+ }
248
+
249
+ /* An AlgorithmIdentifier: the kind (and curve, PSS parameters) into k. */
250
+ static int algorithm_identifier(JSKeyData *k, Der alg_seq) {
251
+ Der oid;
252
+ if (!der_expect(&alg_seq, DER_OID, &oid)) return KEY_ERR_TAG;
253
+ if (der_oid_is(oid, OID_RSA, sizeof OID_RSA)) {
254
+ k->kind = JS_ASYM_RSA;
255
+ } else if (der_oid_is(oid, OID_RSA_PSS, sizeof OID_RSA_PSS)) {
256
+ k->kind = JS_ASYM_RSA_PSS;
257
+ if (alg_seq.n && !pss_params(k, alg_seq)) return KEY_ERR_TAG;
258
+ } else if (der_oid_is(oid, OID_EC, sizeof OID_EC)) {
259
+ Der curve;
260
+ k->kind = JS_ASYM_EC;
261
+ if (!der_expect(&alg_seq, DER_OID, &curve)) return KEY_ERR_TAG;
262
+ k->curve = curve_by_oid(curve);
263
+ if (k->curve < 0) return KEY_ERR_KEY_TYPE;
264
+ } else if (der_oid_is(oid, OID_X25519, sizeof OID_X25519)) {
265
+ k->kind = JS_ASYM_X25519;
266
+ k->curve = BR_EC_curve25519;
267
+ } else {
268
+ return KEY_ERR_KEY_TYPE;
269
+ }
270
+ return 0;
271
+ }
272
+
273
+ /* RSAPublicKey (PKCS#1) */
274
+ static int rsa_public(JSKeyData *k, Der in) {
275
+ Der seq, n, e;
276
+ if (!der_expect(&in, DER_SEQ, &seq) || !der_uint(&seq, &n) || !der_uint(&seq, &e)) return KEY_ERR_TAG;
277
+ set_part(k, JS_RSA_N, n);
278
+ set_part(k, JS_RSA_E, e);
279
+ return 0;
280
+ }
281
+
282
+ /* RSAPrivateKey (PKCS#1) */
283
+ static int rsa_private(JSKeyData *k, Der in) {
284
+ Der seq, v;
285
+ uint32_t version;
286
+ if (!der_expect(&in, DER_SEQ, &seq) || !der_small_uint(&seq, &version)) return KEY_ERR_TAG;
287
+ for (int i = 0; i < 8; i++) {
288
+ if (!der_uint(&seq, &v)) return KEY_ERR_TAG;
289
+ set_part(k, i, v);
290
+ }
291
+ return 0;
292
+ }
293
+
294
+ /* ECPrivateKey (SEC1): the curve from its parameters, or the one already known. */
295
+ static int ec_private(JSKeyData *k, Der in) {
296
+ Der seq, d, f, oid, pub;
297
+ uint32_t version;
298
+ if (!der_expect(&in, DER_SEQ, &seq) || !der_small_uint(&seq, &version) || !der_expect(&seq, DER_OCTET_STRING, &d)) return KEY_ERR_TAG;
299
+ if (der_optional(&seq, DER_CTX(0), &f)) {
300
+ if (!der_expect(&f, DER_OID, &oid)) return KEY_ERR_TAG;
301
+ k->curve = curve_by_oid(oid);
302
+ }
303
+ int ci = curve_index(k->curve);
304
+ if (ci < 0) return KEY_ERR_KEY_TYPE;
305
+ k->kind = JS_ASYM_EC;
306
+ set_part_fixed(k, JS_EC_PRIV, d.p, d.n, CURVES[ci].size);
307
+ if (der_optional(&seq, DER_CTX(1), &f) && der_expect(&f, DER_BIT_STRING, &pub) && pub.n > 1 && pub.p[0] == 0) {
308
+ js_key_part_set(&k->part[JS_EC_PUB], pub.p + 1, pub.n - 1);
309
+ return 0;
310
+ }
311
+ return ec_compute_pub(k) ? 0 : KEY_ERR_TAG;
312
+ }
313
+
314
+ /* SubjectPublicKeyInfo */
315
+ static int spki(JSKeyData *k, Der in) {
316
+ Der seq, alg, bits;
317
+ if (!der_expect(&in, DER_SEQ, &seq) || !der_expect(&seq, DER_SEQ, &alg)) return KEY_ERR_TAG;
318
+ int e = algorithm_identifier(k, alg);
319
+ if (e) return e;
320
+ if (!der_expect(&seq, DER_BIT_STRING, &bits) || bits.n < 1 || bits.p[0] != 0) return KEY_ERR_TAG;
321
+ Der key = { bits.p + 1, bits.n - 1 };
322
+ if (k->kind == JS_ASYM_RSA || k->kind == JS_ASYM_RSA_PSS) return rsa_public(k, key);
323
+ if (k->kind == JS_ASYM_X25519 && key.n != 32) return KEY_ERR_TAG;
324
+ if (k->kind == JS_ASYM_EC && (key.n != 1 + 2u * CURVES[curve_index(k->curve)].size || key.p[0] != 4)) return KEY_ERR_TAG;
325
+ js_key_part_set(&k->part[JS_EC_PUB], key.p, key.n);
326
+ return 0;
327
+ }
328
+
329
+ /* PrivateKeyInfo (PKCS#8) */
330
+ static int pkcs8(JSKeyData *k, Der in) {
331
+ Der seq, alg, priv;
332
+ uint32_t version;
333
+ if (!der_expect(&in, DER_SEQ, &seq) || !der_small_uint(&seq, &version) || !der_expect(&seq, DER_SEQ, &alg)) return KEY_ERR_TAG;
334
+ int e = algorithm_identifier(k, alg);
335
+ if (e) return e;
336
+ if (!der_expect(&seq, DER_OCTET_STRING, &priv)) return KEY_ERR_TAG;
337
+ switch (k->kind) {
338
+ case JS_ASYM_RSA:
339
+ case JS_ASYM_RSA_PSS:
340
+ return rsa_private(k, priv);
341
+ case JS_ASYM_EC:
342
+ return ec_private(k, priv);
343
+ default: {
344
+ Der scalar;
345
+ if (!der_expect(&priv, DER_OCTET_STRING, &scalar) || scalar.n != 32) return KEY_ERR_TAG;
346
+ js_key_part_set(&k->part[JS_EC_PRIV], scalar.p, 32);
347
+ return ec_compute_pub(k) ? 0 : KEY_ERR_TAG;
348
+ }
349
+ }
350
+ }
351
+
352
+ /* An X.509 certificate's subjectPublicKeyInfo. */
353
+ static int certificate(JSKeyData *k, Der in) {
354
+ Der cert, tbs, f;
355
+ if (!der_expect(&in, DER_SEQ, &cert) || !der_expect(&cert, DER_SEQ, &tbs)) return KEY_ERR_TAG;
356
+ der_optional(&tbs, DER_CTX(0), &f); /* version */
357
+ uint8_t tag;
358
+ for (int i = 0; i < 5; i++) /* serialNumber, signature, issuer, validity, subject */
359
+ if (!der_read(&tbs, &tag, &f)) return KEY_ERR_TAG;
360
+ Der spki_tlv = tbs;
361
+ if (!der_read(&tbs, &tag, &f)) return KEY_ERR_TAG;
362
+ spki_tlv.n = (size_t)(tbs.p - spki_tlv.p);
363
+ return spki(k, spki_tlv);
364
+ }
365
+
366
+ /* ---- Encoding ----------------------------------------------------------------------------------- */
367
+
368
+ static void w_hash_alg(JSBytesOut *o, const JSHashAlg *h) {
369
+ JSBytesOut a = { 0 };
370
+ w_tlv(&a, DER_OID, h->oid + 1, h->oid[0]);
371
+ w_tlv(&a, DER_NULL, NULL, 0);
372
+ w_wrap(o, DER_SEQ, &a);
373
+ }
374
+
375
+ /* The key's AlgorithmIdentifier. */
376
+ static void w_algorithm(JSBytesOut *o, const JSKeyData *k) {
377
+ JSBytesOut a = { 0 };
378
+ switch (k->kind) {
379
+ case JS_ASYM_RSA:
380
+ w_tlv(&a, DER_OID, OID_RSA, sizeof OID_RSA);
381
+ w_tlv(&a, DER_NULL, NULL, 0);
382
+ break;
383
+ case JS_ASYM_RSA_PSS:
384
+ w_tlv(&a, DER_OID, OID_RSA_PSS, sizeof OID_RSA_PSS);
385
+ if (k->pss_params) { /* the fields that aren't their defaults, as OpenSSL writes them */
386
+ JSBytesOut p = { 0 }, f = { 0 };
387
+ const JSHashAlg *sha1 = js_hash_by_name("sha1");
388
+ if (k->pss_hash != sha1) {
389
+ w_hash_alg(&f, k->pss_hash);
390
+ w_wrap(&p, DER_CTX(0), &f);
391
+ }
392
+ if (k->pss_mgf1 != sha1) {
393
+ JSBytesOut m = { 0 };
394
+ w_tlv(&m, DER_OID, OID_MGF1, sizeof OID_MGF1);
395
+ w_hash_alg(&m, k->pss_mgf1);
396
+ w_wrap(&f, DER_SEQ, &m);
397
+ w_wrap(&p, DER_CTX(1), &f);
398
+ }
399
+ if (k->pss_salt != 20) {
400
+ w_small_uint(&f, k->pss_salt);
401
+ w_wrap(&p, DER_CTX(2), &f);
402
+ }
403
+ w_wrap(&a, DER_SEQ, &p);
404
+ }
405
+ break;
406
+ case JS_ASYM_EC: {
407
+ int ci = curve_index(k->curve);
408
+ w_tlv(&a, DER_OID, OID_EC, sizeof OID_EC);
409
+ w_tlv(&a, DER_OID, CURVES[ci].oid, CURVES[ci].oid_len);
410
+ break;
411
+ }
412
+ default:
413
+ w_tlv(&a, DER_OID, OID_X25519, sizeof OID_X25519);
414
+ break;
415
+ }
416
+ w_wrap(o, DER_SEQ, &a);
417
+ }
418
+
419
+ static void w_rsa_public(JSBytesOut *o, const JSKeyData *k) {
420
+ JSBytesOut s = { 0 };
421
+ w_uint(&s, k->part[JS_RSA_N].p, k->part[JS_RSA_N].n);
422
+ w_uint(&s, k->part[JS_RSA_E].p, k->part[JS_RSA_E].n);
423
+ w_wrap(o, DER_SEQ, &s);
424
+ }
425
+
426
+ static void w_rsa_private(JSBytesOut *o, const JSKeyData *k) {
427
+ JSBytesOut s = { 0 };
428
+ w_small_uint(&s, 0);
429
+ for (int i = 0; i < 8; i++) w_uint(&s, k->part[i].p, k->part[i].n);
430
+ w_wrap(o, DER_SEQ, &s);
431
+ }
432
+
433
+ /* ECPrivateKey, with its parameters (SEC1's form) or without (inside PKCS#8, as OpenSSL writes it) */
434
+ static void w_ec_private(JSBytesOut *o, const JSKeyData *k, bool with_params) {
435
+ JSBytesOut s = { 0 }, f = { 0 };
436
+ w_small_uint(&s, 1);
437
+ w_tlv(&s, DER_OCTET_STRING, k->part[JS_EC_PRIV].p, k->part[JS_EC_PRIV].n);
438
+ if (with_params) {
439
+ int ci = curve_index(k->curve);
440
+ w_tlv(&f, DER_OID, CURVES[ci].oid, CURVES[ci].oid_len);
441
+ w_wrap(&s, DER_CTX(0), &f);
442
+ }
443
+ JSBytesOut bits = { 0 };
444
+ static const uint8_t unused = 0;
445
+ w_raw(&bits, &unused, 1);
446
+ w_raw(&bits, k->part[JS_EC_PUB].p, k->part[JS_EC_PUB].n);
447
+ w_tlv(&f, DER_BIT_STRING, bits.p, bits.n);
448
+ free(bits.p);
449
+ w_wrap(&s, DER_CTX(1), &f);
450
+ w_wrap(o, DER_SEQ, &s);
451
+ }
452
+
453
+ static void w_spki(JSBytesOut *o, const JSKeyData *k) {
454
+ JSBytesOut s = { 0 }, key = { 0 };
455
+ w_algorithm(&s, k);
456
+ static const uint8_t unused = 0;
457
+ w_raw(&key, &unused, 1);
458
+ if (k->kind == JS_ASYM_RSA || k->kind == JS_ASYM_RSA_PSS) w_rsa_public(&key, k);
459
+ else w_raw(&key, k->part[JS_EC_PUB].p, k->part[JS_EC_PUB].n);
460
+ w_tlv(&s, DER_BIT_STRING, key.p, key.n);
461
+ free(key.p);
462
+ w_wrap(o, DER_SEQ, &s);
463
+ }
464
+
465
+ static void w_pkcs8(JSBytesOut *o, const JSKeyData *k) {
466
+ JSBytesOut s = { 0 }, priv = { 0 };
467
+ w_small_uint(&s, 0);
468
+ w_algorithm(&s, k);
469
+ if (k->kind == JS_ASYM_RSA || k->kind == JS_ASYM_RSA_PSS) w_rsa_private(&priv, k);
470
+ else if (k->kind == JS_ASYM_EC) w_ec_private(&priv, k, false);
471
+ else w_tlv(&priv, DER_OCTET_STRING, k->part[JS_EC_PRIV].p, k->part[JS_EC_PRIV].n);
472
+ w_wrap(&s, DER_OCTET_STRING, &priv);
473
+ w_wrap(o, DER_SEQ, &s);
474
+ }
475
+
476
+ /* BearSSL's limit on RSA moduli (its private BR_MAX_RSA_SIZE) */
477
+ #define RSA_MAX_BITS 4096
478
+
479
+ /* ---- The handle's primitives -------------------------------------------------------------------- */
480
+
481
+ #define PRIMITIVE(fn) \
482
+ JSValue fn(JSContext *ctx, JSValue callee, JSValue this_val, uint32_t argc, const JSValue *argv, JSValue new_target)
483
+ #define UNUSED_PRIMITIVE_ARGS (void)callee, (void)this_val, (void)new_target
484
+
485
+ /* The encodings, by the code the prelude passes */
486
+ enum { ENC_SPKI, ENC_PKCS1, ENC_PKCS8, ENC_SEC1, ENC_CERT };
487
+
488
+ static JSKeyData *key_arg(JSContext *ctx, JSValue v) {
489
+ JSKeyData *k = js_key_data(v);
490
+ if (!k) js_discard(js_throw_type_error(ctx, "crypto: a key handle expected"));
491
+ return k;
492
+ }
493
+
494
+ int js_key_parse_der(JSContext *ctx, const uint8_t *p, size_t n, int enc, bool priv, JSValue *out) {
495
+ JSKeyData *k = js_new_asym_key(ctx, priv ? JS_KEY_PRIVATE : JS_KEY_PUBLIC, JS_ASYM_NONE);
496
+ Der in = { p, n };
497
+ int e;
498
+ switch (enc) {
499
+ case ENC_SPKI: e = spki(k, in); break;
500
+ case ENC_PKCS8: e = pkcs8(k, in); break;
501
+ case ENC_SEC1: k->curve = -1; e = ec_private(k, in); break;
502
+ case ENC_CERT: e = certificate(k, in); break;
503
+ default:
504
+ k->kind = JS_ASYM_RSA;
505
+ e = priv ? rsa_private(k, in) : rsa_public(k, in);
506
+ break;
507
+ }
508
+ *out = js_object_value(&k->obj);
509
+ return e;
510
+ }
511
+
512
+ /* cryptoKeyParse(der, encoding, private): a key handle, or an error code (KEY_ERR_*). */
513
+ PRIMITIVE(js_crypto_key_parse) {
514
+ UNUSED_PRIMITIVE_ARGS;
515
+ uint8_t *p;
516
+ size_t n;
517
+ if (!js_buffer_source_bytes(ARG(0), &p, &n) || !js_is_number(ARG(1))) return js_throw_type_error(ctx, "cryptoKeyParse: bad arguments");
518
+ JSValue key;
519
+ int e = js_key_parse_der(ctx, p, n, (int)js_as_number(ARG(1)), js_truthy(ARG(2)), &key);
520
+ return e ? js_int32(e) : key;
521
+ }
522
+
523
+ int js_key_export_der(const JSKeyData *k, int enc, JSBytesOut *o) {
524
+ switch (enc) {
525
+ case ENC_SPKI: w_spki(o, k); return 0;
526
+ case ENC_PKCS8: w_pkcs8(o, k); return 0;
527
+ case ENC_PKCS1:
528
+ if (k->kind != JS_ASYM_RSA) return KEY_ERR_ENCODING;
529
+ if (k->type == JS_KEY_PRIVATE) w_rsa_private(o, k);
530
+ else w_rsa_public(o, k);
531
+ return 0;
532
+ case ENC_SEC1:
533
+ if (k->kind != JS_ASYM_EC) return KEY_ERR_ENCODING;
534
+ w_ec_private(o, k, true);
535
+ return 0;
536
+ default:
537
+ return KEY_ERR_ENCODING;
538
+ }
539
+ }
540
+
541
+ /* cryptoKeyExport(handle, encoding): DER, a Buffer, or KEY_ERR_ENCODING. */
542
+ PRIMITIVE(js_crypto_key_export) {
543
+ UNUSED_PRIMITIVE_ARGS;
544
+ JSKeyData *k = key_arg(ctx, ARG(0));
545
+ if (!k) return JS_EXCEPTION;
546
+ JSBytesOut o = { 0 };
547
+ int e = js_key_export_der(k, js_is_number(ARG(1)) ? (int)js_as_number(ARG(1)) : -1, &o);
548
+ if (e) return js_int32(e);
549
+ JSValue r = js_new_buffer_from_bytes(ctx, o.p, o.n);
550
+ free(o.p);
551
+ return r;
552
+ }
553
+
554
+ static const char *const KINDS[] = { NULL, "rsa", "rsa-pss", "ec", "x25519" };
555
+
556
+ /* cryptoKeyInfo(handle): [type, asymmetricKeyType, namedCurve, pss], pss [hash, mgf1, salt] or null. */
557
+ PRIMITIVE(js_crypto_key_info) {
558
+ UNUSED_PRIMITIVE_ARGS;
559
+ JSKeyData *k = key_arg(ctx, ARG(0));
560
+ if (!k) return JS_EXCEPTION;
561
+ static const char *const TYPES[] = { "secret", "public", "private" };
562
+ JSValue a = js_new_array(ctx, 4);
563
+ int ci = curve_index(k->curve);
564
+ JSValue pss = JS_NULL;
565
+ if (k->pss_params) {
566
+ pss = js_new_array(ctx, 3);
567
+ if (js_array_append(ctx, pss, js_new_string_cstr(ctx, k->pss_hash->name)) < 0 ||
568
+ js_array_append(ctx, pss, js_new_string_cstr(ctx, k->pss_mgf1->name)) < 0 ||
569
+ js_array_append(ctx, pss, js_number(k->pss_salt)) < 0)
570
+ return JS_EXCEPTION;
571
+ }
572
+ JSValue items[4] = { js_new_string_cstr(ctx, TYPES[k->type]), KINDS[k->kind] ? js_new_string_cstr(ctx, KINDS[k->kind]) : JS_UNDEFINED,
573
+ ci >= 0 ? js_new_string_cstr(ctx, CURVES[ci].name) : JS_UNDEFINED, pss };
574
+ for (int i = 0; i < 4; i++)
575
+ if (js_array_append(ctx, a, items[i]) < 0) return JS_EXCEPTION;
576
+ return a;
577
+ }
578
+
579
+ /* cryptoKeyParts(handle): the parts as Buffers (undefined when absent): RSA's n, e, d, p, q, dp,
580
+ * dq, qi; an EC or X25519 key's public point and private scalar. */
581
+ PRIMITIVE(js_crypto_key_parts) {
582
+ UNUSED_PRIMITIVE_ARGS;
583
+ JSKeyData *k = key_arg(ctx, ARG(0));
584
+ if (!k) return JS_EXCEPTION;
585
+ JSValue a = js_new_array(ctx, JS_KEY_PARTS);
586
+ for (int i = 0; i < JS_KEY_PARTS; i++) {
587
+ JSValue v = k->part[i].p ? js_new_buffer_from_bytes(ctx, k->part[i].p, k->part[i].n) : JS_UNDEFINED;
588
+ if (js_is_exception(v) || js_array_append(ctx, a, v) < 0) return JS_EXCEPTION;
589
+ }
590
+ return a;
591
+ }
592
+
593
+ int js_key_from_parts(JSContext *ctx, int kind, bool priv, int curve, const JSKeyPart parts[JS_KEY_PARTS], JSValue *out) {
594
+ JSKeyData *k = js_new_asym_key(ctx, priv ? JS_KEY_PRIVATE : JS_KEY_PUBLIC, (uint8_t)kind);
595
+ *out = js_object_value(&k->obj);
596
+ for (int i = 0; i < JS_KEY_PARTS; i++)
597
+ if (parts[i].p) js_key_part_set(&k->part[i], parts[i].p, parts[i].n);
598
+ if (kind == JS_ASYM_RSA) {
599
+ for (int i = 0; i < JS_KEY_PARTS; i++) { /* minimal integers */
600
+ JSKeyPart *pt = &k->part[i];
601
+ size_t z = 0;
602
+ while (pt->p && z + 1 < pt->n && pt->p[z] == 0) z++;
603
+ if (z) memmove(pt->p, pt->p + z, pt->n -= z);
604
+ }
605
+ return 0;
606
+ }
607
+ k->curve = kind == JS_ASYM_X25519 ? BR_EC_curve25519 : curve;
608
+ if (kind == JS_ASYM_EC) {
609
+ int ci = curve_index(curve);
610
+ if (ci < 0) return KEY_ERR_KEY_TYPE;
611
+ if (priv) set_part_fixed(k, JS_EC_PRIV, k->part[JS_EC_PRIV].p, k->part[JS_EC_PRIV].n, CURVES[ci].size);
612
+ }
613
+ if (priv && !ec_compute_pub(k)) return KEY_ERR_TAG;
614
+ return 0;
615
+ }
616
+
617
+ int js_ec_curve_by_jwk(const char *crv) {
618
+ for (int i = 0; i < (int)JS_COUNTOF(CURVES); i++)
619
+ if (strcmp(crv, CURVES[i].jwk) == 0) return CURVES[i].curve;
620
+ return -1;
621
+ }
622
+
623
+ const char *js_ec_curve_jwk(int curve) {
624
+ int ci = curve_index(curve);
625
+ return ci < 0 ? NULL : CURVES[ci].jwk;
626
+ }
627
+
628
+ /* cryptoKeyFromParts(kind, private, curve, parts): a key from a JWK's parts (Buffers, as
629
+ * cryptoKeyParts gives them; EC's public point uncompressed); an error code for a curve or kind
630
+ * not provided. */
631
+ PRIMITIVE(js_crypto_key_from_parts) {
632
+ UNUSED_PRIMITIVE_ARGS;
633
+ char kind[16] = "", curve[16] = "";
634
+ JSValue parts = ARG(3);
635
+ if (!js_is_string(ARG(0)) || !js_is_array(parts)) return js_throw_type_error(ctx, "cryptoKeyFromParts: bad arguments");
636
+ js_view_to_utf8(js_string_view(ctx, ARG(0)), kind, sizeof kind - 1);
637
+ if (js_is_string(ARG(2))) js_view_to_utf8(js_string_view(ctx, ARG(2)), curve, sizeof curve - 1);
638
+ JSKeyPart got[JS_KEY_PARTS] = { { 0 } };
639
+ for (int i = 0; i < JS_KEY_PARTS; i++) {
640
+ JSValue v = js_get_elem(ctx, parts, js_int32(i));
641
+ if (js_is_exception(v)) return v;
642
+ uint8_t *p;
643
+ size_t n;
644
+ if (js_buffer_source_bytes(v, &p, &n)) got[i].p = p, got[i].n = n;
645
+ }
646
+ int k = strcmp(kind, "rsa") == 0 ? JS_ASYM_RSA : strcmp(kind, "x25519") == 0 ? JS_ASYM_X25519 : JS_ASYM_EC;
647
+ JSValue key;
648
+ int e = js_key_from_parts(ctx, k, js_truthy(ARG(1)), js_ec_curve_by_jwk(curve), got, &key);
649
+ return e ? js_int32(e) : key;
650
+ }
651
+
652
+ /* cryptoKeyPublic(handle): the public key of a private one (a new handle). */
653
+ JSValue js_key_public(JSContext *ctx, JSValue private_key) {
654
+ JSKeyData *k = js_new_asym_key(ctx, JS_KEY_PUBLIC, js_key_data(private_key)->kind);
655
+ JSKeyData *src = js_key_data(private_key);
656
+ k->curve = src->curve;
657
+ k->pss_params = src->pss_params, k->pss_hash = src->pss_hash, k->pss_mgf1 = src->pss_mgf1, k->pss_salt = src->pss_salt;
658
+ if (src->kind == JS_ASYM_RSA || src->kind == JS_ASYM_RSA_PSS) {
659
+ js_key_part_set(&k->part[JS_RSA_N], src->part[JS_RSA_N].p, src->part[JS_RSA_N].n);
660
+ js_key_part_set(&k->part[JS_RSA_E], src->part[JS_RSA_E].p, src->part[JS_RSA_E].n);
661
+ } else {
662
+ js_key_part_set(&k->part[JS_EC_PUB], src->part[JS_EC_PUB].p, src->part[JS_EC_PUB].n);
663
+ }
664
+ return js_object_value(&k->obj);
665
+ }
666
+
667
+ PRIMITIVE(js_crypto_key_public) {
668
+ UNUSED_PRIMITIVE_ARGS;
669
+ if (!key_arg(ctx, ARG(0))) return JS_EXCEPTION;
670
+ return js_key_public(ctx, ARG(0));
671
+ }
672
+
673
+ /* cryptoKeyEquals(a, b): the same type and the same key. */
674
+ PRIMITIVE(js_crypto_key_equals) {
675
+ UNUSED_PRIMITIVE_ARGS;
676
+ JSKeyData *a = key_arg(ctx, ARG(0)), *b = a ? key_arg(ctx, ARG(1)) : NULL;
677
+ if (!a || !b) return JS_EXCEPTION;
678
+ if (a->type != b->type || a->kind != b->kind) return JS_FALSE;
679
+ if (a->type == JS_KEY_SECRET) return js_bool(a->len == b->len && js_crypto_equal(a->bytes, b->bytes, a->len));
680
+ JSBytesOut x = { 0 }, y = { 0 };
681
+ if (a->type == JS_KEY_PUBLIC) w_spki(&x, a), w_spki(&y, b);
682
+ else w_pkcs8(&x, a), w_pkcs8(&y, b);
683
+ bool eq = x.n == y.n && js_crypto_equal(x.p, y.p, x.n);
684
+ free(x.p), free(y.p);
685
+ return js_bool(eq);
686
+ }
687
+
688
+ /* cryptoKeySecret(bytes): a secret key handle holding a copy. */
689
+ PRIMITIVE(js_crypto_key_secret) {
690
+ UNUSED_PRIMITIVE_ARGS;
691
+ uint8_t *p;
692
+ size_t n;
693
+ if (!js_buffer_source_bytes(ARG(0), &p, &n)) return js_throw_type_error(ctx, "cryptoKeySecret: bytes expected");
694
+ return js_new_secret_key(ctx, p, n);
695
+ }
696
+
697
+ /* cryptoKeySecretBytes(handle): a copy of a secret key's bytes, a Buffer. */
698
+ PRIMITIVE(js_crypto_key_secret_bytes) {
699
+ UNUSED_PRIMITIVE_ARGS;
700
+ JSKeyData *k = key_arg(ctx, ARG(0));
701
+ if (!k) return JS_EXCEPTION;
702
+ return js_new_buffer_from_bytes(ctx, k->bytes, k->len);
703
+ }
704
+
705
+ int js_key_generate_rsa(JSContext *ctx, bool pss, uint32_t bits, uint32_t e, JSValue *out) {
706
+ if (bits < 512 || bits > RSA_MAX_BITS || e < 3 || !(e & 1)) return KEY_ERR_GENERATE;
707
+ uint8_t *kpriv = malloc(BR_RSA_KBUF_PRIV_SIZE(RSA_MAX_BITS)), *kpub = malloc(BR_RSA_KBUF_PUB_SIZE(RSA_MAX_BITS));
708
+ uint8_t *d = malloc(RSA_MAX_BITS / 8);
709
+ if (!kpriv || !kpub || !d) js_fatal("out of memory in crypto");
710
+ br_rsa_private_key sk;
711
+ br_rsa_public_key pk;
712
+ bool ok = br_rsa_keygen_get_default()(js_crypto_prng(), &sk, kpriv, &pk, kpub, bits, e);
713
+ size_t dn = ok ? br_rsa_compute_privexp_get_default()(d, &sk, e) : 0;
714
+ int err = KEY_ERR_GENERATE;
715
+ if (ok && dn) {
716
+ JSKeyData *k = js_new_asym_key(ctx, JS_KEY_PRIVATE, pss ? JS_ASYM_RSA_PSS : JS_ASYM_RSA);
717
+ const uint8_t *parts[8] = { pk.n, pk.e, d, sk.p, sk.q, sk.dp, sk.dq, sk.iq };
718
+ size_t lens[8] = { pk.nlen, pk.elen, dn, sk.plen, sk.qlen, sk.dplen, sk.dqlen, sk.iqlen };
719
+ for (int i = 0; i < 8; i++) {
720
+ const uint8_t *p = parts[i];
721
+ size_t n = lens[i];
722
+ while (n > 1 && p[0] == 0) p++, n--;
723
+ js_key_part_set(&k->part[i], p, n);
724
+ }
725
+ *out = js_object_value(&k->obj);
726
+ err = 0;
727
+ }
728
+ memset(kpriv, 0, BR_RSA_KBUF_PRIV_SIZE(RSA_MAX_BITS));
729
+ memset(d, 0, RSA_MAX_BITS / 8);
730
+ free(kpriv), free(kpub), free(d);
731
+ return err;
732
+ }
733
+
734
+ int js_key_generate_ec(JSContext *ctx, int curve, JSValue *out) {
735
+ uint8_t kbuf[BR_EC_KBUF_PRIV_MAX_SIZE];
736
+ br_ec_private_key sk;
737
+ if (curve != BR_EC_curve25519 && curve_index(curve) < 0) return KEY_ERR_GENERATE;
738
+ if (!br_ec_keygen(js_crypto_prng(), br_ec_get_default(), &sk, kbuf, curve)) return KEY_ERR_GENERATE;
739
+ JSKeyData *k = js_new_asym_key(ctx, JS_KEY_PRIVATE, curve == BR_EC_curve25519 ? JS_ASYM_X25519 : JS_ASYM_EC);
740
+ k->curve = curve;
741
+ if (curve == BR_EC_curve25519) { /* stored little-endian (js_ec_scalar_for_bearssl) */
742
+ for (size_t i = 0; i < sk.xlen / 2; i++) {
743
+ unsigned char t = sk.x[i];
744
+ sk.x[i] = sk.x[sk.xlen - 1 - i];
745
+ sk.x[sk.xlen - 1 - i] = t;
746
+ }
747
+ }
748
+ js_key_part_set(&k->part[JS_EC_PRIV], sk.x, sk.xlen);
749
+ memset(kbuf, 0, sizeof kbuf);
750
+ if (!ec_compute_pub(k)) return KEY_ERR_GENERATE;
751
+ *out = js_object_value(&k->obj);
752
+ return 0;
753
+ }
754
+
755
+ /* cryptoKeyGenerate(kind, sizeOrCurve, publicExponent, pss): a private key handle, or
756
+ * KEY_ERR_GENERATE. RSA's size in bits; EC's curve by Node's name; pss [hash, mgf1, salt] or null. */
757
+ PRIMITIVE(js_crypto_key_generate) {
758
+ UNUSED_PRIMITIVE_ARGS;
759
+ char kind[16] = "";
760
+ if (!js_is_string(ARG(0))) return js_throw_type_error(ctx, "cryptoKeyGenerate: bad arguments");
761
+ js_view_to_utf8(js_string_view(ctx, ARG(0)), kind, sizeof kind - 1);
762
+ JSValue key;
763
+ if (strcmp(kind, "rsa") == 0 || strcmp(kind, "rsa-pss") == 0) {
764
+ double bits = js_is_number(ARG(1)) ? js_as_number(ARG(1)) : 0, e = js_is_number(ARG(2)) ? js_as_number(ARG(2)) : 65537;
765
+ if (bits < 0 || bits > RSA_MAX_BITS || e < 0 || e > 4294967295.0) return js_int32(KEY_ERR_GENERATE);
766
+ int err = js_key_generate_rsa(ctx, kind[3] != 0, (uint32_t)bits, (uint32_t)e, &key);
767
+ if (err) return js_int32(err);
768
+ JSKeyData *k = js_key_data(key);
769
+ if (kind[3] && js_is_array(ARG(3))) {
770
+ JSValue h = js_get_elem(ctx, ARG(3), js_int32(0)), m = js_get_elem(ctx, ARG(3), js_int32(1)), s = js_get_elem(ctx, ARG(3), js_int32(2));
771
+ char hn[32] = "", mn[32] = "";
772
+ if (js_is_string(h)) js_view_to_utf8(js_string_view(ctx, h), hn, sizeof hn - 1);
773
+ if (js_is_string(m)) js_view_to_utf8(js_string_view(ctx, m), mn, sizeof mn - 1);
774
+ k->pss_params = true;
775
+ k->pss_hash = js_hash_by_name(hn[0] ? hn : "sha1");
776
+ k->pss_mgf1 = mn[0] ? js_hash_by_name(mn) : k->pss_hash;
777
+ k->pss_salt = js_is_number(s) ? (uint32_t)js_as_number(s) : 20;
778
+ if (!k->pss_hash || !k->pss_mgf1) k->pss_params = false;
779
+ }
780
+ return key;
781
+ }
782
+ int curve = -1;
783
+ if (strcmp(kind, "x25519") == 0) {
784
+ curve = BR_EC_curve25519;
785
+ } else {
786
+ char name[24] = "";
787
+ if (js_is_string(ARG(1))) js_view_to_utf8(js_string_view(ctx, ARG(1)), name, sizeof name - 1);
788
+ for (int i = 0; i < (int)JS_COUNTOF(CURVES); i++)
789
+ if (strcmp(name, CURVES[i].name) == 0 || strcmp(name, CURVES[i].jwk) == 0) curve = CURVES[i].curve;
790
+ if (curve < 0) return js_int32(KEY_ERR_GENERATE);
791
+ }
792
+ int err = js_key_generate_ec(ctx, curve, &key);
793
+ return err ? js_int32(err) : key;
794
+ }