@pagopa/io-react-native-wallet 1.0.0 → 1.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/commonjs/credential/index.js +1 -5
- package/lib/commonjs/credential/index.js.map +1 -1
- package/lib/commonjs/credential/issuance/02-get-issuer-config.js +48 -0
- package/lib/commonjs/credential/issuance/02-get-issuer-config.js.map +1 -0
- package/lib/commonjs/credential/issuance/03-start-user-authorization.js +16 -20
- package/lib/commonjs/credential/issuance/03-start-user-authorization.js.map +1 -1
- package/lib/commonjs/credential/issuance/04-complete-user-authorization.js +8 -8
- package/lib/commonjs/credential/issuance/04-complete-user-authorization.js.map +1 -1
- package/lib/commonjs/credential/issuance/05-authorize-access.js +8 -9
- package/lib/commonjs/credential/issuance/05-authorize-access.js.map +1 -1
- package/lib/commonjs/credential/issuance/06-obtain-credential.js +18 -21
- package/lib/commonjs/credential/issuance/06-obtain-credential.js.map +1 -1
- package/lib/commonjs/credential/issuance/07-verify-and-parse-credential.js +3 -3
- package/lib/commonjs/credential/issuance/07-verify-and-parse-credential.js.map +1 -1
- package/lib/commonjs/credential/issuance/README.md +18 -21
- package/lib/commonjs/credential/issuance/index.js +3 -3
- package/lib/commonjs/credential/issuance/index.js.map +1 -1
- package/lib/commonjs/credential/issuance/types.js +1 -1
- package/lib/commonjs/credential/issuance/types.js.map +1 -1
- package/lib/commonjs/credential/presentation/01-start-flow.js +7 -2
- package/lib/commonjs/credential/presentation/01-start-flow.js.map +1 -1
- package/lib/commonjs/credential/presentation/02-evaluate-rp-trust.js +2 -2
- package/lib/commonjs/credential/presentation/02-evaluate-rp-trust.js.map +1 -1
- package/lib/commonjs/credential/presentation/03-retrieve-jwks.js +68 -0
- package/lib/commonjs/credential/presentation/03-retrieve-jwks.js.map +1 -0
- package/lib/commonjs/credential/presentation/{03-get-request-object.js → 04-get-request-object.js} +27 -13
- package/lib/commonjs/credential/presentation/04-get-request-object.js.map +1 -0
- package/lib/commonjs/credential/presentation/{04-send-authorization-response.js → 05-send-authorization-response.js} +1 -1
- package/lib/commonjs/credential/presentation/{04-send-authorization-response.js.map → 05-send-authorization-response.js.map} +1 -1
- package/lib/commonjs/credential/presentation/README.md +74 -2
- package/lib/commonjs/credential/presentation/index.js +15 -2
- package/lib/commonjs/credential/presentation/index.js.map +1 -1
- package/lib/commonjs/credential/presentation/types.js +5 -3
- package/lib/commonjs/credential/presentation/types.js.map +1 -1
- package/lib/commonjs/entity/openid-connect/issuer/index.js +25 -0
- package/lib/commonjs/entity/openid-connect/issuer/index.js.map +1 -0
- package/lib/commonjs/entity/openid-connect/issuer/types.js +61 -0
- package/lib/commonjs/entity/openid-connect/issuer/types.js.map +1 -0
- package/lib/commonjs/{trust → entity/trust}/chain.js +1 -1
- package/lib/commonjs/entity/trust/chain.js.map +1 -0
- package/lib/commonjs/{trust → entity/trust}/index.js +1 -1
- package/lib/commonjs/entity/trust/index.js.map +1 -0
- package/lib/commonjs/{trust → entity/trust}/types.js +2 -2
- package/lib/commonjs/entity/trust/types.js.map +1 -0
- package/lib/commonjs/index.js +1 -3
- package/lib/commonjs/index.js.map +1 -1
- package/lib/commonjs/pid/sd-jwt/types.js +2 -18
- package/lib/commonjs/pid/sd-jwt/types.js.map +1 -1
- package/lib/commonjs/sd-jwt/__test__/index.test.js +32 -23
- package/lib/commonjs/sd-jwt/__test__/index.test.js.map +1 -1
- package/lib/commonjs/sd-jwt/__test__/types.test.js +20 -11
- package/lib/commonjs/sd-jwt/__test__/types.test.js.map +1 -1
- package/lib/commonjs/sd-jwt/types.js +18 -5
- package/lib/commonjs/sd-jwt/types.js.map +1 -1
- package/lib/commonjs/utils/error-codes.js +1 -13
- package/lib/commonjs/utils/error-codes.js.map +1 -1
- package/lib/commonjs/utils/errors.js +2 -53
- package/lib/commonjs/utils/errors.js.map +1 -1
- package/lib/commonjs/utils/jwk.js +5 -1
- package/lib/commonjs/utils/jwk.js.map +1 -1
- package/lib/commonjs/utils/par.js +6 -12
- package/lib/commonjs/utils/par.js.map +1 -1
- package/lib/module/credential/index.js +1 -3
- package/lib/module/credential/index.js.map +1 -1
- package/lib/module/credential/issuance/02-get-issuer-config.js +42 -0
- package/lib/module/credential/issuance/02-get-issuer-config.js.map +1 -0
- package/lib/module/credential/issuance/03-start-user-authorization.js +16 -20
- package/lib/module/credential/issuance/03-start-user-authorization.js.map +1 -1
- package/lib/module/credential/issuance/04-complete-user-authorization.js +8 -8
- package/lib/module/credential/issuance/04-complete-user-authorization.js.map +1 -1
- package/lib/module/credential/issuance/05-authorize-access.js +8 -9
- package/lib/module/credential/issuance/05-authorize-access.js.map +1 -1
- package/lib/module/credential/issuance/06-obtain-credential.js +18 -21
- package/lib/module/credential/issuance/06-obtain-credential.js.map +1 -1
- package/lib/module/credential/issuance/07-verify-and-parse-credential.js +3 -3
- package/lib/module/credential/issuance/07-verify-and-parse-credential.js.map +1 -1
- package/lib/module/credential/issuance/README.md +18 -21
- package/lib/module/credential/issuance/index.js +2 -2
- package/lib/module/credential/issuance/index.js.map +1 -1
- package/lib/module/credential/issuance/types.js +1 -1
- package/lib/module/credential/issuance/types.js.map +1 -1
- package/lib/module/credential/presentation/01-start-flow.js +7 -2
- package/lib/module/credential/presentation/01-start-flow.js.map +1 -1
- package/lib/module/credential/presentation/02-evaluate-rp-trust.js +1 -1
- package/lib/module/credential/presentation/02-evaluate-rp-trust.js.map +1 -1
- package/lib/module/credential/presentation/03-retrieve-jwks.js +61 -0
- package/lib/module/credential/presentation/03-retrieve-jwks.js.map +1 -0
- package/lib/module/credential/presentation/{03-get-request-object.js → 04-get-request-object.js} +26 -12
- package/lib/module/credential/presentation/04-get-request-object.js.map +1 -0
- package/lib/module/credential/presentation/{04-send-authorization-response.js → 05-send-authorization-response.js} +1 -1
- package/lib/module/credential/presentation/{04-send-authorization-response.js.map → 05-send-authorization-response.js.map} +1 -1
- package/lib/module/credential/presentation/README.md +74 -2
- package/lib/module/credential/presentation/index.js +4 -3
- package/lib/module/credential/presentation/index.js.map +1 -1
- package/lib/module/credential/presentation/types.js +5 -3
- package/lib/module/credential/presentation/types.js.map +1 -1
- package/lib/module/entity/openid-connect/issuer/index.js +20 -0
- package/lib/module/entity/openid-connect/issuer/index.js.map +1 -0
- package/lib/module/entity/openid-connect/issuer/types.js +47 -0
- package/lib/module/entity/openid-connect/issuer/types.js.map +1 -0
- package/lib/module/{trust → entity/trust}/chain.js +1 -1
- package/lib/module/entity/trust/chain.js.map +1 -0
- package/lib/module/{trust → entity/trust}/index.js +1 -1
- package/lib/module/entity/trust/index.js.map +1 -0
- package/lib/module/{trust → entity/trust}/types.js +2 -2
- package/lib/module/entity/trust/types.js.map +1 -0
- package/lib/module/index.js +1 -2
- package/lib/module/index.js.map +1 -1
- package/lib/module/pid/sd-jwt/types.js +1 -16
- package/lib/module/pid/sd-jwt/types.js.map +1 -1
- package/lib/module/sd-jwt/__test__/index.test.js +32 -23
- package/lib/module/sd-jwt/__test__/index.test.js.map +1 -1
- package/lib/module/sd-jwt/__test__/types.test.js +20 -11
- package/lib/module/sd-jwt/__test__/types.test.js.map +1 -1
- package/lib/module/sd-jwt/types.js +16 -4
- package/lib/module/sd-jwt/types.js.map +1 -1
- package/lib/module/utils/error-codes.js +1 -13
- package/lib/module/utils/error-codes.js.map +1 -1
- package/lib/module/utils/errors.js +0 -48
- package/lib/module/utils/errors.js.map +1 -1
- package/lib/module/utils/jwk.js +3 -0
- package/lib/module/utils/jwk.js.map +1 -1
- package/lib/module/utils/par.js +6 -12
- package/lib/module/utils/par.js.map +1 -1
- package/lib/typescript/credential/index.d.ts +1 -3
- package/lib/typescript/credential/index.d.ts.map +1 -1
- package/lib/typescript/credential/issuance/01-start-flow.d.ts +1 -1
- package/lib/typescript/credential/issuance/02-get-issuer-config.d.ts +32 -0
- package/lib/typescript/credential/issuance/02-get-issuer-config.d.ts.map +1 -0
- package/lib/typescript/credential/issuance/03-start-user-authorization.d.ts +3 -3
- package/lib/typescript/credential/issuance/03-start-user-authorization.d.ts.map +1 -1
- package/lib/typescript/credential/issuance/04-complete-user-authorization.d.ts +8 -8
- package/lib/typescript/credential/issuance/04-complete-user-authorization.d.ts.map +1 -1
- package/lib/typescript/credential/issuance/05-authorize-access.d.ts +3 -3
- package/lib/typescript/credential/issuance/05-authorize-access.d.ts.map +1 -1
- package/lib/typescript/credential/issuance/06-obtain-credential.d.ts +3 -3
- package/lib/typescript/credential/issuance/06-obtain-credential.d.ts.map +1 -1
- package/lib/typescript/credential/issuance/07-verify-and-parse-credential.d.ts +3 -3
- package/lib/typescript/credential/issuance/07-verify-and-parse-credential.d.ts.map +1 -1
- package/lib/typescript/credential/issuance/index.d.ts +3 -3
- package/lib/typescript/credential/issuance/index.d.ts.map +1 -1
- package/lib/typescript/credential/issuance/types.d.ts +4 -9
- package/lib/typescript/credential/issuance/types.d.ts.map +1 -1
- package/lib/typescript/credential/presentation/01-start-flow.d.ts.map +1 -1
- package/lib/typescript/credential/presentation/02-evaluate-rp-trust.d.ts +1 -1
- package/lib/typescript/credential/presentation/02-evaluate-rp-trust.d.ts.map +1 -1
- package/lib/typescript/credential/presentation/03-retrieve-jwks.d.ts +41 -0
- package/lib/typescript/credential/presentation/03-retrieve-jwks.d.ts.map +1 -0
- package/lib/typescript/credential/presentation/{03-get-request-object.d.ts → 04-get-request-object.d.ts} +4 -4
- package/lib/typescript/credential/presentation/04-get-request-object.d.ts.map +1 -0
- package/lib/typescript/credential/presentation/{04-send-authorization-response.d.ts → 05-send-authorization-response.d.ts} +2 -2
- package/lib/typescript/credential/presentation/{04-send-authorization-response.d.ts.map → 05-send-authorization-response.d.ts.map} +1 -1
- package/lib/typescript/credential/presentation/index.d.ts +5 -4
- package/lib/typescript/credential/presentation/index.d.ts.map +1 -1
- package/lib/typescript/credential/presentation/types.d.ts +15 -15
- package/lib/typescript/entity/openid-connect/issuer/index.d.ts +12 -0
- package/lib/typescript/entity/openid-connect/issuer/index.d.ts.map +1 -0
- package/lib/typescript/entity/openid-connect/issuer/types.d.ts +641 -0
- package/lib/typescript/entity/openid-connect/issuer/types.d.ts.map +1 -0
- package/lib/typescript/entity/trust/chain.d.ts.map +1 -0
- package/lib/typescript/{trust → entity/trust}/index.d.ts +97 -97
- package/lib/typescript/entity/trust/index.d.ts.map +1 -0
- package/lib/typescript/{trust → entity/trust}/types.d.ts +597 -597
- package/lib/typescript/{trust → entity/trust}/types.d.ts.map +1 -1
- package/lib/typescript/index.d.ts +1 -2
- package/lib/typescript/index.d.ts.map +1 -1
- package/lib/typescript/pid/sd-jwt/types.d.ts +25 -103
- package/lib/typescript/pid/sd-jwt/types.d.ts.map +1 -1
- package/lib/typescript/sd-jwt/index.d.ts +60 -20
- package/lib/typescript/sd-jwt/index.d.ts.map +1 -1
- package/lib/typescript/sd-jwt/types.d.ts +114 -24
- package/lib/typescript/sd-jwt/types.d.ts.map +1 -1
- package/lib/typescript/utils/error-codes.d.ts +0 -12
- package/lib/typescript/utils/error-codes.d.ts.map +1 -1
- package/lib/typescript/utils/errors.d.ts +6 -37
- package/lib/typescript/utils/errors.d.ts.map +1 -1
- package/lib/typescript/utils/jwk.d.ts +135 -0
- package/lib/typescript/utils/jwk.d.ts.map +1 -1
- package/lib/typescript/utils/par.d.ts +1 -8
- package/lib/typescript/utils/par.d.ts.map +1 -1
- package/lib/typescript/wallet-instance-attestation/types.d.ts +12 -12
- package/package.json +1 -1
- package/src/credential/index.ts +1 -4
- package/src/credential/issuance/01-start-flow.ts +1 -1
- package/src/credential/issuance/02-get-issuer-config.ts +67 -0
- package/src/credential/issuance/03-start-user-authorization.ts +22 -30
- package/src/credential/issuance/04-complete-user-authorization.ts +11 -13
- package/src/credential/issuance/05-authorize-access.ts +8 -10
- package/src/credential/issuance/06-obtain-credential.ts +30 -31
- package/src/credential/issuance/07-verify-and-parse-credential.ts +6 -6
- package/src/credential/issuance/README.md +18 -21
- package/src/credential/issuance/index.ts +3 -6
- package/src/credential/issuance/types.ts +1 -1
- package/src/credential/presentation/01-start-flow.ts +8 -2
- package/src/credential/presentation/02-evaluate-rp-trust.ts +2 -2
- package/src/credential/presentation/03-retrieve-jwks.ts +73 -0
- package/src/credential/presentation/{03-get-request-object.ts → 04-get-request-object.ts} +33 -15
- package/src/credential/presentation/{04-send-authorization-response.ts → 05-send-authorization-response.ts} +1 -1
- package/src/credential/presentation/README.md +74 -2
- package/src/credential/presentation/index.ts +10 -2
- package/src/credential/presentation/types.ts +3 -3
- package/src/entity/openid-connect/issuer/index.ts +27 -0
- package/src/entity/openid-connect/issuer/types.ts +68 -0
- package/src/{trust → entity/trust}/chain.ts +2 -2
- package/src/{trust → entity/trust}/index.ts +1 -1
- package/src/{trust → entity/trust}/types.ts +2 -2
- package/src/index.ts +0 -2
- package/src/pid/sd-jwt/types.ts +1 -18
- package/src/sd-jwt/__test__/index.test.ts +47 -37
- package/src/sd-jwt/__test__/types.test.ts +26 -16
- package/src/sd-jwt/types.ts +16 -2
- package/src/utils/error-codes.ts +0 -12
- package/src/utils/errors.ts +12 -86
- package/src/utils/jwk.ts +5 -0
- package/src/utils/par.ts +3 -10
- package/lib/commonjs/credential/issuance/02-evaluate-issuer-trust.js +0 -27
- package/lib/commonjs/credential/issuance/02-evaluate-issuer-trust.js.map +0 -1
- package/lib/commonjs/credential/presentation/03-get-request-object.js.map +0 -1
- package/lib/commonjs/credential/status/01-start-flow.js +0 -2
- package/lib/commonjs/credential/status/01-start-flow.js.map +0 -1
- package/lib/commonjs/credential/status/02-status-attestation.js +0 -72
- package/lib/commonjs/credential/status/02-status-attestation.js.map +0 -1
- package/lib/commonjs/credential/status/03-verify-and-parse-status-attestation.js +0 -52
- package/lib/commonjs/credential/status/03-verify-and-parse-status-attestation.js.map +0 -1
- package/lib/commonjs/credential/status/README.md +0 -67
- package/lib/commonjs/credential/status/index.js +0 -27
- package/lib/commonjs/credential/status/index.js.map +0 -1
- package/lib/commonjs/credential/status/types.js +0 -48
- package/lib/commonjs/credential/status/types.js.map +0 -1
- package/lib/commonjs/credential/trustmark/README.md +0 -62
- package/lib/commonjs/credential/trustmark/get-credential-trustmark.js +0 -81
- package/lib/commonjs/credential/trustmark/get-credential-trustmark.js.map +0 -1
- package/lib/commonjs/credential/trustmark/index.js +0 -13
- package/lib/commonjs/credential/trustmark/index.js.map +0 -1
- package/lib/commonjs/trust/chain.js.map +0 -1
- package/lib/commonjs/trust/index.js.map +0 -1
- package/lib/commonjs/trust/types.js.map +0 -1
- package/lib/module/credential/issuance/02-evaluate-issuer-trust.js +0 -20
- package/lib/module/credential/issuance/02-evaluate-issuer-trust.js.map +0 -1
- package/lib/module/credential/presentation/03-get-request-object.js.map +0 -1
- package/lib/module/credential/status/01-start-flow.js +0 -2
- package/lib/module/credential/status/01-start-flow.js.map +0 -1
- package/lib/module/credential/status/02-status-attestation.js +0 -64
- package/lib/module/credential/status/02-status-attestation.js.map +0 -1
- package/lib/module/credential/status/03-verify-and-parse-status-attestation.js +0 -46
- package/lib/module/credential/status/03-verify-and-parse-status-attestation.js.map +0 -1
- package/lib/module/credential/status/README.md +0 -67
- package/lib/module/credential/status/index.js +0 -5
- package/lib/module/credential/status/index.js.map +0 -1
- package/lib/module/credential/status/types.js +0 -40
- package/lib/module/credential/status/types.js.map +0 -1
- package/lib/module/credential/trustmark/README.md +0 -62
- package/lib/module/credential/trustmark/get-credential-trustmark.js +0 -72
- package/lib/module/credential/trustmark/get-credential-trustmark.js.map +0 -1
- package/lib/module/credential/trustmark/index.js +0 -3
- package/lib/module/credential/trustmark/index.js.map +0 -1
- package/lib/module/trust/chain.js.map +0 -1
- package/lib/module/trust/index.js.map +0 -1
- package/lib/module/trust/types.js.map +0 -1
- package/lib/typescript/credential/issuance/02-evaluate-issuer-trust.d.ts +0 -19
- package/lib/typescript/credential/issuance/02-evaluate-issuer-trust.d.ts.map +0 -1
- package/lib/typescript/credential/presentation/03-get-request-object.d.ts.map +0 -1
- package/lib/typescript/credential/status/01-start-flow.d.ts +0 -10
- package/lib/typescript/credential/status/01-start-flow.d.ts.map +0 -1
- package/lib/typescript/credential/status/02-status-attestation.d.ts +0 -19
- package/lib/typescript/credential/status/02-status-attestation.d.ts.map +0 -1
- package/lib/typescript/credential/status/03-verify-and-parse-status-attestation.d.ts +0 -24
- package/lib/typescript/credential/status/03-verify-and-parse-status-attestation.d.ts.map +0 -1
- package/lib/typescript/credential/status/index.d.ts +0 -7
- package/lib/typescript/credential/status/index.d.ts.map +0 -1
- package/lib/typescript/credential/status/types.d.ts +0 -305
- package/lib/typescript/credential/status/types.d.ts.map +0 -1
- package/lib/typescript/credential/trustmark/get-credential-trustmark.d.ts +0 -52
- package/lib/typescript/credential/trustmark/get-credential-trustmark.d.ts.map +0 -1
- package/lib/typescript/credential/trustmark/index.d.ts +0 -4
- package/lib/typescript/credential/trustmark/index.d.ts.map +0 -1
- package/lib/typescript/trust/chain.d.ts.map +0 -1
- package/lib/typescript/trust/index.d.ts.map +0 -1
- package/src/credential/issuance/02-evaluate-issuer-trust.ts +0 -32
- package/src/credential/status/01-start-flow.ts +0 -9
- package/src/credential/status/02-status-attestation.ts +0 -102
- package/src/credential/status/03-verify-and-parse-status-attestation.ts +0 -60
- package/src/credential/status/README.md +0 -67
- package/src/credential/status/index.ts +0 -22
- package/src/credential/status/types.ts +0 -43
- package/src/credential/trustmark/README.md +0 -62
- package/src/credential/trustmark/get-credential-trustmark.ts +0 -120
- package/src/credential/trustmark/index.ts +0 -8
- /package/lib/typescript/{trust → entity/trust}/chain.d.ts +0 -0
|
@@ -5,35 +5,45 @@ describe("SdJwt4VC", () => {
|
|
|
5
5
|
// example provided at https://italia.github.io/eidas-it-wallet-docs/en/pid-data-model.html
|
|
6
6
|
const token = {
|
|
7
7
|
header: {
|
|
8
|
+
kid: "eNN-g5i6CnLKcltQBp6abbioGMbzM6muW3vuxw6uh88",
|
|
8
9
|
typ: "vc+sd-jwt",
|
|
9
|
-
alg: "
|
|
10
|
-
kid: "dB67gL7ck3TFiIAf7N6_7SHvqk0MDYMEQcoGGlkUAAw",
|
|
10
|
+
alg: "RS256",
|
|
11
11
|
},
|
|
12
12
|
payload: {
|
|
13
|
+
sub: "sj1OpYiiLTVYANnBGNwSK2krMwqpWaz2iHmN1t0_Esg",
|
|
13
14
|
_sd: [
|
|
14
|
-
"
|
|
15
|
-
"
|
|
16
|
-
"
|
|
17
|
-
"
|
|
18
|
-
"
|
|
19
|
-
"
|
|
15
|
+
"1UmtISsdd7udbFaFy-ViZ8dZFherbOGD2N3HlX4PIC8",
|
|
16
|
+
"Fmjs4qzc5vkeOAY5G20_ZPvU-1q-oXaV7Ax516CCMFk",
|
|
17
|
+
"Q3bagNzMeQh6EgwPBSHimbgQplmY_6v9SW4go2XAkgA",
|
|
18
|
+
"QVwkn71B4pWfCOzzlQl9HnxFSVdEHuW35zdTQQdFQGc",
|
|
19
|
+
"VVdR41A2KOOVzxYagZCGbVang7sSkegCeiuWf3DOtjs",
|
|
20
|
+
"vO2dvncmzlv37MQkmWudSDIHDE9YHd0EFB8xBTDVjz0",
|
|
20
21
|
],
|
|
21
|
-
|
|
22
|
+
"vct#integrity":
|
|
23
|
+
"242302d97d38da2714a257f2a253bf2fa30aae5c109fe9581bfcda3b1d797c97",
|
|
22
24
|
_sd_alg: "sha-256",
|
|
23
|
-
vct: "
|
|
24
|
-
iss: "https://
|
|
25
|
+
vct: "urn:eu.europa.ec.eudi:pid:1",
|
|
26
|
+
iss: "https://api.potential-wallet-it-pid-provider.it",
|
|
25
27
|
cnf: {
|
|
26
28
|
jwk: {
|
|
27
29
|
kty: "EC",
|
|
28
30
|
crv: "P-256",
|
|
29
|
-
kid: "
|
|
30
|
-
x: "
|
|
31
|
-
y: "
|
|
31
|
+
kid: "LegnFQ8lvhA6qyPutYv48nWWpSnO5tHigavywyds5S0",
|
|
32
|
+
x: "czZrN9lcNuc0q69X40n27c5jKpii0A-aYX_Pbo9pqBQ",
|
|
33
|
+
y: "YGKGaCJNWfTiKiz3JmAG9ky7h4twPuUfzYOgy1bzLv8",
|
|
32
34
|
},
|
|
33
35
|
},
|
|
34
|
-
exp:
|
|
36
|
+
exp: 1768490196,
|
|
37
|
+
iat: 1736954196,
|
|
38
|
+
verification: {
|
|
39
|
+
evidence: {
|
|
40
|
+
method: "cie",
|
|
41
|
+
},
|
|
42
|
+
trust_framework: "eidas",
|
|
43
|
+
assurance_level: "high",
|
|
44
|
+
},
|
|
35
45
|
status: {
|
|
36
|
-
|
|
46
|
+
status_assertion: {
|
|
37
47
|
credential_hash_alg: "sha-256",
|
|
38
48
|
},
|
|
39
49
|
},
|
package/src/sd-jwt/types.ts
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { CredentialFormat } from "../entity/openid-connect/issuer/types";
|
|
1
2
|
import { JWK } from "../utils/jwk";
|
|
2
3
|
import { z } from "zod";
|
|
3
4
|
|
|
@@ -33,12 +34,23 @@ export type DisclosureWithEncoded = {
|
|
|
33
34
|
encoded: string;
|
|
34
35
|
};
|
|
35
36
|
|
|
37
|
+
export type Verification = z.infer<typeof Verification>;
|
|
38
|
+
export const Verification = z.object({
|
|
39
|
+
trust_framework: z.literal("eidas"),
|
|
40
|
+
assurance_level: z.string(),
|
|
41
|
+
evidence: z.object({
|
|
42
|
+
method: z.string(),
|
|
43
|
+
}),
|
|
44
|
+
});
|
|
45
|
+
|
|
36
46
|
export type SdJwt4VC = z.infer<typeof SdJwt4VC>;
|
|
37
47
|
export const SdJwt4VC = z.object({
|
|
38
48
|
header: z.object({
|
|
39
|
-
typ:
|
|
49
|
+
typ: CredentialFormat,
|
|
40
50
|
alg: z.string(),
|
|
41
51
|
kid: z.string().optional(),
|
|
52
|
+
x5c: z.string().optional(),
|
|
53
|
+
vctm: z.array(z.string()).optional(),
|
|
42
54
|
}),
|
|
43
55
|
payload: z.intersection(
|
|
44
56
|
z.object({
|
|
@@ -48,7 +60,7 @@ export const SdJwt4VC = z.object({
|
|
|
48
60
|
exp: UnixTime,
|
|
49
61
|
_sd_alg: z.literal("sha-256"),
|
|
50
62
|
status: z.object({
|
|
51
|
-
|
|
63
|
+
status_assertion: z.object({
|
|
52
64
|
credential_hash_alg: z.literal("sha-256"),
|
|
53
65
|
}),
|
|
54
66
|
}),
|
|
@@ -56,6 +68,8 @@ export const SdJwt4VC = z.object({
|
|
|
56
68
|
jwk: JWK,
|
|
57
69
|
}),
|
|
58
70
|
vct: z.string(),
|
|
71
|
+
"vct#integrity": z.string().optional(),
|
|
72
|
+
verification: Verification.optional(),
|
|
59
73
|
}),
|
|
60
74
|
ObfuscatedDisclosures
|
|
61
75
|
),
|
package/src/utils/error-codes.ts
CHANGED
|
@@ -1,21 +1,9 @@
|
|
|
1
1
|
export const IssuerResponseErrorCodes = {
|
|
2
2
|
IssuerGenericError: "ERR_ISSUER_GENERIC_ERROR",
|
|
3
|
-
/**
|
|
4
|
-
* Error code thrown when a credential cannot be issued immediately because it follows the async flow.
|
|
5
|
-
*/
|
|
6
|
-
CredentialIssuingNotSynchronous: "ERR_CREDENTIAL_ISSUING_NOT_SYNCHRONOUS",
|
|
7
3
|
/**
|
|
8
4
|
* Error code thrown when an error occurs while requesting a credential.
|
|
9
5
|
*/
|
|
10
6
|
CredentialRequestFailed: "ERR_CREDENTIAL_REQUEST_FAILED",
|
|
11
|
-
/**
|
|
12
|
-
* Error code thrown when a credential status is invalid, either during issuance or when requesting a status attestation.
|
|
13
|
-
*/
|
|
14
|
-
CredentialInvalidStatus: "ERR_CREDENTIAL_INVALID_STATUS",
|
|
15
|
-
/**
|
|
16
|
-
* Error code thrown when an error occurs while obtaining a status attestation for a credential.
|
|
17
|
-
*/
|
|
18
|
-
StatusAttestationRequestFailed: "ERR_STATUS_ATTESTATION_REQUEST_FAILED",
|
|
19
7
|
} as const;
|
|
20
8
|
|
|
21
9
|
export const WalletProviderResponseErrorCodes = {
|
package/src/utils/errors.ts
CHANGED
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
import type { ProblemDetail } from "../client/generated/wallet-provider";
|
|
2
|
-
import type { CredentialIssuerEntityConfiguration } from "../trust";
|
|
3
2
|
import {
|
|
4
3
|
IssuerResponseErrorCodes,
|
|
5
4
|
WalletProviderResponseErrorCodes,
|
|
@@ -149,91 +148,6 @@ export class WalletProviderResponseError extends UnexpectedStatusCodeError {
|
|
|
149
148
|
}
|
|
150
149
|
}
|
|
151
150
|
|
|
152
|
-
type LocalizedIssuanceError = {
|
|
153
|
-
[locale: string]: {
|
|
154
|
-
title: string;
|
|
155
|
-
description: string;
|
|
156
|
-
};
|
|
157
|
-
};
|
|
158
|
-
|
|
159
|
-
/**
|
|
160
|
-
* Function to extract the error message from the Entity Configuration's supported error codes.
|
|
161
|
-
* @param errorCode The error code to map to a meaningful message
|
|
162
|
-
* @param issuerConf The entity configuration for credentials
|
|
163
|
-
* @param credentialType The type of credential the error belongs to
|
|
164
|
-
* @returns A localized error {@link LocalizedIssuanceError} or undefined
|
|
165
|
-
* @throws {IoWalletError} When no credential config is found
|
|
166
|
-
*/
|
|
167
|
-
export function extractErrorMessageFromIssuerConf(
|
|
168
|
-
errorCode: string,
|
|
169
|
-
{
|
|
170
|
-
issuerConf,
|
|
171
|
-
credentialType,
|
|
172
|
-
}: {
|
|
173
|
-
issuerConf: CredentialIssuerEntityConfiguration["payload"]["metadata"];
|
|
174
|
-
credentialType: string;
|
|
175
|
-
}
|
|
176
|
-
): LocalizedIssuanceError | undefined {
|
|
177
|
-
const credentialConfiguration =
|
|
178
|
-
issuerConf.openid_credential_issuer.credential_configurations_supported[
|
|
179
|
-
credentialType
|
|
180
|
-
];
|
|
181
|
-
|
|
182
|
-
if (!credentialConfiguration) {
|
|
183
|
-
throw new IoWalletError(
|
|
184
|
-
`No configuration found for ${credentialType} in the provided EC`
|
|
185
|
-
);
|
|
186
|
-
}
|
|
187
|
-
|
|
188
|
-
const { issuance_errors_supported } = credentialConfiguration;
|
|
189
|
-
|
|
190
|
-
if (!issuance_errors_supported?.[errorCode]) {
|
|
191
|
-
return undefined;
|
|
192
|
-
}
|
|
193
|
-
|
|
194
|
-
const localesList = issuance_errors_supported[errorCode]!.display;
|
|
195
|
-
|
|
196
|
-
return localesList.reduce(
|
|
197
|
-
(acc, { locale, ...rest }) => ({ ...acc, [locale]: rest }),
|
|
198
|
-
{} as LocalizedIssuanceError
|
|
199
|
-
);
|
|
200
|
-
}
|
|
201
|
-
|
|
202
|
-
/**
|
|
203
|
-
* Type guard for issuer errors.
|
|
204
|
-
* @param error The error to check
|
|
205
|
-
* @param code Optional code to narrow down the issuer error
|
|
206
|
-
*/
|
|
207
|
-
export const isIssuerResponseError = (
|
|
208
|
-
error: unknown,
|
|
209
|
-
code?: IssuerResponseErrorCode
|
|
210
|
-
): error is IssuerResponseError =>
|
|
211
|
-
error instanceof IssuerResponseError && error.code === (code ?? error.code);
|
|
212
|
-
|
|
213
|
-
/**
|
|
214
|
-
* Type guard for wallet provider errors.
|
|
215
|
-
* @param error The error to check
|
|
216
|
-
* @param code Optional code to narrow down the wallet provider error
|
|
217
|
-
*/
|
|
218
|
-
export const isWalletProviderResponseError = (
|
|
219
|
-
error: unknown,
|
|
220
|
-
code?: WalletProviderResponseErrorCode
|
|
221
|
-
): error is WalletProviderResponseError =>
|
|
222
|
-
error instanceof WalletProviderResponseError &&
|
|
223
|
-
error.code === (code ?? error.code);
|
|
224
|
-
|
|
225
|
-
type ErrorCodeMap<T> = T extends typeof IssuerResponseError
|
|
226
|
-
? IssuerResponseErrorCode
|
|
227
|
-
: T extends typeof WalletProviderResponseError
|
|
228
|
-
? WalletProviderResponseErrorCode
|
|
229
|
-
: never;
|
|
230
|
-
|
|
231
|
-
type ErrorCase<T> = {
|
|
232
|
-
code: ErrorCodeMap<T>;
|
|
233
|
-
message: string;
|
|
234
|
-
reason?: GenericErrorReason;
|
|
235
|
-
};
|
|
236
|
-
|
|
237
151
|
/**
|
|
238
152
|
* Builder class used to create specialized errors from type {@link UnexpectedStatusCodeError} that handles multiple status codes.
|
|
239
153
|
*
|
|
@@ -271,3 +185,15 @@ export class ResponseErrorBuilder<T extends typeof UnexpectedStatusCodeError> {
|
|
|
271
185
|
return originalError;
|
|
272
186
|
}
|
|
273
187
|
}
|
|
188
|
+
|
|
189
|
+
type ErrorCodeMap<T> = T extends typeof IssuerResponseError
|
|
190
|
+
? IssuerResponseErrorCode
|
|
191
|
+
: T extends typeof WalletProviderResponseError
|
|
192
|
+
? WalletProviderResponseErrorCode
|
|
193
|
+
: never;
|
|
194
|
+
|
|
195
|
+
type ErrorCase<T> = {
|
|
196
|
+
code: ErrorCodeMap<T>;
|
|
197
|
+
message: string;
|
|
198
|
+
reason?: GenericErrorReason;
|
|
199
|
+
};
|
package/src/utils/jwk.ts
CHANGED
package/src/utils/par.ts
CHANGED
|
@@ -13,7 +13,6 @@ import { IssuerResponseError } from "./errors";
|
|
|
13
13
|
export type AuthorizationDetail = z.infer<typeof AuthorizationDetail>;
|
|
14
14
|
export const AuthorizationDetail = z.object({
|
|
15
15
|
credential_configuration_id: z.string(),
|
|
16
|
-
format: z.union([z.literal("vc+sd-jwt"), z.literal("vc+mdoc-cbor")]),
|
|
17
16
|
type: z.literal("openid_credential"),
|
|
18
17
|
});
|
|
19
18
|
|
|
@@ -38,8 +37,7 @@ export const makeParRequest =
|
|
|
38
37
|
responseMode: string,
|
|
39
38
|
parEndpoint: string,
|
|
40
39
|
walletInstanceAttestation: string,
|
|
41
|
-
authorizationDetails: AuthorizationDetails
|
|
42
|
-
assertionType: string
|
|
40
|
+
authorizationDetails: AuthorizationDetails
|
|
43
41
|
): Promise<string> => {
|
|
44
42
|
const wiaPublicKey = await wiaCryptoContext.getPublicKey();
|
|
45
43
|
|
|
@@ -85,8 +83,6 @@ export const makeParRequest =
|
|
|
85
83
|
code_challenge_method: codeChallengeMethod,
|
|
86
84
|
authorization_details: authorizationDetails,
|
|
87
85
|
redirect_uri: redirectUri,
|
|
88
|
-
client_assertion_type: assertionType,
|
|
89
|
-
client_assertion: walletInstanceAttestation + "~" + signedWiaPoP,
|
|
90
86
|
})
|
|
91
87
|
.setIssuedAt() //iat is set to now
|
|
92
88
|
.setExpirationTime("5min")
|
|
@@ -94,19 +90,16 @@ export const makeParRequest =
|
|
|
94
90
|
|
|
95
91
|
/** The request body for the Pushed Authorization Request */
|
|
96
92
|
var formBody = new URLSearchParams({
|
|
97
|
-
response_type: "code",
|
|
98
93
|
client_id: clientId,
|
|
99
|
-
code_challenge: codeChallenge,
|
|
100
|
-
code_challenge_method: "S256",
|
|
101
94
|
request: signedJwtForPar,
|
|
102
|
-
client_assertion_type: assertionType,
|
|
103
|
-
client_assertion: walletInstanceAttestation + "~" + signedWiaPoP,
|
|
104
95
|
});
|
|
105
96
|
|
|
106
97
|
return await appFetch(parEndpoint, {
|
|
107
98
|
method: "POST",
|
|
108
99
|
headers: {
|
|
109
100
|
"Content-Type": "application/x-www-form-urlencoded",
|
|
101
|
+
"OAuth-Client-Attestation": walletInstanceAttestation,
|
|
102
|
+
"OAuth-Client-Attestation-PoP": signedWiaPoP,
|
|
110
103
|
},
|
|
111
104
|
body: formBody.toString(),
|
|
112
105
|
})
|
|
@@ -1,27 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
|
|
3
|
-
Object.defineProperty(exports, "__esModule", {
|
|
4
|
-
value: true
|
|
5
|
-
});
|
|
6
|
-
exports.evaluateIssuerTrust = void 0;
|
|
7
|
-
var _trust = require("../../trust");
|
|
8
|
-
/**
|
|
9
|
-
* WARNING: This function must be called after {@link startFlow}. The next function to be called is {@link startUserAuthorization}.
|
|
10
|
-
* The Issuer trust evaluation phase.
|
|
11
|
-
* Fetch the Issuer's configuration and verify trust.
|
|
12
|
-
*
|
|
13
|
-
* @param issuerUrl The base url of the Issuer returned by {@link startFlow}
|
|
14
|
-
* @param context.appFetch (optional) fetch api implementation. Default: built-in fetch
|
|
15
|
-
* @returns The Issuer's configuration
|
|
16
|
-
*/
|
|
17
|
-
const evaluateIssuerTrust = async function (issuerUrl) {
|
|
18
|
-
let context = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
|
|
19
|
-
const issuerConf = await (0, _trust.getCredentialIssuerEntityConfiguration)(issuerUrl, {
|
|
20
|
-
appFetch: context.appFetch
|
|
21
|
-
}).then(_ => _.payload.metadata);
|
|
22
|
-
return {
|
|
23
|
-
issuerConf
|
|
24
|
-
};
|
|
25
|
-
};
|
|
26
|
-
exports.evaluateIssuerTrust = evaluateIssuerTrust;
|
|
27
|
-
//# sourceMappingURL=02-evaluate-issuer-trust.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"names":["_trust","require","evaluateIssuerTrust","issuerUrl","context","arguments","length","undefined","issuerConf","getCredentialIssuerEntityConfiguration","appFetch","then","_","payload","metadata","exports"],"sourceRoot":"../../../../src","sources":["credential/issuance/02-evaluate-issuer-trust.ts"],"mappings":";;;;;;AAAA,IAAAA,MAAA,GAAAC,OAAA;AAcA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO,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,MAAM,IAAAC,6CAAsC,EAACN,SAAS,EAAE;IACzEO,QAAQ,EAAEN,OAAO,CAACM;EACpB,CAAC,CAAC,CAACC,IAAI,CAAEC,CAAC,IAAKA,CAAC,CAACC,OAAO,CAACC,QAAQ,CAAC;EAClC,OAAO;IAAEN;EAAW,CAAC;AACvB,CAAC;AAACO,OAAA,CAAAb,mBAAA,GAAAA,mBAAA"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"names":["_reactNativeUuid","_interopRequireDefault","require","_ioReactNativeJwt","_dpop","_errors","_misc","_types","obj","__esModule","default","getRequestObject","requestUri","rpConf","_ref","wiaCryptoContext","appFetch","fetch","walletInstanceAttestation","signedWalletInstanceDPoP","createDPopToken","jti","uuid","v4","htm","htu","ath","sha256ToBase64","responseEncodedJwt","method","headers","Authorization","DPoP","then","hasStatusOrThrow","res","json","responseJson","response","responseJwt","decodeJwt","pubKey","wallet_relying_party","jwks","keys","find","_ref2","kid","protectedHeader","NoSuitableKeysFoundInEntityConfiguration","verify","requestObject","RequestObject","parse","payload","exports"],"sourceRoot":"../../../../src","sources":["credential/presentation/03-get-request-object.ts"],"mappings":";;;;;;AAAA,IAAAA,gBAAA,GAAAC,sBAAA,CAAAC,OAAA;AACA,IAAAC,iBAAA,GAAAD,OAAA;AAOA,IAAAE,KAAA,GAAAF,OAAA;AACA,IAAAG,OAAA,GAAAH,OAAA;AAEA,IAAAI,KAAA,GAAAJ,OAAA;AAEA,IAAAK,MAAA,GAAAL,OAAA;AAAwC,SAAAD,uBAAAO,GAAA,WAAAA,GAAA,IAAAA,GAAA,CAAAC,UAAA,GAAAD,GAAA,KAAAE,OAAA,EAAAF,GAAA;AAYxC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO,MAAMG,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,MAAM,IAAAC,qBAAe,EACpD;IACEC,GAAG,EAAG,GAAEC,wBAAI,CAACC,EAAE,CAAC,CAAE,EAAC;IACnBC,GAAG,EAAE,KAAK;IACVC,GAAG,EAAEb,UAAU;IACfc,GAAG,EAAE,MAAM,IAAAC,gCAAc,EAACT,yBAAyB;EACrD,CAAC,EACDH,gBACF,CAAC;EAED,MAAMa,kBAAkB,GAAG,MAAMZ,QAAQ,CAACJ,UAAU,EAAE;IACpDiB,MAAM,EAAE,KAAK;IACbC,OAAO,EAAE;MACPC,aAAa,EAAG,QAAOb,yBAA0B,EAAC;MAClDc,IAAI,EAAEb;IACR;EACF,CAAC,CAAC,CACCc,IAAI,CAAC,IAAAC,sBAAgB,EAAC,GAAG,CAAC,CAAC,CAC3BD,IAAI,CAAEE,GAAG,IAAKA,GAAG,CAACC,IAAI,CAAC,CAAC,CAAC,CACzBH,IAAI,CAAEI,YAAY,IAAKA,YAAY,CAACC,QAAQ,CAAC;EAEhD,MAAMC,WAAW,GAAG,IAAAC,wBAAS,EAACZ,kBAAkB,CAAC;;EAEjD;EACA;EACA;IACE,MAAMa,MAAM,GAAG5B,MAAM,CAAC6B,oBAAoB,CAACC,IAAI,CAACC,IAAI,CAACC,IAAI,CACvDC,KAAA;MAAA,IAAC;QAAEC;MAAI,CAAC,GAAAD,KAAA;MAAA,OAAKC,GAAG,KAAKR,WAAW,CAACS,eAAe,CAACD,GAAG;IAAA,CACtD,CAAC;IACD,IAAI,CAACN,MAAM,EAAE;MACX,MAAM,IAAIQ,gDAAwC,CAChD,uCACF,CAAC;IACH;IACA,MAAM,IAAAC,wBAAM,EAACtB,kBAAkB,EAAEa,MAAM,CAAC;EAC1C;;EAEA;EACA,MAAMU,aAAa,GAAGC,oBAAa,CAACC,KAAK,CAACd,WAAW,CAACe,OAAO,CAAC;EAE9D,OAAO;IACLH;EACF,CAAC;AACH,CAAC;AAACI,OAAA,CAAA5C,gBAAA,GAAAA,gBAAA"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"names":[],"sourceRoot":"../../../../src","sources":["credential/status/01-start-flow.ts"],"mappings":""}
|
|
@@ -1,72 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
|
|
3
|
-
Object.defineProperty(exports, "__esModule", {
|
|
4
|
-
value: true
|
|
5
|
-
});
|
|
6
|
-
exports.statusAttestation = void 0;
|
|
7
|
-
var _misc = require("../../utils/misc");
|
|
8
|
-
var _ioReactNativeJwt = require("@pagopa/io-react-native-jwt");
|
|
9
|
-
var _reactNativeUuid = _interopRequireDefault(require("react-native-uuid"));
|
|
10
|
-
var _types = require("./types");
|
|
11
|
-
var _errors = require("../../utils/errors");
|
|
12
|
-
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
13
|
-
/**
|
|
14
|
-
* WARNING: This function must be called after {@link startFlow}.
|
|
15
|
-
* Verify the status of the credential attestation.
|
|
16
|
-
* @param issuerConf - The issuer's configuration
|
|
17
|
-
* @param credential - The credential to be verified
|
|
18
|
-
* @param credentialCryptoContext - The credential's crypto context
|
|
19
|
-
* @param context.appFetch (optional) fetch api implementation. Default: built-in fetch
|
|
20
|
-
* @throws {IssuerResponseError} with a specific code for more context
|
|
21
|
-
* @returns The credential status attestation
|
|
22
|
-
*/
|
|
23
|
-
const statusAttestation = async function (issuerConf, credential, credentialCryptoContext) {
|
|
24
|
-
let appFetch = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : fetch;
|
|
25
|
-
const jwk = await credentialCryptoContext.getPublicKey();
|
|
26
|
-
const credentialHash = await (0, _misc.getCredentialHashWithouDiscloures)(credential);
|
|
27
|
-
const statusAttUrl = issuerConf.openid_credential_issuer.status_attestation_endpoint;
|
|
28
|
-
const credentialPop = await new _ioReactNativeJwt.SignJWT(credentialCryptoContext).setPayload({
|
|
29
|
-
aud: statusAttUrl,
|
|
30
|
-
jti: _reactNativeUuid.default.v4().toString(),
|
|
31
|
-
credential_hash: credentialHash,
|
|
32
|
-
credential_hash_alg: "S256"
|
|
33
|
-
}).setProtectedHeader({
|
|
34
|
-
alg: "ES256",
|
|
35
|
-
typ: "status-attestation-request+jwt",
|
|
36
|
-
kid: jwk.kid
|
|
37
|
-
}).setIssuedAt().setExpirationTime("5m").sign();
|
|
38
|
-
const body = {
|
|
39
|
-
credential_pop: credentialPop
|
|
40
|
-
};
|
|
41
|
-
const result = await appFetch(statusAttUrl, {
|
|
42
|
-
method: "POST",
|
|
43
|
-
headers: {
|
|
44
|
-
"Content-Type": "application/json"
|
|
45
|
-
},
|
|
46
|
-
body: JSON.stringify(body)
|
|
47
|
-
}).then((0, _misc.hasStatusOrThrow)(201)).then(raw => raw.json()).then(json => _types.StatusAttestationResponse.parse(json)).catch(handleStatusAttestationError);
|
|
48
|
-
return {
|
|
49
|
-
statusAttestation: result.status_attestation
|
|
50
|
-
};
|
|
51
|
-
};
|
|
52
|
-
|
|
53
|
-
/**
|
|
54
|
-
* Handle the status attestation error by mapping it to a custom exception.
|
|
55
|
-
* If the error is not an instance of {@link UnexpectedStatusCodeError}, it is thrown as is.
|
|
56
|
-
* @param e - The error to be handled
|
|
57
|
-
* @throws {IssuerResponseError} with a specific code for more context
|
|
58
|
-
*/
|
|
59
|
-
exports.statusAttestation = statusAttestation;
|
|
60
|
-
const handleStatusAttestationError = e => {
|
|
61
|
-
if (!(e instanceof _errors.UnexpectedStatusCodeError)) {
|
|
62
|
-
throw e;
|
|
63
|
-
}
|
|
64
|
-
throw new _errors.ResponseErrorBuilder(_errors.IssuerResponseError).handle(404, {
|
|
65
|
-
code: _errors.IssuerResponseErrorCodes.CredentialInvalidStatus,
|
|
66
|
-
message: "Invalid status found for the given credential"
|
|
67
|
-
}).handle("*", {
|
|
68
|
-
code: _errors.IssuerResponseErrorCodes.StatusAttestationRequestFailed,
|
|
69
|
-
message: `Unable to obtain the status attestation for the given credential`
|
|
70
|
-
}).buildFrom(e);
|
|
71
|
-
};
|
|
72
|
-
//# sourceMappingURL=02-status-attestation.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"names":["_misc","require","_ioReactNativeJwt","_reactNativeUuid","_interopRequireDefault","_types","_errors","obj","__esModule","default","statusAttestation","issuerConf","credential","credentialCryptoContext","appFetch","arguments","length","undefined","fetch","jwk","getPublicKey","credentialHash","getCredentialHashWithouDiscloures","statusAttUrl","openid_credential_issuer","status_attestation_endpoint","credentialPop","SignJWT","setPayload","aud","jti","uuid","v4","toString","credential_hash","credential_hash_alg","setProtectedHeader","alg","typ","kid","setIssuedAt","setExpirationTime","sign","body","credential_pop","result","method","headers","JSON","stringify","then","hasStatusOrThrow","raw","json","StatusAttestationResponse","parse","catch","handleStatusAttestationError","status_attestation","exports","e","UnexpectedStatusCodeError","ResponseErrorBuilder","IssuerResponseError","handle","code","IssuerResponseErrorCodes","CredentialInvalidStatus","message","StatusAttestationRequestFailed","buildFrom"],"sourceRoot":"../../../../src","sources":["credential/status/02-status-attestation.ts"],"mappings":";;;;;;AAAA,IAAAA,KAAA,GAAAC,OAAA;AAMA,IAAAC,iBAAA,GAAAD,OAAA;AACA,IAAAE,gBAAA,GAAAC,sBAAA,CAAAH,OAAA;AACA,IAAAI,MAAA,GAAAJ,OAAA;AACA,IAAAK,OAAA,GAAAL,OAAA;AAK4B,SAAAG,uBAAAG,GAAA,WAAAA,GAAA,IAAAA,GAAA,CAAAC,UAAA,GAAAD,GAAA,KAAAE,OAAA,EAAAF,GAAA;AAW5B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO,MAAMG,iBAAoC,GAAG,eAAAA,CAClDC,UAAU,EACVC,UAAU,EACVC,uBAAuB,EAEpB;EAAA,IADHC,QAA8B,GAAAC,SAAA,CAAAC,MAAA,QAAAD,SAAA,QAAAE,SAAA,GAAAF,SAAA,MAAGG,KAAK;EAEtC,MAAMC,GAAG,GAAG,MAAMN,uBAAuB,CAACO,YAAY,CAAC,CAAC;EACxD,MAAMC,cAAc,GAAG,MAAM,IAAAC,uCAAiC,EAACV,UAAU,CAAC;EAC1E,MAAMW,YAAY,GAChBZ,UAAU,CAACa,wBAAwB,CAACC,2BAA2B;EACjE,MAAMC,aAAa,GAAG,MAAM,IAAIC,yBAAO,CAACd,uBAAuB,CAAC,CAC7De,UAAU,CAAC;IACVC,GAAG,EAAEN,YAAY;IACjBO,GAAG,EAAEC,wBAAI,CAACC,EAAE,CAAC,CAAC,CAACC,QAAQ,CAAC,CAAC;IACzBC,eAAe,EAAEb,cAAc;IAC/Bc,mBAAmB,EAAE;EACvB,CAAC,CAAC,CACDC,kBAAkB,CAAC;IAClBC,GAAG,EAAE,OAAO;IACZC,GAAG,EAAE,gCAAgC;IACrCC,GAAG,EAAEpB,GAAG,CAACoB;EACX,CAAC,CAAC,CACDC,WAAW,CAAC,CAAC,CACbC,iBAAiB,CAAC,IAAI,CAAC,CACvBC,IAAI,CAAC,CAAC;EAET,MAAMC,IAAI,GAAG;IACXC,cAAc,EAAElB;EAClB,CAAC;EAED,MAAMmB,MAAM,GAAG,MAAM/B,QAAQ,CAACS,YAAY,EAAE;IAC1CuB,MAAM,EAAE,MAAM;IACdC,OAAO,EAAE;MACP,cAAc,EAAE;IAClB,CAAC;IACDJ,IAAI,EAAEK,IAAI,CAACC,SAAS,CAACN,IAAI;EAC3B,CAAC,CAAC,CACCO,IAAI,CAAC,IAAAC,sBAAgB,EAAC,GAAG,CAAC,CAAC,CAC3BD,IAAI,CAAEE,GAAG,IAAKA,GAAG,CAACC,IAAI,CAAC,CAAC,CAAC,CACzBH,IAAI,CAAEG,IAAI,IAAKC,gCAAyB,CAACC,KAAK,CAACF,IAAI,CAAC,CAAC,CACrDG,KAAK,CAACC,4BAA4B,CAAC;EAEtC,OAAO;IAAE/C,iBAAiB,EAAEmC,MAAM,CAACa;EAAmB,CAAC;AACzD,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AALAC,OAAA,CAAAjD,iBAAA,GAAAA,iBAAA;AAMA,MAAM+C,4BAA4B,GAAIG,CAAU,IAAK;EACnD,IAAI,EAAEA,CAAC,YAAYC,iCAAyB,CAAC,EAAE;IAC7C,MAAMD,CAAC;EACT;EAEA,MAAM,IAAIE,4BAAoB,CAACC,2BAAmB,CAAC,CAChDC,MAAM,CAAC,GAAG,EAAE;IACXC,IAAI,EAAEC,gCAAwB,CAACC,uBAAuB;IACtDC,OAAO,EAAE;EACX,CAAC,CAAC,CACDJ,MAAM,CAAC,GAAG,EAAE;IACXC,IAAI,EAAEC,gCAAwB,CAACG,8BAA8B;IAC7DD,OAAO,EAAG;EACZ,CAAC,CAAC,CACDE,SAAS,CAACV,CAAC,CAAC;AACjB,CAAC"}
|
|
@@ -1,52 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
|
|
3
|
-
Object.defineProperty(exports, "__esModule", {
|
|
4
|
-
value: true
|
|
5
|
-
});
|
|
6
|
-
exports.verifyAndParseStatusAttestation = void 0;
|
|
7
|
-
var _errors = require("../../utils/errors");
|
|
8
|
-
var _ioReactNativeJwt = require("@pagopa/io-react-native-jwt");
|
|
9
|
-
var _types = require("./types");
|
|
10
|
-
/**
|
|
11
|
-
* Given a status attestation, verifies that:
|
|
12
|
-
* - It's in the supported format;
|
|
13
|
-
* - The attestation is correctly signed;
|
|
14
|
-
* - It's bound to the given key.
|
|
15
|
-
* @param issuerConf The Issuer configuration returned by {@link evaluateIssuerTrust}
|
|
16
|
-
* @param statusAttestation The encoded status attestation returned by {@link statusAttestation}
|
|
17
|
-
* @param context.credentialCryptoContext The crypto context used to obtain the credential in {@link obtainCredential}
|
|
18
|
-
* @returns A parsed status attestation
|
|
19
|
-
* @throws {IoWalletError} If the credential signature is not verified with the Issuer key set
|
|
20
|
-
* @throws {IoWalletError} If the credential is not bound to the provided user key
|
|
21
|
-
* @throws {IoWalletError} If the credential data fail to parse
|
|
22
|
-
*/
|
|
23
|
-
const verifyAndParseStatusAttestation = async (issuerConf, rawStatusAttestation, context) => {
|
|
24
|
-
try {
|
|
25
|
-
const {
|
|
26
|
-
statusAttestation
|
|
27
|
-
} = rawStatusAttestation;
|
|
28
|
-
const {
|
|
29
|
-
credentialCryptoContext
|
|
30
|
-
} = context;
|
|
31
|
-
await (0, _ioReactNativeJwt.verify)(statusAttestation, issuerConf.openid_credential_issuer.jwks.keys);
|
|
32
|
-
const decodedJwt = (0, _ioReactNativeJwt.decode)(statusAttestation);
|
|
33
|
-
const parsedStatusAttestation = _types.ParsedStatusAttestation.parse({
|
|
34
|
-
header: decodedJwt.protectedHeader,
|
|
35
|
-
payload: decodedJwt.payload
|
|
36
|
-
});
|
|
37
|
-
const holderBindingKey = await credentialCryptoContext.getPublicKey();
|
|
38
|
-
const {
|
|
39
|
-
cnf
|
|
40
|
-
} = parsedStatusAttestation.payload;
|
|
41
|
-
if (!cnf.jwk.kid || cnf.jwk.kid !== holderBindingKey.kid) {
|
|
42
|
-
throw new _errors.IoWalletError(`Failed to verify holder binding for status attestation, expected kid: ${holderBindingKey.kid}, got: ${parsedStatusAttestation.payload.cnf.jwk.kid}`);
|
|
43
|
-
}
|
|
44
|
-
return {
|
|
45
|
-
parsedStatusAttestation
|
|
46
|
-
};
|
|
47
|
-
} catch (e) {
|
|
48
|
-
throw new _errors.IoWalletError(`Failed to verify status attestation: ${JSON.stringify(e)}`);
|
|
49
|
-
}
|
|
50
|
-
};
|
|
51
|
-
exports.verifyAndParseStatusAttestation = verifyAndParseStatusAttestation;
|
|
52
|
-
//# sourceMappingURL=03-verify-and-parse-status-attestation.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"names":["_errors","require","_ioReactNativeJwt","_types","verifyAndParseStatusAttestation","issuerConf","rawStatusAttestation","context","statusAttestation","credentialCryptoContext","verify","openid_credential_issuer","jwks","keys","decodedJwt","decodeJwt","parsedStatusAttestation","ParsedStatusAttestation","parse","header","protectedHeader","payload","holderBindingKey","getPublicKey","cnf","jwk","kid","IoWalletError","e","JSON","stringify","exports"],"sourceRoot":"../../../../src","sources":["credential/status/03-verify-and-parse-status-attestation.ts"],"mappings":";;;;;;AACA,IAAAA,OAAA,GAAAC,OAAA;AACA,IAAAC,iBAAA,GAAAD,OAAA;AAEA,IAAAE,MAAA,GAAAF,OAAA;AAWA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO,MAAMG,+BAAgE,GAC3E,MAAAA,CAAOC,UAAU,EAAEC,oBAAoB,EAAEC,OAAO,KAAK;EACnD,IAAI;IACF,MAAM;MAAEC;IAAkB,CAAC,GAAGF,oBAAoB;IAClD,MAAM;MAAEG;IAAwB,CAAC,GAAGF,OAAO;IAE3C,MAAM,IAAAG,wBAAM,EACVF,iBAAiB,EACjBH,UAAU,CAACM,wBAAwB,CAACC,IAAI,CAACC,IAC3C,CAAC;IAED,MAAMC,UAAU,GAAG,IAAAC,wBAAS,EAACP,iBAAiB,CAAC;IAC/C,MAAMQ,uBAAuB,GAAGC,8BAAuB,CAACC,KAAK,CAAC;MAC5DC,MAAM,EAAEL,UAAU,CAACM,eAAe;MAClCC,OAAO,EAAEP,UAAU,CAACO;IACtB,CAAC,CAAC;IAEF,MAAMC,gBAAgB,GAAG,MAAMb,uBAAuB,CAACc,YAAY,CAAC,CAAC;IACrE,MAAM;MAAEC;IAAI,CAAC,GAAGR,uBAAuB,CAACK,OAAO;IAC/C,IAAI,CAACG,GAAG,CAACC,GAAG,CAACC,GAAG,IAAIF,GAAG,CAACC,GAAG,CAACC,GAAG,KAAKJ,gBAAgB,CAACI,GAAG,EAAE;MACxD,MAAM,IAAIC,qBAAa,CACpB,yEAAwEL,gBAAgB,CAACI,GAAI,UAASV,uBAAuB,CAACK,OAAO,CAACG,GAAG,CAACC,GAAG,CAACC,GAAI,EACrJ,CAAC;IACH;IAEA,OAAO;MAAEV;IAAwB,CAAC;EACpC,CAAC,CAAC,OAAOY,CAAC,EAAE;IACV,MAAM,IAAID,qBAAa,CACpB,wCAAuCE,IAAI,CAACC,SAAS,CAACF,CAAC,CAAE,EAC5D,CAAC;EACH;AACF,CAAC;AAACG,OAAA,CAAA3B,+BAAA,GAAAA,+BAAA"}
|
|
@@ -1,67 +0,0 @@
|
|
|
1
|
-
# Credential Status Attestation
|
|
2
|
-
|
|
3
|
-
This flow is used to obtain a credential status attestation from its credential issuer. Each step in the flow is imported from the related file which is named with a sequential number.
|
|
4
|
-
The credential status attestation is a JWT which contains the credential status which indicates if the credential is valid or not.
|
|
5
|
-
The status attestation is supposed to be stored securely along with the credential. It has a limited lifetime and should be refreshed periodically according to the `exp` field in the JWT payload.
|
|
6
|
-
|
|
7
|
-
## Sequence Diagram
|
|
8
|
-
|
|
9
|
-
```mermaid
|
|
10
|
-
graph TD;
|
|
11
|
-
0[startFlow]
|
|
12
|
-
1[statusAttestation]
|
|
13
|
-
2[verifyAndParseStatusAttestation]
|
|
14
|
-
|
|
15
|
-
0 --> 1
|
|
16
|
-
1 --> 2
|
|
17
|
-
```
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
## Mapped results
|
|
21
|
-
|
|
22
|
-
The following errors are mapped to a `IssuerResponseError` with specific codes.
|
|
23
|
-
|
|
24
|
-
|HTTP Status|Error Code|Description|
|
|
25
|
-
|-----------|----------|-----------|
|
|
26
|
-
|`404 Not Found`|`ERR_CREDENTIAL_INVALID_STATUS`|This response is returned by the credential issuer when the status attestation is invalid. It might contain more details in the `reason` property.|
|
|
27
|
-
|
|
28
|
-
## Example
|
|
29
|
-
|
|
30
|
-
<details>
|
|
31
|
-
<summary>Credential status attestation flow</summary>
|
|
32
|
-
|
|
33
|
-
```ts
|
|
34
|
-
// Start the issuance flow
|
|
35
|
-
const credentialIssuerUrl = "https://issuer.example.com";
|
|
36
|
-
const startFlow: Credential.Status.StartFlow = () => ({
|
|
37
|
-
issuerUrl: credentialIssuerUrl, // Let's assum
|
|
38
|
-
});
|
|
39
|
-
|
|
40
|
-
const { issuerUrl } = startFlow();
|
|
41
|
-
|
|
42
|
-
// Evaluate issuer trust
|
|
43
|
-
const { issuerConf } = await Credential.Status.evaluateIssuerTrust(issuerUrl);
|
|
44
|
-
|
|
45
|
-
// Get the credential attestation
|
|
46
|
-
const res = await Credential.Status.statusAttestation(
|
|
47
|
-
issuerConf,
|
|
48
|
-
credential,
|
|
49
|
-
credentialCryptoContext
|
|
50
|
-
);
|
|
51
|
-
|
|
52
|
-
// Verify and parse the status attestation
|
|
53
|
-
const { parsedStatusAttestation } =
|
|
54
|
-
await Credential.Status.verifyAndParseStatusAttestation(
|
|
55
|
-
issuerConf,
|
|
56
|
-
res.statusAttestation,
|
|
57
|
-
{ credentialCryptoContext }
|
|
58
|
-
);
|
|
59
|
-
|
|
60
|
-
return {
|
|
61
|
-
statusAttestation: res.statusAttestation,
|
|
62
|
-
parsedStatusAttestation,
|
|
63
|
-
credentialType,
|
|
64
|
-
};
|
|
65
|
-
```
|
|
66
|
-
|
|
67
|
-
</details>
|
|
@@ -1,27 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
|
|
3
|
-
Object.defineProperty(exports, "__esModule", {
|
|
4
|
-
value: true
|
|
5
|
-
});
|
|
6
|
-
Object.defineProperty(exports, "evaluateIssuerTrust", {
|
|
7
|
-
enumerable: true,
|
|
8
|
-
get: function () {
|
|
9
|
-
return _issuance.evaluateIssuerTrust;
|
|
10
|
-
}
|
|
11
|
-
});
|
|
12
|
-
Object.defineProperty(exports, "statusAttestation", {
|
|
13
|
-
enumerable: true,
|
|
14
|
-
get: function () {
|
|
15
|
-
return _statusAttestation.statusAttestation;
|
|
16
|
-
}
|
|
17
|
-
});
|
|
18
|
-
Object.defineProperty(exports, "verifyAndParseStatusAttestation", {
|
|
19
|
-
enumerable: true,
|
|
20
|
-
get: function () {
|
|
21
|
-
return _verifyAndParseStatusAttestation.verifyAndParseStatusAttestation;
|
|
22
|
-
}
|
|
23
|
-
});
|
|
24
|
-
var _statusAttestation = require("./02-status-attestation");
|
|
25
|
-
var _issuance = require("../issuance");
|
|
26
|
-
var _verifyAndParseStatusAttestation = require("./03-verify-and-parse-status-attestation");
|
|
27
|
-
//# sourceMappingURL=index.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"names":["_statusAttestation","require","_issuance","_verifyAndParseStatusAttestation"],"sourceRoot":"../../../../src","sources":["credential/status/index.ts"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;AACA,IAAAA,kBAAA,GAAAC,OAAA;AAIA,IAAAC,SAAA,GAAAD,OAAA;AACA,IAAAE,gCAAA,GAAAF,OAAA"}
|
|
@@ -1,48 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
|
|
3
|
-
Object.defineProperty(exports, "__esModule", {
|
|
4
|
-
value: true
|
|
5
|
-
});
|
|
6
|
-
exports.StatusAttestationResponse = exports.ParsedStatusAttestation = void 0;
|
|
7
|
-
var _types = require("../../sd-jwt/types");
|
|
8
|
-
var _jwk = require("../../utils/jwk");
|
|
9
|
-
var z = _interopRequireWildcard(require("zod"));
|
|
10
|
-
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); }
|
|
11
|
-
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; }
|
|
12
|
-
/**
|
|
13
|
-
* Shape from parsing a status attestation response in case of 201.
|
|
14
|
-
*/
|
|
15
|
-
const StatusAttestationResponse = z.object({
|
|
16
|
-
status_attestation: z.string()
|
|
17
|
-
});
|
|
18
|
-
|
|
19
|
-
/**
|
|
20
|
-
* Type from parsing a status attestation response in case of 201.
|
|
21
|
-
* Inferred from {@link StatusAttestationResponse}.
|
|
22
|
-
*/
|
|
23
|
-
|
|
24
|
-
/**
|
|
25
|
-
* Type for a parsed status attestation.
|
|
26
|
-
*/
|
|
27
|
-
exports.StatusAttestationResponse = StatusAttestationResponse;
|
|
28
|
-
/**
|
|
29
|
-
* Shape for parsing a status attestation in a JWT.
|
|
30
|
-
*/
|
|
31
|
-
const ParsedStatusAttestation = z.object({
|
|
32
|
-
header: z.object({
|
|
33
|
-
typ: z.literal("status-attestation+jwt"),
|
|
34
|
-
alg: z.string(),
|
|
35
|
-
kid: z.string().optional()
|
|
36
|
-
}),
|
|
37
|
-
payload: z.object({
|
|
38
|
-
credential_hash_alg: z.string(),
|
|
39
|
-
credential_hash: z.string(),
|
|
40
|
-
cnf: z.object({
|
|
41
|
-
jwk: _jwk.JWK
|
|
42
|
-
}),
|
|
43
|
-
exp: _types.UnixTime,
|
|
44
|
-
iat: _types.UnixTime
|
|
45
|
-
})
|
|
46
|
-
});
|
|
47
|
-
exports.ParsedStatusAttestation = ParsedStatusAttestation;
|
|
48
|
-
//# sourceMappingURL=types.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"names":["_types","require","_jwk","z","_interopRequireWildcard","_getRequireWildcardCache","nodeInterop","WeakMap","cacheBabelInterop","cacheNodeInterop","obj","__esModule","default","cache","has","get","newObj","hasPropertyDescriptor","Object","defineProperty","getOwnPropertyDescriptor","key","prototype","hasOwnProperty","call","desc","set","StatusAttestationResponse","object","status_attestation","string","exports","ParsedStatusAttestation","header","typ","literal","alg","kid","optional","payload","credential_hash_alg","credential_hash","cnf","jwk","JWK","exp","UnixTime","iat"],"sourceRoot":"../../../../src","sources":["credential/status/types.ts"],"mappings":";;;;;;AAAA,IAAAA,MAAA,GAAAC,OAAA;AACA,IAAAC,IAAA,GAAAD,OAAA;AACA,IAAAE,CAAA,GAAAC,uBAAA,CAAAH,OAAA;AAAyB,SAAAI,yBAAAC,WAAA,eAAAC,OAAA,kCAAAC,iBAAA,OAAAD,OAAA,QAAAE,gBAAA,OAAAF,OAAA,YAAAF,wBAAA,YAAAA,CAAAC,WAAA,WAAAA,WAAA,GAAAG,gBAAA,GAAAD,iBAAA,KAAAF,WAAA;AAAA,SAAAF,wBAAAM,GAAA,EAAAJ,WAAA,SAAAA,WAAA,IAAAI,GAAA,IAAAA,GAAA,CAAAC,UAAA,WAAAD,GAAA,QAAAA,GAAA,oBAAAA,GAAA,wBAAAA,GAAA,4BAAAE,OAAA,EAAAF,GAAA,UAAAG,KAAA,GAAAR,wBAAA,CAAAC,WAAA,OAAAO,KAAA,IAAAA,KAAA,CAAAC,GAAA,CAAAJ,GAAA,YAAAG,KAAA,CAAAE,GAAA,CAAAL,GAAA,SAAAM,MAAA,WAAAC,qBAAA,GAAAC,MAAA,CAAAC,cAAA,IAAAD,MAAA,CAAAE,wBAAA,WAAAC,GAAA,IAAAX,GAAA,QAAAW,GAAA,kBAAAH,MAAA,CAAAI,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAAd,GAAA,EAAAW,GAAA,SAAAI,IAAA,GAAAR,qBAAA,GAAAC,MAAA,CAAAE,wBAAA,CAAAV,GAAA,EAAAW,GAAA,cAAAI,IAAA,KAAAA,IAAA,CAAAV,GAAA,IAAAU,IAAA,CAAAC,GAAA,KAAAR,MAAA,CAAAC,cAAA,CAAAH,MAAA,EAAAK,GAAA,EAAAI,IAAA,YAAAT,MAAA,CAAAK,GAAA,IAAAX,GAAA,CAAAW,GAAA,SAAAL,MAAA,CAAAJ,OAAA,GAAAF,GAAA,MAAAG,KAAA,IAAAA,KAAA,CAAAa,GAAA,CAAAhB,GAAA,EAAAM,MAAA,YAAAA,MAAA;AAEzB;AACA;AACA;AACO,MAAMW,yBAAyB,GAAGxB,CAAC,CAACyB,MAAM,CAAC;EAChDC,kBAAkB,EAAE1B,CAAC,CAAC2B,MAAM,CAAC;AAC/B,CAAC,CAAC;;AAEF;AACA;AACA;AACA;;AAKA;AACA;AACA;AAFAC,OAAA,CAAAJ,yBAAA,GAAAA,yBAAA;AAKA;AACA;AACA;AACO,MAAMK,uBAAuB,GAAG7B,CAAC,CAACyB,MAAM,CAAC;EAC9CK,MAAM,EAAE9B,CAAC,CAACyB,MAAM,CAAC;IACfM,GAAG,EAAE/B,CAAC,CAACgC,OAAO,CAAC,wBAAwB,CAAC;IACxCC,GAAG,EAAEjC,CAAC,CAAC2B,MAAM,CAAC,CAAC;IACfO,GAAG,EAAElC,CAAC,CAAC2B,MAAM,CAAC,CAAC,CAACQ,QAAQ,CAAC;EAC3B,CAAC,CAAC;EACFC,OAAO,EAAEpC,CAAC,CAACyB,MAAM,CAAC;IAChBY,mBAAmB,EAAErC,CAAC,CAAC2B,MAAM,CAAC,CAAC;IAC/BW,eAAe,EAAEtC,CAAC,CAAC2B,MAAM,CAAC,CAAC;IAC3BY,GAAG,EAAEvC,CAAC,CAACyB,MAAM,CAAC;MACZe,GAAG,EAAEC;IACP,CAAC,CAAC;IACFC,GAAG,EAAEC,eAAQ;IACbC,GAAG,EAAED;EACP,CAAC;AACH,CAAC,CAAC;AAACf,OAAA,CAAAC,uBAAA,GAAAA,uBAAA"}
|