@learncard/didkit-plugin 1.9.3 → 1.9.5

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,51 @@
1
+ /* tslint:disable */
2
+ /* eslint-disable */
3
+ export const memory: WebAssembly.Memory;
4
+ export const DIDAuth: (a: number, b: number, c: number, d: number, e: number, f: number, g: number, h: number) => any;
5
+ export const JWKFromTezos: (a: number, b: number) => any;
6
+ export const clearCache: () => any;
7
+ export const completeDelegateCapability: (a: number, b: number, c: number, d: number, e: number, f: number) => any;
8
+ export const completeInvokeCapability: (a: number, b: number, c: number, d: number, e: number, f: number) => any;
9
+ export const completeIssueCredential: (a: number, b: number, c: number, d: number, e: number, f: number) => any;
10
+ export const completeIssuePresentation: (a: number, b: number, c: number, d: number, e: number, f: number) => any;
11
+ export const contextLoader: (a: number, b: number) => any;
12
+ export const createDagJwe: (a: any, b: number, c: number) => any;
13
+ export const createJwe: (a: number, b: number, c: number, d: number) => any;
14
+ export const decryptDagJwe: (a: number, b: number, c: number, d: number) => any;
15
+ export const decryptJwe: (a: number, b: number, c: number, d: number) => any;
16
+ export const delegateCapability: (a: number, b: number, c: number, d: number, e: number, f: number, g: number, h: number) => any;
17
+ export const didResolver: (a: number, b: number, c: number, d: number) => any;
18
+ export const didToVerificationMethod: (a: number, b: number) => any;
19
+ export const generateEd25519Key: () => [number, number, number, number];
20
+ export const generateEd25519KeyFromBytes: (a: number, b: number) => [number, number, number, number];
21
+ export const generateSecp256k1Key: () => [number, number, number, number];
22
+ export const generateSecp256k1KeyFromBytes: (a: number, b: number) => [number, number, number, number];
23
+ export const getVersion: () => [number, number];
24
+ export const invokeCapability: (a: number, b: number, c: number, d: number, e: number, f: number, g: number, h: number) => any;
25
+ export const issueCredential: (a: number, b: number, c: number, d: number, e: number, f: number, g: number, h: number) => any;
26
+ export const issuePresentation: (a: number, b: number, c: number, d: number, e: number, f: number, g: number, h: number) => any;
27
+ export const keyToDID: (a: number, b: number, c: number, d: number) => [number, number, number, number];
28
+ export const keyToVerificationMethod: (a: number, b: number, c: number, d: number) => any;
29
+ export const prepareDelegateCapability: (a: number, b: number, c: number, d: number, e: number, f: number, g: number, h: number) => any;
30
+ export const prepareInvokeCapability: (a: number, b: number, c: number, d: number, e: number, f: number, g: number, h: number) => any;
31
+ export const prepareIssueCredential: (a: number, b: number, c: number, d: number, e: number, f: number) => any;
32
+ export const prepareIssuePresentation: (a: number, b: number, c: number, d: number, e: number, f: number) => any;
33
+ export const resolveDID: (a: number, b: number, c: number, d: number) => any;
34
+ export const verifyCredential: (a: number, b: number, c: number, d: number, e: number, f: number) => any;
35
+ export const verifyDelegation: (a: number, b: number) => any;
36
+ export const verifyInvocation: (a: number, b: number, c: number, d: number) => any;
37
+ export const verifyInvocationSignature: (a: number, b: number) => any;
38
+ export const verifyPresentation: (a: number, b: number, c: number, d: number, e: number, f: number) => any;
39
+ export const didkit_error_code: () => number;
40
+ export const didkit_error_message: () => number;
41
+ export const __wbindgen_malloc: (a: number, b: number) => number;
42
+ export const __wbindgen_realloc: (a: number, b: number, c: number, d: number) => number;
43
+ export const __wbindgen_exn_store: (a: number) => void;
44
+ export const __externref_table_alloc: () => number;
45
+ export const __wbindgen_export_4: WebAssembly.Table;
46
+ export const __wbindgen_export_5: WebAssembly.Table;
47
+ export const __externref_table_dealloc: (a: number) => void;
48
+ export const __wbindgen_free: (a: number, b: number, c: number) => void;
49
+ export const closure4149_externref_shim: (a: number, b: number, c: any) => void;
50
+ export const closure4546_externref_shim: (a: number, b: number, c: any, d: any) => void;
51
+ export const __wbindgen_start: () => void;
package/src/helpers.ts ADDED
@@ -0,0 +1,41 @@
1
+ import { LearnCard } from '@learncard/core';
2
+
3
+ export const getContextURIs = (jsonld: Record<string, any>) => {
4
+ const contexts: string[] = [];
5
+
6
+ const traverse = (obj: Record<string, any>) => {
7
+ if (typeof obj !== 'object' || obj === null) return;
8
+
9
+ if (obj['@context']) {
10
+ if (Array.isArray(obj['@context'])) contexts.push(...obj['@context']);
11
+ else contexts.push(obj['@context']);
12
+ }
13
+
14
+ Object.keys(obj).forEach(key => {
15
+ traverse(obj[key]);
16
+ });
17
+ };
18
+
19
+ traverse(jsonld);
20
+
21
+ return contexts;
22
+ };
23
+
24
+ export const getDocumentMap = async (
25
+ learnCard: LearnCard<any, 'context'>,
26
+ obj: Record<string, any>,
27
+ allowRemoteContexts = false
28
+ ) => {
29
+ const uris = getContextURIs(obj);
30
+ const resolvedDocs = await Promise.all(
31
+ uris.map(async uri => learnCard.context.resolveDocument(uri, allowRemoteContexts))
32
+ );
33
+
34
+ return uris.reduce<Record<string, string>>((acc, cur, index) => {
35
+ const resolvedDoc = resolvedDocs[index];
36
+
37
+ if (resolvedDoc) acc[cur] = JSON.stringify(resolvedDoc);
38
+
39
+ return acc;
40
+ }, {});
41
+ };
package/src/index.ts ADDED
@@ -0,0 +1,3 @@
1
+ export * from './types';
2
+ export * from './plugin';
3
+ export * from './helpers';
package/src/plugin.ts ADDED
@@ -0,0 +1,200 @@
1
+ import init, {
2
+ InitInput,
3
+ generateEd25519KeyFromBytes,
4
+ generateSecp256k1KeyFromBytes,
5
+ keyToDID,
6
+ keyToVerificationMethod,
7
+ didToVerificationMethod,
8
+ issueCredential,
9
+ verifyCredential,
10
+ issuePresentation,
11
+ verifyPresentation,
12
+ contextLoader,
13
+ resolveDID,
14
+ didResolver,
15
+ createJwe,
16
+ decryptJwe,
17
+ createDagJwe,
18
+ decryptDagJwe,
19
+ clearCache,
20
+ } from './didkit/index';
21
+ import { getDocumentMap } from './helpers';
22
+
23
+ import { DIDKitPlugin, DidMethod } from './types';
24
+
25
+ /**
26
+ j
27
+ * @group Plugins
28
+ */
29
+ export const getDidKitPlugin = async (
30
+ input?: InitInput | Promise<InitInput>,
31
+ allowRemoteContexts = false
32
+ ): Promise<DIDKitPlugin> => {
33
+ await init(input);
34
+
35
+ const memoizedDids: Partial<Record<DidMethod, string>> = {};
36
+
37
+ return {
38
+ name: 'DIDKit',
39
+ displayName: 'DIDKit',
40
+ description:
41
+ 'Provides an interface to DIDKit, which allows for the generation of key material, as well as signing and verifying credentials and presentations',
42
+ context: {
43
+ resolveStaticDocument: async (_learnCard, url) => {
44
+ try {
45
+ return JSON.parse((await contextLoader(url)) ?? '') || undefined;
46
+ } catch (error) {
47
+ _learnCard.debug?.(error);
48
+
49
+ return undefined;
50
+ }
51
+ },
52
+ },
53
+ methods: {
54
+ generateEd25519KeyFromBytes: (_learnCard, bytes) =>
55
+ JSON.parse(generateEd25519KeyFromBytes(bytes)),
56
+
57
+ generateSecp256k1KeyFromBytes: (_learnCard, bytes) =>
58
+ JSON.parse(generateSecp256k1KeyFromBytes(bytes)),
59
+
60
+ keyToDid: (_learnCard, type, keypair) => {
61
+ return keyToDID(type, JSON.stringify(keypair));
62
+ },
63
+
64
+ keyToVerificationMethod: async (_learnCard, type, keypair) =>
65
+ keyToVerificationMethod(type, JSON.stringify(keypair)),
66
+
67
+ didToVerificationMethod: async (_learnCard, did) => didToVerificationMethod(did),
68
+
69
+ issueCredential: async (_learnCard, credential, options, keypair) => {
70
+ return JSON.parse(
71
+ await issueCredential(
72
+ JSON.stringify(credential),
73
+ JSON.stringify(options),
74
+ JSON.stringify(keypair),
75
+ JSON.stringify(
76
+ await getDocumentMap(_learnCard, credential, allowRemoteContexts)
77
+ )
78
+ )
79
+ );
80
+ },
81
+
82
+ verifyCredential: async (_learnCard, credential, options = {}) => {
83
+ return JSON.parse(
84
+ await verifyCredential(
85
+ JSON.stringify(credential),
86
+ JSON.stringify(options),
87
+ JSON.stringify(
88
+ await getDocumentMap(_learnCard, credential, allowRemoteContexts)
89
+ )
90
+ )
91
+ );
92
+ },
93
+
94
+ issuePresentation: async (_learnCard, presentation, options, keypair) => {
95
+ const isJwt = options.proofFormat === 'jwt';
96
+
97
+ const result = await issuePresentation(
98
+ JSON.stringify(presentation),
99
+ JSON.stringify(options),
100
+ JSON.stringify(keypair),
101
+ JSON.stringify(
102
+ await getDocumentMap(_learnCard, presentation, allowRemoteContexts)
103
+ )
104
+ );
105
+
106
+ return isJwt ? result : JSON.parse(result);
107
+ },
108
+
109
+ verifyPresentation: async (_learnCard, presentation, options = {}) => {
110
+ const isJwt = typeof presentation === 'string';
111
+
112
+ return JSON.parse(
113
+ await verifyPresentation(
114
+ isJwt ? presentation : JSON.stringify(presentation),
115
+ JSON.stringify(options),
116
+ isJwt
117
+ ? '{}'
118
+ : JSON.stringify(
119
+ await getDocumentMap(
120
+ _learnCard,
121
+ presentation,
122
+ allowRemoteContexts
123
+ )
124
+ )
125
+ )
126
+ );
127
+ },
128
+
129
+ contextLoader: async (_learnCard, url) => {
130
+ try {
131
+ return JSON.parse((await contextLoader(url)) ?? '') || undefined;
132
+ } catch (error) {
133
+ _learnCard.debug?.(error);
134
+
135
+ return undefined;
136
+ }
137
+ },
138
+
139
+ resolveDid: async (_learnCard, did, inputMetadata = {}) =>
140
+ JSON.parse(await resolveDID(did, JSON.stringify(inputMetadata))),
141
+
142
+ didResolver: async (_learnCard, did, inputMetadata = {}) =>
143
+ JSON.parse(await didResolver(did, JSON.stringify(inputMetadata))),
144
+
145
+ createJwe: async (_learnCard, cleartext, recipients) =>
146
+ JSON.parse(await createJwe(cleartext, recipients)),
147
+
148
+ decryptJwe: async (_learnCard, jwe, jwks) =>
149
+ decryptJwe(
150
+ JSON.stringify(jwe),
151
+ jwks.map(jwk => JSON.stringify(jwk))
152
+ ),
153
+
154
+ createDagJwe: async (_learnCard, cleartext, recipients) =>
155
+ JSON.parse(await createDagJwe(cleartext as any, recipients)),
156
+
157
+ decryptDagJwe: async (_learnCard, jwe, jwks) => {
158
+ // Didkit is serializing numbers as BigInts when crossing the WASM boundary, so we
159
+ // need to convert them back to numbers
160
+ const convertBigIntsToNumbers = (obj: any): any => {
161
+ if (obj === null || obj === undefined) return obj;
162
+
163
+ // Convert BigInt to Number
164
+ if (typeof obj === 'bigint') return Number(obj);
165
+
166
+ // Handle arrays
167
+ if (Array.isArray(obj)) return obj.map(convertBigIntsToNumbers);
168
+
169
+ // Return primitives as-is
170
+ if (typeof obj !== 'object') return obj;
171
+
172
+ // -- Handle objects --
173
+
174
+ // Quick check if the object has any nested objects that need conversion
175
+ const hasNestedObjects = Object.values(obj).some(
176
+ val => typeof val === 'bigint' || (typeof val === 'object' && val !== null)
177
+ );
178
+ if (!hasNestedObjects) return obj; // Fast path for simple objects
179
+
180
+ const result: Record<string, any> = {};
181
+ for (const key in obj) {
182
+ result[key] = convertBigIntsToNumbers(obj[key]);
183
+ }
184
+ return result;
185
+ };
186
+
187
+ return convertBigIntsToNumbers(
188
+ await decryptDagJwe(
189
+ JSON.stringify(jwe),
190
+ jwks.map(jwk => JSON.stringify(jwk))
191
+ )
192
+ );
193
+ },
194
+
195
+ clearDidWebCache: async () => {
196
+ await clearCache();
197
+ },
198
+ },
199
+ };
200
+ };
package/src/types.ts ADDED
@@ -0,0 +1,96 @@
1
+ import {
2
+ JWE,
3
+ JWKWithPrivateKey,
4
+ UnsignedVC,
5
+ UnsignedVP,
6
+ VC,
7
+ VP,
8
+ VerificationCheck,
9
+ DidDocument,
10
+ } from '@learncard/types';
11
+ import type { DIDResolutionResult } from 'dids';
12
+ import { Plugin } from '@learncard/core';
13
+
14
+ /** @group DIDKit Plugin */
15
+ export type DidMethod =
16
+ | 'key'
17
+ | 'tz'
18
+ | 'ethr'
19
+ | `pkh:${
20
+ | 'tz'
21
+ | 'tezos'
22
+ | 'sol'
23
+ | 'solana'
24
+ | 'eth'
25
+ | 'celo'
26
+ | 'poly'
27
+ | 'btc'
28
+ | 'doge'
29
+ | 'eip155'
30
+ | 'bip122'}`
31
+ | `pkh:eip155:${string}`
32
+ | `pkh:bip122:${string}`;
33
+
34
+ /** @group DIDKit Plugin */
35
+ export type DataIntegrityCryptosuite =
36
+ | 'eddsa-rdfc-2022'
37
+ | 'eddsa-2022'
38
+ | 'json-eddsa-2022'
39
+ | 'ecdsa-2019'
40
+ | 'jcs-ecdsa-2019';
41
+
42
+ /** @group DIDKit Plugin */
43
+ export type ProofOptions = {
44
+ type?: string;
45
+ verificationMethod?: string;
46
+ proofPurpose?: string;
47
+ proofFormat?: string;
48
+ created?: string;
49
+ challenge?: string;
50
+ domain?: string;
51
+ checks?: ('proof' | 'JWS' | 'credentialStatus' | 'credentialSchema')[];
52
+ cryptosuite?: DataIntegrityCryptosuite;
53
+ };
54
+
55
+ /** @group DIDKit Plugin */
56
+ export type InputMetadata = {
57
+ accept?: string;
58
+ versionId?: string;
59
+ versionTime?: string;
60
+ noCache?: boolean;
61
+ };
62
+
63
+ /** @group DIDKit Plugin */
64
+ export type DidkitPluginMethods = {
65
+ generateEd25519KeyFromBytes: (bytes: Uint8Array) => JWKWithPrivateKey;
66
+ generateSecp256k1KeyFromBytes: (bytes: Uint8Array) => JWKWithPrivateKey;
67
+ keyToDid: (type: DidMethod, keypair: JWKWithPrivateKey) => string;
68
+ keyToVerificationMethod: (type: string, keypair: JWKWithPrivateKey) => Promise<string>;
69
+ didToVerificationMethod: (did: string) => Promise<string>;
70
+ issueCredential: (
71
+ credential: UnsignedVC,
72
+ options: ProofOptions,
73
+ keypair: JWKWithPrivateKey
74
+ ) => Promise<VC>;
75
+ verifyCredential: (credential: VC, options?: ProofOptions) => Promise<VerificationCheck>;
76
+ issuePresentation: (
77
+ presentation: UnsignedVP,
78
+ options: ProofOptions,
79
+ keypair: JWKWithPrivateKey
80
+ ) => Promise<VP>;
81
+ verifyPresentation: (
82
+ presentation: VP | string,
83
+ options?: ProofOptions
84
+ ) => Promise<VerificationCheck>;
85
+ contextLoader: (url: string) => Promise<Record<string, any>>;
86
+ resolveDid: (did: string, inputMetadata?: InputMetadata) => Promise<DidDocument>;
87
+ didResolver: (did: string, inputMetadata?: InputMetadata) => Promise<DIDResolutionResult>;
88
+ createJwe: (cleartext: string, recipients: string[]) => Promise<JWE>;
89
+ decryptJwe: (jwe: JWE, jwks: JWKWithPrivateKey[]) => Promise<string>;
90
+ createDagJwe: <T>(cleartext: T, recipients: string[]) => Promise<JWE>;
91
+ decryptDagJwe: <T>(jwe: JWE, jwks: JWKWithPrivateKey[]) => Promise<T>;
92
+ clearDidWebCache: () => Promise<void>;
93
+ };
94
+
95
+ /** @group DIDKit Plugin */
96
+ export type DIDKitPlugin = Plugin<'DIDKit', 'context', DidkitPluginMethods>;