@verii/server-credentialing-hub 2.0.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 (237) hide show
  1. package/LICENSE +202 -0
  2. package/README.md +13 -0
  3. package/package.json +87 -0
  4. package/src/assets/templates/app-redirect.hbs +22 -0
  5. package/src/config/config.js +118 -0
  6. package/src/config/index.js +19 -0
  7. package/src/controllers/app-redirect/controller.js +85 -0
  8. package/src/controllers/openid4vc/autohooks.js +22 -0
  9. package/src/controllers/openid4vc/oauth-controller.js +96 -0
  10. package/src/controllers/openid4vc/openid4vc-metadata-controller.js +66 -0
  11. package/src/controllers/openid4vc/openid4vci-controller.js +125 -0
  12. package/src/controllers/openid4vp/autohooks.js +22 -0
  13. package/src/controllers/openid4vp/openid4vp-controller.js +177 -0
  14. package/src/controllers/operator/autohooks.js +31 -0
  15. package/src/controllers/operator/credentials/credentials-controller.js +212 -0
  16. package/src/controllers/operator/credentials/schemas/credential.schema.js +46 -0
  17. package/src/controllers/operator/credentials/schemas/index.js +7 -0
  18. package/src/controllers/operator/credentials/schemas/new-credential.schema.json +23 -0
  19. package/src/controllers/operator/depots/depots-controller.js +154 -0
  20. package/src/controllers/operator/depots/schemas/depot.schema.js +34 -0
  21. package/src/controllers/operator/depots/schemas/index.js +24 -0
  22. package/src/controllers/operator/depots/schemas/new-depot.schema.json +30 -0
  23. package/src/controllers/operator/issue-links/issue-links-controller.js +74 -0
  24. package/src/controllers/operator/issuer-services/issuer-services-controller.js +200 -0
  25. package/src/controllers/operator/issuer-services/schemas/index.js +7 -0
  26. package/src/controllers/operator/issuer-services/schemas/issuer-service.schema.js +26 -0
  27. package/src/controllers/operator/issuer-services/schemas/new-issuer-service.schema.js +137 -0
  28. package/src/controllers/operator/presentation-links/presentation-links-controller.js +76 -0
  29. package/src/controllers/operator/presentations/presentations-controller.js +174 -0
  30. package/src/controllers/operator/presentations/schemas/base-presentation.schema.js +39 -0
  31. package/src/controllers/operator/presentations/schemas/credential-verification.schema.js +83 -0
  32. package/src/controllers/operator/presentations/schemas/index.js +23 -0
  33. package/src/controllers/operator/presentations/schemas/presentation-verification.schema.js +42 -0
  34. package/src/controllers/operator/presentations/schemas/presentation.schema.js +53 -0
  35. package/src/controllers/operator/presentations/schemas/w3c-presentation.js +52 -0
  36. package/src/controllers/operator/relying-party-services/relying-party-services-controller.js +202 -0
  37. package/src/controllers/operator/relying-party-services/schemas/index.js +7 -0
  38. package/src/controllers/operator/relying-party-services/schemas/new-relying-party-service.schema.js +91 -0
  39. package/src/controllers/operator/relying-party-services/schemas/relying-party-service.schema.js +26 -0
  40. package/src/controllers/operator/tenants/schemas/index.js +33 -0
  41. package/src/controllers/operator/tenants/schemas/jwk.schema.json +56 -0
  42. package/src/controllers/operator/tenants/schemas/key-metadata.schema.json +12 -0
  43. package/src/controllers/operator/tenants/schemas/new-key-metadata.schema.json +42 -0
  44. package/src/controllers/operator/tenants/schemas/new-key.schema.json +12 -0
  45. package/src/controllers/operator/tenants/schemas/new-tenant.schema.json +33 -0
  46. package/src/controllers/operator/tenants/schemas/secret-key.schema.json +33 -0
  47. package/src/controllers/operator/tenants/schemas/tenant.schema.json +44 -0
  48. package/src/controllers/operator/tenants/tenants-controller.js +165 -0
  49. package/src/controllers/root-controller.js +43 -0
  50. package/src/controllers/vn-api/schemas/index.js +25 -0
  51. package/src/controllers/vn-api/schemas/presentation-submission.schema.json +41 -0
  52. package/src/controllers/vn-api/schemas/velocity-presentation-submission.response.200.schema.json +36 -0
  53. package/src/controllers/vn-api/schemas/velocity-presentation-submission.schema.json +31 -0
  54. package/src/controllers/vn-api/vn-api-presentation-controller.js +158 -0
  55. package/src/controllers/vn-api/vn-issuing-controller.js +295 -0
  56. package/src/entities/credential-types/fetchers/fetch-credential-type-descriptors.js +36 -0
  57. package/src/entities/credential-types/fetchers/index.js +19 -0
  58. package/src/entities/credential-types/index.js +19 -0
  59. package/src/entities/credentials/domain/canonicalize-credentials.js +70 -0
  60. package/src/entities/credentials/domain/credential-errors.js +25 -0
  61. package/src/entities/credentials/domain/credential-format.js +21 -0
  62. package/src/entities/credentials/domain/index.js +22 -0
  63. package/src/entities/credentials/domain/validate-credential.js +74 -0
  64. package/src/entities/credentials/facades/anchor-verii-credentials-facade.js +45 -0
  65. package/src/entities/credentials/facades/build-verii-issuer.js +44 -0
  66. package/src/entities/credentials/facades/index.js +22 -0
  67. package/src/entities/credentials/facades/issue-verii-credentials-facade.js +62 -0
  68. package/src/entities/credentials/facades/sign-verii-credentials-facade.js +56 -0
  69. package/src/entities/credentials/factories/credential-factory.js +53 -0
  70. package/src/entities/credentials/factories/index.js +19 -0
  71. package/src/entities/credentials/index.js +23 -0
  72. package/src/entities/credentials/orchestrators/create-credentials.js +118 -0
  73. package/src/entities/credentials/orchestrators/index.js +19 -0
  74. package/src/entities/credentials/repo/finders-extension.js +94 -0
  75. package/src/entities/credentials/repo/index.js +19 -0
  76. package/src/entities/credentials/repo/repo.js +62 -0
  77. package/src/entities/credentials/repo/update-issued-credential.js +60 -0
  78. package/src/entities/depots/domain/depot-errors.js +23 -0
  79. package/src/entities/depots/domain/index.js +20 -0
  80. package/src/entities/depots/domain/validate-depot.js +38 -0
  81. package/src/entities/depots/factories/depot-factory.js +50 -0
  82. package/src/entities/depots/factories/index.js +19 -0
  83. package/src/entities/depots/index.js +22 -0
  84. package/src/entities/depots/orchestrators/create-depot.js +31 -0
  85. package/src/entities/depots/orchestrators/delete-depot.js +43 -0
  86. package/src/entities/depots/orchestrators/index.js +20 -0
  87. package/src/entities/depots/repo/find-depot-by-preauth-code.js +30 -0
  88. package/src/entities/depots/repo/find-depots-extension.js +34 -0
  89. package/src/entities/depots/repo/index.js +19 -0
  90. package/src/entities/depots/repo/refresh-preauth-code.js +30 -0
  91. package/src/entities/depots/repo/repo.js +61 -0
  92. package/src/entities/exchanges/adapters/index.js +17 -0
  93. package/src/entities/exchanges/adapters/sign-exchange-response.js +37 -0
  94. package/src/entities/exchanges/domain/authorize-exchange.js +29 -0
  95. package/src/entities/exchanges/domain/build-exchange-event.js +19 -0
  96. package/src/entities/exchanges/domain/build-presentation-request.js +174 -0
  97. package/src/entities/exchanges/domain/exchange-errors.js +28 -0
  98. package/src/entities/exchanges/domain/exchange-protocols.js +29 -0
  99. package/src/entities/exchanges/domain/exchange-states.js +53 -0
  100. package/src/entities/exchanges/domain/exchange-types.js +22 -0
  101. package/src/entities/exchanges/domain/generate-issuing-challenge.js +48 -0
  102. package/src/entities/exchanges/domain/index.js +32 -0
  103. package/src/entities/exchanges/domain/validate-message-settings.js +33 -0
  104. package/src/entities/exchanges/domain/validate-new-exchange.js +25 -0
  105. package/src/entities/exchanges/domain/validate-preauth.js +45 -0
  106. package/src/entities/exchanges/domain/validate-referenced-service.js +33 -0
  107. package/src/entities/exchanges/domain/verify-issuing-challenge.js +42 -0
  108. package/src/entities/exchanges/domain/verify-proof-of-key-possession.js +128 -0
  109. package/src/entities/exchanges/factories/index.js +19 -0
  110. package/src/entities/exchanges/factories/init-exchange-factory.js +58 -0
  111. package/src/entities/exchanges/hooks/exchange-error-hook.js +30 -0
  112. package/src/entities/exchanges/hooks/index.js +17 -0
  113. package/src/entities/exchanges/index.js +24 -0
  114. package/src/entities/exchanges/orchestrators/authenticate.js +67 -0
  115. package/src/entities/exchanges/orchestrators/credential-offer-request.js +70 -0
  116. package/src/entities/exchanges/orchestrators/get-credential-manifest.js +84 -0
  117. package/src/entities/exchanges/orchestrators/get-presentation-request.js +114 -0
  118. package/src/entities/exchanges/orchestrators/index.js +24 -0
  119. package/src/entities/exchanges/orchestrators/issue-credentials.js +132 -0
  120. package/src/entities/exchanges/orchestrators/post-presentation.js +58 -0
  121. package/src/entities/exchanges/repo/exchange-state-repo-extension.js +78 -0
  122. package/src/entities/exchanges/repo/index.js +19 -0
  123. package/src/entities/exchanges/repo/repo.js +52 -0
  124. package/src/entities/issuer-services/domain/index.js +20 -0
  125. package/src/entities/issuer-services/domain/issuer-services-errors.js +23 -0
  126. package/src/entities/issuer-services/domain/validate-issuer-service.js +23 -0
  127. package/src/entities/issuer-services/factories/index.js +19 -0
  128. package/src/entities/issuer-services/factories/issuer-service-factory.js +44 -0
  129. package/src/entities/issuer-services/index.js +21 -0
  130. package/src/entities/issuer-services/repo/find-issuer-services-extension.js +30 -0
  131. package/src/entities/issuer-services/repo/index.js +19 -0
  132. package/src/entities/issuer-services/repo/repo.js +59 -0
  133. package/src/entities/keys/adapters/index.js +19 -0
  134. package/src/entities/keys/adapters/load-primary-account.js +39 -0
  135. package/src/entities/keys/domain/cih-key-purposes.js +23 -0
  136. package/src/entities/keys/domain/get-key-with-purpose.js +22 -0
  137. package/src/entities/keys/domain/index.js +22 -0
  138. package/src/entities/keys/domain/key-errors.js +25 -0
  139. package/src/entities/keys/domain/normalize-tenant-key.js +33 -0
  140. package/src/entities/keys/domain/validate-tenant-keys.js +78 -0
  141. package/src/entities/keys/factories/index.js +19 -0
  142. package/src/entities/keys/factories/key-factory.js +61 -0
  143. package/src/entities/keys/index.js +22 -0
  144. package/src/entities/keys/plugins/index.js +17 -0
  145. package/src/entities/keys/plugins/kms-plugin.js +61 -0
  146. package/src/entities/links/domain/build-deep-link-url.js +58 -0
  147. package/src/entities/links/domain/build-openid4vci-credential-offer-link.js +31 -0
  148. package/src/entities/links/domain/build-openid4vp-authorization-request-link.js +36 -0
  149. package/src/entities/links/domain/build-redirect-url.js +29 -0
  150. package/src/entities/links/domain/build-vn-api-issuing-link.js +54 -0
  151. package/src/entities/links/domain/build-vn-api-presentation-link.js +49 -0
  152. package/src/entities/links/domain/index.js +28 -0
  153. package/src/entities/links/domain/is-preauth-code-auth.js +19 -0
  154. package/src/entities/links/domain/link-errors.js +23 -0
  155. package/src/entities/links/domain/validate-issue-link.js +39 -0
  156. package/src/entities/links/domain/validate-presentation-link.js +39 -0
  157. package/src/entities/links/index.js +20 -0
  158. package/src/entities/links/orchestrators/index.js +17 -0
  159. package/src/entities/links/orchestrators/refresh-links.js +139 -0
  160. package/src/entities/openid4vci/domain/index.js +20 -0
  161. package/src/entities/openid4vci/domain/openid4vci-errors.js +24 -0
  162. package/src/entities/openid4vci/domain/to-credential-configuration-id.js +21 -0
  163. package/src/entities/openid4vci/index.js +21 -0
  164. package/src/entities/openid4vci/orchestrators/create-access-token.js +85 -0
  165. package/src/entities/openid4vci/orchestrators/create-credential.js +108 -0
  166. package/src/entities/openid4vci/orchestrators/get-authorization-server-metadata.js +22 -0
  167. package/src/entities/openid4vci/orchestrators/get-credential-issuer-metadata.js +22 -0
  168. package/src/entities/openid4vci/orchestrators/handle-notification.js +94 -0
  169. package/src/entities/openid4vci/orchestrators/index.js +24 -0
  170. package/src/entities/openid4vci/plugins/index.js +19 -0
  171. package/src/entities/openid4vci/plugins/openid4vci-plugin.js +427 -0
  172. package/src/entities/openid4vp/domain/index.js +21 -0
  173. package/src/entities/openid4vp/domain/openid4vp-request-id.js +47 -0
  174. package/src/entities/openid4vp/domain/presentation-request-expiry.js +37 -0
  175. package/src/entities/openid4vp/domain/wallet-metadata.js +30 -0
  176. package/src/entities/openid4vp/index.js +21 -0
  177. package/src/entities/openid4vp/orchestrators/create-authorization-request.js +183 -0
  178. package/src/entities/openid4vp/orchestrators/index.js +20 -0
  179. package/src/entities/openid4vp/orchestrators/post-authorization-response.js +353 -0
  180. package/src/entities/openid4vp/plugins/index.js +19 -0
  181. package/src/entities/openid4vp/plugins/openid4vp-plugin.js +174 -0
  182. package/src/entities/presentations/domain/index.js +20 -0
  183. package/src/entities/presentations/domain/presentation-format.js +20 -0
  184. package/src/entities/presentations/domain/validate-presentation.js +178 -0
  185. package/src/entities/presentations/factories/index.js +19 -0
  186. package/src/entities/presentations/factories/presentation-factory.js +96 -0
  187. package/src/entities/presentations/index.js +21 -0
  188. package/src/entities/presentations/orchestrators/index.js +19 -0
  189. package/src/entities/presentations/orchestrators/verify-presentation.js +131 -0
  190. package/src/entities/presentations/repo/add-verification.js +31 -0
  191. package/src/entities/presentations/repo/finders-extension.js +50 -0
  192. package/src/entities/presentations/repo/index.js +19 -0
  193. package/src/entities/presentations/repo/repo.js +58 -0
  194. package/src/entities/relying-party-services/factories/index.js +19 -0
  195. package/src/entities/relying-party-services/factories/relying-party-service-factory.js +43 -0
  196. package/src/entities/relying-party-services/index.js +20 -0
  197. package/src/entities/relying-party-services/repo/find-relying-party-services-extension.js +30 -0
  198. package/src/entities/relying-party-services/repo/index.js +19 -0
  199. package/src/entities/relying-party-services/repo/repo.js +55 -0
  200. package/src/entities/service-configurations/domain/canonicalize-service-configuration.js +12 -0
  201. package/src/entities/service-configurations/domain/index.js +22 -0
  202. package/src/entities/service-configurations/domain/service-configuration-errors.js +24 -0
  203. package/src/entities/service-configurations/domain/validate-service-configuration.js +31 -0
  204. package/src/entities/service-configurations/domain/validate-update-service-configuration.js +19 -0
  205. package/src/entities/service-configurations/index.js +20 -0
  206. package/src/entities/service-configurations/orchestrators/create-service-configuration.js +34 -0
  207. package/src/entities/service-configurations/orchestrators/delete-service-configuration.js +41 -0
  208. package/src/entities/service-configurations/orchestrators/index.js +21 -0
  209. package/src/entities/service-configurations/orchestrators/update-service-configuration.js +40 -0
  210. package/src/entities/tenants/adapters/index.js +20 -0
  211. package/src/entities/tenants/adapters/load-tenant-did-doc.js +47 -0
  212. package/src/entities/tenants/adapters/load-tenant-profile.js +40 -0
  213. package/src/entities/tenants/domain/index.js +20 -0
  214. package/src/entities/tenants/domain/tenant-errors.js +29 -0
  215. package/src/entities/tenants/domain/validate-new-tenant.js +49 -0
  216. package/src/entities/tenants/factories/index.js +19 -0
  217. package/src/entities/tenants/factories/tenant-factory.js +41 -0
  218. package/src/entities/tenants/index.js +24 -0
  219. package/src/entities/tenants/orchestrators/create-tenant.js +116 -0
  220. package/src/entities/tenants/orchestrators/delete-tenant.js +45 -0
  221. package/src/entities/tenants/orchestrators/find-tenants.js +22 -0
  222. package/src/entities/tenants/orchestrators/index.js +21 -0
  223. package/src/entities/tenants/plugins/index.js +3 -0
  224. package/src/entities/tenants/plugins/tenant-loader-plugin.js +64 -0
  225. package/src/entities/tenants/repo/index.js +19 -0
  226. package/src/entities/tenants/repo/insert-tenant-extension.js +36 -0
  227. package/src/entities/tenants/repo/repo.js +51 -0
  228. package/src/entities/tokens/domains/access-token.js +74 -0
  229. package/src/entities/tokens/domains/index.js +19 -0
  230. package/src/entities/tokens/index.js +19 -0
  231. package/src/index.js +3 -0
  232. package/src/init-server.js +88 -0
  233. package/src/main.js +25 -0
  234. package/src/schemas/index.js +20 -0
  235. package/src/schemas/oauth-error-response.schema.js +27 -0
  236. package/src/standalone.js +8 -0
  237. package/src/start-app-server.js +27 -0
@@ -0,0 +1,137 @@
1
+ const newIssuerServiceSchema = {
2
+ title: 'new-issuer-service',
3
+ $id: 'new-issuer-service',
4
+ type: 'object',
5
+ description: 'The issuer service describes how issuer is setup',
6
+ additionalProperties: false,
7
+ required: ['velocityNetworkServiceId', 'termsUrl', 'authMethods', 'authMode'],
8
+ properties: {
9
+ velocityNetworkServiceId: {
10
+ type: 'string',
11
+ description: 'Velocity Network Service Id',
12
+ },
13
+ description: {
14
+ type: 'string',
15
+ description: 'Description field for the issuer flow',
16
+ },
17
+ termsUrl: {
18
+ type: 'string',
19
+ description:
20
+ 'link to a online terms and coniditions for issuer or disclosure',
21
+ format: 'uri',
22
+ },
23
+ disclosureRequest: {
24
+ type: 'object',
25
+ description:
26
+ 'Required if `identificationMethod` contains `verifiable_presentation`',
27
+ required: ['types', 'purpose', 'retentionPeriod'],
28
+ properties: {
29
+ types: {
30
+ type: 'array',
31
+ description: 'the set of types that are to be disclosed.',
32
+ minItems: 1,
33
+ items: {
34
+ type: 'object',
35
+ properties: {
36
+ type: {
37
+ type: 'string',
38
+ description: 'The credential type to be disclosed',
39
+ },
40
+ },
41
+ },
42
+ },
43
+ purpose: {
44
+ type: 'string',
45
+ description:
46
+ // eslint-disable-next-line max-len
47
+ 'purpose is a summary of the description\n\n*required*, if the `configurationType` is `inspection` or the `identificationMode` is `verifiable_presentation`',
48
+ },
49
+ retentionPeriod: {
50
+ type: 'string',
51
+ description:
52
+ // eslint-disable-next-line max-len
53
+ '*required*, if the `configurationType` is `inspection` or the `identificationMode` is `verifiable_presentation`\n\nLength of time the disclosure agreement will last. Duration can be any length of time.\n\nFollows the ISO 8601 standard on durations for time intervals.\n\nFormat:\n\nPxYxMxWxD\n\nWhere:\nx = an integer\nY = Years\nM = Months\nW = Weeks\nD = Days\n\nA valid format requires "P" plus at least one integer and time unit.\n\nExamples: \nP60D = 60 days\nP1Y30D = 1 year and 30 days.',
54
+ format: 'duration',
55
+ },
56
+ },
57
+ },
58
+ presentationDefinition: {
59
+ type: 'object',
60
+ description:
61
+ 'A spec compliant presentation definition. https://identity.foundation/presentation-exchange/#presentation-definition',
62
+ additionalProperties: true,
63
+ },
64
+ deactivationDate: {
65
+ type: 'string',
66
+ format: 'date-time',
67
+ description:
68
+ 'can be configured to deactivate at a predetermined time or to be deactivated on demand by setting this to now',
69
+ },
70
+ authTokensExpireIn: {
71
+ type: 'number',
72
+ default: 604800,
73
+ },
74
+ authMethods: {
75
+ type: 'array',
76
+ minItems: 1,
77
+ description:
78
+ // eslint-disable-next-line max-len
79
+ 'the auth method indicates what authentication method(s) are supported for issuer. To use `preauth` requires the issuer to include a `vendorOriginContext` in the deep link. `verifiable_presentation` requires a `disclosureRequest` or `presentationDefinition` to be specified.\nIn the future an issuer will be able to use both methods in one disclosure\n`authMethods` is required with at least one entry ',
80
+ items: {
81
+ type: 'string',
82
+ enum: ['preauth', 'verifiable_presentation'],
83
+ },
84
+ },
85
+ authMode: {
86
+ enum: ['internal'],
87
+ description: 'the auth mode. Currently only `internal` is supported',
88
+ },
89
+ verifiablePresentationAuthRules: {
90
+ description:
91
+ // eslint-disable-next-line max-len
92
+ 'verifiablePresentationAuthRules are the matcher rules that can be used to match an exchange with submitted presentation used for authentication. Required when the authMethods include `verifiable_presentation` and the authMode is `internal`',
93
+ type: 'array',
94
+ items: {
95
+ type: 'object',
96
+ required: ['path', 'rule', 'valueIndex'],
97
+ properties: {
98
+ path: {
99
+ type: 'array',
100
+ description: 'json path(s) to resolve in order',
101
+ items: {
102
+ type: 'string',
103
+ },
104
+ },
105
+ rule: {
106
+ type: 'string',
107
+ description: 'the rule to run. ONly pick is supported right ow',
108
+ enum: ['pick', 'equal'],
109
+ },
110
+ valueIndex: {
111
+ type: 'integer',
112
+ description:
113
+ 'the index to use with in a data row in values. Value must return true when compared using ===',
114
+ },
115
+ },
116
+ },
117
+ },
118
+ challengesExpireIn: {
119
+ type: 'number',
120
+ default: 600,
121
+ description:
122
+ 'how many seconds before challenges issued by this service expire. Default is 10 minutes',
123
+ },
124
+ credentialTypesAvailable: {
125
+ type: 'array',
126
+ description: 'the types of credentials available from this service',
127
+ items: {
128
+ type: 'string',
129
+ },
130
+ },
131
+ autoCleanPII: {
132
+ type: 'boolean',
133
+ },
134
+ },
135
+ };
136
+
137
+ module.exports = newIssuerServiceSchema;
@@ -0,0 +1,76 @@
1
+ /*
2
+ * Copyright 2026 Velocity Team
3
+ *
4
+ * Licensed under the Apache License, Version 2.0 (the "License");
5
+ * you may not use this file except in compliance with the License.
6
+ * You may obtain a copy of the License at
7
+ *
8
+ * http://www.apache.org/licenses/LICENSE-2.0
9
+ *
10
+ * Unless required by applicable law or agreed to in writing, software
11
+ * distributed under the License is distributed on an "AS IS" BASIS,
12
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ * See the License for the specific language governing permissions and
14
+ * limitations under the License.
15
+ *
16
+ */
17
+
18
+ const { refreshPresentationLinks } = require('../../../entities/links');
19
+ const { tenantLoaderPlugin } = require('../../../entities/tenants');
20
+
21
+ const presentationLinksController = async (fastify) => {
22
+ fastify.register(tenantLoaderPlugin, { notFoundStatusCode: 400 }).post(
23
+ '/refresh',
24
+ {
25
+ schema: fastify.autoSchema({
26
+ body: {
27
+ type: 'object',
28
+ properties: {
29
+ tenantId: {
30
+ type: 'string',
31
+ },
32
+ serviceId: {
33
+ type: 'string',
34
+ },
35
+ depotId: {
36
+ type: 'string',
37
+ },
38
+ },
39
+ required: ['tenantId', 'serviceId'],
40
+ },
41
+ response: {
42
+ 200: {
43
+ type: 'object',
44
+ properties: {
45
+ redirectUrl: {
46
+ type: 'string',
47
+ format: 'uri',
48
+ },
49
+ vnProtocolLink: {
50
+ type: 'string',
51
+ format: 'uri',
52
+ },
53
+ openid4vpProtocolLink: {
54
+ type: 'string',
55
+ format: 'uri',
56
+ },
57
+ requestId: {
58
+ type: 'string',
59
+ },
60
+ },
61
+ required: [
62
+ 'redirectUrl',
63
+ 'vnProtocolLink',
64
+ 'openid4vpProtocolLink',
65
+ 'requestId',
66
+ ],
67
+ },
68
+ },
69
+ }),
70
+ },
71
+ async (req) =>
72
+ refreshPresentationLinks(req.body.serviceId, req.body.depotId, req),
73
+ );
74
+ };
75
+
76
+ module.exports = presentationLinksController;
@@ -0,0 +1,174 @@
1
+ /*
2
+ * Copyright 2024 Velocity Team
3
+ *
4
+ * Licensed under the Apache License, Version 2.0 (the "License");
5
+ * you may not use this file except in compliance with the License.
6
+ * You may obtain a copy of the License at
7
+ *
8
+ * http://www.apache.org/licenses/LICENSE-2.0
9
+ *
10
+ * Unless required by applicable law or agreed to in writing, software
11
+ * distributed under the License is distributed on an "AS IS" BASIS,
12
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ * See the License for the specific language governing permissions and
14
+ * limitations under the License.
15
+ *
16
+ */
17
+ const newError = require('http-errors');
18
+ const {
19
+ w3cVcSchema,
20
+ newOfferRelatedResourceSchema,
21
+ } = require('@verii/common-schemas');
22
+ const { tenantLoaderPlugin } = require('../../../entities/tenants');
23
+ const { verifyPresentation } = require('../../../entities/presentations');
24
+ const {
25
+ basePresentationSchema,
26
+ credentialVerificationSchema,
27
+ presentationVerificationSchema,
28
+ presentationSchema,
29
+ w3cPresentationSchema,
30
+ } = require('./schemas');
31
+
32
+ module.exports = async (fastify) => {
33
+ fastify
34
+ .addSchema(newOfferRelatedResourceSchema)
35
+ .addSchema(w3cVcSchema)
36
+ .addSchema(credentialVerificationSchema)
37
+ .addSchema(presentationSchema)
38
+ .addSchema(presentationVerificationSchema)
39
+ .addSchema(w3cPresentationSchema)
40
+ .register(tenantLoaderPlugin, { notFoundStatusCode: 400 })
41
+ .get(
42
+ '/get',
43
+ {
44
+ schema: fastify.autoSchema({
45
+ query: {
46
+ type: 'object',
47
+ properties: {
48
+ tenantId: {
49
+ type: 'string',
50
+ },
51
+ depotId: {
52
+ type: 'string',
53
+ },
54
+ exchangeId: {
55
+ type: 'string',
56
+ },
57
+ presentationId: {
58
+ type: 'string',
59
+ },
60
+ },
61
+ required: ['tenantId'],
62
+ },
63
+ response: {
64
+ 200: {
65
+ type: 'object',
66
+ properties: {
67
+ presentations: {
68
+ type: 'array',
69
+ items: { $ref: 'presentation#' },
70
+ },
71
+ requestId: {
72
+ type: 'string',
73
+ },
74
+ },
75
+ },
76
+ },
77
+ }),
78
+ },
79
+ async (req) => {
80
+ const {
81
+ query: { presentationId, depotId, exchangeId },
82
+ repos,
83
+ } = req;
84
+ const presentations = await repos.presentations.search({
85
+ presentationIds: presentationId ? [presentationId] : [],
86
+ depotId,
87
+ exchangeId,
88
+ });
89
+
90
+ return { presentations };
91
+ },
92
+ )
93
+ .post(
94
+ '/verify',
95
+ {
96
+ schema: fastify.autoSchema({
97
+ body: {
98
+ type: 'object',
99
+ anyOf: [
100
+ {
101
+ type: 'object',
102
+ properties: {
103
+ tenantId: {
104
+ type: 'string',
105
+ },
106
+ presentationId: {
107
+ type: 'string',
108
+ },
109
+ },
110
+ required: ['tenantId', 'presentationId'],
111
+ },
112
+ {
113
+ type: 'object',
114
+ properties: {
115
+ tenantId: {
116
+ type: 'string',
117
+ },
118
+ format: {
119
+ type: 'string',
120
+ enum: ['JWT_VP'],
121
+ },
122
+ presentation: {
123
+ type: 'string',
124
+ },
125
+ },
126
+ required: ['tenantId', 'format', 'presentation'],
127
+ },
128
+ ],
129
+ },
130
+ response: {
131
+ 200: {
132
+ type: 'object',
133
+ properties: {
134
+ ...basePresentationSchema.properties,
135
+ verification: {
136
+ $ref: 'presentation-verification#',
137
+ },
138
+ requestId: {
139
+ type: 'string',
140
+ },
141
+ },
142
+ required: [...basePresentationSchema.required],
143
+ },
144
+ 402: {
145
+ $ref: 'error#',
146
+ },
147
+ },
148
+ }),
149
+ },
150
+ async (req) => {
151
+ if (req.body.presentation) {
152
+ return verifyPresentation(req.body.presentation, req);
153
+ }
154
+ if (req.body.presentationId) {
155
+ const presentationEntity = await req.repos.presentations.findById(
156
+ req.body.presentationId,
157
+ );
158
+
159
+ const verification = await verifyPresentation(
160
+ presentationEntity.presentation,
161
+ req,
162
+ );
163
+ await req.repos.presentations.addVerification(
164
+ presentationEntity._id,
165
+ verification.verification,
166
+ );
167
+ return verification;
168
+ }
169
+ throw newError.BadRequest('presentation verify request invalid', {
170
+ errorCode: 'presentation_verify_request_invalid',
171
+ });
172
+ },
173
+ );
174
+ };
@@ -0,0 +1,39 @@
1
+ /*
2
+ * Copyright 2025 Velocity Team
3
+ *
4
+ * Licensed under the Apache License, Version 2.0 (the "License");
5
+ * you may not use this file except in compliance with the License.
6
+ * You may obtain a copy of the License at
7
+ *
8
+ * http://www.apache.org/licenses/LICENSE-2.0
9
+ *
10
+ * Unless required by applicable law or agreed to in writing, software
11
+ * distributed under the License is distributed on an "AS IS" BASIS,
12
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ * See the License for the specific language governing permissions and
14
+ * limitations under the License.
15
+ *
16
+ */
17
+ const basePresentationSchema = {
18
+ $id: 'base-presentation',
19
+ title: 'base presentation',
20
+ type: 'object',
21
+ additionalProperties: false,
22
+ required: ['format', 'presentation'],
23
+ properties: {
24
+ format: {
25
+ enum: ['JWT_VP'],
26
+ description: `the format of the data contained in the presentation
27
+ If the format is JWT_VP the presentation will be stored in a variable called presentation`,
28
+ },
29
+ presentation: {
30
+ type: 'string',
31
+ description: 'the presentation itself',
32
+ },
33
+ w3cPresentation: {
34
+ $ref: 'w3c-presentation#',
35
+ },
36
+ },
37
+ };
38
+
39
+ module.exports = { basePresentationSchema };
@@ -0,0 +1,83 @@
1
+ /*
2
+ * Copyright 2025 Velocity Team
3
+ *
4
+ * Licensed under the Apache License, Version 2.0 (the "License");
5
+ * you may not use this file except in compliance with the License.
6
+ * You may obtain a copy of the License at
7
+ *
8
+ * http://www.apache.org/licenses/LICENSE-2.0
9
+ *
10
+ * Unless required by applicable law or agreed to in writing, software
11
+ * distributed under the License is distributed on an "AS IS" BASIS,
12
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ * See the License for the specific language governing permissions and
14
+ * limitations under the License.
15
+ *
16
+ */
17
+ const credentialVerificationSchema = {
18
+ title: 'credential-verification',
19
+ $id: 'credential-verification',
20
+ type: 'object',
21
+ additionalProperties: false,
22
+ required: [
23
+ 'verified',
24
+ 'tamperCheck',
25
+ 'trustedIssuerCheck',
26
+ 'trustedHolderCheck',
27
+ 'revocationCheck',
28
+ 'expiryCheck',
29
+ 'format',
30
+ 'credential',
31
+ 'w3cCredential',
32
+ ],
33
+ properties: {
34
+ format: {
35
+ enum: ['JWT_VC'],
36
+ },
37
+ credential: {
38
+ type: 'string',
39
+ },
40
+ w3cCredential: {
41
+ $ref: 'https://velocitycareerlabs.io/w3c-vc.schema.json',
42
+ },
43
+ verified: {
44
+ type: 'boolean',
45
+ },
46
+ tamperCheck: {
47
+ type: 'string',
48
+ enum: ['PASS', 'FAIL', 'UNCHECKED'],
49
+ },
50
+ trustedIssuerCheck: {
51
+ type: 'string',
52
+ enum: [
53
+ 'PASS',
54
+ 'FAIL',
55
+ 'UNCHECKED',
56
+ 'SELF_SIGNED',
57
+ 'DATA_INTEGRITY_ERROR',
58
+ ],
59
+ },
60
+ trustedHolderCheck: {
61
+ type: 'string',
62
+ enum: ['PASS', 'FAIL', 'UNCHECKED', 'NOT_APPLICABLE'],
63
+ },
64
+ revocationCheck: {
65
+ type: 'string',
66
+ enum: [
67
+ 'PASS',
68
+ 'FAIL',
69
+ 'UNCHECKED',
70
+ 'DEPENDENCY_RESOLUTION_ERROR',
71
+ 'NOT_APPLICABLE',
72
+ ],
73
+ },
74
+ expiryCheck: {
75
+ type: 'string',
76
+ enum: ['PASS', 'FAIL', 'UNCHECKED', 'NOT_APPLICABLE'],
77
+ },
78
+ },
79
+ };
80
+
81
+ module.exports = {
82
+ credentialVerificationSchema,
83
+ };
@@ -0,0 +1,23 @@
1
+ /*
2
+ * Copyright 2025 Velocity Team
3
+ *
4
+ * Licensed under the Apache License, Version 2.0 (the "License");
5
+ * you may not use this file except in compliance with the License.
6
+ * You may obtain a copy of the License at
7
+ *
8
+ * http://www.apache.org/licenses/LICENSE-2.0
9
+ *
10
+ * Unless required by applicable law or agreed to in writing, software
11
+ * distributed under the License is distributed on an "AS IS" BASIS,
12
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ * See the License for the specific language governing permissions and
14
+ * limitations under the License.
15
+ *
16
+ */
17
+ module.exports = {
18
+ ...require('./base-presentation.schema'),
19
+ ...require('./credential-verification.schema'),
20
+ ...require('./presentation.schema'),
21
+ ...require('./presentation-verification.schema'),
22
+ ...require('./w3c-presentation'),
23
+ };
@@ -0,0 +1,42 @@
1
+ /*
2
+ * Copyright 2025 Velocity Team
3
+ *
4
+ * Licensed under the Apache License, Version 2.0 (the "License");
5
+ * you may not use this file except in compliance with the License.
6
+ * You may obtain a copy of the License at
7
+ *
8
+ * http://www.apache.org/licenses/LICENSE-2.0
9
+ *
10
+ * Unless required by applicable law or agreed to in writing, software
11
+ * distributed under the License is distributed on an "AS IS" BASIS,
12
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ * See the License for the specific language governing permissions and
14
+ * limitations under the License.
15
+ *
16
+ */
17
+ const presentationVerificationSchema = {
18
+ title: 'presentation-verification',
19
+ $id: 'presentation-verification',
20
+ type: 'object',
21
+ required: ['verified', 'tamperCheck'],
22
+ properties: {
23
+ verified: {
24
+ type: 'boolean',
25
+ },
26
+ tamperCheck: {
27
+ enum: ['PASS', 'FAIL'],
28
+ },
29
+ credentials: {
30
+ type: 'array',
31
+ items: {
32
+ $ref: 'credential-verification#',
33
+ },
34
+ },
35
+ createdAt: {
36
+ type: 'string',
37
+ format: 'date-time',
38
+ },
39
+ },
40
+ };
41
+
42
+ module.exports = { presentationVerificationSchema };
@@ -0,0 +1,53 @@
1
+ /*
2
+ * Copyright 2025 Velocity Team
3
+ *
4
+ * Licensed under the Apache License, Version 2.0 (the "License");
5
+ * you may not use this file except in compliance with the License.
6
+ * You may obtain a copy of the License at
7
+ *
8
+ * http://www.apache.org/licenses/LICENSE-2.0
9
+ *
10
+ * Unless required by applicable law or agreed to in writing, software
11
+ * distributed under the License is distributed on an "AS IS" BASIS,
12
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ * See the License for the specific language governing permissions and
14
+ * limitations under the License.
15
+ *
16
+ */
17
+ const { mutableEntitySchema } = require('@verii/common-schemas');
18
+ const { basePresentationSchema } = require('./base-presentation.schema');
19
+
20
+ const presentationSchema = {
21
+ $id: 'presentation',
22
+ type: 'object',
23
+ properties: {
24
+ ...mutableEntitySchema.properties,
25
+ ...basePresentationSchema.properties,
26
+ depotId: {
27
+ type: 'string',
28
+ description: 'The depot associated with this user',
29
+ },
30
+ exchangeId: {
31
+ type: 'string',
32
+ description:
33
+ "The exchangeId associated with this presentation's reception",
34
+ },
35
+ verifications: {
36
+ type: 'array',
37
+ items: {
38
+ $ref: 'presentation-verification#',
39
+ },
40
+ default: [],
41
+ },
42
+ },
43
+ required: [
44
+ ...mutableEntitySchema.required,
45
+ ...basePresentationSchema.required,
46
+ 'depotId',
47
+ 'exchangeId',
48
+ ],
49
+ };
50
+
51
+ module.exports = {
52
+ presentationSchema,
53
+ };
@@ -0,0 +1,52 @@
1
+ /*
2
+ * Copyright 2025 Velocity Team
3
+ *
4
+ * Licensed under the Apache License, Version 2.0 (the "License");
5
+ * you may not use this file except in compliance with the License.
6
+ * You may obtain a copy of the License at
7
+ *
8
+ * http://www.apache.org/licenses/LICENSE-2.0
9
+ *
10
+ * Unless required by applicable law or agreed to in writing, software
11
+ * distributed under the License is distributed on an "AS IS" BASIS,
12
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ * See the License for the specific language governing permissions and
14
+ * limitations under the License.
15
+ *
16
+ */
17
+ const w3cPresentationSchema = {
18
+ title: 'w3c presentation',
19
+ $id: 'w3c-presentation',
20
+ type: 'object',
21
+ additionalProperties: true,
22
+ properties: {
23
+ id: {
24
+ type: 'string',
25
+ },
26
+ type: {
27
+ type: 'array',
28
+ description: 'The JSON-LD type of the credential.',
29
+ items: {
30
+ type: 'string',
31
+ },
32
+ minItems: 1,
33
+ },
34
+ verifiableCredential: {
35
+ type: 'array',
36
+ items: {
37
+ oneOf: [
38
+ {
39
+ $ref: 'https://velocitycareerlabs.io/w3c-vc.schema.json',
40
+ },
41
+ {
42
+ type: 'string',
43
+ },
44
+ ],
45
+ },
46
+ },
47
+ },
48
+ };
49
+
50
+ module.exports = {
51
+ w3cPresentationSchema,
52
+ };