claim169 0.1.0-alpha.2 → 0.2.0-alpha
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +134 -5
- package/dist/index.d.ts +106 -8
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +311 -13
- package/dist/index.js.map +1 -1
- package/dist/types.d.ts +254 -2
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js.map +1 -1
- package/package.json +5 -2
- package/wasm/README.md +15 -8
- package/wasm/claim169_wasm.d.ts +63 -0
- package/wasm/claim169_wasm_bg.js +140 -0
- package/wasm/claim169_wasm_bg.wasm +0 -0
- package/wasm/claim169_wasm_bg.wasm.d.ts +6 -0
- package/wasm/package.json +1 -1
package/README.md
CHANGED
|
@@ -60,7 +60,8 @@ const result = decode(qrText, { allowUnverified: true });
|
|
|
60
60
|
const options: DecodeOptions = {
|
|
61
61
|
maxDecompressedBytes: 32768, // 32KB limit
|
|
62
62
|
skipBiometrics: true, // Skip biometric parsing
|
|
63
|
-
|
|
63
|
+
// Timestamp validation is enabled by default (host-side). Set to false to disable:
|
|
64
|
+
validateTimestamps: false,
|
|
64
65
|
allowUnverified: true, // Explicit opt-out (testing only)
|
|
65
66
|
};
|
|
66
67
|
|
|
@@ -94,7 +95,6 @@ const result = new Decoder(qrText)
|
|
|
94
95
|
const result = new Decoder(qrText)
|
|
95
96
|
.verifyWithEd25519(publicKey)
|
|
96
97
|
.skipBiometrics() // Skip biometric data
|
|
97
|
-
.withTimestampValidation() // Enable timestamp validation
|
|
98
98
|
.clockSkewTolerance(60) // 60 seconds tolerance
|
|
99
99
|
.maxDecompressedBytes(32768) // 32KB max size
|
|
100
100
|
.decode();
|
|
@@ -106,11 +106,14 @@ const result = new Decoder(qrText)
|
|
|
106
106
|
|--------|-------------|
|
|
107
107
|
| `verifyWithEd25519(publicKey)` | Verify with Ed25519 (32 bytes) |
|
|
108
108
|
| `verifyWithEcdsaP256(publicKey)` | Verify with ECDSA P-256 (33 or 65 bytes) |
|
|
109
|
+
| `verifyWith(callback)` | Verify with custom callback (HSM, cloud KMS, etc.) |
|
|
109
110
|
| `decryptWithAes256(key)` | Decrypt with AES-256-GCM (32 bytes) |
|
|
110
111
|
| `decryptWithAes128(key)` | Decrypt with AES-128-GCM (16 bytes) |
|
|
112
|
+
| `decryptWith(callback)` | Decrypt with custom callback (HSM, cloud KMS, etc.) |
|
|
111
113
|
| `allowUnverified()` | Skip verification (testing only) |
|
|
112
114
|
| `skipBiometrics()` | Skip biometric data parsing |
|
|
113
|
-
| `withTimestampValidation()` | Enable
|
|
115
|
+
| `withTimestampValidation()` | Enable timestamp validation (host-side) |
|
|
116
|
+
| `withoutTimestampValidation()` | Disable timestamp validation |
|
|
114
117
|
| `clockSkewTolerance(seconds)` | Set clock skew tolerance |
|
|
115
118
|
| `maxDecompressedBytes(bytes)` | Set max decompressed size |
|
|
116
119
|
| `decode()` | Execute the decode operation |
|
|
@@ -162,8 +165,10 @@ const qrData = new Encoder(claim169, cwtMeta)
|
|
|
162
165
|
|--------|-------------|
|
|
163
166
|
| `signWithEd25519(privateKey)` | Sign with Ed25519 |
|
|
164
167
|
| `signWithEcdsaP256(privateKey)` | Sign with ECDSA P-256 |
|
|
168
|
+
| `signWith(callback, algorithm, keyId?)` | Sign with custom callback (HSM, cloud KMS, etc.) |
|
|
165
169
|
| `encryptWithAes256(key)` | Encrypt with AES-256-GCM |
|
|
166
170
|
| `encryptWithAes128(key)` | Encrypt with AES-128-GCM |
|
|
171
|
+
| `encryptWith(callback, algorithm)` | Encrypt with custom callback (HSM, cloud KMS, etc.) |
|
|
167
172
|
| `allowUnsigned()` | Allow unsigned (testing only) |
|
|
168
173
|
| `skipBiometrics()` | Skip biometric fields |
|
|
169
174
|
| `encode()` | Produce the QR string |
|
|
@@ -178,6 +183,130 @@ import { generateNonce } from 'claim169';
|
|
|
178
183
|
const nonce = generateNonce(); // Returns 12-byte Uint8Array
|
|
179
184
|
```
|
|
180
185
|
|
|
186
|
+
## Custom Crypto Providers
|
|
187
|
+
|
|
188
|
+
For integrating with external key management systems like HSMs, cloud KMS (AWS KMS, Google Cloud KMS, Azure Key Vault), smart cards, TPMs, or remote signing services, use the custom callback methods.
|
|
189
|
+
|
|
190
|
+
### Custom Signer
|
|
191
|
+
|
|
192
|
+
```typescript
|
|
193
|
+
import { Encoder, SignerCallback, Claim169Input, CwtMetaInput } from 'claim169';
|
|
194
|
+
|
|
195
|
+
// Example: Sign with a cloud KMS
|
|
196
|
+
const mySigner: SignerCallback = (algorithm, keyId, data) => {
|
|
197
|
+
// Call your crypto provider
|
|
198
|
+
// algorithm: "EdDSA" or "ES256"
|
|
199
|
+
// keyId: optional key identifier (Uint8Array or null)
|
|
200
|
+
// data: the COSE Sig_structure to sign (Uint8Array)
|
|
201
|
+
const signature = myKms.sign({ keyId, data, algorithm });
|
|
202
|
+
return signature; // Uint8Array: 64 bytes for EdDSA, 64 bytes for ES256
|
|
203
|
+
};
|
|
204
|
+
|
|
205
|
+
const claim: Claim169Input = { id: "123", fullName: "John Doe" };
|
|
206
|
+
const meta: CwtMetaInput = { issuer: "https://issuer.example" };
|
|
207
|
+
|
|
208
|
+
const qrData = new Encoder(claim, meta)
|
|
209
|
+
.signWith(mySigner, "EdDSA", new Uint8Array([1, 2, 3])) // optional keyId
|
|
210
|
+
.encode();
|
|
211
|
+
```
|
|
212
|
+
|
|
213
|
+
### Custom Verifier
|
|
214
|
+
|
|
215
|
+
```typescript
|
|
216
|
+
import { Decoder, VerifierCallback } from 'claim169';
|
|
217
|
+
|
|
218
|
+
// Example: Verify with an HSM
|
|
219
|
+
const myVerifier: VerifierCallback = (algorithm, keyId, data, signature) => {
|
|
220
|
+
// Call your crypto provider
|
|
221
|
+
// Throw an error if verification fails
|
|
222
|
+
const result = myHsm.verify({ keyId, data, signature, algorithm });
|
|
223
|
+
if (!result.valid) {
|
|
224
|
+
throw new Error("Signature verification failed");
|
|
225
|
+
}
|
|
226
|
+
};
|
|
227
|
+
|
|
228
|
+
const result = new Decoder(qrText)
|
|
229
|
+
.verifyWith(myVerifier)
|
|
230
|
+
.decode();
|
|
231
|
+
```
|
|
232
|
+
|
|
233
|
+
### Custom Encryptor
|
|
234
|
+
|
|
235
|
+
```typescript
|
|
236
|
+
import { Encoder, EncryptorCallback } from 'claim169';
|
|
237
|
+
|
|
238
|
+
// Example: Encrypt with cloud KMS
|
|
239
|
+
const myEncryptor: EncryptorCallback = (algorithm, keyId, nonce, aad, plaintext) => {
|
|
240
|
+
// algorithm: "A256GCM" or "A128GCM"
|
|
241
|
+
// nonce: 12-byte IV
|
|
242
|
+
// aad: additional authenticated data
|
|
243
|
+
// plaintext: data to encrypt
|
|
244
|
+
const ciphertext = myKms.encrypt({ keyId, nonce, aad, plaintext });
|
|
245
|
+
return ciphertext; // Uint8Array: plaintext + 16-byte auth tag
|
|
246
|
+
};
|
|
247
|
+
|
|
248
|
+
const qrData = new Encoder(claim, meta)
|
|
249
|
+
.signWithEd25519(signingKey)
|
|
250
|
+
.encryptWith(myEncryptor, "A256GCM")
|
|
251
|
+
.encode();
|
|
252
|
+
```
|
|
253
|
+
|
|
254
|
+
### Custom Decryptor
|
|
255
|
+
|
|
256
|
+
```typescript
|
|
257
|
+
import { Decoder, DecryptorCallback } from 'claim169';
|
|
258
|
+
|
|
259
|
+
// Example: Decrypt with cloud KMS
|
|
260
|
+
const myDecryptor: DecryptorCallback = (algorithm, keyId, nonce, aad, ciphertext) => {
|
|
261
|
+
// algorithm: "A256GCM" or "A128GCM"
|
|
262
|
+
// ciphertext includes the auth tag
|
|
263
|
+
const plaintext = myKms.decrypt({ keyId, nonce, aad, ciphertext });
|
|
264
|
+
return plaintext; // Uint8Array
|
|
265
|
+
};
|
|
266
|
+
|
|
267
|
+
const result = new Decoder(qrText)
|
|
268
|
+
.decryptWith(myDecryptor)
|
|
269
|
+
.verifyWithEd25519(publicKey)
|
|
270
|
+
.decode();
|
|
271
|
+
```
|
|
272
|
+
|
|
273
|
+
### Callback Type Definitions
|
|
274
|
+
|
|
275
|
+
```typescript
|
|
276
|
+
// Signer: (algorithm, keyId, data) => signature
|
|
277
|
+
type SignerCallback = (
|
|
278
|
+
algorithm: string,
|
|
279
|
+
keyId: Uint8Array | null,
|
|
280
|
+
data: Uint8Array
|
|
281
|
+
) => Uint8Array;
|
|
282
|
+
|
|
283
|
+
// Verifier: (algorithm, keyId, data, signature) => void (throw on failure)
|
|
284
|
+
type VerifierCallback = (
|
|
285
|
+
algorithm: string,
|
|
286
|
+
keyId: Uint8Array | null,
|
|
287
|
+
data: Uint8Array,
|
|
288
|
+
signature: Uint8Array
|
|
289
|
+
) => void;
|
|
290
|
+
|
|
291
|
+
// Encryptor: (algorithm, keyId, nonce, aad, plaintext) => ciphertext
|
|
292
|
+
type EncryptorCallback = (
|
|
293
|
+
algorithm: string,
|
|
294
|
+
keyId: Uint8Array | null,
|
|
295
|
+
nonce: Uint8Array,
|
|
296
|
+
aad: Uint8Array,
|
|
297
|
+
plaintext: Uint8Array
|
|
298
|
+
) => Uint8Array;
|
|
299
|
+
|
|
300
|
+
// Decryptor: (algorithm, keyId, nonce, aad, ciphertext) => plaintext
|
|
301
|
+
type DecryptorCallback = (
|
|
302
|
+
algorithm: string,
|
|
303
|
+
keyId: Uint8Array | null,
|
|
304
|
+
nonce: Uint8Array,
|
|
305
|
+
aad: Uint8Array,
|
|
306
|
+
ciphertext: Uint8Array
|
|
307
|
+
) => Uint8Array;
|
|
308
|
+
```
|
|
309
|
+
|
|
181
310
|
## Data Model
|
|
182
311
|
|
|
183
312
|
### DecodeResult
|
|
@@ -280,12 +409,12 @@ Error messages indicate the specific failure:
|
|
|
280
409
|
|
|
281
410
|
### Timestamp Validation
|
|
282
411
|
|
|
283
|
-
Timestamp validation is
|
|
412
|
+
Timestamp validation is performed in the host (JavaScript) and is enabled by default. Disable it explicitly if you intentionally want to skip time checks:
|
|
284
413
|
|
|
285
414
|
```typescript
|
|
286
415
|
const result = new Decoder(qrText)
|
|
287
416
|
.verifyWithEd25519(publicKey)
|
|
288
|
-
.
|
|
417
|
+
.withoutTimestampValidation()
|
|
289
418
|
.clockSkewTolerance(60) // Allow 60 seconds clock drift
|
|
290
419
|
.decode();
|
|
291
420
|
```
|
package/dist/index.d.ts
CHANGED
|
@@ -78,14 +78,14 @@
|
|
|
78
78
|
*
|
|
79
79
|
* ## Notes
|
|
80
80
|
*
|
|
81
|
-
* - **Timestamp validation**:
|
|
82
|
-
*
|
|
81
|
+
* - **Timestamp validation**: Enabled by default in JS (host-side). Disable with
|
|
82
|
+
* `.withoutTimestampValidation()` if you intentionally want to skip time checks.
|
|
83
83
|
*
|
|
84
84
|
* @module claim169
|
|
85
85
|
*/
|
|
86
|
-
export type { Biometric, Claim169, Claim169Input, CwtMeta, CwtMetaInput, DecodeResult, IDecoder, IEncoder, VerificationStatus, } from "./types.js";
|
|
86
|
+
export type { Algorithm, AlgorithmName, Biometric, CertificateHash, Claim169, Claim169Input, CwtMeta, CwtMetaInput, DecodeResult, DecryptorCallback, EncryptorCallback, IDecoder, IEncoder, SignerCallback, VerificationStatus, VerifierCallback, X509Headers, } from "./types.js";
|
|
87
87
|
export { Claim169Error } from "./types.js";
|
|
88
|
-
import type { Claim169Input, CwtMetaInput, DecodeResult, IDecoder, IEncoder } from "./types.js";
|
|
88
|
+
import type { Claim169Input, CwtMetaInput, DecodeResult, DecryptorCallback, EncryptorCallback, IDecoder, IEncoder, SignerCallback, VerifierCallback } from "./types.js";
|
|
89
89
|
/**
|
|
90
90
|
* Get the library version
|
|
91
91
|
*/
|
|
@@ -135,6 +135,8 @@ export declare function bytesToHex(bytes: Uint8Array): string;
|
|
|
135
135
|
*/
|
|
136
136
|
export declare class Decoder implements IDecoder {
|
|
137
137
|
private wasmDecoder;
|
|
138
|
+
private validateTimestamps;
|
|
139
|
+
private clockSkewToleranceSeconds;
|
|
138
140
|
/**
|
|
139
141
|
* Create a new Decoder instance.
|
|
140
142
|
* @param qrText - The QR code text content (Base45 encoded)
|
|
@@ -154,9 +156,26 @@ export declare class Decoder implements IDecoder {
|
|
|
154
156
|
* @throws {Claim169Error} If the public key is invalid
|
|
155
157
|
*/
|
|
156
158
|
verifyWithEcdsaP256(publicKey: Uint8Array): Decoder;
|
|
159
|
+
/**
|
|
160
|
+
* Verify signature with Ed25519 public key in PEM format.
|
|
161
|
+
* Supports SPKI format with "BEGIN PUBLIC KEY" headers.
|
|
162
|
+
* @param pem - PEM-encoded Ed25519 public key
|
|
163
|
+
* @returns The decoder instance for chaining
|
|
164
|
+
* @throws {Claim169Error} If the PEM is invalid
|
|
165
|
+
*/
|
|
166
|
+
verifyWithEd25519Pem(pem: string): Decoder;
|
|
167
|
+
/**
|
|
168
|
+
* Verify signature with ECDSA P-256 public key in PEM format.
|
|
169
|
+
* Supports SPKI format with "BEGIN PUBLIC KEY" headers.
|
|
170
|
+
* @param pem - PEM-encoded P-256 public key
|
|
171
|
+
* @returns The decoder instance for chaining
|
|
172
|
+
* @throws {Claim169Error} If the PEM is invalid
|
|
173
|
+
*/
|
|
174
|
+
verifyWithEcdsaP256Pem(pem: string): Decoder;
|
|
157
175
|
/**
|
|
158
176
|
* Allow decoding without signature verification.
|
|
159
|
-
* WARNING:
|
|
177
|
+
* WARNING: Credentials decoded with verification skipped (`verificationStatus === "skipped"`)
|
|
178
|
+
* cannot be trusted. Use for testing only.
|
|
160
179
|
* @returns The decoder instance for chaining
|
|
161
180
|
*/
|
|
162
181
|
allowUnverified(): Decoder;
|
|
@@ -183,14 +202,19 @@ export declare class Decoder implements IDecoder {
|
|
|
183
202
|
/**
|
|
184
203
|
* Enable timestamp validation.
|
|
185
204
|
* When enabled, expired or not-yet-valid credentials will throw an error.
|
|
186
|
-
*
|
|
205
|
+
* Implemented in the host (JavaScript) to avoid WASM runtime time limitations.
|
|
187
206
|
* @returns The decoder instance for chaining
|
|
188
207
|
*/
|
|
189
208
|
withTimestampValidation(): Decoder;
|
|
209
|
+
/**
|
|
210
|
+
* Disable timestamp validation.
|
|
211
|
+
* @returns The decoder instance for chaining
|
|
212
|
+
*/
|
|
213
|
+
withoutTimestampValidation(): Decoder;
|
|
190
214
|
/**
|
|
191
215
|
* Set clock skew tolerance in seconds.
|
|
192
216
|
* Allows credentials to be accepted when clocks are slightly out of sync.
|
|
193
|
-
*
|
|
217
|
+
* Applies when timestamp validation is enabled.
|
|
194
218
|
* @param seconds - The tolerance in seconds
|
|
195
219
|
* @returns The decoder instance for chaining
|
|
196
220
|
*/
|
|
@@ -202,6 +226,42 @@ export declare class Decoder implements IDecoder {
|
|
|
202
226
|
* @returns The decoder instance for chaining
|
|
203
227
|
*/
|
|
204
228
|
maxDecompressedBytes(bytes: number): Decoder;
|
|
229
|
+
/**
|
|
230
|
+
* Verify signature with a custom verifier callback.
|
|
231
|
+
* Use for external crypto providers (HSM, cloud KMS, remote signing, etc.)
|
|
232
|
+
*
|
|
233
|
+
* @param verifier - Function that verifies signatures
|
|
234
|
+
* @returns The decoder instance for chaining
|
|
235
|
+
*
|
|
236
|
+
* @example
|
|
237
|
+
* ```typescript
|
|
238
|
+
* const result = new Decoder(qrText)
|
|
239
|
+
* .verifyWith((algorithm, keyId, data, signature) => {
|
|
240
|
+
* // Call your crypto provider here
|
|
241
|
+
* myKms.verify(keyId, data, signature);
|
|
242
|
+
* })
|
|
243
|
+
* .decode();
|
|
244
|
+
* ```
|
|
245
|
+
*/
|
|
246
|
+
verifyWith(verifier: VerifierCallback): Decoder;
|
|
247
|
+
/**
|
|
248
|
+
* Decrypt with a custom decryptor callback.
|
|
249
|
+
* Use for external crypto providers (HSM, cloud KMS, etc.)
|
|
250
|
+
*
|
|
251
|
+
* @param decryptor - Function that decrypts ciphertext
|
|
252
|
+
* @returns The decoder instance for chaining
|
|
253
|
+
*
|
|
254
|
+
* @example
|
|
255
|
+
* ```typescript
|
|
256
|
+
* const result = new Decoder(qrText)
|
|
257
|
+
* .decryptWith((algorithm, keyId, nonce, aad, ciphertext) => {
|
|
258
|
+
* // Call your crypto provider here
|
|
259
|
+
* return myKms.decrypt(keyId, ciphertext, { nonce, aad });
|
|
260
|
+
* })
|
|
261
|
+
* .decode();
|
|
262
|
+
* ```
|
|
263
|
+
*/
|
|
264
|
+
decryptWith(decryptor: DecryptorCallback): Decoder;
|
|
205
265
|
/**
|
|
206
266
|
* Decode the QR code with the configured options.
|
|
207
267
|
* Requires either a verifier (verifyWithEd25519/verifyWithEcdsaP256) or
|
|
@@ -216,7 +276,7 @@ export declare class Decoder implements IDecoder {
|
|
|
216
276
|
*
|
|
217
277
|
* Notes:
|
|
218
278
|
* - If you don't provide a verification key, you must explicitly set `allowUnverified: true` (testing only).
|
|
219
|
-
* - Timestamp validation is
|
|
279
|
+
* - Timestamp validation is enabled by default in JS (host-side). Set `validateTimestamps: false` to disable.
|
|
220
280
|
*/
|
|
221
281
|
export interface DecodeOptions {
|
|
222
282
|
verifyWithEd25519?: Uint8Array;
|
|
@@ -304,6 +364,44 @@ export declare class Encoder implements IEncoder {
|
|
|
304
364
|
* @returns The encoder instance for chaining
|
|
305
365
|
*/
|
|
306
366
|
skipBiometrics(): Encoder;
|
|
367
|
+
/**
|
|
368
|
+
* Sign with a custom signer callback.
|
|
369
|
+
* Use for external crypto providers (HSM, cloud KMS, remote signing, etc.)
|
|
370
|
+
*
|
|
371
|
+
* @param signer - Function that signs data
|
|
372
|
+
* @param algorithm - Signature algorithm: "EdDSA" or "ES256"
|
|
373
|
+
* @param keyId - Optional key identifier passed to the signer callback
|
|
374
|
+
* @returns The encoder instance for chaining
|
|
375
|
+
*
|
|
376
|
+
* @example
|
|
377
|
+
* ```typescript
|
|
378
|
+
* const qrData = new Encoder(claim169, cwtMeta)
|
|
379
|
+
* .signWith((algorithm, keyId, data) => {
|
|
380
|
+
* return myKms.sign({ keyId, data });
|
|
381
|
+
* }, "EdDSA")
|
|
382
|
+
* .encode();
|
|
383
|
+
* ```
|
|
384
|
+
*/
|
|
385
|
+
signWith(signer: SignerCallback, algorithm: "EdDSA" | "ES256", keyId?: Uint8Array | null): Encoder;
|
|
386
|
+
/**
|
|
387
|
+
* Encrypt with a custom encryptor callback.
|
|
388
|
+
* Use for external crypto providers (HSM, cloud KMS, etc.)
|
|
389
|
+
*
|
|
390
|
+
* @param encryptor - Function that encrypts data
|
|
391
|
+
* @param algorithm - Encryption algorithm: "A256GCM" or "A128GCM"
|
|
392
|
+
* @returns The encoder instance for chaining
|
|
393
|
+
*
|
|
394
|
+
* @example
|
|
395
|
+
* ```typescript
|
|
396
|
+
* const qrData = new Encoder(claim169, cwtMeta)
|
|
397
|
+
* .signWithEd25519(signKey)
|
|
398
|
+
* .encryptWith((algorithm, keyId, nonce, aad, plaintext) => {
|
|
399
|
+
* return myKms.encrypt({ keyId, nonce, aad, plaintext });
|
|
400
|
+
* }, "A256GCM")
|
|
401
|
+
* .encode();
|
|
402
|
+
* ```
|
|
403
|
+
*/
|
|
404
|
+
encryptWith(encryptor: EncryptorCallback, algorithm: "A256GCM" | "A128GCM"): Encoder;
|
|
307
405
|
/**
|
|
308
406
|
* Encode the credential to a Base45 QR string.
|
|
309
407
|
* @returns Base45-encoded string suitable for QR code generation
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAoFG;AAEH,YAAY,EACV,SAAS,EACT,QAAQ,EACR,aAAa,EACb,OAAO,EACP,YAAY,EACZ,YAAY,EACZ,QAAQ,EACR,QAAQ,EACR,kBAAkB,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|