@bitgo-beta/sdk-api 1.10.1-beta.207 → 1.10.1-beta.2070

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 (94) hide show
  1. package/dist/package.json +23 -27
  2. package/dist/src/api.d.ts +18 -6
  3. package/dist/src/api.d.ts.map +1 -1
  4. package/dist/src/api.js +151 -72
  5. package/dist/src/bitgoAPI.d.ts +111 -29
  6. package/dist/src/bitgoAPI.d.ts.map +1 -1
  7. package/dist/src/bitgoAPI.js +704 -338
  8. package/dist/src/decryptV1.d.ts +60 -0
  9. package/dist/src/decryptV1.d.ts.map +1 -0
  10. package/dist/src/decryptV1.js +140 -0
  11. package/dist/src/encrypt.d.ts +37 -6
  12. package/dist/src/encrypt.d.ts.map +1 -1
  13. package/dist/src/encrypt.js +171 -15
  14. package/dist/src/encryptV2.d.ts +67 -0
  15. package/dist/src/encryptV2.d.ts.map +1 -0
  16. package/dist/src/encryptV2.js +234 -0
  17. package/dist/src/encryptionSession.d.ts +63 -0
  18. package/dist/src/encryptionSession.d.ts.map +1 -0
  19. package/dist/src/encryptionSession.js +140 -0
  20. package/dist/src/index.d.ts +3 -0
  21. package/dist/src/index.d.ts.map +1 -1
  22. package/dist/src/index.js +9 -2
  23. package/dist/src/types.d.ts +70 -43
  24. package/dist/src/types.d.ts.map +1 -1
  25. package/dist/src/types.js +4 -2
  26. package/dist/src/util.d.ts +12 -0
  27. package/dist/src/util.d.ts.map +1 -1
  28. package/dist/src/util.js +57 -4
  29. package/dist/src/v1/blockchain.js +25 -12
  30. package/dist/src/v1/keychains.js +39 -26
  31. package/dist/src/v1/markets.js +10 -5
  32. package/dist/src/v1/pendingapproval.d.ts.map +1 -1
  33. package/dist/src/v1/pendingapproval.js +57 -18
  34. package/dist/src/v1/pendingapprovals.d.ts.map +1 -1
  35. package/dist/src/v1/pendingapprovals.js +41 -7
  36. package/dist/src/v1/signPsbt.d.ts +14 -0
  37. package/dist/src/v1/signPsbt.d.ts.map +1 -0
  38. package/dist/src/v1/signPsbt.js +69 -0
  39. package/dist/src/v1/transactionBuilder.js +221 -91
  40. package/dist/src/v1/travelRule.js +125 -66
  41. package/dist/src/v1/verifyAddress.d.ts +6 -0
  42. package/dist/src/v1/verifyAddress.d.ts.map +1 -0
  43. package/dist/src/v1/verifyAddress.js +50 -0
  44. package/dist/src/v1/wallet.d.ts.map +1 -1
  45. package/dist/src/v1/wallet.js +498 -230
  46. package/dist/src/v1/wallets.js +118 -53
  47. package/dist/test/unit/api.d.ts +2 -0
  48. package/dist/test/unit/api.d.ts.map +1 -0
  49. package/dist/test/unit/api.js +331 -0
  50. package/dist/test/unit/bitgoAPI.d.ts +2 -0
  51. package/dist/test/unit/bitgoAPI.d.ts.map +1 -0
  52. package/dist/test/unit/bitgoAPI.js +1113 -0
  53. package/dist/test/unit/decryptV1.browser.d.ts +2 -0
  54. package/dist/test/unit/decryptV1.browser.d.ts.map +1 -0
  55. package/dist/test/unit/decryptV1.browser.js +133 -0
  56. package/dist/test/unit/decryptV1.d.ts +2 -0
  57. package/dist/test/unit/decryptV1.d.ts.map +1 -0
  58. package/dist/test/unit/decryptV1.js +230 -0
  59. package/dist/test/unit/encrypt.d.ts +2 -0
  60. package/dist/test/unit/encrypt.d.ts.map +1 -0
  61. package/dist/test/unit/encrypt.js +544 -0
  62. package/dist/test/unit/fixtures/keycard.d.ts +25 -0
  63. package/dist/test/unit/fixtures/keycard.d.ts.map +1 -0
  64. package/dist/test/unit/fixtures/keycard.js +28 -0
  65. package/dist/test/unit/hmacStrategy.d.ts +2 -0
  66. package/dist/test/unit/hmacStrategy.d.ts.map +1 -0
  67. package/dist/test/unit/hmacStrategy.js +136 -0
  68. package/dist/test/unit/serializeRequestDataIntegration.d.ts +2 -0
  69. package/dist/test/unit/serializeRequestDataIntegration.d.ts.map +1 -0
  70. package/dist/test/unit/serializeRequestDataIntegration.js +115 -0
  71. package/dist/test/unit/utils.d.ts +2 -0
  72. package/dist/test/unit/utils.d.ts.map +1 -0
  73. package/dist/test/unit/utils.js +65 -0
  74. package/dist/test/unit/v1/fixtures/accelerate-tx.d.ts +4 -0
  75. package/dist/test/unit/v1/fixtures/accelerate-tx.d.ts.map +1 -0
  76. package/dist/test/unit/v1/fixtures/accelerate-tx.js +53 -0
  77. package/dist/test/unit/v1/fixtures/index.d.ts +3 -0
  78. package/dist/test/unit/v1/fixtures/index.d.ts.map +1 -0
  79. package/dist/test/unit/v1/fixtures/index.js +24 -0
  80. package/dist/test/unit/v1/signPsbt.d.ts +2 -0
  81. package/dist/test/unit/v1/signPsbt.d.ts.map +1 -0
  82. package/dist/test/unit/v1/signPsbt.js +53 -0
  83. package/dist/test/unit/v1/travelRule.d.ts +2 -0
  84. package/dist/test/unit/v1/travelRule.d.ts.map +1 -0
  85. package/dist/test/unit/v1/travelRule.js +125 -0
  86. package/dist/test/unit/v1/wallet.d.ts +2 -0
  87. package/dist/test/unit/v1/wallet.d.ts.map +1 -0
  88. package/dist/test/unit/v1/wallet.js +1717 -0
  89. package/dist/tsconfig.tsbuildinfo +1 -0
  90. package/package.json +23 -27
  91. package/.eslintignore +0 -5
  92. package/CHANGELOG.md +0 -622
  93. package/dist/web/main.js +0 -2
  94. package/dist/web/main.js.LICENSE.txt +0 -110
@@ -0,0 +1,60 @@
1
+ import { createDecipheriv, pbkdf2 } from 'crypto';
2
+ import * as t from 'io-ts';
3
+ /**
4
+ * Minimal shape the decrypt path needs from a crypto module. Both `node:crypto`
5
+ * and `crypto-browserify` satisfy this. Passing this in from tests lets the
6
+ * browser-shim test suite exercise the real decrypt code instead of a copy.
7
+ */
8
+ export interface CryptoModule {
9
+ pbkdf2: typeof pbkdf2;
10
+ createDecipheriv: typeof createDecipheriv;
11
+ }
12
+ /**
13
+ * Upper bound on PBKDF2 iterations accepted from a v1 envelope. BitGo-produced
14
+ * v1 envelopes use 10,000; this cap is 10x that. Envelope validation enforces
15
+ * it up front before any KDF work runs.
16
+ */
17
+ export declare const V1_MAX_ITER = 100000;
18
+ /**
19
+ * io-ts codec for a v1 (SJCL) envelope.
20
+ *
21
+ * Enforces the shape and the `iter` cap up front, before any KDF work runs.
22
+ */
23
+ declare const V1EnvelopeCodec: t.IntersectionC<[t.TypeC<{
24
+ v: t.LiteralC<1>;
25
+ iter: t.Type<number, number, unknown>;
26
+ ks: t.UnionC<[t.LiteralC<128>, t.LiteralC<256>]>;
27
+ ts: t.UnionC<[t.LiteralC<64>, t.LiteralC<96>, t.LiteralC<128>]>;
28
+ mode: t.LiteralC<"ccm">;
29
+ cipher: t.LiteralC<"aes">;
30
+ salt: t.Type<string, string, unknown>;
31
+ iv: t.Type<string, string, unknown>;
32
+ ct: t.Type<string, string, unknown>;
33
+ }>, t.PartialC<{
34
+ adata: t.StringC;
35
+ }>]>;
36
+ export type V1Envelope = t.TypeOf<typeof V1EnvelopeCodec>;
37
+ export declare function parseV1Envelope(ciphertext: string): V1Envelope;
38
+ /**
39
+ * Decrypt a parsed v1 envelope given a crypto module.
40
+ *
41
+ * v1 = PBKDF2-SHA256(password, salt, iter, keyLen) then AES-CCM(key, nonce, ct||tag).
42
+ * Byte-for-byte compatible with `sjcl.decrypt` output for the same envelope.
43
+ *
44
+ * Exported so tests can inject `crypto-browserify` and exercise the exact
45
+ * runtime path the webpack browser bundle produces, without duplicating the
46
+ * decrypt logic.
47
+ */
48
+ export declare function decryptV1WithCrypto(password: string, ciphertext: string, crypto: CryptoModule): Promise<string>;
49
+ /**
50
+ * Decrypt a v1 (SJCL PBKDF2-SHA256 + AES-CCM) envelope.
51
+ *
52
+ * Runs the same `node:crypto` code on server and browser. The BitGoJS webpack
53
+ * config already maps `crypto` -> `crypto-browserify`, whose `aes-256-ccm` and
54
+ * `pbkdf2` implementations are byte-compatible with Node's native ones and
55
+ * with SJCL's envelope format. Parity is guarded by tests in
56
+ * `test/unit/decryptV1.browser.ts`.
57
+ */
58
+ export declare function decryptV1(password: string, ciphertext: string): Promise<string>;
59
+ export {};
60
+ //# sourceMappingURL=decryptV1.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"decryptV1.d.ts","sourceRoot":"","sources":["../../src/decryptV1.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,gBAAgB,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAClD,OAAO,KAAK,CAAC,MAAM,OAAO,CAAC;AAG3B;;;;GAIG;AACH,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,OAAO,MAAM,CAAC;IACtB,gBAAgB,EAAE,OAAO,gBAAgB,CAAC;CAC3C;AAID;;;;GAIG;AACH,eAAO,MAAM,WAAW,SAAU,CAAC;AAEnC;;;;GAIG;AACH,QAAA,MAAM,eAAe;;;;;;;;;;;;IAenB,CAAC;AAEH,MAAM,MAAM,UAAU,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,eAAe,CAAC,CAAC;AAE1D,wBAAgB,eAAe,CAAC,UAAU,EAAE,MAAM,GAAG,UAAU,CAQ9D;AAeD;;;;;;;;;GASG;AACH,wBAAsB,mBAAmB,CAAC,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,YAAY,GAAG,OAAO,CAAC,MAAM,CAAC,CAwBrH;AAED;;;;;;;;GAQG;AACH,wBAAsB,SAAS,CAAC,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAErF"}
@@ -0,0 +1,140 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.V1_MAX_ITER = void 0;
37
+ exports.parseV1Envelope = parseV1Envelope;
38
+ exports.decryptV1WithCrypto = decryptV1WithCrypto;
39
+ exports.decryptV1 = decryptV1;
40
+ const sdk_core_1 = require("@bitgo-beta/sdk-core");
41
+ const crypto_1 = require("crypto");
42
+ const t = __importStar(require("io-ts"));
43
+ const util_1 = require("util");
44
+ const defaultCrypto = { pbkdf2: crypto_1.pbkdf2, createDecipheriv: crypto_1.createDecipheriv };
45
+ /**
46
+ * Upper bound on PBKDF2 iterations accepted from a v1 envelope. BitGo-produced
47
+ * v1 envelopes use 10,000; this cap is 10x that. Envelope validation enforces
48
+ * it up front before any KDF work runs.
49
+ */
50
+ exports.V1_MAX_ITER = 100000;
51
+ /**
52
+ * io-ts codec for a v1 (SJCL) envelope.
53
+ *
54
+ * Enforces the shape and the `iter` cap up front, before any KDF work runs.
55
+ */
56
+ const V1EnvelopeCodec = t.intersection([
57
+ t.type({
58
+ v: t.literal(1),
59
+ iter: (0, sdk_core_1.boundedInt)(1, exports.V1_MAX_ITER, 'iter'),
60
+ ks: t.union([t.literal(128), t.literal(256)]),
61
+ ts: t.union([t.literal(64), t.literal(96), t.literal(128)]),
62
+ mode: t.literal('ccm'),
63
+ cipher: t.literal('aes'),
64
+ salt: sdk_core_1.base64String,
65
+ iv: sdk_core_1.base64String,
66
+ ct: sdk_core_1.base64String,
67
+ }),
68
+ t.partial({
69
+ adata: t.string,
70
+ }),
71
+ ]);
72
+ function parseV1Envelope(ciphertext) {
73
+ let parsed;
74
+ try {
75
+ parsed = JSON.parse(ciphertext);
76
+ }
77
+ catch {
78
+ throw new Error('v1 decrypt: invalid JSON envelope');
79
+ }
80
+ return (0, sdk_core_1.decodeWithCodec)(V1EnvelopeCodec, parsed, 'v1 decrypt: invalid envelope');
81
+ }
82
+ /**
83
+ * CCM length field size L, in bytes, chosen to encode the plaintext length.
84
+ *
85
+ * SJCL picks the smallest L in [2, 4) that can represent the plaintext length,
86
+ * then derives the nonce length as (15 - L). We mirror that so Node's CCM
87
+ * uses the same nonce framing as the SJCL encoder produced.
88
+ */
89
+ function ccmNonceLength(plaintextLen) {
90
+ let L = 2;
91
+ while (L < 4 && plaintextLen >= Math.pow(2, 8 * L))
92
+ L++;
93
+ return 15 - L;
94
+ }
95
+ /**
96
+ * Decrypt a parsed v1 envelope given a crypto module.
97
+ *
98
+ * v1 = PBKDF2-SHA256(password, salt, iter, keyLen) then AES-CCM(key, nonce, ct||tag).
99
+ * Byte-for-byte compatible with `sjcl.decrypt` output for the same envelope.
100
+ *
101
+ * Exported so tests can inject `crypto-browserify` and exercise the exact
102
+ * runtime path the webpack browser bundle produces, without duplicating the
103
+ * decrypt logic.
104
+ */
105
+ async function decryptV1WithCrypto(password, ciphertext, crypto) {
106
+ const env = parseV1Envelope(ciphertext);
107
+ const salt = Buffer.from(env.salt, 'base64');
108
+ const ivFull = Buffer.from(env.iv, 'base64');
109
+ const full = Buffer.from(env.ct, 'base64');
110
+ const tagBytes = env.ts / 8;
111
+ if (full.length < tagBytes)
112
+ throw new Error('v1 decrypt: ciphertext shorter than tag');
113
+ const cipher = full.subarray(0, full.length - tagBytes);
114
+ const authTag = full.subarray(full.length - tagBytes);
115
+ const nonceLen = ccmNonceLength(cipher.length);
116
+ if (ivFull.length < nonceLen)
117
+ throw new Error('v1 decrypt: iv shorter than nonce');
118
+ const iv = ivFull.subarray(0, nonceLen);
119
+ const keyBytes = env.ks / 8;
120
+ const key = await (0, util_1.promisify)(crypto.pbkdf2)(password, salt, env.iter, keyBytes, 'sha256');
121
+ const decipher = crypto.createDecipheriv(`aes-${env.ks}-ccm`, key, iv, { authTagLength: tagBytes });
122
+ decipher.setAuthTag(authTag);
123
+ const aad = env.adata ? Buffer.from(env.adata, 'utf8') : Buffer.alloc(0);
124
+ decipher.setAAD(aad, { plaintextLength: cipher.length });
125
+ const pt = Buffer.concat([decipher.update(cipher), decipher.final()]);
126
+ return pt.toString('utf8');
127
+ }
128
+ /**
129
+ * Decrypt a v1 (SJCL PBKDF2-SHA256 + AES-CCM) envelope.
130
+ *
131
+ * Runs the same `node:crypto` code on server and browser. The BitGoJS webpack
132
+ * config already maps `crypto` -> `crypto-browserify`, whose `aes-256-ccm` and
133
+ * `pbkdf2` implementations are byte-compatible with Node's native ones and
134
+ * with SJCL's envelope format. Parity is guarded by tests in
135
+ * `test/unit/decryptV1.browser.ts`.
136
+ */
137
+ async function decryptV1(password, ciphertext) {
138
+ return decryptV1WithCrypto(password, ciphertext, defaultCrypto);
139
+ }
140
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVjcnlwdFYxLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2RlY3J5cHRWMS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFnREEsMENBUUM7QUF5QkQsa0RBd0JDO0FBV0QsOEJBRUM7QUF0SEQsbURBQWlGO0FBQ2pGLG1DQUFrRDtBQUNsRCx5Q0FBMkI7QUFDM0IsK0JBQWlDO0FBWWpDLE1BQU0sYUFBYSxHQUFpQixFQUFFLE1BQU0sRUFBTixlQUFNLEVBQUUsZ0JBQWdCLEVBQWhCLHlCQUFnQixFQUFFLENBQUM7QUFFakU7Ozs7R0FJRztBQUNVLFFBQUEsV0FBVyxHQUFHLE1BQU8sQ0FBQztBQUVuQzs7OztHQUlHO0FBQ0gsTUFBTSxlQUFlLEdBQUcsQ0FBQyxDQUFDLFlBQVksQ0FBQztJQUNyQyxDQUFDLENBQUMsSUFBSSxDQUFDO1FBQ0wsQ0FBQyxFQUFFLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO1FBQ2YsSUFBSSxFQUFFLElBQUEscUJBQVUsRUFBQyxDQUFDLEVBQUUsbUJBQVcsRUFBRSxNQUFNLENBQUM7UUFDeEMsRUFBRSxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztRQUM3QyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFDM0QsSUFBSSxFQUFFLENBQUMsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDO1FBQ3RCLE1BQU0sRUFBRSxDQUFDLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FB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SUFDcEcsUUFBUSxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsQ0FBQztJQUM3QixNQUFNLEdBQUcsR0FBRyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDekUsUUFBUSxDQUFDLE1BQU0sQ0FBQyxHQUFHLEVBQUUsRUFBRSxlQUFlLEVBQUUsTUFBTSxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUM7SUFFekQsTUFBTSxFQUFFLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLEVBQUUsUUFBUSxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUMsQ0FBQztJQUN0RSxPQUFPLEVBQUUsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUM7QUFDN0IsQ0FBQztBQUVEOzs7Ozs7OztHQVFHO0FBQ0ksS0FBSyxVQUFVLFNBQVMsQ0FBQyxRQUFnQixFQUFFLFVBQWtCO0lBQ2xFLE9BQU8sbUJBQW1CLENBQUMsUUFBUSxFQUFFLFVBQVUsRUFBRSxhQUFhLENBQUMsQ0FBQztBQUNsRSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgYmFzZTY0U3RyaW5nLCBib3VuZGVkSW50LCBkZWNvZGVXaXRoQ29kZWMgfSBmcm9tICdAYml0Z28tYmV0YS9zZGstY29yZSc7XG5pbXBvcnQgeyBjcmVhdGVEZWNpcGhlcml2LCBwYmtkZjIgfSBmcm9tICdjcnlwdG8nO1xuaW1wb3J0ICogYXMgdCBmcm9tICdpby10cyc7XG5pbXBvcnQgeyBwcm9taXNpZnkgfSBmcm9tICd1dGlsJztcblxuLyoqXG4gKiBNaW5pbWFsIHNoYXBlIHRoZSBkZWNyeXB0IHBhdGggbmVlZHMgZnJvbSBhIGNyeXB0byBtb2R1bGUuIEJvdGggYG5vZGU6Y3J5cHRvYFxuICogYW5kIGBjcnlwdG8tYnJvd3NlcmlmeWAgc2F0aXNmeSB0aGlzLiBQYXNzaW5nIHRoaXMgaW4gZnJvbSB0ZXN0cyBsZXRzIHRoZVxuICogYnJvd3Nlci1zaGltIHRlc3Qgc3VpdGUgZXhlcmNpc2UgdGhlIHJlYWwgZGVjcnlwdCBjb2RlIGluc3RlYWQgb2YgYSBjb3B5LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIENyeXB0b01vZHVsZSB7XG4gIHBia2RmMjogdHlwZW9mIHBia2RmMjtcbiAgY3JlYXRlRGVjaXBoZXJpdjogdHlwZW9mIGNyZWF0ZURlY2lwaGVyaXY7XG59XG5cbmNvbnN0IGRlZmF1bHRDcnlwdG86IENyeXB0b01vZHVsZSA9IHsgcGJrZGYyLCBjcmVhdGVEZWNpcGhlcml2IH07XG5cbi8qKlxuICogVXBwZXIgYm91bmQgb24gUEJLREYyIGl0ZXJhdGlvbnMgYWNjZXB0ZWQgZnJvbSBhIHYxIGVudmVsb3BlLiBCaXRHby1wcm9kdWNlZFxuICogdjEgZW52ZWxvcGVzIHVzZSAxMCwwMDA7IHRoaXMgY2FwIGlzIDEweCB0aGF0LiBFbnZlbG9wZSB2YWxpZGF0aW9uIGVuZm9yY2VzXG4gKiBpdCB1cCBmcm9udCBiZWZvcmUgYW55IEtERiB3b3JrIHJ1bnMuXG4gKi9cbmV4cG9ydCBjb25zdCBWMV9NQVhfSVRFUiA9IDEwMF8wMDA7XG5cbi8qKlxuICogaW8tdHMgY29kZWMgZm9yIGEgdjEgKFNKQ0wpIGVudmVsb3BlLlxuICpcbiAqIEVuZm9yY2VzIHRoZSBzaGFwZSBhbmQgdGhlIGBpdGVyYCBjYXAgdXAgZnJvbnQsIGJlZm9yZSBhbnkgS0RGIHdvcmsgcnVucy5cbiAqL1xuY29uc3QgVjFFbnZlbG9wZUNvZGVjID0gdC5pbnRlcnNlY3Rpb24oW1xuICB0LnR5cGUoe1xuICAgIHY6IHQubGl0ZXJhbCgxKSxcbiAgICBpdGVyOiBib3VuZGVkSW50KDEsIFYxX01BWF9JVEVSLCAnaXRlcicpLFxuICAgIGtzOiB0LnVuaW9uKFt0LmxpdGVyYWwoMTI4KSwgdC5saXRlcmFsKDI1NildKSxcbiAgICB0czogdC51bmlvbihbdC5saXRlcmFsKDY0KSwgdC5saXRlcmFsKDk2KSwgdC5saXRlcmFsKDEyOCldKSxcbiAgICBtb2RlOiB0LmxpdGVyYWwoJ2NjbScpLFxuICAgIGNpcGhlcjogdC5saXRlcmFsKCdhZXMnKSxcbiAgICBzYWx0OiBiYXNlNjRTdHJpbmcsXG4gICAgaXY6IGJhc2U2NFN0cmluZyxcbiAgICBjdDogYmFzZTY0U3RyaW5nLFxuICB9KSxcbiAgdC5wYXJ0aWFsKHtcbiAgICBhZGF0YTogdC5zdHJpbmcsXG4gIH0pLFxuXSk7XG5cbmV4cG9ydCB0eXBlIFYxRW52ZWxvcGUgPSB0LlR5cGVPZjx0eXBlb2YgVjFFbnZlbG9wZUNvZGVjPjtcblxuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlVjFFbnZlbG9wZShjaXBoZXJ0ZXh0OiBzdHJpbmcpOiBWMUVudmVsb3BlIHtcbiAgbGV0IHBhcnNlZDogdW5rbm93bjtcbiAgdHJ5IHtcbiAgICBwYXJzZWQgPSBKU09OLnBhcnNlKGNpcGhlcnRleHQpO1xuICB9IGNhdGNoIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ3YxIGRlY3J5cHQ6IGludmFsaWQgSlNPTiBlbnZlbG9wZScpO1xuICB9XG4gIHJldHVybiBkZWNvZGVXaXRoQ29kZWMoVjFFbnZlbG9wZUNvZGVjLCBwYXJzZWQsICd2MSBkZWNyeXB0OiBpbnZhbGlkIGVudmVsb3BlJyk7XG59XG5cbi8qKlxuICogQ0NNIGxlbmd0aCBmaWVsZCBzaXplIEwsIGluIGJ5dGVzLCBjaG9zZW4gdG8gZW5jb2RlIHRoZSBwbGFpbnRleHQgbGVuZ3RoLlxuICpcbiAqIFNKQ0wgcGlja3MgdGhlIHNtYWxsZXN0IEwgaW4gWzIsIDQpIHRoYXQgY2FuIHJlcHJlc2VudCB0aGUgcGxhaW50ZXh0IGxlbmd0aCxcbiAqIHRoZW4gZGVyaXZlcyB0aGUgbm9uY2UgbGVuZ3RoIGFzICgxNSAtIEwpLiBXZSBtaXJyb3IgdGhhdCBzbyBOb2RlJ3MgQ0NNXG4gKiB1c2VzIHRoZSBzYW1lIG5vbmNlIGZyYW1pbmcgYXMgdGhlIFNKQ0wgZW5jb2RlciBwcm9kdWNlZC5cbiAqL1xuZnVuY3Rpb24gY2NtTm9uY2VMZW5ndGgocGxhaW50ZXh0TGVuOiBudW1iZXIpOiBudW1iZXIge1xuICBsZXQgTCA9IDI7XG4gIHdoaWxlIChMIDwgNCAmJiBwbGFpbnRleHRMZW4gPj0gTWF0aC5wb3coMiwgOCAqIEwpKSBMKys7XG4gIHJldHVybiAxNSAtIEw7XG59XG5cbi8qKlxuICogRGVjcnlwdCBhIHBhcnNlZCB2MSBlbnZlbG9wZSBnaXZlbiBhIGNyeXB0byBtb2R1bGUuXG4gKlxuICogdjEgPSBQQktERjItU0hBMjU2KHBhc3N3b3JkLCBzYWx0LCBpdGVyLCBrZXlMZW4pIHRoZW4gQUVTLUNDTShrZXksIG5vbmNlLCBjdHx8dGFnKS5cbiAqIEJ5dGUtZm9yLWJ5dGUgY29tcGF0aWJsZSB3aXRoIGBzamNsLmRlY3J5cHRgIG91dHB1dCBmb3IgdGhlIHNhbWUgZW52ZWxvcGUuXG4gKlxuICogRXhwb3J0ZWQgc28gdGVzdHMgY2FuIGluamVjdCBgY3J5cHRvLWJyb3dzZXJpZnlgIGFuZCBleGVyY2lzZSB0aGUgZXhhY3RcbiAqIHJ1bnRpbWUgcGF0aCB0aGUgd2VicGFjayBicm93c2VyIGJ1bmRsZSBwcm9kdWNlcywgd2l0aG91dCBkdXBsaWNhdGluZyB0aGVcbiAqIGRlY3J5cHQgbG9naWMuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBkZWNyeXB0VjFXaXRoQ3J5cHRvKHBhc3N3b3JkOiBzdHJpbmcsIGNpcGhlcnRleHQ6IHN0cmluZywgY3J5cHRvOiBDcnlwdG9Nb2R1bGUpOiBQcm9taXNlPHN0cmluZz4ge1xuICBjb25zdCBlbnYgPSBwYXJzZVYxRW52ZWxvcGUoY2lwaGVydGV4dCk7XG4gIGNvbnN0IHNhbHQgPSBCdWZmZXIuZnJvbShlbnYuc2FsdCwgJ2Jhc2U2NCcpO1xuICBjb25zdCBpdkZ1bGwgPSBCdWZmZXIuZnJvbShlbnYuaXYsICdiYXNlNjQnKTtcbiAgY29uc3QgZnVsbCA9IEJ1ZmZlci5mcm9tKGVudi5jdCwgJ2Jhc2U2NCcpO1xuICBjb25zdCB0YWdCeXRlcyA9IGVudi50cyAvIDg7XG4gIGlmIChmdWxsLmxlbmd0aCA8IHRhZ0J5dGVzKSB0aHJvdyBuZXcgRXJyb3IoJ3YxIGRlY3J5cHQ6IGNpcGhlcnRleHQgc2hvcnRlciB0aGFuIHRhZycpO1xuXG4gIGNvbnN0IGNpcGhlciA9IGZ1bGwuc3ViYXJyYXkoMCwgZnVsbC5sZW5ndGggLSB0YWdCeXRlcyk7XG4gIGNvbnN0IGF1dGhUYWcgPSBmdWxsLnN1YmFycmF5KGZ1bGwubGVuZ3RoIC0gdGFnQnl0ZXMpO1xuICBjb25zdCBub25jZUxlbiA9IGNjbU5vbmNlTGVuZ3RoKGNpcGhlci5sZW5ndGgpO1xuICBpZiAoaXZGdWxsLmxlbmd0aCA8IG5vbmNlTGVuKSB0aHJvdyBuZXcgRXJyb3IoJ3YxIGRlY3J5cHQ6IGl2IHNob3J0ZXIgdGhhbiBub25jZScpO1xuICBjb25zdCBpdiA9IGl2RnVsbC5zdWJhcnJheSgwLCBub25jZUxlbik7XG5cbiAgY29uc3Qga2V5Qnl0ZXMgPSBlbnYua3MgLyA4O1xuICBjb25zdCBrZXk6IEJ1ZmZlciA9IGF3YWl0IHByb21pc2lmeShjcnlwdG8ucGJrZGYyKShwYXNzd29yZCwgc2FsdCwgZW52Lml0ZXIsIGtleUJ5dGVzLCAnc2hhMjU2Jyk7XG5cbiAgY29uc3QgZGVjaXBoZXIgPSBjcnlwdG8uY3JlYXRlRGVjaXBoZXJpdihgYWVzLSR7ZW52LmtzfS1jY21gLCBrZXksIGl2LCB7IGF1dGhUYWdMZW5ndGg6IHRhZ0J5dGVzIH0pO1xuICBkZWNpcGhlci5zZXRBdXRoVGFnKGF1dGhUYWcpO1xuICBjb25zdCBhYWQgPSBlbnYuYWRhdGEgPyBCdWZmZXIuZnJvbShlbnYuYWRhdGEsICd1dGY4JykgOiBCdWZmZXIuYWxsb2MoMCk7XG4gIGRlY2lwaGVyLnNldEFBRChhYWQsIHsgcGxhaW50ZXh0TGVuZ3RoOiBjaXBoZXIubGVuZ3RoIH0pO1xuXG4gIGNvbnN0IHB0ID0gQnVmZmVyLmNvbmNhdChbZGVjaXBoZXIudXBkYXRlKGNpcGhlciksIGRlY2lwaGVyLmZpbmFsKCldKTtcbiAgcmV0dXJuIHB0LnRvU3RyaW5nKCd1dGY4Jyk7XG59XG5cbi8qKlxuICogRGVjcnlwdCBhIHYxIChTSkNMIFBCS0RGMi1TSEEyNTYgKyBBRVMtQ0NNKSBlbnZlbG9wZS5cbiAqXG4gKiBSdW5zIHRoZSBzYW1lIGBub2RlOmNyeXB0b2AgY29kZSBvbiBzZXJ2ZXIgYW5kIGJyb3dzZXIuIFRoZSBCaXRHb0pTIHdlYnBhY2tcbiAqIGNvbmZpZyBhbHJlYWR5IG1hcHMgYGNyeXB0b2AgLT4gYGNyeXB0by1icm93c2VyaWZ5YCwgd2hvc2UgYGFlcy0yNTYtY2NtYCBhbmRcbiAqIGBwYmtkZjJgIGltcGxlbWVudGF0aW9ucyBhcmUgYnl0ZS1jb21wYXRpYmxlIHdpdGggTm9kZSdzIG5hdGl2ZSBvbmVzIGFuZFxuICogd2l0aCBTSkNMJ3MgZW52ZWxvcGUgZm9ybWF0LiBQYXJpdHkgaXMgZ3VhcmRlZCBieSB0ZXN0cyBpblxuICogYHRlc3QvdW5pdC9kZWNyeXB0VjEuYnJvd3Nlci50c2AuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBkZWNyeXB0VjEocGFzc3dvcmQ6IHN0cmluZywgY2lwaGVydGV4dDogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgcmV0dXJuIGRlY3J5cHRWMVdpdGhDcnlwdG8ocGFzc3dvcmQsIGNpcGhlcnRleHQsIGRlZmF1bHRDcnlwdG8pO1xufVxuIl19
@@ -1,4 +1,3 @@
1
- /// <reference types="node" />
2
1
  /**
3
2
  * convert a 4 element Uint8Array to a 4 byte Number
4
3
  *
@@ -6,9 +5,41 @@
6
5
  * @return 4 byte number
7
6
  */
8
7
  export declare function bytesToWord(bytes?: Uint8Array | number[]): number;
9
- export declare function encrypt(password: string, plaintext: string, { salt, iv }?: {
10
- salt?: Buffer | undefined;
11
- iv?: Buffer | undefined;
12
- }): string;
13
- export declare function decrypt(password: string, ciphertext: string): string;
8
+ /**
9
+ * Encrypt `plaintext` with `password`. Defaults to v2 (Argon2id + AES-256-GCM).
10
+ *
11
+ * Pass `encryptionVersion: 1` to produce a legacy v1 (SJCL) envelope; this is the
12
+ * only supported way to request v1 encryption.
13
+ */
14
+ export declare function encrypt(password: string, plaintext: string, options?: {
15
+ salt?: Buffer;
16
+ iv?: Buffer;
17
+ adata?: string;
18
+ encryptionVersion?: 1 | 2;
19
+ }): Promise<string>;
20
+ /**
21
+ * v1 decrypt with an SJCL safety net.
22
+ *
23
+ * Design intent during rollout: zero false negatives. Any native failure
24
+ * (envelope shape our stricter codec rejects, framing bug, unsupported
25
+ * algorithm, auth-tag mismatch, etc.) falls through to `sjcl.decrypt` so the
26
+ * caller is never blocked. The only exception is an iter-cap violation,
27
+ * which is rethrown to preserve DoS protection.
28
+ *
29
+ * The console.warn only fires when native fails AND SJCL succeeds -- i.e.
30
+ * when the two engines disagree, which is the only signal worth
31
+ * investigating. Wrong password fails both engines silently and surfaces
32
+ * SJCL's auth error (mapped upstream to "incorrect password").
33
+ *
34
+ * `native` defaults to the module's `decryptV1` but is exposed as a parameter
35
+ * so tests can inject a throwing version to exercise the fallback path.
36
+ * `isBrowser` defaults to a real runtime check but is exposed so tests can
37
+ * exercise the browser-only branch under Node.
38
+ */
39
+ export declare function decryptV1WithFallback(password: string, ciphertext: string, native?: (pw: string, ct: string) => Promise<string>, isBrowser?: boolean): Promise<string>;
40
+ /**
41
+ * Auto-detect v1 (PBKDF2-SHA256 + AES-CCM) or v2 (Argon2id + AES-256-GCM)
42
+ * from the envelope `v` field and decrypt.
43
+ */
44
+ export declare function decrypt(password: string, ciphertext: string): Promise<string>;
14
45
  //# sourceMappingURL=encrypt.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"encrypt.d.ts","sourceRoot":"","sources":["../../src/encrypt.ts"],"names":[],"mappings":";AAGA;;;;;GAKG;AACH,wBAAgB,WAAW,CAAC,KAAK,CAAC,EAAE,UAAU,GAAG,MAAM,EAAE,GAAG,MAAM,CAMjE;AAED,wBAAgB,OAAO,CACrB,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,MAAM,EACjB,EAAE,IAAqB,EAAE,EAAoB,EAAE;;;CAAK,GACnD,MAAM,CAoBR;AAED,wBAAgB,OAAO,CAAC,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,MAAM,CAEpE"}
1
+ {"version":3,"file":"encrypt.d.ts","sourceRoot":"","sources":["../../src/encrypt.ts"],"names":[],"mappings":"AAiCA;;;;;GAKG;AACH,wBAAgB,WAAW,CAAC,KAAK,CAAC,EAAE,UAAU,GAAG,MAAM,EAAE,GAAG,MAAM,CAKjE;AAiCD;;;;;GAKG;AACH,wBAAsB,OAAO,CAC3B,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,MAAM,EACjB,OAAO,CAAC,EAAE;IAAE,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,EAAE,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,iBAAiB,CAAC,EAAE,CAAC,GAAG,CAAC,CAAA;CAAE,GAClF,OAAO,CAAC,MAAM,CAAC,CAKjB;AAaD;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAsB,qBAAqB,CACzC,QAAQ,EAAE,MAAM,EAChB,UAAU,EAAE,MAAM,EAClB,MAAM,GAAE,CAAC,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAa,EAC/D,SAAS,GAAE,OAA0B,GACpC,OAAO,CAAC,MAAM,CAAC,CAuBjB;AAED;;;GAGG;AACH,wBAAsB,OAAO,CAAC,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAgBnF"}
@@ -1,8 +1,72 @@
1
1
  "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
2
35
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.decrypt = exports.encrypt = exports.bytesToWord = void 0;
4
- const sjcl = require("@bitgo-beta/sjcl");
36
+ exports.bytesToWord = bytesToWord;
37
+ exports.encrypt = encrypt;
38
+ exports.decryptV1WithFallback = decryptV1WithFallback;
39
+ exports.decrypt = decrypt;
40
+ const sjcl = __importStar(require("@bitgo-beta/sjcl"));
5
41
  const crypto_1 = require("crypto");
42
+ const decryptV1_1 = require("./decryptV1");
43
+ const encryptV2_1 = require("./encryptV2");
44
+ /**
45
+ * True when running in a bundled browser build. `browserify-aes` -- the AES
46
+ * polyfill webpack substitutes for `node:crypto` in browser bundles -- has no
47
+ * AES-CCM mode at all, so native v1 decrypt fails on literally every call
48
+ * there. There's no point paying for the doomed native attempt (a full
49
+ * PBKDF2 run) before falling back; go straight to SJCL.
50
+ */
51
+ const isBrowserRuntime = typeof window !== 'undefined';
52
+ /**
53
+ * SJCL has no upper bound on `iter`, so a hostile v1 envelope could burn CPU
54
+ * running an inflated PBKDF2. Native decrypt's codec normally catches this
55
+ * before any KDF work runs; the browser path skips native entirely, so it
56
+ * needs this narrow check to preserve the same DoS protection.
57
+ */
58
+ function assertIterWithinCap(ciphertext) {
59
+ let iter;
60
+ try {
61
+ iter = JSON.parse(ciphertext)?.iter;
62
+ }
63
+ catch {
64
+ return; // malformed JSON -- let sjcl.decrypt raise its own error
65
+ }
66
+ if (typeof iter === 'number' && iter > decryptV1_1.V1_MAX_ITER) {
67
+ throw new Error(`v1 decrypt: iter ${iter} exceeds cap of ${decryptV1_1.V1_MAX_ITER}`);
68
+ }
69
+ }
6
70
  /**
7
71
  * convert a 4 element Uint8Array to a 4 byte Number
8
72
  *
@@ -15,14 +79,19 @@ function bytesToWord(bytes) {
15
79
  }
16
80
  return bytes.reduce((num, byte) => num * 0x100 + byte, 0);
17
81
  }
18
- exports.bytesToWord = bytesToWord;
19
- function encrypt(password, plaintext, { salt = crypto_1.randomBytes(8), iv = crypto_1.randomBytes(16) } = {}) {
20
- if (salt.length !== 8) {
21
- throw new Error(`salt must be 8 bytes`);
22
- }
23
- if (iv.length !== 16) {
24
- throw new Error(`iv must be 16 bytes`);
25
- }
82
+ /**
83
+ * Internal v1 (SJCL PBKDF2-SHA256 + AES-256-CCM) encrypt helper.
84
+ *
85
+ * Not exported as part of the public encrypt/decrypt surface: callers must not use
86
+ * this directly. v1 output is requested via `encrypt(..., { encryptionVersion: 1 })`.
87
+ */
88
+ function encryptV1(password, plaintext, options) {
89
+ const salt = options?.salt || (0, crypto_1.randomBytes)(8);
90
+ if (salt.length !== 8)
91
+ throw new Error('salt must be 8 bytes');
92
+ const iv = options?.iv || (0, crypto_1.randomBytes)(16);
93
+ if (iv.length !== 16)
94
+ throw new Error('iv must be 16 bytes');
26
95
  const encryptOptions = {
27
96
  iter: 10000,
28
97
  ks: 256,
@@ -34,11 +103,98 @@ function encrypt(password, plaintext, { salt = crypto_1.randomBytes(8), iv = cry
34
103
  bytesToWord(iv.slice(12, 16)),
35
104
  ],
36
105
  };
106
+ if (options?.adata)
107
+ encryptOptions.adata = options.adata;
37
108
  return sjcl.encrypt(password, plaintext, encryptOptions);
38
109
  }
39
- exports.encrypt = encrypt;
40
- function decrypt(password, ciphertext) {
41
- return sjcl.decrypt(password, ciphertext);
110
+ /**
111
+ * Encrypt `plaintext` with `password`. Defaults to v2 (Argon2id + AES-256-GCM).
112
+ *
113
+ * Pass `encryptionVersion: 1` to produce a legacy v1 (SJCL) envelope; this is the
114
+ * only supported way to request v1 encryption.
115
+ */
116
+ async function encrypt(password, plaintext, options) {
117
+ if (options?.encryptionVersion === 1) {
118
+ return encryptV1(password, plaintext, options);
119
+ }
120
+ return (0, encryptV2_1.encryptV2)(password, plaintext, { adata: options?.adata });
42
121
  }
43
- exports.decrypt = decrypt;
44
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW5jcnlwdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9lbmNyeXB0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLHlDQUF5QztBQUN6QyxtQ0FBcUM7QUFFckM7Ozs7O0dBS0c7QUFDSCxTQUFnQixXQUFXLENBQUMsS0FBNkI7SUFDdkQsSUFBSSxDQUFDLENBQUMsS0FBSyxZQUFZLFVBQVUsQ0FBQyxJQUFJLEtBQUssQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFO1FBQ3hELE1BQU0sSUFBSSxLQUFLLENBQUMsMENBQTBDLENBQUMsQ0FBQztLQUM3RDtJQUVELE9BQU8sS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEdBQUcsRUFBRSxJQUFJLEVBQUUsRUFBRSxDQUFDLEdBQUcsR0FBRyxLQUFLLEdBQUcsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDO0FBQzVELENBQUM7QUFORCxrQ0FNQztBQUVELFNBQWdCLE9BQU8sQ0FDckIsUUFBZ0IsRUFDaEIsU0FBaUIsRUFDakIsRUFBRSxJQUFJLEdBQUcsb0JBQVcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLEdBQUcsb0JBQVcsQ0FBQyxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUU7SUFFcEQsSUFBSSxJQUFJLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRTtRQUNyQixNQUFNLElBQUksS0FBSyxDQUFDLHNCQUFzQixDQUFDLENBQUM7S0FDekM7SUFDRCxJQUFJLEVBQUUsQ0FBQyxNQUFNLEtBQUssRUFBRSxFQUFFO1FBQ3BCLE1BQU0sSUFBSSxLQUFLLENBQUMscUJBQXFCLENBQUMsQ0FBQztLQUN4QztJQUNELE1BQU0sY0FBYyxHQUFHO1FBQ3JCLElBQUksRUFBRSxLQUFLO1FBQ1gsRUFBRSxFQUFFLEdBQUc7UUFDUCxJQUFJLEVBQUUsQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxXQUFXLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQ2pFLEVBQUUsRUFBRTtZQUNGLFdBQVcsQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztZQUMzQixXQUFXLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFDM0IsV0FBVyxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1lBQzVCLFdBQVcsQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQztTQUM5QjtLQUNGLENBQUM7SUFFRixPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxFQUFFLFNBQVMsRUFBRSxjQUFjLENBQUMsQ0FBQztBQUMzRCxDQUFDO0FBeEJELDBCQXdCQztBQUVELFNBQWdCLE9BQU8sQ0FBQyxRQUFnQixFQUFFLFVBQWtCO0lBQzFELE9BQU8sSUFBSSxDQUFDLE9BQU8sQ0FBQyxRQUFRLEVBQUUsVUFBVSxDQUFDLENBQUM7QUFDNUMsQ0FBQztBQUZELDBCQUVDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgc2pjbCBmcm9tICdAYml0Z28tYmV0YS9zamNsJztcbmltcG9ydCB7IHJhbmRvbUJ5dGVzIH0gZnJvbSAnY3J5cHRvJztcblxuLyoqXG4gKiBjb252ZXJ0IGEgNCBlbGVtZW50IFVpbnQ4QXJyYXkgdG8gYSA0IGJ5dGUgTnVtYmVyXG4gKlxuICogQHBhcmFtIGJ5dGVzXG4gKiBAcmV0dXJuIDQgYnl0ZSBudW1iZXJcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGJ5dGVzVG9Xb3JkKGJ5dGVzPzogVWludDhBcnJheSB8IG51bWJlcltdKTogbnVtYmVyIHtcbiAgaWYgKCEoYnl0ZXMgaW5zdGFuY2VvZiBVaW50OEFycmF5KSB8fCBieXRlcy5sZW5ndGggIT09IDQpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2J5dGVzIG11c3QgYmUgYSBVaW50OEFycmF5IHdpdGggbGVuZ3RoIDQnKTtcbiAgfVxuXG4gIHJldHVybiBieXRlcy5yZWR1Y2UoKG51bSwgYnl0ZSkgPT4gbnVtICogMHgxMDAgKyBieXRlLCAwKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGVuY3J5cHQoXG4gIHBhc3N3b3JkOiBzdHJpbmcsXG4gIHBsYWludGV4dDogc3RyaW5nLFxuICB7IHNhbHQgPSByYW5kb21CeXRlcyg4KSwgaXYgPSByYW5kb21CeXRlcygxNikgfSA9IHt9XG4pOiBzdHJpbmcge1xuICBpZiAoc2FsdC5sZW5ndGggIT09IDgpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYHNhbHQgbXVzdCBiZSA4IGJ5dGVzYCk7XG4gIH1cbiAgaWYgKGl2Lmxlbmd0aCAhPT0gMTYpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYGl2IG11c3QgYmUgMTYgYnl0ZXNgKTtcbiAgfVxuICBjb25zdCBlbmNyeXB0T3B0aW9ucyA9IHtcbiAgICBpdGVyOiAxMDAwMCxcbiAgICBrczogMjU2LFxuICAgIHNhbHQ6IFtieXRlc1RvV29yZChzYWx0LnNsaWNlKDAsIDQpKSwgYnl0ZXNUb1dvcmQoc2FsdC5zbGljZSg0KSldLFxuICAgIGl2OiBbXG4gICAgICBieXRlc1RvV29yZChpdi5zbGljZSgwLCA0KSksXG4gICAgICBieXRlc1RvV29yZChpdi5zbGljZSg0LCA4KSksXG4gICAgICBieXRlc1RvV29yZChpdi5zbGljZSg4LCAxMikpLFxuICAgICAgYnl0ZXNUb1dvcmQoaXYuc2xpY2UoMTIsIDE2KSksXG4gICAgXSxcbiAgfTtcblxuICByZXR1cm4gc2pjbC5lbmNyeXB0KHBhc3N3b3JkLCBwbGFpbnRleHQsIGVuY3J5cHRPcHRpb25zKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGRlY3J5cHQocGFzc3dvcmQ6IHN0cmluZywgY2lwaGVydGV4dDogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIHNqY2wuZGVjcnlwdChwYXNzd29yZCwgY2lwaGVydGV4dCk7XG59XG4iXX0=
122
+ /**
123
+ * Iter-cap violations are the only error we refuse to fall back on: SJCL has
124
+ * no upper bound on `iter`, so falling through to it would let a hostile
125
+ * envelope burn CPU running an inflated PBKDF2. Everything else -- codec
126
+ * rejection of a shape SJCL would accept, native crypto bug, auth-tag
127
+ * mismatch -- is safe to fall through to SJCL.
128
+ */
129
+ function isIterCapViolation(err) {
130
+ return err instanceof Error && /iter:\s*expected integer|iter out of range/i.test(err.message);
131
+ }
132
+ /**
133
+ * v1 decrypt with an SJCL safety net.
134
+ *
135
+ * Design intent during rollout: zero false negatives. Any native failure
136
+ * (envelope shape our stricter codec rejects, framing bug, unsupported
137
+ * algorithm, auth-tag mismatch, etc.) falls through to `sjcl.decrypt` so the
138
+ * caller is never blocked. The only exception is an iter-cap violation,
139
+ * which is rethrown to preserve DoS protection.
140
+ *
141
+ * The console.warn only fires when native fails AND SJCL succeeds -- i.e.
142
+ * when the two engines disagree, which is the only signal worth
143
+ * investigating. Wrong password fails both engines silently and surfaces
144
+ * SJCL's auth error (mapped upstream to "incorrect password").
145
+ *
146
+ * `native` defaults to the module's `decryptV1` but is exposed as a parameter
147
+ * so tests can inject a throwing version to exercise the fallback path.
148
+ * `isBrowser` defaults to a real runtime check but is exposed so tests can
149
+ * exercise the browser-only branch under Node.
150
+ */
151
+ async function decryptV1WithFallback(password, ciphertext, native = decryptV1_1.decryptV1, isBrowser = isBrowserRuntime) {
152
+ if (isBrowser) {
153
+ assertIterWithinCap(ciphertext);
154
+ return sjcl.decrypt(password, ciphertext);
155
+ }
156
+ try {
157
+ return await native(password, ciphertext);
158
+ }
159
+ catch (nativeErr) {
160
+ if (isIterCapViolation(nativeErr))
161
+ throw nativeErr;
162
+ let result;
163
+ try {
164
+ result = sjcl.decrypt(password, ciphertext);
165
+ }
166
+ catch (sjclErr) {
167
+ // Both engines rejected -- almost certainly a real auth failure.
168
+ // Rethrow SJCL's error so BitGoAPI.decrypt maps it to "incorrect password".
169
+ throw sjclErr;
170
+ }
171
+ // Native failed but SJCL succeeded -- real signal, log for the operator.
172
+ const message = nativeErr instanceof Error ? nativeErr.message : String(nativeErr);
173
+ // eslint-disable-next-line no-console
174
+ console.warn('[bitgo-sdk] v1 native decrypt failed; SJCL fallback succeeded:', message);
175
+ return result;
176
+ }
177
+ }
178
+ /**
179
+ * Auto-detect v1 (PBKDF2-SHA256 + AES-CCM) or v2 (Argon2id + AES-256-GCM)
180
+ * from the envelope `v` field and decrypt.
181
+ */
182
+ async function decrypt(password, ciphertext) {
183
+ let envelopeVersion;
184
+ try {
185
+ const envelope = JSON.parse(ciphertext);
186
+ envelopeVersion = envelope.v;
187
+ }
188
+ catch {
189
+ throw new Error('decrypt: ciphertext is not valid JSON');
190
+ }
191
+ if (envelopeVersion === 2) {
192
+ // Do not catch: wrong password on v2 must not silently fall through to v1.
193
+ return (0, encryptV2_1.decryptV2)(password, ciphertext);
194
+ }
195
+ if (envelopeVersion !== undefined && envelopeVersion !== 1) {
196
+ throw new Error(`decrypt: unknown envelope version ${envelopeVersion}`);
197
+ }
198
+ return decryptV1WithFallback(password, ciphertext);
199
+ }
200
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW5jcnlwdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9lbmNyeXB0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBdUNBLGtDQUtDO0FBdUNELDBCQVNDO0FBZ0NELHNEQTRCQztBQU1ELDBCQWdCQztBQTlLRCx1REFBeUM7QUFDekMsbUNBQXFDO0FBRXJDLDJDQUFxRDtBQUNyRCwyQ0FBbUQ7QUFFbkQ7Ozs7OztHQU1HO0FBQ0gsTUFBTSxnQkFBZ0IsR0FBRyxPQUFPLE1BQU0sS0FBSyxXQUFXLENBQUM7QUFFdkQ7Ozs7O0dBS0c7QUFDSCxTQUFTLG1CQUFtQixDQUFDLFVBQWtCO0lBQzdDLElBQUksSUFBYSxDQUFDO0lBQ2xCLElBQUksQ0FBQztRQUNILElBQUksR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLFVBQVUsQ0FBQyxFQUFFLElBQUksQ0FBQztJQUN0QyxDQUFDO0lBQUMsTUFBTSxDQUFDO1FBQ1AsT0FBTyxDQUFDLHlEQUF5RDtJQUNuRSxDQUFDO0lBQ0QsSUFBSSxPQUFPLElBQUksS0FBSyxRQUFRLElBQUksSUFBSSxHQUFHLHVCQUFXLEVBQUUsQ0FBQztRQUNuRCxNQUFNLElBQUksS0FBSyxDQUFDLG9CQUFvQixJQUFJLG1CQUFtQix1QkFBVyxFQUFFLENBQUMsQ0FBQztJQUM1RSxDQUFDO0FBQ0gsQ0FBQztBQUVEOzs7OztHQUtHO0FBQ0gsU0FBZ0IsV0FBVyxDQUFDLEtBQTZCO0lBQ3ZELElBQUksQ0FBQyxDQUFDLEtBQUssWUFBWSxVQUFVLENBQUMsSUFBSSxLQUFLLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRSxDQUFDO1FBQ3pELE1BQU0sSUFBSSxLQUFLLENBQUMsMENBQTBDLENBQUMsQ0FBQztJQUM5RCxDQUFDO0lBQ0QsT0FBTyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBRyxFQUFFLElBQUksRUFBRSxFQUFFLENBQUMsR0FBRyxH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QUFLLENBQUMscUNBQXFDLGVBQWUsRUFBRSxDQUFDLENBQUM7SUFDMUUsQ0FBQztJQUNELE9BQU8scUJBQXFCLENBQUMsUUFBUSxFQUFFLFVBQVUsQ0FBQyxDQUFDO0FBQ3JELENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBzamNsIGZyb20gJ0BiaXRnby1iZXRhL3NqY2wnO1xuaW1wb3J0IHsgcmFuZG9tQnl0ZXMgfSBmcm9tICdjcnlwdG8nO1xuXG5pbXBvcnQgeyBkZWNyeXB0VjEsIFYxX01BWF9JVEVSIH0gZnJvbSAnLi9kZWNyeXB0VjEnO1xuaW1wb3J0IHsgZGVjcnlwdFYyLCBlbmNyeXB0VjIgfSBmcm9tICcuL2VuY3J5cHRWMic7XG5cbi8qKlxuICogVHJ1ZSB3aGVuIHJ1bm5pbmcgaW4gYSBidW5kbGVkIGJyb3dzZXIgYnVpbGQuIGBicm93c2VyaWZ5LWFlc2AgLS0gdGhlIEFFU1xuICogcG9seWZpbGwgd2VicGFjayBzdWJzdGl0dXRlcyBmb3IgYG5vZGU6Y3J5cHRvYCBpbiBicm93c2VyIGJ1bmRsZXMgLS0gaGFzIG5vXG4gKiBBRVMtQ0NNIG1vZGUgYXQgYWxsLCBzbyBuYXRpdmUgdjEgZGVjcnlwdCBmYWlscyBvbiBsaXRlcmFsbHkgZXZlcnkgY2FsbFxuICogdGhlcmUuIFRoZXJlJ3Mgbm8gcG9pbnQgcGF5aW5nIGZvciB0aGUgZG9vbWVkIG5hdGl2ZSBhdHRlbXB0IChhIGZ1bGxcbiAqIFBCS0RGMiBydW4pIGJlZm9yZSBmYWxsaW5nIGJhY2s7IGdvIHN0cmFpZ2h0IHRvIFNKQ0wuXG4gKi9cbmNvbnN0IGlzQnJvd3NlclJ1bnRpbWUgPSB0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJztcblxuLyoqXG4gKiBTSkNMIGhhcyBubyB1cHBlciBib3VuZCBvbiBgaXRlcmAsIHNvIGEgaG9zdGlsZSB2MSBlbnZlbG9wZSBjb3VsZCBidXJuIENQVVxuICogcnVubmluZyBhbiBpbmZsYXRlZCBQQktERjIuIE5hdGl2ZSBkZWNyeXB0J3MgY29kZWMgbm9ybWFsbHkgY2F0Y2hlcyB0aGlzXG4gKiBiZWZvcmUgYW55IEtERiB3b3JrIHJ1bnM7IHRoZSBicm93c2VyIHBhdGggc2tpcHMgbmF0aXZlIGVudGlyZWx5LCBzbyBpdFxuICogbmVlZHMgdGhpcyBuYXJyb3cgY2hlY2sgdG8gcHJlc2VydmUgdGhlIHNhbWUgRG9TIHByb3RlY3Rpb24uXG4gKi9cbmZ1bmN0aW9uIGFzc2VydEl0ZXJXaXRoaW5DYXAoY2lwaGVydGV4dDogc3RyaW5nKTogdm9pZCB7XG4gIGxldCBpdGVyOiB1bmtub3duO1xuICB0cnkge1xuICAgIGl0ZXIgPSBKU09OLnBhcnNlKGNpcGhlcnRleHQpPy5pdGVyO1xuICB9IGNhdGNoIHtcbiAgICByZXR1cm47IC8vIG1hbGZvcm1lZCBKU09OIC0tIGxldCBzamNsLmRlY3J5cHQgcmFpc2UgaXRzIG93biBlcnJvclxuICB9XG4gIGlmICh0eXBlb2YgaXRlciA9PT0gJ251bWJlcicgJiYgaXRlciA+IFYxX01BWF9JVEVSKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKGB2MSBkZWNyeXB0OiBpdGVyICR7aXRlcn0gZXhjZWVkcyBjYXAgb2YgJHtWMV9NQVhfSVRFUn1gKTtcbiAgfVxufVxuXG4vKipcbiAqIGNvbnZlcnQgYSA0IGVsZW1lbnQgVWludDhBcnJheSB0byBhIDQgYnl0ZSBOdW1iZXJcbiAqXG4gKiBAcGFyYW0gYnl0ZXNcbiAqIEByZXR1cm4gNCBieXRlIG51bWJlclxuICovXG5leHBvcnQgZnVuY3Rpb24gYnl0ZXNUb1dvcmQoYnl0ZXM/OiBVaW50OEFycmF5IHwgbnVtYmVyW10pOiBudW1iZXIge1xuICBpZiAoIShieXRlcyBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkpIHx8IGJ5dGVzLmxlbmd0aCAhPT0gNCkge1xuICAgIHRocm93IG5ldyBFcnJvcignYnl0ZXMgbXVzdCBiZSBhIFVpbnQ4QXJyYXkgd2l0aCBsZW5ndGggNCcpO1xuICB9XG4gIHJldHVybiBieXRlcy5yZWR1Y2UoKG51bSwgYnl0ZSkgPT4gbnVtICogMHgxMDAgKyBieXRlLCAwKTtcbn1cblxuLyoqXG4gKiBJbnRlcm5hbCB2MSAoU0pDTCBQQktERjItU0hBMjU2ICsgQUVTLTI1Ni1DQ00pIGVuY3J5cHQgaGVscGVyLlxuICpcbiAqIE5vdCBleHBvcnRlZCBhcyBwYXJ0IG9mIHRoZSBwdWJsaWMgZW5jcnlwdC9kZWNyeXB0IHN1cmZhY2U6IGNhbGxlcnMgbXVzdCBub3QgdXNlXG4gKiB0aGlzIGRpcmVjdGx5LiB2MSBvdXRwdXQgaXMgcmVxdWVzdGVkIHZpYSBgZW5jcnlwdCguLi4sIHsgZW5jcnlwdGlvblZlcnNpb246IDEgfSlgLlxuICovXG5mdW5jdGlvbiBlbmNyeXB0VjEoXG4gIHBhc3N3b3JkOiBzdHJpbmcsXG4gIHBsYWludGV4dDogc3RyaW5nLFxuICBvcHRpb25zPzogeyBzYWx0PzogQnVmZmVyOyBpdj86IEJ1ZmZlcjsgYWRhdGE/OiBzdHJpbmcgfVxuKTogc3RyaW5nIHtcbiAgY29uc3Qgc2FsdCA9IG9wdGlvbnM/LnNhbHQgfHwgcmFuZG9tQnl0ZXMoOCk7XG4gIGlmIChzYWx0Lmxlbmd0aCAhPT0gOCkgdGhyb3cgbmV3IEVycm9yKCdzYWx0IG11c3QgYmUgOCBieXRlcycpO1xuICBjb25zdCBpdiA9IG9wdGlvbnM/Lml2IHx8IHJhbmRvbUJ5dGVzKDE2KTtcbiAgaWYgKGl2Lmxlbmd0aCAhPT0gMTYpIHRocm93IG5ldyBFcnJvcignaXYgbXVzdCBiZSAxNiBieXRlcycpO1xuXG4gIGNvbnN0IGVuY3J5cHRPcHRpb25zOiB7IGl0ZXI6IG51bWJlcjsga3M6IG51bWJlcjsgc2FsdDogbnVtYmVyW107IGl2OiBudW1iZXJbXTsgYWRhdGE/OiBzdHJpbmcgfSA9IHtcbiAgICBpdGVyOiAxMDAwMCxcbiAgICBrczogMjU2LFxuICAgIHNhbHQ6IFtieXRlc1RvV29yZChzYWx0LnNsaWNlKDAsIDQpKSwgYnl0ZXNUb1dvcmQoc2FsdC5zbGljZSg0KSldLFxuICAgIGl2OiBbXG4gICAgICBieXRlc1RvV29yZChpdi5zbGljZSgwLCA0KSksXG4gICAgICBieXRlc1RvV29yZChpdi5zbGljZSg0LCA4KSksXG4gICAgICBieXRlc1RvV29yZChpdi5zbGljZSg4LCAxMikpLFxuICAgICAgYnl0ZXNUb1dvcmQoaXYuc2xpY2UoMTIsIDE2KSksXG4gICAgXSxcbiAgfTtcbiAgaWYgKG9wdGlvbnM/LmFkYXRhKSBlbmNyeXB0T3B0aW9ucy5hZGF0YSA9IG9wdGlvbnMuYWRhdGE7XG4gIHJldHVybiBzamNsLmVuY3J5cHQocGFzc3dvcmQsIHBsYWludGV4dCwgZW5jcnlwdE9wdGlvbnMpO1xufVxuXG4vKipcbiAqIEVuY3J5cHQgYHBsYWludGV4dGAgd2l0aCBgcGFzc3dvcmRgLiBEZWZhdWx0cyB0byB2MiAoQXJnb24yaWQgKyBBRVMtMjU2LUdDTSkuXG4gKlxuICogUGFzcyBgZW5jcnlwdGlvblZlcnNpb246IDFgIHRvIHByb2R1Y2UgYSBsZWdhY3kgdjEgKFNKQ0wpIGVudmVsb3BlOyB0aGlzIGlzIHRoZVxuICogb25seSBzdXBwb3J0ZWQgd2F5IHRvIHJlcXVlc3QgdjEgZW5jcnlwdGlvbi5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGVuY3J5cHQoXG4gIHBhc3N3b3JkOiBzdHJpbmcsXG4gIHBsYWludGV4dDogc3RyaW5nLFxuICBvcHRpb25zPzogeyBzYWx0PzogQnVmZmVyOyBpdj86IEJ1ZmZlcjsgYWRhdGE/OiBzdHJpbmc7IGVuY3J5cHRpb25WZXJzaW9uPzogMSB8IDIgfVxuKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgaWYgKG9wdGlvbnM/LmVuY3J5cHRpb25WZXJzaW9uID09PSAxKSB7XG4gICAgcmV0dXJuIGVuY3J5cHRWMShwYXNzd29yZCwgcGxhaW50ZXh0LCBvcHRpb25zKTtcbiAgfVxuICByZXR1cm4gZW5jcnlwdFYyKHBhc3N3b3JkLCBwbGFpbnRleHQsIHsgYWRhdGE6IG9wdGlvbnM/LmFkYXRhIH0pO1xufVxuXG4vKipcbiAqIEl0ZXItY2FwIHZpb2xhdGlvbnMgYXJlIHRoZSBvbmx5IGVycm9yIHdlIHJlZnVzZSB0byBmYWxsIGJhY2sgb246IFNKQ0wgaGFzXG4gKiBubyB1cHBlciBib3VuZCBvbiBgaXRlcmAsIHNvIGZhbGxpbmcgdGhyb3VnaCB0byBpdCB3b3VsZCBsZXQgYSBob3N0aWxlXG4gKiBlbnZlbG9wZSBidXJuIENQVSBydW5uaW5nIGFuIGluZmxhdGVkIFBCS0RGMi4gRXZlcnl0aGluZyBlbHNlIC0tIGNvZGVjXG4gKiByZWplY3Rpb24gb2YgYSBzaGFwZSBTSkNMIHdvdWxkIGFjY2VwdCwgbmF0aXZlIGNyeXB0byBidWcsIGF1dGgtdGFnXG4gKiBtaXNtYXRjaCAtLSBpcyBzYWZlIHRvIGZhbGwgdGhyb3VnaCB0byBTSkNMLlxuICovXG5mdW5jdGlvbiBpc0l0ZXJDYXBWaW9sYXRpb24oZXJyOiB1bmtub3duKTogYm9vbGVhbiB7XG4gIHJldHVybiBlcnIgaW5zdGFuY2VvZiBFcnJvciAmJiAvaXRlcjpcXHMqZXhwZWN0ZWQgaW50ZWdlcnxpdGVyIG91dCBvZiByYW5nZS9pLnRlc3QoZXJyLm1lc3NhZ2UpO1xufVxuXG4vKipcbiAqIHYxIGRlY3J5cHQgd2l0aCBhbiBTSkNMIHNhZmV0eSBuZXQuXG4gKlxuICogRGVzaWduIGludGVudCBkdXJpbmcgcm9sbG91dDogemVybyBmYWxzZSBuZWdhdGl2ZXMuIEFueSBuYXRpdmUgZmFpbHVyZVxuICogKGVudmVsb3BlIHNoYXBlIG91ciBzdHJpY3RlciBjb2RlYyByZWplY3RzLCBmcmFtaW5nIGJ1ZywgdW5zdXBwb3J0ZWRcbiAqIGFsZ29yaXRobSwgYXV0aC10YWcgbWlzbWF0Y2gsIGV0Yy4pIGZhbGxzIHRocm91Z2ggdG8gYHNqY2wuZGVjcnlwdGAgc28gdGhlXG4gKiBjYWxsZXIgaXMgbmV2ZXIgYmxvY2tlZC4gVGhlIG9ubHkgZXhjZXB0aW9uIGlzIGFuIGl0ZXItY2FwIHZpb2xhdGlvbixcbiAqIHdoaWNoIGlzIHJldGhyb3duIHRvIHByZXNlcnZlIERvUyBwcm90ZWN0aW9uLlxuICpcbiAqIFRoZSBjb25zb2xlLndhcm4gb25seSBmaXJlcyB3aGVuIG5hdGl2ZSBmYWlscyBBTkQgU0pDTCBzdWNjZWVkcyAtLSBpLmUuXG4gKiB3aGVuIHRoZSB0d28gZW5naW5lcyBkaXNhZ3JlZSwgd2hpY2ggaXMgdGhlIG9ubHkgc2lnbmFsIHdvcnRoXG4gKiBpbnZlc3RpZ2F0aW5nLiBXcm9uZyBwYXNzd29yZCBmYWlscyBib3RoIGVuZ2luZXMgc2lsZW50bHkgYW5kIHN1cmZhY2VzXG4gKiBTSkNMJ3MgYXV0aCBlcnJvciAobWFwcGVkIHVwc3RyZWFtIHRvIFwiaW5jb3JyZWN0IHBhc3N3b3JkXCIpLlxuICpcbiAqIGBuYXRpdmVgIGRlZmF1bHRzIHRvIHRoZSBtb2R1bGUncyBgZGVjcnlwdFYxYCBidXQgaXMgZXhwb3NlZCBhcyBhIHBhcmFtZXRlclxuICogc28gdGVzdHMgY2FuIGluamVjdCBhIHRocm93aW5nIHZlcnNpb24gdG8gZXhlcmNpc2UgdGhlIGZhbGxiYWNrIHBhdGguXG4gKiBgaXNCcm93c2VyYCBkZWZhdWx0cyB0byBhIHJlYWwgcnVudGltZSBjaGVjayBidXQgaXMgZXhwb3NlZCBzbyB0ZXN0cyBjYW5cbiAqIGV4ZXJjaXNlIHRoZSBicm93c2VyLW9ubHkgYnJhbmNoIHVuZGVyIE5vZGUuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBkZWNyeXB0VjFXaXRoRmFsbGJhY2soXG4gIHBhc3N3b3JkOiBzdHJpbmcsXG4gIGNpcGhlcnRleHQ6IHN0cmluZyxcbiAgbmF0aXZlOiAocHc6IHN0cmluZywgY3Q6IHN0cmluZykgPT4gUHJvbWlzZTxzdHJpbmc+ID0gZGVjcnlwdFYxLFxuICBpc0Jyb3dzZXI6IGJvb2xlYW4gPSBpc0Jyb3dzZXJSdW50aW1lXG4pOiBQcm9taXNlPHN0cmluZz4ge1xuICBpZiAoaXNCcm93c2VyKSB7XG4gICAgYXNzZXJ0SXRlcldpdGhpbkNhcChjaXBoZXJ0ZXh0KTtcbiAgICByZXR1cm4gc2pjbC5kZWNyeXB0KHBhc3N3b3JkLCBjaXBoZXJ0ZXh0KTtcbiAgfVxuICB0cnkge1xuICAgIHJldHVybiBhd2FpdCBuYXRpdmUocGFzc3dvcmQsIGNpcGhlcnRleHQpO1xuICB9IGNhdGNoIChuYXRpdmVFcnIpIHtcbiAgICBpZiAoaXNJdGVyQ2FwVmlvbGF0aW9uKG5hdGl2ZUVycikpIHRocm93IG5hdGl2ZUVycjtcbiAgICBsZXQgcmVzdWx0OiBzdHJpbmc7XG4gICAgdHJ5IHtcbiAgICAgIHJlc3VsdCA9IHNqY2wuZGVjcnlwdChwYXNzd29yZCwgY2lwaGVydGV4dCk7XG4gICAgfSBjYXRjaCAoc2pjbEVycikge1xuICAgICAgLy8gQm90aCBlbmdpbmVzIHJlamVjdGVkIC0tIGFsbW9zdCBjZXJ0YWlubHkgYSByZWFsIGF1dGggZmFpbHVyZS5cbiAgICAgIC8vIFJldGhyb3cgU0pDTCdzIGVycm9yIHNvIEJpdEdvQVBJLmRlY3J5cHQgbWFwcyBpdCB0byBcImluY29ycmVjdCBwYXNzd29yZFwiLlxuICAgICAgdGhyb3cgc2pjbEVycjtcbiAgICB9XG4gICAgLy8gTmF0aXZlIGZhaWxlZCBidXQgU0pDTCBzdWNjZWVkZWQgLS0gcmVhbCBzaWduYWwsIGxvZyBmb3IgdGhlIG9wZXJhdG9yLlxuICAgIGNvbnN0IG1lc3NhZ2UgPSBuYXRpdmVFcnIgaW5zdGFuY2VvZiBFcnJvciA/IG5hdGl2ZUVyci5tZXNzYWdlIDogU3RyaW5nKG5hdGl2ZUVycik7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNvbnNvbGVcbiAgICBjb25zb2xlLndhcm4oJ1tiaXRnby1zZGtdIHYxIG5hdGl2ZSBkZWNyeXB0IGZhaWxlZDsgU0pDTCBmYWxsYmFjayBzdWNjZWVkZWQ6JywgbWVzc2FnZSk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxufVxuXG4vKipcbiAqIEF1dG8tZGV0ZWN0IHYxIChQQktERjItU0hBMjU2ICsgQUVTLUNDTSkgb3IgdjIgKEFyZ29uMmlkICsgQUVTLTI1Ni1HQ00pXG4gKiBmcm9tIHRoZSBlbnZlbG9wZSBgdmAgZmllbGQgYW5kIGRlY3J5cHQuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBkZWNyeXB0KHBhc3N3b3JkOiBzdHJpbmcsIGNpcGhlcnRleHQ6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nPiB7XG4gIGxldCBlbnZlbG9wZVZlcnNpb246IG51bWJlciB8IHVuZGVmaW5lZDtcbiAgdHJ5IHtcbiAgICBjb25zdCBlbnZlbG9wZSA9IEpTT04ucGFyc2UoY2lwaGVydGV4dCk7XG4gICAgZW52ZWxvcGVWZXJzaW9uID0gZW52ZWxvcGUudjtcbiAgfSBjYXRjaCB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdkZWNyeXB0OiBjaXBoZXJ0ZXh0IGlzIG5vdCB2YWxpZCBKU09OJyk7XG4gIH1cbiAgaWYgKGVudmVsb3BlVmVyc2lvbiA9PT0gMikge1xuICAgIC8vIERvIG5vdCBjYXRjaDogd3JvbmcgcGFzc3dvcmQgb24gdjIgbXVzdCBub3Qgc2lsZW50bHkgZmFsbCB0aHJvdWdoIHRvIHYxLlxuICAgIHJldHVybiBkZWNyeXB0VjIocGFzc3dvcmQsIGNpcGhlcnRleHQpO1xuICB9XG4gIGlmIChlbnZlbG9wZVZlcnNpb24gIT09IHVuZGVmaW5lZCAmJiBlbnZlbG9wZVZlcnNpb24gIT09IDEpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYGRlY3J5cHQ6IHVua25vd24gZW52ZWxvcGUgdmVyc2lvbiAke2VudmVsb3BlVmVyc2lvbn1gKTtcbiAgfVxuICByZXR1cm4gZGVjcnlwdFYxV2l0aEZhbGxiYWNrKHBhc3N3b3JkLCBjaXBoZXJ0ZXh0KTtcbn1cbiJdfQ==
@@ -0,0 +1,67 @@
1
+ import * as t from 'io-ts';
2
+ /** Default Argon2id parameters per RFC 9106 second recommendation
3
+ * @see https://www.rfc-editor.org/rfc/rfc9106#section-4
4
+ */
5
+ export declare const ARGON2_DEFAULTS: {
6
+ readonly memorySize: 65536;
7
+ readonly iterations: 3;
8
+ readonly parallelism: 4;
9
+ readonly hashLength: 32;
10
+ readonly saltLength: 16;
11
+ };
12
+ /** AES-256-GCM IV length in bytes */
13
+ export declare const GCM_IV_LENGTH = 12;
14
+ /** HKDF per-call salt length in bytes */
15
+ export declare const HKDF_SALT_LENGTH = 32;
16
+ declare const V2EnvelopeCodec: t.IntersectionC<[t.TypeC<{
17
+ v: t.LiteralC<2>;
18
+ iv: t.Type<string, string, unknown>;
19
+ ct: t.Type<string, string, unknown>;
20
+ }>, t.PartialC<{
21
+ m: t.Type<number, number, unknown>;
22
+ t: t.Type<number, number, unknown>;
23
+ p: t.Type<number, number, unknown>;
24
+ salt: t.Type<string, string, unknown>;
25
+ /** Base64-encoded HKDF salt -- session envelopes and HKDF-only envelopes */
26
+ hkdfSalt: t.Type<string, string, unknown>;
27
+ /** Additional authenticated data for context binding (e.g. transaction hash + derivation path) */
28
+ adata: t.StringC;
29
+ }>]>;
30
+ export type V2Envelope = t.TypeOf<typeof V2EnvelopeCodec>;
31
+ export declare function argon2ToHkdfKey(password: string, salt: Uint8Array, params: {
32
+ memorySize: number;
33
+ iterations: number;
34
+ parallelism: number;
35
+ }): Promise<CryptoKey>;
36
+ export declare function hkdfDeriveAesKey(hkdfKey: CryptoKey, hkdfSalt: Uint8Array, usage: KeyUsage, info?: Uint8Array): Promise<CryptoKey>;
37
+ export declare function aesGcmEncrypt(key: CryptoKey, iv: Uint8Array, plaintext: string, additionalData?: Uint8Array): Promise<Uint8Array>;
38
+ export declare function aesGcmDecrypt(key: CryptoKey, iv: Uint8Array, ct: Uint8Array, additionalData?: Uint8Array): Promise<string>;
39
+ export declare function parseV2Envelope(ciphertext: string): V2Envelope;
40
+ /**
41
+ * Encrypt plaintext using Argon2id KDF + AES-256-GCM.
42
+ *
43
+ * Returns a self-describing JSON v2 envelope containing all Argon2id parameters,
44
+ * salt, IV, and ciphertext -- fully standalone for decryption.
45
+ *
46
+ * For multi-call operations (MPC signing, wallet creation), prefer
47
+ * createEncryptionSession to run Argon2id once and derive per-call keys via HKDF.
48
+ */
49
+ export declare function encryptV2(password: string, plaintext: string, options?: {
50
+ salt?: Uint8Array;
51
+ iv?: Uint8Array;
52
+ memorySize?: number;
53
+ iterations?: number;
54
+ parallelism?: number;
55
+ adata?: string;
56
+ }): Promise<string>;
57
+ /**
58
+ * Decrypt a v2 envelope. Auto-detects shape:
59
+ * - Standard (Argon2 params, no hkdfSalt): Argon2id -> AES-GCM
60
+ * - Session (Argon2 params + hkdfSalt): Argon2id -> HKDF -> AES-GCM
61
+ * - HKDF-only (hkdfSalt, no Argon2 params): HKDF(password) -> AES-GCM
62
+ *
63
+ * All parameters are stored in the envelope -- no session context required.
64
+ */
65
+ export declare function decryptV2(password: string, ciphertext: string): Promise<string>;
66
+ export {};
67
+ //# sourceMappingURL=encryptV2.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"encryptV2.d.ts","sourceRoot":"","sources":["../../src/encryptV2.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,CAAC,MAAM,OAAO,CAAC;AAK3B;;GAEG;AACH,eAAO,MAAM,eAAe;;;;;;CAMlB,CAAC;AAaX,qCAAqC;AACrC,eAAO,MAAM,aAAa,KAAK,CAAC;AAEhC,yCAAyC;AACzC,eAAO,MAAM,gBAAgB,KAAK,CAAC;AAcnC,QAAA,MAAM,eAAe;;;;;;;;;IAWjB,4EAA4E;;IAE5E,kGAAkG;;IAGpG,CAAC;AAEH,MAAM,MAAM,UAAU,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,eAAe,CAAC,CAAC;AAgD1D,wBAAsB,eAAe,CACnC,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,UAAU,EAChB,MAAM,EAAE;IAAE,UAAU,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,CAAA;CAAE,GACtE,OAAO,CAAC,SAAS,CAAC,CAGpB;AAOD,wBAAgB,gBAAgB,CAC9B,OAAO,EAAE,SAAS,EAClB,QAAQ,EAAE,UAAU,EACpB,KAAK,EAAE,QAAQ,EACf,IAAI,GAAE,UAA8B,GACnC,OAAO,CAAC,SAAS,CAAC,CAQpB;AAED,wBAAsB,aAAa,CACjC,GAAG,EAAE,SAAS,EACd,EAAE,EAAE,UAAU,EACd,SAAS,EAAE,MAAM,EACjB,cAAc,CAAC,EAAE,UAAU,GAC1B,OAAO,CAAC,UAAU,CAAC,CAKrB;AAED,wBAAsB,aAAa,CACjC,GAAG,EAAE,SAAS,EACd,EAAE,EAAE,UAAU,EACd,EAAE,EAAE,UAAU,EACd,cAAc,CAAC,EAAE,UAAU,GAC1B,OAAO,CAAC,MAAM,CAAC,CAKjB;AAED,wBAAgB,eAAe,CAAC,UAAU,EAAE,MAAM,GAAG,UAAU,CAY9D;AAID;;;;;;;;GAQG;AACH,wBAAsB,SAAS,CAC7B,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,MAAM,EACjB,OAAO,CAAC,EAAE;IACR,IAAI,CAAC,EAAE,UAAU,CAAC;IAClB,EAAE,CAAC,EAAE,UAAU,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,GACA,OAAO,CAAC,MAAM,CAAC,CA0BjB;AAED;;;;;;;GAOG;AACH,wBAAsB,SAAS,CAAC,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CA6BrF"}