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,644 @@
1
+ /* Asymmetric operations (ADR 0018) on the key record: RSA signatures (PKCS#1 v1.5 on BearSSL, PSS
2
+ * of our own so any hash works and a verifier can recover the salt length), ECDSA (BearSSL, DER
3
+ * or IEEE P1363 signatures), RSA encryption (OAEP on BearSSL; PKCS#1 v1.5's paddings and raw RSA
4
+ * ours), and key agreement (EC Diffie-Hellman and X25519), with point compression. The
5
+ * primitives at the end serve node:crypto; Web Crypto calls the functions above them. */
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
+ /* ---- Keys as BearSSL takes them ----------------------------------------------------------------- */
21
+
22
+ static size_t bit_length(const JSKeyPart *n) {
23
+ size_t i = 0;
24
+ while (i < n->n && n->p[i] == 0) i++;
25
+ if (i == n->n) return 0;
26
+ size_t bits = (n->n - i - 1) * 8;
27
+ for (uint8_t top = n->p[i]; top; top >>= 1) bits++;
28
+ return bits;
29
+ }
30
+
31
+ static br_rsa_public_key rsa_pk(const JSKeyData *k) {
32
+ br_rsa_public_key pk = { k->part[JS_RSA_N].p, k->part[JS_RSA_N].n, k->part[JS_RSA_E].p, k->part[JS_RSA_E].n };
33
+ return pk;
34
+ }
35
+
36
+ static br_rsa_private_key rsa_sk(const JSKeyData *k) {
37
+ br_rsa_private_key sk = {
38
+ (uint32_t)bit_length(&k->part[JS_RSA_N]),
39
+ k->part[JS_RSA_P].p, k->part[JS_RSA_P].n, k->part[JS_RSA_Q].p, k->part[JS_RSA_Q].n,
40
+ k->part[JS_RSA_DP].p, k->part[JS_RSA_DP].n, k->part[JS_RSA_DQ].p, k->part[JS_RSA_DQ].n,
41
+ k->part[JS_RSA_QI].p, k->part[JS_RSA_QI].n,
42
+ };
43
+ return sk;
44
+ }
45
+
46
+ static size_t rsa_size(const JSKeyData *k) { return (bit_length(&k->part[JS_RSA_N]) + 7) / 8; }
47
+
48
+ static bool is_rsa(const JSKeyData *k) { return k->kind == JS_ASYM_RSA || k->kind == JS_ASYM_RSA_PSS; }
49
+
50
+ /* x ← x^e mod n, in place over the modulus's length */
51
+ static bool rsa_public_op(const JSKeyData *k, uint8_t *x, size_t n) {
52
+ br_rsa_public_key pk = rsa_pk(k);
53
+ return br_rsa_public_get_default()(x, n, &pk) != 0;
54
+ }
55
+
56
+ /* x ← x^d mod n (CRT), in place */
57
+ static bool rsa_private_op(const JSKeyData *k, uint8_t *x) {
58
+ br_rsa_private_key sk = rsa_sk(k);
59
+ return br_rsa_private_get_default()(x, &sk) != 0;
60
+ }
61
+
62
+ /* ---- MGF1 (RFC 8017 B.2.1) ---------------------------------------------------------------------- */
63
+
64
+ static void mgf1_xor(const JSHashAlg *h, const uint8_t *seed, size_t seed_len, uint8_t *data, size_t n) {
65
+ uint8_t block[64];
66
+ for (uint32_t c = 0; n > 0; c++) {
67
+ uint8_t be[4] = { (uint8_t)(c >> 24), (uint8_t)(c >> 16), (uint8_t)(c >> 8), (uint8_t)c };
68
+ JSHashCtx ctx;
69
+ js_hash_init(&ctx, h);
70
+ js_hash_update(&ctx, seed, seed_len);
71
+ js_hash_update(&ctx, be, 4);
72
+ js_hash_final(&ctx, block, h->out_len);
73
+ size_t take = n < h->out_len ? n : h->out_len;
74
+ for (size_t i = 0; i < take; i++) data[i] ^= block[i];
75
+ data += take;
76
+ n -= take;
77
+ }
78
+ }
79
+
80
+ /* ---- Signatures --------------------------------------------------------------------------------- */
81
+
82
+ /* EMSA-PSS-ENCODE, then the private operation: sig gets the modulus's length. */
83
+ static int pss_sign(const JSKeyData *k, const JSHashAlg *h, const JSHashAlg *mgf, const uint8_t *mhash, long salt_len, uint8_t *sig) {
84
+ size_t mod_bits = bit_length(&k->part[JS_RSA_N]), em_bits = mod_bits - 1, em_len = (em_bits + 7) / 8, hlen = h->out_len;
85
+ size_t max_salt = em_len >= hlen + 2 ? em_len - hlen - 2 : 0;
86
+ size_t slen = salt_len == JS_SALT_DIGEST ? hlen : salt_len < 0 ? max_salt : (size_t)salt_len;
87
+ if (em_len < hlen + slen + 2) return JS_ASYM_ERR_TOO_LARGE; /* as OpenSSL reports it */
88
+ uint8_t salt[1024], hh[64];
89
+ if (slen > sizeof salt) return JS_ASYM_ERR_TOO_LARGE;
90
+ js_crypto_random(salt, slen);
91
+ static const uint8_t zeros[8] = { 0 };
92
+ JSHashCtx ctx;
93
+ js_hash_init(&ctx, h);
94
+ js_hash_update(&ctx, zeros, 8);
95
+ js_hash_update(&ctx, mhash, hlen);
96
+ js_hash_update(&ctx, salt, slen);
97
+ js_hash_final(&ctx, hh, hlen);
98
+ size_t k_len = rsa_size(k), db_len = em_len - hlen - 1;
99
+ uint8_t *em = sig + (k_len - em_len);
100
+ memset(sig, 0, k_len);
101
+ em[db_len - slen - 1] = 0x01;
102
+ memcpy(em + db_len - slen, salt, slen);
103
+ mgf1_xor(mgf, hh, hlen, em, db_len);
104
+ em[0] &= (uint8_t)(0xFF >> (8 * em_len - em_bits));
105
+ memcpy(em + db_len, hh, hlen);
106
+ em[em_len - 1] = 0xBC;
107
+ return rsa_private_op(k, sig) ? 0 : JS_ASYM_ERR_FAILED;
108
+ }
109
+
110
+ /* EMSA-PSS-VERIFY after the public operation; salt_len JS_SALT_AUTO recovers it. */
111
+ static bool pss_verify(const JSKeyData *k, const JSHashAlg *h, const JSHashAlg *mgf, const uint8_t *mhash, long salt_len,
112
+ const uint8_t *sig, size_t sig_len) {
113
+ size_t k_len = rsa_size(k), mod_bits = bit_length(&k->part[JS_RSA_N]), em_bits = mod_bits - 1, em_len = (em_bits + 7) / 8;
114
+ size_t hlen = h->out_len;
115
+ if (sig_len != k_len || em_len < hlen + 2) return false;
116
+ uint8_t *x = malloc(k_len);
117
+ if (!x) js_fatal("out of memory in crypto");
118
+ memcpy(x, sig, k_len);
119
+ bool ok = rsa_public_op(k, x, k_len);
120
+ uint8_t *em = x + (k_len - em_len);
121
+ if (ok && k_len != em_len && x[0] != 0) ok = false;
122
+ if (ok && em[em_len - 1] != 0xBC) ok = false;
123
+ size_t db_len = em_len - hlen - 1;
124
+ if (ok && (em[0] & ~(0xFF >> (8 * em_len - em_bits)))) ok = false;
125
+ if (ok) {
126
+ uint8_t hh[64];
127
+ memcpy(hh, em + db_len, hlen);
128
+ mgf1_xor(mgf, hh, hlen, em, db_len);
129
+ em[0] &= (uint8_t)(0xFF >> (8 * em_len - em_bits));
130
+ size_t i = 0;
131
+ while (i < db_len && em[i] == 0) i++;
132
+ size_t slen = i < db_len ? db_len - i - 1 : 0;
133
+ if (i == db_len || em[i] != 0x01) ok = false;
134
+ else if (salt_len == JS_SALT_DIGEST && slen != hlen) ok = false;
135
+ else if (salt_len >= 0 && slen != (size_t)salt_len) ok = false;
136
+ if (ok) {
137
+ static const uint8_t zeros[8] = { 0 };
138
+ uint8_t h2[64];
139
+ JSHashCtx ctx;
140
+ js_hash_init(&ctx, h);
141
+ js_hash_update(&ctx, zeros, 8);
142
+ js_hash_update(&ctx, mhash, hlen);
143
+ js_hash_update(&ctx, em + i + 1, slen);
144
+ js_hash_final(&ctx, h2, hlen);
145
+ ok = js_crypto_equal(h2, hh, hlen);
146
+ }
147
+ }
148
+ free(x);
149
+ return ok;
150
+ }
151
+
152
+ /* BearSSL's class for a hash (ECDSA's nonce generation needs one), or NULL. */
153
+ static const br_hash_class *bear_hash(const JSHashAlg *h) { return h->kind == JS_HASH_BEARSSL ? h->br : NULL; }
154
+
155
+ static br_ec_public_key ec_pk(const JSKeyData *k) {
156
+ br_ec_public_key pk = { k->curve, k->part[JS_EC_PUB].p, k->part[JS_EC_PUB].n };
157
+ return pk;
158
+ }
159
+
160
+ int js_asym_sign(const JSKeyData *k, const JSHashAlg *h, const uint8_t *digest, int padding, long salt_len, bool p1363,
161
+ JSBytesOut *out) {
162
+ if (k->type != JS_KEY_PRIVATE) return JS_ASYM_ERR_KEY_TYPE;
163
+ if (is_rsa(k)) {
164
+ size_t n = rsa_size(k);
165
+ uint8_t *sig = calloc(n, 1);
166
+ if (!sig) js_fatal("out of memory in crypto");
167
+ int err = 0;
168
+ if (k->kind == JS_ASYM_RSA_PSS || padding == JS_PADDING_PSS) {
169
+ const JSHashAlg *mgf = k->kind == JS_ASYM_RSA_PSS && k->pss_params ? k->pss_mgf1 : h;
170
+ err = pss_sign(k, h, mgf, digest, salt_len, sig);
171
+ } else {
172
+ br_rsa_private_key sk = rsa_sk(k);
173
+ const unsigned char *oid = h->oid;
174
+ if (!oid && strcmp(h->name, "md5-sha1") != 0) err = JS_ASYM_ERR_DIGEST;
175
+ else if (!br_rsa_pkcs1_sign_get_default()(oid, digest, h->out_len, &sk, sig)) err = JS_ASYM_ERR_FAILED;
176
+ }
177
+ if (!err) {
178
+ out->p = sig;
179
+ out->n = out->cap = n;
180
+ } else {
181
+ free(sig);
182
+ }
183
+ return err;
184
+ }
185
+ if (k->kind != JS_ASYM_EC) return JS_ASYM_ERR_KEY_TYPE;
186
+ const br_hash_class *hf = bear_hash(h);
187
+ if (!hf) return JS_ASYM_ERR_DIGEST;
188
+ uint8_t scalar[66];
189
+ js_ec_scalar_for_bearssl(k, scalar);
190
+ br_ec_private_key sk = { k->curve, scalar, k->part[JS_EC_PRIV].n };
191
+ out->p = malloc(160);
192
+ if (!out->p) js_fatal("out of memory in crypto");
193
+ size_t n = (p1363 ? br_ecdsa_sign_raw_get_default() : br_ecdsa_sign_asn1_get_default())(br_ec_get_default(), hf, digest, &sk, out->p);
194
+ out->n = out->cap = n;
195
+ return n ? 0 : JS_ASYM_ERR_FAILED;
196
+ }
197
+
198
+ int js_asym_verify(const JSKeyData *k, const JSHashAlg *h, const uint8_t *digest, int padding, long salt_len, bool p1363,
199
+ const uint8_t *sig, size_t sig_len, bool *valid) {
200
+ *valid = false;
201
+ if (k->type == JS_KEY_SECRET) return JS_ASYM_ERR_KEY_TYPE;
202
+ if (is_rsa(k)) {
203
+ if (k->kind == JS_ASYM_RSA_PSS || padding == JS_PADDING_PSS) {
204
+ const JSHashAlg *mgf = k->kind == JS_ASYM_RSA_PSS && k->pss_params ? k->pss_mgf1 : h;
205
+ *valid = pss_verify(k, h, mgf, digest, salt_len, sig, sig_len);
206
+ return 0;
207
+ }
208
+ if (!h->oid && strcmp(h->name, "md5-sha1") != 0) return JS_ASYM_ERR_DIGEST;
209
+ if (sig_len != rsa_size(k)) return 0;
210
+ br_rsa_public_key pk = rsa_pk(k);
211
+ uint8_t got[64];
212
+ *valid = br_rsa_pkcs1_vrfy_get_default()(sig, sig_len, h->oid, h->out_len, &pk, got) && js_crypto_equal(got, digest, h->out_len);
213
+ return 0;
214
+ }
215
+ if (k->kind != JS_ASYM_EC) return JS_ASYM_ERR_KEY_TYPE;
216
+ br_ec_public_key pk = ec_pk(k);
217
+ *valid = (p1363 ? br_ecdsa_vrfy_raw_get_default() : br_ecdsa_vrfy_asn1_get_default())(br_ec_get_default(), digest, h->out_len, &pk,
218
+ sig, sig_len) != 0;
219
+ return 0;
220
+ }
221
+
222
+ /* ---- RSA encryption ----------------------------------------------------------------------------- */
223
+
224
+ int js_rsa_crypt(const JSKeyData *k, int op, int padding, const JSHashAlg *oaep_hash, const uint8_t *label, size_t label_len,
225
+ const uint8_t *in, size_t n, JSBytesOut *out) {
226
+ if (!is_rsa(k)) return JS_ASYM_ERR_KEY_TYPE;
227
+ bool private_op = op == JS_RSA_PRIVATE_DECRYPT || op == JS_RSA_PRIVATE_ENCRYPT;
228
+ if (private_op && k->type != JS_KEY_PRIVATE) return JS_ASYM_ERR_KEY_TYPE;
229
+ size_t kl = rsa_size(k);
230
+ uint8_t *x = calloc(kl, 1);
231
+ if (!x) js_fatal("out of memory in crypto");
232
+ int err = 0;
233
+ size_t out_len = kl;
234
+ if (op == JS_RSA_PUBLIC_ENCRYPT && padding == JS_PADDING_OAEP) {
235
+ if (!bear_hash(oaep_hash)) err = JS_ASYM_ERR_DIGEST;
236
+ else {
237
+ br_rsa_public_key pk = rsa_pk(k);
238
+ out_len = br_rsa_oaep_encrypt_get_default()(js_crypto_prng(), bear_hash(oaep_hash), label, label_len, &pk, x, kl, in, n);
239
+ if (!out_len) err = JS_ASYM_ERR_TOO_LARGE;
240
+ }
241
+ } else if (op == JS_RSA_PRIVATE_DECRYPT && padding == JS_PADDING_OAEP) {
242
+ if (!bear_hash(oaep_hash)) err = JS_ASYM_ERR_DIGEST;
243
+ else if (n != kl) err = JS_ASYM_ERR_OAEP;
244
+ else {
245
+ br_rsa_private_key sk = rsa_sk(k);
246
+ memcpy(x, in, n);
247
+ out_len = n;
248
+ if (!br_rsa_oaep_decrypt_get_default()(bear_hash(oaep_hash), label, label_len, &sk, x, &out_len)) err = JS_ASYM_ERR_OAEP;
249
+ }
250
+ } else if (op == JS_RSA_PUBLIC_ENCRYPT || op == JS_RSA_PRIVATE_ENCRYPT) {
251
+ if (padding == JS_PADDING_NONE) {
252
+ if (n > kl) err = JS_ASYM_ERR_TOO_LARGE;
253
+ else if (n < kl) err = JS_ASYM_ERR_TOO_SMALL;
254
+ else memcpy(x, in, n);
255
+ } else if (padding != JS_PADDING_PKCS1) {
256
+ err = JS_ASYM_ERR_PADDING;
257
+ } else if (n + 11 > kl) {
258
+ err = JS_ASYM_ERR_TOO_LARGE;
259
+ } else { /* EME-PKCS1-v1_5 (00 02 random 00 M) or the signature form (00 01 FF… 00 M) */
260
+ size_t ps = kl - n - 3;
261
+ x[1] = op == JS_RSA_PUBLIC_ENCRYPT ? 2 : 1;
262
+ if (op == JS_RSA_PUBLIC_ENCRYPT) {
263
+ js_crypto_random(x + 2, ps);
264
+ for (size_t i = 0; i < ps; i++)
265
+ while (x[2 + i] == 0) js_crypto_random(x + 2 + i, 1);
266
+ } else {
267
+ memset(x + 2, 0xFF, ps);
268
+ }
269
+ memcpy(x + 3 + ps, in, n);
270
+ }
271
+ if (!err && !(op == JS_RSA_PUBLIC_ENCRYPT ? rsa_public_op(k, x, kl) : rsa_private_op(k, x))) err = JS_ASYM_ERR_TOO_LARGE;
272
+ } else { /* privateDecrypt or publicDecrypt without OAEP */
273
+ if (n > kl) err = JS_ASYM_ERR_TOO_LARGE;
274
+ else if (n < kl && padding == JS_PADDING_NONE) err = JS_ASYM_ERR_TOO_SMALL;
275
+ else {
276
+ memcpy(x + kl - n, in, n);
277
+ if (!(op == JS_RSA_PRIVATE_DECRYPT ? rsa_private_op(k, x) : rsa_public_op(k, x, kl))) err = JS_ASYM_ERR_TOO_LARGE;
278
+ }
279
+ if (!err && padding == JS_PADDING_PKCS1) {
280
+ uint8_t type = op == JS_RSA_PRIVATE_DECRYPT ? 2 : 1;
281
+ size_t i = 2;
282
+ if (x[0] != 0 || x[1] != type) err = JS_ASYM_ERR_PADDING;
283
+ while (!err && i < kl && x[i] != 0) {
284
+ if (type == 1 && x[i] != 0xFF) err = JS_ASYM_ERR_PADDING;
285
+ i++;
286
+ }
287
+ if (!err && (i == kl || i < 10)) err = JS_ASYM_ERR_PADDING;
288
+ if (!err) {
289
+ out_len = kl - i - 1;
290
+ memmove(x, x + i + 1, out_len);
291
+ }
292
+ } else if (!err && padding != JS_PADDING_NONE) {
293
+ err = JS_ASYM_ERR_PADDING;
294
+ }
295
+ }
296
+ if (err) {
297
+ free(x);
298
+ return err;
299
+ }
300
+ out->p = x;
301
+ out->n = out_len;
302
+ out->cap = kl;
303
+ return 0;
304
+ }
305
+
306
+ /* ---- Points ------------------------------------------------------------------------------------- */
307
+
308
+ /* Little fixed-size integers for decompressing points: y = sqrt(x^3 - 3x + b) mod p, which is
309
+ * (x^3 - 3x + b)^((p + 1) / 4) as p ≡ 3 (mod 4) on all three curves. 32-bit limbs, little-endian. */
310
+ #define LIMBS 17 /* 544 bits: P-521's field */
311
+
312
+ typedef struct { uint32_t w[LIMBS]; } Big;
313
+
314
+ static void big_from_bytes(Big *a, const uint8_t *p, size_t n) {
315
+ memset(a, 0, sizeof *a);
316
+ for (size_t i = 0; i < n; i++) a->w[i / 4] |= (uint32_t)p[n - 1 - i] << (8 * (i % 4));
317
+ }
318
+
319
+ static void big_to_bytes(const Big *a, uint8_t *p, size_t n) {
320
+ for (size_t i = 0; i < n; i++) p[n - 1 - i] = (uint8_t)(a->w[i / 4] >> (8 * (i % 4)));
321
+ }
322
+
323
+ static int big_cmp(const Big *a, const Big *b) {
324
+ for (int i = LIMBS - 1; i >= 0; i--)
325
+ if (a->w[i] != b->w[i]) return a->w[i] < b->w[i] ? -1 : 1;
326
+ return 0;
327
+ }
328
+
329
+ static void big_sub(Big *a, const Big *b) {
330
+ uint64_t borrow = 0;
331
+ for (int i = 0; i < LIMBS; i++) {
332
+ uint64_t d = (uint64_t)a->w[i] - b->w[i] - borrow;
333
+ a->w[i] = (uint32_t)d;
334
+ borrow = (d >> 32) & 1;
335
+ }
336
+ }
337
+
338
+ /* r = a * b mod m, by schoolbook multiplication and bitwise reduction */
339
+ static void big_mulmod(Big *r, const Big *a, const Big *b, const Big *m) {
340
+ uint32_t t[2 * LIMBS] = { 0 };
341
+ for (int i = 0; i < LIMBS; i++) {
342
+ uint64_t carry = 0;
343
+ for (int j = 0; j < LIMBS; j++) {
344
+ uint64_t v = (uint64_t)a->w[i] * b->w[j] + t[i + j] + carry;
345
+ t[i + j] = (uint32_t)v;
346
+ carry = v >> 32;
347
+ }
348
+ t[i + LIMBS] = (uint32_t)carry;
349
+ }
350
+ Big acc = { { 0 } };
351
+ for (int bit = 2 * LIMBS * 32 - 1; bit >= 0; bit--) {
352
+ uint32_t top = acc.w[LIMBS - 1] >> 31;
353
+ for (int i = LIMBS - 1; i > 0; i--) acc.w[i] = acc.w[i] << 1 | acc.w[i - 1] >> 31;
354
+ acc.w[0] = acc.w[0] << 1 | ((t[bit / 32] >> (bit % 32)) & 1);
355
+ if (top || big_cmp(&acc, m) >= 0) big_sub(&acc, m);
356
+ }
357
+ *r = acc;
358
+ }
359
+
360
+ static void big_powmod(Big *r, const Big *a, const Big *e, const Big *m) {
361
+ Big acc = { { 1 } };
362
+ for (int bit = LIMBS * 32 - 1; bit >= 0; bit--) {
363
+ big_mulmod(&acc, &acc, &acc, m);
364
+ if ((e->w[bit / 32] >> (bit % 32)) & 1) big_mulmod(&acc, &acc, a, m);
365
+ }
366
+ *r = acc;
367
+ }
368
+
369
+ static const struct {
370
+ int curve;
371
+ const char *name;
372
+ size_t size;
373
+ const char *p, *b; /* hex */
374
+ } FIELDS[] = {
375
+ { BR_EC_secp256r1, "prime256v1", 32, "ffffffff00000001000000000000000000000000ffffffffffffffffffffffff",
376
+ "5ac635d8aa3a93e7b3ebbd55769886bc651d06b0cc53b0f63bce3c3e27d2604b" },
377
+ { BR_EC_secp384r1, "secp384r1", 48,
378
+ "fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffeffffffff0000000000000000ffffffff",
379
+ "b3312fa7e23ee7e4988e056be3f82d19181d9c6efe8141120314088f5013875ac656398d8a2ed19d2a85c8edd3ec2aef" },
380
+ { BR_EC_secp521r1, "secp521r1", 66,
381
+ "01ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff",
382
+ "0051953eb9618e1c9a1f929a21a0b68540eea2da725b99b315f3b8b489918ef109e156193951ec7e937b1652c0bd3bb1bf073573df883d2c34f1ef451fd46b503f00" },
383
+ };
384
+
385
+ static void hex_bytes(const char *hex, uint8_t *out, size_t n) {
386
+ for (size_t i = 0; i < n; i++) {
387
+ unsigned v = 0;
388
+ for (int k = 0; k < 2; k++) {
389
+ char c = hex[2 * i + k];
390
+ v = v << 4 | (unsigned)(c <= '9' ? c - '0' : c - 'a' + 10);
391
+ }
392
+ out[i] = (uint8_t)v;
393
+ }
394
+ }
395
+
396
+ int js_ec_curve_by_name(const char *name) {
397
+ for (size_t i = 0; i < JS_COUNTOF(FIELDS); i++)
398
+ if (strcmp(name, FIELDS[i].name) == 0) return FIELDS[i].curve;
399
+ return -1;
400
+ }
401
+
402
+ size_t js_ec_field_size(int curve) {
403
+ for (size_t i = 0; i < JS_COUNTOF(FIELDS); i++)
404
+ if (FIELDS[i].curve == curve) return FIELDS[i].size;
405
+ return curve == BR_EC_curve25519 ? 32 : 0;
406
+ }
407
+
408
+ /* Any encoding of a point (uncompressed 04, compressed 02/03, hybrid 06/07) as uncompressed;
409
+ * false when it isn't one (decompression checks the curve; BearSSL checks the rest). */
410
+ bool js_ec_point_uncompressed(int curve, const uint8_t *in, size_t n, uint8_t *out) {
411
+ size_t fs = js_ec_field_size(curve), i = 0;
412
+ while (i < JS_COUNTOF(FIELDS) && FIELDS[i].curve != curve) i++;
413
+ if (!fs || i == JS_COUNTOF(FIELDS) || n == 0) return false;
414
+ if ((in[0] == 4 || in[0] == 6 || in[0] == 7) && n == 1 + 2 * fs) {
415
+ if (in[0] != 4 && (in[n - 1] & 1) != (in[0] & 1)) return false;
416
+ memcpy(out, in, n);
417
+ out[0] = 4;
418
+ return true;
419
+ }
420
+ if ((in[0] != 2 && in[0] != 3) || n != 1 + fs) return false;
421
+ uint8_t buf[66];
422
+ Big p, x, rhs, t, three, e;
423
+ hex_bytes(FIELDS[i].p, buf, fs);
424
+ big_from_bytes(&p, buf, fs);
425
+ big_from_bytes(&x, in + 1, fs);
426
+ if (big_cmp(&x, &p) >= 0) return false;
427
+ big_mulmod(&t, &x, &x, &p);
428
+ big_mulmod(&rhs, &t, &x, &p); /* x^3 */
429
+ memset(&three, 0, sizeof three);
430
+ three.w[0] = 3;
431
+ big_mulmod(&t, &x, &three, &p); /* 3x */
432
+ if (big_cmp(&rhs, &t) < 0) { /* rhs - 3x, mod p */
433
+ Big s = p;
434
+ big_sub(&s, &t);
435
+ t = s;
436
+ uint64_t carry = 0;
437
+ for (int w = 0; w < LIMBS; w++) {
438
+ uint64_t v = (uint64_t)rhs.w[w] + t.w[w] + carry;
439
+ rhs.w[w] = (uint32_t)v;
440
+ carry = v >> 32;
441
+ }
442
+ if (big_cmp(&rhs, &p) >= 0) big_sub(&rhs, &p);
443
+ } else {
444
+ big_sub(&rhs, &t);
445
+ }
446
+ Big b;
447
+ hex_bytes(FIELDS[i].b, buf, fs);
448
+ big_from_bytes(&b, buf, fs);
449
+ uint64_t carry = 0;
450
+ for (int w = 0; w < LIMBS; w++) {
451
+ uint64_t v = (uint64_t)rhs.w[w] + b.w[w] + carry;
452
+ rhs.w[w] = (uint32_t)v;
453
+ carry = v >> 32;
454
+ }
455
+ if (big_cmp(&rhs, &p) >= 0) big_sub(&rhs, &p);
456
+ e = p; /* (p + 1) / 4 */
457
+ for (int w = 0, c = 1; w < LIMBS && c; w++) c = ++e.w[w] == 0;
458
+ for (int w = 0; w < LIMBS; w++) e.w[w] = e.w[w] >> 2 | (w + 1 < LIMBS ? e.w[w + 1] << 30 : 0);
459
+ Big y, check;
460
+ big_powmod(&y, &rhs, &e, &p);
461
+ big_mulmod(&check, &y, &y, &p);
462
+ if (big_cmp(&check, &rhs) != 0) return false; /* not on the curve */
463
+ if ((y.w[0] & 1) != (in[0] & 1u)) {
464
+ Big ny = p;
465
+ big_sub(&ny, &y);
466
+ y = ny;
467
+ }
468
+ out[0] = 4;
469
+ memcpy(out + 1, in + 1, fs);
470
+ big_to_bytes(&y, out + 1 + fs, fs);
471
+ return true;
472
+ }
473
+
474
+ /* An uncompressed point in a format: 4 uncompressed, 2 compressed, 6 hybrid (Node's constants). */
475
+ size_t js_ec_point_format(int curve, const uint8_t *point, int format, uint8_t *out) {
476
+ size_t fs = js_ec_field_size(curve);
477
+ uint8_t odd = point[2 * fs] & 1;
478
+ if (format == 2) {
479
+ out[0] = (uint8_t)(2 | odd);
480
+ memcpy(out + 1, point + 1, fs);
481
+ return 1 + fs;
482
+ }
483
+ memcpy(out, point, 1 + 2 * fs);
484
+ if (format == 6) out[0] = (uint8_t)(6 | odd);
485
+ return 1 + 2 * fs;
486
+ }
487
+
488
+ /* The shared secret of a private key and a peer's public point (EC: the x coordinate; X25519:
489
+ * the u coordinate). 0, or JS_ASYM_ERR_POINT. */
490
+ int js_ecdh(const JSKeyData *k, const uint8_t *peer, size_t peer_len, uint8_t *secret, size_t *secret_len) {
491
+ uint8_t g[133], scalar[66];
492
+ size_t glen;
493
+ if (k->curve == BR_EC_curve25519) {
494
+ if (peer_len != 32) return JS_ASYM_ERR_POINT;
495
+ memcpy(g, peer, 32);
496
+ glen = 32;
497
+ } else {
498
+ if (!js_ec_point_uncompressed(k->curve, peer, peer_len, g)) return JS_ASYM_ERR_POINT;
499
+ glen = 1 + 2 * js_ec_field_size(k->curve);
500
+ }
501
+ js_ec_scalar_for_bearssl(k, scalar);
502
+ if (!br_ec_get_default()->mul(g, glen, scalar, k->part[JS_EC_PRIV].n, k->curve)) return JS_ASYM_ERR_POINT;
503
+ if (k->curve == BR_EC_curve25519) {
504
+ uint8_t zero = 0;
505
+ for (int i = 0; i < 32; i++) zero |= g[i];
506
+ if (!zero) return JS_ASYM_ERR_POINT; /* a small-order point, as OpenSSL rejects it */
507
+ memcpy(secret, g, 32);
508
+ *secret_len = 32;
509
+ } else {
510
+ size_t fs = js_ec_field_size(k->curve);
511
+ memcpy(secret, g + 1, fs);
512
+ *secret_len = fs;
513
+ }
514
+ return 0;
515
+ }
516
+
517
+ /* ---- node:crypto's primitives ------------------------------------------------------------------- */
518
+
519
+ #define PRIMITIVE(fn) \
520
+ JSValue fn(JSContext *ctx, JSValue callee, JSValue this_val, uint32_t argc, const JSValue *argv, JSValue new_target)
521
+ #define UNUSED_PRIMITIVE_ARGS (void)callee, (void)this_val, (void)new_target
522
+
523
+ static const JSHashAlg *hash_arg(JSContext *ctx, JSValue v) {
524
+ char name[64];
525
+ if (!js_is_string(v)) return NULL;
526
+ size_t n = js_view_to_utf8(js_string_view(ctx, v), name, sizeof name - 1);
527
+ if (n >= sizeof name - 1) return NULL;
528
+ name[n] = 0;
529
+ return js_hash_by_name(name);
530
+ }
531
+
532
+ static JSValue result(JSContext *ctx, int err, JSBytesOut *out) {
533
+ JSValue r = err ? js_int32(err) : js_new_buffer_from_bytes(ctx, out->p, out->n);
534
+ free(out->p);
535
+ return r;
536
+ }
537
+
538
+ static long num_or(JSValue v, long dflt) { return js_is_number(v) ? (long)js_as_number(v) : dflt; }
539
+
540
+ /* cryptoSign(key, hash, digest, padding, saltLength, p1363): a Buffer, or an error code. */
541
+ PRIMITIVE(js_crypto_sign) {
542
+ UNUSED_PRIMITIVE_ARGS;
543
+ JSKeyData *k = js_key_data(ARG(0));
544
+ const JSHashAlg *h = hash_arg(ctx, ARG(1));
545
+ uint8_t *d;
546
+ size_t dn;
547
+ if (!k || !js_buffer_source_bytes(ARG(2), &d, &dn)) return js_throw_type_error(ctx, "cryptoSign: bad arguments");
548
+ if (!h || h->xof || dn != h->out_len) return js_int32(JS_ASYM_ERR_DIGEST);
549
+ JSBytesOut out = { 0 };
550
+ return result(ctx, js_asym_sign(k, h, d, (int)num_or(ARG(3), JS_PADDING_PKCS1), num_or(ARG(4), JS_SALT_MAX), js_truthy(ARG(5)), &out), &out);
551
+ }
552
+
553
+ /* cryptoVerify(key, hash, digest, signature, padding, saltLength, p1363): a boolean, or an error code. */
554
+ PRIMITIVE(js_crypto_verify) {
555
+ UNUSED_PRIMITIVE_ARGS;
556
+ JSKeyData *k = js_key_data(ARG(0));
557
+ const JSHashAlg *h = hash_arg(ctx, ARG(1));
558
+ uint8_t *d, *sig;
559
+ size_t dn, sn;
560
+ if (!k || !js_buffer_source_bytes(ARG(2), &d, &dn) || !js_buffer_source_bytes(ARG(3), &sig, &sn))
561
+ return js_throw_type_error(ctx, "cryptoVerify: bad arguments");
562
+ if (!h || h->xof || dn != h->out_len) return js_int32(JS_ASYM_ERR_DIGEST);
563
+ bool valid;
564
+ int err = js_asym_verify(k, h, d, (int)num_or(ARG(4), JS_PADDING_PKCS1), num_or(ARG(5), JS_SALT_AUTO), js_truthy(ARG(6)), sig, sn, &valid);
565
+ return err ? js_int32(err) : js_bool(valid);
566
+ }
567
+
568
+ /* cryptoRsaCrypt(key, op, data, padding, oaepHash, oaepLabel): a Buffer, or an error code.
569
+ * op: 0 publicEncrypt, 1 privateDecrypt, 2 privateEncrypt, 3 publicDecrypt. */
570
+ PRIMITIVE(js_crypto_rsa_crypt) {
571
+ UNUSED_PRIMITIVE_ARGS;
572
+ JSKeyData *k = js_key_data(ARG(0));
573
+ uint8_t *in, *label = NULL;
574
+ size_t n, label_len = 0;
575
+ if (!k || !js_is_number(ARG(1)) || !js_buffer_source_bytes(ARG(2), &in, &n)) return js_throw_type_error(ctx, "cryptoRsaCrypt: bad arguments");
576
+ const JSHashAlg *h = js_is_undefined(ARG(4)) ? js_hash_by_name("sha1") : hash_arg(ctx, ARG(4));
577
+ if (!h) return js_int32(JS_ASYM_ERR_DIGEST);
578
+ if (!js_is_undefined(ARG(5))) js_buffer_source_bytes(ARG(5), &label, &label_len);
579
+ JSBytesOut out = { 0 };
580
+ return result(ctx, js_rsa_crypt(k, (int)js_as_number(ARG(1)), (int)num_or(ARG(3), JS_PADDING_OAEP), h, label, label_len, in, n, &out), &out);
581
+ }
582
+
583
+ /* cryptoEcdh(private key, peer public point or key): the shared secret, or an error code. */
584
+ PRIMITIVE(js_crypto_ecdh) {
585
+ UNUSED_PRIMITIVE_ARGS;
586
+ JSKeyData *k = js_key_data(ARG(0)), *peer = js_key_data(ARG(1));
587
+ uint8_t *p;
588
+ size_t n;
589
+ if (!k) return js_throw_type_error(ctx, "cryptoEcdh: bad arguments");
590
+ if (peer) p = peer->part[JS_EC_PUB].p, n = peer->part[JS_EC_PUB].n;
591
+ else if (!js_buffer_source_bytes(ARG(1), &p, &n)) return js_throw_type_error(ctx, "cryptoEcdh: bad arguments");
592
+ uint8_t secret[66];
593
+ size_t sn;
594
+ int err = js_ecdh(k, p, n, secret, &sn);
595
+ return err ? js_int32(err) : js_new_buffer_from_bytes(ctx, secret, sn);
596
+ }
597
+
598
+ /* cryptoEcPoint(curve, point, format): the point in a format (4, 2 or 6), or an error code. */
599
+ PRIMITIVE(js_crypto_ec_point) {
600
+ UNUSED_PRIMITIVE_ARGS;
601
+ char name[24] = "";
602
+ uint8_t *p;
603
+ size_t n;
604
+ if (!js_is_string(ARG(0)) || !js_buffer_source_bytes(ARG(1), &p, &n)) return js_throw_type_error(ctx, "cryptoEcPoint: bad arguments");
605
+ js_view_to_utf8(js_string_view(ctx, ARG(0)), name, sizeof name - 1);
606
+ int curve = js_ec_curve_by_name(name);
607
+ if (curve < 0) return js_int32(JS_ASYM_ERR_CURVE);
608
+ uint8_t point[133], out[133];
609
+ if (!js_ec_point_uncompressed(curve, p, n, point)) return js_int32(JS_ASYM_ERR_POINT);
610
+ br_ec_public_key pk = { curve, point, 1 + 2 * js_ec_field_size(curve) };
611
+ /* on the curve: BearSSL's multiplication checks it */
612
+ uint8_t one[66] = { 0 }, copy[133];
613
+ one[js_ec_field_size(curve) - 1] = 1;
614
+ memcpy(copy, pk.q, pk.qlen);
615
+ if (!br_ec_get_default()->mul(copy, pk.qlen, one, js_ec_field_size(curve), curve)) return js_int32(JS_ASYM_ERR_POINT);
616
+ size_t on = js_ec_point_format(curve, point, (int)num_or(ARG(2), 4), out);
617
+ return js_new_buffer_from_bytes(ctx, out, on);
618
+ }
619
+
620
+ /* cryptoEcPrivate(curve, scalar): an EC private key handle, or an error code. */
621
+ PRIMITIVE(js_crypto_ec_private) {
622
+ UNUSED_PRIMITIVE_ARGS;
623
+ char name[24] = "";
624
+ uint8_t *p;
625
+ size_t n;
626
+ if (!js_is_string(ARG(0)) || !js_buffer_source_bytes(ARG(1), &p, &n)) return js_throw_type_error(ctx, "cryptoEcPrivate: bad arguments");
627
+ js_view_to_utf8(js_string_view(ctx, ARG(0)), name, sizeof name - 1);
628
+ int curve = js_ec_curve_by_name(name);
629
+ if (curve < 0) return js_int32(JS_ASYM_ERR_CURVE);
630
+ size_t fs = js_ec_field_size(curve);
631
+ while (n > fs && p[0] == 0) p++, n--;
632
+ if (n > fs) return js_int32(JS_ASYM_ERR_POINT);
633
+ JSKeyData *k = js_new_asym_key(ctx, JS_KEY_PRIVATE, JS_ASYM_EC);
634
+ k->curve = curve;
635
+ uint8_t buf[66] = { 0 };
636
+ memcpy(buf + fs - n, p, n);
637
+ js_key_part_set(&k->part[JS_EC_PRIV], buf, fs);
638
+ uint8_t pub[BR_EC_KBUF_PUB_MAX_SIZE];
639
+ br_ec_private_key sk = { curve, buf, fs };
640
+ br_ec_public_key pk;
641
+ if (!br_ec_compute_pub(br_ec_get_default(), &pk, pub, &sk)) return js_int32(JS_ASYM_ERR_POINT);
642
+ js_key_part_set(&k->part[JS_EC_PUB], pk.q, pk.qlen);
643
+ return js_object_value(&k->obj);
644
+ }