@verii/verifgen 1.0.0-pre.1752076816

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.
@@ -0,0 +1,119 @@
1
+ const console = require('console');
2
+ const { program } = require('commander');
3
+ const { generateCredentialJwt } = require('@verii/jwt');
4
+ const common = require('./common');
5
+
6
+ const doGenerateJwt = async (selfsign, issuer, credentialType, credential) => {
7
+ const { didObject: credentialDid, privateKey: credentialPrivateKey } =
8
+ common.generateDid(issuer);
9
+
10
+ const payload = createPayload(
11
+ credential,
12
+ credentialType,
13
+ issuer.did.id,
14
+ credentialDid.id
15
+ );
16
+
17
+ if (selfsign) {
18
+ console.info(`Generating self signed ${credentialType} credential`);
19
+ return {
20
+ jwt: await generateCredentialJwt(payload, credentialPrivateKey),
21
+ };
22
+ }
23
+
24
+ console.info(`Generating ${credentialType} credential`);
25
+ return {
26
+ jwt: await generateCredentialJwt(
27
+ payload,
28
+ credentialPrivateKey,
29
+ `${credentialDid.id}#key-1`
30
+ ),
31
+ credentialDid,
32
+ };
33
+ };
34
+
35
+ const writeFiles = (outputPrefix, { jwt, credentialDid }) => {
36
+ const jwtFile = `${outputPrefix}.jwt`;
37
+ const didFile = `${outputPrefix}.did`;
38
+
39
+ common.writeFile(jwtFile, jwt);
40
+ if (credentialDid) {
41
+ common.writeFile(didFile, JSON.stringify(credentialDid, null, 2));
42
+ }
43
+ };
44
+
45
+ const isFilePath = (str) =>
46
+ str.startsWith('./') || str.startsWith('../') || str.startsWith('/');
47
+
48
+ const loadCredentialSource = (sourceTemplateOrFile) => {
49
+ return isFilePath(sourceTemplateOrFile)
50
+ ? sourceTemplateOrFile
51
+ : common.resolveTemplate(sourceTemplateOrFile);
52
+ };
53
+
54
+ const generateCredential = async (
55
+ sourceTemplate,
56
+ selfsign,
57
+ issuerPersona,
58
+ credentialType,
59
+ outputPrefix
60
+ ) => {
61
+ const issuerPrefix = issuerPersona || (selfsign ? 'self' : 'issuer');
62
+
63
+ try {
64
+ const issuer = common.loadPersonaFiles(issuerPrefix);
65
+ const credential = JSON.parse(
66
+ common.readFile(
67
+ loadCredentialSource(sourceTemplate),
68
+ 'Source template not found'
69
+ )
70
+ );
71
+
72
+ const result = await doGenerateJwt(
73
+ selfsign,
74
+ issuer,
75
+ credentialType,
76
+ credential
77
+ );
78
+
79
+ writeFiles(outputPrefix, result);
80
+ } catch (ex) {
81
+ common.printError(ex);
82
+ }
83
+ };
84
+
85
+ const createPayload = (credential, credentialType, issuer, did) => {
86
+ return {
87
+ '@context': ['https://www.w3.org/2018/credentials/v1'],
88
+ id: did,
89
+ type: [credentialType, 'VerifiableCredential'],
90
+ issuer,
91
+ issuanceDate: new Date().toISOString(),
92
+ credentialSubject: credential,
93
+ };
94
+ };
95
+
96
+ program
97
+ .name('verifgen credential')
98
+ .description('Generate a verifiable credential')
99
+ .usage('[source-template] [options]')
100
+ .arguments('[source-template]')
101
+ .option('-s, --self-sign', 'Self sign?')
102
+ .option('-i, --issuer-persona <filename>', 'Issuer Persona')
103
+ .option('-t, --credential-type <type>', 'Credential type', 'IdentityDocument')
104
+ .option(
105
+ '-o, --output-prefix <filename>',
106
+ 'Output credential file prefix',
107
+ 'credential'
108
+ )
109
+ .action((sourceTemplate) => {
110
+ const options = program.opts();
111
+ return generateCredential(
112
+ sourceTemplate,
113
+ options.selfSign,
114
+ options.issuerPersona,
115
+ options.credentialType,
116
+ options.outputPrefix
117
+ );
118
+ })
119
+ .parse(process.argv);
@@ -0,0 +1,32 @@
1
+ const { program } = require('commander');
2
+ const common = require('./common');
3
+
4
+ const generateDidFiles = ({ persona, controllerPersona }) => {
5
+ try {
6
+ const controller = controllerPersona
7
+ ? common.loadPersonaFiles(controllerPersona)
8
+ : null;
9
+
10
+ const { privateKey, didObject } = common.generateDid(controller);
11
+ const privateKeyFileName = `${persona}.prv.key`;
12
+ const didFileName = `${persona}.did`;
13
+
14
+ common.writeFile(privateKeyFileName, privateKey);
15
+ common.writeFile(didFileName, JSON.stringify(didObject, null, 2));
16
+ } catch (ex) {
17
+ common.printError(ex);
18
+ }
19
+ };
20
+
21
+ program
22
+ .name('verifgen did')
23
+ .description('Generates a did with a public key, and a separate private key')
24
+ .usage('[options]')
25
+ .option('-c, --controller-persona <name>', 'Input controller persona', null)
26
+ .option(
27
+ '-p, --persona <name>',
28
+ 'Name of the persona that the did is being generated for',
29
+ 'self'
30
+ )
31
+ .action(() => generateDidFiles(program.opts()))
32
+ .parse(process.argv);
@@ -0,0 +1,43 @@
1
+ const { program } = require('commander');
2
+ const got = require('got');
3
+ const { printInfo, printError, writeFile } = require('./common');
4
+
5
+ const environments = {
6
+ dev: 'https://devauth.velocitynetwork.foundation/oauth/token',
7
+ staging: 'https://stagingauth.velocitynetwork.foundation/oauth/token',
8
+ prod: 'https://auth.velocitynetwork.foundation/oauth/token',
9
+ };
10
+
11
+ const generateJwt = async ({ clientId, clientSecret, environment }) => {
12
+ const url = environments[environment];
13
+ return got
14
+ .post(url, {
15
+ headers: { 'content-type': 'application/json' },
16
+ json: {
17
+ grant_type: 'client_credentials',
18
+ audience: 'https://velocitynetwork.node',
19
+ client_id: clientId,
20
+ client_secret: clientSecret,
21
+ },
22
+ })
23
+ .json();
24
+ };
25
+
26
+ program
27
+ .name('verifgen jwt')
28
+ .description('Generate JWT')
29
+ .usage('[options]')
30
+ .option('-ci, --client-id <id>', 'Client id')
31
+ .option('-cs, --client-secret <secret>', 'Client secret')
32
+ .option('-e, --environment <environment>', 'Auth0 environment')
33
+ .action(async () => {
34
+ const options = program.opts();
35
+ try {
36
+ const data = await generateJwt(options);
37
+ writeFile(`node-operator-${Date.now()}.jwt`, JSON.stringify(data));
38
+ printInfo(data);
39
+ } catch (error) {
40
+ printError(error);
41
+ }
42
+ })
43
+ .parse(process.argv);
@@ -0,0 +1,34 @@
1
+ const { program } = require('commander');
2
+ const { generateKeyPair } = require('@verii/crypto');
3
+ const common = require('./common');
4
+
5
+ const generateKeys = (publicKeyFile, privateKeyFile) => {
6
+ try {
7
+ const { privateKey, publicKey } = generateKeyPair();
8
+
9
+ common.writeFile(publicKeyFile, publicKey);
10
+ common.writeFile(privateKeyFile, privateKey);
11
+ } catch (ex) {
12
+ common.printError(ex);
13
+ }
14
+ };
15
+
16
+ program
17
+ .name('verifgen personal keys')
18
+ .description('Generates a public and private key pair')
19
+ .usage('[options]')
20
+ .option(
21
+ '-b, --public-key-file <filename>',
22
+ 'Output public key file name',
23
+ 'pub.key'
24
+ )
25
+ .option(
26
+ '-v, --private-key-file <filename>',
27
+ 'Output private key file name',
28
+ 'prv.key'
29
+ )
30
+ .action(() => {
31
+ const options = program.opts();
32
+ return generateKeys(options.publicKeyFile, options.privateKeyFile);
33
+ })
34
+ .parse(process.argv);
@@ -0,0 +1,153 @@
1
+ const { program } = require('commander');
2
+ const { map, isEmpty } = require('lodash/fp');
3
+ const { nanoid } = require('nanoid');
4
+ const {
5
+ generatePresentationJwt,
6
+ toJwk,
7
+ publicKeyFromPrivateKey,
8
+ } = require('@verii/jwt');
9
+ const { mapWithIndex } = require('@verii/common-functions');
10
+ const { generateKeyPair } = require('@verii/crypto');
11
+ const { getDidUriFromJwk } = require('@verii/did-doc');
12
+ const { VnfProtocolVersions } = require('@verii/vc-checks');
13
+
14
+ const common = require('./common');
15
+
16
+ const generatePresentation = async ({
17
+ credentialSources,
18
+ issuerPersona,
19
+ presentationRequestFilename,
20
+ presentationFile,
21
+ vendorOriginContext,
22
+ protocolVersion,
23
+ }) => {
24
+ try {
25
+ const credentials = map(
26
+ (credentialSource) =>
27
+ common.readFile(`${credentialSource}`, 'JWT not found'),
28
+ credentialSources
29
+ );
30
+
31
+ const presentationRequest = JSON.parse(
32
+ common.readFile(
33
+ `${presentationRequestFilename}`,
34
+ 'Presentation Request not found'
35
+ )
36
+ );
37
+
38
+ const { issuer, privateKey } = loadIssuerData(issuerPersona);
39
+ const parsedIssuer = getIssuer({ issuer, protocolVersion });
40
+ const payload = createPayload({
41
+ credentials,
42
+ presentationRequest,
43
+ issuer: parsedIssuer,
44
+ vendorOriginContext,
45
+ });
46
+ const generatePresentationJwtFunction =
47
+ protocolVersion < VnfProtocolVersions.VNF_PROTOCOL_VERSION_2
48
+ ? generatePresentationJwt(payload, privateKey)
49
+ : generatePresentationJwt(
50
+ payload,
51
+ issuer.privateKey,
52
+ `${parsedIssuer}#0`
53
+ );
54
+ const presentationJwt = await generatePresentationJwtFunction;
55
+
56
+ common.writeFile(`${presentationFile}.jwt`, presentationJwt);
57
+ } catch (ex) {
58
+ common.printError(ex);
59
+ }
60
+ };
61
+
62
+ const createPayload = ({
63
+ credentials,
64
+ presentationRequest,
65
+ issuer,
66
+ vendorOriginContext,
67
+ }) => {
68
+ const presentationDefinition =
69
+ presentationRequest?.presentation_request?.presentation_definition ??
70
+ presentationRequest?.issuing_request?.presentation_definition;
71
+ const payload = {
72
+ '@context': ['https://www.w3.org/2018/credentials/v1'],
73
+ id: nanoid(),
74
+ issuer,
75
+ verifiableCredential: credentials,
76
+ presentation_submission: {
77
+ id: nanoid(),
78
+ definition_id: presentationDefinition.id,
79
+ descriptor_map: mapWithIndex(
80
+ (c, i) => ({
81
+ id: nanoid(),
82
+ path: `$.verifiableCredential[${i}]`,
83
+ format: 'jwt_vc',
84
+ }),
85
+ credentials
86
+ ),
87
+ },
88
+ };
89
+ if (!isEmpty(vendorOriginContext)) {
90
+ payload.vendorOriginContext = vendorOriginContext;
91
+ }
92
+ return payload;
93
+ };
94
+
95
+ const getIssuer = ({ issuer, protocolVersion }) => {
96
+ if (protocolVersion < VnfProtocolVersions.VNF_PROTOCOL_VERSION_2) {
97
+ return issuer == null ? 'https://self-issued.me' : issuer.did.id;
98
+ }
99
+
100
+ if (isEmpty(issuer?.privateKey)) {
101
+ throw new Error('Issuer Persona is required');
102
+ }
103
+
104
+ const publicKey = publicKeyFromPrivateKey(issuer?.privateKey);
105
+ return getDidUriFromJwk(toJwk(publicKey, false));
106
+ };
107
+
108
+ const loadIssuerData = (issuerPersona) => {
109
+ if (issuerPersona == null) {
110
+ return { privateKey: generateKeyPair({ format: 'jwk' }).privateKey };
111
+ }
112
+ const issuer = common.loadPersonaFiles(issuerPersona);
113
+
114
+ const { privateKey } = common.generateDid(issuer);
115
+ return {
116
+ issuer,
117
+ privateKey,
118
+ };
119
+ };
120
+
121
+ program
122
+ .name('verifgen presentation')
123
+ .description('Generate a verifiable presentation')
124
+ .usage('[options]')
125
+ .option('-c, --credential-sources [value...]', 'Credential sources', [])
126
+ .option(
127
+ '-r, --request <presentation-request-filename>',
128
+ 'Presentation Request',
129
+ 'presentation-request.json'
130
+ )
131
+ .option('-i, --issuer-persona <persona>', 'Issuer Persona')
132
+ .option('-p, --protocol-version <protocolVersion>', 'VNF protocol version', 1)
133
+ .option(
134
+ '-o, --output-presentation-fileprefix <filename>',
135
+ 'Output presentation JWT file prefix',
136
+ 'presentation'
137
+ )
138
+ .option(
139
+ '-v, --vendor-origin-context <vendor-origin-context>',
140
+ 'A preauthorization code or access token'
141
+ )
142
+ .action(() => {
143
+ const options = program.opts();
144
+ return generatePresentation({
145
+ credentialSources: options.credentialSources,
146
+ issuerPersona: options.issuerPersona,
147
+ presentationRequestFilename: options.request,
148
+ presentationFile: options.outputPresentationFileprefix,
149
+ vendorOriginContext: options.vendorOriginContext,
150
+ protocolVersion: options.protocolVersion,
151
+ });
152
+ })
153
+ .parse(process.argv);
@@ -0,0 +1,53 @@
1
+ const { isEmpty } = require('lodash/fp');
2
+ const { jwtSign, publicKeyFromPrivateKey, toJwk } = require('@verii/jwt');
3
+ const { getDidUriFromJwk } = require('@verii/did-doc');
4
+ const common = require('../common');
5
+
6
+ const generateProof = async (options) => {
7
+ try {
8
+ const nonce = loadNonce(options);
9
+ const personaInfo = await common.loadPersonaFiles(options.persona);
10
+ const publicKey = publicKeyFromPrivateKey(personaInfo.privateKey);
11
+ const proofJwt = await buildProofJwt({
12
+ nonce,
13
+ keyPair: {
14
+ publicKey,
15
+ privateKey: personaInfo.privateKey,
16
+ },
17
+ options,
18
+ });
19
+ common.printInfo(`\nGenerated proof jwt:\n${proofJwt}\n`);
20
+ common.writeFile('proof.jwt', proofJwt);
21
+ return proofJwt;
22
+ } catch (ex) {
23
+ common.printError(ex);
24
+ throw ex;
25
+ }
26
+ };
27
+
28
+ const loadNonce = (options) => {
29
+ if (!isEmpty(options.challenge)) {
30
+ return options.challenge;
31
+ }
32
+
33
+ const response = JSON.parse(
34
+ common.readFile(`${options.response}`, 'Generate Offers Response not found')
35
+ );
36
+ return response.challenge;
37
+ };
38
+
39
+ const buildProofJwt = async ({ nonce, keyPair, options }) => {
40
+ const kid = getDidUriFromJwk(toJwk(keyPair.publicKey, false));
41
+ const jwt = await jwtSign(
42
+ { aud: options.audience, nonce, iss: kid },
43
+ toJwk(keyPair.privateKey),
44
+ {
45
+ kid: `${kid}#0`,
46
+ }
47
+ );
48
+ return jwt;
49
+ };
50
+
51
+ module.exports = {
52
+ generateProof,
53
+ };
@@ -0,0 +1,32 @@
1
+ const { program } = require('commander');
2
+ const common = require('../common');
3
+ const { generateProof } = require('./generate-proof');
4
+
5
+ program
6
+ .name('verifgen proof')
7
+ .description('Generate a proof')
8
+ .usage('[options]')
9
+ .option(
10
+ '-c, --challenge <challenge>',
11
+ 'Challenge from generate-offers response'
12
+ )
13
+ .option(
14
+ '-r, --response <generate-offers-response-filename>',
15
+ 'Generate Offers Response filename',
16
+ 'generate-offers-response.json'
17
+ )
18
+ .requiredOption(
19
+ '-a, --audience <audience>',
20
+ 'The audience to use when signing the proof'
21
+ )
22
+ .requiredOption(
23
+ '-p, --persona <persona>',
24
+ 'The persona that will sign the proof. Must be hex format.'
25
+ )
26
+ .action(() => {
27
+ const options = program.opts();
28
+ common.printInfo('Generating proof');
29
+ common.printInfo(`Options: ${JSON.stringify(options, null, 2)}`);
30
+ return generateProof(options);
31
+ })
32
+ .parse(process.argv);
@@ -0,0 +1,36 @@
1
+ const console = require('console');
2
+ const fs = require('fs');
3
+ const path = require('path');
4
+ const { program } = require('commander');
5
+ const common = require('./common');
6
+
7
+ const viewTemplates = (printTemplate) => {
8
+ try {
9
+ if (printTemplate) {
10
+ const file = common.resolveTemplate(printTemplate);
11
+ const fileContent = common.readFile(file, 'Failed to read template');
12
+
13
+ console.info(fileContent);
14
+ } else {
15
+ const files = fs.readdirSync(common.templatesPath);
16
+
17
+ files.forEach((file) => console.info(path.basename(file, '.json')));
18
+ }
19
+ } catch (ex) {
20
+ common.printError(ex);
21
+ }
22
+ };
23
+
24
+ program
25
+ .name('verifgen templates')
26
+ .description('View available sample templates')
27
+ .usage('[options]')
28
+ .option(
29
+ '-p, --print-template <template-name>',
30
+ 'Prints content of sample template <template-name>'
31
+ )
32
+ .action(() => {
33
+ const options = program.opts();
34
+ return viewTemplates(options.printTemplate);
35
+ })
36
+ .parse(process.argv);
@@ -0,0 +1,133 @@
1
+ const { program } = require('commander');
2
+ const fs = require('fs');
3
+ const { all, find, get, last, map } = require('lodash/fp');
4
+ const {
5
+ initDoVerifyCredentialChecks,
6
+ initVerifyIssuerChain,
7
+ } = require('@verii/verifiable-credentials');
8
+ const { decodePresentationJwt } = require('@verii/jwt');
9
+ const { extractVerificationKey } = require('@verii/did-doc');
10
+ const console = require('console');
11
+ const common = require('./common');
12
+
13
+ const context = { log: console };
14
+
15
+ const verifyVcs = async (presentation, issuerChains, credentialDids) => {
16
+ const buildDidChain = () => issuerChains;
17
+ const verifyIssuerChain = initVerifyIssuerChain(
18
+ extractVerificationKey(get('publicKey[0].id', last(issuerChains)))
19
+ );
20
+ const { verifiableCredential } = decodePresentationJwt(presentation);
21
+
22
+ return Promise.all(
23
+ map((credential) => {
24
+ const doVerifyCredentialChecks = initDoVerifyCredentialChecks({
25
+ resolveDID: () => find({ id: credential.id }, credentialDids),
26
+ buildDidChain,
27
+ verifyIssuerChain,
28
+ });
29
+
30
+ return doVerifyCredentialChecks(credential, context);
31
+ }, verifiableCredential)
32
+ );
33
+ };
34
+
35
+ const verifyPresentation = async (presentation, issuerChains) => {
36
+ const presentationJwtFile = `${presentation}.jwt`;
37
+
38
+ const presentationJwt = common.readFile(
39
+ presentationJwtFile,
40
+ 'Presentation JWT not found'
41
+ );
42
+ const credentials = await verifyVcs(presentationJwt, issuerChains);
43
+
44
+ console.info(
45
+ JSON.stringify(
46
+ map(
47
+ ({ credentialChecks, ...credential }) => ({
48
+ credential,
49
+ credentialChecks,
50
+ }),
51
+ credentials
52
+ )
53
+ )
54
+ );
55
+
56
+ if (
57
+ all(
58
+ (credential) => credential.credentialChecks.UNTAMPERED === 'PASS',
59
+ credentials
60
+ )
61
+ ) {
62
+ console.info('Presentation credentials look good');
63
+ process.exit(0);
64
+ } else {
65
+ console.info('Presentation credentials have been tampered with');
66
+ process.exit(1);
67
+ }
68
+ };
69
+
70
+ const verifyCredential = async (credentialSource, issuerChains) => {
71
+ const credentialJwtFile = `${credentialSource}.jwt`;
72
+ const credentialDidFile = `${credentialSource}.did`;
73
+
74
+ const credentialDid = fs.existsSync(credentialDidFile)
75
+ ? JSON.parse(common.readFile(credentialDidFile, 'DID not found'))
76
+ : null;
77
+
78
+ const credentialJwt = common.readFile(credentialJwtFile, 'JWT not found');
79
+
80
+ const { credentialChecks, ...credential } =
81
+ await initDoVerifyCredentialChecks(credentialJwt, {
82
+ log: console,
83
+ buildDidChain: () => issuerChains,
84
+ verifyIssuerChain: initVerifyIssuerChain({
85
+ vnfPublicKeyId: get('publicKey[0].id', last(issuerChains)),
86
+ }),
87
+ resolveCredentialDid: () => credentialDid,
88
+ });
89
+
90
+ console.info(JSON.stringify({ credential, credentialChecks }, null, 2));
91
+ if (credentialChecks.UNTAMPERED === 'PASS') {
92
+ console.info('Credential looks good');
93
+ process.exit(0);
94
+ } else {
95
+ console.info('Credential has been tampered with');
96
+ process.exit(1);
97
+ }
98
+ };
99
+
100
+ const verify = async (credentialSource, presentation, issuerPersonas) => {
101
+ try {
102
+ const issuerChains = map(
103
+ (issuerPersona) =>
104
+ JSON.parse(common.readFile(`${issuerPersona}.did`, 'DID not found')),
105
+ issuerPersonas
106
+ );
107
+
108
+ if (credentialSource) {
109
+ await verifyCredential(credentialSource, issuerChains);
110
+ } else if (presentation) {
111
+ await verifyPresentation(presentation, issuerChains);
112
+ }
113
+ } catch (ex) {
114
+ common.printError(ex);
115
+ }
116
+ };
117
+
118
+ program
119
+ .name('verifgen verify')
120
+ .description('Verify a credential')
121
+ .usage('[options]')
122
+ .option('-c, --credential-source <source>', 'Credential source')
123
+ .option('-p, --presentation <source>', 'presentation source')
124
+ .option('-i, --issuer-personas [personas...]', 'Issuer personas', ['vnf'])
125
+ .action(() => {
126
+ const options = program.opts();
127
+ return verify(
128
+ options.credentialSource,
129
+ options.presentation,
130
+ options.issuerPersonas
131
+ );
132
+ })
133
+ .parse(process.argv);
@@ -0,0 +1,41 @@
1
+ const { program } = require('commander');
2
+ const packageJson = require('../package.json');
3
+
4
+ program
5
+ .version(packageJson.version, '-v, --vers', 'Current tool version')
6
+ .command('templates', 'View available sample templates', {
7
+ executableFile: `${__dirname}/verifgen-templates.js`,
8
+ })
9
+ .command('keys', 'Generates a public and private key pair', {
10
+ executableFile: `${__dirname}/verifgen-keys.js`,
11
+ })
12
+ .command('address', 'Generates an account address', {
13
+ executableFile: `${__dirname}/verifgen-address.js`,
14
+ })
15
+ .command('credential', 'Generate a verifiable credential', {
16
+ executableFile: `${__dirname}/verifgen-credential.js`,
17
+ })
18
+ .command('presentation', 'Generate a verifiable presentation', {
19
+ executableFile: `${__dirname}/verifgen-presentation.js`,
20
+ })
21
+ .command('verify', 'Verify credential or presentation', {
22
+ executableFile: `${__dirname}/verifgen-verify.js`,
23
+ })
24
+ .command('did', 'Generate a DID', {
25
+ executableFile: `${__dirname}/verifgen-did.js`,
26
+ })
27
+ .command('jwt', 'Generate Signed JWTs for NO Voters', {
28
+ executableFile: `${__dirname}/verifgen-jwt.js`,
29
+ })
30
+ .command('agent-jwt', 'Generate JWTs for agent', {
31
+ executableFile: `${__dirname}/verifgen-agent-jwt-generator.js`,
32
+ })
33
+ .command('asymmetric-jwt', 'Generate JWTs using asymmetric keys', {
34
+ executableFile: `${__dirname}/verifgen-asymmetric-jwt.js`,
35
+ })
36
+ .command('proof', 'Generate a proof', {
37
+ executableFile: `${__dirname}/verifgen-proof/verifgen-proof.js`,
38
+ })
39
+ .usage('[command] [options]')
40
+ .passThroughOptions()
41
+ .parse(process.argv);
package/test/ignore.js ADDED
File without changes