@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.
Files changed (400) hide show
  1. package/LICENSE +28 -0
  2. package/README.md +707 -0
  3. package/dist/application/app.d.ts +138 -0
  4. package/dist/application/app.js +654 -0
  5. package/dist/application/operations.d.ts +9 -0
  6. package/dist/application/operations.js +96 -0
  7. package/dist/cli/cli.d.ts +1 -0
  8. package/dist/cli/cli.js +460 -0
  9. package/dist/cli/help.d.ts +4 -0
  10. package/dist/cli/help.js +49 -0
  11. package/dist/cli/main.d.ts +2 -0
  12. package/dist/cli/main.js +13 -0
  13. package/dist/cli/onboarding.d.ts +14 -0
  14. package/dist/cli/onboarding.js +144 -0
  15. package/dist/cli/output.d.ts +2 -0
  16. package/dist/cli/output.js +231 -0
  17. package/dist/cli/terminal.d.ts +6 -0
  18. package/dist/cli/terminal.js +92 -0
  19. package/dist/cli/update-check.d.ts +1 -0
  20. package/dist/cli/update-check.js +12 -0
  21. package/dist/cli/updates.d.ts +2 -0
  22. package/dist/cli/updates.js +98 -0
  23. package/dist/core.d.ts +14 -0
  24. package/dist/core.js +14 -0
  25. package/dist/doctor/credential-probe.d.ts +7 -0
  26. package/dist/doctor/credential-probe.js +49 -0
  27. package/dist/doctor/doctor.d.ts +4 -0
  28. package/dist/doctor/doctor.js +213 -0
  29. package/dist/doctor/keyring.d.ts +7 -0
  30. package/dist/doctor/keyring.js +150 -0
  31. package/dist/doctor/profile.d.ts +19 -0
  32. package/dist/doctor/profile.js +73 -0
  33. package/dist/doctor/types.d.ts +40 -0
  34. package/dist/doctor/types.js +1 -0
  35. package/dist/domain/amount.d.ts +6 -0
  36. package/dist/domain/amount.js +27 -0
  37. package/dist/domain/errors.d.ts +10 -0
  38. package/dist/domain/errors.js +16 -0
  39. package/dist/labels/directory.d.ts +87 -0
  40. package/dist/labels/directory.js +140 -0
  41. package/dist/labels/personal.d.ts +17 -0
  42. package/dist/labels/personal.js +56 -0
  43. package/dist/labels/presentation.d.ts +154 -0
  44. package/dist/labels/presentation.js +90 -0
  45. package/dist/network/reader.d.ts +31 -0
  46. package/dist/network/reader.js +370 -0
  47. package/dist/network/retry.d.ts +7 -0
  48. package/dist/network/retry.js +53 -0
  49. package/dist/network/work.d.ts +3 -0
  50. package/dist/network/work.js +66 -0
  51. package/dist/pricing/market.d.ts +29 -0
  52. package/dist/pricing/market.js +150 -0
  53. package/dist/pricing/terms.d.ts +6 -0
  54. package/dist/pricing/terms.js +12 -0
  55. package/dist/spending/destination.d.ts +16 -0
  56. package/dist/spending/destination.js +42 -0
  57. package/dist/spending/journal.d.ts +28 -0
  58. package/dist/spending/journal.js +69 -0
  59. package/dist/spending/ledger.d.ts +118 -0
  60. package/dist/spending/ledger.js +444 -0
  61. package/dist/spending/payments.d.ts +67 -0
  62. package/dist/spending/payments.js +424 -0
  63. package/dist/spending/pool.d.ts +13 -0
  64. package/dist/spending/pool.js +38 -0
  65. package/dist/spending/reconcile.d.ts +18 -0
  66. package/dist/spending/reconcile.js +64 -0
  67. package/dist/storage/profiles.d.ts +13 -0
  68. package/dist/storage/profiles.js +86 -0
  69. package/dist/storage/secrets.d.ts +16 -0
  70. package/dist/storage/secrets.js +104 -0
  71. package/dist/storage/state.d.ts +32 -0
  72. package/dist/storage/state.js +255 -0
  73. package/dist/wallet/auto-receive.d.ts +57 -0
  74. package/dist/wallet/auto-receive.js +140 -0
  75. package/dist/wallet/defaults.d.ts +3 -0
  76. package/dist/wallet/defaults.js +26 -0
  77. package/dist/wallet/signing.d.ts +17 -0
  78. package/dist/wallet/signing.js +128 -0
  79. package/dist/wallet/types.d.ts +65 -0
  80. package/dist/wallet/types.js +1 -0
  81. package/dist/wallet/work.d.ts +29 -0
  82. package/dist/wallet/work.js +154 -0
  83. package/dist/watches/manager.d.ts +75 -0
  84. package/dist/watches/manager.js +197 -0
  85. package/node_modules/@attocash/commons-core/Kotlin-DateTime-library-kotlinx-datetime.mjs +6678 -0
  86. package/node_modules/@attocash/commons-core/Kotlin-DateTime-library-kotlinx-datetime.mjs.map +1 -0
  87. package/node_modules/@attocash/commons-core/LICENSE +28 -0
  88. package/node_modules/@attocash/commons-core/README.md +118 -0
  89. package/node_modules/@attocash/commons-core/commons-commons-core.d.mts +1036 -0
  90. package/node_modules/@attocash/commons-core/commons-commons-core.mjs +7701 -0
  91. package/node_modules/@attocash/commons-core/commons-commons-core.mjs.map +1 -0
  92. package/node_modules/@attocash/commons-core/kotlin-kotlin-stdlib.mjs +17681 -0
  93. package/node_modules/@attocash/commons-core/kotlin-kotlin-stdlib.mjs.map +1 -0
  94. package/node_modules/@attocash/commons-core/kotlin_org_jetbrains_kotlin_kotlin_dom_api_compat.mjs +4 -0
  95. package/node_modules/@attocash/commons-core/kotlin_org_jetbrains_kotlin_kotlin_dom_api_compat.mjs.map +1 -0
  96. package/node_modules/@attocash/commons-core/kotlinx-io-kotlinx-io-bytestring.mjs +209 -0
  97. package/node_modules/@attocash/commons-core/kotlinx-io-kotlinx-io-bytestring.mjs.map +1 -0
  98. package/node_modules/@attocash/commons-core/kotlinx-io-kotlinx-io-core.mjs +2284 -0
  99. package/node_modules/@attocash/commons-core/kotlinx-io-kotlinx-io-core.mjs.map +1 -0
  100. package/node_modules/@attocash/commons-core/kotlinx-serialization-kotlinx-serialization-core.mjs +6042 -0
  101. package/node_modules/@attocash/commons-core/kotlinx-serialization-kotlinx-serialization-core.mjs.map +1 -0
  102. package/node_modules/@attocash/commons-core/kotlinx-serialization-kotlinx-serialization-json.mjs +5294 -0
  103. package/node_modules/@attocash/commons-core/kotlinx-serialization-kotlinx-serialization-json.mjs.map +1 -0
  104. package/node_modules/@attocash/commons-core/package.json +27 -0
  105. package/node_modules/@attocash/commons-node/LICENSE +28 -0
  106. package/node_modules/@attocash/commons-node/README.md +92 -0
  107. package/node_modules/@attocash/commons-node/commons-commons-node.d.mts +255 -0
  108. package/node_modules/@attocash/commons-node/commons-commons-node.mjs +2977 -0
  109. package/node_modules/@attocash/commons-node/commons-commons-node.mjs.map +1 -0
  110. package/node_modules/@attocash/commons-node/kotlin-logging.mjs +432 -0
  111. package/node_modules/@attocash/commons-node/kotlin-logging.mjs.map +1 -0
  112. package/node_modules/@attocash/commons-node/kotlinx-serialization-kotlinx-serialization-json.mjs +5294 -0
  113. package/node_modules/@attocash/commons-node/kotlinx-serialization-kotlinx-serialization-json.mjs.map +1 -0
  114. package/node_modules/@attocash/commons-node/package.json +29 -0
  115. package/node_modules/@attocash/commons-node-remote/LICENSE +28 -0
  116. package/node_modules/@attocash/commons-node-remote/README.md +61 -0
  117. package/node_modules/@attocash/commons-node-remote/commons-commons-node-remote.d.mts +122 -0
  118. package/node_modules/@attocash/commons-node-remote/commons-commons-node-remote.mjs +1810 -0
  119. package/node_modules/@attocash/commons-node-remote/commons-commons-node-remote.mjs.map +1 -0
  120. package/node_modules/@attocash/commons-node-remote/kotlin-logging.mjs +432 -0
  121. package/node_modules/@attocash/commons-node-remote/kotlin-logging.mjs.map +1 -0
  122. package/node_modules/@attocash/commons-node-remote/kotlinx-browser.mjs +8 -0
  123. package/node_modules/@attocash/commons-node-remote/kotlinx-browser.mjs.map +1 -0
  124. package/node_modules/@attocash/commons-node-remote/kotlinx-serialization-kotlinx-serialization-json-io.mjs +4 -0
  125. package/node_modules/@attocash/commons-node-remote/kotlinx-serialization-kotlinx-serialization-json-io.mjs.map +1 -0
  126. package/node_modules/@attocash/commons-node-remote/kotlinx-serialization-kotlinx-serialization-json.mjs +5294 -0
  127. package/node_modules/@attocash/commons-node-remote/kotlinx-serialization-kotlinx-serialization-json.mjs.map +1 -0
  128. package/node_modules/@attocash/commons-node-remote/package.json +31 -0
  129. package/node_modules/@attocash/commons-transport/LICENSE +28 -0
  130. package/node_modules/@attocash/commons-transport/README.md +5 -0
  131. package/node_modules/@attocash/commons-transport/commons-commons-transport.d.mts +64 -0
  132. package/node_modules/@attocash/commons-transport/commons-commons-transport.mjs +249 -0
  133. package/node_modules/@attocash/commons-transport/commons-commons-transport.mjs.map +1 -0
  134. package/node_modules/@attocash/commons-transport/kotlinx-atomicfu.mjs +263 -0
  135. package/node_modules/@attocash/commons-transport/kotlinx-atomicfu.mjs.map +1 -0
  136. package/node_modules/@attocash/commons-transport/kotlinx-browser.mjs +8 -0
  137. package/node_modules/@attocash/commons-transport/kotlinx-browser.mjs.map +1 -0
  138. package/node_modules/@attocash/commons-transport/kotlinx-coroutines-core.mjs +11604 -0
  139. package/node_modules/@attocash/commons-transport/kotlinx-coroutines-core.mjs.map +1 -0
  140. package/node_modules/@attocash/commons-transport/kotlinx-serialization-kotlinx-serialization-json-io.mjs +4 -0
  141. package/node_modules/@attocash/commons-transport/kotlinx-serialization-kotlinx-serialization-json-io.mjs.map +1 -0
  142. package/node_modules/@attocash/commons-transport/kotlinx-serialization-kotlinx-serialization-json.mjs +5294 -0
  143. package/node_modules/@attocash/commons-transport/kotlinx-serialization-kotlinx-serialization-json.mjs.map +1 -0
  144. package/node_modules/@attocash/commons-transport/ktor-ktor-client-content-negotiation.mjs +499 -0
  145. package/node_modules/@attocash/commons-transport/ktor-ktor-client-content-negotiation.mjs.map +1 -0
  146. package/node_modules/@attocash/commons-transport/ktor-ktor-client-core.mjs +6456 -0
  147. package/node_modules/@attocash/commons-transport/ktor-ktor-client-core.mjs.map +1 -0
  148. package/node_modules/@attocash/commons-transport/ktor-ktor-events.mjs +83 -0
  149. package/node_modules/@attocash/commons-transport/ktor-ktor-events.mjs.map +1 -0
  150. package/node_modules/@attocash/commons-transport/ktor-ktor-http-cio.mjs +1714 -0
  151. package/node_modules/@attocash/commons-transport/ktor-ktor-http-cio.mjs.map +1 -0
  152. package/node_modules/@attocash/commons-transport/ktor-ktor-http.mjs +3197 -0
  153. package/node_modules/@attocash/commons-transport/ktor-ktor-http.mjs.map +1 -0
  154. package/node_modules/@attocash/commons-transport/ktor-ktor-io.mjs +2290 -0
  155. package/node_modules/@attocash/commons-transport/ktor-ktor-io.mjs.map +1 -0
  156. package/node_modules/@attocash/commons-transport/ktor-ktor-serialization-kotlinx-json.mjs +46 -0
  157. package/node_modules/@attocash/commons-transport/ktor-ktor-serialization-kotlinx-json.mjs.map +1 -0
  158. package/node_modules/@attocash/commons-transport/ktor-ktor-serialization-kotlinx.mjs +482 -0
  159. package/node_modules/@attocash/commons-transport/ktor-ktor-serialization-kotlinx.mjs.map +1 -0
  160. package/node_modules/@attocash/commons-transport/ktor-ktor-serialization.mjs +165 -0
  161. package/node_modules/@attocash/commons-transport/ktor-ktor-serialization.mjs.map +1 -0
  162. package/node_modules/@attocash/commons-transport/ktor-ktor-sse.mjs +4 -0
  163. package/node_modules/@attocash/commons-transport/ktor-ktor-sse.mjs.map +1 -0
  164. package/node_modules/@attocash/commons-transport/ktor-ktor-utils.mjs +3222 -0
  165. package/node_modules/@attocash/commons-transport/ktor-ktor-utils.mjs.map +1 -0
  166. package/node_modules/@attocash/commons-transport/ktor-ktor-websocket-serialization.mjs +4 -0
  167. package/node_modules/@attocash/commons-transport/ktor-ktor-websocket-serialization.mjs.map +1 -0
  168. package/node_modules/@attocash/commons-transport/ktor-ktor-websockets.mjs +1485 -0
  169. package/node_modules/@attocash/commons-transport/ktor-ktor-websockets.mjs.map +1 -0
  170. package/node_modules/@attocash/commons-transport/package.json +29 -0
  171. package/node_modules/@attocash/commons-worker/LICENSE +28 -0
  172. package/node_modules/@attocash/commons-worker/README.md +48 -0
  173. package/node_modules/@attocash/commons-worker/commons-commons-worker.d.mts +73 -0
  174. package/node_modules/@attocash/commons-worker/commons-commons-worker.mjs +702 -0
  175. package/node_modules/@attocash/commons-worker/commons-commons-worker.mjs.map +1 -0
  176. package/node_modules/@attocash/commons-worker/kotlin-logging.mjs +432 -0
  177. package/node_modules/@attocash/commons-worker/kotlin-logging.mjs.map +1 -0
  178. package/node_modules/@attocash/commons-worker/kotlinx-serialization-kotlinx-serialization-json.mjs +5294 -0
  179. package/node_modules/@attocash/commons-worker/kotlinx-serialization-kotlinx-serialization-json.mjs.map +1 -0
  180. package/node_modules/@attocash/commons-worker/package.json +29 -0
  181. package/node_modules/@attocash/commons-worker-remote/LICENSE +28 -0
  182. package/node_modules/@attocash/commons-worker-remote/README.md +60 -0
  183. package/node_modules/@attocash/commons-worker-remote/commons-commons-worker-remote.d.mts +93 -0
  184. package/node_modules/@attocash/commons-worker-remote/commons-commons-worker-remote.mjs +289 -0
  185. package/node_modules/@attocash/commons-worker-remote/commons-commons-worker-remote.mjs.map +1 -0
  186. package/node_modules/@attocash/commons-worker-remote/kotlin-logging.mjs +432 -0
  187. package/node_modules/@attocash/commons-worker-remote/kotlin-logging.mjs.map +1 -0
  188. package/node_modules/@attocash/commons-worker-remote/kotlinx-browser.mjs +8 -0
  189. package/node_modules/@attocash/commons-worker-remote/kotlinx-browser.mjs.map +1 -0
  190. package/node_modules/@attocash/commons-worker-remote/kotlinx-serialization-kotlinx-serialization-json-io.mjs +4 -0
  191. package/node_modules/@attocash/commons-worker-remote/kotlinx-serialization-kotlinx-serialization-json-io.mjs.map +1 -0
  192. package/node_modules/@attocash/commons-worker-remote/kotlinx-serialization-kotlinx-serialization-json.mjs +5294 -0
  193. package/node_modules/@attocash/commons-worker-remote/kotlinx-serialization-kotlinx-serialization-json.mjs.map +1 -0
  194. package/node_modules/@attocash/commons-worker-remote/package.json +31 -0
  195. package/node_modules/@js-joda/core/CHANGELOG.md +363 -0
  196. package/node_modules/@js-joda/core/CheatSheet.md +947 -0
  197. package/node_modules/@js-joda/core/LICENSE +34 -0
  198. package/node_modules/@js-joda/core/README.md +155 -0
  199. package/node_modules/@js-joda/core/bower.json +21 -0
  200. package/node_modules/@js-joda/core/dist/js-joda.d.ts +2452 -0
  201. package/node_modules/@js-joda/core/dist/js-joda.esm.js +13564 -0
  202. package/node_modules/@js-joda/core/dist/js-joda.flow.js +949 -0
  203. package/node_modules/@js-joda/core/dist/js-joda.js +13630 -0
  204. package/node_modules/@js-joda/core/dist/js-joda.js.map +1 -0
  205. package/node_modules/@js-joda/core/dist/js-joda.min.js +5 -0
  206. package/node_modules/@js-joda/core/package.json +76 -0
  207. package/node_modules/@js-joda/core/src/Clock.js +330 -0
  208. package/node_modules/@js-joda/core/src/DayOfWeek.js +451 -0
  209. package/node_modules/@js-joda/core/src/Duration.js +1205 -0
  210. package/node_modules/@js-joda/core/src/Enum.js +30 -0
  211. package/node_modules/@js-joda/core/src/Instant.js +1012 -0
  212. package/node_modules/@js-joda/core/src/LocalDate.js +1703 -0
  213. package/node_modules/@js-joda/core/src/LocalDateTime.js +1686 -0
  214. package/node_modules/@js-joda/core/src/LocalTime.js +1415 -0
  215. package/node_modules/@js-joda/core/src/MathUtil.js +236 -0
  216. package/node_modules/@js-joda/core/src/Month.js +600 -0
  217. package/node_modules/@js-joda/core/src/MonthDay.js +730 -0
  218. package/node_modules/@js-joda/core/src/OffsetDateTime.js +757 -0
  219. package/node_modules/@js-joda/core/src/OffsetTime.js +621 -0
  220. package/node_modules/@js-joda/core/src/Period.js +933 -0
  221. package/node_modules/@js-joda/core/src/StringUtil.js +43 -0
  222. package/node_modules/@js-joda/core/src/Year.js +1015 -0
  223. package/node_modules/@js-joda/core/src/YearConstants.js +21 -0
  224. package/node_modules/@js-joda/core/src/YearMonth.js +1096 -0
  225. package/node_modules/@js-joda/core/src/ZoneId.js +236 -0
  226. package/node_modules/@js-joda/core/src/ZoneIdFactory.js +201 -0
  227. package/node_modules/@js-joda/core/src/ZoneOffset.js +486 -0
  228. package/node_modules/@js-joda/core/src/ZoneRegion.js +72 -0
  229. package/node_modules/@js-joda/core/src/ZonedDateTime.js +2007 -0
  230. package/node_modules/@js-joda/core/src/_init.js +68 -0
  231. package/node_modules/@js-joda/core/src/assert.js +33 -0
  232. package/node_modules/@js-joda/core/src/chrono/ChronoLocalDate.js +230 -0
  233. package/node_modules/@js-joda/core/src/chrono/ChronoLocalDateTime.js +130 -0
  234. package/node_modules/@js-joda/core/src/chrono/ChronoZonedDateTime.js +194 -0
  235. package/node_modules/@js-joda/core/src/chrono/IsoChronology.js +235 -0
  236. package/node_modules/@js-joda/core/src/convert.js +83 -0
  237. package/node_modules/@js-joda/core/src/errors.js +54 -0
  238. package/node_modules/@js-joda/core/src/format/DateTimeBuilder.js +535 -0
  239. package/node_modules/@js-joda/core/src/format/DateTimeFormatter.js +728 -0
  240. package/node_modules/@js-joda/core/src/format/DateTimeFormatterBuilder.js +1545 -0
  241. package/node_modules/@js-joda/core/src/format/DateTimeParseContext.js +297 -0
  242. package/node_modules/@js-joda/core/src/format/DateTimePrintContext.js +138 -0
  243. package/node_modules/@js-joda/core/src/format/DecimalStyle.js +113 -0
  244. package/node_modules/@js-joda/core/src/format/EnumMap.js +70 -0
  245. package/node_modules/@js-joda/core/src/format/ParsePosition.js +31 -0
  246. package/node_modules/@js-joda/core/src/format/ResolverStyle.js +93 -0
  247. package/node_modules/@js-joda/core/src/format/SignStyle.js +38 -0
  248. package/node_modules/@js-joda/core/src/format/StringBuilder.js +47 -0
  249. package/node_modules/@js-joda/core/src/format/TextStyle.js +114 -0
  250. package/node_modules/@js-joda/core/src/format/parser/CharLiteralPrinterParser.js +46 -0
  251. package/node_modules/@js-joda/core/src/format/parser/CompositePrinterParser.js +89 -0
  252. package/node_modules/@js-joda/core/src/format/parser/FractionPrinterParser.js +162 -0
  253. package/node_modules/@js-joda/core/src/format/parser/NumberPrinterParser.js +367 -0
  254. package/node_modules/@js-joda/core/src/format/parser/OffsetIdPrinterParser.js +177 -0
  255. package/node_modules/@js-joda/core/src/format/parser/PadPrinterParserDecorator.js +81 -0
  256. package/node_modules/@js-joda/core/src/format/parser/SettingsParser.js +44 -0
  257. package/node_modules/@js-joda/core/src/format/parser/StringLiteralPrinterParser.js +39 -0
  258. package/node_modules/@js-joda/core/src/format/parser/ZoneIdPrinterParser.js +218 -0
  259. package/node_modules/@js-joda/core/src/js-joda.js +210 -0
  260. package/node_modules/@js-joda/core/src/license-preamble.js +3 -0
  261. package/node_modules/@js-joda/core/src/temporal/ChronoField.js +470 -0
  262. package/node_modules/@js-joda/core/src/temporal/ChronoUnit.js +310 -0
  263. package/node_modules/@js-joda/core/src/temporal/DefaultInterfaceTemporal.js +118 -0
  264. package/node_modules/@js-joda/core/src/temporal/IsoFields.js +859 -0
  265. package/node_modules/@js-joda/core/src/temporal/NativeJsTemporal.js +105 -0
  266. package/node_modules/@js-joda/core/src/temporal/Temporal.js +346 -0
  267. package/node_modules/@js-joda/core/src/temporal/TemporalAccessor.js +125 -0
  268. package/node_modules/@js-joda/core/src/temporal/TemporalAdjuster.js +92 -0
  269. package/node_modules/@js-joda/core/src/temporal/TemporalAdjusters.js +464 -0
  270. package/node_modules/@js-joda/core/src/temporal/TemporalAmount.js +166 -0
  271. package/node_modules/@js-joda/core/src/temporal/TemporalField.js +248 -0
  272. package/node_modules/@js-joda/core/src/temporal/TemporalQueries.js +223 -0
  273. package/node_modules/@js-joda/core/src/temporal/TemporalQueriesFactory.js +77 -0
  274. package/node_modules/@js-joda/core/src/temporal/TemporalQuery.js +107 -0
  275. package/node_modules/@js-joda/core/src/temporal/TemporalUnit.js +179 -0
  276. package/node_modules/@js-joda/core/src/temporal/ValueRange.js +257 -0
  277. package/node_modules/@js-joda/core/src/use.js +20 -0
  278. package/node_modules/@js-joda/core/src/zone/SystemDefaultZoneId.js +31 -0
  279. package/node_modules/@js-joda/core/src/zone/SystemDefaultZoneRules.js +162 -0
  280. package/node_modules/@js-joda/core/src/zone/ZoneOffsetTransition.js +289 -0
  281. package/node_modules/@js-joda/core/src/zone/ZoneRules.js +464 -0
  282. package/node_modules/@js-joda/core/src/zone/ZoneRulesProvider.js +36 -0
  283. package/node_modules/@noble/hashes/LICENSE +21 -0
  284. package/node_modules/@noble/hashes/README.md +563 -0
  285. package/node_modules/@noble/hashes/_blake.d.ts +21 -0
  286. package/node_modules/@noble/hashes/_blake.d.ts.map +1 -0
  287. package/node_modules/@noble/hashes/_blake.js +52 -0
  288. package/node_modules/@noble/hashes/_blake.js.map +1 -0
  289. package/node_modules/@noble/hashes/_md.d.ts +99 -0
  290. package/node_modules/@noble/hashes/_md.d.ts.map +1 -0
  291. package/node_modules/@noble/hashes/_md.js +202 -0
  292. package/node_modules/@noble/hashes/_md.js.map +1 -0
  293. package/node_modules/@noble/hashes/_u64.d.ts +63 -0
  294. package/node_modules/@noble/hashes/_u64.d.ts.map +1 -0
  295. package/node_modules/@noble/hashes/_u64.js +84 -0
  296. package/node_modules/@noble/hashes/_u64.js.map +1 -0
  297. package/node_modules/@noble/hashes/argon2.d.ts +112 -0
  298. package/node_modules/@noble/hashes/argon2.d.ts.map +1 -0
  299. package/node_modules/@noble/hashes/argon2.js +517 -0
  300. package/node_modules/@noble/hashes/argon2.js.map +1 -0
  301. package/node_modules/@noble/hashes/blake1.d.ts +156 -0
  302. package/node_modules/@noble/hashes/blake1.d.ts.map +1 -0
  303. package/node_modules/@noble/hashes/blake1.js +560 -0
  304. package/node_modules/@noble/hashes/blake1.js.map +1 -0
  305. package/node_modules/@noble/hashes/blake2.d.ts +184 -0
  306. package/node_modules/@noble/hashes/blake2.d.ts.map +1 -0
  307. package/node_modules/@noble/hashes/blake2.js +501 -0
  308. package/node_modules/@noble/hashes/blake2.js.map +1 -0
  309. package/node_modules/@noble/hashes/blake3.d.ts +68 -0
  310. package/node_modules/@noble/hashes/blake3.d.ts.map +1 -0
  311. package/node_modules/@noble/hashes/blake3.js +284 -0
  312. package/node_modules/@noble/hashes/blake3.js.map +1 -0
  313. package/node_modules/@noble/hashes/eskdf.d.ts +92 -0
  314. package/node_modules/@noble/hashes/eskdf.d.ts.map +1 -0
  315. package/node_modules/@noble/hashes/eskdf.js +218 -0
  316. package/node_modules/@noble/hashes/eskdf.js.map +1 -0
  317. package/node_modules/@noble/hashes/hkdf.d.ts +64 -0
  318. package/node_modules/@noble/hashes/hkdf.d.ts.map +1 -0
  319. package/node_modules/@noble/hashes/hkdf.js +120 -0
  320. package/node_modules/@noble/hashes/hkdf.js.map +1 -0
  321. package/node_modules/@noble/hashes/hmac.d.ts +47 -0
  322. package/node_modules/@noble/hashes/hmac.d.ts.map +1 -0
  323. package/node_modules/@noble/hashes/hmac.js +93 -0
  324. package/node_modules/@noble/hashes/hmac.js.map +1 -0
  325. package/node_modules/@noble/hashes/index.d.ts +2 -0
  326. package/node_modules/@noble/hashes/index.d.ts.map +1 -0
  327. package/node_modules/@noble/hashes/index.js +35 -0
  328. package/node_modules/@noble/hashes/index.js.map +1 -0
  329. package/node_modules/@noble/hashes/legacy.d.ts +102 -0
  330. package/node_modules/@noble/hashes/legacy.d.ts.map +1 -0
  331. package/node_modules/@noble/hashes/legacy.js +327 -0
  332. package/node_modules/@noble/hashes/legacy.js.map +1 -0
  333. package/node_modules/@noble/hashes/package.json +97 -0
  334. package/node_modules/@noble/hashes/pbkdf2.d.ts +56 -0
  335. package/node_modules/@noble/hashes/pbkdf2.d.ts.map +1 -0
  336. package/node_modules/@noble/hashes/pbkdf2.js +135 -0
  337. package/node_modules/@noble/hashes/pbkdf2.js.map +1 -0
  338. package/node_modules/@noble/hashes/scrypt.d.ts +65 -0
  339. package/node_modules/@noble/hashes/scrypt.d.ts.map +1 -0
  340. package/node_modules/@noble/hashes/scrypt.js +257 -0
  341. package/node_modules/@noble/hashes/scrypt.js.map +1 -0
  342. package/node_modules/@noble/hashes/sha2.d.ts +249 -0
  343. package/node_modules/@noble/hashes/sha2.d.ts.map +1 -0
  344. package/node_modules/@noble/hashes/sha2.js +458 -0
  345. package/node_modules/@noble/hashes/sha2.js.map +1 -0
  346. package/node_modules/@noble/hashes/sha3-addons.d.ts +461 -0
  347. package/node_modules/@noble/hashes/sha3-addons.d.ts.map +1 -0
  348. package/node_modules/@noble/hashes/sha3-addons.js +783 -0
  349. package/node_modules/@noble/hashes/sha3-addons.js.map +1 -0
  350. package/node_modules/@noble/hashes/sha3.d.ts +199 -0
  351. package/node_modules/@noble/hashes/sha3.d.ts.map +1 -0
  352. package/node_modules/@noble/hashes/sha3.js +431 -0
  353. package/node_modules/@noble/hashes/sha3.js.map +1 -0
  354. package/node_modules/@noble/hashes/src/_blake.ts +57 -0
  355. package/node_modules/@noble/hashes/src/_md.ts +222 -0
  356. package/node_modules/@noble/hashes/src/_u64.ts +117 -0
  357. package/node_modules/@noble/hashes/src/argon2.ts +667 -0
  358. package/node_modules/@noble/hashes/src/blake1.ts +614 -0
  359. package/node_modules/@noble/hashes/src/blake2.ts +582 -0
  360. package/node_modules/@noble/hashes/src/blake3.ts +317 -0
  361. package/node_modules/@noble/hashes/src/eskdf.ts +259 -0
  362. package/node_modules/@noble/hashes/src/hkdf.ts +133 -0
  363. package/node_modules/@noble/hashes/src/hmac.ts +126 -0
  364. package/node_modules/@noble/hashes/src/index.ts +33 -0
  365. package/node_modules/@noble/hashes/src/legacy.ts +339 -0
  366. package/node_modules/@noble/hashes/src/pbkdf2.ts +175 -0
  367. package/node_modules/@noble/hashes/src/scrypt.ts +315 -0
  368. package/node_modules/@noble/hashes/src/sha2.ts +530 -0
  369. package/node_modules/@noble/hashes/src/sha3-addons.ts +983 -0
  370. package/node_modules/@noble/hashes/src/sha3.ts +485 -0
  371. package/node_modules/@noble/hashes/src/utils.ts +848 -0
  372. package/node_modules/@noble/hashes/src/webcrypto.ts +239 -0
  373. package/node_modules/@noble/hashes/utils.d.ts +519 -0
  374. package/node_modules/@noble/hashes/utils.d.ts.map +1 -0
  375. package/node_modules/@noble/hashes/utils.js +578 -0
  376. package/node_modules/@noble/hashes/utils.js.map +1 -0
  377. package/node_modules/@noble/hashes/webcrypto.d.ts +120 -0
  378. package/node_modules/@noble/hashes/webcrypto.d.ts.map +1 -0
  379. package/node_modules/@noble/hashes/webcrypto.js +165 -0
  380. package/node_modules/@noble/hashes/webcrypto.js.map +1 -0
  381. package/node_modules/ws/LICENSE +20 -0
  382. package/node_modules/ws/README.md +548 -0
  383. package/node_modules/ws/browser.js +8 -0
  384. package/node_modules/ws/index.js +22 -0
  385. package/node_modules/ws/lib/buffer-util.js +131 -0
  386. package/node_modules/ws/lib/constants.js +19 -0
  387. package/node_modules/ws/lib/event-target.js +292 -0
  388. package/node_modules/ws/lib/extension.js +203 -0
  389. package/node_modules/ws/lib/limiter.js +55 -0
  390. package/node_modules/ws/lib/permessage-deflate.js +530 -0
  391. package/node_modules/ws/lib/receiver.js +743 -0
  392. package/node_modules/ws/lib/sender.js +607 -0
  393. package/node_modules/ws/lib/stream.js +161 -0
  394. package/node_modules/ws/lib/subprotocol.js +62 -0
  395. package/node_modules/ws/lib/validation.js +152 -0
  396. package/node_modules/ws/lib/websocket-server.js +562 -0
  397. package/node_modules/ws/lib/websocket.js +1407 -0
  398. package/node_modules/ws/package.json +74 -0
  399. package/node_modules/ws/wrapper.mjs +21 -0
  400. 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
+ }