Skip to content

Commit 88afb98

Browse files
committed
DCKM-582: OID4VP integration
1 parent 31dfbe0 commit 88afb98

File tree

5 files changed

+111
-2
lines changed

5 files changed

+111
-2
lines changed

packages/core/src/credentials/oidvc.ts

Lines changed: 79 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,10 @@
1-
21
import {IWallet} from '../types';
32
import {IDIDProvider} from '../did-provider';
43
import {credentialServiceRPC} from '@docknetwork/wallet-sdk-wasm/src/services/credential';
4+
import {MetadataClient} from '@sphereon/oid4vci-client';
5+
import jwtDecode from 'jwt-decode';
6+
import axios from 'axios';
7+
import {pexService} from '@docknetwork/wallet-sdk-wasm/src/services/pex';
58

69
export async function acquireOpenIDCredentialFromURI({
710
didProvider,
@@ -30,3 +33,78 @@ export async function acquireOpenIDCredentialFromURI({
3033

3134
return response.credential;
3235
}
36+
37+
export async function getAuthURL(
38+
uri: string,
39+
walletClientId: string = 'dock-wallet',
40+
requestedRedirectURI: string = 'dockwallet://vp',
41+
) {
42+
function buildOID4VPRequestURL(params, prefix = 'dockwallet://') {
43+
return `${prefix}?${Object.keys(params)
44+
.map(
45+
key =>
46+
`${encodeURIComponent(key)}=${encodeURIComponent(
47+
typeof params[key] === 'object'
48+
? JSON.stringify(params[key])
49+
: params[key],
50+
)}`,
51+
)
52+
.join('&')}`;
53+
}
54+
55+
const searchParams = new URL(uri).searchParams;
56+
const params = new URLSearchParams(searchParams);
57+
const clientId = params.get('client_id');
58+
const metadata = await MetadataClient.retrieveAllMetadata(clientId);
59+
const requestedAlg =
60+
metadata?.authorizationServerMetadata
61+
?.request_object_signing_alg_values_supported[0];
62+
const requestParams = {
63+
scope: 'openid vp_token',
64+
redirect_uri: requestedRedirectURI,
65+
client_metadata:
66+
requestedAlg && requestedAlg !== 'EdDSA'
67+
? JSON.stringify({
68+
vp_formats_supported: {
69+
vc_json: {
70+
alg_values_supported: [requestedAlg],
71+
},
72+
},
73+
})
74+
: ['EdDSA'],
75+
};
76+
77+
return buildOID4VPRequestURL(
78+
{
79+
...requestParams,
80+
client_id: walletClientId,
81+
},
82+
metadata.authorization_endpoint,
83+
);
84+
}
85+
86+
export async function decodeRequestJWT(uri: string) {
87+
const searchParams = new URL(uri).searchParams;
88+
const params = new URLSearchParams(searchParams);
89+
const requestUri = params.get('request_uri');
90+
const jwt = await axios.get(requestUri).then(res => res.data);
91+
const decoded = jwtDecode(jwt);
92+
93+
return decoded;
94+
}
95+
96+
export async function getPresentationSubmision({
97+
credentials,
98+
presentationDefinition,
99+
holderDID,
100+
}) {
101+
const presentation = await pexService.presentationFrom({
102+
presentationDefinition,
103+
credentials,
104+
holderDID,
105+
});
106+
107+
return presentation.presentation_submission;
108+
}
109+
110+
pexService.evaluatePresentation;

packages/wasm/src/services/pex/config.ts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,12 @@ export type FilterCredentialsParams = {
1919
holderDIDs: string[];
2020
};
2121

22+
export type CreatePresentationParams = {
23+
credentials: any[];
24+
presentationDefinition: any;
25+
holderDID: string;
26+
};
27+
2228
export type EvaluatePresentationParams = {
2329
presentation: any;
2430
presentationDefinition: any;

packages/wasm/src/services/pex/service-rpc.js

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import {
44
FilterCredentialsParams,
55
validation,
66
EvaluatePresentationParams,
7+
CreatePresentationParams,
78
} from './config';
89

910
export class PEXServiceRPC extends RpcService {
@@ -19,4 +20,8 @@ export class PEXServiceRPC extends RpcService {
1920
validation.evaluatePresentation(params);
2021
return this.call('evaluatePresentation', params);
2122
}
23+
24+
async presentationFrom(params: CreatePresentationParams) {
25+
return this.call('presentationFrom', params);
26+
}
2227
}

packages/wasm/src/services/pex/service.ts

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,9 @@ import {
44
validation,
55
EvaluatePresentationParams,
66
FilterCredentialsParams,
7+
CreatePresentationParams,
78
} from './config';
8-
import {PEX} from '@sphereon/pex';
9+
import {IPresentationDefinition, PEX} from '@sphereon/pex';
910

1011
const pex: PEX = new PEX();
1112

@@ -65,6 +66,7 @@ class PEXService {
6566
rpcMethods = [
6667
PEXService.prototype.filterCredentials,
6768
PEXService.prototype.evaluatePresentation,
69+
PEXService.prototype.presentationFrom,
6870
];
6971

7072
filterCredentials(params: FilterCredentialsParams) {
@@ -89,6 +91,17 @@ class PEXService {
8991

9092
return result;
9193
}
94+
95+
presentationFrom(params: CreatePresentationParams) {
96+
const {credentials, presentationDefinition, holderDID} = params;
97+
const result: IPresentation = pex.presentationFrom(
98+
removeOptionalAttribute(presentationDefinition),
99+
credentials,
100+
holderDID,
101+
);
102+
103+
return result;
104+
}
92105
}
93106

94107
export const pexService = new PEXService();

yarn.lock

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4775,6 +4775,13 @@ available-typed-arrays@^1.0.5:
47754775
resolved "https://registry.yarnpkg.com/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz#92f95616501069d07d10edb2fc37d3e1c65123b7"
47764776
integrity sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==
47774777

4778+
available-typed-arrays@^1.0.7:
4779+
version "1.0.7"
4780+
resolved "https://registry.yarnpkg.com/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz#a5cc375d6a03c2efc87a553f3e0b1522def14846"
4781+
integrity sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==
4782+
dependencies:
4783+
possible-typed-array-names "^1.0.0"
4784+
47784785
axe-core@^4.6.2:
47794786
version "4.8.1"
47804787
resolved "https://registry.yarnpkg.com/axe-core/-/axe-core-4.8.1.tgz#6948854183ee7e7eae336b9877c5bafa027998ea"

0 commit comments

Comments
 (0)