@mcp-i/core 0.1.0

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.
Files changed (226) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +390 -0
  3. package/dist/auth/handshake.d.ts +104 -0
  4. package/dist/auth/handshake.d.ts.map +1 -0
  5. package/dist/auth/handshake.js +230 -0
  6. package/dist/auth/handshake.js.map +1 -0
  7. package/dist/auth/index.d.ts +3 -0
  8. package/dist/auth/index.d.ts.map +1 -0
  9. package/dist/auth/index.js +2 -0
  10. package/dist/auth/index.js.map +1 -0
  11. package/dist/auth/types.d.ts +31 -0
  12. package/dist/auth/types.d.ts.map +1 -0
  13. package/dist/auth/types.js +7 -0
  14. package/dist/auth/types.js.map +1 -0
  15. package/dist/delegation/audience-validator.d.ts +9 -0
  16. package/dist/delegation/audience-validator.d.ts.map +1 -0
  17. package/dist/delegation/audience-validator.js +17 -0
  18. package/dist/delegation/audience-validator.js.map +1 -0
  19. package/dist/delegation/bitstring.d.ts +37 -0
  20. package/dist/delegation/bitstring.d.ts.map +1 -0
  21. package/dist/delegation/bitstring.js +117 -0
  22. package/dist/delegation/bitstring.js.map +1 -0
  23. package/dist/delegation/cascading-revocation.d.ts +45 -0
  24. package/dist/delegation/cascading-revocation.d.ts.map +1 -0
  25. package/dist/delegation/cascading-revocation.js +148 -0
  26. package/dist/delegation/cascading-revocation.js.map +1 -0
  27. package/dist/delegation/delegation-graph.d.ts +49 -0
  28. package/dist/delegation/delegation-graph.d.ts.map +1 -0
  29. package/dist/delegation/delegation-graph.js +99 -0
  30. package/dist/delegation/delegation-graph.js.map +1 -0
  31. package/dist/delegation/did-key-resolver.d.ts +64 -0
  32. package/dist/delegation/did-key-resolver.d.ts.map +1 -0
  33. package/dist/delegation/did-key-resolver.js +154 -0
  34. package/dist/delegation/did-key-resolver.js.map +1 -0
  35. package/dist/delegation/did-web-resolver.d.ts +83 -0
  36. package/dist/delegation/did-web-resolver.d.ts.map +1 -0
  37. package/dist/delegation/did-web-resolver.js +218 -0
  38. package/dist/delegation/did-web-resolver.js.map +1 -0
  39. package/dist/delegation/index.d.ts +21 -0
  40. package/dist/delegation/index.d.ts.map +1 -0
  41. package/dist/delegation/index.js +21 -0
  42. package/dist/delegation/index.js.map +1 -0
  43. package/dist/delegation/outbound-headers.d.ts +81 -0
  44. package/dist/delegation/outbound-headers.d.ts.map +1 -0
  45. package/dist/delegation/outbound-headers.js +139 -0
  46. package/dist/delegation/outbound-headers.js.map +1 -0
  47. package/dist/delegation/outbound-proof.d.ts +43 -0
  48. package/dist/delegation/outbound-proof.d.ts.map +1 -0
  49. package/dist/delegation/outbound-proof.js +52 -0
  50. package/dist/delegation/outbound-proof.js.map +1 -0
  51. package/dist/delegation/statuslist-manager.d.ts +44 -0
  52. package/dist/delegation/statuslist-manager.d.ts.map +1 -0
  53. package/dist/delegation/statuslist-manager.js +126 -0
  54. package/dist/delegation/statuslist-manager.js.map +1 -0
  55. package/dist/delegation/storage/memory-graph-storage.d.ts +70 -0
  56. package/dist/delegation/storage/memory-graph-storage.d.ts.map +1 -0
  57. package/dist/delegation/storage/memory-graph-storage.js +145 -0
  58. package/dist/delegation/storage/memory-graph-storage.js.map +1 -0
  59. package/dist/delegation/storage/memory-statuslist-storage.d.ts +19 -0
  60. package/dist/delegation/storage/memory-statuslist-storage.d.ts.map +1 -0
  61. package/dist/delegation/storage/memory-statuslist-storage.js +33 -0
  62. package/dist/delegation/storage/memory-statuslist-storage.js.map +1 -0
  63. package/dist/delegation/utils.d.ts +49 -0
  64. package/dist/delegation/utils.d.ts.map +1 -0
  65. package/dist/delegation/utils.js +131 -0
  66. package/dist/delegation/utils.js.map +1 -0
  67. package/dist/delegation/vc-issuer.d.ts +56 -0
  68. package/dist/delegation/vc-issuer.d.ts.map +1 -0
  69. package/dist/delegation/vc-issuer.js +80 -0
  70. package/dist/delegation/vc-issuer.js.map +1 -0
  71. package/dist/delegation/vc-verifier.d.ts +112 -0
  72. package/dist/delegation/vc-verifier.d.ts.map +1 -0
  73. package/dist/delegation/vc-verifier.js +280 -0
  74. package/dist/delegation/vc-verifier.js.map +1 -0
  75. package/dist/index.d.ts +45 -0
  76. package/dist/index.d.ts.map +1 -0
  77. package/dist/index.js +53 -0
  78. package/dist/index.js.map +1 -0
  79. package/dist/logging/index.d.ts +2 -0
  80. package/dist/logging/index.d.ts.map +1 -0
  81. package/dist/logging/index.js +2 -0
  82. package/dist/logging/index.js.map +1 -0
  83. package/dist/logging/logger.d.ts +23 -0
  84. package/dist/logging/logger.d.ts.map +1 -0
  85. package/dist/logging/logger.js +82 -0
  86. package/dist/logging/logger.js.map +1 -0
  87. package/dist/middleware/index.d.ts +7 -0
  88. package/dist/middleware/index.d.ts.map +1 -0
  89. package/dist/middleware/index.js +7 -0
  90. package/dist/middleware/index.js.map +1 -0
  91. package/dist/middleware/with-mcpi.d.ts +152 -0
  92. package/dist/middleware/with-mcpi.d.ts.map +1 -0
  93. package/dist/middleware/with-mcpi.js +472 -0
  94. package/dist/middleware/with-mcpi.js.map +1 -0
  95. package/dist/proof/errors.d.ts +49 -0
  96. package/dist/proof/errors.d.ts.map +1 -0
  97. package/dist/proof/errors.js +61 -0
  98. package/dist/proof/errors.js.map +1 -0
  99. package/dist/proof/generator.d.ts +65 -0
  100. package/dist/proof/generator.d.ts.map +1 -0
  101. package/dist/proof/generator.js +163 -0
  102. package/dist/proof/generator.js.map +1 -0
  103. package/dist/proof/index.d.ts +4 -0
  104. package/dist/proof/index.d.ts.map +1 -0
  105. package/dist/proof/index.js +4 -0
  106. package/dist/proof/index.js.map +1 -0
  107. package/dist/proof/verifier.d.ts +108 -0
  108. package/dist/proof/verifier.d.ts.map +1 -0
  109. package/dist/proof/verifier.js +299 -0
  110. package/dist/proof/verifier.js.map +1 -0
  111. package/dist/providers/base.d.ts +64 -0
  112. package/dist/providers/base.d.ts.map +1 -0
  113. package/dist/providers/base.js +19 -0
  114. package/dist/providers/base.js.map +1 -0
  115. package/dist/providers/index.d.ts +3 -0
  116. package/dist/providers/index.d.ts.map +1 -0
  117. package/dist/providers/index.js +3 -0
  118. package/dist/providers/index.js.map +1 -0
  119. package/dist/providers/memory.d.ts +33 -0
  120. package/dist/providers/memory.d.ts.map +1 -0
  121. package/dist/providers/memory.js +102 -0
  122. package/dist/providers/memory.js.map +1 -0
  123. package/dist/session/index.d.ts +2 -0
  124. package/dist/session/index.d.ts.map +1 -0
  125. package/dist/session/index.js +2 -0
  126. package/dist/session/index.js.map +1 -0
  127. package/dist/session/manager.d.ts +77 -0
  128. package/dist/session/manager.d.ts.map +1 -0
  129. package/dist/session/manager.js +251 -0
  130. package/dist/session/manager.js.map +1 -0
  131. package/dist/types/protocol.d.ts +320 -0
  132. package/dist/types/protocol.d.ts.map +1 -0
  133. package/dist/types/protocol.js +229 -0
  134. package/dist/types/protocol.js.map +1 -0
  135. package/dist/utils/base58.d.ts +31 -0
  136. package/dist/utils/base58.d.ts.map +1 -0
  137. package/dist/utils/base58.js +104 -0
  138. package/dist/utils/base58.js.map +1 -0
  139. package/dist/utils/base64.d.ts +13 -0
  140. package/dist/utils/base64.d.ts.map +1 -0
  141. package/dist/utils/base64.js +99 -0
  142. package/dist/utils/base64.js.map +1 -0
  143. package/dist/utils/crypto-service.d.ts +37 -0
  144. package/dist/utils/crypto-service.d.ts.map +1 -0
  145. package/dist/utils/crypto-service.js +153 -0
  146. package/dist/utils/crypto-service.js.map +1 -0
  147. package/dist/utils/did-helpers.d.ts +156 -0
  148. package/dist/utils/did-helpers.d.ts.map +1 -0
  149. package/dist/utils/did-helpers.js +193 -0
  150. package/dist/utils/did-helpers.js.map +1 -0
  151. package/dist/utils/ed25519-constants.d.ts +18 -0
  152. package/dist/utils/ed25519-constants.d.ts.map +1 -0
  153. package/dist/utils/ed25519-constants.js +21 -0
  154. package/dist/utils/ed25519-constants.js.map +1 -0
  155. package/dist/utils/index.d.ts +5 -0
  156. package/dist/utils/index.d.ts.map +1 -0
  157. package/dist/utils/index.js +5 -0
  158. package/dist/utils/index.js.map +1 -0
  159. package/package.json +105 -0
  160. package/src/__tests__/integration/full-flow.test.ts +362 -0
  161. package/src/__tests__/providers/base.test.ts +173 -0
  162. package/src/__tests__/providers/memory.test.ts +332 -0
  163. package/src/__tests__/utils/mock-providers.ts +319 -0
  164. package/src/__tests__/utils/node-crypto-provider.ts +93 -0
  165. package/src/auth/handshake.ts +411 -0
  166. package/src/auth/index.ts +11 -0
  167. package/src/auth/types.ts +40 -0
  168. package/src/delegation/__tests__/audience-validator.test.ts +110 -0
  169. package/src/delegation/__tests__/bitstring.test.ts +346 -0
  170. package/src/delegation/__tests__/cascading-revocation.test.ts +624 -0
  171. package/src/delegation/__tests__/delegation-graph.test.ts +623 -0
  172. package/src/delegation/__tests__/did-key-resolver.test.ts +265 -0
  173. package/src/delegation/__tests__/did-web-resolver.test.ts +467 -0
  174. package/src/delegation/__tests__/outbound-headers.test.ts +230 -0
  175. package/src/delegation/__tests__/outbound-proof.test.ts +179 -0
  176. package/src/delegation/__tests__/statuslist-manager.test.ts +515 -0
  177. package/src/delegation/__tests__/utils.test.ts +185 -0
  178. package/src/delegation/__tests__/vc-issuer.test.ts +487 -0
  179. package/src/delegation/__tests__/vc-verifier.test.ts +1029 -0
  180. package/src/delegation/audience-validator.ts +24 -0
  181. package/src/delegation/bitstring.ts +160 -0
  182. package/src/delegation/cascading-revocation.ts +224 -0
  183. package/src/delegation/delegation-graph.ts +143 -0
  184. package/src/delegation/did-key-resolver.ts +181 -0
  185. package/src/delegation/did-web-resolver.ts +270 -0
  186. package/src/delegation/index.ts +33 -0
  187. package/src/delegation/outbound-headers.ts +193 -0
  188. package/src/delegation/outbound-proof.ts +90 -0
  189. package/src/delegation/statuslist-manager.ts +219 -0
  190. package/src/delegation/storage/__tests__/memory-graph-storage.test.ts +366 -0
  191. package/src/delegation/storage/__tests__/memory-statuslist-storage.test.ts +228 -0
  192. package/src/delegation/storage/memory-graph-storage.ts +178 -0
  193. package/src/delegation/storage/memory-statuslist-storage.ts +42 -0
  194. package/src/delegation/utils.ts +189 -0
  195. package/src/delegation/vc-issuer.ts +137 -0
  196. package/src/delegation/vc-verifier.ts +440 -0
  197. package/src/index.ts +264 -0
  198. package/src/logging/__tests__/logger.test.ts +366 -0
  199. package/src/logging/index.ts +6 -0
  200. package/src/logging/logger.ts +91 -0
  201. package/src/middleware/__tests__/with-mcpi.test.ts +504 -0
  202. package/src/middleware/index.ts +16 -0
  203. package/src/middleware/with-mcpi.ts +766 -0
  204. package/src/proof/__tests__/proof-generator.test.ts +483 -0
  205. package/src/proof/__tests__/verifier.test.ts +488 -0
  206. package/src/proof/errors.ts +75 -0
  207. package/src/proof/generator.ts +255 -0
  208. package/src/proof/index.ts +22 -0
  209. package/src/proof/verifier.ts +449 -0
  210. package/src/providers/base.ts +68 -0
  211. package/src/providers/index.ts +15 -0
  212. package/src/providers/memory.ts +130 -0
  213. package/src/session/__tests__/session-manager.test.ts +342 -0
  214. package/src/session/index.ts +7 -0
  215. package/src/session/manager.ts +332 -0
  216. package/src/types/protocol.ts +596 -0
  217. package/src/utils/__tests__/base58.test.ts +281 -0
  218. package/src/utils/__tests__/base64.test.ts +239 -0
  219. package/src/utils/__tests__/crypto-service.test.ts +530 -0
  220. package/src/utils/__tests__/did-helpers.test.ts +156 -0
  221. package/src/utils/base58.ts +115 -0
  222. package/src/utils/base64.ts +116 -0
  223. package/src/utils/crypto-service.ts +209 -0
  224. package/src/utils/did-helpers.ts +210 -0
  225. package/src/utils/ed25519-constants.ts +23 -0
  226. package/src/utils/index.ts +9 -0
@@ -0,0 +1,265 @@
1
+ import { describe, it, expect } from "vitest";
2
+ import {
3
+ createDidKeyResolver,
4
+ isEd25519DidKey,
5
+ extractPublicKeyFromDidKey,
6
+ publicKeyToJwk,
7
+ resolveDidKeySync,
8
+ } from "../did-key-resolver";
9
+ import { base58Encode, base58Decode, isValidBase58 } from "../../utils/base58";
10
+
11
+ /**
12
+ * Tests for did:key resolver and base58 utilities
13
+ *
14
+ * These tests verify the Phase 3 VC verification infrastructure:
15
+ * - Base58 encoding/decoding for multibase keys
16
+ * - did:key resolution to DID Documents
17
+ * - Ed25519 public key extraction
18
+ */
19
+
20
+ describe("Base58 Utilities", () => {
21
+ describe("base58Encode", () => {
22
+ it("should encode empty bytes", () => {
23
+ expect(base58Encode(new Uint8Array([]))).toBe("");
24
+ });
25
+
26
+ it("should encode single byte", () => {
27
+ expect(base58Encode(new Uint8Array([0]))).toBe("1");
28
+ expect(base58Encode(new Uint8Array([1])).length).toBeGreaterThan(0);
29
+ });
30
+
31
+ it("should encode known values", () => {
32
+ // 'Hello' in bytes
33
+ const helloBytes = new TextEncoder().encode("Hello");
34
+ const encoded = base58Encode(helloBytes);
35
+ expect(encoded.length).toBeGreaterThan(0);
36
+ expect(isValidBase58(encoded)).toBe(true);
37
+ });
38
+
39
+ it("should handle leading zeros", () => {
40
+ const withLeadingZeros = new Uint8Array([0, 0, 1, 2, 3]);
41
+ const encoded = base58Encode(withLeadingZeros);
42
+ // Leading zeros become '1' in base58
43
+ expect(encoded.startsWith("11")).toBe(true);
44
+ });
45
+ });
46
+
47
+ describe("base58Decode", () => {
48
+ it("should decode empty string", () => {
49
+ expect(base58Decode("")).toEqual(new Uint8Array([]));
50
+ });
51
+
52
+ it("should decode leading '1' as zero bytes", () => {
53
+ const result = base58Decode("111");
54
+ expect(result).toEqual(new Uint8Array([0, 0, 0]));
55
+ });
56
+
57
+ it("should throw on invalid characters", () => {
58
+ // '0', 'O', 'I', 'l' are not in base58 alphabet
59
+ expect(() => base58Decode("0invalid")).toThrow("Invalid base58 character");
60
+ expect(() => base58Decode("testO")).toThrow("Invalid base58 character");
61
+ expect(() => base58Decode("testI")).toThrow("Invalid base58 character");
62
+ expect(() => base58Decode("testl")).toThrow("Invalid base58 character");
63
+ });
64
+
65
+ it("should roundtrip with base58Encode", () => {
66
+ const originalBytes = new Uint8Array([1, 2, 3, 4, 5, 6, 7, 8]);
67
+ const encoded = base58Encode(originalBytes);
68
+ const decoded = base58Decode(encoded);
69
+ expect(decoded).toEqual(originalBytes);
70
+ });
71
+
72
+ it("should roundtrip Ed25519 key bytes", () => {
73
+ // Simulate a 32-byte Ed25519 public key with multicodec prefix
74
+ const ed25519Prefix = new Uint8Array([0xed, 0x01]);
75
+ const mockPublicKey = new Uint8Array(32).fill(42);
76
+ const fullBytes = new Uint8Array([...ed25519Prefix, ...mockPublicKey]);
77
+
78
+ const encoded = base58Encode(fullBytes);
79
+ const decoded = base58Decode(encoded);
80
+ expect(decoded).toEqual(fullBytes);
81
+ });
82
+ });
83
+
84
+ describe("isValidBase58", () => {
85
+ it("should return true for empty string", () => {
86
+ expect(isValidBase58("")).toBe(true);
87
+ });
88
+
89
+ it("should return true for valid base58 strings", () => {
90
+ expect(isValidBase58("123456789")).toBe(true);
91
+ expect(isValidBase58("ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz")).toBe(true);
92
+ });
93
+
94
+ it("should return false for invalid characters", () => {
95
+ expect(isValidBase58("0")).toBe(false);
96
+ expect(isValidBase58("O")).toBe(false);
97
+ expect(isValidBase58("I")).toBe(false);
98
+ expect(isValidBase58("l")).toBe(false);
99
+ });
100
+ });
101
+ });
102
+
103
+ describe("did:key Resolver", () => {
104
+ // Known test vector for Ed25519 did:key
105
+ // This creates a deterministic did:key from known public key bytes
106
+ const createTestDidKey = (publicKeyBytes: Uint8Array): string => {
107
+ const prefix = new Uint8Array([0xed, 0x01]); // Ed25519 multicodec
108
+ const fullBytes = new Uint8Array([...prefix, ...publicKeyBytes]);
109
+ return `did:key:z${base58Encode(fullBytes)}`;
110
+ };
111
+
112
+ describe("isEd25519DidKey", () => {
113
+ it("should return true for Ed25519 did:key", () => {
114
+ // Ed25519 keys start with z6Mk
115
+ expect(isEd25519DidKey("did:key:z6MkhaXgBZDvotDkL5257faiztiGiC2QtKLGpbnnEGta2doK")).toBe(true);
116
+ });
117
+
118
+ it("should return false for non-did:key", () => {
119
+ expect(isEd25519DidKey("did:web:example.com")).toBe(false);
120
+ expect(isEd25519DidKey("did:example:123")).toBe(false);
121
+ });
122
+
123
+ it("should return false for non-Ed25519 did:key", () => {
124
+ // Secp256k1 keys start with z6Ls or other prefixes
125
+ expect(isEd25519DidKey("did:key:z7r8os")).toBe(false);
126
+ expect(isEd25519DidKey("did:key:zQ3s")).toBe(false);
127
+ });
128
+
129
+ it("should return false for invalid did:key format", () => {
130
+ expect(isEd25519DidKey("did:key:")).toBe(false);
131
+ expect(isEd25519DidKey("did:key:invalid")).toBe(false);
132
+ });
133
+ });
134
+
135
+ describe("extractPublicKeyFromDidKey", () => {
136
+ it("should extract public key bytes from valid did:key", () => {
137
+ const mockPublicKey = new Uint8Array(32).map((_, i) => i);
138
+ const didKey = createTestDidKey(mockPublicKey);
139
+
140
+ const extractedKey = extractPublicKeyFromDidKey(didKey);
141
+ expect(extractedKey).not.toBeNull();
142
+ expect(extractedKey).toEqual(mockPublicKey);
143
+ });
144
+
145
+ it("should return null for non-did:key", () => {
146
+ expect(extractPublicKeyFromDidKey("did:web:example.com")).toBeNull();
147
+ });
148
+
149
+ it("should return null for invalid multicodec prefix", () => {
150
+ // Create a did:key with wrong prefix (not Ed25519)
151
+ const wrongPrefix = new Uint8Array([0x00, 0x00]); // Not Ed25519
152
+ const mockPublicKey = new Uint8Array(32).fill(1);
153
+ const fullBytes = new Uint8Array([...wrongPrefix, ...mockPublicKey]);
154
+ const invalidDid = `did:key:z${base58Encode(fullBytes)}`;
155
+
156
+ expect(extractPublicKeyFromDidKey(invalidDid)).toBeNull();
157
+ });
158
+
159
+ it("should return null for too short key", () => {
160
+ const shortBytes = new Uint8Array([0xed, 0x01, 1, 2, 3]); // Only 3 bytes of key
161
+ const shortDid = `did:key:z${base58Encode(shortBytes)}`;
162
+
163
+ expect(extractPublicKeyFromDidKey(shortDid)).toBeNull();
164
+ });
165
+ });
166
+
167
+ describe("publicKeyToJwk", () => {
168
+ it("should convert public key bytes to JWK format", () => {
169
+ const publicKeyBytes = new Uint8Array(32).map((_, i) => i);
170
+ const jwk = publicKeyToJwk(publicKeyBytes);
171
+
172
+ expect(jwk.kty).toBe("OKP");
173
+ expect(jwk.crv).toBe("Ed25519");
174
+ expect(jwk.x).toBeDefined();
175
+ expect(typeof jwk.x).toBe("string");
176
+ });
177
+
178
+ it("should produce base64url-encoded x value", () => {
179
+ const publicKeyBytes = new Uint8Array(32).fill(0);
180
+ const jwk = publicKeyToJwk(publicKeyBytes);
181
+
182
+ // Base64url should not contain +, /, or =
183
+ expect(jwk.x).not.toMatch(/[+/=]/);
184
+ });
185
+ });
186
+
187
+ describe("createDidKeyResolver", () => {
188
+ it("should resolve Ed25519 did:key to DID Document", async () => {
189
+ const mockPublicKey = new Uint8Array(32).map((_, i) => i);
190
+ const didKey = createTestDidKey(mockPublicKey);
191
+
192
+ const resolver = createDidKeyResolver();
193
+ const didDoc = await resolver.resolve(didKey);
194
+
195
+ expect(didDoc).not.toBeNull();
196
+ expect(didDoc?.id).toBe(didKey);
197
+ expect(didDoc?.verificationMethod).toHaveLength(1);
198
+ expect(didDoc?.verificationMethod?.[0].type).toBe("Ed25519VerificationKey2020");
199
+ expect(didDoc?.verificationMethod?.[0].controller).toBe(didKey);
200
+ expect(didDoc?.verificationMethod?.[0].publicKeyJwk).toBeDefined();
201
+ expect(didDoc?.authentication).toContain(`${didKey}#keys-1`);
202
+ expect(didDoc?.assertionMethod).toContain(`${didKey}#keys-1`);
203
+ });
204
+
205
+ it("should return null for non-Ed25519 did:key", async () => {
206
+ const resolver = createDidKeyResolver();
207
+ const result = await resolver.resolve("did:key:z7r8os");
208
+
209
+ expect(result).toBeNull();
210
+ });
211
+
212
+ it("should return null for non-did:key DIDs", async () => {
213
+ const resolver = createDidKeyResolver();
214
+ const result = await resolver.resolve("did:web:example.com");
215
+
216
+ expect(result).toBeNull();
217
+ });
218
+ });
219
+
220
+ describe("resolveDidKeySync", () => {
221
+ it("should synchronously resolve Ed25519 did:key", () => {
222
+ const mockPublicKey = new Uint8Array(32).map((_, i) => i);
223
+ const didKey = createTestDidKey(mockPublicKey);
224
+
225
+ const didDoc = resolveDidKeySync(didKey);
226
+
227
+ expect(didDoc).not.toBeNull();
228
+ expect(didDoc?.id).toBe(didKey);
229
+ expect(didDoc?.verificationMethod).toHaveLength(1);
230
+ });
231
+
232
+ it("should return null for invalid DIDs", () => {
233
+ expect(resolveDidKeySync("did:web:example.com")).toBeNull();
234
+ expect(resolveDidKeySync("did:key:invalid")).toBeNull();
235
+ });
236
+ });
237
+ });
238
+
239
+ describe("VC-JWT Roundtrip Integration", () => {
240
+ it("should correctly resolve did:key generated by UserDidManager pattern", async () => {
241
+ // This test simulates the pattern used in UserDidManager.generateKeyPair()
242
+ // which creates did:key DIDs for users
243
+
244
+ // Simulate generating a random Ed25519 key (32 bytes)
245
+ const mockPublicKey = crypto.getRandomValues(new Uint8Array(32));
246
+
247
+ // Encode as did:key (same pattern as UserDidManager)
248
+ const multicodecPrefix = new Uint8Array([0xed, 0x01]);
249
+ const multicodecBytes = new Uint8Array([...multicodecPrefix, ...mockPublicKey]);
250
+ const multibaseEncoded = base58Encode(multicodecBytes);
251
+ const didKey = `did:key:z${multibaseEncoded}`;
252
+
253
+ // Verify we can resolve this did:key back to get the public key
254
+ const resolver = createDidKeyResolver();
255
+ const didDoc = await resolver.resolve(didKey);
256
+
257
+ expect(didDoc).not.toBeNull();
258
+ expect(didDoc?.id).toBe(didKey);
259
+ expect(didDoc?.verificationMethod?.[0]?.publicKeyJwk).toBeDefined();
260
+
261
+ // Extract public key and verify it matches
262
+ const extractedKey = extractPublicKeyFromDidKey(didKey);
263
+ expect(extractedKey).toEqual(mockPublicKey);
264
+ });
265
+ });