@attocash/cli 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +28 -0
- package/README.md +707 -0
- package/dist/application/app.d.ts +138 -0
- package/dist/application/app.js +654 -0
- package/dist/application/operations.d.ts +9 -0
- package/dist/application/operations.js +96 -0
- package/dist/cli/cli.d.ts +1 -0
- package/dist/cli/cli.js +460 -0
- package/dist/cli/help.d.ts +4 -0
- package/dist/cli/help.js +49 -0
- package/dist/cli/main.d.ts +2 -0
- package/dist/cli/main.js +13 -0
- package/dist/cli/onboarding.d.ts +14 -0
- package/dist/cli/onboarding.js +144 -0
- package/dist/cli/output.d.ts +2 -0
- package/dist/cli/output.js +231 -0
- package/dist/cli/terminal.d.ts +6 -0
- package/dist/cli/terminal.js +92 -0
- package/dist/cli/update-check.d.ts +1 -0
- package/dist/cli/update-check.js +12 -0
- package/dist/cli/updates.d.ts +2 -0
- package/dist/cli/updates.js +98 -0
- package/dist/core.d.ts +14 -0
- package/dist/core.js +14 -0
- package/dist/doctor/credential-probe.d.ts +7 -0
- package/dist/doctor/credential-probe.js +49 -0
- package/dist/doctor/doctor.d.ts +4 -0
- package/dist/doctor/doctor.js +213 -0
- package/dist/doctor/keyring.d.ts +7 -0
- package/dist/doctor/keyring.js +150 -0
- package/dist/doctor/profile.d.ts +19 -0
- package/dist/doctor/profile.js +73 -0
- package/dist/doctor/types.d.ts +40 -0
- package/dist/doctor/types.js +1 -0
- package/dist/domain/amount.d.ts +6 -0
- package/dist/domain/amount.js +27 -0
- package/dist/domain/errors.d.ts +10 -0
- package/dist/domain/errors.js +16 -0
- package/dist/labels/directory.d.ts +87 -0
- package/dist/labels/directory.js +140 -0
- package/dist/labels/personal.d.ts +17 -0
- package/dist/labels/personal.js +56 -0
- package/dist/labels/presentation.d.ts +154 -0
- package/dist/labels/presentation.js +90 -0
- package/dist/network/reader.d.ts +31 -0
- package/dist/network/reader.js +370 -0
- package/dist/network/retry.d.ts +7 -0
- package/dist/network/retry.js +53 -0
- package/dist/network/work.d.ts +3 -0
- package/dist/network/work.js +66 -0
- package/dist/pricing/market.d.ts +29 -0
- package/dist/pricing/market.js +150 -0
- package/dist/pricing/terms.d.ts +6 -0
- package/dist/pricing/terms.js +12 -0
- package/dist/spending/destination.d.ts +16 -0
- package/dist/spending/destination.js +42 -0
- package/dist/spending/journal.d.ts +28 -0
- package/dist/spending/journal.js +69 -0
- package/dist/spending/ledger.d.ts +118 -0
- package/dist/spending/ledger.js +444 -0
- package/dist/spending/payments.d.ts +67 -0
- package/dist/spending/payments.js +424 -0
- package/dist/spending/pool.d.ts +13 -0
- package/dist/spending/pool.js +38 -0
- package/dist/spending/reconcile.d.ts +18 -0
- package/dist/spending/reconcile.js +64 -0
- package/dist/storage/profiles.d.ts +13 -0
- package/dist/storage/profiles.js +86 -0
- package/dist/storage/secrets.d.ts +16 -0
- package/dist/storage/secrets.js +104 -0
- package/dist/storage/state.d.ts +32 -0
- package/dist/storage/state.js +255 -0
- package/dist/wallet/auto-receive.d.ts +57 -0
- package/dist/wallet/auto-receive.js +140 -0
- package/dist/wallet/defaults.d.ts +3 -0
- package/dist/wallet/defaults.js +26 -0
- package/dist/wallet/signing.d.ts +17 -0
- package/dist/wallet/signing.js +128 -0
- package/dist/wallet/types.d.ts +65 -0
- package/dist/wallet/types.js +1 -0
- package/dist/wallet/work.d.ts +29 -0
- package/dist/wallet/work.js +154 -0
- package/dist/watches/manager.d.ts +75 -0
- package/dist/watches/manager.js +197 -0
- package/node_modules/@attocash/commons-core/Kotlin-DateTime-library-kotlinx-datetime.mjs +6678 -0
- package/node_modules/@attocash/commons-core/Kotlin-DateTime-library-kotlinx-datetime.mjs.map +1 -0
- package/node_modules/@attocash/commons-core/LICENSE +28 -0
- package/node_modules/@attocash/commons-core/README.md +118 -0
- package/node_modules/@attocash/commons-core/commons-commons-core.d.mts +1036 -0
- package/node_modules/@attocash/commons-core/commons-commons-core.mjs +7701 -0
- package/node_modules/@attocash/commons-core/commons-commons-core.mjs.map +1 -0
- package/node_modules/@attocash/commons-core/kotlin-kotlin-stdlib.mjs +17681 -0
- package/node_modules/@attocash/commons-core/kotlin-kotlin-stdlib.mjs.map +1 -0
- package/node_modules/@attocash/commons-core/kotlin_org_jetbrains_kotlin_kotlin_dom_api_compat.mjs +4 -0
- package/node_modules/@attocash/commons-core/kotlin_org_jetbrains_kotlin_kotlin_dom_api_compat.mjs.map +1 -0
- package/node_modules/@attocash/commons-core/kotlinx-io-kotlinx-io-bytestring.mjs +209 -0
- package/node_modules/@attocash/commons-core/kotlinx-io-kotlinx-io-bytestring.mjs.map +1 -0
- package/node_modules/@attocash/commons-core/kotlinx-io-kotlinx-io-core.mjs +2284 -0
- package/node_modules/@attocash/commons-core/kotlinx-io-kotlinx-io-core.mjs.map +1 -0
- package/node_modules/@attocash/commons-core/kotlinx-serialization-kotlinx-serialization-core.mjs +6042 -0
- package/node_modules/@attocash/commons-core/kotlinx-serialization-kotlinx-serialization-core.mjs.map +1 -0
- package/node_modules/@attocash/commons-core/kotlinx-serialization-kotlinx-serialization-json.mjs +5294 -0
- package/node_modules/@attocash/commons-core/kotlinx-serialization-kotlinx-serialization-json.mjs.map +1 -0
- package/node_modules/@attocash/commons-core/package.json +27 -0
- package/node_modules/@attocash/commons-node/LICENSE +28 -0
- package/node_modules/@attocash/commons-node/README.md +92 -0
- package/node_modules/@attocash/commons-node/commons-commons-node.d.mts +255 -0
- package/node_modules/@attocash/commons-node/commons-commons-node.mjs +2977 -0
- package/node_modules/@attocash/commons-node/commons-commons-node.mjs.map +1 -0
- package/node_modules/@attocash/commons-node/kotlin-logging.mjs +432 -0
- package/node_modules/@attocash/commons-node/kotlin-logging.mjs.map +1 -0
- package/node_modules/@attocash/commons-node/kotlinx-serialization-kotlinx-serialization-json.mjs +5294 -0
- package/node_modules/@attocash/commons-node/kotlinx-serialization-kotlinx-serialization-json.mjs.map +1 -0
- package/node_modules/@attocash/commons-node/package.json +29 -0
- package/node_modules/@attocash/commons-node-remote/LICENSE +28 -0
- package/node_modules/@attocash/commons-node-remote/README.md +61 -0
- package/node_modules/@attocash/commons-node-remote/commons-commons-node-remote.d.mts +122 -0
- package/node_modules/@attocash/commons-node-remote/commons-commons-node-remote.mjs +1810 -0
- package/node_modules/@attocash/commons-node-remote/commons-commons-node-remote.mjs.map +1 -0
- package/node_modules/@attocash/commons-node-remote/kotlin-logging.mjs +432 -0
- package/node_modules/@attocash/commons-node-remote/kotlin-logging.mjs.map +1 -0
- package/node_modules/@attocash/commons-node-remote/kotlinx-browser.mjs +8 -0
- package/node_modules/@attocash/commons-node-remote/kotlinx-browser.mjs.map +1 -0
- package/node_modules/@attocash/commons-node-remote/kotlinx-serialization-kotlinx-serialization-json-io.mjs +4 -0
- package/node_modules/@attocash/commons-node-remote/kotlinx-serialization-kotlinx-serialization-json-io.mjs.map +1 -0
- package/node_modules/@attocash/commons-node-remote/kotlinx-serialization-kotlinx-serialization-json.mjs +5294 -0
- package/node_modules/@attocash/commons-node-remote/kotlinx-serialization-kotlinx-serialization-json.mjs.map +1 -0
- package/node_modules/@attocash/commons-node-remote/package.json +31 -0
- package/node_modules/@attocash/commons-transport/LICENSE +28 -0
- package/node_modules/@attocash/commons-transport/README.md +5 -0
- package/node_modules/@attocash/commons-transport/commons-commons-transport.d.mts +64 -0
- package/node_modules/@attocash/commons-transport/commons-commons-transport.mjs +249 -0
- package/node_modules/@attocash/commons-transport/commons-commons-transport.mjs.map +1 -0
- package/node_modules/@attocash/commons-transport/kotlinx-atomicfu.mjs +263 -0
- package/node_modules/@attocash/commons-transport/kotlinx-atomicfu.mjs.map +1 -0
- package/node_modules/@attocash/commons-transport/kotlinx-browser.mjs +8 -0
- package/node_modules/@attocash/commons-transport/kotlinx-browser.mjs.map +1 -0
- package/node_modules/@attocash/commons-transport/kotlinx-coroutines-core.mjs +11604 -0
- package/node_modules/@attocash/commons-transport/kotlinx-coroutines-core.mjs.map +1 -0
- package/node_modules/@attocash/commons-transport/kotlinx-serialization-kotlinx-serialization-json-io.mjs +4 -0
- package/node_modules/@attocash/commons-transport/kotlinx-serialization-kotlinx-serialization-json-io.mjs.map +1 -0
- package/node_modules/@attocash/commons-transport/kotlinx-serialization-kotlinx-serialization-json.mjs +5294 -0
- package/node_modules/@attocash/commons-transport/kotlinx-serialization-kotlinx-serialization-json.mjs.map +1 -0
- package/node_modules/@attocash/commons-transport/ktor-ktor-client-content-negotiation.mjs +499 -0
- package/node_modules/@attocash/commons-transport/ktor-ktor-client-content-negotiation.mjs.map +1 -0
- package/node_modules/@attocash/commons-transport/ktor-ktor-client-core.mjs +6456 -0
- package/node_modules/@attocash/commons-transport/ktor-ktor-client-core.mjs.map +1 -0
- package/node_modules/@attocash/commons-transport/ktor-ktor-events.mjs +83 -0
- package/node_modules/@attocash/commons-transport/ktor-ktor-events.mjs.map +1 -0
- package/node_modules/@attocash/commons-transport/ktor-ktor-http-cio.mjs +1714 -0
- package/node_modules/@attocash/commons-transport/ktor-ktor-http-cio.mjs.map +1 -0
- package/node_modules/@attocash/commons-transport/ktor-ktor-http.mjs +3197 -0
- package/node_modules/@attocash/commons-transport/ktor-ktor-http.mjs.map +1 -0
- package/node_modules/@attocash/commons-transport/ktor-ktor-io.mjs +2290 -0
- package/node_modules/@attocash/commons-transport/ktor-ktor-io.mjs.map +1 -0
- package/node_modules/@attocash/commons-transport/ktor-ktor-serialization-kotlinx-json.mjs +46 -0
- package/node_modules/@attocash/commons-transport/ktor-ktor-serialization-kotlinx-json.mjs.map +1 -0
- package/node_modules/@attocash/commons-transport/ktor-ktor-serialization-kotlinx.mjs +482 -0
- package/node_modules/@attocash/commons-transport/ktor-ktor-serialization-kotlinx.mjs.map +1 -0
- package/node_modules/@attocash/commons-transport/ktor-ktor-serialization.mjs +165 -0
- package/node_modules/@attocash/commons-transport/ktor-ktor-serialization.mjs.map +1 -0
- package/node_modules/@attocash/commons-transport/ktor-ktor-sse.mjs +4 -0
- package/node_modules/@attocash/commons-transport/ktor-ktor-sse.mjs.map +1 -0
- package/node_modules/@attocash/commons-transport/ktor-ktor-utils.mjs +3222 -0
- package/node_modules/@attocash/commons-transport/ktor-ktor-utils.mjs.map +1 -0
- package/node_modules/@attocash/commons-transport/ktor-ktor-websocket-serialization.mjs +4 -0
- package/node_modules/@attocash/commons-transport/ktor-ktor-websocket-serialization.mjs.map +1 -0
- package/node_modules/@attocash/commons-transport/ktor-ktor-websockets.mjs +1485 -0
- package/node_modules/@attocash/commons-transport/ktor-ktor-websockets.mjs.map +1 -0
- package/node_modules/@attocash/commons-transport/package.json +29 -0
- package/node_modules/@attocash/commons-worker/LICENSE +28 -0
- package/node_modules/@attocash/commons-worker/README.md +48 -0
- package/node_modules/@attocash/commons-worker/commons-commons-worker.d.mts +73 -0
- package/node_modules/@attocash/commons-worker/commons-commons-worker.mjs +702 -0
- package/node_modules/@attocash/commons-worker/commons-commons-worker.mjs.map +1 -0
- package/node_modules/@attocash/commons-worker/kotlin-logging.mjs +432 -0
- package/node_modules/@attocash/commons-worker/kotlin-logging.mjs.map +1 -0
- package/node_modules/@attocash/commons-worker/kotlinx-serialization-kotlinx-serialization-json.mjs +5294 -0
- package/node_modules/@attocash/commons-worker/kotlinx-serialization-kotlinx-serialization-json.mjs.map +1 -0
- package/node_modules/@attocash/commons-worker/package.json +29 -0
- package/node_modules/@attocash/commons-worker-remote/LICENSE +28 -0
- package/node_modules/@attocash/commons-worker-remote/README.md +60 -0
- package/node_modules/@attocash/commons-worker-remote/commons-commons-worker-remote.d.mts +93 -0
- package/node_modules/@attocash/commons-worker-remote/commons-commons-worker-remote.mjs +289 -0
- package/node_modules/@attocash/commons-worker-remote/commons-commons-worker-remote.mjs.map +1 -0
- package/node_modules/@attocash/commons-worker-remote/kotlin-logging.mjs +432 -0
- package/node_modules/@attocash/commons-worker-remote/kotlin-logging.mjs.map +1 -0
- package/node_modules/@attocash/commons-worker-remote/kotlinx-browser.mjs +8 -0
- package/node_modules/@attocash/commons-worker-remote/kotlinx-browser.mjs.map +1 -0
- package/node_modules/@attocash/commons-worker-remote/kotlinx-serialization-kotlinx-serialization-json-io.mjs +4 -0
- package/node_modules/@attocash/commons-worker-remote/kotlinx-serialization-kotlinx-serialization-json-io.mjs.map +1 -0
- package/node_modules/@attocash/commons-worker-remote/kotlinx-serialization-kotlinx-serialization-json.mjs +5294 -0
- package/node_modules/@attocash/commons-worker-remote/kotlinx-serialization-kotlinx-serialization-json.mjs.map +1 -0
- package/node_modules/@attocash/commons-worker-remote/package.json +31 -0
- package/node_modules/@js-joda/core/CHANGELOG.md +363 -0
- package/node_modules/@js-joda/core/CheatSheet.md +947 -0
- package/node_modules/@js-joda/core/LICENSE +34 -0
- package/node_modules/@js-joda/core/README.md +155 -0
- package/node_modules/@js-joda/core/bower.json +21 -0
- package/node_modules/@js-joda/core/dist/js-joda.d.ts +2452 -0
- package/node_modules/@js-joda/core/dist/js-joda.esm.js +13564 -0
- package/node_modules/@js-joda/core/dist/js-joda.flow.js +949 -0
- package/node_modules/@js-joda/core/dist/js-joda.js +13630 -0
- package/node_modules/@js-joda/core/dist/js-joda.js.map +1 -0
- package/node_modules/@js-joda/core/dist/js-joda.min.js +5 -0
- package/node_modules/@js-joda/core/package.json +76 -0
- package/node_modules/@js-joda/core/src/Clock.js +330 -0
- package/node_modules/@js-joda/core/src/DayOfWeek.js +451 -0
- package/node_modules/@js-joda/core/src/Duration.js +1205 -0
- package/node_modules/@js-joda/core/src/Enum.js +30 -0
- package/node_modules/@js-joda/core/src/Instant.js +1012 -0
- package/node_modules/@js-joda/core/src/LocalDate.js +1703 -0
- package/node_modules/@js-joda/core/src/LocalDateTime.js +1686 -0
- package/node_modules/@js-joda/core/src/LocalTime.js +1415 -0
- package/node_modules/@js-joda/core/src/MathUtil.js +236 -0
- package/node_modules/@js-joda/core/src/Month.js +600 -0
- package/node_modules/@js-joda/core/src/MonthDay.js +730 -0
- package/node_modules/@js-joda/core/src/OffsetDateTime.js +757 -0
- package/node_modules/@js-joda/core/src/OffsetTime.js +621 -0
- package/node_modules/@js-joda/core/src/Period.js +933 -0
- package/node_modules/@js-joda/core/src/StringUtil.js +43 -0
- package/node_modules/@js-joda/core/src/Year.js +1015 -0
- package/node_modules/@js-joda/core/src/YearConstants.js +21 -0
- package/node_modules/@js-joda/core/src/YearMonth.js +1096 -0
- package/node_modules/@js-joda/core/src/ZoneId.js +236 -0
- package/node_modules/@js-joda/core/src/ZoneIdFactory.js +201 -0
- package/node_modules/@js-joda/core/src/ZoneOffset.js +486 -0
- package/node_modules/@js-joda/core/src/ZoneRegion.js +72 -0
- package/node_modules/@js-joda/core/src/ZonedDateTime.js +2007 -0
- package/node_modules/@js-joda/core/src/_init.js +68 -0
- package/node_modules/@js-joda/core/src/assert.js +33 -0
- package/node_modules/@js-joda/core/src/chrono/ChronoLocalDate.js +230 -0
- package/node_modules/@js-joda/core/src/chrono/ChronoLocalDateTime.js +130 -0
- package/node_modules/@js-joda/core/src/chrono/ChronoZonedDateTime.js +194 -0
- package/node_modules/@js-joda/core/src/chrono/IsoChronology.js +235 -0
- package/node_modules/@js-joda/core/src/convert.js +83 -0
- package/node_modules/@js-joda/core/src/errors.js +54 -0
- package/node_modules/@js-joda/core/src/format/DateTimeBuilder.js +535 -0
- package/node_modules/@js-joda/core/src/format/DateTimeFormatter.js +728 -0
- package/node_modules/@js-joda/core/src/format/DateTimeFormatterBuilder.js +1545 -0
- package/node_modules/@js-joda/core/src/format/DateTimeParseContext.js +297 -0
- package/node_modules/@js-joda/core/src/format/DateTimePrintContext.js +138 -0
- package/node_modules/@js-joda/core/src/format/DecimalStyle.js +113 -0
- package/node_modules/@js-joda/core/src/format/EnumMap.js +70 -0
- package/node_modules/@js-joda/core/src/format/ParsePosition.js +31 -0
- package/node_modules/@js-joda/core/src/format/ResolverStyle.js +93 -0
- package/node_modules/@js-joda/core/src/format/SignStyle.js +38 -0
- package/node_modules/@js-joda/core/src/format/StringBuilder.js +47 -0
- package/node_modules/@js-joda/core/src/format/TextStyle.js +114 -0
- package/node_modules/@js-joda/core/src/format/parser/CharLiteralPrinterParser.js +46 -0
- package/node_modules/@js-joda/core/src/format/parser/CompositePrinterParser.js +89 -0
- package/node_modules/@js-joda/core/src/format/parser/FractionPrinterParser.js +162 -0
- package/node_modules/@js-joda/core/src/format/parser/NumberPrinterParser.js +367 -0
- package/node_modules/@js-joda/core/src/format/parser/OffsetIdPrinterParser.js +177 -0
- package/node_modules/@js-joda/core/src/format/parser/PadPrinterParserDecorator.js +81 -0
- package/node_modules/@js-joda/core/src/format/parser/SettingsParser.js +44 -0
- package/node_modules/@js-joda/core/src/format/parser/StringLiteralPrinterParser.js +39 -0
- package/node_modules/@js-joda/core/src/format/parser/ZoneIdPrinterParser.js +218 -0
- package/node_modules/@js-joda/core/src/js-joda.js +210 -0
- package/node_modules/@js-joda/core/src/license-preamble.js +3 -0
- package/node_modules/@js-joda/core/src/temporal/ChronoField.js +470 -0
- package/node_modules/@js-joda/core/src/temporal/ChronoUnit.js +310 -0
- package/node_modules/@js-joda/core/src/temporal/DefaultInterfaceTemporal.js +118 -0
- package/node_modules/@js-joda/core/src/temporal/IsoFields.js +859 -0
- package/node_modules/@js-joda/core/src/temporal/NativeJsTemporal.js +105 -0
- package/node_modules/@js-joda/core/src/temporal/Temporal.js +346 -0
- package/node_modules/@js-joda/core/src/temporal/TemporalAccessor.js +125 -0
- package/node_modules/@js-joda/core/src/temporal/TemporalAdjuster.js +92 -0
- package/node_modules/@js-joda/core/src/temporal/TemporalAdjusters.js +464 -0
- package/node_modules/@js-joda/core/src/temporal/TemporalAmount.js +166 -0
- package/node_modules/@js-joda/core/src/temporal/TemporalField.js +248 -0
- package/node_modules/@js-joda/core/src/temporal/TemporalQueries.js +223 -0
- package/node_modules/@js-joda/core/src/temporal/TemporalQueriesFactory.js +77 -0
- package/node_modules/@js-joda/core/src/temporal/TemporalQuery.js +107 -0
- package/node_modules/@js-joda/core/src/temporal/TemporalUnit.js +179 -0
- package/node_modules/@js-joda/core/src/temporal/ValueRange.js +257 -0
- package/node_modules/@js-joda/core/src/use.js +20 -0
- package/node_modules/@js-joda/core/src/zone/SystemDefaultZoneId.js +31 -0
- package/node_modules/@js-joda/core/src/zone/SystemDefaultZoneRules.js +162 -0
- package/node_modules/@js-joda/core/src/zone/ZoneOffsetTransition.js +289 -0
- package/node_modules/@js-joda/core/src/zone/ZoneRules.js +464 -0
- package/node_modules/@js-joda/core/src/zone/ZoneRulesProvider.js +36 -0
- package/node_modules/@noble/hashes/LICENSE +21 -0
- package/node_modules/@noble/hashes/README.md +563 -0
- package/node_modules/@noble/hashes/_blake.d.ts +21 -0
- package/node_modules/@noble/hashes/_blake.d.ts.map +1 -0
- package/node_modules/@noble/hashes/_blake.js +52 -0
- package/node_modules/@noble/hashes/_blake.js.map +1 -0
- package/node_modules/@noble/hashes/_md.d.ts +99 -0
- package/node_modules/@noble/hashes/_md.d.ts.map +1 -0
- package/node_modules/@noble/hashes/_md.js +202 -0
- package/node_modules/@noble/hashes/_md.js.map +1 -0
- package/node_modules/@noble/hashes/_u64.d.ts +63 -0
- package/node_modules/@noble/hashes/_u64.d.ts.map +1 -0
- package/node_modules/@noble/hashes/_u64.js +84 -0
- package/node_modules/@noble/hashes/_u64.js.map +1 -0
- package/node_modules/@noble/hashes/argon2.d.ts +112 -0
- package/node_modules/@noble/hashes/argon2.d.ts.map +1 -0
- package/node_modules/@noble/hashes/argon2.js +517 -0
- package/node_modules/@noble/hashes/argon2.js.map +1 -0
- package/node_modules/@noble/hashes/blake1.d.ts +156 -0
- package/node_modules/@noble/hashes/blake1.d.ts.map +1 -0
- package/node_modules/@noble/hashes/blake1.js +560 -0
- package/node_modules/@noble/hashes/blake1.js.map +1 -0
- package/node_modules/@noble/hashes/blake2.d.ts +184 -0
- package/node_modules/@noble/hashes/blake2.d.ts.map +1 -0
- package/node_modules/@noble/hashes/blake2.js +501 -0
- package/node_modules/@noble/hashes/blake2.js.map +1 -0
- package/node_modules/@noble/hashes/blake3.d.ts +68 -0
- package/node_modules/@noble/hashes/blake3.d.ts.map +1 -0
- package/node_modules/@noble/hashes/blake3.js +284 -0
- package/node_modules/@noble/hashes/blake3.js.map +1 -0
- package/node_modules/@noble/hashes/eskdf.d.ts +92 -0
- package/node_modules/@noble/hashes/eskdf.d.ts.map +1 -0
- package/node_modules/@noble/hashes/eskdf.js +218 -0
- package/node_modules/@noble/hashes/eskdf.js.map +1 -0
- package/node_modules/@noble/hashes/hkdf.d.ts +64 -0
- package/node_modules/@noble/hashes/hkdf.d.ts.map +1 -0
- package/node_modules/@noble/hashes/hkdf.js +120 -0
- package/node_modules/@noble/hashes/hkdf.js.map +1 -0
- package/node_modules/@noble/hashes/hmac.d.ts +47 -0
- package/node_modules/@noble/hashes/hmac.d.ts.map +1 -0
- package/node_modules/@noble/hashes/hmac.js +93 -0
- package/node_modules/@noble/hashes/hmac.js.map +1 -0
- package/node_modules/@noble/hashes/index.d.ts +2 -0
- package/node_modules/@noble/hashes/index.d.ts.map +1 -0
- package/node_modules/@noble/hashes/index.js +35 -0
- package/node_modules/@noble/hashes/index.js.map +1 -0
- package/node_modules/@noble/hashes/legacy.d.ts +102 -0
- package/node_modules/@noble/hashes/legacy.d.ts.map +1 -0
- package/node_modules/@noble/hashes/legacy.js +327 -0
- package/node_modules/@noble/hashes/legacy.js.map +1 -0
- package/node_modules/@noble/hashes/package.json +97 -0
- package/node_modules/@noble/hashes/pbkdf2.d.ts +56 -0
- package/node_modules/@noble/hashes/pbkdf2.d.ts.map +1 -0
- package/node_modules/@noble/hashes/pbkdf2.js +135 -0
- package/node_modules/@noble/hashes/pbkdf2.js.map +1 -0
- package/node_modules/@noble/hashes/scrypt.d.ts +65 -0
- package/node_modules/@noble/hashes/scrypt.d.ts.map +1 -0
- package/node_modules/@noble/hashes/scrypt.js +257 -0
- package/node_modules/@noble/hashes/scrypt.js.map +1 -0
- package/node_modules/@noble/hashes/sha2.d.ts +249 -0
- package/node_modules/@noble/hashes/sha2.d.ts.map +1 -0
- package/node_modules/@noble/hashes/sha2.js +458 -0
- package/node_modules/@noble/hashes/sha2.js.map +1 -0
- package/node_modules/@noble/hashes/sha3-addons.d.ts +461 -0
- package/node_modules/@noble/hashes/sha3-addons.d.ts.map +1 -0
- package/node_modules/@noble/hashes/sha3-addons.js +783 -0
- package/node_modules/@noble/hashes/sha3-addons.js.map +1 -0
- package/node_modules/@noble/hashes/sha3.d.ts +199 -0
- package/node_modules/@noble/hashes/sha3.d.ts.map +1 -0
- package/node_modules/@noble/hashes/sha3.js +431 -0
- package/node_modules/@noble/hashes/sha3.js.map +1 -0
- package/node_modules/@noble/hashes/src/_blake.ts +57 -0
- package/node_modules/@noble/hashes/src/_md.ts +222 -0
- package/node_modules/@noble/hashes/src/_u64.ts +117 -0
- package/node_modules/@noble/hashes/src/argon2.ts +667 -0
- package/node_modules/@noble/hashes/src/blake1.ts +614 -0
- package/node_modules/@noble/hashes/src/blake2.ts +582 -0
- package/node_modules/@noble/hashes/src/blake3.ts +317 -0
- package/node_modules/@noble/hashes/src/eskdf.ts +259 -0
- package/node_modules/@noble/hashes/src/hkdf.ts +133 -0
- package/node_modules/@noble/hashes/src/hmac.ts +126 -0
- package/node_modules/@noble/hashes/src/index.ts +33 -0
- package/node_modules/@noble/hashes/src/legacy.ts +339 -0
- package/node_modules/@noble/hashes/src/pbkdf2.ts +175 -0
- package/node_modules/@noble/hashes/src/scrypt.ts +315 -0
- package/node_modules/@noble/hashes/src/sha2.ts +530 -0
- package/node_modules/@noble/hashes/src/sha3-addons.ts +983 -0
- package/node_modules/@noble/hashes/src/sha3.ts +485 -0
- package/node_modules/@noble/hashes/src/utils.ts +848 -0
- package/node_modules/@noble/hashes/src/webcrypto.ts +239 -0
- package/node_modules/@noble/hashes/utils.d.ts +519 -0
- package/node_modules/@noble/hashes/utils.d.ts.map +1 -0
- package/node_modules/@noble/hashes/utils.js +578 -0
- package/node_modules/@noble/hashes/utils.js.map +1 -0
- package/node_modules/@noble/hashes/webcrypto.d.ts +120 -0
- package/node_modules/@noble/hashes/webcrypto.d.ts.map +1 -0
- package/node_modules/@noble/hashes/webcrypto.js +165 -0
- package/node_modules/@noble/hashes/webcrypto.js.map +1 -0
- package/node_modules/ws/LICENSE +20 -0
- package/node_modules/ws/README.md +548 -0
- package/node_modules/ws/browser.js +8 -0
- package/node_modules/ws/index.js +22 -0
- package/node_modules/ws/lib/buffer-util.js +131 -0
- package/node_modules/ws/lib/constants.js +19 -0
- package/node_modules/ws/lib/event-target.js +292 -0
- package/node_modules/ws/lib/extension.js +203 -0
- package/node_modules/ws/lib/limiter.js +55 -0
- package/node_modules/ws/lib/permessage-deflate.js +530 -0
- package/node_modules/ws/lib/receiver.js +743 -0
- package/node_modules/ws/lib/sender.js +607 -0
- package/node_modules/ws/lib/stream.js +161 -0
- package/node_modules/ws/lib/subprotocol.js +62 -0
- package/node_modules/ws/lib/validation.js +152 -0
- package/node_modules/ws/lib/websocket-server.js +562 -0
- package/node_modules/ws/lib/websocket.js +1407 -0
- package/node_modules/ws/package.json +74 -0
- package/node_modules/ws/wrapper.mjs +21 -0
- package/package.json +53 -0
|
@@ -0,0 +1,175 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* PBKDF (RFC 2898). Can be used to create a key from password and salt.
|
|
3
|
+
* @module
|
|
4
|
+
*/
|
|
5
|
+
import { hmac } from './hmac.ts';
|
|
6
|
+
// prettier-ignore
|
|
7
|
+
import {
|
|
8
|
+
ahash, anumber,
|
|
9
|
+
asyncLoop, checkOpts, clean, createView, kdfInputToBytes,
|
|
10
|
+
type CHash,
|
|
11
|
+
type Hash,
|
|
12
|
+
type KDFInput,
|
|
13
|
+
type TArg,
|
|
14
|
+
type TRet
|
|
15
|
+
} from './utils.ts';
|
|
16
|
+
|
|
17
|
+
/**
|
|
18
|
+
* PBKDF2 options:
|
|
19
|
+
* * c: iterations, should probably be higher than 100_000
|
|
20
|
+
* * dkLen: desired length of derived key in bytes, must be `>= 1` per RFC 8018 §5.2
|
|
21
|
+
* * asyncTick: max time in ms for which async function can block execution
|
|
22
|
+
*/
|
|
23
|
+
export type Pbkdf2Opt = {
|
|
24
|
+
/** Iteration count. Higher values increase CPU cost. */
|
|
25
|
+
c: number;
|
|
26
|
+
/** Desired derived key length in bytes, must be `>= 1` per RFC 8018 §5.2. */
|
|
27
|
+
dkLen?: number;
|
|
28
|
+
/** Max scheduler block time in milliseconds for the async variant. */
|
|
29
|
+
asyncTick?: number;
|
|
30
|
+
};
|
|
31
|
+
// Common start and end for sync/async functions
|
|
32
|
+
function pbkdf2Init(
|
|
33
|
+
hash: TArg<CHash>,
|
|
34
|
+
_password: TArg<KDFInput>,
|
|
35
|
+
_salt: TArg<KDFInput>,
|
|
36
|
+
_opts: TArg<Pbkdf2Opt>
|
|
37
|
+
) {
|
|
38
|
+
ahash(hash);
|
|
39
|
+
const opts = checkOpts({ dkLen: 32, asyncTick: 10 }, _opts);
|
|
40
|
+
const { c, dkLen, asyncTick } = opts;
|
|
41
|
+
anumber(c, 'c');
|
|
42
|
+
anumber(dkLen, 'dkLen');
|
|
43
|
+
anumber(asyncTick, 'asyncTick');
|
|
44
|
+
if (c < 1) throw new Error('iterations (c) must be >= 1');
|
|
45
|
+
// RFC 8018 §5.2 defines `dkLen` as "a positive integer".
|
|
46
|
+
if (dkLen < 1) throw new Error('"dkLen" must be >= 1');
|
|
47
|
+
// RFC 8018 §5.2 step 1 requires rejecting oversize `dkLen`
|
|
48
|
+
// before allocating the destination buffer.
|
|
49
|
+
if (dkLen > (2 ** 32 - 1) * hash.outputLen) throw new Error('derived key too long');
|
|
50
|
+
const password = kdfInputToBytes(_password, 'password');
|
|
51
|
+
const salt = kdfInputToBytes(_salt, 'salt');
|
|
52
|
+
// DK = PBKDF2(PRF, Password, Salt, c, dkLen);
|
|
53
|
+
const DK = new Uint8Array(dkLen);
|
|
54
|
+
// U1 = PRF(Password, Salt + INT_32_BE(i))
|
|
55
|
+
const PRF = hmac.create(hash, password);
|
|
56
|
+
// Cache PRF(P, S || ...) prefix state so each block only appends INT_32_BE(i).
|
|
57
|
+
const PRFSalt = PRF._cloneInto().update(salt);
|
|
58
|
+
return { c, dkLen, asyncTick, DK, PRF, PRFSalt };
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
function pbkdf2Output<T extends Hash<T>>(
|
|
62
|
+
PRF: TArg<Hash<T>>,
|
|
63
|
+
PRFSalt: TArg<Hash<T>>,
|
|
64
|
+
DK: TArg<Uint8Array>,
|
|
65
|
+
prfW: TArg<Hash<T> | undefined>,
|
|
66
|
+
u: TArg<Uint8Array>
|
|
67
|
+
): TRet<Uint8Array> {
|
|
68
|
+
// Shared sync/async cleanup point: wipe transient PRF state
|
|
69
|
+
// while preserving the derived key buffer.
|
|
70
|
+
PRF.destroy();
|
|
71
|
+
PRFSalt.destroy();
|
|
72
|
+
if (prfW) prfW.destroy();
|
|
73
|
+
clean(u);
|
|
74
|
+
return DK as TRet<Uint8Array>;
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
/**
|
|
78
|
+
* PBKDF2-HMAC: RFC 8018 key derivation function.
|
|
79
|
+
* @param hash - hash function that would be used e.g. sha256
|
|
80
|
+
* @param password - password from which a derived key is generated;
|
|
81
|
+
* JS string inputs are UTF-8 encoded first
|
|
82
|
+
* @param salt - cryptographic salt; JS string inputs are UTF-8 encoded first
|
|
83
|
+
* @param opts - PBKDF2 work factor and output settings. `dkLen`, if provided,
|
|
84
|
+
* must be `>= 1` per RFC 8018 §5.2. See {@link Pbkdf2Opt}.
|
|
85
|
+
* @returns Derived key bytes.
|
|
86
|
+
* @throws If the PBKDF2 iteration count or derived-key settings are invalid. {@link Error}
|
|
87
|
+
* @example
|
|
88
|
+
* PBKDF2-HMAC: RFC 2898 key derivation function.
|
|
89
|
+
* ```ts
|
|
90
|
+
* import { pbkdf2 } from '@noble/hashes/pbkdf2.js';
|
|
91
|
+
* import { sha256 } from '@noble/hashes/sha2.js';
|
|
92
|
+
* const key = pbkdf2(sha256, 'password', 'salt', { dkLen: 32, c: Math.pow(2, 18) });
|
|
93
|
+
* ```
|
|
94
|
+
*/
|
|
95
|
+
export function pbkdf2(
|
|
96
|
+
hash: TArg<CHash>,
|
|
97
|
+
password: TArg<KDFInput>,
|
|
98
|
+
salt: TArg<KDFInput>,
|
|
99
|
+
opts: TArg<Pbkdf2Opt>
|
|
100
|
+
): TRet<Uint8Array> {
|
|
101
|
+
const { c, dkLen, DK, PRF, PRFSalt } = pbkdf2Init(hash, password, salt, opts);
|
|
102
|
+
let prfW: any; // Working copy
|
|
103
|
+
const arr = new Uint8Array(4);
|
|
104
|
+
const view = createView(arr);
|
|
105
|
+
const u = new Uint8Array(PRF.outputLen);
|
|
106
|
+
// DK = T1 + T2 + ⋯ + Tdklen/hlen
|
|
107
|
+
for (let ti = 1, pos = 0; pos < dkLen; ti++, pos += PRF.outputLen) {
|
|
108
|
+
// Ti = F(Password, Salt, c, i)
|
|
109
|
+
// The last Ti view can be shorter than hLen, which applies
|
|
110
|
+
// RFC 8018 §5.2 step 4's T_l<0..r-1> truncation without extra copies.
|
|
111
|
+
const Ti = DK.subarray(pos, pos + PRF.outputLen);
|
|
112
|
+
view.setInt32(0, ti, false);
|
|
113
|
+
// F(Password, Salt, c, i) = U1 ^ U2 ^ ⋯ ^ Uc
|
|
114
|
+
// U1 = PRF(Password, Salt + INT_32_BE(i))
|
|
115
|
+
(prfW = PRFSalt._cloneInto(prfW)).update(arr).digestInto(u);
|
|
116
|
+
Ti.set(u.subarray(0, Ti.length));
|
|
117
|
+
for (let ui = 1; ui < c; ui++) {
|
|
118
|
+
// Uc = PRF(Password, Uc−1)
|
|
119
|
+
PRF._cloneInto(prfW).update(u).digestInto(u);
|
|
120
|
+
for (let i = 0; i < Ti.length; i++) Ti[i] ^= u[i];
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
return pbkdf2Output(PRF, PRFSalt, DK, prfW, u);
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
/**
|
|
127
|
+
* PBKDF2-HMAC: RFC 8018 key derivation function. Async version.
|
|
128
|
+
* @param hash - hash function that would be used e.g. sha256
|
|
129
|
+
* @param password - password from which a derived key is generated;
|
|
130
|
+
* JS string inputs are UTF-8 encoded first
|
|
131
|
+
* @param salt - cryptographic salt; JS string inputs are UTF-8 encoded first
|
|
132
|
+
* @param opts - PBKDF2 work factor and output settings. `dkLen`, if provided,
|
|
133
|
+
* must be `>= 1` per RFC 8018 §5.2. `asyncTick` is only a local
|
|
134
|
+
* scheduler-yield knob for this JS wrapper, not part of RFC 8018.
|
|
135
|
+
* See {@link Pbkdf2Opt}.
|
|
136
|
+
* @returns Promise resolving to derived key bytes.
|
|
137
|
+
* @throws If the PBKDF2 iteration count or derived-key settings are invalid. {@link Error}
|
|
138
|
+
* @example
|
|
139
|
+
* PBKDF2-HMAC: RFC 2898 key derivation function.
|
|
140
|
+
* ```ts
|
|
141
|
+
* import { pbkdf2Async } from '@noble/hashes/pbkdf2.js';
|
|
142
|
+
* import { sha256 } from '@noble/hashes/sha2.js';
|
|
143
|
+
* const key = await pbkdf2Async(sha256, 'password', 'salt', { dkLen: 32, c: 500_000 });
|
|
144
|
+
* ```
|
|
145
|
+
*/
|
|
146
|
+
export async function pbkdf2Async(
|
|
147
|
+
hash: TArg<CHash>,
|
|
148
|
+
password: TArg<KDFInput>,
|
|
149
|
+
salt: TArg<KDFInput>,
|
|
150
|
+
opts: TArg<Pbkdf2Opt>
|
|
151
|
+
): Promise<TRet<Uint8Array>> {
|
|
152
|
+
const { c, dkLen, asyncTick, DK, PRF, PRFSalt } = pbkdf2Init(hash, password, salt, opts);
|
|
153
|
+
let prfW: any; // Working copy
|
|
154
|
+
const arr = new Uint8Array(4);
|
|
155
|
+
const view = createView(arr);
|
|
156
|
+
const u = new Uint8Array(PRF.outputLen);
|
|
157
|
+
// DK = T1 + T2 + ⋯ + Tdklen/hlen
|
|
158
|
+
for (let ti = 1, pos = 0; pos < dkLen; ti++, pos += PRF.outputLen) {
|
|
159
|
+
// Ti = F(Password, Salt, c, i)
|
|
160
|
+
// The last Ti view can be shorter than hLen, which applies
|
|
161
|
+
// RFC 8018 §5.2 step 4's T_l<0..r-1> truncation without extra copies.
|
|
162
|
+
const Ti = DK.subarray(pos, pos + PRF.outputLen);
|
|
163
|
+
view.setInt32(0, ti, false);
|
|
164
|
+
// F(Password, Salt, c, i) = U1 ^ U2 ^ ⋯ ^ Uc
|
|
165
|
+
// U1 = PRF(Password, Salt + INT_32_BE(i))
|
|
166
|
+
(prfW = PRFSalt._cloneInto(prfW)).update(arr).digestInto(u);
|
|
167
|
+
Ti.set(u.subarray(0, Ti.length));
|
|
168
|
+
await asyncLoop(c - 1, asyncTick, () => {
|
|
169
|
+
// Uc = PRF(Password, Uc−1)
|
|
170
|
+
PRF._cloneInto(prfW).update(u).digestInto(u);
|
|
171
|
+
for (let i = 0; i < Ti.length; i++) Ti[i] ^= u[i];
|
|
172
|
+
});
|
|
173
|
+
}
|
|
174
|
+
return pbkdf2Output(PRF, PRFSalt, DK, prfW, u);
|
|
175
|
+
}
|
|
@@ -0,0 +1,315 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* RFC 7914 Scrypt KDF. Can be used to create a key from password and salt.
|
|
3
|
+
* @module
|
|
4
|
+
*/
|
|
5
|
+
import { pbkdf2 } from './pbkdf2.ts';
|
|
6
|
+
import { sha256 } from './sha2.ts';
|
|
7
|
+
// prettier-ignore
|
|
8
|
+
import {
|
|
9
|
+
anumber, asyncLoop,
|
|
10
|
+
checkOpts, clean,
|
|
11
|
+
rotl,
|
|
12
|
+
swap32IfBE,
|
|
13
|
+
u32,
|
|
14
|
+
type KDFInput,
|
|
15
|
+
type TArg,
|
|
16
|
+
type TRet
|
|
17
|
+
} from './utils.ts';
|
|
18
|
+
|
|
19
|
+
// The main Scrypt loop: uses Salsa extensively.
|
|
20
|
+
// Six versions of the function were tried, this is the fastest one.
|
|
21
|
+
// RFC 7914 §3 / §4 step 2 applies Salsa20/8 to one 16-word (64-byte) block
|
|
22
|
+
// after xor'ing two such blocks.
|
|
23
|
+
// The local `y*` snapshot keeps the xor input stable even when `out` aliases `prev` or `input`.
|
|
24
|
+
// prettier-ignore
|
|
25
|
+
function XorAndSalsa(
|
|
26
|
+
prev: TArg<Uint32Array>,
|
|
27
|
+
pi: number,
|
|
28
|
+
input: TArg<Uint32Array>,
|
|
29
|
+
ii: number,
|
|
30
|
+
out: TArg<Uint32Array>,
|
|
31
|
+
oi: number
|
|
32
|
+
) {
|
|
33
|
+
// Based on https://cr.yp.to/salsa20.html and RFC 7914's Salsa20/8 core.
|
|
34
|
+
// Xor blocks
|
|
35
|
+
let y00 = prev[pi++] ^ input[ii++], y01 = prev[pi++] ^ input[ii++];
|
|
36
|
+
let y02 = prev[pi++] ^ input[ii++], y03 = prev[pi++] ^ input[ii++];
|
|
37
|
+
let y04 = prev[pi++] ^ input[ii++], y05 = prev[pi++] ^ input[ii++];
|
|
38
|
+
let y06 = prev[pi++] ^ input[ii++], y07 = prev[pi++] ^ input[ii++];
|
|
39
|
+
let y08 = prev[pi++] ^ input[ii++], y09 = prev[pi++] ^ input[ii++];
|
|
40
|
+
let y10 = prev[pi++] ^ input[ii++], y11 = prev[pi++] ^ input[ii++];
|
|
41
|
+
let y12 = prev[pi++] ^ input[ii++], y13 = prev[pi++] ^ input[ii++];
|
|
42
|
+
let y14 = prev[pi++] ^ input[ii++], y15 = prev[pi++] ^ input[ii++];
|
|
43
|
+
// Save state to temporary variables (salsa)
|
|
44
|
+
let x00 = y00, x01 = y01, x02 = y02, x03 = y03,
|
|
45
|
+
x04 = y04, x05 = y05, x06 = y06, x07 = y07,
|
|
46
|
+
x08 = y08, x09 = y09, x10 = y10, x11 = y11,
|
|
47
|
+
x12 = y12, x13 = y13, x14 = y14, x15 = y15;
|
|
48
|
+
// Main loop (salsa)
|
|
49
|
+
for (let i = 0; i < 8; i += 2) {
|
|
50
|
+
x04 ^= rotl(x00 + x12 | 0, 7); x08 ^= rotl(x04 + x00 | 0, 9);
|
|
51
|
+
x12 ^= rotl(x08 + x04 | 0, 13); x00 ^= rotl(x12 + x08 | 0, 18);
|
|
52
|
+
x09 ^= rotl(x05 + x01 | 0, 7); x13 ^= rotl(x09 + x05 | 0, 9);
|
|
53
|
+
x01 ^= rotl(x13 + x09 | 0, 13); x05 ^= rotl(x01 + x13 | 0, 18);
|
|
54
|
+
x14 ^= rotl(x10 + x06 | 0, 7); x02 ^= rotl(x14 + x10 | 0, 9);
|
|
55
|
+
x06 ^= rotl(x02 + x14 | 0, 13); x10 ^= rotl(x06 + x02 | 0, 18);
|
|
56
|
+
x03 ^= rotl(x15 + x11 | 0, 7); x07 ^= rotl(x03 + x15 | 0, 9);
|
|
57
|
+
x11 ^= rotl(x07 + x03 | 0, 13); x15 ^= rotl(x11 + x07 | 0, 18);
|
|
58
|
+
x01 ^= rotl(x00 + x03 | 0, 7); x02 ^= rotl(x01 + x00 | 0, 9);
|
|
59
|
+
x03 ^= rotl(x02 + x01 | 0, 13); x00 ^= rotl(x03 + x02 | 0, 18);
|
|
60
|
+
x06 ^= rotl(x05 + x04 | 0, 7); x07 ^= rotl(x06 + x05 | 0, 9);
|
|
61
|
+
x04 ^= rotl(x07 + x06 | 0, 13); x05 ^= rotl(x04 + x07 | 0, 18);
|
|
62
|
+
x11 ^= rotl(x10 + x09 | 0, 7); x08 ^= rotl(x11 + x10 | 0, 9);
|
|
63
|
+
x09 ^= rotl(x08 + x11 | 0, 13); x10 ^= rotl(x09 + x08 | 0, 18);
|
|
64
|
+
x12 ^= rotl(x15 + x14 | 0, 7); x13 ^= rotl(x12 + x15 | 0, 9);
|
|
65
|
+
x14 ^= rotl(x13 + x12 | 0, 13); x15 ^= rotl(x14 + x13 | 0, 18);
|
|
66
|
+
}
|
|
67
|
+
// Write output (salsa)
|
|
68
|
+
out[oi++] = (y00 + x00) | 0; out[oi++] = (y01 + x01) | 0;
|
|
69
|
+
out[oi++] = (y02 + x02) | 0; out[oi++] = (y03 + x03) | 0;
|
|
70
|
+
out[oi++] = (y04 + x04) | 0; out[oi++] = (y05 + x05) | 0;
|
|
71
|
+
out[oi++] = (y06 + x06) | 0; out[oi++] = (y07 + x07) | 0;
|
|
72
|
+
out[oi++] = (y08 + x08) | 0; out[oi++] = (y09 + x09) | 0;
|
|
73
|
+
out[oi++] = (y10 + x10) | 0; out[oi++] = (y11 + x11) | 0;
|
|
74
|
+
out[oi++] = (y12 + x12) | 0; out[oi++] = (y13 + x13) | 0;
|
|
75
|
+
out[oi++] = (y14 + x14) | 0; out[oi++] = (y15 + x15) | 0;
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
function BlockMix(
|
|
79
|
+
input: TArg<Uint32Array>,
|
|
80
|
+
ii: number,
|
|
81
|
+
out: TArg<Uint32Array>,
|
|
82
|
+
oi: number,
|
|
83
|
+
r: number
|
|
84
|
+
) {
|
|
85
|
+
// The block B is `r` 128-byte chunks, i.e. `2r` 16-word (64-byte) Salsa blocks.
|
|
86
|
+
let head = oi + 0;
|
|
87
|
+
let tail = oi + 16 * r;
|
|
88
|
+
for (let i = 0; i < 16; i++) out[tail + i] = input[ii + (2 * r - 1) * 16 + i]; // X ← B[2r−1]
|
|
89
|
+
for (let i = 0; i < r; i++, head += 16, ii += 16) {
|
|
90
|
+
// RFC 7914 §4 step 3 outputs `Y[0], Y[2], ...` first, then `Y[1], Y[3], ...`;
|
|
91
|
+
// `head` and `tail` lay out those even/odd halves in place.
|
|
92
|
+
XorAndSalsa(out, tail, input, ii, out, head); // head[i] = Salsa(blockIn[2*i] ^ tail[i-1])
|
|
93
|
+
if (i > 0) tail += 16; // First iteration overwrites tmp value in tail
|
|
94
|
+
// tail[i] = Salsa(blockIn[2*i+1] ^ head[i])
|
|
95
|
+
XorAndSalsa(out, head, input, (ii += 16), out, tail);
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
/**
|
|
100
|
+
* Scrypt options:
|
|
101
|
+
* - `N` is cpu/mem work factor (power of 2 e.g. `2**18`)
|
|
102
|
+
* - `r` is block size (8 is common), fine-tunes sequential memory read size and performance
|
|
103
|
+
* - `p` is parallelization factor (1 is common)
|
|
104
|
+
* - `dkLen` is output key length in bytes e.g. 32, and must be `>= 1` per RFC 7914 §2.
|
|
105
|
+
* - `asyncTick` - (default: 10) max time in ms for which async function can block execution
|
|
106
|
+
* - `maxmem` - (default: `1024 ** 3 + 1024` aka 1GB+1KB). A limit that the app could use for scrypt
|
|
107
|
+
* - `onProgress` - callback function that would be executed for progress report
|
|
108
|
+
*/
|
|
109
|
+
export type ScryptOpts = {
|
|
110
|
+
/** CPU and memory work factor. Must be a power of two. */
|
|
111
|
+
N: number;
|
|
112
|
+
/** Block size parameter. */
|
|
113
|
+
r: number;
|
|
114
|
+
/** Parallelization factor. */
|
|
115
|
+
p: number;
|
|
116
|
+
/** Desired derived key length in bytes, must be `>= 1` per RFC 7914 §2. */
|
|
117
|
+
dkLen?: number;
|
|
118
|
+
/** Max scheduler block time in milliseconds for the async variant. */
|
|
119
|
+
asyncTick?: number;
|
|
120
|
+
/** Maximum temporary memory budget in bytes. */
|
|
121
|
+
maxmem?: number;
|
|
122
|
+
/**
|
|
123
|
+
* Optional progress callback invoked during long-running derivations.
|
|
124
|
+
* param progress - completion fraction in the `0..1` range
|
|
125
|
+
*/
|
|
126
|
+
onProgress?: (progress: number) => void;
|
|
127
|
+
};
|
|
128
|
+
|
|
129
|
+
// Common prologue and epilogue for sync/async functions
|
|
130
|
+
function scryptInit(password: TArg<KDFInput>, salt: TArg<KDFInput>, _opts?: TArg<ScryptOpts>) {
|
|
131
|
+
// Maxmem - 1GB+1KB by default
|
|
132
|
+
const opts = checkOpts(
|
|
133
|
+
{
|
|
134
|
+
dkLen: 32,
|
|
135
|
+
asyncTick: 10,
|
|
136
|
+
maxmem: 1024 ** 3 + 1024,
|
|
137
|
+
},
|
|
138
|
+
_opts
|
|
139
|
+
);
|
|
140
|
+
const { N, r, p, dkLen, asyncTick, maxmem, onProgress } = opts;
|
|
141
|
+
anumber(N, 'N');
|
|
142
|
+
anumber(r, 'r');
|
|
143
|
+
anumber(p, 'p');
|
|
144
|
+
anumber(dkLen, 'dkLen');
|
|
145
|
+
anumber(asyncTick, 'asyncTick');
|
|
146
|
+
anumber(maxmem, 'maxmem');
|
|
147
|
+
if (onProgress !== undefined && typeof onProgress !== 'function')
|
|
148
|
+
throw new Error('progressCb must be a function');
|
|
149
|
+
const blockSize = 128 * r;
|
|
150
|
+
const blockSize32 = blockSize / 4;
|
|
151
|
+
|
|
152
|
+
// Max N is 2^32 (Integrify is 32-bit).
|
|
153
|
+
// Real limit can be 2^22: some JS engines limit Uint8Array to 4GB.
|
|
154
|
+
// Spec check `N >= 2^(blockSize / 8)` is not done for compat with popular libs,
|
|
155
|
+
// which used incorrect r: 1, p: 8. Also, the check seems to be a spec error:
|
|
156
|
+
// https://www.rfc-editor.org/errata_search.php?rfc=7914
|
|
157
|
+
const pow32 = Math.pow(2, 32);
|
|
158
|
+
if (N <= 1 || (N & (N - 1)) !== 0 || N > pow32)
|
|
159
|
+
throw new Error('"N" expected a power of 2, and 2^1 <= N <= 2^32');
|
|
160
|
+
if (p < 1 || p > ((pow32 - 1) * 32) / blockSize)
|
|
161
|
+
throw new Error('"p" expected integer 1..((2^32 - 1) * 32) / (128 * r)');
|
|
162
|
+
// RFC 7914 §2 defines `dkLen` as a positive integer.
|
|
163
|
+
if (dkLen < 1 || dkLen > (pow32 - 1) * 32)
|
|
164
|
+
throw new Error('"dkLen" expected integer 1..(2^32 - 1) * 32');
|
|
165
|
+
// Include the shared `tmp` scratch block so `maxmem` matches noble's actual temporary allocation.
|
|
166
|
+
// Node requires more headroom here, so this accounting is intentionally noble-specific.
|
|
167
|
+
const memUsed = blockSize * (N + p + 1);
|
|
168
|
+
if (memUsed > maxmem)
|
|
169
|
+
throw new Error(
|
|
170
|
+
'"maxmem" limit was hit: memUsed(128*r*(N+p+1))=' + memUsed + ', maxmem=' + maxmem
|
|
171
|
+
);
|
|
172
|
+
// [B0...Bp−1] ← PBKDF2HMAC-SHA256(Passphrase, Salt, 1, blockSize*ParallelizationFactor)
|
|
173
|
+
// Since it has only one iteration there is no reason to use async variant
|
|
174
|
+
const B = pbkdf2(sha256, password, salt, { c: 1, dkLen: blockSize * p });
|
|
175
|
+
const B32 = u32(B);
|
|
176
|
+
// Re-used between parallel iterations. Array(iterations) of B
|
|
177
|
+
const V = u32(new Uint8Array(blockSize * N));
|
|
178
|
+
const tmp = u32(new Uint8Array(blockSize));
|
|
179
|
+
let blockMixCb = () => {};
|
|
180
|
+
if (onProgress) {
|
|
181
|
+
const totalBlockMix = 2 * N * p;
|
|
182
|
+
// Invoke callback if progress changes from 10.01 to 10.02
|
|
183
|
+
// Allows to draw smooth progress bar on up to 8K screen
|
|
184
|
+
const callbackPer = Math.max(Math.floor(totalBlockMix / 10000), 1);
|
|
185
|
+
let blockMixCnt = 0;
|
|
186
|
+
blockMixCb = () => {
|
|
187
|
+
blockMixCnt++;
|
|
188
|
+
if (onProgress && (!(blockMixCnt % callbackPer) || blockMixCnt === totalBlockMix))
|
|
189
|
+
onProgress(blockMixCnt / totalBlockMix);
|
|
190
|
+
};
|
|
191
|
+
}
|
|
192
|
+
return { N, r, p, dkLen, blockSize32, V, B32, B, tmp, blockMixCb, asyncTick };
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
function scryptOutput(
|
|
196
|
+
password: TArg<KDFInput>,
|
|
197
|
+
dkLen: number,
|
|
198
|
+
B: TArg<Uint8Array>,
|
|
199
|
+
V: TArg<Uint32Array>,
|
|
200
|
+
tmp: TArg<Uint32Array>
|
|
201
|
+
): TRet<Uint8Array> {
|
|
202
|
+
// Shared final PBKDF2-and-cleanup step: keep the derived key, wipe the scrypt workspace.
|
|
203
|
+
const res = pbkdf2(sha256, password, B, { c: 1, dkLen });
|
|
204
|
+
clean(B, V, tmp);
|
|
205
|
+
return res;
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
/**
|
|
209
|
+
* Scrypt KDF from RFC 7914. See {@link ScryptOpts}.
|
|
210
|
+
* @param password - password or key material to derive from;
|
|
211
|
+
* JS string inputs are UTF-8 encoded first
|
|
212
|
+
* @param salt - unique salt bytes or string; JS string inputs are UTF-8 encoded first
|
|
213
|
+
* @param opts - Scrypt cost and memory parameters. `dkLen`, if provided,
|
|
214
|
+
* must be `>= 1` per RFC 7914 §2. See {@link ScryptOpts}.
|
|
215
|
+
* @returns Derived key bytes.
|
|
216
|
+
* @throws If the Scrypt cost, memory, or callback options are invalid. {@link Error}
|
|
217
|
+
* @example
|
|
218
|
+
* Derive a key with scrypt.
|
|
219
|
+
* ```ts
|
|
220
|
+
* scrypt('password', 'salt', { N: 2**18, r: 8, p: 1, dkLen: 32 });
|
|
221
|
+
* ```
|
|
222
|
+
*/
|
|
223
|
+
export function scrypt(
|
|
224
|
+
password: TArg<KDFInput>,
|
|
225
|
+
salt: TArg<KDFInput>,
|
|
226
|
+
opts: TArg<ScryptOpts>
|
|
227
|
+
): TRet<Uint8Array> {
|
|
228
|
+
const { N, r, p, dkLen, blockSize32, V, B32, B, tmp, blockMixCb } = scryptInit(
|
|
229
|
+
password,
|
|
230
|
+
salt,
|
|
231
|
+
opts
|
|
232
|
+
);
|
|
233
|
+
swap32IfBE(B32);
|
|
234
|
+
for (let pi = 0; pi < p; pi++) {
|
|
235
|
+
const Pi = blockSize32 * pi;
|
|
236
|
+
for (let i = 0; i < blockSize32; i++) V[i] = B32[Pi + i]; // V[0] = B[i]
|
|
237
|
+
for (let i = 0, pos = 0; i < N - 1; i++) {
|
|
238
|
+
BlockMix(V, pos, V, (pos += blockSize32), r); // V[i] = BlockMix(V[i-1]);
|
|
239
|
+
blockMixCb();
|
|
240
|
+
}
|
|
241
|
+
BlockMix(V, (N - 1) * blockSize32, B32, Pi, r); // Process last element
|
|
242
|
+
blockMixCb();
|
|
243
|
+
for (let i = 0; i < N; i++) {
|
|
244
|
+
// First u32 of the last 64-byte block (u32 is LE)
|
|
245
|
+
// RFC 7914 Integerify(X) uses the whole last 64-byte block, but mod N
|
|
246
|
+
// only depends on the low word here because N is a power of two and
|
|
247
|
+
// this implementation caps N at 2^32.
|
|
248
|
+
// & (N - 1) is % N as N is a power of 2, N & (N - 1) = 0 is checked
|
|
249
|
+
// above; >>> 0 for unsigned, input fits in u32.
|
|
250
|
+
const j = (B32[Pi + blockSize32 - 16] & (N - 1)) >>> 0; // j = Integrify(X) % iterations
|
|
251
|
+
// tmp = B ^ V[j]
|
|
252
|
+
for (let k = 0; k < blockSize32; k++) tmp[k] = B32[Pi + k] ^ V[j * blockSize32 + k];
|
|
253
|
+
BlockMix(tmp, 0, B32, Pi, r); // B = BlockMix(B ^ V[j])
|
|
254
|
+
blockMixCb();
|
|
255
|
+
}
|
|
256
|
+
}
|
|
257
|
+
swap32IfBE(B32);
|
|
258
|
+
return scryptOutput(password, dkLen, B, V, tmp);
|
|
259
|
+
}
|
|
260
|
+
|
|
261
|
+
/**
|
|
262
|
+
* Scrypt KDF from RFC 7914. Async version. See {@link ScryptOpts}.
|
|
263
|
+
* @param password - password or key material to derive from;
|
|
264
|
+
* JS string inputs are UTF-8 encoded first
|
|
265
|
+
* @param salt - unique salt bytes or string; JS string inputs are UTF-8 encoded first
|
|
266
|
+
* @param opts - Scrypt cost and memory parameters. `dkLen`, if provided,
|
|
267
|
+
* must be `>= 1` per RFC 7914 §2. `asyncTick` is only a local
|
|
268
|
+
* scheduler-yield control for this JS wrapper, not part of RFC 7914.
|
|
269
|
+
* See {@link ScryptOpts}.
|
|
270
|
+
* @returns Promise resolving to derived key bytes.
|
|
271
|
+
* @throws If the Scrypt cost, memory, or callback options are invalid. {@link Error}
|
|
272
|
+
* @example
|
|
273
|
+
* Derive a key with scrypt asynchronously.
|
|
274
|
+
* ```ts
|
|
275
|
+
* await scryptAsync('password', 'salt', { N: 2**18, r: 8, p: 1, dkLen: 32 });
|
|
276
|
+
* ```
|
|
277
|
+
*/
|
|
278
|
+
export async function scryptAsync(
|
|
279
|
+
password: TArg<KDFInput>,
|
|
280
|
+
salt: TArg<KDFInput>,
|
|
281
|
+
opts: TArg<ScryptOpts>
|
|
282
|
+
): Promise<TRet<Uint8Array>> {
|
|
283
|
+
const { N, r, p, dkLen, blockSize32, V, B32, B, tmp, blockMixCb, asyncTick } = scryptInit(
|
|
284
|
+
password,
|
|
285
|
+
salt,
|
|
286
|
+
opts
|
|
287
|
+
);
|
|
288
|
+
swap32IfBE(B32);
|
|
289
|
+
for (let pi = 0; pi < p; pi++) {
|
|
290
|
+
const Pi = blockSize32 * pi;
|
|
291
|
+
for (let i = 0; i < blockSize32; i++) V[i] = B32[Pi + i]; // V[0] = B[i]
|
|
292
|
+
let pos = 0;
|
|
293
|
+
await asyncLoop(N - 1, asyncTick, () => {
|
|
294
|
+
BlockMix(V, pos, V, (pos += blockSize32), r); // V[i] = BlockMix(V[i-1]);
|
|
295
|
+
blockMixCb();
|
|
296
|
+
});
|
|
297
|
+
BlockMix(V, (N - 1) * blockSize32, B32, Pi, r); // Process last element
|
|
298
|
+
blockMixCb();
|
|
299
|
+
await asyncLoop(N, asyncTick, () => {
|
|
300
|
+
// First u32 of the last 64-byte block (u32 is LE)
|
|
301
|
+
// RFC 7914 Integerify(X) uses the whole last 64-byte block, but mod N
|
|
302
|
+
// only depends on the low word here because N is a power of two and
|
|
303
|
+
// this implementation caps N at 2^32.
|
|
304
|
+
// & (N - 1) is % N as N is a power of 2, N & (N - 1) = 0 is checked
|
|
305
|
+
// above; >>> 0 for unsigned, input fits in u32.
|
|
306
|
+
const j = (B32[Pi + blockSize32 - 16] & (N - 1)) >>> 0; // j = Integrify(X) % iterations
|
|
307
|
+
// tmp = B ^ V[j]
|
|
308
|
+
for (let k = 0; k < blockSize32; k++) tmp[k] = B32[Pi + k] ^ V[j * blockSize32 + k];
|
|
309
|
+
BlockMix(tmp, 0, B32, Pi, r); // B = BlockMix(B ^ V[j])
|
|
310
|
+
blockMixCb();
|
|
311
|
+
});
|
|
312
|
+
}
|
|
313
|
+
swap32IfBE(B32);
|
|
314
|
+
return scryptOutput(password, dkLen, B, V, tmp);
|
|
315
|
+
}
|