@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 +2 -2
- package/dist/src/cli.js +298 -179
- package/package.json +16 -13
- package/dist/src/polyfills.js +0 -6
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/
|
|
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/
|
|
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 {
|
|
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,
|
|
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
|
|
69
|
-
|
|
70
|
-
|
|
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
|
-
|
|
73
|
-
|
|
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
|
-
|
|
120
|
+
return u;
|
|
76
121
|
}
|
|
77
|
-
async function
|
|
78
|
-
const
|
|
122
|
+
async function parseReadOptions(argv) {
|
|
123
|
+
const r = { source: await fileAsSource(argv.file) };
|
|
79
124
|
if (argv.noVerifyAssertions) {
|
|
80
|
-
|
|
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
|
-
|
|
137
|
+
r.concurrencyLimit = argv.concurrencyLimit;
|
|
84
138
|
}
|
|
85
139
|
else {
|
|
86
|
-
|
|
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
|
-
|
|
89
|
-
|
|
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
|
-
|
|
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
|
|
106
|
-
const c =
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
}
|
|
210
|
+
async function parseCreateOptions(argv) {
|
|
211
|
+
const c = {
|
|
212
|
+
source: await fileAsSource(argv.file),
|
|
213
|
+
};
|
|
110
214
|
if (argv.attributes?.length) {
|
|
111
|
-
c.
|
|
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.
|
|
114
|
-
|
|
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
|
-
|
|
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
|
-
|
|
120
|
-
|
|
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
|
-
//
|
|
123
|
-
c.
|
|
124
|
-
|
|
125
|
-
|
|
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
|
|
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
|
|
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
|
-
|
|
289
|
-
|
|
425
|
+
rewrapKeyType: {
|
|
426
|
+
alias: 'rewrap-encapsulation-algorithm',
|
|
427
|
+
group: 'Decrypt Options:',
|
|
428
|
+
desc: 'Key type for rewrap',
|
|
290
429
|
type: 'string',
|
|
291
|
-
|
|
430
|
+
default: 'rsa:2048',
|
|
292
431
|
},
|
|
293
|
-
|
|
294
|
-
alias: 'users-with-access',
|
|
432
|
+
userId: {
|
|
295
433
|
group: 'Encrypt Options:',
|
|
296
|
-
desc: 'Add users to the policy',
|
|
297
434
|
type: 'string',
|
|
298
|
-
|
|
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
|
|
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('
|
|
340
|
-
|
|
341
|
-
|
|
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
|
-
|
|
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
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
}
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
const
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
|
|
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
|
-
|
|
402
|
-
|
|
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
|
|
436
|
-
|
|
437
|
-
|
|
438
|
-
|
|
439
|
-
|
|
440
|
-
|
|
441
|
-
|
|
442
|
-
|
|
443
|
-
|
|
444
|
-
|
|
445
|
-
|
|
446
|
-
|
|
447
|
-
|
|
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
|
-
|
|
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
|
-
|
|
482
|
-
|
|
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
|
-
|
|
637
|
+
return rstrip(policyEndpoint, '/');
|
|
519
638
|
}
|
|
520
|
-
|
|
639
|
+
if (kasEndpoint) {
|
|
521
640
|
const uNoSlash = rstrip(kasEndpoint, '/');
|
|
522
|
-
|
|
641
|
+
return uNoSlash.endsWith('/kas') ? uNoSlash.slice(0, -4) : uNoSlash;
|
|
523
642
|
}
|
|
524
|
-
return
|
|
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.
|
|
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.
|
|
34
|
-
"@types/node": "^22.
|
|
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.
|
|
38
|
+
"@types/sinon": "^17.0.4",
|
|
37
39
|
"@types/yargs": "^17.0.33",
|
|
38
|
-
"
|
|
39
|
-
"
|
|
40
|
-
"chai": "^
|
|
41
|
-
"eslint": "^
|
|
42
|
-
"
|
|
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": "^
|
|
45
|
-
"prettier": "^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.
|
|
50
|
+
"typescript": "^5.8.2",
|
|
51
|
+
"typescript-eslint": "^8.26.0"
|
|
49
52
|
},
|
|
50
53
|
"dependencies": {
|
|
51
|
-
"@opentdf/sdk": "^0.
|
|
54
|
+
"@opentdf/sdk": "^0.3.0-beta.2029",
|
|
52
55
|
"yargs": "^17.7.2"
|
|
53
56
|
}
|
|
54
57
|
}
|
package/dist/src/polyfills.js
DELETED
|
@@ -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==
|