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.
- package/LICENSE +21 -0
- package/README.md +45 -2
- package/cli.js +8084 -0
- package/node/include/js_node.h +46 -0
- package/node/prelude/async_hooks.js +88 -0
- package/node/prelude/buffer.js +31 -0
- package/node/prelude/crypto.js +114 -0
- package/node/prelude/events.js +227 -0
- package/node/prelude/fs.js +79 -0
- package/node/prelude/http.js +536 -0
- package/node/prelude/http2.js +30 -0
- package/node/prelude/internal/crypto/asym.js +333 -0
- package/node/prelude/internal/crypto/cipher.js +205 -0
- package/node/prelude/internal/crypto/hash.js +137 -0
- package/node/prelude/internal/crypto/kdf.js +182 -0
- package/node/prelude/internal/crypto/keys.js +603 -0
- package/node/prelude/internal/crypto/random.js +118 -0
- package/node/prelude/internal/crypto/util.js +76 -0
- package/node/prelude/internal/errors.js +88 -0
- package/node/prelude/internal/querystring.js +105 -0
- package/node/prelude/module.js +53 -0
- package/node/prelude/net.js +51 -0
- package/node/prelude/os.js +129 -0
- package/node/prelude/path.js +257 -0
- package/node/prelude/process.js +21 -0
- package/node/prelude/querystring.js +469 -0
- package/node/prelude/stream.js +1327 -0
- package/node/prelude/stream_promises.js +7 -0
- package/node/prelude/stream_web.js +6 -0
- package/node/prelude/string_decoder.js +236 -0
- package/node/prelude/tty.js +18 -0
- package/node/prelude/url.js +1156 -0
- package/node/prelude/util.js +64 -0
- package/node/prelude/zlib.js +81 -0
- package/node/src/host_fs.c +126 -0
- package/node/src/host_http.c +486 -0
- package/node/src/host_os.c +505 -0
- package/node/src/host_sys.c +78 -0
- package/node/third_party/libuv/LICENSE +19 -0
- package/node/third_party/libuv/include/uv/aix.h +32 -0
- package/node/third_party/libuv/include/uv/bsd.h +34 -0
- package/node/third_party/libuv/include/uv/darwin.h +61 -0
- package/node/third_party/libuv/include/uv/errno.h +483 -0
- package/node/third_party/libuv/include/uv/linux.h +34 -0
- package/node/third_party/libuv/include/uv/os390.h +33 -0
- package/node/third_party/libuv/include/uv/posix.h +31 -0
- package/node/third_party/libuv/include/uv/sunos.h +44 -0
- package/node/third_party/libuv/include/uv/threadpool.h +37 -0
- package/node/third_party/libuv/include/uv/tree.h +521 -0
- package/node/third_party/libuv/include/uv/unix.h +512 -0
- package/node/third_party/libuv/include/uv/version.h +43 -0
- package/node/third_party/libuv/include/uv/win.h +698 -0
- package/node/third_party/libuv/include/uv.h +1990 -0
- package/node/third_party/libuv/src/fs-poll.c +290 -0
- package/node/third_party/libuv/src/heap-inl.h +245 -0
- package/node/third_party/libuv/src/idna.c +560 -0
- package/node/third_party/libuv/src/idna.h +31 -0
- package/node/third_party/libuv/src/inet.c +298 -0
- package/node/third_party/libuv/src/queue.h +90 -0
- package/node/third_party/libuv/src/random.c +123 -0
- package/node/third_party/libuv/src/strscpy.c +38 -0
- package/node/third_party/libuv/src/strscpy.h +39 -0
- package/node/third_party/libuv/src/strtok.c +52 -0
- package/node/third_party/libuv/src/strtok.h +27 -0
- package/node/third_party/libuv/src/thread-common.c +175 -0
- package/node/third_party/libuv/src/threadpool.c +419 -0
- package/node/third_party/libuv/src/timer.c +200 -0
- package/node/third_party/libuv/src/unix/async.c +418 -0
- package/node/third_party/libuv/src/unix/bsd-ifaddrs.c +164 -0
- package/node/third_party/libuv/src/unix/core.c +2104 -0
- package/node/third_party/libuv/src/unix/darwin-proctitle.c +176 -0
- package/node/third_party/libuv/src/unix/darwin-stub.h +97 -0
- package/node/third_party/libuv/src/unix/darwin-syscalls.h +17 -0
- package/node/third_party/libuv/src/unix/darwin.c +237 -0
- package/node/third_party/libuv/src/unix/dl.c +80 -0
- package/node/third_party/libuv/src/unix/fs.c +2303 -0
- package/node/third_party/libuv/src/unix/fsevents.c +906 -0
- package/node/third_party/libuv/src/unix/getaddrinfo.c +252 -0
- package/node/third_party/libuv/src/unix/getnameinfo.c +121 -0
- package/node/third_party/libuv/src/unix/internal.h +530 -0
- package/node/third_party/libuv/src/unix/kqueue.c +667 -0
- package/node/third_party/libuv/src/unix/linux.c +2761 -0
- package/node/third_party/libuv/src/unix/loop-watcher.c +68 -0
- package/node/third_party/libuv/src/unix/loop.c +240 -0
- package/node/third_party/libuv/src/unix/pipe.c +555 -0
- package/node/third_party/libuv/src/unix/poll.c +159 -0
- package/node/third_party/libuv/src/unix/process.c +1123 -0
- package/node/third_party/libuv/src/unix/procfs-exepath.c +45 -0
- package/node/third_party/libuv/src/unix/proctitle.c +157 -0
- package/node/third_party/libuv/src/unix/random-devurandom.c +93 -0
- package/node/third_party/libuv/src/unix/random-getentropy.c +57 -0
- package/node/third_party/libuv/src/unix/random-getrandom.c +86 -0
- package/node/third_party/libuv/src/unix/random-sysctl-linux.c +99 -0
- package/node/third_party/libuv/src/unix/signal.c +581 -0
- package/node/third_party/libuv/src/unix/stream.c +1567 -0
- package/node/third_party/libuv/src/unix/tcp.c +673 -0
- package/node/third_party/libuv/src/unix/thread.c +975 -0
- package/node/third_party/libuv/src/unix/tty.c +510 -0
- package/node/third_party/libuv/src/unix/udp.c +1434 -0
- package/node/third_party/libuv/src/uv-common.c +1051 -0
- package/node/third_party/libuv/src/uv-common.h +474 -0
- package/node/third_party/libuv/src/uv-data-getter-setters.c +119 -0
- package/node/third_party/libuv/src/version.c +45 -0
- package/node/third_party/llhttp/LICENSE +22 -0
- package/node/third_party/llhttp/api.c +509 -0
- package/node/third_party/llhttp/http.c +170 -0
- package/node/third_party/llhttp/llhttp.c +10099 -0
- package/node/third_party/llhttp/llhttp.h +907 -0
- package/package.json +25 -4
- package/runtime/include/js_atoms.gen.h +68 -0
- package/runtime/include/js_atoms.h +54 -0
- package/runtime/include/js_bigint.h +93 -0
- package/runtime/include/js_buffer.h +79 -0
- package/runtime/include/js_builtins.h +168 -0
- package/runtime/include/js_console.h +58 -0
- package/runtime/include/js_convert.h +22 -0
- package/runtime/include/js_core.def +188 -0
- package/runtime/include/js_crypto.h +58 -0
- package/runtime/include/js_error.h +37 -0
- package/runtime/include/js_exception.h +65 -0
- package/runtime/include/js_function.h +167 -0
- package/runtime/include/js_gc.h +195 -0
- package/runtime/include/js_generator.h +96 -0
- package/runtime/include/js_host.h +19 -0
- package/runtime/include/js_jobs.h +84 -0
- package/runtime/include/js_module.h +16 -0
- package/runtime/include/js_object.h +384 -0
- package/runtime/include/js_ops.h +111 -0
- package/runtime/include/js_promise.h +45 -0
- package/runtime/include/js_regexp.h +25 -0
- package/runtime/include/js_runtime.h +30 -0
- package/runtime/include/js_symbol.h +62 -0
- package/runtime/include/js_web.h +110 -0
- package/runtime/include/jscell.h +48 -0
- package/runtime/include/jscontext.h +240 -0
- package/runtime/include/jsnum.h +42 -0
- package/runtime/include/jsstring.h +161 -0
- package/runtime/include/jsvalue.h +142 -0
- package/runtime/src/arguments.c +115 -0
- package/runtime/src/array.c +1145 -0
- package/runtime/src/arraybuffer.c +608 -0
- package/runtime/src/async_iter.c +479 -0
- package/runtime/src/atoms.c +157 -0
- package/runtime/src/base64.c +107 -0
- package/runtime/src/bigint.c +1189 -0
- package/runtime/src/blob.c +371 -0
- package/runtime/src/buffer.c +1357 -0
- package/runtime/src/builtin_table.c +100 -0
- package/runtime/src/builtins.c +987 -0
- package/runtime/src/builtins_util.h +53 -0
- package/runtime/src/collections.c +912 -0
- package/runtime/src/components.c +28 -0
- package/runtime/src/console.c +637 -0
- package/runtime/src/convert.c +82 -0
- package/runtime/src/core_all.c +21 -0
- package/runtime/src/crypto.c +116 -0
- package/runtime/src/crypto_asym.c +644 -0
- package/runtime/src/crypto_cipher.c +671 -0
- package/runtime/src/crypto_hash.c +260 -0
- package/runtime/src/crypto_host.c +414 -0
- package/runtime/src/crypto_internal.h +304 -0
- package/runtime/src/crypto_kdf.c +143 -0
- package/runtime/src/crypto_key.c +171 -0
- package/runtime/src/crypto_pkey.c +794 -0
- package/runtime/src/crypto_subtle.c +1675 -0
- package/runtime/src/date.c +940 -0
- package/runtime/src/domexception.c +169 -0
- package/runtime/src/elements.c +312 -0
- package/runtime/src/elements.h +45 -0
- package/runtime/src/encoding.c +485 -0
- package/runtime/src/error.c +297 -0
- package/runtime/src/events.c +793 -0
- package/runtime/src/exception.c +56 -0
- package/runtime/src/fetch.c +772 -0
- package/runtime/src/function.c +530 -0
- package/runtime/src/gc.c +803 -0
- package/runtime/src/generator.c +218 -0
- package/runtime/src/global.c +119 -0
- package/runtime/src/headers.c +557 -0
- package/runtime/src/inspect.c +1792 -0
- package/runtime/src/internal.h +80 -0
- package/runtime/src/iterate.c +94 -0
- package/runtime/src/iterator.c +409 -0
- package/runtime/src/jobs.c +337 -0
- package/runtime/src/jsnum.c +353 -0
- package/runtime/src/json.c +1028 -0
- package/runtime/src/math.c +243 -0
- package/runtime/src/module.c +336 -0
- package/runtime/src/number.c +176 -0
- package/runtime/src/object.c +1265 -0
- package/runtime/src/ops.c +322 -0
- package/runtime/src/os.c +196 -0
- package/runtime/src/os.h +29 -0
- package/runtime/src/process.c +432 -0
- package/runtime/src/promise.c +721 -0
- package/runtime/src/proxy.c +570 -0
- package/runtime/src/reflect.c +194 -0
- package/runtime/src/regexp.c +1141 -0
- package/runtime/src/regexp_anchor.h +34 -0
- package/runtime/src/regexp_message.h +32 -0
- package/runtime/src/shape.c +294 -0
- package/runtime/src/shape.h +46 -0
- package/runtime/src/streams.c +1046 -0
- package/runtime/src/streams.h +47 -0
- package/runtime/src/string.c +364 -0
- package/runtime/src/string_builtins.c +837 -0
- package/runtime/src/symbol.c +143 -0
- package/runtime/src/test_host.c +59 -0
- package/runtime/src/typedarray.c +1330 -0
- package/runtime/src/tznames.gen.h +712 -0
- package/runtime/src/uri.c +169 -0
- package/runtime/src/url.c +2116 -0
- package/runtime/src/weak.c +486 -0
- package/runtime/src/web.c +214 -0
- package/runtime/src/wrapper.c +59 -0
- package/runtime/src/writable.c +1486 -0
- package/runtime/third_party/ada-idna/LICENSE-MIT +18 -0
- package/runtime/third_party/ada-idna/README.md +27 -0
- package/runtime/third_party/ada-idna/convert.mjs +83 -0
- package/runtime/third_party/ada-idna/idna.c +416 -0
- package/runtime/third_party/ada-idna/idna.h +15 -0
- package/runtime/third_party/ada-idna/idna_tables.h +2657 -0
- package/runtime/third_party/bearssl/LICENSE.txt +21 -0
- package/runtime/third_party/bearssl/README.txt +136 -0
- package/runtime/third_party/bearssl/VERSION +1 -0
- package/runtime/third_party/bearssl/inc/bearssl.h +183 -0
- package/runtime/third_party/bearssl/inc/bearssl_aead.h +1059 -0
- package/runtime/third_party/bearssl/inc/bearssl_block.h +2618 -0
- package/runtime/third_party/bearssl/inc/bearssl_ec.h +967 -0
- package/runtime/third_party/bearssl/inc/bearssl_hash.h +1346 -0
- package/runtime/third_party/bearssl/inc/bearssl_hmac.h +241 -0
- package/runtime/third_party/bearssl/inc/bearssl_kdf.h +284 -0
- package/runtime/third_party/bearssl/inc/bearssl_pem.h +294 -0
- package/runtime/third_party/bearssl/inc/bearssl_prf.h +150 -0
- package/runtime/third_party/bearssl/inc/bearssl_rand.h +397 -0
- package/runtime/third_party/bearssl/inc/bearssl_rsa.h +1655 -0
- package/runtime/third_party/bearssl/inc/bearssl_ssl.h +4296 -0
- package/runtime/third_party/bearssl/inc/bearssl_x509.h +1474 -0
- package/runtime/third_party/bearssl/src/aead/ccm.c +346 -0
- package/runtime/third_party/bearssl/src/aead/eax.c +525 -0
- package/runtime/third_party/bearssl/src/aead/gcm.c +318 -0
- package/runtime/third_party/bearssl/src/codec/ccopy.c +44 -0
- package/runtime/third_party/bearssl/src/codec/dec16be.c +38 -0
- package/runtime/third_party/bearssl/src/codec/dec16le.c +38 -0
- package/runtime/third_party/bearssl/src/codec/dec32be.c +38 -0
- package/runtime/third_party/bearssl/src/codec/dec32le.c +38 -0
- package/runtime/third_party/bearssl/src/codec/dec64be.c +38 -0
- package/runtime/third_party/bearssl/src/codec/dec64le.c +38 -0
- package/runtime/third_party/bearssl/src/codec/enc16be.c +38 -0
- package/runtime/third_party/bearssl/src/codec/enc16le.c +38 -0
- package/runtime/third_party/bearssl/src/codec/enc32be.c +38 -0
- package/runtime/third_party/bearssl/src/codec/enc32le.c +38 -0
- package/runtime/third_party/bearssl/src/codec/enc64be.c +38 -0
- package/runtime/third_party/bearssl/src/codec/enc64le.c +38 -0
- package/runtime/third_party/bearssl/src/codec/pemdec.c +526 -0
- package/runtime/third_party/bearssl/src/codec/pemdec.t0 +314 -0
- package/runtime/third_party/bearssl/src/codec/pemenc.c +173 -0
- package/runtime/third_party/bearssl/src/config.h +247 -0
- package/runtime/third_party/bearssl/src/ec/ec_all_m15.c +121 -0
- package/runtime/third_party/bearssl/src/ec/ec_all_m31.c +171 -0
- package/runtime/third_party/bearssl/src/ec/ec_c25519_i15.c +398 -0
- package/runtime/third_party/bearssl/src/ec/ec_c25519_i31.c +390 -0
- package/runtime/third_party/bearssl/src/ec/ec_c25519_m15.c +1478 -0
- package/runtime/third_party/bearssl/src/ec/ec_c25519_m31.c +800 -0
- package/runtime/third_party/bearssl/src/ec/ec_c25519_m62.c +605 -0
- package/runtime/third_party/bearssl/src/ec/ec_c25519_m64.c +831 -0
- package/runtime/third_party/bearssl/src/ec/ec_curve25519.c +46 -0
- package/runtime/third_party/bearssl/src/ec/ec_default.c +36 -0
- package/runtime/third_party/bearssl/src/ec/ec_keygen.c +86 -0
- package/runtime/third_party/bearssl/src/ec/ec_p256_m15.c +2124 -0
- package/runtime/third_party/bearssl/src/ec/ec_p256_m31.c +1469 -0
- package/runtime/third_party/bearssl/src/ec/ec_p256_m62.c +1765 -0
- package/runtime/third_party/bearssl/src/ec/ec_p256_m64.c +1781 -0
- package/runtime/third_party/bearssl/src/ec/ec_prime_i15.c +824 -0
- package/runtime/third_party/bearssl/src/ec/ec_prime_i31.c +826 -0
- package/runtime/third_party/bearssl/src/ec/ec_pubkey.c +85 -0
- package/runtime/third_party/bearssl/src/ec/ec_secp256r1.c +51 -0
- package/runtime/third_party/bearssl/src/ec/ec_secp384r1.c +57 -0
- package/runtime/third_party/bearssl/src/ec/ec_secp521r1.c +64 -0
- package/runtime/third_party/bearssl/src/ec/ecdsa_atr.c +134 -0
- package/runtime/third_party/bearssl/src/ec/ecdsa_default_sign_asn1.c +36 -0
- package/runtime/third_party/bearssl/src/ec/ecdsa_default_sign_raw.c +36 -0
- package/runtime/third_party/bearssl/src/ec/ecdsa_default_vrfy_asn1.c +36 -0
- package/runtime/third_party/bearssl/src/ec/ecdsa_default_vrfy_raw.c +36 -0
- package/runtime/third_party/bearssl/src/ec/ecdsa_i15_bits.c +47 -0
- package/runtime/third_party/bearssl/src/ec/ecdsa_i15_sign_asn1.c +45 -0
- package/runtime/third_party/bearssl/src/ec/ecdsa_i15_sign_raw.c +174 -0
- package/runtime/third_party/bearssl/src/ec/ecdsa_i15_vrfy_asn1.c +48 -0
- package/runtime/third_party/bearssl/src/ec/ecdsa_i15_vrfy_raw.c +166 -0
- package/runtime/third_party/bearssl/src/ec/ecdsa_i31_bits.c +47 -0
- package/runtime/third_party/bearssl/src/ec/ecdsa_i31_sign_asn1.c +45 -0
- package/runtime/third_party/bearssl/src/ec/ecdsa_i31_sign_raw.c +173 -0
- package/runtime/third_party/bearssl/src/ec/ecdsa_i31_vrfy_asn1.c +48 -0
- package/runtime/third_party/bearssl/src/ec/ecdsa_i31_vrfy_raw.c +165 -0
- package/runtime/third_party/bearssl/src/ec/ecdsa_rta.c +121 -0
- package/runtime/third_party/bearssl/src/hash/dig_oid.c +84 -0
- package/runtime/third_party/bearssl/src/hash/dig_size.c +50 -0
- package/runtime/third_party/bearssl/src/hash/ghash_ctmul.c +345 -0
- package/runtime/third_party/bearssl/src/hash/ghash_ctmul32.c +251 -0
- package/runtime/third_party/bearssl/src/hash/ghash_ctmul64.c +154 -0
- package/runtime/third_party/bearssl/src/hash/ghash_pclmul.c +389 -0
- package/runtime/third_party/bearssl/src/hash/ghash_pwr8.c +411 -0
- package/runtime/third_party/bearssl/src/hash/md5.c +208 -0
- package/runtime/third_party/bearssl/src/hash/md5sha1.c +141 -0
- package/runtime/third_party/bearssl/src/hash/mgf1.c +56 -0
- package/runtime/third_party/bearssl/src/hash/multihash.c +166 -0
- package/runtime/third_party/bearssl/src/hash/sha1.c +191 -0
- package/runtime/third_party/bearssl/src/hash/sha2big.c +285 -0
- package/runtime/third_party/bearssl/src/hash/sha2small.c +341 -0
- package/runtime/third_party/bearssl/src/inner.h +2577 -0
- package/runtime/third_party/bearssl/src/int/i15_add.c +46 -0
- package/runtime/third_party/bearssl/src/int/i15_bitlen.c +44 -0
- package/runtime/third_party/bearssl/src/int/i15_decmod.c +124 -0
- package/runtime/third_party/bearssl/src/int/i15_decode.c +56 -0
- package/runtime/third_party/bearssl/src/int/i15_decred.c +100 -0
- package/runtime/third_party/bearssl/src/int/i15_encode.c +56 -0
- package/runtime/third_party/bearssl/src/int/i15_fmont.c +59 -0
- package/runtime/third_party/bearssl/src/int/i15_iszero.c +39 -0
- package/runtime/third_party/bearssl/src/int/i15_moddiv.c +465 -0
- package/runtime/third_party/bearssl/src/int/i15_modpow.c +50 -0
- package/runtime/third_party/bearssl/src/int/i15_modpow2.c +160 -0
- package/runtime/third_party/bearssl/src/int/i15_montmul.c +184 -0
- package/runtime/third_party/bearssl/src/int/i15_mulacc.c +61 -0
- package/runtime/third_party/bearssl/src/int/i15_muladd.c +173 -0
- package/runtime/third_party/bearssl/src/int/i15_ninv15.c +38 -0
- package/runtime/third_party/bearssl/src/int/i15_reduce.c +66 -0
- package/runtime/third_party/bearssl/src/int/i15_rshift.c +47 -0
- package/runtime/third_party/bearssl/src/int/i15_sub.c +46 -0
- package/runtime/third_party/bearssl/src/int/i15_tmont.c +36 -0
- package/runtime/third_party/bearssl/src/int/i31_add.c +46 -0
- package/runtime/third_party/bearssl/src/int/i31_bitlen.c +44 -0
- package/runtime/third_party/bearssl/src/int/i31_decmod.c +124 -0
- package/runtime/third_party/bearssl/src/int/i31_decode.c +57 -0
- package/runtime/third_party/bearssl/src/int/i31_decred.c +103 -0
- package/runtime/third_party/bearssl/src/int/i31_encode.c +79 -0
- package/runtime/third_party/bearssl/src/int/i31_fmont.c +60 -0
- package/runtime/third_party/bearssl/src/int/i31_iszero.c +39 -0
- package/runtime/third_party/bearssl/src/int/i31_moddiv.c +488 -0
- package/runtime/third_party/bearssl/src/int/i31_modpow.c +65 -0
- package/runtime/third_party/bearssl/src/int/i31_modpow2.c +160 -0
- package/runtime/third_party/bearssl/src/int/i31_montmul.c +127 -0
- package/runtime/third_party/bearssl/src/int/i31_mulacc.c +74 -0
- package/runtime/third_party/bearssl/src/int/i31_muladd.c +157 -0
- package/runtime/third_party/bearssl/src/int/i31_ninv31.c +39 -0
- package/runtime/third_party/bearssl/src/int/i31_reduce.c +66 -0
- package/runtime/third_party/bearssl/src/int/i31_rshift.c +47 -0
- package/runtime/third_party/bearssl/src/int/i31_sub.c +46 -0
- package/runtime/third_party/bearssl/src/int/i31_tmont.c +36 -0
- package/runtime/third_party/bearssl/src/int/i32_add.c +51 -0
- package/runtime/third_party/bearssl/src/int/i32_bitlen.c +44 -0
- package/runtime/third_party/bearssl/src/int/i32_decmod.c +77 -0
- package/runtime/third_party/bearssl/src/int/i32_decode.c +63 -0
- package/runtime/third_party/bearssl/src/int/i32_decred.c +107 -0
- package/runtime/third_party/bearssl/src/int/i32_div32.c +56 -0
- package/runtime/third_party/bearssl/src/int/i32_encode.c +72 -0
- package/runtime/third_party/bearssl/src/int/i32_fmont.c +60 -0
- package/runtime/third_party/bearssl/src/int/i32_iszero.c +39 -0
- package/runtime/third_party/bearssl/src/int/i32_modpow.c +65 -0
- package/runtime/third_party/bearssl/src/int/i32_montmul.c +69 -0
- package/runtime/third_party/bearssl/src/int/i32_mulacc.c +56 -0
- package/runtime/third_party/bearssl/src/int/i32_muladd.c +138 -0
- package/runtime/third_party/bearssl/src/int/i32_ninv32.c +39 -0
- package/runtime/third_party/bearssl/src/int/i32_reduce.c +66 -0
- package/runtime/third_party/bearssl/src/int/i32_sub.c +51 -0
- package/runtime/third_party/bearssl/src/int/i32_tmont.c +36 -0
- package/runtime/third_party/bearssl/src/int/i62_modpow2.c +493 -0
- package/runtime/third_party/bearssl/src/kdf/hkdf.c +107 -0
- package/runtime/third_party/bearssl/src/kdf/shake.c +590 -0
- package/runtime/third_party/bearssl/src/mac/hmac.c +122 -0
- package/runtime/third_party/bearssl/src/mac/hmac_ct.c +193 -0
- package/runtime/third_party/bearssl/src/rand/aesctr_drbg.c +206 -0
- package/runtime/third_party/bearssl/src/rand/hmac_drbg.c +157 -0
- package/runtime/third_party/bearssl/src/rand/sysrng.c +252 -0
- package/runtime/third_party/bearssl/src/rsa/rsa_default_keygen.c +38 -0
- package/runtime/third_party/bearssl/src/rsa/rsa_default_modulus.c +36 -0
- package/runtime/third_party/bearssl/src/rsa/rsa_default_oaep_decrypt.c +38 -0
- package/runtime/third_party/bearssl/src/rsa/rsa_default_oaep_encrypt.c +38 -0
- package/runtime/third_party/bearssl/src/rsa/rsa_default_pkcs1_sign.c +38 -0
- package/runtime/third_party/bearssl/src/rsa/rsa_default_pkcs1_vrfy.c +38 -0
- package/runtime/third_party/bearssl/src/rsa/rsa_default_priv.c +38 -0
- package/runtime/third_party/bearssl/src/rsa/rsa_default_privexp.c +36 -0
- package/runtime/third_party/bearssl/src/rsa/rsa_default_pss_sign.c +38 -0
- package/runtime/third_party/bearssl/src/rsa/rsa_default_pss_vrfy.c +38 -0
- package/runtime/third_party/bearssl/src/rsa/rsa_default_pub.c +38 -0
- package/runtime/third_party/bearssl/src/rsa/rsa_default_pubexp.c +36 -0
- package/runtime/third_party/bearssl/src/rsa/rsa_i15_keygen.c +583 -0
- package/runtime/third_party/bearssl/src/rsa/rsa_i15_modulus.c +99 -0
- package/runtime/third_party/bearssl/src/rsa/rsa_i15_oaep_decrypt.c +41 -0
- package/runtime/third_party/bearssl/src/rsa/rsa_i15_oaep_encrypt.c +44 -0
- package/runtime/third_party/bearssl/src/rsa/rsa_i15_pkcs1_sign.c +37 -0
- package/runtime/third_party/bearssl/src/rsa/rsa_i15_pkcs1_vrfy.c +43 -0
- package/runtime/third_party/bearssl/src/rsa/rsa_i15_priv.c +209 -0
- package/runtime/third_party/bearssl/src/rsa/rsa_i15_privexp.c +320 -0
- package/runtime/third_party/bearssl/src/rsa/rsa_i15_pss_sign.c +40 -0
- package/runtime/third_party/bearssl/src/rsa/rsa_i15_pss_vrfy.c +44 -0
- package/runtime/third_party/bearssl/src/rsa/rsa_i15_pub.c +113 -0
- package/runtime/third_party/bearssl/src/rsa/rsa_i15_pubexp.c +152 -0
- package/runtime/third_party/bearssl/src/rsa/rsa_i31_keygen.c +37 -0
- package/runtime/third_party/bearssl/src/rsa/rsa_i31_keygen_inner.c +608 -0
- package/runtime/third_party/bearssl/src/rsa/rsa_i31_modulus.c +99 -0
- package/runtime/third_party/bearssl/src/rsa/rsa_i31_oaep_decrypt.c +41 -0
- package/runtime/third_party/bearssl/src/rsa/rsa_i31_oaep_encrypt.c +44 -0
- package/runtime/third_party/bearssl/src/rsa/rsa_i31_pkcs1_sign.c +37 -0
- package/runtime/third_party/bearssl/src/rsa/rsa_i31_pkcs1_vrfy.c +43 -0
- package/runtime/third_party/bearssl/src/rsa/rsa_i31_priv.c +203 -0
- package/runtime/third_party/bearssl/src/rsa/rsa_i31_privexp.c +318 -0
- package/runtime/third_party/bearssl/src/rsa/rsa_i31_pss_sign.c +40 -0
- package/runtime/third_party/bearssl/src/rsa/rsa_i31_pss_vrfy.c +44 -0
- package/runtime/third_party/bearssl/src/rsa/rsa_i31_pub.c +106 -0
- package/runtime/third_party/bearssl/src/rsa/rsa_i31_pubexp.c +152 -0
- package/runtime/third_party/bearssl/src/rsa/rsa_i32_oaep_decrypt.c +41 -0
- package/runtime/third_party/bearssl/src/rsa/rsa_i32_oaep_encrypt.c +44 -0
- package/runtime/third_party/bearssl/src/rsa/rsa_i32_pkcs1_sign.c +37 -0
- package/runtime/third_party/bearssl/src/rsa/rsa_i32_pkcs1_vrfy.c +43 -0
- package/runtime/third_party/bearssl/src/rsa/rsa_i32_priv.c +160 -0
- package/runtime/third_party/bearssl/src/rsa/rsa_i32_pss_sign.c +40 -0
- package/runtime/third_party/bearssl/src/rsa/rsa_i32_pss_vrfy.c +44 -0
- package/runtime/third_party/bearssl/src/rsa/rsa_i32_pub.c +77 -0
- package/runtime/third_party/bearssl/src/rsa/rsa_i62_keygen.c +57 -0
- package/runtime/third_party/bearssl/src/rsa/rsa_i62_oaep_decrypt.c +61 -0
- package/runtime/third_party/bearssl/src/rsa/rsa_i62_oaep_encrypt.c +64 -0
- package/runtime/third_party/bearssl/src/rsa/rsa_i62_pkcs1_sign.c +57 -0
- package/runtime/third_party/bearssl/src/rsa/rsa_i62_pkcs1_vrfy.c +63 -0
- package/runtime/third_party/bearssl/src/rsa/rsa_i62_priv.c +223 -0
- package/runtime/third_party/bearssl/src/rsa/rsa_i62_pss_sign.c +60 -0
- package/runtime/third_party/bearssl/src/rsa/rsa_i62_pss_vrfy.c +64 -0
- package/runtime/third_party/bearssl/src/rsa/rsa_i62_pub.c +125 -0
- package/runtime/third_party/bearssl/src/rsa/rsa_oaep_pad.c +112 -0
- package/runtime/third_party/bearssl/src/rsa/rsa_oaep_unpad.c +145 -0
- package/runtime/third_party/bearssl/src/rsa/rsa_pkcs1_sig_pad.c +100 -0
- package/runtime/third_party/bearssl/src/rsa/rsa_pkcs1_sig_unpad.c +121 -0
- package/runtime/third_party/bearssl/src/rsa/rsa_pss_sig_pad.c +106 -0
- package/runtime/third_party/bearssl/src/rsa/rsa_pss_sig_unpad.c +121 -0
- package/runtime/third_party/bearssl/src/rsa/rsa_ssl_decrypt.c +52 -0
- package/runtime/third_party/bearssl/src/settings.c +306 -0
- package/runtime/third_party/bearssl/src/symcipher/aes_big_cbcdec.c +69 -0
- package/runtime/third_party/bearssl/src/symcipher/aes_big_cbcenc.c +67 -0
- package/runtime/third_party/bearssl/src/symcipher/aes_big_ctr.c +84 -0
- package/runtime/third_party/bearssl/src/symcipher/aes_big_ctrcbc.c +142 -0
- package/runtime/third_party/bearssl/src/symcipher/aes_big_dec.c +254 -0
- package/runtime/third_party/bearssl/src/symcipher/aes_big_enc.c +157 -0
- package/runtime/third_party/bearssl/src/symcipher/aes_common.c +112 -0
- package/runtime/third_party/bearssl/src/symcipher/aes_ct.c +328 -0
- package/runtime/third_party/bearssl/src/symcipher/aes_ct64.c +398 -0
- package/runtime/third_party/bearssl/src/symcipher/aes_ct64_cbcdec.c +104 -0
- package/runtime/third_party/bearssl/src/symcipher/aes_ct64_cbcenc.c +81 -0
- package/runtime/third_party/bearssl/src/symcipher/aes_ct64_ctr.c +114 -0
- package/runtime/third_party/bearssl/src/symcipher/aes_ct64_ctrcbc.c +433 -0
- package/runtime/third_party/bearssl/src/symcipher/aes_ct64_dec.c +159 -0
- package/runtime/third_party/bearssl/src/symcipher/aes_ct64_enc.c +115 -0
- package/runtime/third_party/bearssl/src/symcipher/aes_ct_cbcdec.c +111 -0
- package/runtime/third_party/bearssl/src/symcipher/aes_ct_cbcenc.c +91 -0
- package/runtime/third_party/bearssl/src/symcipher/aes_ct_ctr.c +116 -0
- package/runtime/third_party/bearssl/src/symcipher/aes_ct_ctrcbc.c +422 -0
- package/runtime/third_party/bearssl/src/symcipher/aes_ct_dec.c +170 -0
- package/runtime/third_party/bearssl/src/symcipher/aes_ct_enc.c +112 -0
- package/runtime/third_party/bearssl/src/symcipher/aes_pwr8.c +445 -0
- package/runtime/third_party/bearssl/src/symcipher/aes_pwr8_cbcdec.c +670 -0
- package/runtime/third_party/bearssl/src/symcipher/aes_pwr8_cbcenc.c +417 -0
- package/runtime/third_party/bearssl/src/symcipher/aes_pwr8_ctr.c +717 -0
- package/runtime/third_party/bearssl/src/symcipher/aes_pwr8_ctrcbc.c +946 -0
- package/runtime/third_party/bearssl/src/symcipher/aes_small_cbcdec.c +69 -0
- package/runtime/third_party/bearssl/src/symcipher/aes_small_cbcenc.c +67 -0
- package/runtime/third_party/bearssl/src/symcipher/aes_small_ctr.c +84 -0
- package/runtime/third_party/bearssl/src/symcipher/aes_small_ctrcbc.c +142 -0
- package/runtime/third_party/bearssl/src/symcipher/aes_small_dec.c +176 -0
- package/runtime/third_party/bearssl/src/symcipher/aes_small_enc.c +129 -0
- package/runtime/third_party/bearssl/src/symcipher/aes_x86ni.c +240 -0
- package/runtime/third_party/bearssl/src/symcipher/aes_x86ni_cbcdec.c +223 -0
- package/runtime/third_party/bearssl/src/symcipher/aes_x86ni_cbcenc.c +122 -0
- package/runtime/third_party/bearssl/src/symcipher/aes_x86ni_ctr.c +211 -0
- package/runtime/third_party/bearssl/src/symcipher/aes_x86ni_ctrcbc.c +596 -0
- package/runtime/third_party/bearssl/src/symcipher/chacha20_ct.c +106 -0
- package/runtime/third_party/bearssl/src/symcipher/chacha20_sse2.c +237 -0
- package/runtime/third_party/bearssl/src/symcipher/des_ct.c +411 -0
- package/runtime/third_party/bearssl/src/symcipher/des_ct_cbcdec.c +87 -0
- package/runtime/third_party/bearssl/src/symcipher/des_ct_cbcenc.c +69 -0
- package/runtime/third_party/bearssl/src/symcipher/des_support.c +166 -0
- package/runtime/third_party/bearssl/src/symcipher/des_tab.c +310 -0
- package/runtime/third_party/bearssl/src/symcipher/des_tab_cbcdec.c +85 -0
- package/runtime/third_party/bearssl/src/symcipher/des_tab_cbcenc.c +67 -0
- package/runtime/third_party/bearssl/src/symcipher/poly1305_ctmul.c +260 -0
- package/runtime/third_party/bearssl/src/symcipher/poly1305_ctmul32.c +297 -0
- package/runtime/third_party/bearssl/src/symcipher/poly1305_ctmulq.c +475 -0
- package/runtime/third_party/bearssl/src/symcipher/poly1305_i15.c +221 -0
- package/runtime/third_party/bearssl/src/x509/asn1.t0 +757 -0
- package/runtime/third_party/bearssl/src/x509/asn1enc.c +93 -0
- package/runtime/third_party/bearssl/src/x509/encode_ec_pk8der.c +110 -0
- package/runtime/third_party/bearssl/src/x509/encode_ec_rawder.c +161 -0
- package/runtime/third_party/bearssl/src/x509/encode_rsa_pk8der.c +97 -0
- package/runtime/third_party/bearssl/src/x509/encode_rsa_rawder.c +96 -0
- package/runtime/third_party/bearssl/src/x509/skey_decoder.c +653 -0
- package/runtime/third_party/bearssl/src/x509/skey_decoder.t0 +376 -0
- package/runtime/third_party/bearssl/src/x509/x509_decoder.c +776 -0
- package/runtime/third_party/bearssl/src/x509/x509_decoder.t0 +324 -0
- package/runtime/third_party/bearssl/src/x509/x509_knownkey.c +105 -0
- package/runtime/third_party/bearssl/src/x509/x509_minimal.c +1722 -0
- package/runtime/third_party/bearssl/src/x509/x509_minimal.t0 +1526 -0
- package/runtime/third_party/bearssl/src/x509/x509_minimal_full.c +59 -0
- package/runtime/third_party/quickjs-dtoa/LICENSE +22 -0
- package/runtime/third_party/quickjs-dtoa/README.md +23 -0
- package/runtime/third_party/quickjs-dtoa/dtoa.c +1640 -0
- package/runtime/third_party/quickjs-dtoa/dtoa.h +83 -0
- package/runtime/third_party/quickjs-dtoa/dtoa_compat.h +89 -0
- package/runtime/third_party/quickjs-regexp/LICENSE +22 -0
- package/runtime/third_party/quickjs-regexp/README.md +22 -0
- package/runtime/third_party/quickjs-regexp/cutils.c +641 -0
- package/runtime/third_party/quickjs-regexp/cutils.h +457 -0
- package/runtime/third_party/quickjs-regexp/libregexp-opcode.h +73 -0
- package/runtime/third_party/quickjs-regexp/libregexp.c +3448 -0
- package/runtime/third_party/quickjs-regexp/libregexp.h +65 -0
- package/runtime/third_party/quickjs-regexp/libunicode-table.h +5206 -0
- package/runtime/third_party/quickjs-regexp/libunicode.c +2124 -0
- package/runtime/third_party/quickjs-regexp/libunicode.h +196 -0
- package/runtime/third_party/v8-ieee754/LICENSE +61 -0
- package/runtime/third_party/v8-ieee754/README.md +22 -0
- package/runtime/third_party/v8-ieee754/convert.py +84 -0
- package/runtime/third_party/v8-ieee754/ieee754.c +3030 -0
- package/runtime/third_party/v8-ieee754/ieee754.h +27 -0
- package/runtime/tools/regexp_compile.c +90 -0
|
@@ -0,0 +1,304 @@
|
|
|
1
|
+
/* crypto_internal.h — the crypto primitives (ADR 0018), runtime-private: what Web Crypto (the
|
|
2
|
+
* crypto component) and node:crypto's host primitives share. BearSSL is reached only through
|
|
3
|
+
* the crypto*.c files, behind these. */
|
|
4
|
+
#ifndef JS_CRYPTO_INTERNAL_H
|
|
5
|
+
#define JS_CRYPTO_INTERNAL_H
|
|
6
|
+
|
|
7
|
+
#include <stdbool.h>
|
|
8
|
+
#include <stddef.h>
|
|
9
|
+
#include <stdint.h>
|
|
10
|
+
|
|
11
|
+
#include "bearssl.h"
|
|
12
|
+
#include "js_object.h"
|
|
13
|
+
|
|
14
|
+
/* ---- Hashes ---------------------------------------------------------------------------------- */
|
|
15
|
+
|
|
16
|
+
typedef enum JSHashKind {
|
|
17
|
+
JS_HASH_BEARSSL, /* a BearSSL hash class */
|
|
18
|
+
JS_HASH_SHA512T, /* SHA-512/t: SHA-512 with its own IV, truncated */
|
|
19
|
+
JS_HASH_KECCAK, /* SHA-3 and SHAKE (crypto_hash.c's Keccak) */
|
|
20
|
+
} JSHashKind;
|
|
21
|
+
|
|
22
|
+
typedef struct JSHashAlg {
|
|
23
|
+
const char *name; /* Node's canonical name: "sha256" */
|
|
24
|
+
const char *web; /* Web Crypto's: "SHA-256", or NULL */
|
|
25
|
+
uint8_t kind; /* JSHashKind */
|
|
26
|
+
bool xof; /* SHAKE: any output length */
|
|
27
|
+
uint16_t out_len; /* digest bytes (SHAKE: the default output length) */
|
|
28
|
+
uint16_t block_len; /* HMAC's block (Keccak: the rate) */
|
|
29
|
+
const br_hash_class *br; /* JS_HASH_BEARSSL */
|
|
30
|
+
const uint64_t *iv; /* JS_HASH_SHA512T */
|
|
31
|
+
uint8_t suffix; /* JS_HASH_KECCAK: 0x06 SHA-3, 0x1F SHAKE */
|
|
32
|
+
/* the DER of its AlgorithmIdentifier's OID (PKCS#1 v1.5 signatures), or NULL */
|
|
33
|
+
const unsigned char *oid;
|
|
34
|
+
} JSHashAlg;
|
|
35
|
+
|
|
36
|
+
typedef struct JSKeccak {
|
|
37
|
+
uint64_t a[25];
|
|
38
|
+
uint32_t rate, pos; /* bytes per block; bytes absorbed into this one (or squeezed) */
|
|
39
|
+
bool squeezing;
|
|
40
|
+
} JSKeccak;
|
|
41
|
+
|
|
42
|
+
typedef struct JSHashCtx {
|
|
43
|
+
const JSHashAlg *alg;
|
|
44
|
+
union {
|
|
45
|
+
br_hash_compat_context br;
|
|
46
|
+
JSKeccak keccak;
|
|
47
|
+
} u;
|
|
48
|
+
} JSHashCtx;
|
|
49
|
+
|
|
50
|
+
/* By Node's (OpenSSL's) name or alias, case-insensitive: "sha256", "SHA-256", "RSA-SHA256", … */
|
|
51
|
+
const JSHashAlg *js_hash_by_name(const char *name);
|
|
52
|
+
/* By Web Crypto's name, case-insensitive: "SHA-1", "SHA-256", "SHA-384", "SHA-512". */
|
|
53
|
+
const JSHashAlg *js_hash_by_web_name(const char *name);
|
|
54
|
+
/* Node's crypto.getHashes(), sorted as Node sorts them. */
|
|
55
|
+
extern const char *const js_hash_names[];
|
|
56
|
+
extern const size_t js_hash_names_count;
|
|
57
|
+
|
|
58
|
+
void js_hash_init(JSHashCtx *h, const JSHashAlg *alg);
|
|
59
|
+
void js_hash_update(JSHashCtx *h, const void *data, size_t n);
|
|
60
|
+
/* The digest (n bytes; SHAKE: any n, else at most out_len). Leaves h unusable but for copies made before. */
|
|
61
|
+
void js_hash_final(JSHashCtx *h, uint8_t *out, size_t n);
|
|
62
|
+
/* One call: the digest of data, alg->out_len bytes. */
|
|
63
|
+
void js_hash_once(const JSHashAlg *alg, const void *data, size_t n, uint8_t *out);
|
|
64
|
+
|
|
65
|
+
/* ---- HMAC ------------------------------------------------------------------------------------- */
|
|
66
|
+
|
|
67
|
+
typedef struct JSHmacCtx {
|
|
68
|
+
JSHashCtx inner, outer;
|
|
69
|
+
} JSHmacCtx;
|
|
70
|
+
|
|
71
|
+
/* Any hash but the XOFs. */
|
|
72
|
+
void js_hmac_init(JSHmacCtx *m, const JSHashAlg *alg, const uint8_t *key, size_t key_len);
|
|
73
|
+
void js_hmac_update(JSHmacCtx *m, const void *data, size_t n);
|
|
74
|
+
/* alg->out_len bytes. */
|
|
75
|
+
void js_hmac_final(JSHmacCtx *m, uint8_t *out);
|
|
76
|
+
|
|
77
|
+
/* ---- Key derivation (crypto_kdf.c) ------------------------------------------------------------ */
|
|
78
|
+
|
|
79
|
+
/* PBKDF2-HMAC: false for an XOF or no iterations. */
|
|
80
|
+
bool js_pbkdf2(const JSHashAlg *alg, const uint8_t *pw, size_t pw_len, const uint8_t *salt, size_t salt_len,
|
|
81
|
+
uint32_t iterations, uint8_t *out, size_t n);
|
|
82
|
+
/* HKDF: false for an XOF or more than 255 blocks. An empty salt is the hash's length of zeros. */
|
|
83
|
+
bool js_hkdf(const JSHashAlg *alg, const uint8_t *ikm, size_t ikm_len, const uint8_t *salt, size_t salt_len,
|
|
84
|
+
const uint8_t *info, size_t info_len, uint8_t *out, size_t n);
|
|
85
|
+
/* scrypt's parameters as OpenSSL checks them: 0, or why not. */
|
|
86
|
+
enum { JS_SCRYPT_INVALID = 1, JS_SCRYPT_MEMORY = 2 };
|
|
87
|
+
int js_scrypt_check(uint64_t N, uint64_t r, uint64_t p, uint64_t maxmem);
|
|
88
|
+
/* scrypt with checked parameters: false when its memory can't be allocated. */
|
|
89
|
+
bool js_scrypt(const uint8_t *pw, size_t pw_len, const uint8_t *salt, size_t salt_len, uint64_t N, uint32_t r,
|
|
90
|
+
uint32_t p, uint8_t *out, size_t n);
|
|
91
|
+
|
|
92
|
+
/* ---- Ciphers (crypto_cipher.c) ---------------------------------------------------------------- */
|
|
93
|
+
|
|
94
|
+
typedef enum JSCipherMode {
|
|
95
|
+
JS_CIPHER_ECB, JS_CIPHER_CBC, JS_CIPHER_CFB, JS_CIPHER_CFB1, JS_CIPHER_CFB8, JS_CIPHER_OFB, JS_CIPHER_CTR, JS_CIPHER_GCM,
|
|
96
|
+
JS_CIPHER_CCM, JS_CIPHER_WRAP, JS_CIPHER_WRAP_PAD, JS_CIPHER_CHACHA20, JS_CIPHER_CHACHA20_POLY1305,
|
|
97
|
+
} JSCipherMode;
|
|
98
|
+
|
|
99
|
+
typedef struct JSCipherAlg {
|
|
100
|
+
const char *name; /* as getCiphers lists it */
|
|
101
|
+
const char *info_name; /* getCipherInfo's name (OpenSSL's canonical one) */
|
|
102
|
+
const char *mode_name; /* getCipherInfo's mode */
|
|
103
|
+
uint16_t nid;
|
|
104
|
+
uint8_t mode; /* JSCipherMode */
|
|
105
|
+
uint8_t prim; /* 0 AES, 1 DES-EDE, 2 ChaCha20 */
|
|
106
|
+
uint8_t key_len;
|
|
107
|
+
uint8_t iv_len; /* the default (AEAD) or only length; 0 for none */
|
|
108
|
+
uint8_t block_size; /* getCipherInfo's blockSize; 0 for none */
|
|
109
|
+
} JSCipherAlg;
|
|
110
|
+
|
|
111
|
+
extern const size_t js_cipher_count;
|
|
112
|
+
const JSCipherAlg *js_cipher_at(size_t i);
|
|
113
|
+
/* By a name getCiphers lists, or getCipherInfo's, case-insensitive. */
|
|
114
|
+
const JSCipherAlg *js_cipher_by_name(const char *name);
|
|
115
|
+
const JSCipherAlg *js_cipher_by_nid(int nid);
|
|
116
|
+
/* The AES cipher of a mode and key length (Web Crypto's), or NULL. */
|
|
117
|
+
const JSCipherAlg *js_cipher_aes(uint8_t mode, size_t key_len);
|
|
118
|
+
|
|
119
|
+
/* A growing byte buffer (malloc'd; the owner frees p). */
|
|
120
|
+
typedef struct JSBytesOut {
|
|
121
|
+
uint8_t *p;
|
|
122
|
+
size_t n, cap;
|
|
123
|
+
} JSBytesOut;
|
|
124
|
+
|
|
125
|
+
enum { JS_CIPHER_INIT, JS_CIPHER_UPDATED, JS_CIPHER_FINAL };
|
|
126
|
+
|
|
127
|
+
/* Why an operation failed (each is one of Node's errors) */
|
|
128
|
+
enum {
|
|
129
|
+
JS_CIPHER_ERR_KEYLEN = 1, JS_CIPHER_ERR_IV, JS_CIPHER_ERR_TAG_REQUIRED, JS_CIPHER_ERR_TAG_LENGTH, JS_CIPHER_ERR_STATE,
|
|
130
|
+
JS_CIPHER_ERR_FINALIZED, JS_CIPHER_ERR_FINAL_BLOCK, JS_CIPHER_ERR_BAD_DECRYPT, JS_CIPHER_ERR_AUTH, JS_CIPHER_ERR_TAG_NOT_SET,
|
|
131
|
+
JS_CIPHER_ERR_MESSAGE_LENGTH, JS_CIPHER_ERR_PLAINTEXT_LENGTH,
|
|
132
|
+
};
|
|
133
|
+
|
|
134
|
+
typedef struct JSCipherCtx {
|
|
135
|
+
const JSCipherAlg *alg;
|
|
136
|
+
bool encrypt, padding;
|
|
137
|
+
uint8_t state; /* JS_CIPHER_INIT, … */
|
|
138
|
+
uint8_t blk; /* the block cipher's block: 16, or 8 for DES */
|
|
139
|
+
union { const br_block_cbcenc_class *vtable; br_aes_gen_cbcenc_keys aes; br_des_gen_cbcenc_keys des; } enc;
|
|
140
|
+
union { const br_block_cbcdec_class *vtable; br_aes_gen_cbcdec_keys aes; br_des_gen_cbcdec_keys des; } dec;
|
|
141
|
+
br_aes_gen_ctr_keys ctr; /* GCM's */
|
|
142
|
+
br_aes_gen_ctrcbc_keys ctrcbc; /* CCM's */
|
|
143
|
+
br_gcm_context gcm;
|
|
144
|
+
br_ccm_context ccm;
|
|
145
|
+
uint8_t key[32]; /* ChaCha20's */
|
|
146
|
+
uint8_t iv[16]; /* the chaining value, counter or feedback register; key wrap's IV */
|
|
147
|
+
uint8_t nonce[16]; /* CCM's and ChaCha20's */
|
|
148
|
+
size_t nonce_len;
|
|
149
|
+
uint8_t buf[16]; /* ECB and CBC: input waiting for a whole block */
|
|
150
|
+
size_t buf_len;
|
|
151
|
+
uint8_t ks[64]; /* keystream not used yet */
|
|
152
|
+
size_t ks_pos;
|
|
153
|
+
uint32_t counter; /* ChaCha20's block counter */
|
|
154
|
+
uint8_t tag[16];
|
|
155
|
+
size_t tag_len, given_tag_len;
|
|
156
|
+
bool tag_len_given, tag_set, tag_ready, ccm_length_set, auth_failed;
|
|
157
|
+
size_t ccm_length;
|
|
158
|
+
JSBytesOut aad, data; /* CCM's AAD, ChaCha20-Poly1305's AAD and ciphertext */
|
|
159
|
+
} JSCipherCtx;
|
|
160
|
+
|
|
161
|
+
/* tag_len: the authTagLength option, -1 for none. 0, or a JS_CIPHER_ERR_*. */
|
|
162
|
+
int js_cipher_init(JSCipherCtx *c, const JSCipherAlg *alg, bool encrypt, const uint8_t *key, size_t key_len, const uint8_t *iv,
|
|
163
|
+
size_t iv_len, bool has_iv, long tag_len);
|
|
164
|
+
void js_cipher_free(JSCipherCtx *c);
|
|
165
|
+
int js_cipher_update(JSCipherCtx *c, const uint8_t *p, size_t n, JSBytesOut *out);
|
|
166
|
+
int js_cipher_final(JSCipherCtx *c, JSBytesOut *out);
|
|
167
|
+
/* plaintext_length: CCM's, -1 for none. */
|
|
168
|
+
int js_cipher_set_aad(JSCipherCtx *c, const uint8_t *p, size_t n, long plaintext_length);
|
|
169
|
+
int js_cipher_set_auth_tag(JSCipherCtx *c, const uint8_t *p, size_t n);
|
|
170
|
+
bool js_cipher_get_auth_tag(JSCipherCtx *c, const uint8_t **p, size_t *n);
|
|
171
|
+
bool js_cipher_set_padding(JSCipherCtx *c, bool padding);
|
|
172
|
+
/* Web Crypto's AES-CTR: `bits` counter bits, the rest of the block fixed. False when it would repeat. */
|
|
173
|
+
bool js_aes_ctr_masked(const uint8_t *key, size_t key_len, const uint8_t counter[16], unsigned bits, const uint8_t *in, size_t n,
|
|
174
|
+
uint8_t *out);
|
|
175
|
+
|
|
176
|
+
/* ---- Random bytes ------------------------------------------------------------------------------ */
|
|
177
|
+
|
|
178
|
+
/* Cryptographically secure: an HMAC_DRBG (SHA-256) seeded from the system's entropy. */
|
|
179
|
+
void js_crypto_random(void *out, size_t n);
|
|
180
|
+
|
|
181
|
+
/* Constant time over n bytes: whether they're equal. */
|
|
182
|
+
bool js_crypto_equal(const uint8_t *a, const uint8_t *b, size_t n);
|
|
183
|
+
|
|
184
|
+
/* ---- Keys (crypto_key.c) ------------------------------------------------------------------------ */
|
|
185
|
+
|
|
186
|
+
typedef enum JSKeyType { JS_KEY_SECRET, JS_KEY_PUBLIC, JS_KEY_PRIVATE } JSKeyType;
|
|
187
|
+
|
|
188
|
+
typedef enum JSAsymKind { JS_ASYM_NONE, JS_ASYM_RSA, JS_ASYM_RSA_PSS, JS_ASYM_EC, JS_ASYM_X25519 } JSAsymKind;
|
|
189
|
+
|
|
190
|
+
/* The parts of an asymmetric key, by index: RSA's integers (big-endian, minimal), an EC or X25519
|
|
191
|
+
* key's public point (uncompressed for EC) and private scalar. */
|
|
192
|
+
enum { JS_RSA_N, JS_RSA_E, JS_RSA_D, JS_RSA_P, JS_RSA_Q, JS_RSA_DP, JS_RSA_DQ, JS_RSA_QI, JS_KEY_PARTS };
|
|
193
|
+
enum { JS_EC_PUB, JS_EC_PRIV };
|
|
194
|
+
|
|
195
|
+
typedef struct JSKeyPart {
|
|
196
|
+
uint8_t *p;
|
|
197
|
+
size_t n;
|
|
198
|
+
} JSKeyPart;
|
|
199
|
+
|
|
200
|
+
/* Key material: a handle that CryptoKey and node:crypto's KeyObject share. Every buffer is
|
|
201
|
+
* malloc'd and wiped when the handle is collected. */
|
|
202
|
+
typedef struct JSKeyData {
|
|
203
|
+
JSObject obj;
|
|
204
|
+
uint8_t type; /* JSKeyType */
|
|
205
|
+
uint8_t kind; /* JSAsymKind; NONE for a secret key */
|
|
206
|
+
uint8_t *bytes; /* a secret key's */
|
|
207
|
+
size_t len;
|
|
208
|
+
JSKeyPart part[JS_KEY_PARTS];
|
|
209
|
+
int curve; /* EC and X25519: BR_EC_* */
|
|
210
|
+
/* RSA-PSS keys restricted to parameters (their AlgorithmIdentifier has them) */
|
|
211
|
+
bool pss_params;
|
|
212
|
+
const JSHashAlg *pss_hash, *pss_mgf1;
|
|
213
|
+
uint32_t pss_salt;
|
|
214
|
+
} JSKeyData;
|
|
215
|
+
|
|
216
|
+
JSKeyData *js_key_data(JSValue v);
|
|
217
|
+
/* A secret key holding a copy of the bytes. */
|
|
218
|
+
JSValue js_new_secret_key(JSContext *ctx, const uint8_t *p, size_t n);
|
|
219
|
+
/* An empty asymmetric key of a type and kind, for crypto_pkey.c to fill. */
|
|
220
|
+
JSKeyData *js_new_asym_key(JSContext *ctx, uint8_t type, uint8_t kind);
|
|
221
|
+
void js_key_part_set(JSKeyPart *part, const uint8_t *p, size_t n);
|
|
222
|
+
/* The key encodings (the node:crypto primitives' codes too), and DER in and out (crypto_pkey.c):
|
|
223
|
+
* 0, or an error code (1 not decodable, 2 bad DER, 3 a key type not provided, 4 an encoding
|
|
224
|
+
* the key can't have). */
|
|
225
|
+
enum { JS_KEY_ENC_SPKI, JS_KEY_ENC_PKCS1, JS_KEY_ENC_PKCS8, JS_KEY_ENC_SEC1, JS_KEY_ENC_CERT };
|
|
226
|
+
int js_key_parse_der(JSContext *ctx, const uint8_t *p, size_t n, int enc, bool priv, JSValue *out);
|
|
227
|
+
int js_key_export_der(const JSKeyData *k, int enc, JSBytesOut *o);
|
|
228
|
+
/* A key from its parts (RSA's integers; EC's uncompressed point and scalar; X25519's): only the
|
|
229
|
+
* public ones when !priv; an EC curve as BR_EC_*. */
|
|
230
|
+
int js_key_from_parts(JSContext *ctx, int kind, bool priv, int curve, const JSKeyPart parts[JS_KEY_PARTS], JSValue *out);
|
|
231
|
+
int js_ec_curve_by_jwk(const char *crv);
|
|
232
|
+
/* The public key of a private one (a new handle). */
|
|
233
|
+
JSValue js_key_public(JSContext *ctx, JSValue private_key);
|
|
234
|
+
/* New private keys: 0, or an error code (5: parameters BearSSL rejects). */
|
|
235
|
+
int js_key_generate_rsa(JSContext *ctx, bool pss, uint32_t bits, uint32_t e, JSValue *out);
|
|
236
|
+
int js_key_generate_ec(JSContext *ctx, int curve, JSValue *out);
|
|
237
|
+
const char *js_ec_curve_jwk(int curve);
|
|
238
|
+
/* An EC or X25519 private scalar in BearSSL's byte order (out: the scalar's length). */
|
|
239
|
+
void js_ec_scalar_for_bearssl(const JSKeyData *k, uint8_t *out);
|
|
240
|
+
/* A cryptographically secure PRNG for BearSSL's key generation (crypto_hash.c's DRBG). */
|
|
241
|
+
const br_prng_class **js_crypto_prng(void);
|
|
242
|
+
|
|
243
|
+
/* Web Crypto's key algorithms */
|
|
244
|
+
typedef enum JSWebAlg {
|
|
245
|
+
JS_WEB_HMAC = 1, JS_WEB_PBKDF2, JS_WEB_HKDF, JS_WEB_AES_CTR, JS_WEB_AES_CBC, JS_WEB_AES_GCM, JS_WEB_AES_KW,
|
|
246
|
+
JS_WEB_RSASSA, JS_WEB_RSA_PSS, JS_WEB_RSA_OAEP, JS_WEB_ECDSA, JS_WEB_ECDH, JS_WEB_X25519,
|
|
247
|
+
} JSWebAlg;
|
|
248
|
+
|
|
249
|
+
/* KeyUsage, as bits in this order */
|
|
250
|
+
enum {
|
|
251
|
+
JS_USAGE_ENCRYPT = 1 << 0, JS_USAGE_DECRYPT = 1 << 1, JS_USAGE_SIGN = 1 << 2, JS_USAGE_VERIFY = 1 << 3,
|
|
252
|
+
JS_USAGE_DERIVE_KEY = 1 << 4, JS_USAGE_DERIVE_BITS = 1 << 5, JS_USAGE_WRAP_KEY = 1 << 6, JS_USAGE_UNWRAP_KEY = 1 << 7,
|
|
253
|
+
};
|
|
254
|
+
|
|
255
|
+
typedef struct JSCryptoKey {
|
|
256
|
+
JSObject obj;
|
|
257
|
+
JSValue data; /* a JSKeyData */
|
|
258
|
+
JSValue algorithm; /* what `algorithm` returns (the same object each time) */
|
|
259
|
+
JSValue usages; /* what `usages` returns: an array of strings */
|
|
260
|
+
uint16_t usage_mask; /* JS_USAGE_* */
|
|
261
|
+
uint8_t alg; /* JSWebAlg */
|
|
262
|
+
bool extractable;
|
|
263
|
+
const JSHashAlg *hash; /* HMAC's and RSA's */
|
|
264
|
+
uint32_t length; /* HMAC's and AES's, in bits; RSA's modulus length */
|
|
265
|
+
} JSCryptoKey;
|
|
266
|
+
|
|
267
|
+
JSCryptoKey *js_as_crypto_key(JSValue v);
|
|
268
|
+
JSValue js_new_crypto_key(JSContext *ctx, JSValue data, uint8_t alg, const JSHashAlg *hash, uint32_t length, JSValue algorithm,
|
|
269
|
+
JSValue usages, uint16_t mask, bool extractable);
|
|
270
|
+
|
|
271
|
+
/* ---- Asymmetric operations (crypto_asym.c) ------------------------------------------------------ */
|
|
272
|
+
|
|
273
|
+
/* RSA paddings and PSS salt lengths: Node's (OpenSSL's) constants */
|
|
274
|
+
enum { JS_PADDING_PKCS1 = 1, JS_PADDING_NONE = 3, JS_PADDING_OAEP = 4, JS_PADDING_PSS = 6 };
|
|
275
|
+
enum { JS_SALT_DIGEST = -1, JS_SALT_MAX = -2, JS_SALT_AUTO = -2 }; /* -2: the most when signing, any when verifying */
|
|
276
|
+
enum { JS_RSA_PUBLIC_ENCRYPT, JS_RSA_PRIVATE_DECRYPT, JS_RSA_PRIVATE_ENCRYPT, JS_RSA_PUBLIC_DECRYPT };
|
|
277
|
+
/* why an operation failed (each one of Node's errors) */
|
|
278
|
+
enum {
|
|
279
|
+
JS_ASYM_ERR_KEY_TYPE = 1, JS_ASYM_ERR_DIGEST, JS_ASYM_ERR_FAILED, JS_ASYM_ERR_SALT, JS_ASYM_ERR_TOO_LARGE, JS_ASYM_ERR_TOO_SMALL,
|
|
280
|
+
JS_ASYM_ERR_OAEP, JS_ASYM_ERR_PADDING, JS_ASYM_ERR_POINT, JS_ASYM_ERR_CURVE,
|
|
281
|
+
};
|
|
282
|
+
|
|
283
|
+
/* A signature of a digest (alg->out_len bytes) into out (malloc'd). 0, or an error. */
|
|
284
|
+
int js_asym_sign(const JSKeyData *k, const JSHashAlg *h, const uint8_t *digest, int padding, long salt_len, bool p1363,
|
|
285
|
+
JSBytesOut *out);
|
|
286
|
+
int js_asym_verify(const JSKeyData *k, const JSHashAlg *h, const uint8_t *digest, int padding, long salt_len, bool p1363,
|
|
287
|
+
const uint8_t *sig, size_t sig_len, bool *valid);
|
|
288
|
+
int js_rsa_crypt(const JSKeyData *k, int op, int padding, const JSHashAlg *oaep_hash, const uint8_t *label, size_t label_len,
|
|
289
|
+
const uint8_t *in, size_t n, JSBytesOut *out);
|
|
290
|
+
/* The shared secret of a private key and a peer's point (any encoding for EC). */
|
|
291
|
+
int js_ecdh(const JSKeyData *k, const uint8_t *peer, size_t peer_len, uint8_t *secret, size_t *secret_len);
|
|
292
|
+
int js_ec_curve_by_name(const char *name);
|
|
293
|
+
size_t js_ec_field_size(int curve);
|
|
294
|
+
bool js_ec_point_uncompressed(int curve, const uint8_t *in, size_t n, uint8_t *out);
|
|
295
|
+
size_t js_ec_point_format(int curve, const uint8_t *point, int format, uint8_t *out);
|
|
296
|
+
|
|
297
|
+
/* subtle.importKey's steps, without the promise: a CryptoKey, or JS_EXCEPTION. */
|
|
298
|
+
JSValue js_crypto_import_key_steps(JSContext *ctx, uint32_t argc, const JSValue *argv);
|
|
299
|
+
|
|
300
|
+
/* The crypto component's parts, installed by crypto.c */
|
|
301
|
+
void js_crypto_install_key(JSContext *ctx, JSObject *global);
|
|
302
|
+
void js_crypto_install_subtle(JSContext *ctx, JSObject *global);
|
|
303
|
+
|
|
304
|
+
#endif /* JS_CRYPTO_INTERNAL_H */
|
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
/* The crypto primitives' key derivation (ADR 0018): PBKDF2 (RFC 8018) and HKDF (RFC 5869) over
|
|
2
|
+
* crypto_hash.c's HMAC, so any of its hashes works; scrypt (RFC 7914) with its Salsa20/8 core. */
|
|
3
|
+
#include <stdlib.h>
|
|
4
|
+
#include <string.h>
|
|
5
|
+
|
|
6
|
+
#include "crypto_internal.h"
|
|
7
|
+
|
|
8
|
+
/* ---- PBKDF2 ------------------------------------------------------------------------------------ */
|
|
9
|
+
|
|
10
|
+
bool js_pbkdf2(const JSHashAlg *alg, const uint8_t *pw, size_t pw_len, const uint8_t *salt, size_t salt_len,
|
|
11
|
+
uint32_t iterations, uint8_t *out, size_t n) {
|
|
12
|
+
if (alg->xof || iterations == 0) return false;
|
|
13
|
+
JSHmacCtx keyed; /* the password's inner and outer states, copied for each HMAC */
|
|
14
|
+
js_hmac_init(&keyed, alg, pw, pw_len);
|
|
15
|
+
size_t hlen = alg->out_len;
|
|
16
|
+
for (uint32_t block = 1; n > 0; block++) {
|
|
17
|
+
uint8_t u[64], t[64], be[4] = { (uint8_t)(block >> 24), (uint8_t)(block >> 16), (uint8_t)(block >> 8), (uint8_t)block };
|
|
18
|
+
JSHmacCtx m = keyed;
|
|
19
|
+
js_hmac_update(&m, salt, salt_len);
|
|
20
|
+
js_hmac_update(&m, be, 4);
|
|
21
|
+
js_hmac_final(&m, u);
|
|
22
|
+
memcpy(t, u, hlen);
|
|
23
|
+
for (uint32_t i = 1; i < iterations; i++) {
|
|
24
|
+
m = keyed;
|
|
25
|
+
js_hmac_update(&m, u, hlen);
|
|
26
|
+
js_hmac_final(&m, u);
|
|
27
|
+
for (size_t j = 0; j < hlen; j++) t[j] ^= u[j];
|
|
28
|
+
}
|
|
29
|
+
size_t take = n < hlen ? n : hlen;
|
|
30
|
+
memcpy(out, t, take);
|
|
31
|
+
out += take;
|
|
32
|
+
n -= take;
|
|
33
|
+
}
|
|
34
|
+
return true;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
/* ---- HKDF -------------------------------------------------------------------------------------- */
|
|
38
|
+
|
|
39
|
+
bool js_hkdf(const JSHashAlg *alg, const uint8_t *ikm, size_t ikm_len, const uint8_t *salt, size_t salt_len,
|
|
40
|
+
const uint8_t *info, size_t info_len, uint8_t *out, size_t n) {
|
|
41
|
+
size_t hlen = alg->out_len;
|
|
42
|
+
if (alg->xof || n > 255 * hlen) return false;
|
|
43
|
+
uint8_t zeros[64] = { 0 }, prk[64], t[64];
|
|
44
|
+
JSHmacCtx m;
|
|
45
|
+
js_hmac_init(&m, alg, salt_len ? salt : zeros, salt_len ? salt_len : hlen); /* extract */
|
|
46
|
+
js_hmac_update(&m, ikm, ikm_len);
|
|
47
|
+
js_hmac_final(&m, prk);
|
|
48
|
+
size_t t_len = 0;
|
|
49
|
+
for (uint8_t i = 1; n > 0; i++) { /* expand */
|
|
50
|
+
js_hmac_init(&m, alg, prk, hlen);
|
|
51
|
+
js_hmac_update(&m, t, t_len);
|
|
52
|
+
js_hmac_update(&m, info, info_len);
|
|
53
|
+
js_hmac_update(&m, &i, 1);
|
|
54
|
+
js_hmac_final(&m, t);
|
|
55
|
+
t_len = hlen;
|
|
56
|
+
size_t take = n < hlen ? n : hlen;
|
|
57
|
+
memcpy(out, t, take);
|
|
58
|
+
out += take;
|
|
59
|
+
n -= take;
|
|
60
|
+
}
|
|
61
|
+
return true;
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
/* ---- scrypt ------------------------------------------------------------------------------------ */
|
|
65
|
+
|
|
66
|
+
static inline uint32_t rotl32(uint32_t x, unsigned n) { return (x << n) | (x >> (32 - n)); }
|
|
67
|
+
|
|
68
|
+
static void salsa20_8(uint32_t b[16]) {
|
|
69
|
+
uint32_t x[16];
|
|
70
|
+
memcpy(x, b, sizeof x);
|
|
71
|
+
for (int i = 0; i < 8; i += 2) {
|
|
72
|
+
#define QR(a, b, c, d) \
|
|
73
|
+
x[b] ^= rotl32(x[a] + x[d], 7), x[c] ^= rotl32(x[b] + x[a], 9), x[d] ^= rotl32(x[c] + x[b], 13), x[a] ^= rotl32(x[d] + x[c], 18)
|
|
74
|
+
QR(0, 4, 8, 12); QR(5, 9, 13, 1); QR(10, 14, 2, 6); QR(15, 3, 7, 11); /* columns */
|
|
75
|
+
QR(0, 1, 2, 3); QR(5, 6, 7, 4); QR(10, 11, 8, 9); QR(15, 12, 13, 14); /* rows */
|
|
76
|
+
#undef QR
|
|
77
|
+
}
|
|
78
|
+
for (int i = 0; i < 16; i++) b[i] += x[i];
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
/* BlockMix (RFC 7914 §4): b is 2r 64-byte blocks, y scratch of the same size. */
|
|
82
|
+
static void block_mix(uint32_t *b, uint32_t *y, uint32_t r) {
|
|
83
|
+
uint32_t x[16];
|
|
84
|
+
memcpy(x, &b[(2 * r - 1) * 16], 64);
|
|
85
|
+
for (uint32_t i = 0; i < 2 * r; i++) {
|
|
86
|
+
for (int j = 0; j < 16; j++) x[j] ^= b[i * 16 + j];
|
|
87
|
+
salsa20_8(x);
|
|
88
|
+
/* even blocks to the first half, odd to the second */
|
|
89
|
+
memcpy(&y[((i & 1) * r + i / 2) * 16], x, 64);
|
|
90
|
+
}
|
|
91
|
+
memcpy(b, y, 128 * (size_t)r);
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
static void romix(uint8_t *block, uint32_t r, uint64_t N, uint32_t *v, uint32_t *x, uint32_t *y) {
|
|
95
|
+
size_t words = 32 * (size_t)r;
|
|
96
|
+
for (size_t i = 0; i < words; i++) {
|
|
97
|
+
const uint8_t *p = block + 4 * i;
|
|
98
|
+
x[i] = (uint32_t)p[0] | (uint32_t)p[1] << 8 | (uint32_t)p[2] << 16 | (uint32_t)p[3] << 24;
|
|
99
|
+
}
|
|
100
|
+
for (uint64_t i = 0; i < N; i++) {
|
|
101
|
+
memcpy(&v[i * words], x, 4 * words);
|
|
102
|
+
block_mix(x, y, r);
|
|
103
|
+
}
|
|
104
|
+
for (uint64_t i = 0; i < N; i++) {
|
|
105
|
+
uint64_t j = x[(2 * r - 1) * 16] & (N - 1);
|
|
106
|
+
for (size_t k = 0; k < words; k++) x[k] ^= v[j * words + k];
|
|
107
|
+
block_mix(x, y, r);
|
|
108
|
+
}
|
|
109
|
+
for (size_t i = 0; i < words; i++) {
|
|
110
|
+
uint8_t *p = block + 4 * i;
|
|
111
|
+
p[0] = (uint8_t)x[i], p[1] = (uint8_t)(x[i] >> 8), p[2] = (uint8_t)(x[i] >> 16), p[3] = (uint8_t)(x[i] >> 24);
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
int js_scrypt_check(uint64_t N, uint64_t r, uint64_t p, uint64_t maxmem) {
|
|
116
|
+
/* OpenSSL's checks (EVP_PBE_scrypt_ex), so the same parameters fail */
|
|
117
|
+
if (r == 0 || p == 0 || N < 2 || (N & (N - 1))) return JS_SCRYPT_INVALID;
|
|
118
|
+
/* OpenSSL reports these as its memory limit too */
|
|
119
|
+
if (p > ((1ULL << 30) - 1) / r) return JS_SCRYPT_MEMORY;
|
|
120
|
+
if (16 * r <= 63 && N >= (1ULL << (16 * r))) return JS_SCRYPT_MEMORY;
|
|
121
|
+
uint64_t blen = p * 128 * r;
|
|
122
|
+
if (N + 2 > UINT64_MAX / (32 * r * 4)) return JS_SCRYPT_MEMORY;
|
|
123
|
+
uint64_t vlen = 32 * r * (N + 2) * 4;
|
|
124
|
+
if (blen > UINT64_MAX - vlen || blen + vlen > maxmem) return JS_SCRYPT_MEMORY;
|
|
125
|
+
return 0;
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
bool js_scrypt(const uint8_t *pw, size_t pw_len, const uint8_t *salt, size_t salt_len, uint64_t N, uint32_t r,
|
|
129
|
+
uint32_t p, uint8_t *out, size_t n) {
|
|
130
|
+
const JSHashAlg *sha256 = js_hash_by_name("sha256");
|
|
131
|
+
size_t blen = (size_t)p * 128 * r;
|
|
132
|
+
uint8_t *b = malloc(blen);
|
|
133
|
+
uint32_t *v = malloc((size_t)N * 128 * r), *xy = malloc(256 * (size_t)r);
|
|
134
|
+
if (!b || !v || !xy) {
|
|
135
|
+
free(b), free(v), free(xy);
|
|
136
|
+
return false;
|
|
137
|
+
}
|
|
138
|
+
js_pbkdf2(sha256, pw, pw_len, salt, salt_len, 1, b, blen);
|
|
139
|
+
for (uint32_t i = 0; i < p; i++) romix(b + (size_t)i * 128 * r, r, N, v, xy, xy + 32 * r);
|
|
140
|
+
js_pbkdf2(sha256, pw, pw_len, b, blen, 1, out, n);
|
|
141
|
+
free(b), free(v), free(xy);
|
|
142
|
+
return true;
|
|
143
|
+
}
|
|
@@ -0,0 +1,171 @@
|
|
|
1
|
+
/* Keys (ADR 0018): the key material, a C record both Web Crypto's CryptoKey and node:crypto's
|
|
2
|
+
* KeyObject hold (so converting between them shares it), and CryptoKey itself: Node's class,
|
|
3
|
+
* its attributes (type, extractable, algorithm, usages: the same objects on every read) and
|
|
4
|
+
* its inspection. */
|
|
5
|
+
#include <stdlib.h>
|
|
6
|
+
#include <string.h>
|
|
7
|
+
|
|
8
|
+
#include "builtins_util.h"
|
|
9
|
+
#include "crypto_internal.h"
|
|
10
|
+
#include "internal.h"
|
|
11
|
+
#include "js_atoms.h"
|
|
12
|
+
#include "js_exception.h"
|
|
13
|
+
#include "js_web.h"
|
|
14
|
+
#include "jscontext.h"
|
|
15
|
+
#include "jsstring.h"
|
|
16
|
+
|
|
17
|
+
/* ---- Key material ------------------------------------------------------------------------------ */
|
|
18
|
+
|
|
19
|
+
static void wipe(uint8_t *p, size_t n) {
|
|
20
|
+
if (!p) return;
|
|
21
|
+
memset(p, 0, n);
|
|
22
|
+
free(p);
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
static void key_data_finalize(JSRuntime *rt, JSCell *c) {
|
|
26
|
+
(void)rt;
|
|
27
|
+
JSKeyData *k = (JSKeyData *)c;
|
|
28
|
+
wipe(k->bytes, k->len);
|
|
29
|
+
for (int i = 0; i < JS_KEY_PARTS; i++) wipe(k->part[i].p, k->part[i].n);
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
static const JSClass key_data_class = { "KeyData", sizeof(JSKeyData), NULL, NULL, NULL, NULL, NULL, key_data_finalize, NULL };
|
|
33
|
+
|
|
34
|
+
JSKeyData *js_key_data(JSValue v) {
|
|
35
|
+
return js_is_object(v) && js_as_object(v)->shape->cls == &key_data_class ? (JSKeyData *)js_as_object(v) : NULL;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
JSKeyData *js_new_asym_key(JSContext *ctx, uint8_t type, uint8_t kind) {
|
|
39
|
+
JSKeyData *k = (JSKeyData *)js_alloc_object(ctx, JS_CELL_OBJECT, js_shape_root(ctx, &key_data_class, JS_NULL, 0));
|
|
40
|
+
k->type = type;
|
|
41
|
+
k->kind = kind;
|
|
42
|
+
return k;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
void js_key_part_set(JSKeyPart *part, const uint8_t *p, size_t n) {
|
|
46
|
+
wipe(part->p, part->n);
|
|
47
|
+
part->p = malloc(n ? n : 1);
|
|
48
|
+
if (!part->p) js_fatal("out of memory in crypto");
|
|
49
|
+
if (n) memcpy(part->p, p, n);
|
|
50
|
+
part->n = n;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
JSValue js_new_secret_key(JSContext *ctx, const uint8_t *p, size_t n) {
|
|
54
|
+
uint8_t *copy = malloc(n ? n : 1);
|
|
55
|
+
if (!copy) js_fatal("out of memory in crypto");
|
|
56
|
+
if (n) memcpy(copy, p, n);
|
|
57
|
+
JSKeyData *k = (JSKeyData *)js_alloc_object(ctx, JS_CELL_OBJECT, js_shape_root(ctx, &key_data_class, JS_NULL, 0));
|
|
58
|
+
k->type = JS_KEY_SECRET;
|
|
59
|
+
k->bytes = copy;
|
|
60
|
+
k->len = n;
|
|
61
|
+
return js_object_value(&k->obj);
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
/* ---- CryptoKey --------------------------------------------------------------------------------- */
|
|
65
|
+
|
|
66
|
+
static void crypto_key_visit(JSCell *c, JSTracer *trc) {
|
|
67
|
+
JSCryptoKey *k = (JSCryptoKey *)c;
|
|
68
|
+
js_trace_value(trc, k->data);
|
|
69
|
+
js_trace_value(trc, k->algorithm);
|
|
70
|
+
js_trace_value(trc, k->usages);
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
static const JSClass crypto_key_class = { "CryptoKey", sizeof(JSCryptoKey), NULL, NULL, NULL, NULL, crypto_key_visit, NULL, NULL };
|
|
74
|
+
|
|
75
|
+
JSCryptoKey *js_as_crypto_key(JSValue v) {
|
|
76
|
+
return js_is_object(v) && js_as_object(v)->shape->cls == &crypto_key_class ? (JSCryptoKey *)js_as_object(v) : NULL;
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
JSValue js_new_crypto_key(JSContext *ctx, JSValue data, uint8_t alg, const JSHashAlg *hash, uint32_t length, JSValue algorithm,
|
|
80
|
+
JSValue usages, uint16_t mask, bool extractable) {
|
|
81
|
+
JSCryptoKey *k = (JSCryptoKey *)js_alloc_object(ctx, JS_CELL_OBJECT,
|
|
82
|
+
js_shape_root(ctx, &crypto_key_class, ctx->intrinsics[JS_INTRINSIC_CRYPTO_KEY_PROTOTYPE], 0));
|
|
83
|
+
js_init_slot(&k->data, data);
|
|
84
|
+
js_init_slot(&k->algorithm, algorithm);
|
|
85
|
+
js_init_slot(&k->usages, usages);
|
|
86
|
+
k->usage_mask = mask;
|
|
87
|
+
k->alg = alg;
|
|
88
|
+
k->hash = hash;
|
|
89
|
+
k->length = length;
|
|
90
|
+
k->extractable = extractable;
|
|
91
|
+
return js_object_value(&k->obj);
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
static const char *const KEY_TYPES[] = { "secret", "public", "private" };
|
|
95
|
+
|
|
96
|
+
BUILTIN(crypto_key_ctor) {
|
|
97
|
+
UNUSED_ARGS;
|
|
98
|
+
return js_throw_node_error(ctx, JS_TYPE_ERROR, "ERR_ILLEGAL_CONSTRUCTOR", "Illegal constructor");
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
#define THIS_KEY() \
|
|
102
|
+
JSCryptoKey *k = js_as_crypto_key(this_val); \
|
|
103
|
+
if (!k) return js_throw_invalid_this(ctx, "CryptoKey")
|
|
104
|
+
|
|
105
|
+
BUILTIN(crypto_key_type) {
|
|
106
|
+
UNUSED_ARGS;
|
|
107
|
+
THIS_KEY();
|
|
108
|
+
return js_new_string_cstr(ctx, KEY_TYPES[js_key_data(k->data)->type]);
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
BUILTIN(crypto_key_extractable) {
|
|
112
|
+
UNUSED_ARGS;
|
|
113
|
+
THIS_KEY();
|
|
114
|
+
return js_bool(k->extractable);
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
BUILTIN(crypto_key_algorithm) {
|
|
118
|
+
UNUSED_ARGS;
|
|
119
|
+
THIS_KEY();
|
|
120
|
+
return k->algorithm;
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
BUILTIN(crypto_key_usages) {
|
|
124
|
+
UNUSED_ARGS;
|
|
125
|
+
THIS_KEY();
|
|
126
|
+
return k->usages;
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
/* [nodejs.util.inspect.custom](depth, options): CryptoKey { type, extractable, algorithm, usages } */
|
|
130
|
+
BUILTIN(crypto_key_inspect) {
|
|
131
|
+
(void)callee, (void)new_target;
|
|
132
|
+
JSCryptoKey *k = js_as_crypto_key(this_val);
|
|
133
|
+
if (!k) return this_val;
|
|
134
|
+
JSValue o = js_new_object(ctx);
|
|
135
|
+
static const char *const names[] = { "type", "extractable", "algorithm", "usages" };
|
|
136
|
+
JSValue values[4] = { js_new_string_cstr(ctx, KEY_TYPES[js_key_data(k->data)->type]), js_bool(k->extractable), k->algorithm, k->usages };
|
|
137
|
+
for (int i = 0; i < 4; i++) js_define_data(ctx, js_as_object(o), js_atom_from_cstr(ctx, names[i]), values[i], JS_PROP_DEFAULT);
|
|
138
|
+
return js_inspect_named(ctx, "CryptoKey", o, ARG(0), ARG(1));
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
static const JSBuiltin crypto_key_proto[] = {
|
|
142
|
+
WEBIDL_ATTRIBUTE("type", crypto_key_type, NULL),
|
|
143
|
+
WEBIDL_ATTRIBUTE("extractable", crypto_key_extractable, NULL),
|
|
144
|
+
WEBIDL_ATTRIBUTE("algorithm", crypto_key_algorithm, NULL),
|
|
145
|
+
WEBIDL_ATTRIBUTE("usages", crypto_key_usages, NULL),
|
|
146
|
+
};
|
|
147
|
+
|
|
148
|
+
void js_crypto_install_key(JSContext *ctx, JSObject *global) {
|
|
149
|
+
js_define_web_class(ctx, global, "CryptoKey", crypto_key_ctor, 0, ctx->intrinsics[JS_INTRINSIC_OBJECT_PROTOTYPE],
|
|
150
|
+
JS_INTRINSIC_CRYPTO_KEY_PROTOTYPE);
|
|
151
|
+
JSValue kp = ctx->intrinsics[JS_INTRINSIC_CRYPTO_KEY_PROTOTYPE];
|
|
152
|
+
js_define_builtins(ctx, js_as_object(kp), crypto_key_proto, JS_COUNTOF(crypto_key_proto));
|
|
153
|
+
js_define_inspect(ctx, kp, crypto_key_inspect, "CryptoKey");
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
/* ---- KeyObject and CryptoKey (node:crypto's primitives) ----------------------------------------- */
|
|
157
|
+
|
|
158
|
+
/* cryptoKeyHandleOf(value): a CryptoKey's key handle, or undefined for anything else. */
|
|
159
|
+
JSValue js_crypto_key_handle_of(JSContext *ctx, JSValue callee, JSValue this_val, uint32_t argc, const JSValue *argv, JSValue new_target) {
|
|
160
|
+
(void)ctx, (void)callee, (void)this_val, (void)new_target;
|
|
161
|
+
JSCryptoKey *k = js_as_crypto_key(ARG(0));
|
|
162
|
+
return k ? k->data : JS_UNDEFINED;
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
/* cryptoToCryptoKey(format, keyData, algorithm, extractable, usages): importKey's steps, at once
|
|
166
|
+
* (keyObject.toCryptoKey is synchronous): a CryptoKey, or the error thrown. */
|
|
167
|
+
JSValue js_crypto_to_crypto_key(JSContext *ctx, JSValue callee, JSValue this_val, uint32_t argc, const JSValue *argv, JSValue new_target) {
|
|
168
|
+
(void)callee, (void)this_val, (void)new_target;
|
|
169
|
+
JSValue args[5] = { ARG(0), ARG(1), ARG(2), ARG(3), ARG(4) };
|
|
170
|
+
return js_crypto_import_key_steps(ctx, 5, args);
|
|
171
|
+
}
|