goscript 0.1.0 → 0.1.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/README.md +267 -255
- package/cmd/goscript/cmd-test.go +286 -0
- package/cmd/goscript/cmd-test_test.go +76 -0
- package/cmd/goscript/cmd_compile.go +9 -0
- package/cmd/goscript/main.go +1 -0
- package/compiler/build-flags.go +38 -0
- package/compiler/compile-request.go +33 -0
- package/compiler/compiler.go +1 -1
- package/compiler/compliance_test.go +0 -10
- package/compiler/config.go +2 -0
- package/compiler/gotest/owner.go +24 -0
- package/compiler/gotest/package-result.go +69 -0
- package/compiler/gotest/request.go +210 -0
- package/compiler/gotest/result.go +28 -0
- package/compiler/gotest/runner.go +1225 -0
- package/compiler/gotest/runner_test.go +1271 -0
- package/compiler/gotest/test.go +9 -0
- package/compiler/index.test.ts +1 -1
- package/compiler/lowered-program.go +80 -21
- package/compiler/lowering.go +6754 -602
- package/compiler/override-facts.go +357 -0
- package/compiler/override-registry.go +52 -190
- package/compiler/override-registry_test.go +182 -0
- package/compiler/package-graph.go +50 -27
- package/compiler/package-graph_test.go +99 -9
- package/compiler/package-test-function.go +9 -0
- package/compiler/package-test-graph-package.go +40 -0
- package/compiler/package-test-graph-variant.go +129 -0
- package/compiler/package-test-graph.go +112 -0
- package/compiler/package-test-graph_test.go +202 -0
- package/compiler/runtime-contract.go +229 -29
- package/compiler/runtime-contract_test.go +44 -30
- package/compiler/semantic-model-types.go +25 -6
- package/compiler/semantic-model.go +819 -74
- package/compiler/semantic-model_test.go +104 -0
- package/compiler/service.go +10 -4
- package/compiler/skeleton_test.go +2777 -524
- package/compiler/tsworkspace/owner-process-unix_test.go +72 -0
- package/compiler/tsworkspace/owner.go +342 -0
- package/compiler/tsworkspace/owner_test.go +93 -0
- package/compiler/tsworkspace/result.go +17 -0
- package/compiler/tsworkspace/tool-process-other.go +14 -0
- package/compiler/tsworkspace/tool-process-unix.go +19 -0
- package/compiler/typescript-emitter.go +576 -86
- package/compiler/wasm/compile.go +1 -1
- package/compiler/wasm/compile_test.go +61 -11
- package/compiler/wasm_api.go +172 -7
- package/dist/gs/builtin/builtin.d.ts +40 -3
- package/dist/gs/builtin/builtin.js +430 -22
- package/dist/gs/builtin/builtin.js.map +1 -1
- package/dist/gs/builtin/channel.d.ts +32 -10
- package/dist/gs/builtin/channel.js +119 -25
- package/dist/gs/builtin/channel.js.map +1 -1
- package/dist/gs/builtin/defer.d.ts +1 -0
- package/dist/gs/builtin/defer.js +12 -2
- package/dist/gs/builtin/defer.js.map +1 -1
- package/dist/gs/builtin/hostio.d.ts +9 -0
- package/dist/gs/builtin/hostio.js +25 -0
- package/dist/gs/builtin/hostio.js.map +1 -1
- package/dist/gs/builtin/map.js +40 -6
- package/dist/gs/builtin/map.js.map +1 -1
- package/dist/gs/builtin/print.js.map +1 -1
- package/dist/gs/builtin/slice.d.ts +64 -10
- package/dist/gs/builtin/slice.js +619 -244
- package/dist/gs/builtin/slice.js.map +1 -1
- package/dist/gs/builtin/type.d.ts +7 -2
- package/dist/gs/builtin/type.js +128 -29
- package/dist/gs/builtin/type.js.map +1 -1
- package/dist/gs/builtin/varRef.d.ts +7 -0
- package/dist/gs/builtin/varRef.js +23 -0
- package/dist/gs/builtin/varRef.js.map +1 -1
- package/dist/gs/bytes/buffer.gs.js +74 -70
- package/dist/gs/bytes/buffer.gs.js.map +1 -1
- package/dist/gs/bytes/iter.gs.js +13 -13
- package/dist/gs/bytes/iter.gs.js.map +1 -1
- package/dist/gs/bytes/reader.gs.js +20 -18
- package/dist/gs/bytes/reader.gs.js.map +1 -1
- package/dist/gs/compress/zlib/index.d.ts +26 -0
- package/dist/gs/compress/zlib/index.js +168 -0
- package/dist/gs/compress/zlib/index.js.map +1 -0
- package/dist/gs/context/context.d.ts +6 -5
- package/dist/gs/context/context.js +17 -12
- package/dist/gs/context/context.js.map +1 -1
- package/dist/gs/crypto/ecdh/index.d.ts +52 -0
- package/dist/gs/crypto/ecdh/index.js +226 -0
- package/dist/gs/crypto/ecdh/index.js.map +1 -0
- package/dist/gs/crypto/ed25519/index.d.ts +34 -0
- package/dist/gs/crypto/ed25519/index.js +160 -0
- package/dist/gs/crypto/ed25519/index.js.map +1 -0
- package/dist/gs/crypto/internal/constanttime/index.d.ts +4 -0
- package/dist/gs/crypto/internal/constanttime/index.js +18 -0
- package/dist/gs/crypto/internal/constanttime/index.js.map +1 -0
- package/dist/gs/crypto/internal/fips140deps/byteorder/index.d.ts +1 -0
- package/dist/gs/crypto/internal/fips140deps/byteorder/index.js +2 -0
- package/dist/gs/crypto/internal/fips140deps/byteorder/index.js.map +1 -0
- package/dist/gs/crypto/internal/fips140deps/godebug/index.d.ts +1 -0
- package/dist/gs/crypto/internal/fips140deps/godebug/index.js +2 -0
- package/dist/gs/crypto/internal/fips140deps/godebug/index.js.map +1 -0
- package/dist/gs/crypto/rand/index.d.ts +2 -0
- package/dist/gs/crypto/rand/index.js +85 -0
- package/dist/gs/crypto/rand/index.js.map +1 -1
- package/dist/gs/crypto/sha256/index.d.ts +8 -0
- package/dist/gs/crypto/sha256/index.js +118 -0
- package/dist/gs/crypto/sha256/index.js.map +1 -0
- package/dist/gs/crypto/sha512/index.d.ts +14 -0
- package/dist/gs/crypto/sha512/index.js +129 -0
- package/dist/gs/crypto/sha512/index.js.map +1 -0
- package/dist/gs/embed/index.d.ts +7 -0
- package/dist/gs/embed/index.js +16 -0
- package/dist/gs/embed/index.js.map +1 -0
- package/dist/gs/encoding/json/index.d.ts +4 -0
- package/dist/gs/encoding/json/index.js +33 -0
- package/dist/gs/encoding/json/index.js.map +1 -1
- package/dist/gs/errors/errors.d.ts +4 -0
- package/dist/gs/errors/errors.js +108 -4
- package/dist/gs/errors/errors.js.map +1 -1
- package/dist/gs/fmt/fmt.d.ts +4 -4
- package/dist/gs/fmt/fmt.js +42 -11
- package/dist/gs/fmt/fmt.js.map +1 -1
- package/dist/gs/github.com/aperturerobotics/protobuf-go-lite/index.d.ts +37 -2
- package/dist/gs/github.com/aperturerobotics/protobuf-go-lite/index.js +245 -1
- package/dist/gs/github.com/aperturerobotics/protobuf-go-lite/index.js.map +1 -1
- package/dist/gs/github.com/aperturerobotics/protobuf-go-lite/json/index.d.ts +189 -0
- package/dist/gs/github.com/aperturerobotics/protobuf-go-lite/json/index.js +861 -0
- package/dist/gs/github.com/aperturerobotics/protobuf-go-lite/json/index.js.map +1 -0
- package/dist/gs/github.com/aperturerobotics/starpc/srpc/index.d.ts +217 -0
- package/dist/gs/github.com/aperturerobotics/starpc/srpc/index.js +814 -0
- package/dist/gs/github.com/aperturerobotics/starpc/srpc/index.js.map +1 -0
- package/dist/gs/github.com/aperturerobotics/util/conc/index.d.ts +20 -0
- package/dist/gs/github.com/aperturerobotics/util/conc/index.js +134 -0
- package/dist/gs/github.com/aperturerobotics/util/conc/index.js.map +1 -0
- package/dist/gs/github.com/aperturerobotics/wasivm/wazero/kernel/runtime/browser/browser.js.map +1 -1
- package/dist/gs/github.com/hack-pad/safejs/internal/catch/index.d.ts +3 -0
- package/dist/gs/github.com/hack-pad/safejs/internal/catch/index.js +50 -0
- package/dist/gs/github.com/hack-pad/safejs/internal/catch/index.js.map +1 -0
- package/dist/gs/github.com/klauspost/compress/internal/le/index.d.ts +9 -0
- package/dist/gs/github.com/klauspost/compress/internal/le/index.js +72 -0
- package/dist/gs/github.com/klauspost/compress/internal/le/index.js.map +1 -0
- package/dist/gs/github.com/mr-tron/base58/base58/index.d.ts +27 -0
- package/dist/gs/github.com/mr-tron/base58/base58/index.js +172 -0
- package/dist/gs/github.com/mr-tron/base58/base58/index.js.map +1 -0
- package/dist/gs/github.com/zeebo/blake3/internal/consts/index.d.ts +21 -0
- package/dist/gs/github.com/zeebo/blake3/internal/consts/index.js +22 -0
- package/dist/gs/github.com/zeebo/blake3/internal/consts/index.js.map +1 -0
- package/dist/gs/go/internal/scannerhooks/index.d.ts +3 -0
- package/dist/gs/go/internal/scannerhooks/index.js +5 -0
- package/dist/gs/go/internal/scannerhooks/index.js.map +1 -0
- package/dist/gs/go/scanner/index.d.ts +13 -0
- package/dist/gs/go/scanner/index.js +35 -0
- package/dist/gs/go/scanner/index.js.map +1 -1
- package/dist/gs/go/token/index.d.ts +156 -0
- package/dist/gs/go/token/index.js +507 -4
- package/dist/gs/go/token/index.js.map +1 -1
- package/dist/gs/hash/fnv/index.d.ts +57 -0
- package/dist/gs/hash/fnv/index.js +299 -0
- package/dist/gs/hash/fnv/index.js.map +1 -0
- package/dist/gs/hash/index.d.ts +17 -0
- package/dist/gs/hash/index.js +94 -0
- package/dist/gs/hash/index.js.map +1 -0
- package/dist/gs/internal/abi/index.d.ts +4 -0
- package/dist/gs/internal/abi/index.js +10 -0
- package/dist/gs/internal/abi/index.js.map +1 -1
- package/dist/gs/internal/bytealg/index.d.ts +2 -0
- package/dist/gs/internal/bytealg/index.js +14 -0
- package/dist/gs/internal/bytealg/index.js.map +1 -1
- package/dist/gs/internal/byteorder/index.d.ts +8 -2
- package/dist/gs/internal/byteorder/index.js +56 -25
- package/dist/gs/internal/byteorder/index.js.map +1 -1
- package/dist/gs/internal/godebug/index.d.ts +12 -0
- package/dist/gs/internal/godebug/index.js +30 -0
- package/dist/gs/internal/godebug/index.js.map +1 -0
- package/dist/gs/io/fs/index.d.ts +1 -0
- package/dist/gs/io/fs/index.js +1 -0
- package/dist/gs/io/fs/index.js.map +1 -1
- package/dist/gs/io/fs/readlink.d.ts +8 -0
- package/dist/gs/io/fs/readlink.js +60 -0
- package/dist/gs/io/fs/readlink.js.map +1 -0
- package/dist/gs/io/fs/walk.d.ts +3 -3
- package/dist/gs/io/fs/walk.js +7 -7
- package/dist/gs/io/fs/walk.js.map +1 -1
- package/dist/gs/io/io.d.ts +40 -6
- package/dist/gs/io/io.js +151 -26
- package/dist/gs/io/io.js.map +1 -1
- package/dist/gs/iter/iter.d.ts +3 -2
- package/dist/gs/iter/iter.js.map +1 -1
- package/dist/gs/maps/iter.d.ts +5 -5
- package/dist/gs/maps/iter.js +48 -21
- package/dist/gs/maps/iter.js.map +1 -1
- package/dist/gs/maps/maps.d.ts +6 -6
- package/dist/gs/maps/maps.js +1 -1
- package/dist/gs/maps/maps.js.map +1 -1
- package/dist/gs/math/bits/index.d.ts +13 -4
- package/dist/gs/math/bits/index.js +70 -48
- package/dist/gs/math/bits/index.js.map +1 -1
- package/dist/gs/math/const.gs.d.ts +5 -5
- package/dist/gs/math/const.gs.js +4 -4
- package/dist/gs/math/const.gs.js.map +1 -1
- package/dist/gs/mime/index.d.ts +1 -0
- package/dist/gs/mime/index.js +52 -0
- package/dist/gs/mime/index.js.map +1 -0
- package/dist/gs/net/http/httptest/index.d.ts +30 -0
- package/dist/gs/net/http/httptest/index.js +101 -0
- package/dist/gs/net/http/httptest/index.js.map +1 -0
- package/dist/gs/net/http/index.d.ts +131 -0
- package/dist/gs/net/http/index.js +307 -0
- package/dist/gs/net/http/index.js.map +1 -0
- package/dist/gs/net/http/pprof/index.d.ts +8 -0
- package/dist/gs/net/http/pprof/index.js +59 -0
- package/dist/gs/net/http/pprof/index.js.map +1 -0
- package/dist/gs/os/dir_unix.gs.js +2 -2
- package/dist/gs/os/dir_unix.gs.js.map +1 -1
- package/dist/gs/os/error.gs.js +9 -7
- package/dist/gs/os/error.gs.js.map +1 -1
- package/dist/gs/os/types_js.gs.js +95 -15
- package/dist/gs/os/types_js.gs.js.map +1 -1
- package/dist/gs/path/filepath/match.js +165 -3
- package/dist/gs/path/filepath/match.js.map +1 -1
- package/dist/gs/path/filepath/path.d.ts +8 -4
- package/dist/gs/path/filepath/path.js +192 -8
- package/dist/gs/path/filepath/path.js.map +1 -1
- package/dist/gs/path/path.d.ts +4 -1
- package/dist/gs/path/path.js +16 -4
- package/dist/gs/path/path.js.map +1 -1
- package/dist/gs/reflect/index.d.ts +4 -3
- package/dist/gs/reflect/index.js +3 -2
- package/dist/gs/reflect/index.js.map +1 -1
- package/dist/gs/reflect/iter.js +2 -2
- package/dist/gs/reflect/iter.js.map +1 -1
- package/dist/gs/reflect/map.js +29 -0
- package/dist/gs/reflect/map.js.map +1 -1
- package/dist/gs/reflect/type.d.ts +31 -9
- package/dist/gs/reflect/type.js +536 -43
- package/dist/gs/reflect/type.js.map +1 -1
- package/dist/gs/reflect/types.d.ts +1 -0
- package/dist/gs/reflect/types.js +3 -1
- package/dist/gs/reflect/types.js.map +1 -1
- package/dist/gs/reflect/value.d.ts +4 -1
- package/dist/gs/reflect/value.js +39 -1
- package/dist/gs/reflect/value.js.map +1 -1
- package/dist/gs/reflect/visiblefields.js +1 -1
- package/dist/gs/reflect/visiblefields.js.map +1 -1
- package/dist/gs/runtime/debug/index.d.ts +41 -0
- package/dist/gs/runtime/debug/index.js +66 -0
- package/dist/gs/runtime/debug/index.js.map +1 -0
- package/dist/gs/runtime/pprof/index.d.ts +20 -0
- package/dist/gs/runtime/pprof/index.js +85 -0
- package/dist/gs/runtime/pprof/index.js.map +1 -0
- package/dist/gs/runtime/runtime.d.ts +35 -3
- package/dist/gs/runtime/runtime.js +72 -0
- package/dist/gs/runtime/runtime.js.map +1 -1
- package/dist/gs/runtime/trace/index.d.ts +19 -0
- package/dist/gs/runtime/trace/index.js +64 -0
- package/dist/gs/runtime/trace/index.js.map +1 -0
- package/dist/gs/slices/slices.d.ts +42 -8
- package/dist/gs/slices/slices.js +425 -11
- package/dist/gs/slices/slices.js.map +1 -1
- package/dist/gs/sort/slice.gs.d.ts +5 -3
- package/dist/gs/sort/slice.gs.js +60 -22
- package/dist/gs/sort/slice.gs.js.map +1 -1
- package/dist/gs/sort/sort.gs.d.ts +4 -4
- package/dist/gs/sort/sort.gs.js +11 -8
- package/dist/gs/sort/sort.gs.js.map +1 -1
- package/dist/gs/strings/builder.d.ts +1 -1
- package/dist/gs/strings/builder.js +29 -19
- package/dist/gs/strings/builder.js.map +1 -1
- package/dist/gs/strings/iter.js +140 -75
- package/dist/gs/strings/iter.js.map +1 -1
- package/dist/gs/strings/replace.js +2 -2
- package/dist/gs/strings/replace.js.map +1 -1
- package/dist/gs/strings/strings.js +52 -6
- package/dist/gs/strings/strings.js.map +1 -1
- package/dist/gs/sync/atomic/type.gs.d.ts +9 -8
- package/dist/gs/sync/atomic/type.gs.js +0 -2
- package/dist/gs/sync/atomic/type.gs.js.map +1 -1
- package/dist/gs/sync/sync.d.ts +8 -3
- package/dist/gs/sync/sync.js +66 -11
- package/dist/gs/sync/sync.js.map +1 -1
- package/dist/gs/syscall/constants.d.ts +36 -24
- package/dist/gs/syscall/constants.js +12 -0
- package/dist/gs/syscall/constants.js.map +1 -1
- package/dist/gs/syscall/errors.d.ts +117 -111
- package/dist/gs/syscall/errors.js +45 -0
- package/dist/gs/syscall/errors.js.map +1 -1
- package/dist/gs/syscall/fs.d.ts +37 -0
- package/dist/gs/syscall/fs.js +102 -0
- package/dist/gs/syscall/fs.js.map +1 -1
- package/dist/gs/syscall/js/index.d.ts +90 -0
- package/dist/gs/syscall/js/index.js +383 -0
- package/dist/gs/syscall/js/index.js.map +1 -0
- package/dist/gs/syscall/types.d.ts +26 -1
- package/dist/gs/syscall/types.js +45 -1
- package/dist/gs/syscall/types.js.map +1 -1
- package/dist/gs/testing/index.d.ts +1 -0
- package/dist/gs/testing/index.js +2 -0
- package/dist/gs/testing/index.js.map +1 -0
- package/dist/gs/testing/testing.d.ts +78 -0
- package/dist/gs/testing/testing.js +318 -0
- package/dist/gs/testing/testing.js.map +1 -0
- package/dist/gs/time/time.d.ts +41 -4
- package/dist/gs/time/time.js +227 -36
- package/dist/gs/time/time.js.map +1 -1
- package/dist/gs/unicode/unicode.d.ts +23 -1
- package/dist/gs/unicode/unicode.js +79 -10
- package/dist/gs/unicode/unicode.js.map +1 -1
- package/dist/gs/unicode/utf8/utf8.d.ts +4 -4
- package/dist/gs/unicode/utf8/utf8.js +24 -11
- package/dist/gs/unicode/utf8/utf8.js.map +1 -1
- package/dist/gs/unique/index.d.ts +11 -0
- package/dist/gs/unique/index.js +76 -0
- package/dist/gs/unique/index.js.map +1 -0
- package/go.mod +8 -8
- package/go.sum +14 -14
- package/gs/builtin/builtin.ts +585 -27
- package/gs/builtin/channel.ts +183 -29
- package/gs/builtin/defer.ts +13 -2
- package/gs/builtin/hostio.test.ts +1 -0
- package/gs/builtin/hostio.ts +38 -0
- package/gs/builtin/map.ts +46 -6
- package/gs/builtin/print.ts +12 -3
- package/gs/builtin/runtime-contract.test.ts +383 -10
- package/gs/builtin/slice.test.ts +70 -0
- package/gs/builtin/slice.ts +785 -265
- package/gs/builtin/type.ts +160 -41
- package/gs/builtin/varRef.ts +40 -1
- package/gs/bytes/buffer.gs.ts +74 -70
- package/gs/bytes/iter.gs.ts +13 -14
- package/gs/bytes/meta.json +8 -3
- package/gs/bytes/reader.gs.ts +20 -19
- package/gs/compress/zlib/index.test.ts +28 -0
- package/gs/compress/zlib/index.ts +200 -0
- package/gs/compress/zlib/meta.json +3 -0
- package/gs/context/context.test.ts +71 -0
- package/gs/context/context.ts +30 -29
- package/gs/crypto/ecdh/index.test.ts +43 -0
- package/gs/crypto/ecdh/index.ts +274 -0
- package/gs/crypto/ed25519/index.test.ts +41 -0
- package/gs/crypto/ed25519/index.ts +238 -0
- package/gs/crypto/ed25519/meta.json +13 -0
- package/gs/crypto/internal/constanttime/index.test.ts +25 -0
- package/gs/crypto/internal/constanttime/index.ts +22 -0
- package/gs/crypto/internal/fips140deps/byteorder/index.ts +1 -0
- package/gs/crypto/internal/fips140deps/godebug/index.ts +1 -0
- package/gs/crypto/rand/index.test.ts +89 -1
- package/gs/crypto/rand/index.ts +103 -1
- package/gs/crypto/rand/meta.json +4 -1
- package/gs/crypto/sha256/index.test.ts +78 -0
- package/gs/crypto/sha256/index.ts +150 -0
- package/gs/crypto/sha256/meta.json +9 -0
- package/gs/crypto/sha512/index.test.ts +31 -0
- package/gs/crypto/sha512/index.ts +161 -0
- package/gs/crypto/sha512/meta.json +11 -0
- package/gs/embed/index.ts +20 -0
- package/gs/embed/meta.json +5 -0
- package/gs/encoding/json/index.test.ts +39 -3
- package/gs/encoding/json/index.ts +45 -3
- package/gs/errors/errors.test.ts +85 -0
- package/gs/errors/errors.ts +132 -4
- package/gs/fmt/fmt.test.ts +3 -1
- package/gs/fmt/fmt.ts +55 -19
- package/gs/github.com/aperturerobotics/protobuf-go-lite/index.test.ts +128 -1
- package/gs/github.com/aperturerobotics/protobuf-go-lite/index.ts +342 -4
- package/gs/github.com/aperturerobotics/protobuf-go-lite/json/index.test.ts +180 -0
- package/gs/github.com/aperturerobotics/protobuf-go-lite/json/index.ts +1084 -0
- package/gs/github.com/aperturerobotics/starpc/srpc/index.test.ts +31 -0
- package/gs/github.com/aperturerobotics/starpc/srpc/index.ts +1233 -0
- package/gs/github.com/aperturerobotics/starpc/srpc/meta.json +46 -0
- package/gs/github.com/aperturerobotics/util/conc/index.test.ts +30 -0
- package/gs/github.com/aperturerobotics/util/conc/index.ts +172 -0
- package/gs/github.com/aperturerobotics/util/conc/meta.json +9 -0
- package/gs/github.com/aperturerobotics/wasivm/wazero/kernel/runtime/browser/browser.ts +1 -4
- package/gs/github.com/hack-pad/safejs/internal/catch/index.test.ts +35 -0
- package/gs/github.com/hack-pad/safejs/internal/catch/index.ts +65 -0
- package/gs/github.com/hack-pad/safejs/internal/catch/meta.json +9 -0
- package/gs/github.com/klauspost/compress/internal/le/index.test.ts +37 -0
- package/gs/github.com/klauspost/compress/internal/le/index.ts +115 -0
- package/gs/github.com/mr-tron/base58/base58/index.test.ts +70 -0
- package/gs/github.com/mr-tron/base58/base58/index.ts +231 -0
- package/gs/github.com/mr-tron/base58/base58/meta.json +3 -0
- package/gs/github.com/zeebo/blake3/internal/consts/index.test.ts +46 -0
- package/gs/github.com/zeebo/blake3/internal/consts/index.ts +26 -0
- package/gs/go/internal/scannerhooks/index.test.ts +14 -0
- package/gs/go/internal/scannerhooks/index.ts +9 -0
- package/gs/go/scanner/index.test.ts +22 -0
- package/gs/go/scanner/index.ts +47 -0
- package/gs/go/token/index.test.ts +47 -1
- package/gs/go/token/index.ts +583 -4
- package/gs/hash/fnv/index.test.ts +67 -0
- package/gs/hash/fnv/index.ts +351 -0
- package/gs/hash/fnv/meta.json +3 -0
- package/gs/hash/index.test.ts +37 -0
- package/gs/hash/index.ts +118 -0
- package/gs/hash/meta.json +5 -0
- package/gs/internal/abi/index.test.ts +18 -0
- package/gs/internal/abi/index.ts +14 -0
- package/gs/internal/bytealg/index.test.ts +18 -0
- package/gs/internal/bytealg/index.ts +16 -0
- package/gs/internal/byteorder/index.test.ts +39 -0
- package/gs/internal/byteorder/index.ts +100 -27
- package/gs/internal/godebug/index.test.ts +16 -0
- package/gs/internal/godebug/index.ts +35 -0
- package/gs/io/fs/index.ts +1 -0
- package/gs/io/fs/meta.json +5 -0
- package/gs/io/fs/readlink.test.ts +43 -0
- package/gs/io/fs/readlink.ts +69 -0
- package/gs/io/fs/walk.test.ts +61 -0
- package/gs/io/fs/walk.ts +17 -9
- package/gs/io/io.ts +177 -31
- package/gs/io/meta.json +10 -2
- package/gs/iter/iter.ts +8 -2
- package/gs/maps/iter.ts +75 -26
- package/gs/maps/maps.test.ts +23 -0
- package/gs/maps/maps.ts +13 -11
- package/gs/math/bits/index.test.ts +20 -0
- package/gs/math/bits/index.ts +107 -64
- package/gs/math/const.gs.test.ts +11 -5
- package/gs/math/const.gs.ts +5 -6
- package/gs/mime/index.ts +60 -0
- package/gs/net/http/httptest/index.test.ts +53 -0
- package/gs/net/http/httptest/index.ts +120 -0
- package/gs/net/http/index.test.ts +148 -0
- package/gs/net/http/index.ts +432 -0
- package/gs/net/http/meta.json +6 -0
- package/gs/net/http/pprof/index.test.ts +47 -0
- package/gs/net/http/pprof/index.ts +65 -0
- package/gs/os/dir_unix.gs.ts +2 -3
- package/gs/os/error.gs.ts +9 -10
- package/gs/os/error.test.ts +41 -0
- package/gs/os/file_unix_js.test.ts +55 -0
- package/gs/os/tempfile.gs.test.ts +37 -10
- package/gs/os/types_js.gs.ts +96 -17
- package/gs/path/filepath/match.test.ts +31 -12
- package/gs/path/filepath/match.ts +181 -3
- package/gs/path/filepath/meta.json +6 -0
- package/gs/path/filepath/path.test.ts +80 -0
- package/gs/path/filepath/path.ts +244 -11
- package/gs/path/path.ts +20 -5
- package/gs/reflect/field.test.ts +63 -0
- package/gs/reflect/index.ts +5 -1
- package/gs/reflect/iter.ts +2 -2
- package/gs/reflect/map.test.ts +42 -1
- package/gs/reflect/map.ts +39 -0
- package/gs/reflect/type.ts +728 -65
- package/gs/reflect/typefor.test.ts +100 -0
- package/gs/reflect/types.ts +3 -1
- package/gs/reflect/value.ts +50 -1
- package/gs/reflect/visiblefields.ts +1 -1
- package/gs/runtime/debug/index.test.ts +45 -0
- package/gs/runtime/debug/index.ts +96 -0
- package/gs/runtime/pprof/index.test.ts +36 -0
- package/gs/runtime/pprof/index.ts +104 -0
- package/gs/runtime/pprof/meta.json +6 -0
- package/gs/runtime/runtime.test.ts +19 -0
- package/gs/runtime/runtime.ts +98 -3
- package/gs/runtime/trace/index.test.ts +45 -0
- package/gs/runtime/trace/index.ts +97 -0
- package/gs/runtime/trace/meta.json +7 -0
- package/gs/slices/meta.json +2 -1
- package/gs/slices/slices.test.ts +180 -0
- package/gs/slices/slices.ts +502 -15
- package/gs/sort/meta.json +7 -0
- package/gs/sort/slice.gs.ts +85 -26
- package/gs/sort/slice.test.ts +40 -0
- package/gs/sort/sort.gs.ts +16 -13
- package/gs/strings/builder.test.ts +8 -0
- package/gs/strings/builder.ts +33 -20
- package/gs/strings/iter.test.ts +5 -7
- package/gs/strings/iter.ts +146 -71
- package/gs/strings/replace.test.ts +1 -4
- package/gs/strings/replace.ts +6 -6
- package/gs/strings/strings.test.ts +4 -0
- package/gs/strings/strings.ts +54 -6
- package/gs/sync/atomic/type.gs.ts +13 -14
- package/gs/sync/meta.json +3 -1
- package/gs/sync/sync.test.ts +69 -1
- package/gs/sync/sync.ts +72 -13
- package/gs/syscall/constants.ts +39 -24
- package/gs/syscall/errors.ts +165 -112
- package/gs/syscall/fs.ts +195 -0
- package/gs/syscall/js/index.ts +485 -0
- package/gs/syscall/js/meta.json +4 -0
- package/gs/syscall/net.test.ts +111 -0
- package/gs/syscall/types.ts +63 -2
- package/gs/testing/index.ts +1 -0
- package/gs/testing/meta.json +5 -0
- package/gs/testing/testing.test.ts +146 -0
- package/gs/testing/testing.ts +399 -0
- package/gs/time/meta.json +2 -2
- package/gs/time/time.test.ts +110 -0
- package/gs/time/time.ts +309 -57
- package/gs/unicode/unicode.test.ts +36 -0
- package/gs/unicode/unicode.ts +115 -9
- package/gs/unicode/utf8/utf8.test.ts +13 -0
- package/gs/unicode/utf8/utf8.ts +28 -16
- package/gs/unique/index.ts +98 -0
- package/package.json +3 -2
|
@@ -0,0 +1,274 @@
|
|
|
1
|
+
import * as $ from '@goscript/builtin/index.js'
|
|
2
|
+
import * as io from '@goscript/io/index.js'
|
|
3
|
+
|
|
4
|
+
export type Curve = x25519Curve | unsupportedCurve
|
|
5
|
+
export type KeyExchanger = PrivateKey
|
|
6
|
+
|
|
7
|
+
const x25519PublicKeySize = 32
|
|
8
|
+
const x25519PrivateKeySize = 32
|
|
9
|
+
const x25519SharedSecretSize = 32
|
|
10
|
+
const p = (1n << 255n) - 19n
|
|
11
|
+
const a24 = 121665n
|
|
12
|
+
|
|
13
|
+
export class PublicKey {
|
|
14
|
+
public curve: Curve
|
|
15
|
+
public publicKey: $.Bytes
|
|
16
|
+
|
|
17
|
+
constructor(init?: Partial<{ curve: Curve; publicKey: $.Bytes }>) {
|
|
18
|
+
this.curve = init?.curve ?? x25519
|
|
19
|
+
this.publicKey = copyBytes(init?.publicKey ?? null)
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
public Bytes(): $.Bytes {
|
|
23
|
+
return copyBytes(this.publicKey)
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
public Curve(): Curve {
|
|
27
|
+
return this.curve
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
public Equal(x: PublicKey | $.VarRef<PublicKey> | null): boolean {
|
|
31
|
+
const other = $.pointerValueOrNil(x)
|
|
32
|
+
return other instanceof PublicKey && bytesEqual(this.publicKey, other.publicKey)
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
export class PrivateKey {
|
|
37
|
+
public curve: Curve
|
|
38
|
+
public privateKey: $.Bytes
|
|
39
|
+
public publicKey: PublicKey
|
|
40
|
+
|
|
41
|
+
constructor(
|
|
42
|
+
init?: Partial<{ curve: Curve; privateKey: $.Bytes; publicKey: PublicKey }>,
|
|
43
|
+
) {
|
|
44
|
+
this.curve = init?.curve ?? x25519
|
|
45
|
+
this.privateKey = copyBytes(init?.privateKey ?? null)
|
|
46
|
+
this.publicKey = init?.publicKey ?? new PublicKey({ curve: this.curve })
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
public Bytes(): $.Bytes {
|
|
50
|
+
return copyBytes(this.privateKey)
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
public Curve(): Curve {
|
|
54
|
+
return this.curve
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
public ECDH(remote: PublicKey | $.VarRef<PublicKey> | null): [$.Bytes, $.GoError] {
|
|
58
|
+
const remoteKey = $.pointerValueOrNil(remote)
|
|
59
|
+
if (remoteKey == null || remoteKey.curve !== this.curve) {
|
|
60
|
+
return [null, $.newError('crypto/ecdh: private key and public key curves do not match')]
|
|
61
|
+
}
|
|
62
|
+
return this.curve.ecdh(this, remoteKey)
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
public Equal(x: PrivateKey | $.VarRef<PrivateKey> | null): boolean {
|
|
66
|
+
const other = $.pointerValueOrNil(x)
|
|
67
|
+
return other instanceof PrivateKey && bytesEqual(this.privateKey, other.privateKey)
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
public Public(): PublicKey {
|
|
71
|
+
return this.publicKey
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
public PublicKey(): PublicKey {
|
|
75
|
+
return this.publicKey
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
export class x25519Curve {
|
|
80
|
+
public GenerateKey(r: io.Reader | null): [PrivateKey | null, $.GoError] {
|
|
81
|
+
const key = new Uint8Array(x25519PrivateKeySize)
|
|
82
|
+
if (r != null) {
|
|
83
|
+
throw new Error('crypto/ecdh: custom random readers are not implemented in GoScript')
|
|
84
|
+
}
|
|
85
|
+
globalThis.crypto.getRandomValues(key)
|
|
86
|
+
return this.NewPrivateKey(key)
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
public NewPrivateKey(key: $.Bytes): [PrivateKey | null, $.GoError] {
|
|
90
|
+
if ($.len(key) !== x25519PrivateKeySize) {
|
|
91
|
+
return [null, $.newError('crypto/ecdh: invalid private key size')]
|
|
92
|
+
}
|
|
93
|
+
const privateKey = copyBytes(key)
|
|
94
|
+
const publicKey = scalarMult(privateKey, basepoint())
|
|
95
|
+
return [
|
|
96
|
+
new PrivateKey({
|
|
97
|
+
curve: this,
|
|
98
|
+
privateKey,
|
|
99
|
+
publicKey: new PublicKey({ curve: this, publicKey }),
|
|
100
|
+
}),
|
|
101
|
+
null,
|
|
102
|
+
]
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
public NewPublicKey(key: $.Bytes): [PublicKey | null, $.GoError] {
|
|
106
|
+
if ($.len(key) !== x25519PublicKeySize) {
|
|
107
|
+
return [null, $.newError('crypto/ecdh: invalid public key')]
|
|
108
|
+
}
|
|
109
|
+
return [new PublicKey({ curve: this, publicKey: key }), null]
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
public String(): string {
|
|
113
|
+
return 'X25519'
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
public ecdh(local: PrivateKey | null, remote: PublicKey | null): [$.Bytes, $.GoError] {
|
|
117
|
+
const out = scalarMult(local?.privateKey ?? null, remote?.publicKey ?? null)
|
|
118
|
+
if (isZero(out)) {
|
|
119
|
+
return [null, $.newError('crypto/ecdh: bad X25519 remote ECDH input: low order point')]
|
|
120
|
+
}
|
|
121
|
+
return [out, null]
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
export function X25519(): Curve {
|
|
126
|
+
return x25519
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
export const x25519 = new x25519Curve()
|
|
130
|
+
|
|
131
|
+
export class unsupportedCurve {
|
|
132
|
+
constructor(private readonly name: string) {}
|
|
133
|
+
|
|
134
|
+
public GenerateKey(_r: io.Reader | null): [PrivateKey | null, $.GoError] {
|
|
135
|
+
return [null, $.newError(`crypto/ecdh: ${this.name} is not implemented in GoScript`)]
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
public NewPrivateKey(_key: $.Bytes): [PrivateKey | null, $.GoError] {
|
|
139
|
+
return [null, $.newError(`crypto/ecdh: ${this.name} is not implemented in GoScript`)]
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
public NewPublicKey(_key: $.Bytes): [PublicKey | null, $.GoError] {
|
|
143
|
+
return [null, $.newError(`crypto/ecdh: ${this.name} is not implemented in GoScript`)]
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
public String(): string {
|
|
147
|
+
return this.name
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
public ecdh(_local: PrivateKey | null, _remote: PublicKey | null): [$.Bytes, $.GoError] {
|
|
151
|
+
return [null, $.newError(`crypto/ecdh: ${this.name} is not implemented in GoScript`)]
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
export function P256(): Curve {
|
|
156
|
+
return p256
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
export function P384(): Curve {
|
|
160
|
+
return p384
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
export function P521(): Curve {
|
|
164
|
+
return p521
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
const p256 = new unsupportedCurve('P-256')
|
|
168
|
+
const p384 = new unsupportedCurve('P-384')
|
|
169
|
+
const p521 = new unsupportedCurve('P-521')
|
|
170
|
+
|
|
171
|
+
function scalarMult(scalar: $.Bytes, point: $.Bytes): Uint8Array {
|
|
172
|
+
const e = copyBytes(scalar)
|
|
173
|
+
const uBytes = copyBytes(point)
|
|
174
|
+
e[0] &= 248
|
|
175
|
+
e[31] &= 127
|
|
176
|
+
e[31] |= 64
|
|
177
|
+
uBytes[31] &= 127
|
|
178
|
+
|
|
179
|
+
const x1 = decodeLittleEndian(uBytes)
|
|
180
|
+
let x2 = 1n
|
|
181
|
+
let z2 = 0n
|
|
182
|
+
let x3 = x1
|
|
183
|
+
let z3 = 1n
|
|
184
|
+
let swap = 0n
|
|
185
|
+
|
|
186
|
+
for (let t = 254; t >= 0; t--) {
|
|
187
|
+
const k = (BigInt(e[Math.floor(t / 8)]) >> BigInt(t & 7)) & 1n
|
|
188
|
+
swap ^= k
|
|
189
|
+
;[x2, x3] = cswap(swap, x2, x3)
|
|
190
|
+
;[z2, z3] = cswap(swap, z2, z3)
|
|
191
|
+
swap = k
|
|
192
|
+
|
|
193
|
+
const a = mod(x2 + z2)
|
|
194
|
+
const aa = mod(a * a)
|
|
195
|
+
const b = mod(x2 - z2)
|
|
196
|
+
const bb = mod(b * b)
|
|
197
|
+
const eDiff = mod(aa - bb)
|
|
198
|
+
const c = mod(x3 + z3)
|
|
199
|
+
const d = mod(x3 - z3)
|
|
200
|
+
const da = mod(d * a)
|
|
201
|
+
const cb = mod(c * b)
|
|
202
|
+
x3 = mod((da + cb) ** 2n)
|
|
203
|
+
z3 = mod(x1 * mod((da - cb) ** 2n))
|
|
204
|
+
x2 = mod(aa * bb)
|
|
205
|
+
z2 = mod(eDiff * mod(aa + a24 * eDiff))
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
x2 = cswap(swap, x2, x3)[0]
|
|
209
|
+
z2 = cswap(swap, z2, z3)[0]
|
|
210
|
+
|
|
211
|
+
return encodeLittleEndian(mod(x2 * modInverse(z2)))
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
function cswap(swap: bigint, x: bigint, y: bigint): [bigint, bigint] {
|
|
215
|
+
const mask = -swap
|
|
216
|
+
const t = mask & (x ^ y)
|
|
217
|
+
return [x ^ t, y ^ t]
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
function mod(value: bigint): bigint {
|
|
221
|
+
const result = value % p
|
|
222
|
+
return result >= 0n ? result : result + p
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
function modInverse(value: bigint): bigint {
|
|
226
|
+
let lm = 1n
|
|
227
|
+
let hm = 0n
|
|
228
|
+
let low = mod(value)
|
|
229
|
+
let high = p
|
|
230
|
+
while (low > 1n) {
|
|
231
|
+
const r = high / low
|
|
232
|
+
;[lm, hm] = [hm - lm * r, lm]
|
|
233
|
+
;[low, high] = [high - low * r, low]
|
|
234
|
+
}
|
|
235
|
+
return mod(lm)
|
|
236
|
+
}
|
|
237
|
+
|
|
238
|
+
function decodeLittleEndian(bytes: Uint8Array): bigint {
|
|
239
|
+
let out = 0n
|
|
240
|
+
for (let i = bytes.length - 1; i >= 0; i--) {
|
|
241
|
+
out = (out << 8n) | BigInt(bytes[i])
|
|
242
|
+
}
|
|
243
|
+
return out
|
|
244
|
+
}
|
|
245
|
+
|
|
246
|
+
function encodeLittleEndian(value: bigint): Uint8Array {
|
|
247
|
+
const out = new Uint8Array(x25519SharedSecretSize)
|
|
248
|
+
let v = mod(value)
|
|
249
|
+
for (let i = 0; i < out.length; i++) {
|
|
250
|
+
out[i] = Number(v & 0xffn)
|
|
251
|
+
v >>= 8n
|
|
252
|
+
}
|
|
253
|
+
return out
|
|
254
|
+
}
|
|
255
|
+
|
|
256
|
+
function basepoint(): Uint8Array {
|
|
257
|
+
const out = new Uint8Array(x25519PublicKeySize)
|
|
258
|
+
out[0] = 9
|
|
259
|
+
return out
|
|
260
|
+
}
|
|
261
|
+
|
|
262
|
+
function copyBytes(bytes: $.Bytes | null): Uint8Array {
|
|
263
|
+
return new Uint8Array($.bytesToUint8Array(bytes ?? null))
|
|
264
|
+
}
|
|
265
|
+
|
|
266
|
+
function bytesEqual(a: $.Bytes, b: $.Bytes): boolean {
|
|
267
|
+
const aa = $.bytesToUint8Array(a)
|
|
268
|
+
const bb = $.bytesToUint8Array(b)
|
|
269
|
+
return aa.length === bb.length && aa.every((v, i) => v === bb[i])
|
|
270
|
+
}
|
|
271
|
+
|
|
272
|
+
function isZero(bytes: Uint8Array): boolean {
|
|
273
|
+
return bytes.every((b) => b === 0)
|
|
274
|
+
}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { describe, expect, test } from 'vitest'
|
|
2
|
+
import * as $ from '@goscript/builtin/index.js'
|
|
3
|
+
|
|
4
|
+
import {
|
|
5
|
+
GenerateKey,
|
|
6
|
+
PrivateKeySize,
|
|
7
|
+
PrivateKey_Public,
|
|
8
|
+
PublicKeySize,
|
|
9
|
+
SignatureSize,
|
|
10
|
+
Sign,
|
|
11
|
+
Verify,
|
|
12
|
+
} from './index.js'
|
|
13
|
+
|
|
14
|
+
describe('crypto/ed25519 override', () => {
|
|
15
|
+
test('generates keys and verifies signatures', async () => {
|
|
16
|
+
const [pub, priv, err] = await GenerateKey(null)
|
|
17
|
+
expect(err).toBeNull()
|
|
18
|
+
expect($.len(pub)).toBe(PublicKeySize)
|
|
19
|
+
expect($.len(priv)).toBe(PrivateKeySize)
|
|
20
|
+
|
|
21
|
+
const message = $.stringToBytes('goscript')
|
|
22
|
+
const sig = await Sign(priv, message)
|
|
23
|
+
expect($.len(sig)).toBe(SignatureSize)
|
|
24
|
+
expect(await Verify(pub, message, sig)).toBe(true)
|
|
25
|
+
expect(await Verify(pub, $.stringToBytes('wrong'), sig)).toBe(false)
|
|
26
|
+
})
|
|
27
|
+
|
|
28
|
+
test('boxes public keys as crypto public keys', async () => {
|
|
29
|
+
const [pub, priv, err] = await GenerateKey(null)
|
|
30
|
+
expect(err).toBeNull()
|
|
31
|
+
|
|
32
|
+
const boxed = PrivateKey_Public(priv)
|
|
33
|
+
const [unboxed, ok] = $.typeAssertTuple<Uint8Array>(
|
|
34
|
+
boxed,
|
|
35
|
+
'ed25519.PublicKey',
|
|
36
|
+
)
|
|
37
|
+
expect(ok).toBe(true)
|
|
38
|
+
expect(Array.from(unboxed)).toEqual(Array.from(pub))
|
|
39
|
+
expect((boxed as any).Equal(boxed)).toBe(true)
|
|
40
|
+
})
|
|
41
|
+
})
|
|
@@ -0,0 +1,238 @@
|
|
|
1
|
+
import * as $ from '@goscript/builtin/index.js'
|
|
2
|
+
import * as io from '@goscript/io/index.js'
|
|
3
|
+
|
|
4
|
+
export type PublicKey = $.Bytes
|
|
5
|
+
export type PrivateKey = $.Bytes
|
|
6
|
+
type Hash = number
|
|
7
|
+
type PublicKeyInterface = any
|
|
8
|
+
type PrivateKeyInterface = any
|
|
9
|
+
type SignerOpts = { HashFunc(): Hash }
|
|
10
|
+
|
|
11
|
+
export const PublicKeySize = 32
|
|
12
|
+
export const PrivateKeySize = 64
|
|
13
|
+
export const SignatureSize = 64
|
|
14
|
+
export const SeedSize = 32
|
|
15
|
+
|
|
16
|
+
const pkcs8Prefix = new Uint8Array([
|
|
17
|
+
0x30, 0x2e, 0x02, 0x01, 0x00, 0x30, 0x05, 0x06, 0x03, 0x2b, 0x65, 0x70,
|
|
18
|
+
0x04, 0x22, 0x04, 0x20,
|
|
19
|
+
])
|
|
20
|
+
|
|
21
|
+
export class Options {
|
|
22
|
+
public Hash: Hash = 0
|
|
23
|
+
public Context = ''
|
|
24
|
+
|
|
25
|
+
constructor(init?: Partial<{ Hash: Hash; Context: string }>) {
|
|
26
|
+
this.Hash = init?.Hash ?? 0
|
|
27
|
+
this.Context = init?.Context ?? ''
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
public HashFunc(): Hash {
|
|
31
|
+
return this.Hash
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
export function PublicKey_Equal(pub: PublicKey, x: PublicKeyInterface | null): boolean {
|
|
36
|
+
const [xx, ok] = $.typeAssertTuple<PublicKey>(x, 'ed25519.PublicKey')
|
|
37
|
+
return ok && bytesEqual(pub, xx)
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
export function PrivateKey_Public(priv: PrivateKey): PublicKeyInterface | null {
|
|
41
|
+
const publicKey = new Uint8Array(PublicKeySize)
|
|
42
|
+
publicKey.set($.bytesToUint8Array(priv).subarray(SeedSize, PrivateKeySize))
|
|
43
|
+
return $.namedValueInterfaceValue<PublicKeyInterface | null>(
|
|
44
|
+
publicKey,
|
|
45
|
+
'ed25519.PublicKey',
|
|
46
|
+
{ Equal: PublicKey_Equal },
|
|
47
|
+
)
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
export function PrivateKey_Equal(priv: PrivateKey, x: PrivateKeyInterface | null): boolean {
|
|
51
|
+
const [xx, ok] = $.typeAssertTuple<PrivateKey>(x, 'ed25519.PrivateKey')
|
|
52
|
+
return ok && bytesEqual(priv, xx)
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
export function PrivateKey_Seed(priv: PrivateKey): $.Bytes {
|
|
56
|
+
return new Uint8Array($.bytesToUint8Array(priv).subarray(0, SeedSize))
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
export async function PrivateKey_Sign(
|
|
60
|
+
priv: PrivateKey,
|
|
61
|
+
_rand: io.Reader | null,
|
|
62
|
+
message: $.Bytes,
|
|
63
|
+
opts: SignerOpts | null,
|
|
64
|
+
): Promise<[$.Bytes, $.GoError]> {
|
|
65
|
+
if (opts != null && opts.HashFunc() !== 0) {
|
|
66
|
+
return [null, new Ed25519Error('ed25519: expected opts.HashFunc() zero')]
|
|
67
|
+
}
|
|
68
|
+
return [await Sign(priv, message), null]
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
export async function GenerateKey(random: io.Reader | null): Promise<[PublicKey, PrivateKey, $.GoError]> {
|
|
72
|
+
const seed = new Uint8Array(SeedSize)
|
|
73
|
+
if (random == null) {
|
|
74
|
+
const subtle = subtleCrypto()
|
|
75
|
+
if (subtle == null) {
|
|
76
|
+
return [
|
|
77
|
+
null as PublicKey,
|
|
78
|
+
null as PrivateKey,
|
|
79
|
+
new Ed25519Error('crypto/ed25519: WebCrypto is unavailable'),
|
|
80
|
+
]
|
|
81
|
+
}
|
|
82
|
+
globalThis.crypto.getRandomValues(seed)
|
|
83
|
+
} else {
|
|
84
|
+
const [, err] = await io.ReadFull(random, seed)
|
|
85
|
+
if (err != null) {
|
|
86
|
+
return [null as PublicKey, null as PrivateKey, err]
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
const privateKey = await NewKeyFromSeed(seed)
|
|
91
|
+
return [
|
|
92
|
+
$.mustTypeAssert<PublicKey>(
|
|
93
|
+
PrivateKey_Public(privateKey),
|
|
94
|
+
'ed25519.PublicKey',
|
|
95
|
+
),
|
|
96
|
+
privateKey,
|
|
97
|
+
null,
|
|
98
|
+
]
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
export async function NewKeyFromSeed(seed: $.Bytes): Promise<PrivateKey> {
|
|
102
|
+
const seedBytes = $.bytesToUint8Array(seed)
|
|
103
|
+
if (seedBytes.length !== SeedSize) {
|
|
104
|
+
throw new Error(`ed25519: bad seed length: ${seedBytes.length}`)
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
const subtle = requireSubtle()
|
|
108
|
+
const key = await subtle.importKey(
|
|
109
|
+
'pkcs8',
|
|
110
|
+
pkcs8FromSeed(seedBytes) as unknown as BufferSource,
|
|
111
|
+
{ name: 'Ed25519' },
|
|
112
|
+
true,
|
|
113
|
+
['sign'],
|
|
114
|
+
)
|
|
115
|
+
const jwk = await subtle.exportKey('jwk', key)
|
|
116
|
+
if (typeof jwk.x !== 'string') {
|
|
117
|
+
throw new Error('crypto/ed25519: imported key did not expose public key')
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
const publicKey = base64URLDecode(jwk.x)
|
|
121
|
+
const privateKey = new Uint8Array(PrivateKeySize)
|
|
122
|
+
privateKey.set(seedBytes, 0)
|
|
123
|
+
privateKey.set(publicKey, SeedSize)
|
|
124
|
+
return privateKey
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
export async function Sign(privateKey: PrivateKey, message: $.Bytes): Promise<$.Bytes> {
|
|
128
|
+
const priv = $.bytesToUint8Array(privateKey)
|
|
129
|
+
if (priv.length !== PrivateKeySize) {
|
|
130
|
+
throw new Error(`ed25519: bad private key length: ${priv.length}`)
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
const key = await requireSubtle().importKey(
|
|
134
|
+
'pkcs8',
|
|
135
|
+
pkcs8FromSeed(priv.subarray(0, SeedSize)) as unknown as BufferSource,
|
|
136
|
+
{ name: 'Ed25519' },
|
|
137
|
+
false,
|
|
138
|
+
['sign'],
|
|
139
|
+
)
|
|
140
|
+
const sig = await requireSubtle().sign(
|
|
141
|
+
'Ed25519',
|
|
142
|
+
key,
|
|
143
|
+
$.bytesToUint8Array(message) as unknown as BufferSource,
|
|
144
|
+
)
|
|
145
|
+
return new Uint8Array(sig)
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
export async function Verify(
|
|
149
|
+
publicKey: PublicKey,
|
|
150
|
+
message: $.Bytes,
|
|
151
|
+
sig: $.Bytes,
|
|
152
|
+
): Promise<boolean> {
|
|
153
|
+
return (await VerifyWithOptions(publicKey, message, sig, new Options())) == null
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
export async function VerifyWithOptions(
|
|
157
|
+
publicKey: PublicKey,
|
|
158
|
+
message: $.Bytes,
|
|
159
|
+
sig: $.Bytes,
|
|
160
|
+
opts: Options | $.VarRef<Options> | null,
|
|
161
|
+
): Promise<$.GoError> {
|
|
162
|
+
if ($.len(publicKey) !== PublicKeySize) {
|
|
163
|
+
throw new Error(`ed25519: bad public key length: ${$.len(publicKey)}`)
|
|
164
|
+
}
|
|
165
|
+
if ($.len(sig) !== SignatureSize) {
|
|
166
|
+
return new Ed25519Error('ed25519: bad signature length')
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
const options = $.pointerValueOrNil(opts)
|
|
170
|
+
if (options != null && (options.Hash !== 0 || options.Context !== '')) {
|
|
171
|
+
return new Ed25519Error('ed25519: only pure Ed25519 is supported')
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
const key = await requireSubtle().importKey(
|
|
175
|
+
'raw',
|
|
176
|
+
$.bytesToUint8Array(publicKey) as unknown as BufferSource,
|
|
177
|
+
{ name: 'Ed25519' },
|
|
178
|
+
false,
|
|
179
|
+
['verify'],
|
|
180
|
+
)
|
|
181
|
+
const ok = await requireSubtle().verify(
|
|
182
|
+
'Ed25519',
|
|
183
|
+
key,
|
|
184
|
+
$.bytesToUint8Array(sig) as unknown as BufferSource,
|
|
185
|
+
$.bytesToUint8Array(message) as unknown as BufferSource,
|
|
186
|
+
)
|
|
187
|
+
return ok ? null : new Ed25519Error('ed25519: invalid signature')
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
class Ed25519Error {
|
|
191
|
+
constructor(private readonly message: string) {}
|
|
192
|
+
|
|
193
|
+
Error(): string {
|
|
194
|
+
return this.message
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
function requireSubtle(): SubtleCrypto {
|
|
199
|
+
const subtle = subtleCrypto()
|
|
200
|
+
if (subtle == null) {
|
|
201
|
+
throw new Error('crypto/ed25519: WebCrypto Ed25519 is unavailable')
|
|
202
|
+
}
|
|
203
|
+
return subtle
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
function subtleCrypto(): SubtleCrypto | null {
|
|
207
|
+
const crypto = globalThis.crypto
|
|
208
|
+
if (crypto?.subtle && typeof crypto.subtle.importKey === 'function') {
|
|
209
|
+
return crypto.subtle
|
|
210
|
+
}
|
|
211
|
+
return null
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
function pkcs8FromSeed(seed: Uint8Array): Uint8Array {
|
|
215
|
+
const out = new Uint8Array(pkcs8Prefix.length + SeedSize)
|
|
216
|
+
out.set(pkcs8Prefix)
|
|
217
|
+
out.set(seed, pkcs8Prefix.length)
|
|
218
|
+
return out
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
function bytesEqual(a: $.Bytes, b: $.Bytes): boolean {
|
|
222
|
+
const aa = $.bytesToUint8Array(a)
|
|
223
|
+
const bb = $.bytesToUint8Array(b)
|
|
224
|
+
if (aa.length !== bb.length) {
|
|
225
|
+
return false
|
|
226
|
+
}
|
|
227
|
+
let diff = 0
|
|
228
|
+
for (let i = 0; i < aa.length; i++) {
|
|
229
|
+
diff |= aa[i] ^ bb[i]
|
|
230
|
+
}
|
|
231
|
+
return diff === 0
|
|
232
|
+
}
|
|
233
|
+
|
|
234
|
+
function base64URLDecode(value: string): Uint8Array {
|
|
235
|
+
const normalized = value.replace(/-/g, '+').replace(/_/g, '/')
|
|
236
|
+
const padded = normalized.padEnd(Math.ceil(normalized.length / 4) * 4, '=')
|
|
237
|
+
return Uint8Array.from(atob(padded), (c) => c.charCodeAt(0))
|
|
238
|
+
}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { describe, expect, test } from 'vitest'
|
|
2
|
+
|
|
3
|
+
import { ByteEq, Eq, LessOrEq, Select } from './index.js'
|
|
4
|
+
|
|
5
|
+
describe('crypto/internal/constanttime override', () => {
|
|
6
|
+
test('selects on any non-zero selector', () => {
|
|
7
|
+
expect(Select(0, 11, 22)).toBe(22)
|
|
8
|
+
expect(Select(1, 11, 22)).toBe(11)
|
|
9
|
+
expect(Select(7, 11, 22)).toBe(11)
|
|
10
|
+
})
|
|
11
|
+
|
|
12
|
+
test('compares bytes and int32 values', () => {
|
|
13
|
+
expect(ByteEq(0xff, 0xff)).toBe(1)
|
|
14
|
+
expect(ByteEq(0x1ff, 0xff)).toBe(1)
|
|
15
|
+
expect(ByteEq(0x01, 0x02)).toBe(0)
|
|
16
|
+
expect(Eq(12, 12)).toBe(1)
|
|
17
|
+
expect(Eq(12, 13)).toBe(0)
|
|
18
|
+
})
|
|
19
|
+
|
|
20
|
+
test('compares integer ordering', () => {
|
|
21
|
+
expect(LessOrEq(1, 1)).toBe(1)
|
|
22
|
+
expect(LessOrEq(1, 2)).toBe(1)
|
|
23
|
+
expect(LessOrEq(2, 1)).toBe(0)
|
|
24
|
+
})
|
|
25
|
+
})
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import * as $ from '@goscript/builtin/index.js'
|
|
2
|
+
|
|
3
|
+
export function Select(v: number, x: number, y: number): number {
|
|
4
|
+
v = boolToUint8(v !== 0)
|
|
5
|
+
return (~(v - 1) & x) | ((v - 1) & y)
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
export function ByteEq(x: number, y: number): number {
|
|
9
|
+
return $.int(boolToUint8($.uint(x, 8) === $.uint(y, 8)))
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
export function Eq(x: number, y: number): number {
|
|
13
|
+
return $.int(boolToUint8($.int(x, 32) === $.int(y, 32)))
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
export function LessOrEq(x: number, y: number): number {
|
|
17
|
+
return $.int(boolToUint8(x <= y))
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
function boolToUint8(b: boolean): number {
|
|
21
|
+
return b ? 1 : 0
|
|
22
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from '@goscript/internal/byteorder/index.js'
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { New, Setting, Value } from '@goscript/internal/godebug/index.js'
|