@sovrahq/waci 3.4.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 (124) hide show
  1. package/.eslintignore +2 -0
  2. package/.eslintrc.js +21 -0
  3. package/.prettierrc +4 -0
  4. package/LICENSE +201 -0
  5. package/dist/callbacks/index.d.ts +108 -0
  6. package/dist/callbacks/index.js +9 -0
  7. package/dist/callbacks/index.js.map +1 -0
  8. package/dist/constants/index.d.ts +1 -0
  9. package/dist/constants/index.js +5 -0
  10. package/dist/constants/index.js.map +1 -0
  11. package/dist/handlers/common/problem-report.handler.d.ts +4 -0
  12. package/dist/handlers/common/problem-report.handler.js +72 -0
  13. package/dist/handlers/common/problem-report.handler.js.map +1 -0
  14. package/dist/handlers/common/step-2-oob-invitation.handler.d.ts +4 -0
  15. package/dist/handlers/common/step-2-oob-invitation.handler.js +93 -0
  16. package/dist/handlers/common/step-2-oob-invitation.handler.js.map +1 -0
  17. package/dist/handlers/decorators/register-handler.decorator.d.ts +2 -0
  18. package/dist/handlers/decorators/register-handler.decorator.js +13 -0
  19. package/dist/handlers/decorators/register-handler.decorator.js.map +1 -0
  20. package/dist/handlers/index.d.ts +6 -0
  21. package/dist/handlers/index.js +11 -0
  22. package/dist/handlers/index.js.map +1 -0
  23. package/dist/handlers/issuance/step-3-propose-credential.handler.d.ts +32 -0
  24. package/dist/handlers/issuance/step-3-propose-credential.handler.js +180 -0
  25. package/dist/handlers/issuance/step-3-propose-credential.handler.js.map +1 -0
  26. package/dist/handlers/issuance/step-4-1-offer-credential-proceed.handler.d.ts +5 -0
  27. package/dist/handlers/issuance/step-4-1-offer-credential-proceed.handler.js +152 -0
  28. package/dist/handlers/issuance/step-4-1-offer-credential-proceed.handler.js.map +1 -0
  29. package/dist/handlers/issuance/step-4-offer-credential.handler.d.ts +5 -0
  30. package/dist/handlers/issuance/step-4-offer-credential.handler.js +169 -0
  31. package/dist/handlers/issuance/step-4-offer-credential.handler.js.map +1 -0
  32. package/dist/handlers/issuance/step-5-request-credential.handler.d.ts +4 -0
  33. package/dist/handlers/issuance/step-5-request-credential.handler.js +275 -0
  34. package/dist/handlers/issuance/step-5-request-credential.handler.js.map +1 -0
  35. package/dist/handlers/issuance/step-6-issue-credential.handler.d.ts +4 -0
  36. package/dist/handlers/issuance/step-6-issue-credential.handler.js +106 -0
  37. package/dist/handlers/issuance/step-6-issue-credential.handler.js.map +1 -0
  38. package/dist/handlers/issuance/step-7-ack-message.handler.d.ts +4 -0
  39. package/dist/handlers/issuance/step-7-ack-message.handler.js +78 -0
  40. package/dist/handlers/issuance/step-7-ack-message.handler.js.map +1 -0
  41. package/dist/handlers/presentation/step-3-propose-presentation.handler.d.ts +5 -0
  42. package/dist/handlers/presentation/step-3-propose-presentation.handler.js +107 -0
  43. package/dist/handlers/presentation/step-3-propose-presentation.handler.js.map +1 -0
  44. package/dist/handlers/presentation/step-4-1-presentation-proceed.handler.d.ts +5 -0
  45. package/dist/handlers/presentation/step-4-1-presentation-proceed.handler.js +130 -0
  46. package/dist/handlers/presentation/step-4-1-presentation-proceed.handler.js.map +1 -0
  47. package/dist/handlers/presentation/step-4-request-presentation.handler.d.ts +5 -0
  48. package/dist/handlers/presentation/step-4-request-presentation.handler.js +151 -0
  49. package/dist/handlers/presentation/step-4-request-presentation.handler.js.map +1 -0
  50. package/dist/handlers/presentation/step-5-present-proof.handler.d.ts +4 -0
  51. package/dist/handlers/presentation/step-5-present-proof.handler.js +211 -0
  52. package/dist/handlers/presentation/step-5-present-proof.handler.js.map +1 -0
  53. package/dist/handlers/presentation/step-6-ack-message.handler.d.ts +4 -0
  54. package/dist/handlers/presentation/step-6-ack-message.handler.js +72 -0
  55. package/dist/handlers/presentation/step-6-ack-message.handler.js.map +1 -0
  56. package/dist/index.d.ts +17 -0
  57. package/dist/index.js +37 -0
  58. package/dist/index.js.map +1 -0
  59. package/dist/services/waci-interpreter.d.ts +17 -0
  60. package/dist/services/waci-interpreter.js +222 -0
  61. package/dist/services/waci-interpreter.js.map +1 -0
  62. package/dist/types/actor.d.ts +5 -0
  63. package/dist/types/actor.js +10 -0
  64. package/dist/types/actor.js.map +1 -0
  65. package/dist/types/credential-application.d.ts +36 -0
  66. package/dist/types/credential-application.js +3 -0
  67. package/dist/types/credential-application.js.map +1 -0
  68. package/dist/types/credential-manifest.d.ts +173 -0
  69. package/dist/types/credential-manifest.js +3 -0
  70. package/dist/types/credential-manifest.js.map +1 -0
  71. package/dist/types/index.d.ts +4 -0
  72. package/dist/types/index.js +21 -0
  73. package/dist/types/index.js.map +1 -0
  74. package/dist/types/problem-report.d.ts +13 -0
  75. package/dist/types/problem-report.js +18 -0
  76. package/dist/types/problem-report.js.map +1 -0
  77. package/dist/types/waci-message.d.ts +106 -0
  78. package/dist/types/waci-message.js +106 -0
  79. package/dist/types/waci-message.js.map +1 -0
  80. package/dist/utils/erros.d.ts +15 -0
  81. package/dist/utils/erros.js +42 -0
  82. package/dist/utils/erros.js.map +1 -0
  83. package/dist/utils/index.d.ts +22 -0
  84. package/dist/utils/index.js +356 -0
  85. package/dist/utils/index.js.map +1 -0
  86. package/jest.config.json +17 -0
  87. package/package.json +39 -0
  88. package/readme.md +1 -0
  89. package/src/callbacks/index.ts +75 -0
  90. package/src/constants/index.ts +1 -0
  91. package/src/handlers/common/problem-report.handler.ts +15 -0
  92. package/src/handlers/common/step-2-oob-invitation.handler.ts +45 -0
  93. package/src/handlers/decorators/register-handler.decorator.ts +10 -0
  94. package/src/handlers/index.ts +7 -0
  95. package/src/handlers/issuance/step-3-propose-credential.handler.ts +186 -0
  96. package/src/handlers/issuance/step-4-1-offer-credential-proceed.handler.ts +129 -0
  97. package/src/handlers/issuance/step-4-offer-credential.handler.ts +137 -0
  98. package/src/handlers/issuance/step-5-request-credential.handler.ts +205 -0
  99. package/src/handlers/issuance/step-6-issue-credential.handler.ts +63 -0
  100. package/src/handlers/issuance/step-7-ack-message.handler.ts +21 -0
  101. package/src/handlers/presentation/step-3-propose-presentation.handler.ts +67 -0
  102. package/src/handlers/presentation/step-4-1-presentation-proceed.handler.ts +100 -0
  103. package/src/handlers/presentation/step-4-request-presentation.handler.ts +115 -0
  104. package/src/handlers/presentation/step-5-present-proof.handler.ts +159 -0
  105. package/src/handlers/presentation/step-6-ack-message.handler.ts +15 -0
  106. package/src/index.ts +18 -0
  107. package/src/services/waci-interpreter.ts +161 -0
  108. package/src/types/actor.ts +5 -0
  109. package/src/types/credential-application.ts +38 -0
  110. package/src/types/credential-manifest.ts +184 -0
  111. package/src/types/index.ts +4 -0
  112. package/src/types/problem-report.ts +29 -0
  113. package/src/types/waci-message.ts +148 -0
  114. package/src/utils/erros.ts +21 -0
  115. package/src/utils/index.ts +272 -0
  116. package/test/handlers/issuance/step-3-propose-credential.handler.spec.ts +43 -0
  117. package/test/handlers/issuance/step-4-offer-credential.handler.spec.ts +53 -0
  118. package/test/handlers/issuance/step-5-request-credential.handler.spec.ts +102 -0
  119. package/test/handlers/presentation/step-5-present-proof.handler.spec.ts +142 -0
  120. package/test/handlers/shared/step-2-oob-invitation.handler.spec.ts +55 -0
  121. package/test/stubs/index.ts +842 -0
  122. package/test/waci-interpreter.spec.ts +113 -0
  123. package/tsconfig.build.json +9 -0
  124. package/tsconfig.json +20 -0
@@ -0,0 +1,63 @@
1
+ import { RegisterHandler } from '../decorators/register-handler.decorator';
2
+ import {
3
+ AckStatus,
4
+ Actor,
5
+ WACIMessage,
6
+ WACIMessageHandler,
7
+ WACIMessageHandlerResponse,
8
+ WACIMessageResponseType,
9
+ WACIMessageType,
10
+ } from '../../types';
11
+ import { createUUID } from '../../utils';
12
+ import { ProblemReportMessage } from '../../types/problem-report';
13
+
14
+ @RegisterHandler(Actor.Holder, WACIMessageType.IssueCredential)
15
+ export class IssueCredentialHandler implements WACIMessageHandler {
16
+ async handle(
17
+ messageThread: WACIMessage[],
18
+ callbacks: any,
19
+ ): Promise<WACIMessageHandlerResponse> {
20
+ const message = messageThread[messageThread.length - 1];
21
+
22
+ const problemReport = new ProblemReportMessage();
23
+ const fulfillmentAcceptance = await callbacks[
24
+ Actor.Holder
25
+ ].handleCredentialFulfillment({
26
+ message,
27
+ credentialFulfillment: message.attachments
28
+ });
29
+ const holderDID = message.to[0];
30
+ const issuerDID = message.from;
31
+
32
+ //TODO define when this is neccesary
33
+ if (!fulfillmentAcceptance) {
34
+ return {
35
+ responseType: WACIMessageResponseType.ReplyThread,
36
+ message: {
37
+ type: WACIMessageType.ProblemReport,
38
+ id: createUUID(),
39
+ thid: message.thid,
40
+ from: holderDID,
41
+ to: [issuerDID],
42
+ body: problemReport.presentProofMessage(
43
+ 'Holder did not accept the credential',
44
+ ),
45
+ },
46
+ };
47
+ }
48
+
49
+ return {
50
+ responseType: WACIMessageResponseType.ReplyThread,
51
+ message: {
52
+ type: WACIMessageType.IssuanceAck,
53
+ id: createUUID(),
54
+ thid: message.thid,
55
+ from: holderDID,
56
+ to: [issuerDID],
57
+ body: {
58
+ status: AckStatus.Ok,
59
+ },
60
+ },
61
+ };
62
+ }
63
+ }
@@ -0,0 +1,21 @@
1
+ import { RegisterHandler } from '../decorators/register-handler.decorator';
2
+ import {
3
+ WACIMessage,
4
+ WACIMessageHandler,
5
+ WACIMessageType,
6
+ Actor,
7
+ } from '../../types';
8
+
9
+ @RegisterHandler(Actor.Issuer, WACIMessageType.IssuanceAck)
10
+ export class IssuanceAckMessageHandler implements WACIMessageHandler {
11
+ async handle(messageThread: WACIMessage[], callbacks: any): Promise<void> {
12
+ const message = messageThread[messageThread.length - 1];
13
+ await callbacks[Actor.Issuer].handleIssuanceAck({
14
+ status: message.body.status,
15
+ message: message,
16
+ from: message.from,
17
+ pthid: message.pthid,
18
+ thid: message.thid,
19
+ });
20
+ }
21
+ }
@@ -0,0 +1,67 @@
1
+ import { RegisterHandler } from '../decorators/register-handler.decorator';
2
+ import {
3
+ WACIMessage,
4
+ WACIMessageHandler,
5
+ WACIMessageHandlerResponse,
6
+ WACIMessageType,
7
+ WACIMessageResponseType,
8
+ Actor,
9
+ InputDescriptor,
10
+ CredentialRequest,
11
+ PresentationDefinitionFrame,
12
+ } from '../../types';
13
+ import { createUUID } from '../../utils';
14
+
15
+ @RegisterHandler(Actor.Verifier, WACIMessageType.ProposePresentation)
16
+ export class ProposePresentationHandler implements WACIMessageHandler {
17
+ async handle(
18
+ messageThread: WACIMessage[],
19
+ callbacks: any,
20
+ ): Promise<WACIMessageHandlerResponse> {
21
+ const message = messageThread[messageThread.length - 1];
22
+ const holderDID = message.from;
23
+ const verifierDID = message.to[0];
24
+ const invitationId = message.pthid;
25
+ const { inputDescriptors, frame } = await callbacks[
26
+ Actor.Verifier
27
+ ].getPresentationDefinition({ invitationId });
28
+
29
+ const requestPresentationMessage = this.createMessage(inputDescriptors, frame);
30
+
31
+ return {
32
+ responseType: WACIMessageResponseType.ReplyThread,
33
+ message: {
34
+ type: WACIMessageType.RequestPresentation,
35
+ id: createUUID(),
36
+ thid: message.id,
37
+ from: verifierDID,
38
+ to: [holderDID],
39
+ body: {},
40
+ attachments: [requestPresentationMessage],
41
+ },
42
+ };
43
+ }
44
+
45
+ private createMessage(
46
+ inputDescriptors: InputDescriptor[],
47
+ frame: PresentationDefinitionFrame
48
+ ): CredentialRequest {
49
+ return {
50
+ id: createUUID(),
51
+ media_type: 'application/json',
52
+ format: 'dif/presentation-exchange/definitions@v1.0',
53
+ data: {
54
+ json: {
55
+ options: {
56
+ challenge: createUUID(),
57
+ },
58
+ presentation_definition: {
59
+ id: createUUID(),
60
+ input_descriptors: inputDescriptors,
61
+ frame: frame
62
+ },
63
+ },
64
+ },
65
+ };
66
+ }
67
+ }
@@ -0,0 +1,100 @@
1
+ import {
2
+ WACIMessage,
3
+ WACIMessageHandlerResponse,
4
+ WACIMessageResponseType,
5
+ WACIMessageType,
6
+ Actor,
7
+ PresentationDefinition,
8
+ CredentialPresentation,
9
+ } from '../../types';
10
+ import { createUUID } from '../../utils';
11
+
12
+ export class PresentationProceed {
13
+ static async presentCredentials(
14
+ messageThread: WACIMessage[],
15
+ credentialsToPresent: any[],
16
+ callbacks: any,
17
+ ): Promise<WACIMessageHandlerResponse> {
18
+ const message = messageThread[messageThread.length - 1];
19
+ const holderDID = message.to[0];
20
+ const verifierDID = message.from;
21
+ const presentationDefinition =
22
+ message.attachments?.[0]?.data?.json?.presentation_definition as PresentationDefinition;
23
+ const challenge = message.attachments?.[0]?.data?.json?.options?.challenge;
24
+
25
+ if (!challenge) throw new Error('No challenge defined');
26
+ if (!presentationDefinition?.input_descriptors) {
27
+ throw new Error('Presentation definition without input required');
28
+ }
29
+
30
+ const credentialPresentation = await this.createMessage(
31
+ presentationDefinition,
32
+ challenge,
33
+ credentialsToPresent,
34
+ holderDID,
35
+ message,
36
+ callbacks,
37
+ );
38
+ return {
39
+ responseType: WACIMessageResponseType.ReplyThread,
40
+ message: {
41
+ type: WACIMessageType.PresentProof,
42
+ id: createUUID(),
43
+ thid: message.thid,
44
+ from: holderDID,
45
+ to: [verifierDID],
46
+ body: {},
47
+ attachments: [credentialPresentation],
48
+ },
49
+ };
50
+ }
51
+
52
+ private static async createMessage(
53
+ presentationDefinition: PresentationDefinition,
54
+ challenge: string,
55
+ credentialsToPresent: any[],
56
+ holderDID: string,
57
+ message: WACIMessage,
58
+ callbacks: any
59
+ ): Promise<CredentialPresentation> {
60
+ const definition_id = presentationDefinition.id;
61
+ const descriptor_map = presentationDefinition.input_descriptors.map(
62
+ (descriptor, index) => ({
63
+ id: descriptor.id,
64
+ format: 'ldp_vp',
65
+ path: `$.verifiableCredential[${index}]`,
66
+ }),
67
+ );
68
+
69
+ const messageData = {
70
+ '@context': [
71
+ 'https://extrimian.blob.core.windows.net/rskec/securityv1.jsonld',
72
+ 'https://extrimian.blob.core.windows.net/rskec/credentialsv1.jsonld',
73
+ 'https://extrimian.blob.core.windows.net/rskec/presentation-exchangesubmissionv1.jsonld',
74
+ ],
75
+ type: ['VerifiablePresentation', 'PresentationSubmission'],
76
+ holder: holderDID,
77
+ presentation_submission: {
78
+ id: createUUID(),
79
+ definition_id,
80
+ descriptor_map,
81
+ },
82
+ verifiableCredential: credentialsToPresent,
83
+ };
84
+
85
+ const signedData = await callbacks[Actor.Holder].signPresentation({
86
+ contentToSign: messageData,
87
+ challenge,
88
+ message
89
+ });
90
+
91
+ return {
92
+ id: createUUID(),
93
+ media_type: 'application/ld+json',
94
+ format: 'dif/presentation-exchange/submission@v1.0',
95
+ data: {
96
+ json: signedData,
97
+ },
98
+ } as CredentialPresentation;
99
+ }
100
+ }
@@ -0,0 +1,115 @@
1
+ import { RegisterHandler } from '../decorators/register-handler.decorator';
2
+ import {
3
+ WACIMessage,
4
+ WACIMessageHandler,
5
+ WACIMessageHandlerResponse,
6
+ WACIMessageResponseType,
7
+ WACIMessageType,
8
+ Actor,
9
+ PresentationDefinition,
10
+ CredentialPresentation,
11
+ } from '../../types';
12
+ import { createUUID } from '../../utils';
13
+ import { CredentialPresentationResponse } from '../../callbacks';
14
+
15
+ @RegisterHandler(Actor.Holder, WACIMessageType.RequestPresentation)
16
+ export class RequestPresentationHandler implements WACIMessageHandler {
17
+ async handle(
18
+ messageThread: WACIMessage[],
19
+ callbacks: any,
20
+ ): Promise<WACIMessageHandlerResponse> {
21
+ const message = messageThread[messageThread.length - 1];
22
+ const holderDID = message.to[0];
23
+ const verifierDID = message.from;
24
+ const presentationDefinition =
25
+ message.attachments?.[0]?.data?.json?.presentation_definition as PresentationDefinition;
26
+ const challenge = message.attachments?.[0]?.data?.json?.options?.challenge;
27
+
28
+ if (!challenge) throw new Error('No challenge defined');
29
+ if (!presentationDefinition?.input_descriptors) {
30
+ throw new Error('Presentation definition without input required');
31
+ }
32
+ const response = await callbacks[
33
+ Actor.Holder
34
+ ].getCredentialPresentation({
35
+ frame: presentationDefinition.frame,
36
+ inputDescriptors: presentationDefinition.input_descriptors,
37
+ message
38
+ });
39
+
40
+ if (response == CredentialPresentationResponse.AsyncProcess) {
41
+ return;
42
+ }
43
+
44
+
45
+ const credentialPresentation = await this.createMessage(
46
+ presentationDefinition,
47
+ challenge,
48
+ response.credentialsToPresent,
49
+ holderDID,
50
+ message,
51
+ callbacks,
52
+ );
53
+ return {
54
+ responseType: WACIMessageResponseType.ReplyThread,
55
+ message: {
56
+ type: WACIMessageType.PresentProof,
57
+ id: createUUID(),
58
+ thid: message.thid,
59
+ from: holderDID,
60
+ to: [verifierDID],
61
+ body: {},
62
+ attachments: [credentialPresentation],
63
+ },
64
+ };
65
+ }
66
+
67
+ private async createMessage(
68
+ presentationDefinition: PresentationDefinition,
69
+ challenge: string,
70
+ credentialsToPresent: any[],
71
+ holderDID: string,
72
+ message: WACIMessage,
73
+ callbacks: any
74
+ ): Promise<CredentialPresentation> {
75
+ const definition_id = presentationDefinition.id;
76
+ const descriptor_map = presentationDefinition.input_descriptors.map(
77
+ (descriptor, index) => ({
78
+ id: descriptor.id,
79
+ format: 'ldp_vp',
80
+ path: `$.verifiableCredential[${index}]`,
81
+ }),
82
+ );
83
+
84
+ const messageData = {
85
+ '@context': [
86
+ 'https://extrimian.blob.core.windows.net/rskec/securityv1.jsonld',
87
+ 'https://extrimian.blob.core.windows.net/rskec/credentialsv1.jsonld',
88
+ 'https://extrimian.blob.core.windows.net/rskec/presentation-exchangesubmissionv1.jsonld',
89
+ ],
90
+ type: ['VerifiablePresentation', 'PresentationSubmission'],
91
+ holder: holderDID,
92
+ presentation_submission: {
93
+ id: createUUID(),
94
+ definition_id,
95
+ descriptor_map,
96
+ },
97
+ verifiableCredential: credentialsToPresent,
98
+ };
99
+
100
+ const signedData = await callbacks[Actor.Holder].signPresentation({
101
+ contentToSign: messageData,
102
+ challenge,
103
+ message
104
+ });
105
+
106
+ return {
107
+ id: createUUID(),
108
+ media_type: 'application/ld+json',
109
+ format: 'dif/presentation-exchange/submission@v1.0',
110
+ data: {
111
+ json: signedData,
112
+ },
113
+ } as CredentialPresentation;
114
+ }
115
+ }
@@ -0,0 +1,159 @@
1
+ import { isNil } from 'lodash';
2
+ import { RegisterHandler } from '../decorators/register-handler.decorator';
3
+ import {
4
+ AckStatus,
5
+ Actor,
6
+ WACIMessage,
7
+ WACIMessageHandler,
8
+ WACIMessageHandlerResponse,
9
+ WACIMessageResponseType,
10
+ WACIMessageType,
11
+ } from '../../types';
12
+ import {
13
+ extractExpectedChallenge,
14
+ createUUID,
15
+ verifyPresentation,
16
+ } from '../../utils';
17
+ import { ProblemReportMessage } from '../../types/problem-report';
18
+
19
+ @RegisterHandler(Actor.Verifier, WACIMessageType.PresentProof)
20
+ export class PresentProofHandler implements WACIMessageHandler {
21
+ async handle(
22
+ messageThread: WACIMessage[],
23
+ callbacks: any,
24
+ ): Promise<WACIMessageHandlerResponse> {
25
+ const messageToProcess = messageThread[messageThread.length - 1];
26
+
27
+ const holderDID = messageToProcess.from;
28
+ const verifierDID = messageToProcess.to[0];
29
+
30
+ const problemReport = new ProblemReportMessage();
31
+ const requestPresentationMessage = messageThread.find(
32
+ (message) => message.type === WACIMessageType.RequestPresentation,
33
+ );
34
+
35
+ const response = {
36
+ responseType: WACIMessageResponseType.ReplyThread,
37
+ message: {
38
+ type: WACIMessageType.PresentationAck,
39
+ id: createUUID(),
40
+ thid: messageToProcess.thid,
41
+ from: verifierDID,
42
+ to: [holderDID],
43
+ body: { status: undefined },
44
+ },
45
+ };
46
+
47
+ const challengeToCheck = extractExpectedChallenge(
48
+ requestPresentationMessage,
49
+ );
50
+
51
+ const presentation = messageToProcess?.attachments?.[0]?.data?.json;
52
+
53
+ const verifyPresentationResult = await callbacks[
54
+ Actor.Verifier
55
+ ].verifyPresentation({ presentation, challenge: challengeToCheck, message: messageToProcess, holderDid: holderDID });
56
+
57
+ if (!verifyPresentationResult.result) {
58
+ //TO DO error codes from vc suite
59
+ return {
60
+ responseType: WACIMessageResponseType.ReplyThread,
61
+ message: {
62
+ type: WACIMessageType.ProblemReport,
63
+ id: createUUID(),
64
+ thid: messageToProcess.id,
65
+ from: verifierDID,
66
+ to: [holderDID],
67
+ body: problemReport.presentProofMessage(
68
+ verifyPresentationResult.error.name,
69
+ verifyPresentationResult.error.description,
70
+ ),
71
+ },
72
+ };
73
+ }
74
+
75
+ const requests = requestPresentationMessage.attachments.filter(
76
+ (attachment) => !isNil(attachment.data.json.presentation_definition),
77
+ );
78
+
79
+ const submissionsToCheck = requests
80
+ .filter((request) => !isNil(request?.data?.json?.presentation_definition))
81
+ .map((request) => ({
82
+ presentationDefinition: request.data.json.presentation_definition,
83
+ submission: messageToProcess.attachments.find(
84
+ (attachment) =>
85
+ attachment?.data?.json?.presentation_submission?.definition_id ===
86
+ request.data.json.presentation_definition.id,
87
+ ),
88
+ }));
89
+
90
+ let result = false;
91
+
92
+ const verificationResultCallback = callbacks[Actor.Verifier].credentialVerificationResult;
93
+ let vcs = [];
94
+
95
+ if (
96
+ submissionsToCheck.every(
97
+ (submissionToCheck) => !isNil(submissionToCheck.submission),
98
+ )
99
+ ) {
100
+ for await (const submissionToCheck of submissionsToCheck) {
101
+
102
+ let verify = await verifyPresentation(
103
+ submissionToCheck.presentationDefinition,
104
+ submissionToCheck.submission,
105
+ callbacks[Actor.Verifier].verifyCredential
106
+ );
107
+
108
+ result = verify.result;
109
+
110
+ for (let vc of verify.vcs) {
111
+ vcs.push(vc);
112
+ }
113
+
114
+ if (!result) {
115
+
116
+ if (verificationResultCallback) {
117
+ verificationResultCallback({
118
+ result: verify.result,
119
+ error: verify.errors,
120
+ thid: messageToProcess.thid,
121
+ vcs: verify.vcs,
122
+ message: messageToProcess,
123
+ })
124
+ }
125
+
126
+ return {
127
+ responseType: WACIMessageResponseType.ReplyThread,
128
+ message: {
129
+ type: WACIMessageType.ProblemReport,
130
+ id: createUUID(),
131
+ thid: messageToProcess.id,
132
+ from: verifierDID,
133
+ to: [holderDID],
134
+ body: problemReport.presentProofMessage(
135
+ verify.error.name,
136
+ verify.error.description,
137
+ ),
138
+ },
139
+ };
140
+ }
141
+ }
142
+
143
+ if (result) {
144
+ if (verificationResultCallback) {
145
+ verificationResultCallback({
146
+ result: result,
147
+ error: null,
148
+ thid: messageToProcess.thid,
149
+ vcs: vcs,
150
+ message: messageToProcess,
151
+ })
152
+ }
153
+
154
+ response.message.body.status = AckStatus.Ok;
155
+ return response;
156
+ }
157
+ }
158
+ }
159
+ }
@@ -0,0 +1,15 @@
1
+ import { RegisterHandler } from '../decorators/register-handler.decorator';
2
+ import {
3
+ WACIMessage,
4
+ WACIMessageHandler,
5
+ WACIMessageType,
6
+ Actor,
7
+ } from '../../types';
8
+
9
+ @RegisterHandler(Actor.Holder, WACIMessageType.PresentationAck)
10
+ export class PresentationAckMessageHandler implements WACIMessageHandler {
11
+ async handle(messageThread : WACIMessage[], callbacks: any) : Promise<void> {
12
+ const message = messageThread[messageThread.length - 1];
13
+ await callbacks[Actor.Holder].handlePresentationAck({ status: message.body, message });
14
+ }
15
+ }
package/src/index.ts ADDED
@@ -0,0 +1,18 @@
1
+ import './handlers/common/step-2-oob-invitation.handler';
2
+ import './handlers/common/problem-report.handler';
3
+ import './handlers/issuance/step-3-propose-credential.handler';
4
+ import './handlers/issuance/step-4-offer-credential.handler';
5
+ import './handlers/issuance/step-5-request-credential.handler';
6
+ import './handlers/issuance/step-6-issue-credential.handler';
7
+ import './handlers/issuance/step-7-ack-message.handler';
8
+ import './handlers/presentation/step-3-propose-presentation.handler';
9
+ import './handlers/presentation/step-4-request-presentation.handler';
10
+ import './handlers/presentation/step-5-present-proof.handler';
11
+ import './handlers/presentation/step-6-ack-message.handler';
12
+
13
+ export * from "./handlers/issuance/step-3-propose-credential.handler";
14
+ export { InputCallbacks, CredentialPresentationResponse } from './callbacks';
15
+ export * from './services/waci-interpreter';
16
+ export * from './types/waci-message';
17
+ export * from './types';
18
+ export { validateVcByInputDescriptor } from "./utils/index";