@pagopa/io-react-native-wallet 0.7.4 → 0.9.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.
- package/README.md +49 -31
- package/lib/commonjs/credential/index.js +13 -0
- package/lib/commonjs/credential/index.js.map +1 -0
- package/lib/commonjs/credential/issuance/01-start-flow.js +2 -0
- package/lib/commonjs/credential/issuance/01-start-flow.js.map +1 -0
- package/lib/commonjs/credential/issuance/02-evaluate-issuer-trust.js +26 -0
- package/lib/commonjs/credential/issuance/02-evaluate-issuer-trust.js.map +1 -0
- package/lib/commonjs/credential/issuance/03-start-user-authorization.js +119 -0
- package/lib/commonjs/credential/issuance/03-start-user-authorization.js.map +1 -0
- package/lib/commonjs/credential/issuance/04-complete-user-authorization.js +6 -0
- package/lib/commonjs/credential/issuance/04-complete-user-authorization.js.map +1 -0
- package/lib/commonjs/credential/issuance/05-authorize-access.js +63 -0
- package/lib/commonjs/credential/issuance/05-authorize-access.js.map +1 -0
- package/lib/commonjs/credential/issuance/06-obtain-credential.js +128 -0
- package/lib/commonjs/credential/issuance/06-obtain-credential.js.map +1 -0
- package/lib/commonjs/credential/issuance/07-confirm-credential.js +6 -0
- package/lib/commonjs/credential/issuance/07-confirm-credential.js.map +1 -0
- package/lib/commonjs/credential/issuance/const.js +9 -0
- package/lib/commonjs/credential/issuance/const.js.map +1 -0
- package/lib/commonjs/credential/issuance/index.js +34 -0
- package/lib/commonjs/credential/issuance/index.js.map +1 -0
- package/lib/commonjs/credential/presentation/01-start-flow.js +55 -0
- package/lib/commonjs/credential/presentation/01-start-flow.js.map +1 -0
- package/lib/commonjs/credential/presentation/02-evaluate-rp-trust.js +32 -0
- package/lib/commonjs/credential/presentation/02-evaluate-rp-trust.js.map +1 -0
- package/lib/commonjs/credential/presentation/03-get-request-object.js +68 -0
- package/lib/commonjs/credential/presentation/03-get-request-object.js.map +1 -0
- package/lib/commonjs/credential/presentation/04-send-authorization-response.js +139 -0
- package/lib/commonjs/credential/presentation/04-send-authorization-response.js.map +1 -0
- package/lib/commonjs/credential/presentation/index.js +34 -0
- package/lib/commonjs/credential/presentation/index.js.map +1 -0
- package/lib/commonjs/{rp → credential/presentation}/types.js +17 -34
- package/lib/commonjs/credential/presentation/types.js.map +1 -0
- package/lib/commonjs/index.js +10 -61
- package/lib/commonjs/index.js.map +1 -1
- package/lib/commonjs/pid/index.js +1 -3
- package/lib/commonjs/pid/index.js.map +1 -1
- package/lib/commonjs/sd-jwt/index.js +1 -1
- package/lib/commonjs/sd-jwt/index.js.map +1 -1
- package/lib/commonjs/sd-jwt/types.js +1 -1
- package/lib/commonjs/sd-jwt/types.js.map +1 -1
- package/lib/commonjs/trust/chain.js +32 -4
- package/lib/commonjs/trust/chain.js.map +1 -1
- package/lib/commonjs/trust/index.js +105 -20
- package/lib/commonjs/trust/index.js.map +1 -1
- package/lib/commonjs/trust/types.js +54 -35
- package/lib/commonjs/trust/types.js.map +1 -1
- package/lib/commonjs/utils/crypto.js +5 -18
- package/lib/commonjs/utils/crypto.js.map +1 -1
- package/lib/commonjs/utils/misc.js +23 -0
- package/lib/commonjs/utils/misc.js.map +1 -0
- package/lib/commonjs/utils/par.js +86 -0
- package/lib/commonjs/utils/par.js.map +1 -0
- package/lib/module/credential/index.js +4 -0
- package/lib/module/credential/index.js.map +1 -0
- package/lib/module/credential/issuance/01-start-flow.js +2 -0
- package/lib/module/credential/issuance/01-start-flow.js.map +1 -0
- package/lib/module/credential/issuance/02-evaluate-issuer-trust.js +19 -0
- package/lib/module/credential/issuance/02-evaluate-issuer-trust.js.map +1 -0
- package/lib/module/credential/issuance/03-start-user-authorization.js +109 -0
- package/lib/module/credential/issuance/03-start-user-authorization.js.map +1 -0
- package/lib/module/credential/issuance/04-complete-user-authorization.js +2 -0
- package/lib/module/credential/issuance/04-complete-user-authorization.js.map +1 -0
- package/lib/module/credential/issuance/05-authorize-access.js +55 -0
- package/lib/module/credential/issuance/05-authorize-access.js.map +1 -0
- package/lib/module/credential/issuance/06-obtain-credential.js +117 -0
- package/lib/module/credential/issuance/06-obtain-credential.js.map +1 -0
- package/lib/module/credential/issuance/07-confirm-credential.js +2 -0
- package/lib/module/credential/issuance/07-confirm-credential.js.map +1 -0
- package/lib/module/credential/issuance/const.js +2 -0
- package/lib/module/credential/issuance/const.js.map +1 -0
- package/lib/module/credential/issuance/index.js +6 -0
- package/lib/module/credential/issuance/index.js.map +1 -0
- package/lib/module/credential/presentation/01-start-flow.js +46 -0
- package/lib/module/credential/presentation/01-start-flow.js.map +1 -0
- package/lib/module/credential/presentation/02-evaluate-rp-trust.js +25 -0
- package/lib/module/credential/presentation/02-evaluate-rp-trust.js.map +1 -0
- package/lib/module/credential/presentation/03-get-request-object.js +60 -0
- package/lib/module/credential/presentation/03-get-request-object.js.map +1 -0
- package/lib/module/credential/presentation/04-send-authorization-response.js +128 -0
- package/lib/module/credential/presentation/04-send-authorization-response.js.map +1 -0
- package/lib/module/credential/presentation/index.js +6 -0
- package/lib/module/credential/presentation/index.js.map +1 -0
- package/lib/module/credential/presentation/types.js +21 -0
- package/lib/module/credential/presentation/types.js.map +1 -0
- package/lib/module/index.js +4 -5
- package/lib/module/index.js.map +1 -1
- package/lib/module/pid/index.js +1 -2
- package/lib/module/pid/index.js.map +1 -1
- package/lib/module/sd-jwt/index.js +1 -1
- package/lib/module/sd-jwt/index.js.map +1 -1
- package/lib/module/sd-jwt/types.js +1 -1
- package/lib/module/sd-jwt/types.js.map +1 -1
- package/lib/module/trust/chain.js +30 -3
- package/lib/module/trust/chain.js.map +1 -1
- package/lib/module/trust/index.js +99 -16
- package/lib/module/trust/index.js.map +1 -1
- package/lib/module/trust/types.js +50 -31
- package/lib/module/trust/types.js.map +1 -1
- package/lib/module/utils/crypto.js +2 -15
- package/lib/module/utils/crypto.js.map +1 -1
- package/lib/module/utils/misc.js +17 -0
- package/lib/module/utils/misc.js.map +1 -0
- package/lib/module/utils/par.js +74 -0
- package/lib/module/utils/par.js.map +1 -0
- package/lib/typescript/credential/index.d.ts +4 -0
- package/lib/typescript/credential/index.d.ts.map +1 -0
- package/lib/typescript/credential/issuance/01-start-flow.d.ts +11 -0
- package/lib/typescript/credential/issuance/01-start-flow.d.ts.map +1 -0
- package/lib/typescript/credential/issuance/02-evaluate-issuer-trust.d.ts +18 -0
- package/lib/typescript/credential/issuance/02-evaluate-issuer-trust.d.ts.map +1 -0
- package/lib/typescript/credential/issuance/03-start-user-authorization.d.ts +31 -0
- package/lib/typescript/credential/issuance/03-start-user-authorization.d.ts.map +1 -0
- package/lib/typescript/credential/issuance/04-complete-user-authorization.d.ts +16 -0
- package/lib/typescript/credential/issuance/04-complete-user-authorization.d.ts.map +1 -0
- package/lib/typescript/credential/issuance/05-authorize-access.d.ts +26 -0
- package/lib/typescript/credential/issuance/05-authorize-access.d.ts.map +1 -0
- package/lib/typescript/credential/issuance/06-obtain-credential.d.ts +32 -0
- package/lib/typescript/credential/issuance/06-obtain-credential.d.ts.map +1 -0
- package/lib/typescript/credential/issuance/07-confirm-credential.d.ts +11 -0
- package/lib/typescript/credential/issuance/07-confirm-credential.d.ts.map +1 -0
- package/lib/typescript/credential/issuance/const.d.ts +2 -0
- package/lib/typescript/credential/issuance/const.d.ts.map +1 -0
- package/lib/typescript/credential/issuance/index.d.ts +10 -0
- package/lib/typescript/credential/issuance/index.d.ts.map +1 -0
- package/lib/typescript/credential/presentation/01-start-flow.d.ts +20 -0
- package/lib/typescript/credential/presentation/01-start-flow.d.ts.map +1 -0
- package/lib/typescript/credential/presentation/02-evaluate-rp-trust.d.ts +18 -0
- package/lib/typescript/credential/presentation/02-evaluate-rp-trust.d.ts.map +1 -0
- package/lib/typescript/credential/presentation/03-get-request-object.d.ts +25 -0
- package/lib/typescript/credential/presentation/03-get-request-object.d.ts.map +1 -0
- package/lib/typescript/credential/presentation/04-send-authorization-response.d.ts +34 -0
- package/lib/typescript/credential/presentation/04-send-authorization-response.d.ts.map +1 -0
- package/lib/typescript/credential/presentation/index.d.ts +7 -0
- package/lib/typescript/credential/presentation/index.d.ts.map +1 -0
- package/lib/typescript/credential/presentation/types.d.ts +49 -0
- package/lib/typescript/credential/presentation/types.d.ts.map +1 -0
- package/lib/typescript/index.d.ts +4 -5
- package/lib/typescript/index.d.ts.map +1 -1
- package/lib/typescript/pid/index.d.ts +1 -2
- package/lib/typescript/pid/index.d.ts.map +1 -1
- package/lib/typescript/sd-jwt/index.d.ts +2 -2
- package/lib/typescript/sd-jwt/index.d.ts.map +1 -1
- package/lib/typescript/sd-jwt/types.d.ts +5 -5
- package/lib/typescript/trust/chain.d.ts +12 -3
- package/lib/typescript/trust/chain.d.ts.map +1 -1
- package/lib/typescript/trust/index.d.ts +198 -24
- package/lib/typescript/trust/index.d.ts.map +1 -1
- package/lib/typescript/trust/types.d.ts +1299 -623
- package/lib/typescript/trust/types.d.ts.map +1 -1
- package/lib/typescript/utils/crypto.d.ts +1 -1
- package/lib/typescript/utils/crypto.d.ts.map +1 -1
- package/lib/typescript/utils/dpop.d.ts +2 -2
- package/lib/typescript/utils/misc.d.ts +8 -0
- package/lib/typescript/utils/misc.d.ts.map +1 -0
- package/lib/typescript/utils/par.d.ts +68 -0
- package/lib/typescript/utils/par.d.ts.map +1 -0
- package/package.json +2 -2
- package/src/credential/index.ts +4 -0
- package/src/credential/issuance/01-start-flow.ts +10 -0
- package/src/credential/issuance/02-evaluate-issuer-trust.ts +31 -0
- package/src/credential/issuance/03-start-user-authorization.ts +138 -0
- package/src/credential/issuance/04-complete-user-authorization.ts +17 -0
- package/src/credential/issuance/05-authorize-access.ts +92 -0
- package/src/credential/issuance/06-obtain-credential.ts +179 -0
- package/src/credential/issuance/07-confirm-credential.ts +14 -0
- package/src/credential/issuance/const.ts +2 -0
- package/src/credential/issuance/index.ts +32 -0
- package/src/credential/presentation/01-start-flow.ts +51 -0
- package/src/credential/presentation/02-evaluate-rp-trust.ts +33 -0
- package/src/credential/presentation/03-get-request-object.ts +85 -0
- package/src/credential/presentation/04-send-authorization-response.ts +168 -0
- package/src/credential/presentation/index.ts +26 -0
- package/src/credential/presentation/types.ts +27 -0
- package/src/index.ts +7 -28
- package/src/pid/index.ts +1 -2
- package/src/sd-jwt/index.ts +2 -2
- package/src/sd-jwt/types.ts +1 -1
- package/src/trust/chain.ts +45 -3
- package/src/trust/index.ts +136 -19
- package/src/trust/types.ts +57 -35
- package/src/utils/crypto.ts +2 -20
- package/src/utils/misc.ts +23 -0
- package/src/utils/par.ts +103 -0
- package/lib/commonjs/pid/issuing.js +0 -276
- package/lib/commonjs/pid/issuing.js.map +0 -1
- package/lib/commonjs/rp/__test__/index.test.js +0 -172
- package/lib/commonjs/rp/__test__/index.test.js.map +0 -1
- package/lib/commonjs/rp/index.js +0 -239
- package/lib/commonjs/rp/index.js.map +0 -1
- package/lib/commonjs/rp/types.js.map +0 -1
- package/lib/module/pid/issuing.js +0 -266
- package/lib/module/pid/issuing.js.map +0 -1
- package/lib/module/rp/__test__/index.test.js +0 -168
- package/lib/module/rp/__test__/index.test.js.map +0 -1
- package/lib/module/rp/index.js +0 -228
- package/lib/module/rp/index.js.map +0 -1
- package/lib/module/rp/types.js +0 -36
- package/lib/module/rp/types.js.map +0 -1
- package/lib/typescript/pid/issuing.d.ts +0 -57
- package/lib/typescript/pid/issuing.d.ts.map +0 -1
- package/lib/typescript/rp/__test__/index.test.d.ts +0 -2
- package/lib/typescript/rp/__test__/index.test.d.ts.map +0 -1
- package/lib/typescript/rp/index.d.ts +0 -43
- package/lib/typescript/rp/index.d.ts.map +0 -1
- package/lib/typescript/rp/types.d.ts +0 -122
- package/lib/typescript/rp/types.d.ts.map +0 -1
- package/src/pid/issuing.ts +0 -405
- package/src/rp/__test__/index.test.ts +0 -250
- package/src/rp/index.ts +0 -287
- package/src/rp/types.ts +0 -42
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.makeParRequest = exports.AuthorizationDetails = exports.AuthorizationDetail = void 0;
|
|
7
|
+
var _ioReactNativeJwt = require("@pagopa/io-react-native-jwt");
|
|
8
|
+
var _reactNativeUuid = _interopRequireDefault(require("react-native-uuid"));
|
|
9
|
+
var z = _interopRequireWildcard(require("zod"));
|
|
10
|
+
var WalletInstanceAttestation = _interopRequireWildcard(require("../wallet-instance-attestation"));
|
|
11
|
+
var _misc = require("./misc");
|
|
12
|
+
function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function (nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
|
|
13
|
+
function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
|
|
14
|
+
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
15
|
+
const AuthorizationDetail = z.object({
|
|
16
|
+
credential_definition: z.object({
|
|
17
|
+
type: z.string()
|
|
18
|
+
}),
|
|
19
|
+
format: z.literal("vc+sd-jwt"),
|
|
20
|
+
type: z.literal("openid_credential")
|
|
21
|
+
});
|
|
22
|
+
exports.AuthorizationDetail = AuthorizationDetail;
|
|
23
|
+
const AuthorizationDetails = z.array(AuthorizationDetail);
|
|
24
|
+
|
|
25
|
+
/**
|
|
26
|
+
* Make a PAR request to the issuer and return the response url
|
|
27
|
+
*/
|
|
28
|
+
exports.AuthorizationDetails = AuthorizationDetails;
|
|
29
|
+
const makeParRequest = _ref => {
|
|
30
|
+
let {
|
|
31
|
+
wiaCryptoContext,
|
|
32
|
+
appFetch = fetch
|
|
33
|
+
} = _ref;
|
|
34
|
+
return async (clientId, codeVerifier, walletProviderBaseUrl, parEndpoint, walletInstanceAttestation, authorizationDetails, assertionType) => {
|
|
35
|
+
const wiaPublicKey = await wiaCryptoContext.getPublicKey();
|
|
36
|
+
const parUrl = new URL(parEndpoint);
|
|
37
|
+
const aud = `${parUrl.protocol}//${parUrl.hostname}`;
|
|
38
|
+
const iss = WalletInstanceAttestation.decode(walletInstanceAttestation).payload.cnf.jwk.kid;
|
|
39
|
+
|
|
40
|
+
/** A code challenge is provided so that the PAR is bound
|
|
41
|
+
to the subsequent authorization code request
|
|
42
|
+
@see https://datatracker.ietf.org/doc/html/rfc9126#name-request */
|
|
43
|
+
const codeChallengeMethod = "s256";
|
|
44
|
+
const codeChallenge = await (0, _ioReactNativeJwt.sha256ToBase64)(codeVerifier);
|
|
45
|
+
|
|
46
|
+
/** The PAR request token is signed used the Wallet Instance Attestation key.
|
|
47
|
+
The signature can be verified by reading the public key from the key set shippet
|
|
48
|
+
with the it will ship the Wallet Instance Attestation.
|
|
49
|
+
The key is matched by its kid */
|
|
50
|
+
const signedJwtForPar = await new _ioReactNativeJwt.SignJWT(wiaCryptoContext).setProtectedHeader({
|
|
51
|
+
kid: wiaPublicKey.kid
|
|
52
|
+
}).setPayload({
|
|
53
|
+
iss,
|
|
54
|
+
aud,
|
|
55
|
+
jti: `${_reactNativeUuid.default.v4()}`,
|
|
56
|
+
client_assertion_type: assertionType,
|
|
57
|
+
authorization_details: authorizationDetails,
|
|
58
|
+
response_type: "code",
|
|
59
|
+
redirect_uri: walletProviderBaseUrl,
|
|
60
|
+
state: `${_reactNativeUuid.default.v4()}`,
|
|
61
|
+
client_id: clientId,
|
|
62
|
+
code_challenge_method: codeChallengeMethod,
|
|
63
|
+
code_challenge: codeChallenge
|
|
64
|
+
}).setIssuedAt().setExpirationTime("1h").sign();
|
|
65
|
+
|
|
66
|
+
/** The request body for the Pushed Authorization Request */
|
|
67
|
+
var formBody = new URLSearchParams({
|
|
68
|
+
response_type: "code",
|
|
69
|
+
client_id: clientId,
|
|
70
|
+
code_challenge: codeChallenge,
|
|
71
|
+
code_challenge_method: "S256",
|
|
72
|
+
client_assertion_type: assertionType,
|
|
73
|
+
client_assertion: walletInstanceAttestation,
|
|
74
|
+
request: signedJwtForPar
|
|
75
|
+
});
|
|
76
|
+
return await appFetch(parEndpoint, {
|
|
77
|
+
method: "POST",
|
|
78
|
+
headers: {
|
|
79
|
+
"Content-Type": "application/x-www-form-urlencoded"
|
|
80
|
+
},
|
|
81
|
+
body: formBody.toString()
|
|
82
|
+
}).then((0, _misc.hasStatus)(201)).then(res => res.json()).then(result => result.request_uri);
|
|
83
|
+
};
|
|
84
|
+
};
|
|
85
|
+
exports.makeParRequest = makeParRequest;
|
|
86
|
+
//# sourceMappingURL=par.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["_ioReactNativeJwt","require","_reactNativeUuid","_interopRequireDefault","z","_interopRequireWildcard","WalletInstanceAttestation","_misc","_getRequireWildcardCache","nodeInterop","WeakMap","cacheBabelInterop","cacheNodeInterop","obj","__esModule","default","cache","has","get","newObj","hasPropertyDescriptor","Object","defineProperty","getOwnPropertyDescriptor","key","prototype","hasOwnProperty","call","desc","set","AuthorizationDetail","object","credential_definition","type","string","format","literal","exports","AuthorizationDetails","array","makeParRequest","_ref","wiaCryptoContext","appFetch","fetch","clientId","codeVerifier","walletProviderBaseUrl","parEndpoint","walletInstanceAttestation","authorizationDetails","assertionType","wiaPublicKey","getPublicKey","parUrl","URL","aud","protocol","hostname","iss","decode","payload","cnf","jwk","kid","codeChallengeMethod","codeChallenge","sha256ToBase64","signedJwtForPar","SignJWT","setProtectedHeader","setPayload","jti","uuid","v4","client_assertion_type","authorization_details","response_type","redirect_uri","state","client_id","code_challenge_method","code_challenge","setIssuedAt","setExpirationTime","sign","formBody","URLSearchParams","client_assertion","request","method","headers","body","toString","then","hasStatus","res","json","result","request_uri"],"sourceRoot":"../../../src","sources":["utils/par.ts"],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["Issuance","Presentation"],"sourceRoot":"../../../src","sources":["credential/index.ts"],"mappings":"AAAA,OAAO,KAAKA,QAAQ,MAAM,YAAY;AACtC,OAAO,KAAKC,YAAY,MAAM,gBAAgB;AAE9C,SAASD,QAAQ,EAAEC,YAAY"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":[],"sourceRoot":"../../../../src","sources":["credential/issuance/01-start-flow.ts"],"mappings":""}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { getCredentialIssuerEntityConfiguration } from "../../trust";
|
|
2
|
+
/**
|
|
3
|
+
* The Issuer trust evaluation phase.
|
|
4
|
+
* Fetch the Issuer's configuration and verify trust.
|
|
5
|
+
*
|
|
6
|
+
* @param issuerUrl The base url of the Issuer
|
|
7
|
+
* @param context.appFetch (optional) fetch api implementation. Default: built-in fetch
|
|
8
|
+
* @returns The Issuer's configuration
|
|
9
|
+
*/
|
|
10
|
+
export const evaluateIssuerTrust = async function (issuerUrl) {
|
|
11
|
+
let context = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
|
|
12
|
+
const issuerConf = await getCredentialIssuerEntityConfiguration(issuerUrl, {
|
|
13
|
+
appFetch: context.appFetch
|
|
14
|
+
}).then(_ => _.payload.metadata);
|
|
15
|
+
return {
|
|
16
|
+
issuerConf
|
|
17
|
+
};
|
|
18
|
+
};
|
|
19
|
+
//# sourceMappingURL=02-evaluate-issuer-trust.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["getCredentialIssuerEntityConfiguration","evaluateIssuerTrust","issuerUrl","context","arguments","length","undefined","issuerConf","appFetch","then","_","payload","metadata"],"sourceRoot":"../../../../src","sources":["credential/issuance/02-evaluate-issuer-trust.ts"],"mappings":"AAAA,SAASA,sCAAsC,QAAQ,aAAa;AAcpE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,MAAMC,mBAAwC,GAAG,eAAAA,CACtDC,SAAS,EAEN;EAAA,IADHC,OAAO,GAAAC,SAAA,CAAAC,MAAA,QAAAD,SAAA,QAAAE,SAAA,GAAAF,SAAA,MAAG,CAAC,CAAC;EAEZ,MAAMG,UAAU,GAAG,MAAMP,sCAAsC,CAACE,SAAS,EAAE;IACzEM,QAAQ,EAAEL,OAAO,CAACK;EACpB,CAAC,CAAC,CAACC,IAAI,CAAEC,CAAC,IAAKA,CAAC,CAACC,OAAO,CAACC,QAAQ,CAAC;EAClC,OAAO;IAAEL;EAAW,CAAC;AACvB,CAAC"}
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
import * as z from "zod";
|
|
2
|
+
import uuid from "react-native-uuid";
|
|
3
|
+
import { makeParRequest } from "../../utils/par";
|
|
4
|
+
import { getJwtFromFormPost } from "../../utils/decoder";
|
|
5
|
+
import { hasStatus } from "../../utils/misc";
|
|
6
|
+
import { ASSERTION_TYPE } from "./const";
|
|
7
|
+
const selectCredentialDefinition = (issuerConf, credentialType) => {
|
|
8
|
+
const {
|
|
9
|
+
credentials_supported
|
|
10
|
+
} = issuerConf.openid_credential_issuer;
|
|
11
|
+
const [result] = credentials_supported.filter(e => e.credential_definition.type.includes(credentialType)).map(e => ({
|
|
12
|
+
credential_definition: {
|
|
13
|
+
type: credentialType
|
|
14
|
+
},
|
|
15
|
+
format: e.format,
|
|
16
|
+
type: "openid_credential"
|
|
17
|
+
}));
|
|
18
|
+
if (!result) {
|
|
19
|
+
throw new Error(`No credential support the type '${credentialType}'`);
|
|
20
|
+
}
|
|
21
|
+
return result;
|
|
22
|
+
};
|
|
23
|
+
const decodeAuthorizationResponse = async raw => {
|
|
24
|
+
const {
|
|
25
|
+
decodedJwt: {
|
|
26
|
+
payload
|
|
27
|
+
}
|
|
28
|
+
} = await getJwtFromFormPost(raw);
|
|
29
|
+
|
|
30
|
+
/**
|
|
31
|
+
* FIXME: [SIW-628] This step must not make any difference on the credential
|
|
32
|
+
* we are authorizing for, being a PID or any other (Q)EAA.
|
|
33
|
+
*
|
|
34
|
+
* Currently, PID issuer is implemented to skip the CompleteUserAuthorization step
|
|
35
|
+
* thus returning a stubbed (code, state) pair.
|
|
36
|
+
*
|
|
37
|
+
* This is a workaround to proceeed the flow anyway.
|
|
38
|
+
* If the response does not map what expected (CorrectShape),
|
|
39
|
+
* we try parse into (code, state) to check if we are in the PID scenario.
|
|
40
|
+
* In that case, a stub value is returned (will not be evaluated anyway).
|
|
41
|
+
*
|
|
42
|
+
* This workaround will be obsolete once the PID issuer fixes its implementation
|
|
43
|
+
*/
|
|
44
|
+
const CorrectShape = z.object({
|
|
45
|
+
request_uri: z.string()
|
|
46
|
+
});
|
|
47
|
+
const WrongShapeForPID = z.object({
|
|
48
|
+
code: z.string(),
|
|
49
|
+
state: z.string()
|
|
50
|
+
});
|
|
51
|
+
const [correct, wrong] = [CorrectShape.safeParse(payload), WrongShapeForPID.safeParse(payload)];
|
|
52
|
+
if (correct.success) {
|
|
53
|
+
return correct.data;
|
|
54
|
+
} else if (wrong.success) {
|
|
55
|
+
return {
|
|
56
|
+
request_uri: "https://fake-request-uri"
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
throw correct.error;
|
|
60
|
+
};
|
|
61
|
+
/**
|
|
62
|
+
* Start the User authorization phase.
|
|
63
|
+
* Perform the Pushed Authorization Request as defined in OAuth 2.0 protocol.
|
|
64
|
+
*
|
|
65
|
+
* @param issuerConf The Issuer configuration
|
|
66
|
+
* @param credentialType The type of the credential to be requested
|
|
67
|
+
* @param context.wiaCryptoContext The context to access the key associated with the Wallet Instance Attestation
|
|
68
|
+
* @param context.walletInstanceAttestation The Wallet Instance Attestation token
|
|
69
|
+
* @param context.walletProviderBaseUrl The base url of the Wallet Provider
|
|
70
|
+
* @param context.additionalParams Hash set of parameters to be passed to the authorization endpoint
|
|
71
|
+
* (used as a temporary fix until we have a proper User identity in the PID token provider)
|
|
72
|
+
* TODO: [SIW-630]
|
|
73
|
+
* @param context.appFetch (optional) fetch api implementation. Default: built-in fetch
|
|
74
|
+
* @returns The request uri to continue the authorization to
|
|
75
|
+
*/
|
|
76
|
+
export const startUserAuthorization = async (issuerConf, credentialType, ctx) => {
|
|
77
|
+
const {
|
|
78
|
+
wiaCryptoContext,
|
|
79
|
+
walletInstanceAttestation,
|
|
80
|
+
walletProviderBaseUrl,
|
|
81
|
+
additionalParams = {},
|
|
82
|
+
appFetch = fetch
|
|
83
|
+
} = ctx;
|
|
84
|
+
const clientId = await wiaCryptoContext.getPublicKey().then(_ => _.kid);
|
|
85
|
+
const codeVerifier = `${uuid.v4()}`;
|
|
86
|
+
// Make a PAR request to the credential issuer and return the response url
|
|
87
|
+
const parUrl = issuerConf.openid_credential_issuer.pushed_authorization_request_endpoint;
|
|
88
|
+
const getPar = makeParRequest({
|
|
89
|
+
wiaCryptoContext,
|
|
90
|
+
appFetch
|
|
91
|
+
});
|
|
92
|
+
const issuerRequestUri = await getPar(clientId, codeVerifier, walletProviderBaseUrl, parUrl, walletInstanceAttestation, [selectCredentialDefinition(issuerConf, credentialType)], ASSERTION_TYPE);
|
|
93
|
+
|
|
94
|
+
// Initialize authorization by requesting the authz request uri
|
|
95
|
+
const authzRequestEndpoint = issuerConf.openid_credential_issuer.authorization_endpoint;
|
|
96
|
+
const params = new URLSearchParams({
|
|
97
|
+
client_id: clientId,
|
|
98
|
+
request_uri: issuerRequestUri,
|
|
99
|
+
...additionalParams
|
|
100
|
+
});
|
|
101
|
+
const {
|
|
102
|
+
request_uri
|
|
103
|
+
} = await appFetch(`${authzRequestEndpoint}?${params}`).then(hasStatus(200)).then(res => res.text()).then(decodeAuthorizationResponse);
|
|
104
|
+
return {
|
|
105
|
+
requestUri: request_uri,
|
|
106
|
+
clientId
|
|
107
|
+
};
|
|
108
|
+
};
|
|
109
|
+
//# sourceMappingURL=03-start-user-authorization.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["z","uuid","makeParRequest","getJwtFromFormPost","hasStatus","ASSERTION_TYPE","selectCredentialDefinition","issuerConf","credentialType","credentials_supported","openid_credential_issuer","result","filter","e","credential_definition","type","includes","map","format","Error","decodeAuthorizationResponse","raw","decodedJwt","payload","CorrectShape","object","request_uri","string","WrongShapeForPID","code","state","correct","wrong","safeParse","success","data","error","startUserAuthorization","ctx","wiaCryptoContext","walletInstanceAttestation","walletProviderBaseUrl","additionalParams","appFetch","fetch","clientId","getPublicKey","then","_","kid","codeVerifier","v4","parUrl","pushed_authorization_request_endpoint","getPar","issuerRequestUri","authzRequestEndpoint","authorization_endpoint","params","URLSearchParams","client_id","res","text","requestUri"],"sourceRoot":"../../../../src","sources":["credential/issuance/03-start-user-authorization.ts"],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":[],"sourceRoot":"../../../../src","sources":["credential/issuance/04-complete-user-authorization.ts"],"mappings":""}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import uuid from "react-native-uuid";
|
|
2
|
+
import { withEphemeralKey } from "../../utils/crypto";
|
|
3
|
+
import { createDPopToken } from "../../utils/dpop";
|
|
4
|
+
import { hasStatus } from "../../utils/misc";
|
|
5
|
+
import { ASSERTION_TYPE } from "./const";
|
|
6
|
+
/**
|
|
7
|
+
* Obtain the access token to finally request the credential
|
|
8
|
+
*
|
|
9
|
+
* @param issuerConf The Issuer configuration
|
|
10
|
+
* @param code The access code from the User authorization phase
|
|
11
|
+
* @param clientId Identifies the current client across all the requests of the issuing flow
|
|
12
|
+
* @param context.walletInstanceAttestation The Wallet Instance Attestation token
|
|
13
|
+
* @param context.walletProviderBaseUrl The base url of the Wallet Provider
|
|
14
|
+
* @param context.appFetch (optional) fetch api implementation. Default: built-in fetch
|
|
15
|
+
* @returns
|
|
16
|
+
*/
|
|
17
|
+
export const authorizeAccess = async (issuerConf, code, clientId, context) => {
|
|
18
|
+
const {
|
|
19
|
+
appFetch = fetch,
|
|
20
|
+
walletInstanceAttestation,
|
|
21
|
+
walletProviderBaseUrl
|
|
22
|
+
} = context;
|
|
23
|
+
const tokenUrl = issuerConf.openid_credential_issuer.token_endpoint;
|
|
24
|
+
|
|
25
|
+
// Use an ephemeral key to be destroyed after use
|
|
26
|
+
const signedDPop = await withEphemeralKey(ephemeralContext => createDPopToken({
|
|
27
|
+
htm: "POST",
|
|
28
|
+
htu: tokenUrl,
|
|
29
|
+
jti: `${uuid.v4()}`
|
|
30
|
+
}, ephemeralContext));
|
|
31
|
+
const codeVerifier = `${uuid.v4()}`;
|
|
32
|
+
const requestBody = {
|
|
33
|
+
grant_type: "authorization code",
|
|
34
|
+
client_id: clientId,
|
|
35
|
+
code,
|
|
36
|
+
code_verifier: codeVerifier,
|
|
37
|
+
client_assertion_type: ASSERTION_TYPE,
|
|
38
|
+
client_assertion: walletInstanceAttestation,
|
|
39
|
+
redirect_uri: walletProviderBaseUrl
|
|
40
|
+
};
|
|
41
|
+
var formBody = new URLSearchParams(requestBody);
|
|
42
|
+
return appFetch(tokenUrl, {
|
|
43
|
+
method: "POST",
|
|
44
|
+
headers: {
|
|
45
|
+
"Content-Type": "application/x-www-form-urlencoded",
|
|
46
|
+
DPoP: signedDPop
|
|
47
|
+
},
|
|
48
|
+
body: formBody.toString()
|
|
49
|
+
}).then(hasStatus(200)).then(res => res.json()).then(body => ({
|
|
50
|
+
accessToken: body.access_token,
|
|
51
|
+
nonce: body.c_nonce,
|
|
52
|
+
clientId
|
|
53
|
+
}));
|
|
54
|
+
};
|
|
55
|
+
//# sourceMappingURL=05-authorize-access.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["uuid","withEphemeralKey","createDPopToken","hasStatus","ASSERTION_TYPE","authorizeAccess","issuerConf","code","clientId","context","appFetch","fetch","walletInstanceAttestation","walletProviderBaseUrl","tokenUrl","openid_credential_issuer","token_endpoint","signedDPop","ephemeralContext","htm","htu","jti","v4","codeVerifier","requestBody","grant_type","client_id","code_verifier","client_assertion_type","client_assertion","redirect_uri","formBody","URLSearchParams","method","headers","DPoP","body","toString","then","res","json","accessToken","access_token","nonce","c_nonce"],"sourceRoot":"../../../../src","sources":["credential/issuance/05-authorize-access.ts"],"mappings":"AAAA,OAAOA,IAAI,MAAM,mBAAmB;AACpC,SAASC,gBAAgB,QAAQ,oBAAoB;AACrD,SAASC,eAAe,QAAQ,kBAAkB;AAElD,SAASC,SAAS,QAAkB,kBAAkB;AAEtD,SAASC,cAAc,QAAQ,SAAS;AAqBxC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,MAAMC,eAAgC,GAAG,MAAAA,CAC9CC,UAAU,EACVC,IAAI,EACJC,QAAQ,EACRC,OAAO,KAC+D;EACtE,MAAM;IACJC,QAAQ,GAAGC,KAAK;IAChBC,yBAAyB;IACzBC;EACF,CAAC,GAAGJ,OAAO;EAEX,MAAMK,QAAQ,GAAGR,UAAU,CAACS,wBAAwB,CAACC,cAAc;;EAEnE;EACA,MAAMC,UAAU,GAAG,MAAMhB,gBAAgB,CAAEiB,gBAAgB,IACzDhB,eAAe,CACb;IACEiB,GAAG,EAAE,MAAM;IACXC,GAAG,EAAEN,QAAQ;IACbO,GAAG,EAAG,GAAErB,IAAI,CAACsB,EAAE,CAAC,CAAE;EACpB,CAAC,EACDJ,gBACF,CACF,CAAC;EAED,MAAMK,YAAY,GAAI,GAAEvB,IAAI,CAACsB,EAAE,CAAC,CAAE,EAAC;EACnC,MAAME,WAAW,GAAG;IAClBC,UAAU,EAAE,oBAAoB;IAChCC,SAAS,EAAElB,QAAQ;IACnBD,IAAI;IACJoB,aAAa,EAAEJ,YAAY;IAC3BK,qBAAqB,EAAExB,cAAc;IACrCyB,gBAAgB,EAAEjB,yBAAyB;IAC3CkB,YAAY,EAAEjB;EAChB,CAAC;EACD,IAAIkB,QAAQ,GAAG,IAAIC,eAAe,CAACR,WAAW,CAAC;EAE/C,OAAOd,QAAQ,CAACI,QAAQ,EAAE;IACxBmB,MAAM,EAAE,MAAM;IACdC,OAAO,EAAE;MACP,cAAc,EAAE,mCAAmC;MACnDC,IAAI,EAAElB;IACR,CAAC;IACDmB,IAAI,EAAEL,QAAQ,CAACM,QAAQ,CAAC;EAC1B,CAAC,CAAC,CACCC,IAAI,CAACnC,SAAS,CAAC,GAAG,CAAC,CAAC,CACpBmC,IAAI,CAAEC,GAAG,IAAKA,GAAG,CAACC,IAAI,CAAC,CAAC,CAAC,CACzBF,IAAI,CAAEF,IAAI,KAAM;IACfK,WAAW,EAAEL,IAAI,CAACM,YAAY;IAC9BC,KAAK,EAAEP,IAAI,CAACQ,OAAO;IACnBpC;EACF,CAAC,CAAC,CAAC;AACP,CAAC"}
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
import * as z from "zod";
|
|
2
|
+
import uuid from "react-native-uuid";
|
|
3
|
+
import { SignJWT } from "@pagopa/io-react-native-jwt";
|
|
4
|
+
import { verify as verifySdJwt } from "../../sd-jwt";
|
|
5
|
+
import { createDPopToken } from "../../utils/dpop";
|
|
6
|
+
import { hasStatus } from "../../utils/misc";
|
|
7
|
+
import { SdJwt4VC } from "../../sd-jwt/types";
|
|
8
|
+
import { IoWalletError } from "../../utils/errors";
|
|
9
|
+
/**
|
|
10
|
+
* Return the signed jwt for nonce proof of possession
|
|
11
|
+
*/
|
|
12
|
+
export const createNonceProof = async (nonce, issuer, audience, ctx) => {
|
|
13
|
+
return new SignJWT(ctx).setPayload({
|
|
14
|
+
nonce,
|
|
15
|
+
jwk: await ctx.getPublicKey()
|
|
16
|
+
}).setProtectedHeader({
|
|
17
|
+
type: "openid4vci-proof+jwt"
|
|
18
|
+
}).setAudience(audience).setIssuer(issuer).setIssuedAt().setExpirationTime("1h").sign();
|
|
19
|
+
};
|
|
20
|
+
|
|
21
|
+
/**
|
|
22
|
+
* Given a credential, verify it's in the supported format
|
|
23
|
+
* and the credential is correctly signed
|
|
24
|
+
* and it's bound to the given key
|
|
25
|
+
*
|
|
26
|
+
* @param rawCredential The received credential
|
|
27
|
+
* @param issuerKeys The set of public keys of the issuer,
|
|
28
|
+
* which will be used to verify the signature
|
|
29
|
+
* @param holderBindingContext The access to the holder's key
|
|
30
|
+
*
|
|
31
|
+
* @throws If the signature verification fails
|
|
32
|
+
* @throws If the credential is not in the SdJwt4VC format
|
|
33
|
+
* @throws If the holder binding is not properly configured
|
|
34
|
+
*
|
|
35
|
+
*/
|
|
36
|
+
async function verifyCredential(rawCredential, issuerKeys, holderBindingContext) {
|
|
37
|
+
const [{
|
|
38
|
+
sdJwt
|
|
39
|
+
}, holderBindingKey] =
|
|
40
|
+
// parallel for optimization
|
|
41
|
+
await Promise.all([verifySdJwt(rawCredential, issuerKeys, SdJwt4VC), holderBindingContext.getPublicKey()]);
|
|
42
|
+
if (!sdJwt.payload.cnf.jwk.kid || sdJwt.payload.cnf.jwk.kid !== holderBindingKey.kid) {
|
|
43
|
+
throw new IoWalletError(`Failed to verify holder binding, expected kid: ${holderBindingKey.kid}, got: ${sdJwt.payload.cnf.jwk.kid}`);
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
const CredentialEndpointResponse = z.object({
|
|
47
|
+
credential: z.string(),
|
|
48
|
+
format: z.literal("vc+sd-jwt")
|
|
49
|
+
});
|
|
50
|
+
/**
|
|
51
|
+
* Fetch a credential from the issuer
|
|
52
|
+
*
|
|
53
|
+
* @param issuerConf The Issuer configuration
|
|
54
|
+
* @param accessToken The access token to grant access to the credential, obtained with the access authorization step
|
|
55
|
+
* @param nonce The nonce value to prevent reply attacks, obtained with the access authorization step
|
|
56
|
+
* @param clientId Identifies the current client across all the requests of the issuing flow
|
|
57
|
+
* @param credentialType The type of the credential to be requested
|
|
58
|
+
* @param context.credentialCryptoContext The context to access the key the Credential will be bound to
|
|
59
|
+
* @param context.walletProviderBaseUrl The base url of the Wallet Provider
|
|
60
|
+
* @param context.appFetch (optional) fetch api implementation. Default: built-in fetch
|
|
61
|
+
* @returns The signed credential token
|
|
62
|
+
*/
|
|
63
|
+
export const obtainCredential = async (issuerConf, accessToken, nonce, clientId, credentialType, context) => {
|
|
64
|
+
const {
|
|
65
|
+
credentialCryptoContext,
|
|
66
|
+
walletProviderBaseUrl,
|
|
67
|
+
appFetch = fetch
|
|
68
|
+
} = context;
|
|
69
|
+
const credentialUrl = issuerConf.openid_credential_issuer.credential_endpoint;
|
|
70
|
+
|
|
71
|
+
/** DPoP token for demonstating the possession
|
|
72
|
+
of the key that will bind the holder User with the Credential
|
|
73
|
+
@see https://datatracker.ietf.org/doc/html/rfc9449 */
|
|
74
|
+
const signedDPopForPid = await createDPopToken({
|
|
75
|
+
htm: "POST",
|
|
76
|
+
htu: credentialUrl,
|
|
77
|
+
jti: `${uuid.v4()}`
|
|
78
|
+
}, credentialCryptoContext);
|
|
79
|
+
|
|
80
|
+
/** JWT proof token to bind the request nonce
|
|
81
|
+
to the key that will bind the holder User with the Credential
|
|
82
|
+
@see https://openid.net/specs/openid-4-verifiable-credential-issuance-1_0.html#name-proof-types */
|
|
83
|
+
const signedNonceProof = await createNonceProof(nonce, clientId, walletProviderBaseUrl, credentialCryptoContext);
|
|
84
|
+
|
|
85
|
+
/** The credential request body */
|
|
86
|
+
const formBody = new URLSearchParams({
|
|
87
|
+
credential_definition: JSON.stringify({
|
|
88
|
+
type: [credentialType]
|
|
89
|
+
}),
|
|
90
|
+
format: "vc+sd-jwt",
|
|
91
|
+
proof: JSON.stringify({
|
|
92
|
+
jwt: signedNonceProof,
|
|
93
|
+
proof_type: "jwt"
|
|
94
|
+
})
|
|
95
|
+
});
|
|
96
|
+
const {
|
|
97
|
+
credential,
|
|
98
|
+
format
|
|
99
|
+
} = await appFetch(credentialUrl, {
|
|
100
|
+
method: "POST",
|
|
101
|
+
headers: {
|
|
102
|
+
"Content-Type": "application/x-www-form-urlencoded",
|
|
103
|
+
DPoP: signedDPopForPid,
|
|
104
|
+
Authorization: accessToken
|
|
105
|
+
},
|
|
106
|
+
body: formBody.toString()
|
|
107
|
+
}).then(hasStatus(200)).then(res => res.json()).then(CredentialEndpointResponse.parse);
|
|
108
|
+
|
|
109
|
+
/** validate the received credential signature
|
|
110
|
+
is correct and refers to the public keys of the issuer */
|
|
111
|
+
await verifyCredential(credential, issuerConf.openid_credential_issuer.jwks.keys, credentialCryptoContext);
|
|
112
|
+
return {
|
|
113
|
+
credential,
|
|
114
|
+
format
|
|
115
|
+
};
|
|
116
|
+
};
|
|
117
|
+
//# sourceMappingURL=06-obtain-credential.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["z","uuid","SignJWT","verify","verifySdJwt","createDPopToken","hasStatus","SdJwt4VC","IoWalletError","createNonceProof","nonce","issuer","audience","ctx","setPayload","jwk","getPublicKey","setProtectedHeader","type","setAudience","setIssuer","setIssuedAt","setExpirationTime","sign","verifyCredential","rawCredential","issuerKeys","holderBindingContext","sdJwt","holderBindingKey","Promise","all","payload","cnf","kid","CredentialEndpointResponse","object","credential","string","format","literal","obtainCredential","issuerConf","accessToken","clientId","credentialType","context","credentialCryptoContext","walletProviderBaseUrl","appFetch","fetch","credentialUrl","openid_credential_issuer","credential_endpoint","signedDPopForPid","htm","htu","jti","v4","signedNonceProof","formBody","URLSearchParams","credential_definition","JSON","stringify","proof","jwt","proof_type","method","headers","DPoP","Authorization","body","toString","then","res","json","parse","jwks","keys"],"sourceRoot":"../../../../src","sources":["credential/issuance/06-obtain-credential.ts"],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":[],"sourceRoot":"../../../../src","sources":["credential/issuance/07-confirm-credential.ts"],"mappings":""}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["ASSERTION_TYPE"],"sourceRoot":"../../../../src","sources":["credential/issuance/const.ts"],"mappings":"AAAA,OAAO,MAAMA,cAAc,GACzB,oEAAoE"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { evaluateIssuerTrust } from "./02-evaluate-issuer-trust";
|
|
2
|
+
import { startUserAuthorization } from "./03-start-user-authorization";
|
|
3
|
+
import { authorizeAccess } from "./05-authorize-access";
|
|
4
|
+
import { obtainCredential } from "./06-obtain-credential";
|
|
5
|
+
export { evaluateIssuerTrust, startUserAuthorization, authorizeAccess, obtainCredential };
|
|
6
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["evaluateIssuerTrust","startUserAuthorization","authorizeAccess","obtainCredential"],"sourceRoot":"../../../../src","sources":["credential/issuance/index.ts"],"mappings":"AACA,SACEA,mBAAmB,QAEd,4BAA4B;AACnC,SACEC,sBAAsB,QAEjB,+BAA+B;AAEtC,SAASC,eAAe,QAA8B,uBAAuB;AAC7E,SACEC,gBAAgB,QAEX,wBAAwB;AAG/B,SACEH,mBAAmB,EACnBC,sBAAsB,EACtBC,eAAe,EACfC,gBAAgB"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import * as z from "zod";
|
|
2
|
+
import { decodeBase64 } from "@pagopa/io-react-native-jwt";
|
|
3
|
+
import { AuthRequestDecodeError } from "../../utils/errors";
|
|
4
|
+
const QRCodePayload = z.object({
|
|
5
|
+
protocol: z.string(),
|
|
6
|
+
resource: z.string(),
|
|
7
|
+
// TODO: refine to known paths using literals
|
|
8
|
+
clientId: z.string(),
|
|
9
|
+
requestURI: z.string()
|
|
10
|
+
});
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* The beginning of the presentation flow.
|
|
14
|
+
* To be implemented accordind to the user touchpoint
|
|
15
|
+
*
|
|
16
|
+
* @param Optional parameters, depending on the starting touchoint
|
|
17
|
+
* @returns The url for the Relying Party to connect with
|
|
18
|
+
*/
|
|
19
|
+
|
|
20
|
+
/**
|
|
21
|
+
* Start a presentation flow by decoding an incoming QR-code
|
|
22
|
+
*
|
|
23
|
+
* @param qrcode The encoded QR-code content
|
|
24
|
+
* @returns The url for the Relying Party to connect with
|
|
25
|
+
* @throws If the provided qr code fails to be decoded
|
|
26
|
+
*/
|
|
27
|
+
export const startFlowFromQR = async qrcode => {
|
|
28
|
+
const decoded = decodeBase64(qrcode);
|
|
29
|
+
const decodedUrl = new URL(decoded);
|
|
30
|
+
const protocol = decodedUrl.protocol;
|
|
31
|
+
const resource = decodedUrl.hostname;
|
|
32
|
+
const requestURI = decodedUrl.searchParams.get("request_uri");
|
|
33
|
+
const clientId = decodedUrl.searchParams.get("client_id");
|
|
34
|
+
const result = QRCodePayload.safeParse({
|
|
35
|
+
protocol,
|
|
36
|
+
resource,
|
|
37
|
+
requestURI,
|
|
38
|
+
clientId
|
|
39
|
+
});
|
|
40
|
+
if (result.success) {
|
|
41
|
+
return result.data;
|
|
42
|
+
} else {
|
|
43
|
+
throw new AuthRequestDecodeError(result.error.message, `${decodedUrl}`);
|
|
44
|
+
}
|
|
45
|
+
};
|
|
46
|
+
//# sourceMappingURL=01-start-flow.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["z","decodeBase64","AuthRequestDecodeError","QRCodePayload","object","protocol","string","resource","clientId","requestURI","startFlowFromQR","qrcode","decoded","decodedUrl","URL","hostname","searchParams","get","result","safeParse","success","data","error","message"],"sourceRoot":"../../../../src","sources":["credential/presentation/01-start-flow.ts"],"mappings":"AAAA,OAAO,KAAKA,CAAC,MAAM,KAAK;AACxB,SAASC,YAAY,QAAQ,6BAA6B;AAC1D,SAASC,sBAAsB,QAAQ,oBAAoB;AAE3D,MAAMC,aAAa,GAAGH,CAAC,CAACI,MAAM,CAAC;EAC7BC,QAAQ,EAAEL,CAAC,CAACM,MAAM,CAAC,CAAC;EACpBC,QAAQ,EAAEP,CAAC,CAACM,MAAM,CAAC,CAAC;EAAE;EACtBE,QAAQ,EAAER,CAAC,CAACM,MAAM,CAAC,CAAC;EACpBG,UAAU,EAAET,CAAC,CAACM,MAAM,CAAC;AACvB,CAAC,CAAC;;AAEF;AACA;AACA;AACA;AACA;AACA;AACA;;AAMA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,MAAMI,eAAoC,GAAG,MAAOC,MAAM,IAAK;EACpE,MAAMC,OAAO,GAAGX,YAAY,CAACU,MAAM,CAAC;EACpC,MAAME,UAAU,GAAG,IAAIC,GAAG,CAACF,OAAO,CAAC;EACnC,MAAMP,QAAQ,GAAGQ,UAAU,CAACR,QAAQ;EACpC,MAAME,QAAQ,GAAGM,UAAU,CAACE,QAAQ;EACpC,MAAMN,UAAU,GAAGI,UAAU,CAACG,YAAY,CAACC,GAAG,CAAC,aAAa,CAAC;EAC7D,MAAMT,QAAQ,GAAGK,UAAU,CAACG,YAAY,CAACC,GAAG,CAAC,WAAW,CAAC;EAEzD,MAAMC,MAAM,GAAGf,aAAa,CAACgB,SAAS,CAAC;IACrCd,QAAQ;IACRE,QAAQ;IACRE,UAAU;IACVD;EACF,CAAC,CAAC;EAEF,IAAIU,MAAM,CAACE,OAAO,EAAE;IAClB,OAAOF,MAAM,CAACG,IAAI;EACpB,CAAC,MAAM;IACL,MAAM,IAAInB,sBAAsB,CAACgB,MAAM,CAACI,KAAK,CAACC,OAAO,EAAG,GAAEV,UAAW,EAAC,CAAC;EACzE;AACF,CAAC"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { getRelyingPartyEntityConfiguration } from "../../trust";
|
|
2
|
+
/**
|
|
3
|
+
* The Relying Party trust evaluation phase.
|
|
4
|
+
* Fetch the Relying Party's configuration and verify trust.
|
|
5
|
+
*
|
|
6
|
+
* @param rpUrl The base url of the Issuer
|
|
7
|
+
* @param context.appFetch (optional) fetch api implementation. Default: built-in fetch
|
|
8
|
+
* @returns The Relying Party's configuration
|
|
9
|
+
*/
|
|
10
|
+
export const evaluateRelyingPartyTrust = async function (rpUrl) {
|
|
11
|
+
let {
|
|
12
|
+
appFetch = fetch
|
|
13
|
+
} = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
|
|
14
|
+
const {
|
|
15
|
+
payload: {
|
|
16
|
+
metadata: rpConf
|
|
17
|
+
}
|
|
18
|
+
} = await getRelyingPartyEntityConfiguration(rpUrl, {
|
|
19
|
+
appFetch
|
|
20
|
+
});
|
|
21
|
+
return {
|
|
22
|
+
rpConf
|
|
23
|
+
};
|
|
24
|
+
};
|
|
25
|
+
//# sourceMappingURL=02-evaluate-rp-trust.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["getRelyingPartyEntityConfiguration","evaluateRelyingPartyTrust","rpUrl","appFetch","fetch","arguments","length","undefined","payload","metadata","rpConf"],"sourceRoot":"../../../../src","sources":["credential/presentation/02-evaluate-rp-trust.ts"],"mappings":"AAAA,SAASA,kCAAkC,QAAQ,aAAa;AAchE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,MAAMC,yBAAoD,GAAG,eAAAA,CAClEC,KAAK,EAEF;EAAA,IADH;IAAEC,QAAQ,GAAGC;EAAM,CAAC,GAAAC,SAAA,CAAAC,MAAA,QAAAD,SAAA,QAAAE,SAAA,GAAAF,SAAA,MAAG,CAAC,CAAC;EAEzB,MAAM;IACJG,OAAO,EAAE;MAAEC,QAAQ,EAAEC;IAAO;EAC9B,CAAC,GAAG,MAAMV,kCAAkC,CAACE,KAAK,EAAE;IAClDC;EACF,CAAC,CAAC;EACF,OAAO;IAAEO;EAAO,CAAC;AACnB,CAAC"}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import uuid from "react-native-uuid";
|
|
2
|
+
import { decode as decodeJwt, sha256ToBase64, verify } from "@pagopa/io-react-native-jwt";
|
|
3
|
+
import { createDPopToken } from "../../utils/dpop";
|
|
4
|
+
import { NoSuitableKeysFoundInEntityConfiguration } from "../../utils/errors";
|
|
5
|
+
import { hasStatus } from "../../utils/misc";
|
|
6
|
+
import { RequestObject } from "./types";
|
|
7
|
+
/**
|
|
8
|
+
* Obtain the Request Object for RP authentication
|
|
9
|
+
* @see https://italia.github.io/eudi-wallet-it-docs/versione-corrente/en/relying-party-solution.html
|
|
10
|
+
*
|
|
11
|
+
* @param requestUri The url for the Relying Party to connect with
|
|
12
|
+
* @param rpConf The Relying Party's configuration
|
|
13
|
+
* @param context.wiaCryptoContext The context to access the key associated with the Wallet Instance Attestation
|
|
14
|
+
* @param context.walletInstanceAttestation The Wallet Instance Attestation token
|
|
15
|
+
* @param context.appFetch (optional) fetch api implementation. Default: built-in fetch
|
|
16
|
+
* @returns The Request Object that describes the presentation
|
|
17
|
+
*/
|
|
18
|
+
export const getRequestObject = async (requestUri, rpConf, _ref) => {
|
|
19
|
+
let {
|
|
20
|
+
wiaCryptoContext,
|
|
21
|
+
appFetch = fetch,
|
|
22
|
+
walletInstanceAttestation
|
|
23
|
+
} = _ref;
|
|
24
|
+
const signedWalletInstanceDPoP = await createDPopToken({
|
|
25
|
+
jti: `${uuid.v4()}`,
|
|
26
|
+
htm: "GET",
|
|
27
|
+
htu: requestUri,
|
|
28
|
+
ath: await sha256ToBase64(walletInstanceAttestation)
|
|
29
|
+
}, wiaCryptoContext);
|
|
30
|
+
const responseEncodedJwt = await appFetch(requestUri, {
|
|
31
|
+
method: "GET",
|
|
32
|
+
headers: {
|
|
33
|
+
Authorization: `DPoP ${walletInstanceAttestation}`,
|
|
34
|
+
DPoP: signedWalletInstanceDPoP
|
|
35
|
+
}
|
|
36
|
+
}).then(hasStatus(200)).then(res => res.json()).then(responseJson => responseJson.response);
|
|
37
|
+
const responseJwt = decodeJwt(responseEncodedJwt);
|
|
38
|
+
|
|
39
|
+
// verify token signature according to RP's entity configuration
|
|
40
|
+
// to ensure the request object is authentic
|
|
41
|
+
{
|
|
42
|
+
const pubKey = rpConf.wallet_relying_party.jwks.keys.find(_ref2 => {
|
|
43
|
+
let {
|
|
44
|
+
kid
|
|
45
|
+
} = _ref2;
|
|
46
|
+
return kid === responseJwt.protectedHeader.kid;
|
|
47
|
+
});
|
|
48
|
+
if (!pubKey) {
|
|
49
|
+
throw new NoSuitableKeysFoundInEntityConfiguration("Request Object signature verification");
|
|
50
|
+
}
|
|
51
|
+
await verify(responseEncodedJwt, pubKey);
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
// Ensure that the request object conforms to the expected specification.
|
|
55
|
+
const requestObject = RequestObject.parse(responseJwt.payload);
|
|
56
|
+
return {
|
|
57
|
+
requestObject
|
|
58
|
+
};
|
|
59
|
+
};
|
|
60
|
+
//# sourceMappingURL=03-get-request-object.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["uuid","decode","decodeJwt","sha256ToBase64","verify","createDPopToken","NoSuitableKeysFoundInEntityConfiguration","hasStatus","RequestObject","getRequestObject","requestUri","rpConf","_ref","wiaCryptoContext","appFetch","fetch","walletInstanceAttestation","signedWalletInstanceDPoP","jti","v4","htm","htu","ath","responseEncodedJwt","method","headers","Authorization","DPoP","then","res","json","responseJson","response","responseJwt","pubKey","wallet_relying_party","jwks","keys","find","_ref2","kid","protectedHeader","requestObject","parse","payload"],"sourceRoot":"../../../../src","sources":["credential/presentation/03-get-request-object.ts"],"mappings":"AAAA,OAAOA,IAAI,MAAM,mBAAmB;AACpC,SACEC,MAAM,IAAIC,SAAS,EACnBC,cAAc,EACdC,MAAM,QAED,6BAA6B;AAEpC,SAASC,eAAe,QAAQ,kBAAkB;AAClD,SAASC,wCAAwC,QAAQ,oBAAoB;AAE7E,SAASC,SAAS,QAAkB,kBAAkB;AAEtD,SAASC,aAAa,QAAQ,SAAS;AAYvC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,MAAMC,gBAAkC,GAAG,MAAAA,CAChDC,UAAU,EACVC,MAAM,EAAAC,IAAA,KAEH;EAAA,IADH;IAAEC,gBAAgB;IAAEC,QAAQ,GAAGC,KAAK;IAAEC;EAA0B,CAAC,GAAAJ,IAAA;EAEjE,MAAMK,wBAAwB,GAAG,MAAMZ,eAAe,CACpD;IACEa,GAAG,EAAG,GAAElB,IAAI,CAACmB,EAAE,CAAC,CAAE,EAAC;IACnBC,GAAG,EAAE,KAAK;IACVC,GAAG,EAAEX,UAAU;IACfY,GAAG,EAAE,MAAMnB,cAAc,CAACa,yBAAyB;EACrD,CAAC,EACDH,gBACF,CAAC;EAED,MAAMU,kBAAkB,GAAG,MAAMT,QAAQ,CAACJ,UAAU,EAAE;IACpDc,MAAM,EAAE,KAAK;IACbC,OAAO,EAAE;MACPC,aAAa,EAAG,QAAOV,yBAA0B,EAAC;MAClDW,IAAI,EAAEV;IACR;EACF,CAAC,CAAC,CACCW,IAAI,CAACrB,SAAS,CAAC,GAAG,CAAC,CAAC,CACpBqB,IAAI,CAAEC,GAAG,IAAKA,GAAG,CAACC,IAAI,CAAC,CAAC,CAAC,CACzBF,IAAI,CAAEG,YAAY,IAAKA,YAAY,CAACC,QAAQ,CAAC;EAEhD,MAAMC,WAAW,GAAG/B,SAAS,CAACqB,kBAAkB,CAAC;;EAEjD;EACA;EACA;IACE,MAAMW,MAAM,GAAGvB,MAAM,CAACwB,oBAAoB,CAACC,IAAI,CAACC,IAAI,CAACC,IAAI,CACvDC,KAAA;MAAA,IAAC;QAAEC;MAAI,CAAC,GAAAD,KAAA;MAAA,OAAKC,GAAG,KAAKP,WAAW,CAACQ,eAAe,CAACD,GAAG;IAAA,CACtD,CAAC;IACD,IAAI,CAACN,MAAM,EAAE;MACX,MAAM,IAAI5B,wCAAwC,CAChD,uCACF,CAAC;IACH;IACA,MAAMF,MAAM,CAACmB,kBAAkB,EAAEW,MAAM,CAAC;EAC1C;;EAEA;EACA,MAAMQ,aAAa,GAAGlC,aAAa,CAACmC,KAAK,CAACV,WAAW,CAACW,OAAO,CAAC;EAE9D,OAAO;IACLF;EACF,CAAC;AACH,CAAC"}
|