@pagopa/io-react-native-wallet 0.27.0 → 1.1.0
Sign up to get free protection for your applications and to get access to all the features.
- 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"}
|