@wemush/wols 1.2.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 (98) 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/crypto/decrypt.d.ts +110 -0
  6. package/dist/cjs/crypto/decrypt.d.ts.map +1 -0
  7. package/dist/cjs/crypto/decrypt.js +519 -99
  8. package/dist/cjs/crypto/decrypt.js.map +1 -1
  9. package/dist/cjs/crypto/encrypt.d.ts +132 -0
  10. package/dist/cjs/crypto/encrypt.d.ts.map +1 -0
  11. package/dist/cjs/crypto/encrypt.js +281 -200
  12. package/dist/cjs/crypto/encrypt.js.map +1 -1
  13. package/dist/cjs/crypto/index.d.ts +12 -0
  14. package/dist/cjs/crypto/index.d.ts.map +1 -0
  15. package/dist/cjs/crypto/index.js +15 -2
  16. package/dist/cjs/crypto/index.js.map +1 -1
  17. package/dist/cjs/crypto/shared.d.ts +116 -0
  18. package/dist/cjs/crypto/shared.d.ts.map +1 -0
  19. package/dist/cjs/crypto/shared.js +238 -0
  20. package/dist/cjs/crypto/shared.js.map +1 -0
  21. package/dist/cjs/errors.d.ts +133 -0
  22. package/dist/cjs/errors.d.ts.map +1 -0
  23. package/dist/cjs/errors.js +39 -1
  24. package/dist/cjs/errors.js.map +1 -1
  25. package/dist/cjs/index.d.ts +29 -0
  26. package/dist/cjs/index.d.ts.map +1 -0
  27. package/dist/cjs/index.js +19 -4
  28. package/dist/cjs/index.js.map +1 -1
  29. package/dist/cjs/package.json +3 -0
  30. package/dist/cjs/parser.d.ts +30 -0
  31. package/dist/cjs/parser.d.ts.map +1 -0
  32. package/dist/cjs/qr/generate.d.ts +62 -0
  33. package/dist/cjs/qr/generate.d.ts.map +1 -0
  34. package/dist/cjs/qr/index.d.ts +10 -0
  35. package/dist/cjs/qr/index.d.ts.map +1 -0
  36. package/dist/cjs/specimen.d.ts +96 -0
  37. package/dist/cjs/specimen.d.ts.map +1 -0
  38. package/dist/cjs/specimen.js +84 -11
  39. package/dist/cjs/specimen.js.map +1 -1
  40. package/dist/cjs/types.d.ts +735 -0
  41. package/dist/cjs/types.d.ts.map +1 -0
  42. package/dist/cjs/types.js +65 -5
  43. package/dist/cjs/types.js.map +1 -1
  44. package/dist/cjs/utils/cuid.d.ts +46 -0
  45. package/dist/cjs/utils/cuid.d.ts.map +1 -0
  46. package/dist/cjs/utils/cuid.js +6 -4
  47. package/dist/cjs/utils/cuid.js.map +1 -1
  48. package/dist/cjs/utils/environment.d.ts +137 -0
  49. package/dist/cjs/utils/environment.d.ts.map +1 -0
  50. package/dist/cjs/utils/iso8601.d.ts +79 -0
  51. package/dist/cjs/utils/iso8601.d.ts.map +1 -0
  52. package/dist/cjs/utils/migration.d.ts +162 -0
  53. package/dist/cjs/utils/migration.d.ts.map +1 -0
  54. package/dist/cjs/validator.d.ts +25 -0
  55. package/dist/cjs/validator.d.ts.map +1 -0
  56. package/dist/cjs/validator.js +33 -22
  57. package/dist/cjs/validator.js.map +1 -1
  58. package/dist/esm/crypto/decrypt.js +515 -99
  59. package/dist/esm/crypto/decrypt.js.map +1 -1
  60. package/dist/esm/crypto/encrypt.js +277 -200
  61. package/dist/esm/crypto/encrypt.js.map +1 -1
  62. package/dist/esm/crypto/index.js +5 -3
  63. package/dist/esm/crypto/index.js.map +1 -1
  64. package/dist/esm/crypto/shared.js +222 -0
  65. package/dist/esm/crypto/shared.js.map +1 -0
  66. package/dist/esm/errors.js +37 -0
  67. package/dist/esm/errors.js.map +1 -1
  68. package/dist/esm/index.js +6 -6
  69. package/dist/esm/index.js.map +1 -1
  70. package/dist/esm/specimen.js +84 -12
  71. package/dist/esm/specimen.js.map +1 -1
  72. package/dist/esm/types.js +63 -4
  73. package/dist/esm/types.js.map +1 -1
  74. package/dist/esm/utils/cuid.js +6 -4
  75. package/dist/esm/utils/cuid.js.map +1 -1
  76. package/dist/esm/validator.js +34 -23
  77. package/dist/esm/validator.js.map +1 -1
  78. package/dist/types/crypto/decrypt.d.ts +93 -22
  79. package/dist/types/crypto/decrypt.d.ts.map +1 -1
  80. package/dist/types/crypto/encrypt.d.ts +106 -61
  81. package/dist/types/crypto/encrypt.d.ts.map +1 -1
  82. package/dist/types/crypto/index.d.ts +5 -3
  83. package/dist/types/crypto/index.d.ts.map +1 -1
  84. package/dist/types/crypto/shared.d.ts +116 -0
  85. package/dist/types/crypto/shared.d.ts.map +1 -0
  86. package/dist/types/errors.d.ts +31 -1
  87. package/dist/types/errors.d.ts.map +1 -1
  88. package/dist/types/index.d.ts +7 -7
  89. package/dist/types/index.d.ts.map +1 -1
  90. package/dist/types/specimen.d.ts +29 -4
  91. package/dist/types/specimen.d.ts.map +1 -1
  92. package/dist/types/types.d.ts +265 -40
  93. package/dist/types/types.d.ts.map +1 -1
  94. package/dist/types/utils/cuid.d.ts +5 -3
  95. package/dist/types/utils/cuid.d.ts.map +1 -1
  96. package/dist/types/validator.d.ts +1 -1
  97. package/dist/types/validator.d.ts.map +1 -1
  98. 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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"}
@@ -1,249 +1,326 @@
1
1
  /**
2
- * WOLS Encryption Module
2
+ * WOLS Encryption Module (WOLS v1.3.0 encrypted format)
3
3
  *
4
- * Provides AES-256-GCM encryption for specimens using Web Crypto API.
5
- * Supports both password-based (PBKDF2) and raw CryptoKey encryption.
4
+ * AES-256-GCM via WebCrypto, so it runs in Node.js 20+, browsers, Deno and Bun.
6
5
  *
7
- * ## Security Model
6
+ * ## Wire format
8
7
  *
9
- * This module implements a **deterministic key derivation** model optimized for:
10
- * - Cross-environment compatibility (browser + Node.js)
11
- * - Offline decryption (no external key storage needed)
12
- * - Self-describing payloads (iterations stored in output)
13
- *
14
- * ### Password vs CryptoKey
15
- *
16
- * | Input Type | Use Case | Security Level |
17
- * |------------|----------|----------------|
18
- * | `string` (password) | Simple sharing, QR codes | Good (depends on password strength) |
19
- * | `CryptoKey` | Server-side, key management systems | Best (full control over key material) |
20
- *
21
- * ### Security Considerations
22
- *
23
- * 1. **Fixed Salt**: The PBKDF2 salt is fixed per crypto version. This is intentional
24
- * for deterministic cross-environment key derivation. Password strength is critical.
25
- *
26
- * 2. **Iteration Count**: Default 100,000 iterations. Can be increased via `iterations`
27
- * option for higher security (at cost of performance).
28
- *
29
- * 3. **Random IV**: Each encryption uses a cryptographically random 96-bit IV,
30
- * ensuring identical plaintexts produce different ciphertexts.
31
- *
32
- * 4. **Authenticated Encryption**: AES-256-GCM provides both confidentiality and
33
- * integrity - tampered ciphertext will fail decryption.
34
- *
35
- * ## Future Specification Updates (v1.2.1+)
36
- *
37
- * TODO(wols-spec): The following enhancements should be documented in the upstream
38
- * WOLS specification (wemush/open-standard/SPECIFICATION.md) in a future release:
8
+ * ```
9
+ * wemush://v1/encrypted/{id}?e={ciphertext}&iv={iv}&kdf={pbkdf2|raw}[&salt={salt}&i={iterations}]
10
+ * ```
39
11
  *
40
- * 1. **EncryptedSpecimen schema**: Define the `cryptoVersion` and `iterations` fields
41
- * in the encrypted payload format section.
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
42
15
  *
43
- * 2. **Configurable iterations**: Document the `iterations` option in EncryptionOptions
44
- * with recommended ranges (100k-600k) and minimum floor (10k).
16
+ * ## Keys
45
17
  *
46
- * 3. **Self-describing payloads**: Explain that v1.2.0+ payloads include derivation
47
- * parameters for forward-compatible decryption.
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 |
48
23
  *
49
- * 4. **Security guidance**: Add a security considerations section covering:
50
- * - Fixed salt tradeoffs (determinism vs uniqueness)
51
- * - Password strength requirements
52
- * - When to use CryptoKey vs password
53
- * - Optional random salt for high-security scenarios (future v2)
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.
54
26
  *
55
27
  * @module crypto/encrypt
56
28
  */
29
+ import { WolsEncryptionError, WolsErrorCode } from '../errors.js';
57
30
  import { serializeSpecimen } from '../specimen.js';
58
- // =============================================================================
59
- // CONSTANTS
60
- // =============================================================================
61
- /**
62
- * Salt for PBKDF2 key derivation.
63
- *
64
- * DESIGN DECISION: This salt is intentionally fixed (not random) for deterministic
65
- * key derivation. This allows:
66
- *
67
- * 1. **Cross-environment compatibility**: Same password produces same key in
68
- * browser (Web Crypto API) and server (Node.js crypto), enabling encrypted
69
- * specimens to be decrypted in either environment.
70
- *
71
- * 2. **Offline decryption**: No need to store/transmit the salt alongside the
72
- * encrypted payload - the salt is known from the library version.
73
- *
74
- * 3. **Version-aware migration**: The salt includes a version identifier
75
- * (@wemush/wols/crypto/v1) allowing future versions to use different salts
76
- * while maintaining backward compatibility for decryption.
77
- *
78
- * SECURITY NOTE: The fixed salt means password security depends entirely on
79
- * password strength. Users should use strong, unique passwords. For maximum
80
- * security, use a CryptoKey directly instead of a password string.
81
- *
82
- * @internal
83
- */
84
- const PBKDF2_SALT = new TextEncoder().encode('@wemush/wols/crypto/v1');
85
- /** Default number of PBKDF2 iterations */
86
- const DEFAULT_PBKDF2_ITERATIONS = 100_000;
87
- /** Minimum allowed PBKDF2 iterations (security floor) */
88
- const MIN_PBKDF2_ITERATIONS = 10_000;
89
- /** Current crypto schema version */
90
- const CRYPTO_VERSION = 'v1';
91
- /** IV length in bytes (96 bits = 12 bytes recommended for GCM) */
92
- const IV_LENGTH = 12;
93
- // =============================================================================
94
- // UTILITY FUNCTIONS
95
- // =============================================================================
96
- /**
97
- * Convert ArrayBuffer to base64url string
98
- */
99
- function toBase64Url(buffer) {
100
- const bytes = new Uint8Array(buffer);
101
- let binary = '';
102
- for (const byte of bytes) {
103
- binary += String.fromCharCode(byte);
31
+ import { DEFAULT_PBKDF2_ITERATIONS, ENCRYPTED_URL_PREFIX, GCM_TAG_LENGTH, IV_LENGTH, LEGACY_PBKDF2_SALT, IDENTIFYING_FIELDS, MAX_ITERATIONS, fieldAad, MIN_GENERATE_ITERATIONS, SALT_LENGTH, assertWebCrypto, base64UrlDecode, base64UrlEncode, derivePassphraseKey, importAesKey, isPassphrase, isRawKey, randomBytes, resolveRawKey, } from './shared.js';
32
+ function encryptionError(message, code = WolsErrorCode.ENCRYPTION_ERROR) {
33
+ throw new WolsEncryptionError(code, message);
34
+ }
35
+ /** Generators MUST use 100,000 to 10,000,000 iterations (WOLS 1.3.0). */
36
+ function checkGenerateIterations(iterations) {
37
+ if (typeof iterations !== 'number' ||
38
+ !Number.isInteger(iterations) ||
39
+ iterations < MIN_GENERATE_ITERATIONS ||
40
+ iterations > MAX_ITERATIONS) {
41
+ return encryptionError(`PBKDF2 iterations must be an integer from ${MIN_GENERATE_ITERATIONS} to ` +
42
+ `${MAX_ITERATIONS}, got ${String(iterations)}`);
104
43
  }
105
- return btoa(binary).replace(/\+/g, '-').replace(/\//g, '_').replace(/=+$/, '');
44
+ return iterations;
106
45
  }
107
- /**
108
- * Validate and normalize iteration count
109
- * @throws Error if iterations below minimum
110
- */
111
- function validateIterations(iterations) {
112
- const count = iterations ?? DEFAULT_PBKDF2_ITERATIONS;
113
- if (count < MIN_PBKDF2_ITERATIONS) {
114
- throw new Error(`PBKDF2 iterations must be at least ${MIN_PBKDF2_ITERATIONS}, got ${count}`);
46
+ /** Decode canonical, unpadded base64url, or throw an encryption error naming the parameter. */
47
+ function canonicalBytes(name, value) {
48
+ let bytes;
49
+ if (typeof value === 'string' && !value.includes('=')) {
50
+ try {
51
+ bytes = base64UrlDecode(value);
52
+ }
53
+ catch {
54
+ bytes = undefined;
55
+ }
115
56
  }
116
- return count;
57
+ // Re-encoding catches non-canonical spellings (non-zero trailing bits) that
58
+ // decode to the same bytes as a different string.
59
+ if (bytes === undefined || base64UrlEncode(bytes) !== value) {
60
+ return encryptionError(`${name} must be canonical base64url without padding`);
61
+ }
62
+ return bytes;
63
+ }
64
+ function bytesEqual(a, b) {
65
+ return a.length === b.length && a.every((byte, i) => byte === b[i]);
117
66
  }
67
+ /** Identifying fields (WOLS 1.3.0) stay in cleartext so labels remain routable. */
68
+ const STRUCTURAL_FIELDS = new Set(IDENTIFYING_FIELDS);
118
69
  /**
119
- * Derive a CryptoKey from a password using PBKDF2
70
+ * Turn the caller's key into an AES key plus the parameters to record.
71
+ * A passphrase gets a fresh random salt for every call (one call = one label).
120
72
  */
121
- async function deriveKey(password, iterations) {
122
- const encoder = new TextEncoder();
123
- const passwordBytes = encoder.encode(password);
124
- // Import password as key material
125
- const keyMaterial = await crypto.subtle.importKey('raw', passwordBytes, 'PBKDF2', false, [
126
- 'deriveKey',
127
- ]);
128
- // Derive AES-256-GCM key
129
- return crypto.subtle.deriveKey({
130
- name: 'PBKDF2',
131
- salt: PBKDF2_SALT,
132
- iterations,
133
- hash: 'SHA-256',
134
- }, keyMaterial, { name: 'AES-GCM', length: 256 }, false, ['encrypt']);
73
+ async function resolveEncryptionKey(options) {
74
+ const { key } = options;
75
+ if (isPassphrase(key)) {
76
+ const iterations = checkGenerateIterations(options.iterations ?? DEFAULT_PBKDF2_ITERATIONS);
77
+ const salt = randomBytes(SALT_LENGTH);
78
+ const keyBytes = await derivePassphraseKey(key, salt, iterations);
79
+ return {
80
+ cryptoKey: await importAesKey(keyBytes, 'encrypt'),
81
+ kdf: 'pbkdf2',
82
+ salt: base64UrlEncode(salt),
83
+ iterations,
84
+ };
85
+ }
86
+ if (isRawKey(key)) {
87
+ const resolved = await resolveRawKey(key, 'encrypt');
88
+ if (typeof resolved === 'string') {
89
+ encryptionError(resolved, WolsErrorCode.INVALID_KEY);
90
+ }
91
+ return { cryptoKey: resolved, kdf: 'raw' };
92
+ }
93
+ return encryptionError('key must be a passphrase string, 32 raw key bytes, or an AES-GCM CryptoKey', WolsErrorCode.INVALID_KEY);
135
94
  }
136
95
  /**
137
- * Generate a random initialization vector
96
+ * AES-256-GCM encrypt UTF-8 text with a fresh IV. The tag is appended by
97
+ * WebCrypto. `aad` is used for field-level values only; whole labels have none.
138
98
  */
139
- function generateIV() {
140
- const buffer = new ArrayBuffer(IV_LENGTH);
141
- const iv = new Uint8Array(buffer);
142
- crypto.getRandomValues(iv);
143
- return { iv, ivBuffer: buffer };
99
+ async function seal(cryptoKey, text, aad) {
100
+ const iv = randomBytes(IV_LENGTH);
101
+ const params = aad === undefined ? { name: 'AES-GCM', iv } : { name: 'AES-GCM', iv, additionalData: aad };
102
+ const ciphertext = await crypto.subtle.encrypt(params, cryptoKey, new TextEncoder().encode(text));
103
+ return { payload: base64UrlEncode(ciphertext), iv: base64UrlEncode(iv) };
104
+ }
105
+ /** Split `wemush:{suffix}` into its suffix, enforcing a non-empty suffix. */
106
+ function idSuffix(id) {
107
+ if (typeof id !== 'string' || !id.startsWith('wemush:') || id.length === 'wemush:'.length) {
108
+ encryptionError(`Specimen id must be 'wemush:' followed by a non-empty suffix, got '${String(id)}'`);
109
+ }
110
+ return id.slice('wemush:'.length);
144
111
  }
145
112
  // =============================================================================
146
- // ENCRYPTION FUNCTIONS
113
+ // URL SERIALIZATION
147
114
  // =============================================================================
148
115
  /**
149
- * Encrypt a specimen using AES-256-GCM
116
+ * Build the encrypted-format URL for an encrypted specimen.
150
117
  *
151
- * @param specimen - The specimen to encrypt
152
- * @param options - Encryption options (key required)
153
- * @returns Promise resolving to encrypted specimen wrapper
118
+ * Enforces the generator rules, so a hand-built object cannot produce a
119
+ * non-conformant label:
120
+ * - `payload` and `iv` are canonical unpadded base64url, the IV is 12 bytes,
121
+ * and the payload is at least the 16-byte GCM tag
122
+ * - `kdf` is present: `pbkdf2` needs 100,000 to 2^32-1 iterations and a salt
123
+ * of at least 16 bytes that is not the legacy library salt (compared as
124
+ * bytes); `raw` must not carry `salt` or `iterations`
154
125
  *
155
- * @example
156
- * ```typescript
157
- * import { encryptSpecimen } from '@wemush/wols/crypto';
158
- *
159
- * // Basic encryption with default iterations (100k)
160
- * const encrypted = await encryptSpecimen(specimen, {
161
- * key: 'my-secret-password',
162
- * });
163
- *
164
- * // Higher security with custom iterations
165
- * const secureEncrypted = await encryptSpecimen(specimen, {
166
- * key: 'my-secret-password',
167
- * iterations: 300_000,
168
- * });
169
- * // Returns: { encrypted: true, payload: "...", iv: "...", algorithm: "AES-256-GCM", cryptoVersion: "v1", iterations: 300000 }
170
- * ```
126
+ * Labels with more than 10,000,000 iterations are valid but exceed the
127
+ * decoders' default `maxIterations`, so readers must raise it.
128
+ *
129
+ * @throws WolsEncryptionError when the object would produce a non-conformant
130
+ * label (including legacy payloads, which are never generated)
131
+ * @since 1.3.0
171
132
  */
133
+ export function toEncryptedUrl(encrypted) {
134
+ const suffix = idSuffix(encrypted.id);
135
+ if (encrypted.kdf !== 'pbkdf2' && encrypted.kdf !== 'raw') {
136
+ encryptionError('Encrypted URLs require kdf=pbkdf2 or kdf=raw; legacy payloads are not generated');
137
+ }
138
+ if (canonicalBytes('payload', encrypted.payload).length < GCM_TAG_LENGTH) {
139
+ encryptionError(`payload must include the ${GCM_TAG_LENGTH}-byte GCM tag`);
140
+ }
141
+ if (canonicalBytes('iv', encrypted.iv).length !== IV_LENGTH) {
142
+ encryptionError(`iv must be ${IV_LENGTH} bytes`);
143
+ }
144
+ const params = [`e=${encrypted.payload}`, `iv=${encrypted.iv}`, `kdf=${encrypted.kdf}`];
145
+ if (encrypted.kdf === 'pbkdf2') {
146
+ const { salt } = encrypted;
147
+ if (!salt || encrypted.iterations === undefined) {
148
+ encryptionError('kdf=pbkdf2 requires salt and iterations');
149
+ }
150
+ const iterations = checkGenerateIterations(encrypted.iterations);
151
+ const saltBytes = canonicalBytes('salt', salt);
152
+ if (saltBytes.length < SALT_LENGTH) {
153
+ encryptionError(`salt must be at least ${SALT_LENGTH} bytes, got ${saltBytes.length}`);
154
+ }
155
+ if (bytesEqual(saltBytes, LEGACY_PBKDF2_SALT)) {
156
+ encryptionError('The fixed pre-1.3.0 library salt must not be used to generate labels');
157
+ }
158
+ params.push(`salt=${salt}`, `i=${iterations}`);
159
+ }
160
+ else if (encrypted.salt !== undefined || encrypted.iterations !== undefined) {
161
+ encryptionError('kdf=raw labels must not carry salt or iterations');
162
+ }
163
+ if (encrypted.signature !== undefined) {
164
+ params.push(`sig=${encodeURIComponent(encrypted.signature)}`);
165
+ }
166
+ return `${ENCRYPTED_URL_PREFIX}${encodeURIComponent(suffix)}?${params.join('&')}`;
167
+ }
172
168
  export async function encryptSpecimen(specimen, options) {
173
- const { key, fields } = options;
174
- // If partial encryption requested, handle separately
169
+ assertWebCrypto();
170
+ const { fields } = options;
175
171
  if (fields !== undefined && fields.length > 0) {
176
- return encryptPartial(specimen, options);
177
- }
178
- // Validate and get iteration count
179
- const iterations = validateIterations(options.iterations);
180
- // Get or derive the encryption key
181
- // When key is a CryptoKey, iterations is still recorded for documentation
182
- // but not used (key is already derived)
183
- const cryptoKey = typeof key === 'string' ? await deriveKey(key, iterations) : key;
184
- // Serialize the specimen to JSON
185
- const plaintext = serializeSpecimen(specimen);
186
- const plaintextBytes = new TextEncoder().encode(plaintext);
187
- // Generate random IV
188
- const { iv, ivBuffer } = generateIV();
189
- // Encrypt
190
- const ciphertext = await crypto.subtle.encrypt({ name: 'AES-GCM', iv }, cryptoKey, plaintextBytes);
191
- // Return encrypted specimen with version and iterations for self-describing decryption
192
- return {
172
+ // Deprecated 1.2.x path: same behavior as encryptFields(). A call that
173
+ // passes `fields` literally is typed FieldEncryptedSpecimen by the first
174
+ // overload; options typed as plain EncryptionOptions keep the 1.2.x
175
+ // signature for source compatibility, which is why the option is deprecated.
176
+ const fieldOptions = {
177
+ key: options.key,
178
+ fields: fields,
179
+ };
180
+ if (options.iterations !== undefined)
181
+ fieldOptions.iterations = options.iterations;
182
+ return encryptFields(specimen, fieldOptions);
183
+ }
184
+ const id = specimen.id;
185
+ idSuffix(id);
186
+ const resolved = await resolveEncryptionKey(options);
187
+ const sealed = await seal(resolved.cryptoKey, serializeSpecimen(specimen));
188
+ const result = {
193
189
  encrypted: true,
194
- payload: toBase64Url(ciphertext),
195
- iv: toBase64Url(ivBuffer),
196
190
  algorithm: 'AES-256-GCM',
197
- cryptoVersion: CRYPTO_VERSION,
198
- iterations,
191
+ payload: sealed.payload,
192
+ iv: sealed.iv,
193
+ kdf: resolved.kdf,
194
+ id,
199
195
  };
196
+ if (resolved.salt !== undefined)
197
+ result.salt = resolved.salt;
198
+ if (resolved.iterations !== undefined)
199
+ result.iterations = resolved.iterations;
200
+ result.url = toEncryptedUrl(result);
201
+ return result;
200
202
  }
201
203
  /**
202
- * Encrypt only specific fields of a specimen
204
+ * Field-level encryption (WOLS v1.3.0): replace the value of each named field
205
+ * with an {@link EncryptedField} and leave the rest of the specimen in cleartext.
203
206
  *
204
- * Returns a specimen-like object with specified fields encrypted.
207
+ * One key (and, for passphrases, one random salt) per call; a fresh IV per field.
208
+ * Each value is bound to its label and field with AES-GCM additional data:
209
+ * the UTF-8 of `"{id}\n{field}"` (WOLS 1.3.0). A value moved to another field
210
+ * or copied into another label fails authentication. Restore with `decryptFields()`.
211
+ *
212
+ * The identifying fields (`@context`, `@type`, `id`, `version`, `type`,
213
+ * `species`) can't be encrypted.
214
+ *
215
+ * @param specimen - The specimen to partially encrypt
216
+ * @param options - `key`, `fields` (each must be present on the specimen), optional `iterations`
217
+ * @throws WolsEncryptionError when `fields` is empty, names a field the specimen
218
+ * does not have, or names a field twice; or for an unusable key
219
+ *
220
+ * @example
221
+ * ```typescript
222
+ * const partial = await encryptFields(specimen, { key: passphrase, fields: ['strain'] });
223
+ * partial.species; // still cleartext
224
+ * partial.strain; // { encrypted: true, algorithm: 'AES-256-GCM', payload, iv, kdf: 'pbkdf2', salt, iterations }
225
+ * ```
226
+ *
227
+ * @since 1.3.0
205
228
  */
206
- async function encryptPartial(specimen, options) {
207
- const { key, fields = [] } = options;
208
- // Validate and get iteration count
209
- const iterations = validateIterations(options.iterations);
210
- // Get or derive the encryption key
211
- const cryptoKey = typeof key === 'string' ? await deriveKey(key, iterations) : key;
212
- // Clone the specimen
213
- const result = { ...specimen };
214
- // Encrypt each specified field
229
+ export async function encryptFields(specimen, options) {
230
+ assertWebCrypto();
231
+ const { fields } = options;
232
+ if (!Array.isArray(fields) || fields.length === 0) {
233
+ encryptionError('encryptFields requires a non-empty fields array');
234
+ }
235
+ // The AAD binds every value to the label's full id, so the id must be usable.
236
+ idSuffix(specimen.id);
237
+ const seen = new Set();
215
238
  for (const field of fields) {
216
- const value = result[field];
217
- if (value !== undefined) {
218
- const plaintext = JSON.stringify(value);
219
- const plaintextBytes = new TextEncoder().encode(plaintext);
220
- const { iv, ivBuffer } = generateIV();
221
- const ciphertext = await crypto.subtle.encrypt({ name: 'AES-GCM', iv }, cryptoKey, plaintextBytes);
222
- result[field] = {
223
- encrypted: true,
224
- payload: toBase64Url(ciphertext),
225
- iv: toBase64Url(ivBuffer),
226
- algorithm: 'AES-256-GCM',
227
- cryptoVersion: CRYPTO_VERSION,
228
- iterations,
229
- };
239
+ if (typeof field === 'string' && STRUCTURAL_FIELDS.has(field)) {
240
+ encryptionError(`Cannot encrypt field '${field}': it identifies the label and must stay in cleartext`);
241
+ }
242
+ if (typeof field !== 'string' || !Object.hasOwn(specimen, field)) {
243
+ encryptionError(`Cannot encrypt field '${String(field)}': the specimen has no such field. ` +
244
+ 'Refusing to leave it unprotected.');
230
245
  }
246
+ if (specimen[field] === undefined) {
247
+ encryptionError(`Cannot encrypt field '${field}': its value is undefined`);
248
+ }
249
+ if (seen.has(field)) {
250
+ encryptionError(`Field '${field}' is listed more than once`);
251
+ }
252
+ seen.add(field);
253
+ }
254
+ const keyOptions = { key: options.key };
255
+ if (options.iterations !== undefined)
256
+ keyOptions.iterations = options.iterations;
257
+ const resolved = await resolveEncryptionKey(keyOptions);
258
+ const result = { ...specimen };
259
+ for (const field of fields) {
260
+ // Fresh IV per field; AAD = "{id}\n{field}" (WOLS 1.3.0).
261
+ const sealed = await seal(resolved.cryptoKey, JSON.stringify(result[field]), fieldAad(specimen.id, field));
262
+ const encryptedField = {
263
+ encrypted: true,
264
+ algorithm: 'AES-256-GCM',
265
+ payload: sealed.payload,
266
+ iv: sealed.iv,
267
+ kdf: resolved.kdf,
268
+ };
269
+ if (resolved.salt !== undefined)
270
+ encryptedField.salt = resolved.salt;
271
+ if (resolved.iterations !== undefined)
272
+ encryptedField.iterations = resolved.iterations;
273
+ result[field] = encryptedField;
231
274
  }
232
- // Cast to EncryptedSpecimen for return type consistency
233
- // In partial mode, this is actually a hybrid object
234
275
  return result;
235
276
  }
277
+ // =============================================================================
278
+ // TYPE GUARDS
279
+ // =============================================================================
280
+ function hasCipherShape(value) {
281
+ return (typeof value === 'object' &&
282
+ value !== null &&
283
+ value['encrypted'] === true &&
284
+ typeof value['payload'] === 'string' &&
285
+ typeof value['iv'] === 'string');
286
+ }
287
+ /**
288
+ * Whether a value is a field-level {@link EncryptedField}: an encrypted value
289
+ * with a `kdf` and no specimen `id` or `url`.
290
+ *
291
+ * The 1.3.0 shapes are told apart structurally: whole-label objects produced
292
+ * by `encryptSpecimen` and `parseEncryptedUrl` always carry `id`, and field
293
+ * values never do. Legacy (pre-1.3.0) values have no `kdf` and are reported
294
+ * as {@link isEncryptedSpecimen}, whether they were whole labels or fields.
295
+ * `decryptFields` handles legacy field values regardless (with `allowLegacy`).
296
+ *
297
+ * @since 1.3.0
298
+ */
299
+ export function isEncryptedField(value) {
300
+ return (hasCipherShape(value) &&
301
+ (value['kdf'] === 'pbkdf2' || value['kdf'] === 'raw') &&
302
+ value['id'] === undefined &&
303
+ value['url'] === undefined);
304
+ }
305
+ /**
306
+ * Whether a value is a whole-label {@link EncryptedSpecimen} (v1.3.0 or legacy).
307
+ *
308
+ * @since 1.3.0
309
+ */
310
+ export function isEncryptedSpecimen(value) {
311
+ return hasCipherShape(value) && !isEncryptedField(value);
312
+ }
236
313
  /**
237
- * Type guard to check if an object is an encrypted specimen
314
+ * Whether a value carries the `encrypted: true` marker: either a whole-label
315
+ * {@link EncryptedSpecimen} or a field-level {@link EncryptedField}. Use
316
+ * {@link isEncryptedSpecimen} or {@link isEncryptedField} to tell them apart.
317
+ *
318
+ * @since 1.3.0 Narrows to `EncryptedSpecimen | EncryptedField`
238
319
  */
239
320
  export function isEncrypted(value) {
240
- if (value === null || value === undefined) {
241
- return false;
242
- }
243
- if (typeof value !== 'object') {
321
+ if (value === null || value === undefined || typeof value !== 'object') {
244
322
  return false;
245
323
  }
246
- const obj = value;
247
- return obj['encrypted'] === true;
324
+ return value['encrypted'] === true;
248
325
  }
249
326
  //# sourceMappingURL=encrypt.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"encrypt.js","sourceRoot":"","sources":["../../../src/crypto/encrypt.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"encrypt.js","sourceRoot":"","sources":["../../../src/crypto/encrypt.ts"],"names":[],"mappings":"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"}