@wemush/wols 0.1.0 → 1.3.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 (121) hide show
  1. package/CHANGELOG.md +170 -0
  2. package/README.md +204 -31
  3. package/dist/cjs/compact-url.d.ts +150 -0
  4. package/dist/cjs/compact-url.d.ts.map +1 -0
  5. package/dist/cjs/compact-url.js +64 -0
  6. package/dist/cjs/compact-url.js.map +1 -1
  7. package/dist/cjs/crypto/decrypt.d.ts +110 -0
  8. package/dist/cjs/crypto/decrypt.d.ts.map +1 -0
  9. package/dist/cjs/crypto/decrypt.js +521 -90
  10. package/dist/cjs/crypto/decrypt.js.map +1 -1
  11. package/dist/cjs/crypto/encrypt.d.ts +132 -0
  12. package/dist/cjs/crypto/encrypt.d.ts.map +1 -0
  13. package/dist/cjs/crypto/encrypt.js +288 -105
  14. package/dist/cjs/crypto/encrypt.js.map +1 -1
  15. package/dist/cjs/crypto/index.d.ts +12 -0
  16. package/dist/cjs/crypto/index.d.ts.map +1 -0
  17. package/dist/cjs/crypto/index.js +15 -2
  18. package/dist/cjs/crypto/index.js.map +1 -1
  19. package/dist/cjs/crypto/shared.d.ts +116 -0
  20. package/dist/cjs/crypto/shared.d.ts.map +1 -0
  21. package/dist/cjs/crypto/shared.js +238 -0
  22. package/dist/cjs/crypto/shared.js.map +1 -0
  23. package/dist/cjs/errors.d.ts +133 -0
  24. package/dist/cjs/errors.d.ts.map +1 -0
  25. package/dist/cjs/errors.js +39 -1
  26. package/dist/cjs/errors.js.map +1 -1
  27. package/dist/cjs/index.d.ts +29 -0
  28. package/dist/cjs/index.d.ts.map +1 -0
  29. package/dist/cjs/index.js +70 -3
  30. package/dist/cjs/index.js.map +1 -1
  31. package/dist/cjs/package.json +3 -0
  32. package/dist/cjs/parser.d.ts +30 -0
  33. package/dist/cjs/parser.d.ts.map +1 -0
  34. package/dist/cjs/parser.js +3 -0
  35. package/dist/cjs/parser.js.map +1 -1
  36. package/dist/cjs/qr/generate.d.ts +62 -0
  37. package/dist/cjs/qr/generate.d.ts.map +1 -0
  38. package/dist/cjs/qr/index.d.ts +10 -0
  39. package/dist/cjs/qr/index.d.ts.map +1 -0
  40. package/dist/cjs/specimen.d.ts +96 -0
  41. package/dist/cjs/specimen.d.ts.map +1 -0
  42. package/dist/cjs/specimen.js +95 -9
  43. package/dist/cjs/specimen.js.map +1 -1
  44. package/dist/cjs/types.d.ts +735 -0
  45. package/dist/cjs/types.d.ts.map +1 -0
  46. package/dist/cjs/types.js +327 -3
  47. package/dist/cjs/types.js.map +1 -1
  48. package/dist/cjs/utils/cuid.d.ts +46 -0
  49. package/dist/cjs/utils/cuid.d.ts.map +1 -0
  50. package/dist/cjs/utils/cuid.js +6 -4
  51. package/dist/cjs/utils/cuid.js.map +1 -1
  52. package/dist/cjs/utils/environment.d.ts +137 -0
  53. package/dist/cjs/utils/environment.d.ts.map +1 -0
  54. package/dist/cjs/utils/environment.js +206 -0
  55. package/dist/cjs/utils/environment.js.map +1 -0
  56. package/dist/cjs/utils/iso8601.d.ts +79 -0
  57. package/dist/cjs/utils/iso8601.d.ts.map +1 -0
  58. package/dist/cjs/utils/migration.d.ts +162 -0
  59. package/dist/cjs/utils/migration.d.ts.map +1 -0
  60. package/dist/cjs/utils/migration.js +248 -0
  61. package/dist/cjs/utils/migration.js.map +1 -0
  62. package/dist/cjs/validator.d.ts +25 -0
  63. package/dist/cjs/validator.d.ts.map +1 -0
  64. package/dist/cjs/validator.js +85 -21
  65. package/dist/cjs/validator.js.map +1 -1
  66. package/dist/esm/compact-url.js +62 -0
  67. package/dist/esm/compact-url.js.map +1 -1
  68. package/dist/esm/crypto/decrypt.js +517 -90
  69. package/dist/esm/crypto/decrypt.js.map +1 -1
  70. package/dist/esm/crypto/encrypt.js +284 -105
  71. package/dist/esm/crypto/encrypt.js.map +1 -1
  72. package/dist/esm/crypto/index.js +5 -3
  73. package/dist/esm/crypto/index.js.map +1 -1
  74. package/dist/esm/crypto/shared.js +222 -0
  75. package/dist/esm/crypto/shared.js.map +1 -0
  76. package/dist/esm/errors.js +37 -0
  77. package/dist/esm/errors.js.map +1 -1
  78. package/dist/esm/index.js +26 -6
  79. package/dist/esm/index.js.map +1 -1
  80. package/dist/esm/parser.js +3 -0
  81. package/dist/esm/parser.js.map +1 -1
  82. package/dist/esm/specimen.js +95 -10
  83. package/dist/esm/specimen.js.map +1 -1
  84. package/dist/esm/types.js +317 -2
  85. package/dist/esm/types.js.map +1 -1
  86. package/dist/esm/utils/cuid.js +6 -4
  87. package/dist/esm/utils/cuid.js.map +1 -1
  88. package/dist/esm/utils/environment.js +193 -0
  89. package/dist/esm/utils/environment.js.map +1 -0
  90. package/dist/esm/utils/migration.js +237 -0
  91. package/dist/esm/utils/migration.js.map +1 -0
  92. package/dist/esm/validator.js +86 -22
  93. package/dist/esm/validator.js.map +1 -1
  94. package/dist/types/compact-url.d.ts +46 -0
  95. package/dist/types/compact-url.d.ts.map +1 -1
  96. package/dist/types/crypto/decrypt.d.ts +95 -18
  97. package/dist/types/crypto/decrypt.d.ts.map +1 -1
  98. package/dist/types/crypto/encrypt.d.ts +114 -14
  99. package/dist/types/crypto/encrypt.d.ts.map +1 -1
  100. package/dist/types/crypto/index.d.ts +5 -3
  101. package/dist/types/crypto/index.d.ts.map +1 -1
  102. package/dist/types/crypto/shared.d.ts +116 -0
  103. package/dist/types/crypto/shared.d.ts.map +1 -0
  104. package/dist/types/errors.d.ts +31 -1
  105. package/dist/types/errors.d.ts.map +1 -1
  106. package/dist/types/index.d.ts +15 -7
  107. package/dist/types/index.d.ts.map +1 -1
  108. package/dist/types/parser.d.ts.map +1 -1
  109. package/dist/types/specimen.d.ts +29 -4
  110. package/dist/types/specimen.d.ts.map +1 -1
  111. package/dist/types/types.d.ts +483 -17
  112. package/dist/types/types.d.ts.map +1 -1
  113. package/dist/types/utils/cuid.d.ts +5 -3
  114. package/dist/types/utils/cuid.d.ts.map +1 -1
  115. package/dist/types/utils/environment.d.ts +137 -0
  116. package/dist/types/utils/environment.d.ts.map +1 -0
  117. package/dist/types/utils/migration.d.ts +162 -0
  118. package/dist/types/utils/migration.d.ts.map +1 -0
  119. package/dist/types/validator.d.ts +1 -1
  120. package/dist/types/validator.d.ts.map +1 -1
  121. package/package.json +32 -14
@@ -1 +1 @@
1
- {"version":3,"file":"decrypt.js","sourceRoot":"","sources":["../../../src/crypto/decrypt.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"decrypt.js","sourceRoot":"","sources":["../../../src/crypto/decrypt.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,132 @@
1
+ /**
2
+ * WOLS Encryption Module (WOLS v1.3.0 encrypted format)
3
+ *
4
+ * AES-256-GCM via WebCrypto, so it runs in Node.js 20+, browsers, Deno and Bun.
5
+ *
6
+ * ## Wire format
7
+ *
8
+ * ```
9
+ * wemush://v1/encrypted/{id}?e={ciphertext}&iv={iv}&kdf={pbkdf2|raw}[&salt={salt}&i={iterations}]
10
+ * ```
11
+ *
12
+ * - `e`: ciphertext with the 16-byte GCM tag appended
13
+ * - `iv`: fresh random 12-byte IV per encryption
14
+ * - All binary values are base64url without padding
15
+ *
16
+ * ## Keys
17
+ *
18
+ * | `key` value | `kdf` | Notes |
19
+ * |-------------|-------|-------|
20
+ * | `string` passphrase | `pbkdf2` | PBKDF2-HMAC-SHA256, fresh random 16-byte salt per label, ≥100,000 iterations |
21
+ * | 32-byte `Uint8Array` / `ArrayBuffer` | `raw` | Key shared out of band |
22
+ * | AES-GCM 256 `CryptoKey` | `raw` | Key shared out of band |
23
+ *
24
+ * Pre-1.3.0 releases derived passphrase keys with a fixed library-wide salt.
25
+ * That scheme is never generated any more; see `allowLegacy` on decryption.
26
+ *
27
+ * @module crypto/encrypt
28
+ */
29
+ import type { EncryptedField, EncryptedSpecimen, EncryptionOptions, FieldEncryptedSpecimen, FieldEncryptedSpecimenOf, FieldEncryptionOptions, Specimen } from '../types.js';
30
+ /**
31
+ * Build the encrypted-format URL for an encrypted specimen.
32
+ *
33
+ * Enforces the generator rules, so a hand-built object cannot produce a
34
+ * non-conformant label:
35
+ * - `payload` and `iv` are canonical unpadded base64url, the IV is 12 bytes,
36
+ * and the payload is at least the 16-byte GCM tag
37
+ * - `kdf` is present: `pbkdf2` needs 100,000 to 2^32-1 iterations and a salt
38
+ * of at least 16 bytes that is not the legacy library salt (compared as
39
+ * bytes); `raw` must not carry `salt` or `iterations`
40
+ *
41
+ * Labels with more than 10,000,000 iterations are valid but exceed the
42
+ * decoders' default `maxIterations`, so readers must raise it.
43
+ *
44
+ * @throws WolsEncryptionError when the object would produce a non-conformant
45
+ * label (including legacy payloads, which are never generated)
46
+ * @since 1.3.0
47
+ */
48
+ export declare function toEncryptedUrl(encrypted: EncryptedSpecimen): string;
49
+ /**
50
+ * Encrypt a whole specimen with AES-256-GCM (WOLS v1.3.0 encrypted format).
51
+ *
52
+ * The specimen's embedded JSON-LD serialization is encrypted and the result
53
+ * carries `url`, the `wemush://v1/encrypted/...` string to encode in a QR code.
54
+ * For field-level encryption use {@link encryptFields}.
55
+ *
56
+ * @param specimen - The specimen to encrypt
57
+ * @param options - `key` (passphrase or raw key) and optional `iterations`
58
+ * @throws WolsEncryptionError for an unusable key, too few iterations, an id
59
+ * without a suffix, or a runtime without WebCrypto
60
+ *
61
+ * @example
62
+ * ```typescript
63
+ * // Passphrase: kdf=pbkdf2 with a random per-label salt
64
+ * const enc = await encryptSpecimen(specimen, { key: 'correct horse battery staple' });
65
+ * enc.url; // 'wemush://v1/encrypted/clx1a2b3c4?e=...&iv=...&kdf=pbkdf2&salt=...&i=100000'
66
+ *
67
+ * // Raw 32-byte key: kdf=raw
68
+ * const raw = await encryptSpecimen(specimen, { key: crypto.getRandomValues(new Uint8Array(32)) });
69
+ * ```
70
+ *
71
+ * @since 1.3.0 Per-label random salt, `kdf`, `id` and `url`; raw key bytes accepted.
72
+ * The `fields` option is deprecated in favor of `encryptFields()`.
73
+ */
74
+ export declare function encryptSpecimen(specimen: Specimen, options: EncryptionOptions & {
75
+ fields: readonly string[];
76
+ }): Promise<FieldEncryptedSpecimen>;
77
+ export declare function encryptSpecimen(specimen: Specimen, options: EncryptionOptions): Promise<EncryptedSpecimen>;
78
+ /**
79
+ * Field-level encryption (WOLS v1.3.0): replace the value of each named field
80
+ * with an {@link EncryptedField} and leave the rest of the specimen in cleartext.
81
+ *
82
+ * One key (and, for passphrases, one random salt) per call; a fresh IV per field.
83
+ * Each value is bound to its label and field with AES-GCM additional data:
84
+ * the UTF-8 of `"{id}\n{field}"` (WOLS 1.3.0). A value moved to another field
85
+ * or copied into another label fails authentication. Restore with `decryptFields()`.
86
+ *
87
+ * The identifying fields (`@context`, `@type`, `id`, `version`, `type`,
88
+ * `species`) can't be encrypted.
89
+ *
90
+ * @param specimen - The specimen to partially encrypt
91
+ * @param options - `key`, `fields` (each must be present on the specimen), optional `iterations`
92
+ * @throws WolsEncryptionError when `fields` is empty, names a field the specimen
93
+ * does not have, or names a field twice; or for an unusable key
94
+ *
95
+ * @example
96
+ * ```typescript
97
+ * const partial = await encryptFields(specimen, { key: passphrase, fields: ['strain'] });
98
+ * partial.species; // still cleartext
99
+ * partial.strain; // { encrypted: true, algorithm: 'AES-256-GCM', payload, iv, kdf: 'pbkdf2', salt, iterations }
100
+ * ```
101
+ *
102
+ * @since 1.3.0
103
+ */
104
+ export declare function encryptFields<K extends keyof Specimen>(specimen: Specimen, options: FieldEncryptionOptions<K>): Promise<FieldEncryptedSpecimenOf<K>>;
105
+ /**
106
+ * Whether a value is a field-level {@link EncryptedField}: an encrypted value
107
+ * with a `kdf` and no specimen `id` or `url`.
108
+ *
109
+ * The 1.3.0 shapes are told apart structurally: whole-label objects produced
110
+ * by `encryptSpecimen` and `parseEncryptedUrl` always carry `id`, and field
111
+ * values never do. Legacy (pre-1.3.0) values have no `kdf` and are reported
112
+ * as {@link isEncryptedSpecimen}, whether they were whole labels or fields.
113
+ * `decryptFields` handles legacy field values regardless (with `allowLegacy`).
114
+ *
115
+ * @since 1.3.0
116
+ */
117
+ export declare function isEncryptedField(value: unknown): value is EncryptedField;
118
+ /**
119
+ * Whether a value is a whole-label {@link EncryptedSpecimen} (v1.3.0 or legacy).
120
+ *
121
+ * @since 1.3.0
122
+ */
123
+ export declare function isEncryptedSpecimen(value: unknown): value is EncryptedSpecimen;
124
+ /**
125
+ * Whether a value carries the `encrypted: true` marker: either a whole-label
126
+ * {@link EncryptedSpecimen} or a field-level {@link EncryptedField}. Use
127
+ * {@link isEncryptedSpecimen} or {@link isEncryptedField} to tell them apart.
128
+ *
129
+ * @since 1.3.0 Narrows to `EncryptedSpecimen | EncryptedField`
130
+ */
131
+ export declare function isEncrypted(value: unknown): value is EncryptedSpecimen | EncryptedField;
132
+ //# sourceMappingURL=encrypt.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"encrypt.d.ts","sourceRoot":"","sources":["../../../src/crypto/encrypt.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AAIH,OAAO,KAAK,EACV,cAAc,EACd,iBAAiB,EAEjB,iBAAiB,EACjB,sBAAsB,EACtB,wBAAwB,EACxB,sBAAsB,EACtB,QAAQ,EACT,MAAM,aAAa,CAAC;AA+IrB;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,cAAc,CAAC,SAAS,EAAE,iBAAiB,GAAG,MAAM,CAmCnE;AAMD;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,wBAAsB,eAAe,CACnC,QAAQ,EAAE,QAAQ,EAClB,OAAO,EAAE,iBAAiB,GAAG;IAAE,MAAM,EAAE,SAAS,MAAM,EAAE,CAAA;CAAE,GACzD,OAAO,CAAC,sBAAsB,CAAC,CAAC;AACnC,wBAAsB,eAAe,CACnC,QAAQ,EAAE,QAAQ,EAClB,OAAO,EAAE,iBAAiB,GACzB,OAAO,CAAC,iBAAiB,CAAC,CAAC;AAuC9B;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,wBAAsB,aAAa,CAAC,CAAC,SAAS,MAAM,QAAQ,EAC1D,QAAQ,EAAE,QAAQ,EAClB,OAAO,EAAE,sBAAsB,CAAC,CAAC,CAAC,GACjC,OAAO,CAAC,wBAAwB,CAAC,CAAC,CAAC,CAAC,CAuDtC;AAgBD;;;;;;;;;;;GAWG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,cAAc,CAOxE;AAED;;;;GAIG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,iBAAiB,CAE9E;AAED;;;;;;GAMG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,iBAAiB,GAAG,cAAc,CAKvF"}
@@ -1,151 +1,334 @@
1
1
  "use strict";
2
2
  /**
3
- * WOLS Encryption Module
3
+ * WOLS Encryption Module (WOLS v1.3.0 encrypted format)
4
4
  *
5
- * Provides AES-256-GCM encryption for specimens using Web Crypto API.
6
- * Supports both password-based (PBKDF2) and raw CryptoKey encryption.
5
+ * AES-256-GCM via WebCrypto, so it runs in Node.js 20+, browsers, Deno and Bun.
6
+ *
7
+ * ## Wire format
8
+ *
9
+ * ```
10
+ * wemush://v1/encrypted/{id}?e={ciphertext}&iv={iv}&kdf={pbkdf2|raw}[&salt={salt}&i={iterations}]
11
+ * ```
12
+ *
13
+ * - `e`: ciphertext with the 16-byte GCM tag appended
14
+ * - `iv`: fresh random 12-byte IV per encryption
15
+ * - All binary values are base64url without padding
16
+ *
17
+ * ## Keys
18
+ *
19
+ * | `key` value | `kdf` | Notes |
20
+ * |-------------|-------|-------|
21
+ * | `string` passphrase | `pbkdf2` | PBKDF2-HMAC-SHA256, fresh random 16-byte salt per label, ≥100,000 iterations |
22
+ * | 32-byte `Uint8Array` / `ArrayBuffer` | `raw` | Key shared out of band |
23
+ * | AES-GCM 256 `CryptoKey` | `raw` | Key shared out of band |
24
+ *
25
+ * Pre-1.3.0 releases derived passphrase keys with a fixed library-wide salt.
26
+ * That scheme is never generated any more; see `allowLegacy` on decryption.
7
27
  *
8
28
  * @module crypto/encrypt
9
29
  */
10
30
  Object.defineProperty(exports, "__esModule", { value: true });
31
+ exports.toEncryptedUrl = toEncryptedUrl;
11
32
  exports.encryptSpecimen = encryptSpecimen;
33
+ exports.encryptFields = encryptFields;
34
+ exports.isEncryptedField = isEncryptedField;
35
+ exports.isEncryptedSpecimen = isEncryptedSpecimen;
12
36
  exports.isEncrypted = isEncrypted;
37
+ const errors_js_1 = require("../errors.js");
13
38
  const specimen_js_1 = require("../specimen.js");
14
- // =============================================================================
15
- // CONSTANTS
16
- // =============================================================================
17
- /** Salt for PBKDF2 key derivation (fixed for deterministic key from same password) */
18
- const PBKDF2_SALT = new TextEncoder().encode('@wemush/wols/crypto/v1');
19
- /** Number of PBKDF2 iterations */
20
- const PBKDF2_ITERATIONS = 100_000;
21
- /** IV length in bytes (96 bits = 12 bytes recommended for GCM) */
22
- const IV_LENGTH = 12;
23
- // =============================================================================
24
- // UTILITY FUNCTIONS
25
- // =============================================================================
26
- /**
27
- * Convert ArrayBuffer to base64url string
28
- */
29
- function toBase64Url(buffer) {
30
- const bytes = new Uint8Array(buffer);
31
- let binary = '';
32
- for (const byte of bytes) {
33
- binary += String.fromCharCode(byte);
39
+ const shared_js_1 = require("./shared.js");
40
+ function encryptionError(message, code = errors_js_1.WolsErrorCode.ENCRYPTION_ERROR) {
41
+ throw new errors_js_1.WolsEncryptionError(code, message);
42
+ }
43
+ /** Generators MUST use 100,000 to 10,000,000 iterations (WOLS 1.3.0). */
44
+ function checkGenerateIterations(iterations) {
45
+ if (typeof iterations !== 'number' ||
46
+ !Number.isInteger(iterations) ||
47
+ iterations < shared_js_1.MIN_GENERATE_ITERATIONS ||
48
+ iterations > shared_js_1.MAX_ITERATIONS) {
49
+ return encryptionError(`PBKDF2 iterations must be an integer from ${shared_js_1.MIN_GENERATE_ITERATIONS} to ` +
50
+ `${shared_js_1.MAX_ITERATIONS}, got ${String(iterations)}`);
51
+ }
52
+ return iterations;
53
+ }
54
+ /** Decode canonical, unpadded base64url, or throw an encryption error naming the parameter. */
55
+ function canonicalBytes(name, value) {
56
+ let bytes;
57
+ if (typeof value === 'string' && !value.includes('=')) {
58
+ try {
59
+ bytes = (0, shared_js_1.base64UrlDecode)(value);
60
+ }
61
+ catch {
62
+ bytes = undefined;
63
+ }
64
+ }
65
+ // Re-encoding catches non-canonical spellings (non-zero trailing bits) that
66
+ // decode to the same bytes as a different string.
67
+ if (bytes === undefined || (0, shared_js_1.base64UrlEncode)(bytes) !== value) {
68
+ return encryptionError(`${name} must be canonical base64url without padding`);
34
69
  }
35
- return btoa(binary).replace(/\+/g, '-').replace(/\//g, '_').replace(/=+$/, '');
70
+ return bytes;
71
+ }
72
+ function bytesEqual(a, b) {
73
+ return a.length === b.length && a.every((byte, i) => byte === b[i]);
36
74
  }
75
+ /** Identifying fields (WOLS 1.3.0) stay in cleartext so labels remain routable. */
76
+ const STRUCTURAL_FIELDS = new Set(shared_js_1.IDENTIFYING_FIELDS);
37
77
  /**
38
- * Derive a CryptoKey from a password using PBKDF2
78
+ * Turn the caller's key into an AES key plus the parameters to record.
79
+ * A passphrase gets a fresh random salt for every call (one call = one label).
39
80
  */
40
- async function deriveKey(password) {
41
- const encoder = new TextEncoder();
42
- const passwordBytes = encoder.encode(password);
43
- // Import password as key material
44
- const keyMaterial = await crypto.subtle.importKey('raw', passwordBytes, 'PBKDF2', false, [
45
- 'deriveKey',
46
- ]);
47
- // Derive AES-256-GCM key
48
- return crypto.subtle.deriveKey({
49
- name: 'PBKDF2',
50
- salt: PBKDF2_SALT,
51
- iterations: PBKDF2_ITERATIONS,
52
- hash: 'SHA-256',
53
- }, keyMaterial, { name: 'AES-GCM', length: 256 }, false, ['encrypt']);
81
+ async function resolveEncryptionKey(options) {
82
+ const { key } = options;
83
+ if ((0, shared_js_1.isPassphrase)(key)) {
84
+ const iterations = checkGenerateIterations(options.iterations ?? shared_js_1.DEFAULT_PBKDF2_ITERATIONS);
85
+ const salt = (0, shared_js_1.randomBytes)(shared_js_1.SALT_LENGTH);
86
+ const keyBytes = await (0, shared_js_1.derivePassphraseKey)(key, salt, iterations);
87
+ return {
88
+ cryptoKey: await (0, shared_js_1.importAesKey)(keyBytes, 'encrypt'),
89
+ kdf: 'pbkdf2',
90
+ salt: (0, shared_js_1.base64UrlEncode)(salt),
91
+ iterations,
92
+ };
93
+ }
94
+ if ((0, shared_js_1.isRawKey)(key)) {
95
+ const resolved = await (0, shared_js_1.resolveRawKey)(key, 'encrypt');
96
+ if (typeof resolved === 'string') {
97
+ encryptionError(resolved, errors_js_1.WolsErrorCode.INVALID_KEY);
98
+ }
99
+ return { cryptoKey: resolved, kdf: 'raw' };
100
+ }
101
+ return encryptionError('key must be a passphrase string, 32 raw key bytes, or an AES-GCM CryptoKey', errors_js_1.WolsErrorCode.INVALID_KEY);
54
102
  }
55
103
  /**
56
- * Generate a random initialization vector
104
+ * AES-256-GCM encrypt UTF-8 text with a fresh IV. The tag is appended by
105
+ * WebCrypto. `aad` is used for field-level values only; whole labels have none.
57
106
  */
58
- function generateIV() {
59
- const buffer = new ArrayBuffer(IV_LENGTH);
60
- const iv = new Uint8Array(buffer);
61
- crypto.getRandomValues(iv);
62
- return { iv, ivBuffer: buffer };
107
+ async function seal(cryptoKey, text, aad) {
108
+ const iv = (0, shared_js_1.randomBytes)(shared_js_1.IV_LENGTH);
109
+ const params = aad === undefined ? { name: 'AES-GCM', iv } : { name: 'AES-GCM', iv, additionalData: aad };
110
+ const ciphertext = await crypto.subtle.encrypt(params, cryptoKey, new TextEncoder().encode(text));
111
+ return { payload: (0, shared_js_1.base64UrlEncode)(ciphertext), iv: (0, shared_js_1.base64UrlEncode)(iv) };
112
+ }
113
+ /** Split `wemush:{suffix}` into its suffix, enforcing a non-empty suffix. */
114
+ function idSuffix(id) {
115
+ if (typeof id !== 'string' || !id.startsWith('wemush:') || id.length === 'wemush:'.length) {
116
+ encryptionError(`Specimen id must be 'wemush:' followed by a non-empty suffix, got '${String(id)}'`);
117
+ }
118
+ return id.slice('wemush:'.length);
63
119
  }
64
120
  // =============================================================================
65
- // ENCRYPTION FUNCTIONS
121
+ // URL SERIALIZATION
66
122
  // =============================================================================
67
123
  /**
68
- * Encrypt a specimen using AES-256-GCM
124
+ * Build the encrypted-format URL for an encrypted specimen.
69
125
  *
70
- * @param specimen - The specimen to encrypt
71
- * @param options - Encryption options (key required)
72
- * @returns Promise resolving to encrypted specimen wrapper
126
+ * Enforces the generator rules, so a hand-built object cannot produce a
127
+ * non-conformant label:
128
+ * - `payload` and `iv` are canonical unpadded base64url, the IV is 12 bytes,
129
+ * and the payload is at least the 16-byte GCM tag
130
+ * - `kdf` is present: `pbkdf2` needs 100,000 to 2^32-1 iterations and a salt
131
+ * of at least 16 bytes that is not the legacy library salt (compared as
132
+ * bytes); `raw` must not carry `salt` or `iterations`
73
133
  *
74
- * @example
75
- * ```typescript
76
- * import { encryptSpecimen } from '@wemush/wols/crypto';
134
+ * Labels with more than 10,000,000 iterations are valid but exceed the
135
+ * decoders' default `maxIterations`, so readers must raise it.
77
136
  *
78
- * const encrypted = await encryptSpecimen(specimen, {
79
- * key: 'my-secret-password',
80
- * });
81
- * // Returns: { encrypted: true, payload: "...", iv: "...", algorithm: "AES-256-GCM" }
82
- * ```
137
+ * @throws WolsEncryptionError when the object would produce a non-conformant
138
+ * label (including legacy payloads, which are never generated)
139
+ * @since 1.3.0
83
140
  */
141
+ function toEncryptedUrl(encrypted) {
142
+ const suffix = idSuffix(encrypted.id);
143
+ if (encrypted.kdf !== 'pbkdf2' && encrypted.kdf !== 'raw') {
144
+ encryptionError('Encrypted URLs require kdf=pbkdf2 or kdf=raw; legacy payloads are not generated');
145
+ }
146
+ if (canonicalBytes('payload', encrypted.payload).length < shared_js_1.GCM_TAG_LENGTH) {
147
+ encryptionError(`payload must include the ${shared_js_1.GCM_TAG_LENGTH}-byte GCM tag`);
148
+ }
149
+ if (canonicalBytes('iv', encrypted.iv).length !== shared_js_1.IV_LENGTH) {
150
+ encryptionError(`iv must be ${shared_js_1.IV_LENGTH} bytes`);
151
+ }
152
+ const params = [`e=${encrypted.payload}`, `iv=${encrypted.iv}`, `kdf=${encrypted.kdf}`];
153
+ if (encrypted.kdf === 'pbkdf2') {
154
+ const { salt } = encrypted;
155
+ if (!salt || encrypted.iterations === undefined) {
156
+ encryptionError('kdf=pbkdf2 requires salt and iterations');
157
+ }
158
+ const iterations = checkGenerateIterations(encrypted.iterations);
159
+ const saltBytes = canonicalBytes('salt', salt);
160
+ if (saltBytes.length < shared_js_1.SALT_LENGTH) {
161
+ encryptionError(`salt must be at least ${shared_js_1.SALT_LENGTH} bytes, got ${saltBytes.length}`);
162
+ }
163
+ if (bytesEqual(saltBytes, shared_js_1.LEGACY_PBKDF2_SALT)) {
164
+ encryptionError('The fixed pre-1.3.0 library salt must not be used to generate labels');
165
+ }
166
+ params.push(`salt=${salt}`, `i=${iterations}`);
167
+ }
168
+ else if (encrypted.salt !== undefined || encrypted.iterations !== undefined) {
169
+ encryptionError('kdf=raw labels must not carry salt or iterations');
170
+ }
171
+ if (encrypted.signature !== undefined) {
172
+ params.push(`sig=${encodeURIComponent(encrypted.signature)}`);
173
+ }
174
+ return `${shared_js_1.ENCRYPTED_URL_PREFIX}${encodeURIComponent(suffix)}?${params.join('&')}`;
175
+ }
84
176
  async function encryptSpecimen(specimen, options) {
85
- const { key, fields } = options;
86
- // If partial encryption requested, handle separately
177
+ (0, shared_js_1.assertWebCrypto)();
178
+ const { fields } = options;
87
179
  if (fields !== undefined && fields.length > 0) {
88
- return encryptPartial(specimen, options);
89
- }
90
- // Get or derive the encryption key
91
- const cryptoKey = typeof key === 'string' ? await deriveKey(key) : key;
92
- // Serialize the specimen to JSON
93
- const plaintext = (0, specimen_js_1.serializeSpecimen)(specimen);
94
- const plaintextBytes = new TextEncoder().encode(plaintext);
95
- // Generate random IV
96
- const { iv, ivBuffer } = generateIV();
97
- // Encrypt
98
- const ciphertext = await crypto.subtle.encrypt({ name: 'AES-GCM', iv }, cryptoKey, plaintextBytes);
99
- // Return encrypted specimen
100
- return {
180
+ // Deprecated 1.2.x path: same behavior as encryptFields(). A call that
181
+ // passes `fields` literally is typed FieldEncryptedSpecimen by the first
182
+ // overload; options typed as plain EncryptionOptions keep the 1.2.x
183
+ // signature for source compatibility, which is why the option is deprecated.
184
+ const fieldOptions = {
185
+ key: options.key,
186
+ fields: fields,
187
+ };
188
+ if (options.iterations !== undefined)
189
+ fieldOptions.iterations = options.iterations;
190
+ return encryptFields(specimen, fieldOptions);
191
+ }
192
+ const id = specimen.id;
193
+ idSuffix(id);
194
+ const resolved = await resolveEncryptionKey(options);
195
+ const sealed = await seal(resolved.cryptoKey, (0, specimen_js_1.serializeSpecimen)(specimen));
196
+ const result = {
101
197
  encrypted: true,
102
- payload: toBase64Url(ciphertext),
103
- iv: toBase64Url(ivBuffer),
104
198
  algorithm: 'AES-256-GCM',
199
+ payload: sealed.payload,
200
+ iv: sealed.iv,
201
+ kdf: resolved.kdf,
202
+ id,
105
203
  };
204
+ if (resolved.salt !== undefined)
205
+ result.salt = resolved.salt;
206
+ if (resolved.iterations !== undefined)
207
+ result.iterations = resolved.iterations;
208
+ result.url = toEncryptedUrl(result);
209
+ return result;
106
210
  }
107
211
  /**
108
- * Encrypt only specific fields of a specimen
212
+ * Field-level encryption (WOLS v1.3.0): replace the value of each named field
213
+ * with an {@link EncryptedField} and leave the rest of the specimen in cleartext.
214
+ *
215
+ * One key (and, for passphrases, one random salt) per call; a fresh IV per field.
216
+ * Each value is bound to its label and field with AES-GCM additional data:
217
+ * the UTF-8 of `"{id}\n{field}"` (WOLS 1.3.0). A value moved to another field
218
+ * or copied into another label fails authentication. Restore with `decryptFields()`.
219
+ *
220
+ * The identifying fields (`@context`, `@type`, `id`, `version`, `type`,
221
+ * `species`) can't be encrypted.
222
+ *
223
+ * @param specimen - The specimen to partially encrypt
224
+ * @param options - `key`, `fields` (each must be present on the specimen), optional `iterations`
225
+ * @throws WolsEncryptionError when `fields` is empty, names a field the specimen
226
+ * does not have, or names a field twice; or for an unusable key
227
+ *
228
+ * @example
229
+ * ```typescript
230
+ * const partial = await encryptFields(specimen, { key: passphrase, fields: ['strain'] });
231
+ * partial.species; // still cleartext
232
+ * partial.strain; // { encrypted: true, algorithm: 'AES-256-GCM', payload, iv, kdf: 'pbkdf2', salt, iterations }
233
+ * ```
109
234
  *
110
- * Returns a specimen-like object with specified fields encrypted.
235
+ * @since 1.3.0
111
236
  */
112
- async function encryptPartial(specimen, options) {
113
- const { key, fields = [] } = options;
114
- // Get or derive the encryption key
115
- const cryptoKey = typeof key === 'string' ? await deriveKey(key) : key;
116
- // Clone the specimen
117
- const result = { ...specimen };
118
- // Encrypt each specified field
237
+ async function encryptFields(specimen, options) {
238
+ (0, shared_js_1.assertWebCrypto)();
239
+ const { fields } = options;
240
+ if (!Array.isArray(fields) || fields.length === 0) {
241
+ encryptionError('encryptFields requires a non-empty fields array');
242
+ }
243
+ // The AAD binds every value to the label's full id, so the id must be usable.
244
+ idSuffix(specimen.id);
245
+ const seen = new Set();
119
246
  for (const field of fields) {
120
- const value = result[field];
121
- if (value !== undefined) {
122
- const plaintext = JSON.stringify(value);
123
- const plaintextBytes = new TextEncoder().encode(plaintext);
124
- const { iv, ivBuffer } = generateIV();
125
- const ciphertext = await crypto.subtle.encrypt({ name: 'AES-GCM', iv }, cryptoKey, plaintextBytes);
126
- result[field] = {
127
- encrypted: true,
128
- payload: toBase64Url(ciphertext),
129
- iv: toBase64Url(ivBuffer),
130
- algorithm: 'AES-256-GCM',
131
- };
247
+ if (typeof field === 'string' && STRUCTURAL_FIELDS.has(field)) {
248
+ encryptionError(`Cannot encrypt field '${field}': it identifies the label and must stay in cleartext`);
132
249
  }
250
+ if (typeof field !== 'string' || !Object.hasOwn(specimen, field)) {
251
+ encryptionError(`Cannot encrypt field '${String(field)}': the specimen has no such field. ` +
252
+ 'Refusing to leave it unprotected.');
253
+ }
254
+ if (specimen[field] === undefined) {
255
+ encryptionError(`Cannot encrypt field '${field}': its value is undefined`);
256
+ }
257
+ if (seen.has(field)) {
258
+ encryptionError(`Field '${field}' is listed more than once`);
259
+ }
260
+ seen.add(field);
261
+ }
262
+ const keyOptions = { key: options.key };
263
+ if (options.iterations !== undefined)
264
+ keyOptions.iterations = options.iterations;
265
+ const resolved = await resolveEncryptionKey(keyOptions);
266
+ const result = { ...specimen };
267
+ for (const field of fields) {
268
+ // Fresh IV per field; AAD = "{id}\n{field}" (WOLS 1.3.0).
269
+ const sealed = await seal(resolved.cryptoKey, JSON.stringify(result[field]), (0, shared_js_1.fieldAad)(specimen.id, field));
270
+ const encryptedField = {
271
+ encrypted: true,
272
+ algorithm: 'AES-256-GCM',
273
+ payload: sealed.payload,
274
+ iv: sealed.iv,
275
+ kdf: resolved.kdf,
276
+ };
277
+ if (resolved.salt !== undefined)
278
+ encryptedField.salt = resolved.salt;
279
+ if (resolved.iterations !== undefined)
280
+ encryptedField.iterations = resolved.iterations;
281
+ result[field] = encryptedField;
133
282
  }
134
- // Cast to EncryptedSpecimen for return type consistency
135
- // In partial mode, this is actually a hybrid object
136
283
  return result;
137
284
  }
285
+ // =============================================================================
286
+ // TYPE GUARDS
287
+ // =============================================================================
288
+ function hasCipherShape(value) {
289
+ return (typeof value === 'object' &&
290
+ value !== null &&
291
+ value['encrypted'] === true &&
292
+ typeof value['payload'] === 'string' &&
293
+ typeof value['iv'] === 'string');
294
+ }
138
295
  /**
139
- * Type guard to check if an object is an encrypted specimen
296
+ * Whether a value is a field-level {@link EncryptedField}: an encrypted value
297
+ * with a `kdf` and no specimen `id` or `url`.
298
+ *
299
+ * The 1.3.0 shapes are told apart structurally: whole-label objects produced
300
+ * by `encryptSpecimen` and `parseEncryptedUrl` always carry `id`, and field
301
+ * values never do. Legacy (pre-1.3.0) values have no `kdf` and are reported
302
+ * as {@link isEncryptedSpecimen}, whether they were whole labels or fields.
303
+ * `decryptFields` handles legacy field values regardless (with `allowLegacy`).
304
+ *
305
+ * @since 1.3.0
306
+ */
307
+ function isEncryptedField(value) {
308
+ return (hasCipherShape(value) &&
309
+ (value['kdf'] === 'pbkdf2' || value['kdf'] === 'raw') &&
310
+ value['id'] === undefined &&
311
+ value['url'] === undefined);
312
+ }
313
+ /**
314
+ * Whether a value is a whole-label {@link EncryptedSpecimen} (v1.3.0 or legacy).
315
+ *
316
+ * @since 1.3.0
317
+ */
318
+ function isEncryptedSpecimen(value) {
319
+ return hasCipherShape(value) && !isEncryptedField(value);
320
+ }
321
+ /**
322
+ * Whether a value carries the `encrypted: true` marker: either a whole-label
323
+ * {@link EncryptedSpecimen} or a field-level {@link EncryptedField}. Use
324
+ * {@link isEncryptedSpecimen} or {@link isEncryptedField} to tell them apart.
325
+ *
326
+ * @since 1.3.0 Narrows to `EncryptedSpecimen | EncryptedField`
140
327
  */
141
328
  function isEncrypted(value) {
142
- if (value === null || value === undefined) {
143
- return false;
144
- }
145
- if (typeof value !== 'object') {
329
+ if (value === null || value === undefined || typeof value !== 'object') {
146
330
  return false;
147
331
  }
148
- const obj = value;
149
- return obj['encrypted'] === true;
332
+ return value['encrypted'] === true;
150
333
  }
151
334
  //# sourceMappingURL=encrypt.js.map