@opentdf/ctl 0.2.0-beta.1758 → 0.3.0-beta.2029

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 CHANGED
@@ -14,14 +14,14 @@ Sample round trip execution:
14
14
  echo hello-world >sample.txt
15
15
  bin/opentdf.mjs encrypt \
16
16
  --kasEndpoint http://localhost:65432/api/kas \
17
- --oidcEndpoint http://localhost:65432/auth/realms/tdf \
17
+ --oidcEndpoint http://localhost:65432/auth/realms/opentdf \
18
18
  --auth tdf-client:123-456 \
19
19
  --containerType tdf3 \
20
20
  --output sample.tdf \
21
21
  sample.txt
22
22
  bin/opentdf.mjs \
23
23
  --kasEndpoint http://localhost:65432/api/kas \
24
- --oidcEndpoint http://localhost:65432/auth/realms/tdf \
24
+ --oidcEndpoint http://localhost:65432/auth/realms/opentdf \
25
25
  --auth tdf-client:123-456 \
26
26
  --containerType tdf3 \
27
27
  --userId alice@somewhere.there \
package/dist/src/cli.js CHANGED
@@ -1,14 +1,20 @@
1
- import './polyfills.js';
2
1
  import { createWriteStream, openAsBlob } from 'node:fs';
3
- import { readFile, stat, writeFile } from 'node:fs/promises';
2
+ import { stat } from 'node:fs/promises';
4
3
  import { Writable } from 'node:stream';
5
4
  import yargs from 'yargs';
6
5
  import { hideBin } from 'yargs/helpers';
7
- import { AuthProviders, NanoTDFClient, NanoTDFDatasetClient, TDF3Client, version, EncryptParamsBuilder, DecryptParamsBuilder, } from '@opentdf/sdk';
6
+ import { AuthProviders, version, tdfSpecVersion, OpenTDF, isPublicKeyAlgorithm, } from '@opentdf/sdk';
8
7
  import { CLIError, log } from './logger.js';
9
8
  import * as assertions from '@opentdf/sdk/assertions';
10
9
  import { attributeFQNsAsValues } from '@opentdf/sdk/nano';
11
10
  import { base64 } from '@opentdf/sdk/encodings';
11
+ import { importPKCS8, importSPKI } from 'jose'; // for RS256
12
+ class InvalidAuthProvider {
13
+ async updateClientPublicKey() { }
14
+ withCreds() {
15
+ throw new Error('Method not implemented.');
16
+ }
17
+ }
12
18
  const bindingTypes = ['ecdsa', 'gmac'];
13
19
  const containerTypes = ['tdf3', 'nano', 'dataset', 'ztdf'];
14
20
  const parseJwt = (jwt, field = 1) => {
@@ -19,6 +25,9 @@ const parseJwtComplete = (jwt) => {
19
25
  };
20
26
  async function processAuth({ auth, clientId, clientSecret, concurrencyLimit, oidcEndpoint, userId, }) {
21
27
  log('DEBUG', 'Processing auth params');
28
+ if (!oidcEndpoint) {
29
+ throw new CLIError('CRITICAL', 'oidcEndpoint must be specified');
30
+ }
22
31
  if (auth) {
23
32
  log('DEBUG', 'Processing an auth string');
24
33
  const authParts = auth.split(':');
@@ -65,31 +74,118 @@ const rstrip = (str, suffix = ' ') => {
65
74
  }
66
75
  return str;
67
76
  };
68
- function addParams(client, argv) {
69
- if (argv.attributes?.length) {
70
- client.dataAttributes = argv.attributes.split(',');
77
+ async function parseAssertionVerificationKeys(s) {
78
+ let u;
79
+ try {
80
+ u = JSON.parse(s);
81
+ }
82
+ catch (err) {
83
+ // try as file name:
84
+ try {
85
+ const jsonFile = await openAsBlob(s);
86
+ u = JSON.parse(await jsonFile.text());
87
+ }
88
+ catch (err2) {
89
+ throw new CLIError('CRITICAL', `Failed to open/parse assertion verification keys as string or file path ${err.message}`, err2);
90
+ }
91
+ }
92
+ if (typeof u !== 'object' || u === null) {
93
+ throw new Error('Invalid input: The input must be an object');
94
+ }
95
+ // handle both cases of "keys"
96
+ if (!('Keys' in u && typeof u.Keys === 'object')) {
97
+ if ('keys' in u && typeof u.keys === 'object') {
98
+ u.Keys = u.keys;
99
+ }
100
+ else {
101
+ throw new CLIError('CRITICAL', 'Invalid input: invalid structure of assertionVerificationKeys');
102
+ }
71
103
  }
72
- if (argv.usersWithAccess?.length) {
73
- client.dissems = argv.usersWithAccess.split(',');
104
+ for (const assertionName in u.Keys) {
105
+ const assertionKey = u.Keys[assertionName];
106
+ // Ensure each entry has the required 'key' and 'alg' fields
107
+ if (typeof assertionKey !== 'object' || assertionKey === null) {
108
+ throw new CLIError('CRITICAL', `Invalid assertion for ${assertionName}: Must be an object`);
109
+ }
110
+ if (typeof assertionKey.alg !== 'string') {
111
+ throw new CLIError('CRITICAL', `Invalid assertion for ${assertionName}: Missing or invalid 'key' or 'alg'`);
112
+ }
113
+ try {
114
+ u.Keys[assertionName].key = await correctAssertionKeys(assertionKey);
115
+ }
116
+ catch (err) {
117
+ throw new CLIError('CRITICAL', `Issue converting assertion key from string: ${err.message}`);
118
+ }
74
119
  }
75
- log('SILLY', `Built encrypt params dissems: ${client.dissems}, attrs: ${client.dataAttributes}`);
120
+ return u;
76
121
  }
77
- async function tdf3DecryptParamsFor(argv) {
78
- const c = new DecryptParamsBuilder();
122
+ async function parseReadOptions(argv) {
123
+ const r = { source: await fileAsSource(argv.file) };
79
124
  if (argv.noVerifyAssertions) {
80
- c.withNoVerifyAssertions(true);
125
+ r.noVerify = true;
126
+ }
127
+ if (argv.assertionVerificationKeys) {
128
+ r.assertionVerificationKeys = await parseAssertionVerificationKeys(argv.assertionVerificationKeys);
129
+ }
130
+ if (argv.rewrapKeyType?.length) {
131
+ if (!isPublicKeyAlgorithm(argv.rewrapKeyType)) {
132
+ throw new CLIError('CRITICAL', `Unsupported rewrap key algorithm: [${argv.rewrapKeyType}]`);
133
+ }
134
+ r.wrappingKeyAlgorithm = argv.rewrapKeyType;
81
135
  }
82
136
  if (argv.concurrencyLimit) {
83
- c.withConcurrencyLimit(argv.concurrencyLimit);
137
+ r.concurrencyLimit = argv.concurrencyLimit;
84
138
  }
85
139
  else {
86
- c.withConcurrencyLimit(100);
140
+ r.concurrencyLimit = 100;
141
+ }
142
+ return r;
143
+ }
144
+ async function correctAssertionKeys({ alg, key, }) {
145
+ if (alg === 'HS256') {
146
+ // Convert key string to Uint8Array
147
+ if (typeof key !== 'string') {
148
+ throw new CLIError('CRITICAL', 'HS256 key must be a string');
149
+ }
150
+ return new TextEncoder().encode(key); // Update array element directly
151
+ }
152
+ else if (alg === 'RS256') {
153
+ // Convert PEM string to a KeyLike object
154
+ if (typeof key !== 'string') {
155
+ throw new CLIError('CRITICAL', 'RS256 key must be a PEM string');
156
+ }
157
+ try {
158
+ return await importPKCS8(key, 'RS256'); // Import private key
159
+ }
160
+ catch (err) {
161
+ // If importing as a private key fails, try importing as a public key
162
+ log('SILLY', `Failed to import RS256 key as private key: ${err.message}`);
163
+ try {
164
+ return await importSPKI(key, 'RS256'); // Import public key
165
+ }
166
+ catch (err) {
167
+ throw new CLIError('CRITICAL', `Issue converting RS256 key: ${err.message}`, err);
168
+ }
169
+ }
87
170
  }
88
- c.setFileSource(await openAsBlob(argv.file));
89
- return c.build();
171
+ // Otherwise its an unsupported alg
172
+ throw new CLIError('CRITICAL', `Unsupported signing key algorithm: ${alg}`); // Handle unsupported algs
90
173
  }
91
- function parseAssertionConfig(s) {
92
- const u = JSON.parse(s);
174
+ async function parseAssertionConfig(s) {
175
+ let u;
176
+ try {
177
+ u = JSON.parse(s);
178
+ }
179
+ catch (err) {
180
+ // try as file name:
181
+ try {
182
+ const jsonFile = await openAsBlob(s);
183
+ u = JSON.parse(await jsonFile.text());
184
+ }
185
+ catch (err2) {
186
+ throw new CLIError('CRITICAL', `Failed to open/parse assertions as string or file path ${err.message} [${err2}]`, err);
187
+ }
188
+ }
93
189
  // if u is null or empty, return an empty array
94
190
  if (!u) {
95
191
  return [];
@@ -99,34 +195,62 @@ function parseAssertionConfig(s) {
99
195
  if (!assertions.isAssertionConfig(assertion)) {
100
196
  throw new CLIError('CRITICAL', `invalid assertion config ${JSON.stringify(assertion)}`);
101
197
  }
198
+ if (!assertion.signingKey) {
199
+ continue;
200
+ }
201
+ try {
202
+ assertion.signingKey.key = await correctAssertionKeys(assertion.signingKey);
203
+ }
204
+ catch (err) {
205
+ throw new CLIError('CRITICAL', `Issue converting assertion key from string: ${err.message}`, err);
206
+ }
102
207
  }
103
208
  return a;
104
209
  }
105
- async function tdf3EncryptParamsFor(argv) {
106
- const c = new EncryptParamsBuilder();
107
- if (argv.assertions?.length) {
108
- c.withAssertions(parseAssertionConfig(argv.assertions));
109
- }
210
+ async function parseCreateOptions(argv) {
211
+ const c = {
212
+ source: await fileAsSource(argv.file),
213
+ };
110
214
  if (argv.attributes?.length) {
111
- c.setAttributes(argv.attributes.split(','));
215
+ c.attributes = argv.attributes.split(',');
216
+ }
217
+ c.autoconfigure = !!argv.autoconfigure;
218
+ return c;
219
+ }
220
+ async function parseCreateZTDFOptions(argv) {
221
+ const c = await parseCreateOptions(argv);
222
+ if (argv.assertions?.length) {
223
+ c.assertionConfigs = await parseAssertionConfig(argv.assertions);
112
224
  }
113
- if (argv.usersWithAccess?.length) {
114
- c.setUsersWithAccess(argv.usersWithAccess.split(','));
225
+ if (argv.encapKeyType?.length) {
226
+ if (!isPublicKeyAlgorithm(argv.encapKeyType)) {
227
+ throw new CLIError('CRITICAL', `Unsupported rewrap key algorithm: [${argv.encapKeyType}]`);
228
+ }
229
+ c.wrappingKeyAlgorithm = argv.encapKeyType;
115
230
  }
116
231
  if (argv.mimeType?.length) {
117
- c.setMimeType(argv.mimeType);
232
+ if (argv.mimeType && /^[a-z]+\/[a-z0-9-+.]+$/.test(argv.mimeType)) {
233
+ c.mimeType = argv.mimeType;
234
+ }
235
+ else {
236
+ throw new CLIError('CRITICAL', 'Invalid mimeType format');
237
+ }
118
238
  }
119
- if (argv.autoconfigure) {
120
- c.withAutoconfigure();
239
+ log('DEBUG', `CreateZTDFOptions: ${JSON.stringify(c)}`);
240
+ return c;
241
+ }
242
+ async function parseCreateNanoTDFOptions(argv) {
243
+ const c = await parseCreateOptions(argv);
244
+ const ecdsaBinding = argv.policyBinding?.toLowerCase() == 'ecdsa';
245
+ if (ecdsaBinding) {
246
+ c.bindingType = 'ecdsa';
121
247
  }
122
- // use offline mode, we do not have upsert for v2
123
- c.setOffline();
124
- // FIXME TODO must call file.close() after we are done
125
- const buffer = await processDataIn(argv.file);
126
- c.setBufferSource(buffer);
127
- return c.build();
248
+ // NOTE autoconfigure is not yet supported in nanotdf
249
+ delete c.autoconfigure;
250
+ log('DEBUG', `CreateNanoTDFOptions: ${JSON.stringify(c)}`);
251
+ return c;
128
252
  }
129
- async function processDataIn(file) {
253
+ async function fileAsSource(file) {
130
254
  if (!file) {
131
255
  throw new CLIError('CRITICAL', 'Must specify file or pipe');
132
256
  }
@@ -137,10 +261,10 @@ async function processDataIn(file) {
137
261
  }
138
262
  }
139
263
  catch (e) {
140
- throw new CLIError('CRITICAL', `File is not accessable [${file}]`);
264
+ throw new CLIError('CRITICAL', `File is not accessable [${file}]`, e);
141
265
  }
142
266
  log('DEBUG', `Using input from file [${file}]`);
143
- return readFile(file);
267
+ return { type: 'file-browser', location: await openAsBlob(file) };
144
268
  }
145
269
  export const handleArgs = (args) => {
146
270
  return (yargs(args)
@@ -169,13 +293,11 @@ export const handleArgs = (args) => {
169
293
  })
170
294
  // AUTH OPTIONS
171
295
  .option('kasEndpoint', {
172
- demandOption: true,
173
296
  group: 'Server Endpoints:',
174
297
  type: 'string',
175
298
  description: 'URL to non-default KAS instance (https://mykas.net)',
176
299
  })
177
300
  .option('oidcEndpoint', {
178
- demandOption: true,
179
301
  group: 'Server Endpoints:',
180
302
  type: 'string',
181
303
  description: 'URL to non-default OIDC IdP (https://myidp.net)',
@@ -201,6 +323,14 @@ export const handleArgs = (args) => {
201
323
  group: 'Decrypt',
202
324
  desc: 'Do not verify assertions',
203
325
  type: 'boolean',
326
+ })
327
+ .option('assertionVerificationKeys', {
328
+ alias: 'with-assertion-verification-keys',
329
+ group: 'Decrypt',
330
+ desc: 'keys for assertion verification or path to a json file containing keys for assertion verification',
331
+ type: 'string',
332
+ default: '',
333
+ validate: parseAssertionVerificationKeys,
204
334
  })
205
335
  .option('concurrencyLimit', {
206
336
  alias: 'concurrency-limit',
@@ -248,7 +378,7 @@ export const handleArgs = (args) => {
248
378
  .options({
249
379
  assertions: {
250
380
  group: 'Encrypt Options:',
251
- desc: 'ZTDF assertion config objects',
381
+ desc: 'ZTDF assertion config objects or path to a json file containing ZTDF assertion config objects',
252
382
  type: 'string',
253
383
  default: '',
254
384
  validate: parseAssertionConfig,
@@ -273,6 +403,13 @@ export const handleArgs = (args) => {
273
403
  description: 'Container format',
274
404
  default: 'nano',
275
405
  },
406
+ encapKeyType: {
407
+ alias: 'encapsulation-algorithm',
408
+ group: 'Encrypt Options:',
409
+ desc: 'Key type for wrapping keys',
410
+ type: 'string',
411
+ default: 'rsa:2048',
412
+ },
276
413
  policyBinding: {
277
414
  group: 'Encrypt Options:',
278
415
  choices: bindingTypes,
@@ -285,21 +422,19 @@ export const handleArgs = (args) => {
285
422
  type: 'string',
286
423
  default: '',
287
424
  },
288
- userId: {
289
- group: 'Encrypt Options:',
425
+ rewrapKeyType: {
426
+ alias: 'rewrap-encapsulation-algorithm',
427
+ group: 'Decrypt Options:',
428
+ desc: 'Key type for rewrap',
290
429
  type: 'string',
291
- description: 'Owner email address',
430
+ default: 'rsa:2048',
292
431
  },
293
- usersWithAccess: {
294
- alias: 'users-with-access',
432
+ userId: {
295
433
  group: 'Encrypt Options:',
296
- desc: 'Add users to the policy',
297
434
  type: 'string',
298
- default: '',
299
- validate: (users) => users.split(','),
435
+ description: 'Owner email address',
300
436
  },
301
437
  })
302
- // COMMANDS
303
438
  .options({
304
439
  logLevel: {
305
440
  group: 'Verbosity:',
@@ -319,7 +454,7 @@ export const handleArgs = (args) => {
319
454
  type: 'string',
320
455
  description: 'output file',
321
456
  })
322
- .command('attrs', 'Look up defintions of attributes', (yargs) => {
457
+ .command('attrs', 'Look up definitions of attributes', (yargs) => {
323
458
  yargs.strict();
324
459
  }, async (argv) => {
325
460
  log('DEBUG', 'attribute value lookup');
@@ -333,97 +468,104 @@ export const handleArgs = (args) => {
333
468
  authProvider.updateClientPublicKey(signingKey);
334
469
  log('DEBUG', `Initialized auth provider ${JSON.stringify(authProvider)}`);
335
470
  const policyUrl = guessPolicyUrl(argv);
471
+ if (!policyUrl) {
472
+ throw new CLIError('CRITICAL', 'policyEndpoint must be specified');
473
+ }
336
474
  const defs = await attributeFQNsAsValues(policyUrl, authProvider, ...argv.attributes.split(','));
337
475
  console.log(JSON.stringify(defs, null, 2));
338
476
  })
339
- .command('decrypt [file]', 'Decrypt TDF to string',
340
- // eslint-disable-next-line @typescript-eslint/no-empty-function
341
- (yargs) => {
477
+ .command('inspect [file]', 'Inspect TDF or nanoTDF and extract header information, without decrypting', (yargs) => {
478
+ yargs.strict().positional('file', {
479
+ describe: 'path to encrypted file',
480
+ type: 'string',
481
+ });
482
+ }, async (argv) => {
483
+ log('DEBUG', 'Running inspect command');
484
+ const ct = new OpenTDF({
485
+ authProvider: new InvalidAuthProvider(),
486
+ });
487
+ try {
488
+ const reader = ct.open(await parseReadOptions(argv));
489
+ const manifest = await reader.manifest();
490
+ try {
491
+ const dataAttributes = await reader.attributes();
492
+ console.log(JSON.stringify({ manifest, dataAttributes }, null, 2));
493
+ }
494
+ catch (err) {
495
+ console.error(err);
496
+ console.log(JSON.stringify({ manifest }, null, 2));
497
+ }
498
+ }
499
+ finally {
500
+ ct.close();
501
+ }
502
+ })
503
+ .command('decrypt [file]', 'Decrypt TDF to string', (yargs) => {
342
504
  yargs.strict().positional('file', {
343
505
  describe: 'path to plain text file',
344
506
  type: 'string',
345
507
  });
346
508
  }, async (argv) => {
347
509
  log('DEBUG', 'Running decrypt command');
348
- const allowedKases = argv.allowList?.split(',');
510
+ let allowedKases = argv.allowList?.split(',');
511
+ if (!allowedKases) {
512
+ allowedKases = argv.kasEndpoint ? [argv.kasEndpoint] : [];
513
+ }
514
+ log('DEBUG', `Allowed KASes: ${allowedKases}`);
349
515
  const ignoreAllowList = !!argv.ignoreAllowList;
516
+ if (!argv.oidcEndpoint) {
517
+ throw new CLIError('CRITICAL', 'oidcEndpoint must be specified');
518
+ }
350
519
  const authProvider = await processAuth(argv);
351
520
  log('DEBUG', `Initialized auth provider ${JSON.stringify(authProvider)}`);
352
- const kasEndpoint = argv.kasEndpoint;
353
- if (argv.containerType === 'tdf3' || argv.containerType == 'ztdf') {
354
- log('DEBUG', `TDF3 Client`);
355
- const client = new TDF3Client({
356
- allowedKases,
357
- ignoreAllowList,
358
- authProvider,
359
- kasEndpoint,
360
- dpopEnabled: argv.dpop,
361
- });
362
- log('SILLY', `Initialized client ${JSON.stringify(client)}`);
363
- log('DEBUG', `About to decrypt [${argv.file}]`);
364
- const ct = await client.decrypt(await tdf3DecryptParamsFor(argv));
365
- if (argv.output) {
366
- const destination = createWriteStream(argv.output);
367
- await ct.stream.pipeTo(Writable.toWeb(destination));
368
- }
369
- else {
370
- console.log(await ct.toString());
371
- }
372
- }
373
- else {
374
- const dpopEnabled = !!argv.dpop;
375
- const client = argv.containerType === 'nano'
376
- ? new NanoTDFClient({
377
- allowedKases,
378
- ignoreAllowList,
379
- authProvider,
380
- kasEndpoint,
381
- dpopEnabled,
382
- })
383
- : new NanoTDFDatasetClient({
384
- allowedKases,
385
- ignoreAllowList,
386
- authProvider,
387
- kasEndpoint,
388
- dpopEnabled,
389
- });
390
- const buffer = await processDataIn(argv.file);
391
- log('DEBUG', 'Decrypt data.');
392
- const plaintext = await client.decrypt(buffer);
393
- log('DEBUG', 'Handle output.');
394
- if (argv.output) {
395
- await writeFile(argv.output, new Uint8Array(plaintext));
396
- }
397
- else {
398
- console.log(new TextDecoder().decode(plaintext));
521
+ const client = new OpenTDF({
522
+ authProvider,
523
+ defaultCreateOptions: {
524
+ defaultKASEndpoint: argv.kasEndpoint,
525
+ },
526
+ defaultReadOptions: {
527
+ allowedKASEndpoints: allowedKases,
528
+ ignoreAllowlist: ignoreAllowList,
529
+ noVerify: !!argv.noVerifyAssertions,
530
+ },
531
+ disableDPoP: !argv.dpop,
532
+ policyEndpoint: guessPolicyUrl(argv),
533
+ });
534
+ try {
535
+ log('SILLY', `Initialized client`);
536
+ log('DEBUG', `About to TDF3 decrypt [${argv.file}]`);
537
+ const ct = await client.read(await parseReadOptions(argv));
538
+ const destination = argv.output ? createWriteStream(argv.output) : process.stdout;
539
+ await ct.pipeTo(Writable.toWeb(destination));
540
+ const lastRequest = authProvider.requestLog[authProvider.requestLog.length - 1];
541
+ log('SILLY', `last request is ${JSON.stringify(lastRequest)}`);
542
+ let accessToken = null;
543
+ let dpopToken = null;
544
+ for (const h of Object.keys(lastRequest.headers)) {
545
+ switch (h.toLowerCase()) {
546
+ case 'dpop':
547
+ console.assert(!dpopToken, 'Multiple dpop headers found');
548
+ dpopToken = parseJwtComplete(lastRequest.headers[h]);
549
+ log('INFO', `dpop: ${JSON.stringify(dpopToken)}`);
550
+ break;
551
+ case 'authorization':
552
+ console.assert(!accessToken, 'Multiple authorization headers found');
553
+ accessToken = parseJwt(lastRequest.headers[h].split(' ')[1]);
554
+ log('INFO', `Access Token: ${JSON.stringify(accessToken)}`);
555
+ if (argv.dpop) {
556
+ console.assert(accessToken.cnf?.jkt, 'Access token must have a cnf.jkt');
557
+ }
558
+ break;
559
+ }
399
560
  }
561
+ console.assert(accessToken, 'No access_token found');
562
+ console.assert(!argv.dpop || dpopToken, 'DPoP requested but absent');
400
563
  }
401
- const lastRequest = authProvider.requestLog[authProvider.requestLog.length - 1];
402
- let accessToken = null;
403
- let dpopToken = null;
404
- for (const h of Object.keys(lastRequest.headers)) {
405
- switch (h.toLowerCase()) {
406
- case 'dpop':
407
- console.assert(!dpopToken, 'Multiple dpop headers found');
408
- dpopToken = parseJwtComplete(lastRequest.headers[h]);
409
- log('INFO', `dpop: ${JSON.stringify(dpopToken)}`);
410
- break;
411
- case 'authorization':
412
- console.assert(!accessToken, 'Multiple authorization headers found');
413
- accessToken = parseJwt(lastRequest.headers[h].split(' ')[1]);
414
- log('INFO', `Access Token: ${JSON.stringify(accessToken)}`);
415
- if (argv.dpop) {
416
- console.assert(accessToken.cnf?.jkt, 'Access token must have a cnf.jkt');
417
- }
418
- break;
419
- }
564
+ finally {
565
+ client.close();
420
566
  }
421
- console.assert(accessToken, 'No access_token found');
422
- console.assert(!argv.dpop || dpopToken, 'DPoP requested but absent');
423
567
  })
424
- .command('encrypt [file]', 'Encrypt file or pipe to a TDF',
425
- // eslint-disable-next-line @typescript-eslint/no-empty-function
426
- (yargs) => {
568
+ .command('encrypt [file]', 'Encrypt file or pipe to a TDF', (yargs) => {
427
569
  yargs.strict().positional('file', {
428
570
  describe: 'path to plain text file',
429
571
  type: 'string',
@@ -432,55 +574,33 @@ export const handleArgs = (args) => {
432
574
  log('DEBUG', 'Running encrypt command');
433
575
  const authProvider = await processAuth(argv);
434
576
  log('DEBUG', `Initialized auth provider ${JSON.stringify(authProvider)}`);
435
- const kasEndpoint = argv.kasEndpoint;
436
- const ignoreAllowList = !!argv.ignoreAllowList;
437
- const allowedKases = argv.allowList?.split(',');
438
- if ('tdf3' === argv.containerType || 'ztdf' === argv.containerType) {
439
- log('DEBUG', `TDF3 Client`);
440
- const policyEndpoint = guessPolicyUrl(argv);
441
- const client = new TDF3Client({
442
- allowedKases,
443
- ignoreAllowList,
444
- authProvider,
445
- kasEndpoint,
446
- policyEndpoint,
447
- dpopEnabled: argv.dpop,
448
- });
449
- log('SILLY', `Initialized client ${JSON.stringify(client)}`);
450
- const ct = await client.encrypt(await tdf3EncryptParamsFor(argv));
451
- if (!ct) {
452
- throw new CLIError('CRITICAL', 'Encrypt configuration error: No output?');
453
- }
454
- if (argv.output) {
455
- const destination = createWriteStream(argv.output);
456
- await ct.stream.pipeTo(Writable.toWeb(destination));
577
+ const client = new OpenTDF({
578
+ authProvider,
579
+ defaultCreateOptions: {
580
+ defaultKASEndpoint: argv.kasEndpoint,
581
+ },
582
+ disableDPoP: !argv.dpop,
583
+ policyEndpoint: guessPolicyUrl(argv),
584
+ });
585
+ try {
586
+ log('SILLY', `Initialized client`);
587
+ let ct;
588
+ if ('tdf3' === argv.containerType || 'ztdf' === argv.containerType) {
589
+ log('DEBUG', `TDF3 Create`);
590
+ ct = await client.createZTDF(await parseCreateZTDFOptions(argv));
457
591
  }
458
592
  else {
459
- console.log(await ct.toString());
460
- }
461
- }
462
- else {
463
- const dpopEnabled = !!argv.dpop;
464
- const ecdsaBinding = argv.policyBinding.toLowerCase() == 'ecdsa';
465
- const client = argv.containerType === 'nano'
466
- ? new NanoTDFClient({ allowedKases, authProvider, dpopEnabled, kasEndpoint })
467
- : new NanoTDFDatasetClient({
468
- allowedKases,
469
- authProvider,
470
- dpopEnabled,
471
- kasEndpoint,
472
- });
473
- log('SILLY', `Initialized client ${JSON.stringify(client)}`);
474
- addParams(client, argv);
475
- const buffer = await processDataIn(argv.file);
476
- const cyphertext = await client.encrypt(buffer, { ecdsaBinding });
477
- log('DEBUG', `Handle cyphertext output ${JSON.stringify(cyphertext)}`);
478
- if (argv.output) {
479
- await writeFile(argv.output, new Uint8Array(cyphertext));
593
+ log('DEBUG', `Nano Create`);
594
+ ct = await client.createNanoTDF(await parseCreateNanoTDFOptions(argv));
480
595
  }
481
- else {
482
- console.log(base64.encodeArrayBuffer(cyphertext));
596
+ if (!ct) {
597
+ throw new CLIError('CRITICAL', 'Encrypt configuration error: No output?');
483
598
  }
599
+ const destination = argv.output ? createWriteStream(argv.output) : process.stdout;
600
+ await ct.pipeTo(Writable.toWeb(destination));
601
+ }
602
+ finally {
603
+ client.close();
484
604
  }
485
605
  })
486
606
  .usage('openTDF CLI\n\nUsage: $0 [options]')
@@ -494,15 +614,15 @@ export const handleArgs = (args) => {
494
614
  },
495
615
  })
496
616
  .version('version', JSON.stringify({
497
- '@opentdf/ctl': process.env.npm_package_version || 'UNRELEASED',
498
617
  '@opentdf/sdk': version,
618
+ tdfSpecVersion,
499
619
  }))
500
620
  .alias('version', 'V')
501
621
  .strict()
502
622
  .parseAsync());
503
623
  };
504
624
  export const main = async (argsPromise) => {
505
- argsPromise;
625
+ return argsPromise;
506
626
  };
507
627
  handleArgs(hideBin(process.argv))
508
628
  .then(main)
@@ -513,14 +633,13 @@ handleArgs(hideBin(process.argv))
513
633
  console.error(err);
514
634
  });
515
635
  function guessPolicyUrl({ kasEndpoint, policyEndpoint, }) {
516
- let policyUrl;
517
636
  if (policyEndpoint) {
518
- policyUrl = rstrip(policyEndpoint, '/');
637
+ return rstrip(policyEndpoint, '/');
519
638
  }
520
- else {
639
+ if (kasEndpoint) {
521
640
  const uNoSlash = rstrip(kasEndpoint, '/');
522
- policyUrl = uNoSlash.endsWith('/kas') ? uNoSlash.slice(0, -4) : uNoSlash;
641
+ return uNoSlash.endsWith('/kas') ? uNoSlash.slice(0, -4) : uNoSlash;
523
642
  }
524
- return policyUrl;
643
+ return undefined;
525
644
  }
526
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xpLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2NsaS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLGdCQUFnQixDQUFDO0FBQ3hCLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxVQUFVLEVBQUUsTUFBTSxTQUFTLENBQUM7QUFDeEQsT0FBTyxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsU0FBUyxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDN0QsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUN2QyxPQUFPLEtBQUssTUFBTSxPQUFPLENBQUM7QUFDMUIsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUN4QyxPQUFPLEVBSUwsYUFBYSxFQUNiLGFBQWEsRUFDYixvQkFBb0IsRUFDcEIsVUFBVSxFQUNWLE9BQU8sRUFDUCxvQkFBb0IsRUFFcEIsb0JBQW9CLEdBQ3JCLE1BQU0sY0FBYyxDQUFDO0FBQ3RCLE9BQU8sRUFBRSxRQUFRLEVBQVMsR0FBRyxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBRW5ELE9BQU8sS0FBSyxVQUFVLE1BQU0seUJBQXlCLENBQUM7QUFDdEQsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDMUQsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBZWhELE1BQU0sWUFBWSxHQUFHLENBQUMsT0FBTyxFQUFFLE1BQU0sQ0FBQyxDQUFDO0FBRXZDLE1BQU0sY0FBYyxHQUFHLENBQUMsTUFBTSxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUUsTUFBTSxDQUFDLENBQUM7QUFFM0QsTUFBTSxRQUFRLEdBQUcsQ0FBQyxHQUFXLEVBQUUsS0FBSyxHQUFHLENBQUMsRUFBRSxFQUFFO0lBQzFDLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFD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
645
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xpLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2NsaS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsVUFBVSxFQUFFLE1BQU0sU0FBUyxDQUFDO0FBQ3hELE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUN4QyxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQ3ZDLE9BQU8sS0FBSyxNQUFNLE9BQU8sQ0FBQztBQUMxQixPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3hDLE9BQU8sRUFRTCxhQUFhLEVBQ2IsT0FBTyxFQUNQLGNBQWMsRUFDZCxPQUFPLEVBRVAsb0JBQW9CLEdBQ3JCLE1BQU0sY0FBYyxDQUFDO0FBQ3RCLE9BQU8sRUFBRSxRQUFRLEVBQVMsR0FBRyxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBRW5ELE9BQU8sS0FBSyxVQUFVLE1BQU0seUJBQXlCLENBQUM7QUFDdEQsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDMUQsT0FBTyxFQUFFLE1BQU0sRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ2hELE9BQU8sRUFBa0IsV0FBVyxFQUFFLFVBQVUsRUFBRSxNQUFNLE1BQU0sQ0FBQyxDQUFDLFlBQVk7QUFlNUUsTUFBTSxtQkFBbUI7SUFDdkIsS0FBSyxDQUFDLHFCQUFxQixLQUFtQixDQUFDO0lBQy9DLFNBQVM7UUFDUCxNQUFNLElBQUksS0FBSyxDQUFDLHlCQUF5QixDQUFDLENBQUM7SUFDN0MsQ0FBQztDQUNGO0FBRUQsTUFBTSxZQUFZLEdBQUcsQ0FBQyxPQUFPLEVBQUUsTUFBTSxDQUFDLENBQUM7QUFFdkMsTUFBTSxjQUFjLEdBQUcsQ0FBQyxNQUFNLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBRSxNQUFNLENBQUMsQ0FBQztBQUUzRCxNQUFNLFFBQVEsR0FBRyxDQUFDLEdB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
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@opentdf/ctl",
3
- "version": "0.2.0-beta.1758",
3
+ "version": "0.3.0-beta.2029",
4
4
  "description": "Node based CLI for opentdf",
5
5
  "repository": {
6
6
  "type": "git",
@@ -29,26 +29,29 @@
29
29
  "opentdf": "./bin/opentdf.mjs"
30
30
  },
31
31
  "devDependencies": {
32
+ "@eslint/eslintrc": "^3.3.0",
33
+ "@eslint/js": "^9.21.0",
32
34
  "@esm-bundle/chai": "4.3.4-fix.0",
33
- "@types/mocha": "10.0.9",
34
- "@types/node": "^22.9.0",
35
+ "@types/mocha": "10.0.10",
36
+ "@types/node": "^22.13.8",
35
37
  "@types/readable-stream": "^4.0.18",
36
- "@types/sinon": "^17.0.3",
38
+ "@types/sinon": "^17.0.4",
37
39
  "@types/yargs": "^17.0.33",
38
- "@typescript-eslint/eslint-plugin": "^6.2.1",
39
- "@typescript-eslint/parser": "^6.2.1",
40
- "chai": "^5.1.2",
41
- "eslint": "^8.9.0",
42
- "eslint-config-prettier": "^8.9.0",
40
+ "chai": "^5.2.0",
41
+ "eslint-config-prettier": "^10.0.2",
42
+ "eslint-plugin-chai-friendly": "^1.0.1",
43
+ "eslint-plugin-prettier": "^5.2.3",
44
+ "globals": "^16.0.0",
43
45
  "license-checker-rseidelsohn": "^4.4.2",
44
- "mocha": "^10.8.2",
45
- "prettier": "^3.3.3",
46
+ "mocha": "^11.1.0",
47
+ "prettier": "^3.5.3",
46
48
  "sinon": "^19.0.2",
47
49
  "ts-node": "^10.9.2",
48
- "typescript": "^5.1.6"
50
+ "typescript": "^5.8.2",
51
+ "typescript-eslint": "^8.26.0"
49
52
  },
50
53
  "dependencies": {
51
- "@opentdf/sdk": "^0.2.0-beta.1758",
54
+ "@opentdf/sdk": "^0.3.0-beta.2029",
52
55
  "yargs": "^17.7.2"
53
56
  }
54
57
  }
@@ -1,6 +0,0 @@
1
- if (!('document' in globalThis)) {
2
- // @ts-expect-error // document is either undefined or readonly
3
- globalThis.document = { documentElement: { style: {} } };
4
- }
5
- export {};
6
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicG9seWZpbGxzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3BvbHlmaWxscy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxJQUFJLENBQUMsQ0FBQyxVQUFVLElBQUksVUFBVSxDQUFDLEVBQUUsQ0FBQztJQUNoQywrREFBK0Q7SUFDL0QsVUFBVSxDQUFDLFFBQVEsR0FBRyxFQUFFLGVBQWUsRUFBRSxFQUFFLEtBQUssRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDO0FBQzNELENBQUMifQ==