@pagopa/io-react-native-wallet 0.11.1 → 0.13.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/client/generated/wallet-provider.js +126 -0
- package/lib/commonjs/client/generated/wallet-provider.js.map +1 -0
- package/lib/commonjs/client/index.js +40 -0
- package/lib/commonjs/client/index.js.map +1 -0
- package/lib/commonjs/credential/issuance/02-evaluate-issuer-trust.js +2 -1
- package/lib/commonjs/credential/issuance/02-evaluate-issuer-trust.js.map +1 -1
- package/lib/commonjs/credential/issuance/03-start-credential-issuance.js +287 -0
- package/lib/commonjs/credential/issuance/03-start-credential-issuance.js.map +1 -0
- package/lib/commonjs/credential/issuance/03-start-user-authorization.js +56 -83
- package/lib/commonjs/credential/issuance/03-start-user-authorization.js.map +1 -1
- package/lib/commonjs/credential/issuance/04-complete-user-authorization.js +88 -0
- package/lib/commonjs/credential/issuance/04-complete-user-authorization.js.map +1 -1
- package/lib/commonjs/credential/issuance/05-authorize-access.js +56 -33
- package/lib/commonjs/credential/issuance/05-authorize-access.js.map +1 -1
- package/lib/commonjs/credential/issuance/06-obtain-credential.js +51 -78
- package/lib/commonjs/credential/issuance/06-obtain-credential.js.map +1 -1
- package/lib/commonjs/credential/issuance/07-verify-and-parse-credential.js +21 -44
- package/lib/commonjs/credential/issuance/07-verify-and-parse-credential.js.map +1 -1
- package/lib/commonjs/credential/issuance/index.js +7 -0
- package/lib/commonjs/credential/issuance/index.js.map +1 -1
- package/lib/commonjs/credential/issuance/types.js +28 -0
- package/lib/commonjs/credential/issuance/types.js.map +1 -0
- package/lib/commonjs/index.js +10 -1
- package/lib/commonjs/index.js.map +1 -1
- package/lib/commonjs/pid/sd-jwt/converters.js +5 -9
- package/lib/commonjs/pid/sd-jwt/converters.js.map +1 -1
- package/lib/commonjs/pid/sd-jwt/types.js +3 -3
- package/lib/commonjs/pid/sd-jwt/types.js.map +1 -1
- package/lib/commonjs/sd-jwt/__test__/converters.test.js +1 -1
- package/lib/commonjs/sd-jwt/__test__/converters.test.js.map +1 -1
- package/lib/commonjs/sd-jwt/__test__/index.test.js +30 -43
- package/lib/commonjs/sd-jwt/__test__/index.test.js.map +1 -1
- package/lib/commonjs/sd-jwt/__test__/types.test.js +16 -24
- package/lib/commonjs/sd-jwt/__test__/types.test.js.map +1 -1
- package/lib/commonjs/sd-jwt/index.js +3 -9
- package/lib/commonjs/sd-jwt/index.js.map +1 -1
- package/lib/commonjs/sd-jwt/types.js +11 -16
- package/lib/commonjs/sd-jwt/types.js.map +1 -1
- package/lib/commonjs/trust/types.js +70 -29
- package/lib/commonjs/trust/types.js.map +1 -1
- package/lib/commonjs/utils/auth.js +44 -0
- package/lib/commonjs/utils/auth.js.map +1 -0
- package/lib/commonjs/utils/errors.js +104 -1
- package/lib/commonjs/utils/errors.js.map +1 -1
- package/lib/commonjs/utils/integrity.js +2 -0
- package/lib/commonjs/utils/integrity.js.map +1 -0
- package/lib/commonjs/utils/misc.js +34 -1
- package/lib/commonjs/utils/misc.js.map +1 -1
- package/lib/commonjs/utils/par.js +23 -15
- package/lib/commonjs/utils/par.js.map +1 -1
- package/lib/commonjs/utils/pop.js +33 -0
- package/lib/commonjs/utils/pop.js.map +1 -0
- package/lib/commonjs/wallet-instance/index.js +29 -0
- package/lib/commonjs/wallet-instance/index.js.map +1 -0
- package/lib/commonjs/wallet-instance-attestation/issuing.js +62 -65
- package/lib/commonjs/wallet-instance-attestation/issuing.js.map +1 -1
- package/lib/commonjs/wallet-instance-attestation/types.js +8 -8
- package/lib/commonjs/wallet-instance-attestation/types.js.map +1 -1
- package/lib/module/client/generated/wallet-provider.js +102 -0
- package/lib/module/client/generated/wallet-provider.js.map +1 -0
- package/lib/module/client/index.js +33 -0
- package/lib/module/client/index.js.map +1 -0
- package/lib/module/credential/issuance/02-evaluate-issuer-trust.js +2 -1
- package/lib/module/credential/issuance/02-evaluate-issuer-trust.js.map +1 -1
- package/lib/module/credential/issuance/03-start-credential-issuance.js +276 -0
- package/lib/module/credential/issuance/03-start-credential-issuance.js.map +1 -0
- package/lib/module/credential/issuance/03-start-user-authorization.js +56 -80
- package/lib/module/credential/issuance/03-start-user-authorization.js.map +1 -1
- package/lib/module/credential/issuance/04-complete-user-authorization.js +85 -1
- package/lib/module/credential/issuance/04-complete-user-authorization.js.map +1 -1
- package/lib/module/credential/issuance/05-authorize-access.js +54 -33
- package/lib/module/credential/issuance/05-authorize-access.js.map +1 -1
- package/lib/module/credential/issuance/06-obtain-credential.js +50 -75
- package/lib/module/credential/issuance/06-obtain-credential.js.map +1 -1
- package/lib/module/credential/issuance/07-verify-and-parse-credential.js +21 -44
- package/lib/module/credential/issuance/07-verify-and-parse-credential.js.map +1 -1
- package/lib/module/credential/issuance/index.js +2 -1
- package/lib/module/credential/issuance/index.js.map +1 -1
- package/lib/module/credential/issuance/types.js +18 -0
- package/lib/module/credential/issuance/types.js.map +1 -0
- package/lib/module/index.js +3 -1
- package/lib/module/index.js.map +1 -1
- package/lib/module/pid/sd-jwt/converters.js +5 -9
- package/lib/module/pid/sd-jwt/converters.js.map +1 -1
- package/lib/module/pid/sd-jwt/types.js +3 -3
- package/lib/module/pid/sd-jwt/types.js.map +1 -1
- package/lib/module/sd-jwt/__test__/converters.test.js +1 -1
- package/lib/module/sd-jwt/__test__/converters.test.js.map +1 -1
- package/lib/module/sd-jwt/__test__/index.test.js +30 -43
- package/lib/module/sd-jwt/__test__/index.test.js.map +1 -1
- package/lib/module/sd-jwt/__test__/types.test.js +16 -24
- package/lib/module/sd-jwt/__test__/types.test.js.map +1 -1
- package/lib/module/sd-jwt/index.js +3 -9
- package/lib/module/sd-jwt/index.js.map +1 -1
- package/lib/module/sd-jwt/types.js +11 -16
- package/lib/module/sd-jwt/types.js.map +1 -1
- package/lib/module/trust/types.js +70 -29
- package/lib/module/trust/types.js.map +1 -1
- package/lib/module/utils/auth.js +35 -0
- package/lib/module/utils/auth.js.map +1 -0
- package/lib/module/utils/errors.js +98 -0
- package/lib/module/utils/errors.js.map +1 -1
- package/lib/module/utils/integrity.js +2 -0
- package/lib/module/utils/integrity.js.map +1 -0
- package/lib/module/utils/misc.js +31 -0
- package/lib/module/utils/misc.js.map +1 -1
- package/lib/module/utils/par.js +24 -16
- package/lib/module/utils/par.js.map +1 -1
- package/lib/module/utils/pop.js +24 -0
- package/lib/module/utils/pop.js.map +1 -0
- package/lib/module/wallet-instance/index.js +23 -0
- package/lib/module/wallet-instance/index.js.map +1 -0
- package/lib/module/wallet-instance-attestation/issuing.js +63 -67
- package/lib/module/wallet-instance-attestation/issuing.js.map +1 -1
- package/lib/module/wallet-instance-attestation/types.js +8 -8
- package/lib/module/wallet-instance-attestation/types.js.map +1 -1
- package/lib/typescript/client/generated/wallet-provider.d.ts +264 -0
- package/lib/typescript/client/generated/wallet-provider.d.ts.map +1 -0
- package/lib/typescript/client/index.d.ts +7 -0
- package/lib/typescript/client/index.d.ts.map +1 -0
- package/lib/typescript/credential/issuance/01-start-flow.d.ts +1 -0
- package/lib/typescript/credential/issuance/01-start-flow.d.ts.map +1 -1
- package/lib/typescript/credential/issuance/02-evaluate-issuer-trust.d.ts +2 -1
- package/lib/typescript/credential/issuance/02-evaluate-issuer-trust.d.ts.map +1 -1
- package/lib/typescript/credential/issuance/03-start-credential-issuance.d.ts +41 -0
- package/lib/typescript/credential/issuance/03-start-credential-issuance.d.ts.map +1 -0
- package/lib/typescript/credential/issuance/03-start-user-authorization.d.ts +23 -18
- 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 +24 -12
- package/lib/typescript/credential/issuance/04-complete-user-authorization.d.ts.map +1 -1
- package/lib/typescript/credential/issuance/05-authorize-access.d.ts +22 -16
- package/lib/typescript/credential/issuance/05-authorize-access.d.ts.map +1 -1
- package/lib/typescript/credential/issuance/06-obtain-credential.d.ts +19 -26
- 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 +10 -15
- package/lib/typescript/credential/issuance/07-verify-and-parse-credential.d.ts.map +1 -1
- package/lib/typescript/credential/issuance/index.d.ts +3 -4
- package/lib/typescript/credential/issuance/index.d.ts.map +1 -1
- package/lib/typescript/credential/issuance/types.d.ts +63 -0
- package/lib/typescript/credential/issuance/types.d.ts.map +1 -0
- package/lib/typescript/credential/presentation/types.d.ts +6 -6
- package/lib/typescript/index.d.ts +6 -1
- package/lib/typescript/index.d.ts.map +1 -1
- package/lib/typescript/pid/sd-jwt/converters.d.ts.map +1 -1
- package/lib/typescript/pid/sd-jwt/types.d.ts +36 -36
- package/lib/typescript/pid/sd-jwt/types.d.ts.map +1 -1
- package/lib/typescript/sd-jwt/index.d.ts +40 -68
- package/lib/typescript/sd-jwt/index.d.ts.map +1 -1
- package/lib/typescript/sd-jwt/types.d.ts +64 -121
- package/lib/typescript/sd-jwt/types.d.ts.map +1 -1
- package/lib/typescript/trust/index.d.ts +150 -48
- package/lib/typescript/trust/index.d.ts.map +1 -1
- package/lib/typescript/trust/types.d.ts +2838 -1740
- package/lib/typescript/trust/types.d.ts.map +1 -1
- package/lib/typescript/utils/auth.d.ts +52 -0
- package/lib/typescript/utils/auth.d.ts.map +1 -0
- package/lib/typescript/utils/errors.d.ts +48 -0
- package/lib/typescript/utils/errors.d.ts.map +1 -1
- package/lib/typescript/utils/integrity.d.ts +21 -0
- package/lib/typescript/utils/integrity.d.ts.map +1 -0
- package/lib/typescript/utils/misc.d.ts +18 -0
- package/lib/typescript/utils/misc.d.ts.map +1 -1
- package/lib/typescript/utils/par.d.ts +8 -31
- package/lib/typescript/utils/par.d.ts.map +1 -1
- package/lib/typescript/utils/pop.d.ts +26 -0
- package/lib/typescript/utils/pop.d.ts.map +1 -0
- package/lib/typescript/wallet-instance/index.d.ts +7 -0
- package/lib/typescript/wallet-instance/index.d.ts.map +1 -0
- package/lib/typescript/wallet-instance-attestation/issuing.d.ts +17 -4
- package/lib/typescript/wallet-instance-attestation/issuing.d.ts.map +1 -1
- package/lib/typescript/wallet-instance-attestation/types.d.ts +64 -64
- package/lib/typescript/wallet-instance-attestation/types.d.ts.map +1 -1
- package/package.json +9 -5
- package/src/client/generated/wallet-provider.ts +173 -0
- package/src/client/index.ts +53 -0
- package/src/credential/issuance/01-start-flow.ts +1 -0
- package/src/credential/issuance/02-evaluate-issuer-trust.ts +2 -1
- package/src/credential/issuance/03-start-credential-issuance.ts +407 -0
- package/src/credential/issuance/03-start-user-authorization.ts +91 -92
- package/src/credential/issuance/04-complete-user-authorization.ts +114 -13
- package/src/credential/issuance/05-authorize-access.ts +74 -49
- package/src/credential/issuance/06-obtain-credential.ts +77 -111
- package/src/credential/issuance/07-verify-and-parse-credential.ts +30 -67
- package/src/credential/issuance/index.ts +6 -4
- package/src/credential/issuance/types.ts +25 -0
- package/src/index.ts +8 -0
- package/src/pid/sd-jwt/converters.ts +5 -11
- package/src/pid/sd-jwt/types.ts +8 -6
- package/src/sd-jwt/__test__/converters.test.ts +1 -1
- package/src/sd-jwt/__test__/index.test.ts +45 -74
- package/src/sd-jwt/__test__/types.test.ts +21 -33
- package/src/sd-jwt/index.ts +3 -12
- package/src/sd-jwt/types.ts +17 -22
- package/src/trust/types.ts +64 -32
- package/src/utils/auth.ts +37 -0
- package/src/utils/errors.ts +112 -0
- package/src/utils/integrity.ts +23 -0
- package/src/utils/misc.ts +43 -0
- package/src/utils/par.ts +29 -17
- package/src/utils/pop.ts +34 -0
- package/src/wallet-instance/index.ts +29 -0
- package/src/wallet-instance-attestation/issuing.ts +101 -97
- package/src/wallet-instance-attestation/types.ts +12 -8
- package/lib/commonjs/credential/issuance/07-confirm-credential.js +0 -6
- package/lib/commonjs/credential/issuance/07-confirm-credential.js.map +0 -1
- package/lib/commonjs/credential/issuance/08-confirm-credential.js +0 -6
- package/lib/commonjs/credential/issuance/08-confirm-credential.js.map +0 -1
- package/lib/module/credential/issuance/07-confirm-credential.js +0 -2
- package/lib/module/credential/issuance/07-confirm-credential.js.map +0 -1
- package/lib/module/credential/issuance/08-confirm-credential.js +0 -2
- package/lib/module/credential/issuance/08-confirm-credential.js.map +0 -1
- package/lib/typescript/credential/issuance/07-confirm-credential.d.ts +0 -11
- package/lib/typescript/credential/issuance/07-confirm-credential.d.ts.map +0 -1
- package/lib/typescript/credential/issuance/08-confirm-credential.d.ts +0 -11
- package/lib/typescript/credential/issuance/08-confirm-credential.d.ts.map +0 -1
- package/src/credential/issuance/07-confirm-credential.ts +0 -14
- package/src/credential/issuance/08-confirm-credential.ts +0 -14
package/src/sd-jwt/types.ts
CHANGED
|
@@ -39,29 +39,24 @@ export const SdJwt4VC = z.object({
|
|
|
39
39
|
typ: z.literal("vc+sd-jwt"),
|
|
40
40
|
alg: z.string(),
|
|
41
41
|
kid: z.string().optional(),
|
|
42
|
-
trust_chain: z.array(z.string()),
|
|
43
42
|
}),
|
|
44
|
-
payload: z.
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
type: z.string(),
|
|
55
|
-
verified_claims: z.object({
|
|
56
|
-
verification: z.intersection(
|
|
57
|
-
z.object({
|
|
58
|
-
trust_framework: z.literal("eidas"),
|
|
59
|
-
assurance_level: z.string(),
|
|
43
|
+
payload: z.intersection(
|
|
44
|
+
z.object({
|
|
45
|
+
iss: z.string(),
|
|
46
|
+
sub: z.string(),
|
|
47
|
+
iat: UnixTime.optional(),
|
|
48
|
+
exp: UnixTime,
|
|
49
|
+
_sd_alg: z.literal("sha-256"),
|
|
50
|
+
status: z.object({
|
|
51
|
+
status_attestation: z.object({
|
|
52
|
+
credential_hash_alg: z.literal("sha-256"),
|
|
60
53
|
}),
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
54
|
+
}),
|
|
55
|
+
cnf: z.object({
|
|
56
|
+
jwk: JWK,
|
|
57
|
+
}),
|
|
58
|
+
vct: z.string(),
|
|
64
59
|
}),
|
|
65
|
-
|
|
66
|
-
|
|
60
|
+
ObfuscatedDisclosures
|
|
61
|
+
),
|
|
67
62
|
});
|
package/src/trust/types.ts
CHANGED
|
@@ -18,38 +18,48 @@ const RelyingPartyMetadata = z.object({
|
|
|
18
18
|
// instruct the Wallet Solution on how to render the credential correctly
|
|
19
19
|
type CredentialDisplayMetadata = z.infer<typeof CredentialDisplayMetadata>;
|
|
20
20
|
const CredentialDisplayMetadata = z.object({
|
|
21
|
+
name: z.string(),
|
|
22
|
+
locale: z.string(),
|
|
23
|
+
logo: z
|
|
24
|
+
.object({
|
|
25
|
+
url: z.string(),
|
|
26
|
+
alt_text: z.string(),
|
|
27
|
+
})
|
|
28
|
+
.optional(), // TODO [SIW-1268]: should not be optional
|
|
29
|
+
background_color: z.string().optional(), // TODO [SIW-1268]: should not be optional
|
|
30
|
+
text_color: z.string().optional(), // TODO [SIW-1268]: should not be optional
|
|
31
|
+
});
|
|
32
|
+
|
|
33
|
+
// Metadata for displaying issuer information
|
|
34
|
+
type CredentialIssuerDisplayMetadata = z.infer<
|
|
35
|
+
typeof CredentialIssuerDisplayMetadata
|
|
36
|
+
>;
|
|
37
|
+
const CredentialIssuerDisplayMetadata = z.object({
|
|
21
38
|
name: z.string(),
|
|
22
39
|
locale: z.string(),
|
|
23
40
|
logo: z.object({
|
|
24
41
|
url: z.string(),
|
|
25
42
|
alt_text: z.string(),
|
|
26
43
|
}),
|
|
27
|
-
background_color: z.string(),
|
|
28
|
-
text_color: z.string(),
|
|
29
44
|
});
|
|
30
45
|
|
|
31
|
-
type
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
mandatory: z.boolean(),
|
|
39
|
-
display: z.array(z.object({ name: z.string(), locale: z.string() })),
|
|
40
|
-
})
|
|
41
|
-
),
|
|
42
|
-
});
|
|
46
|
+
type ClaimsMetadata = z.infer<typeof ClaimsMetadata>;
|
|
47
|
+
const ClaimsMetadata = z.record(
|
|
48
|
+
z.object({
|
|
49
|
+
value_type: z.string(),
|
|
50
|
+
display: z.array(z.object({ name: z.string(), locale: z.string() })),
|
|
51
|
+
})
|
|
52
|
+
);
|
|
43
53
|
|
|
44
54
|
// Metadata for a credentia which i supported by a Issuer
|
|
45
55
|
type SupportedCredentialMetadata = z.infer<typeof SupportedCredentialMetadata>;
|
|
46
56
|
const SupportedCredentialMetadata = z.object({
|
|
47
|
-
id: z.string(),
|
|
48
57
|
format: z.union([z.literal("vc+sd-jwt"), z.literal("vc+mdoc-cbor")]),
|
|
49
|
-
|
|
50
|
-
cryptographic_suites_supported: z.array(z.string()),
|
|
58
|
+
scope: z.string(),
|
|
51
59
|
display: z.array(CredentialDisplayMetadata),
|
|
52
|
-
|
|
60
|
+
claims: ClaimsMetadata,
|
|
61
|
+
cryptographic_binding_methods_supported: z.array(z.string()),
|
|
62
|
+
credential_signing_alg_values_supported: z.array(z.string()),
|
|
53
63
|
});
|
|
54
64
|
|
|
55
65
|
export type EntityStatement = z.infer<typeof EntityStatement>;
|
|
@@ -101,19 +111,19 @@ const BaseEntityConfiguration = z.object({
|
|
|
101
111
|
header: EntityConfigurationHeader,
|
|
102
112
|
payload: z
|
|
103
113
|
.object({
|
|
104
|
-
exp: UnixTime,
|
|
105
|
-
iat: UnixTime,
|
|
106
114
|
iss: z.string(),
|
|
107
115
|
sub: z.string(),
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
116
|
+
iat: UnixTime,
|
|
117
|
+
exp: UnixTime,
|
|
118
|
+
authority_hints: z.array(z.string()).optional(),
|
|
111
119
|
metadata: z
|
|
112
120
|
.object({
|
|
113
121
|
federation_entity: FederationEntityMetadata,
|
|
114
122
|
})
|
|
115
123
|
.passthrough(),
|
|
116
|
-
|
|
124
|
+
jwks: z.object({
|
|
125
|
+
keys: z.array(JWK),
|
|
126
|
+
}),
|
|
117
127
|
})
|
|
118
128
|
.passthrough(),
|
|
119
129
|
});
|
|
@@ -135,18 +145,42 @@ export const CredentialIssuerEntityConfiguration = BaseEntityConfiguration.and(
|
|
|
135
145
|
metadata: z.object({
|
|
136
146
|
openid_credential_issuer: z.object({
|
|
137
147
|
credential_issuer: z.string(),
|
|
148
|
+
credential_endpoint: z.string(),
|
|
149
|
+
revocation_endpoint: z.string(),
|
|
150
|
+
status_attestation_endpoint: z.string(),
|
|
151
|
+
display: z.array(CredentialIssuerDisplayMetadata),
|
|
152
|
+
credential_configurations_supported: z.record(
|
|
153
|
+
SupportedCredentialMetadata
|
|
154
|
+
),
|
|
155
|
+
jwks: z.object({ keys: z.array(JWK) }),
|
|
156
|
+
}),
|
|
157
|
+
oauth_authorization_server: z.object({
|
|
138
158
|
authorization_endpoint: z.string(),
|
|
139
|
-
token_endpoint: z.string(),
|
|
140
159
|
pushed_authorization_request_endpoint: z.string(),
|
|
141
|
-
dpop_signing_alg_values_supported: z.array(z.string()),
|
|
142
|
-
|
|
143
|
-
|
|
160
|
+
dpop_signing_alg_values_supported: z.array(z.string()).optional(), // TODO [SIW-1268]: should not be optional
|
|
161
|
+
token_endpoint: z.string(),
|
|
162
|
+
introspection_endpoint: z.string().optional(), // TODO [SIW-1268]: should not be optional
|
|
163
|
+
client_registration_types_supported: z.array(z.string()),
|
|
164
|
+
code_challenge_methods_supported: z.array(z.string()),
|
|
165
|
+
authorization_details_types_supported: z.array(z.string()).optional(), // TODO [SIW-1268]: should not be optional,
|
|
166
|
+
acr_values_supported: z.array(z.string()),
|
|
167
|
+
grant_types_supported: z.array(z.string()),
|
|
168
|
+
issuer: z.string(),
|
|
144
169
|
jwks: z.object({ keys: z.array(JWK) }),
|
|
170
|
+
scopes_supported: z.array(z.string()),
|
|
171
|
+
request_parameter_supported: z.boolean().optional(), // TODO [SIW-1268]: should not be optional
|
|
172
|
+
request_uri_parameter_supported: z.boolean().optional(), // TODO [SIW-1268]: should not be optional
|
|
173
|
+
response_types_supported: z.array(z.string()).optional(), // TODO [SIW-1268]: should not be optional
|
|
174
|
+
response_modes_supported: z.array(z.string()),
|
|
175
|
+
subject_types_supported: z.array(z.string()).optional(), // TODO [SIW-1268]: should not be optional
|
|
176
|
+
token_endpoint_auth_methods_supported: z.array(z.string()),
|
|
177
|
+
token_endpoint_auth_signing_alg_values_supported: z.array(z.string()),
|
|
178
|
+
request_object_signing_alg_values_supported: z.array(z.string()),
|
|
145
179
|
}),
|
|
146
180
|
/** Credential Issuers act as Relying Party
|
|
147
181
|
when they require the presentation of other credentials.
|
|
148
182
|
This does not apply for PID issuance, which requires CIE authz. */
|
|
149
|
-
|
|
183
|
+
openid_relying_party: RelyingPartyMetadata.optional(),
|
|
150
184
|
}),
|
|
151
185
|
}),
|
|
152
186
|
})
|
|
@@ -177,9 +211,7 @@ export const WalletProviderEntityConfiguration = BaseEntityConfiguration.and(
|
|
|
177
211
|
wallet_provider: z
|
|
178
212
|
.object({
|
|
179
213
|
token_endpoint: z.string(),
|
|
180
|
-
|
|
181
|
-
.array(z.string())
|
|
182
|
-
.optional(),
|
|
214
|
+
aal_values_supported: z.array(z.string()).optional(),
|
|
183
215
|
grant_types_supported: z.array(z.string()),
|
|
184
216
|
token_endpoint_auth_methods_supported: z.array(z.string()),
|
|
185
217
|
token_endpoint_auth_signing_alg_values_supported: z.array(
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import * as z from "zod";
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Context for authorization during the {@link 03-start-user-authorization.ts} phase.
|
|
5
|
+
* It consists of a single method to identify the user which takes a URL and a redirect schema as input.
|
|
6
|
+
* Once the authorization is completed and the URL calls the redirect schema, the method should return the redirect URL.
|
|
7
|
+
*/
|
|
8
|
+
export interface AuthorizationContext {
|
|
9
|
+
authorize: (url: string, redirectSchema: string) => Promise<string>;
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* The result of the identification process.
|
|
14
|
+
*/
|
|
15
|
+
export const AuthorizationResultShape = z.object({
|
|
16
|
+
code: z.string(),
|
|
17
|
+
state: z.string(),
|
|
18
|
+
iss: z.string().optional(),
|
|
19
|
+
});
|
|
20
|
+
|
|
21
|
+
/**
|
|
22
|
+
* The error of the identification process.
|
|
23
|
+
* It follows the OAuth/OIDC error response format.
|
|
24
|
+
* @see https://openid.net/specs/openid-connect-core-1_0.html#AuthError
|
|
25
|
+
* @see https://datatracker.ietf.org/doc/html/rfc6749#section-4.1.2.1
|
|
26
|
+
*/
|
|
27
|
+
export const AuthorizationErrorShape = z.object({
|
|
28
|
+
error: z.string(), // not enforcing the error code format
|
|
29
|
+
error_description: z.string().optional(),
|
|
30
|
+
error_uri: z.string().optional(),
|
|
31
|
+
state: z.string().optional(),
|
|
32
|
+
});
|
|
33
|
+
|
|
34
|
+
/**
|
|
35
|
+
* Type of the identification result.
|
|
36
|
+
*/
|
|
37
|
+
export type AuthorizationResult = z.infer<typeof AuthorizationResultShape>;
|
package/src/utils/errors.ts
CHANGED
|
@@ -233,3 +233,115 @@ export class PidMetadataError extends Error {
|
|
|
233
233
|
super(message);
|
|
234
234
|
}
|
|
235
235
|
}
|
|
236
|
+
|
|
237
|
+
/**
|
|
238
|
+
* An error subclass thrown when a Wallet Provider http request fail
|
|
239
|
+
*
|
|
240
|
+
*/
|
|
241
|
+
export class WalletProviderResponseError extends IoWalletError {
|
|
242
|
+
static get code(): "ERR_IO_WALLET_PROVIDER_RESPONSE_FAILED" {
|
|
243
|
+
return "ERR_IO_WALLET_PROVIDER_RESPONSE_FAILED";
|
|
244
|
+
}
|
|
245
|
+
|
|
246
|
+
code = "ERR_IO_WALLET_PROVIDER_RESPONSE_FAILED";
|
|
247
|
+
|
|
248
|
+
/** The Claim for which the validation failed. */
|
|
249
|
+
claim: string;
|
|
250
|
+
|
|
251
|
+
/** Reason code for the validation failure. */
|
|
252
|
+
reason: string;
|
|
253
|
+
|
|
254
|
+
/** HTTP status code */
|
|
255
|
+
statusCode: number;
|
|
256
|
+
|
|
257
|
+
constructor(
|
|
258
|
+
message: string,
|
|
259
|
+
claim: string = "unspecified",
|
|
260
|
+
reason: string = "unspecified",
|
|
261
|
+
statusCode: number
|
|
262
|
+
) {
|
|
263
|
+
super(
|
|
264
|
+
serializeAttrs({
|
|
265
|
+
message,
|
|
266
|
+
claim,
|
|
267
|
+
reason,
|
|
268
|
+
statusCode: statusCode.toString(),
|
|
269
|
+
})
|
|
270
|
+
);
|
|
271
|
+
this.claim = claim;
|
|
272
|
+
this.reason = reason;
|
|
273
|
+
this.statusCode = statusCode;
|
|
274
|
+
}
|
|
275
|
+
}
|
|
276
|
+
|
|
277
|
+
export class WalletInstanceRevokedError extends IoWalletError {
|
|
278
|
+
static get code(): "ERR_IO_WALLET_INSTANCE_REVOKED" {
|
|
279
|
+
return "ERR_IO_WALLET_INSTANCE_REVOKED";
|
|
280
|
+
}
|
|
281
|
+
|
|
282
|
+
code = "ERR_IO_WALLET_INSTANCE_REVOKED";
|
|
283
|
+
|
|
284
|
+
claim: string;
|
|
285
|
+
reason: string;
|
|
286
|
+
|
|
287
|
+
constructor(message: string, claim: string, reason: string = "unspecified") {
|
|
288
|
+
super(serializeAttrs({ message, claim, reason }));
|
|
289
|
+
this.reason = reason;
|
|
290
|
+
this.claim = claim;
|
|
291
|
+
}
|
|
292
|
+
}
|
|
293
|
+
|
|
294
|
+
export class WalletInstanceNotFoundError extends IoWalletError {
|
|
295
|
+
static get code(): "ERR_IO_WALLET_INSTANCE_NOT_FOUND" {
|
|
296
|
+
return "ERR_IO_WALLET_INSTANCE_NOT_FOUND";
|
|
297
|
+
}
|
|
298
|
+
|
|
299
|
+
code = "ERR_IO_WALLET_INSTANCE_NOT_FOUND";
|
|
300
|
+
|
|
301
|
+
claim: string;
|
|
302
|
+
reason: string;
|
|
303
|
+
|
|
304
|
+
constructor(message: string, claim: string, reason: string = "unspecified") {
|
|
305
|
+
super(serializeAttrs({ message, claim, reason }));
|
|
306
|
+
this.reason = reason;
|
|
307
|
+
this.claim = claim;
|
|
308
|
+
}
|
|
309
|
+
}
|
|
310
|
+
|
|
311
|
+
/**
|
|
312
|
+
* An error subclass thrown when an error occurs during the authorization process.
|
|
313
|
+
*/
|
|
314
|
+
export class AuthorizationError extends IoWalletError {
|
|
315
|
+
static get code(): "ERR_IO_WALLET_AUTHORIZATION_ERROR" {
|
|
316
|
+
return "ERR_IO_WALLET_AUTHORIZATION_ERROR";
|
|
317
|
+
}
|
|
318
|
+
|
|
319
|
+
code = "ERR_IO_WALLET_AUTHORIZATION_ERROR";
|
|
320
|
+
|
|
321
|
+
constructor(message?: string) {
|
|
322
|
+
super(message);
|
|
323
|
+
}
|
|
324
|
+
}
|
|
325
|
+
|
|
326
|
+
/**
|
|
327
|
+
* An error subclass thrown when an error occurs during the authorization process with the IDP.
|
|
328
|
+
* It contains the error and error description returned by the IDP.
|
|
329
|
+
*/
|
|
330
|
+
export class AuthorizationIdpError extends IoWalletError {
|
|
331
|
+
static get code(): "ERR_IO_WALLET_IDENTIFICATION_RESPONSE_ERROR" {
|
|
332
|
+
return "ERR_IO_WALLET_IDENTIFICATION_RESPONSE_ERROR";
|
|
333
|
+
}
|
|
334
|
+
|
|
335
|
+
code = "ERR_IO_WALLET_IDENTIFICATION_RESPONSE_PARSING_FAILED";
|
|
336
|
+
|
|
337
|
+
error: string;
|
|
338
|
+
errorDescription?: string;
|
|
339
|
+
|
|
340
|
+
constructor(error: string, errorDescription?: string) {
|
|
341
|
+
super(
|
|
342
|
+
serializeAttrs(errorDescription ? { error, errorDescription } : { error })
|
|
343
|
+
);
|
|
344
|
+
this.error = error;
|
|
345
|
+
this.errorDescription = errorDescription;
|
|
346
|
+
}
|
|
347
|
+
}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Interface for the integrity context which provides the necessary functions to interact with the integrity service.
|
|
3
|
+
* The functions are platform specific and must be implemented in the platform specific code.
|
|
4
|
+
* getHardwareKeyTag: returns the hardware key tag in a url safe format (e.g. base64url).
|
|
5
|
+
* getAttestation: requests the attestation from the integrity service.
|
|
6
|
+
* getHardwareSignatureWithAuthData: signs the clientData and returns the signature with the authenticator data.
|
|
7
|
+
*/
|
|
8
|
+
export interface IntegrityContext {
|
|
9
|
+
getHardwareKeyTag: () => string;
|
|
10
|
+
getAttestation: (nonce: string) => Promise<string>;
|
|
11
|
+
getHardwareSignatureWithAuthData: (
|
|
12
|
+
clientData: string
|
|
13
|
+
) => Promise<HardwareSignatureWithAuthData>;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
/**
|
|
17
|
+
* Type returned by the getHardwareSignatureWithAuthData function of {@link IntegrityContext}.
|
|
18
|
+
* It contains the signature and the authenticator data.
|
|
19
|
+
*/
|
|
20
|
+
export type HardwareSignatureWithAuthData = {
|
|
21
|
+
signature: string;
|
|
22
|
+
authenticatorData: string;
|
|
23
|
+
};
|
package/src/utils/misc.ts
CHANGED
|
@@ -25,3 +25,46 @@ export type Out<FN> = FN extends (...args: any[]) => Promise<any>
|
|
|
25
25
|
: FN extends (...args: any[]) => any
|
|
26
26
|
? ReturnType<FN>
|
|
27
27
|
: never;
|
|
28
|
+
|
|
29
|
+
/**
|
|
30
|
+
* TODO [SIW-1310]: replace this function with a cryptographically secure one.
|
|
31
|
+
* @param size - The size of the string to generate
|
|
32
|
+
* @returns A random alphanumeric string of the given size
|
|
33
|
+
*/
|
|
34
|
+
export const generateRandomAlphaNumericString = (size: number) =>
|
|
35
|
+
Array.from(Array(size), () =>
|
|
36
|
+
Math.floor(Math.random() * 36).toString(36)
|
|
37
|
+
).join("");
|
|
38
|
+
|
|
39
|
+
/**
|
|
40
|
+
* Repeatedly checks a condition function until it returns true,
|
|
41
|
+
* then resolves the returned promise. If the condition function does not return true
|
|
42
|
+
* within the specified timeout, the promise is rejected.
|
|
43
|
+
*
|
|
44
|
+
* @param conditionFunction - A function that returns a boolean value.
|
|
45
|
+
* The promise resolves when this function returns true.
|
|
46
|
+
* @param timeout - An optional timeout in seconds. The promise is rejected if the
|
|
47
|
+
* condition function does not return true within this time.
|
|
48
|
+
* @returns A promise that resolves once the conditionFunction returns true or rejects if timed out.
|
|
49
|
+
*/
|
|
50
|
+
export const until = (
|
|
51
|
+
conditionFunction: () => boolean,
|
|
52
|
+
timeoutSeconds?: number
|
|
53
|
+
): Promise<void> =>
|
|
54
|
+
new Promise<void>((resolve, reject) => {
|
|
55
|
+
const start = Date.now();
|
|
56
|
+
const poll = () => {
|
|
57
|
+
if (conditionFunction()) {
|
|
58
|
+
resolve();
|
|
59
|
+
} else if (
|
|
60
|
+
timeoutSeconds !== undefined &&
|
|
61
|
+
Date.now() - start >= timeoutSeconds * 1000
|
|
62
|
+
) {
|
|
63
|
+
reject(new Error("Timeout exceeded"));
|
|
64
|
+
} else {
|
|
65
|
+
setTimeout(poll, 400);
|
|
66
|
+
}
|
|
67
|
+
};
|
|
68
|
+
|
|
69
|
+
poll();
|
|
70
|
+
});
|
package/src/utils/par.ts
CHANGED
|
@@ -6,13 +6,12 @@ import {
|
|
|
6
6
|
import uuid from "react-native-uuid";
|
|
7
7
|
import * as z from "zod";
|
|
8
8
|
import * as WalletInstanceAttestation from "../wallet-instance-attestation";
|
|
9
|
-
import { hasStatus } from "./misc";
|
|
9
|
+
import { generateRandomAlphaNumericString, hasStatus } from "./misc";
|
|
10
|
+
import { createPopToken } from "./pop";
|
|
10
11
|
|
|
11
12
|
export type AuthorizationDetail = z.infer<typeof AuthorizationDetail>;
|
|
12
13
|
export const AuthorizationDetail = z.object({
|
|
13
|
-
|
|
14
|
-
type: z.string(),
|
|
15
|
-
}),
|
|
14
|
+
credential_configuration_id: z.string(),
|
|
16
15
|
format: z.union([z.literal("vc+sd-jwt"), z.literal("vc+mdoc-cbor")]),
|
|
17
16
|
type: z.literal("openid_credential"),
|
|
18
17
|
});
|
|
@@ -34,7 +33,8 @@ export const makeParRequest =
|
|
|
34
33
|
async (
|
|
35
34
|
clientId: string,
|
|
36
35
|
codeVerifier: string,
|
|
37
|
-
|
|
36
|
+
redirectUri: string,
|
|
37
|
+
responseMode: string,
|
|
38
38
|
parEndpoint: string,
|
|
39
39
|
walletInstanceAttestation: string,
|
|
40
40
|
authorizationDetails: AuthorizationDetails,
|
|
@@ -48,10 +48,19 @@ export const makeParRequest =
|
|
|
48
48
|
const iss = WalletInstanceAttestation.decode(walletInstanceAttestation)
|
|
49
49
|
.payload.cnf.jwk.kid;
|
|
50
50
|
|
|
51
|
+
const signedWiaPoP = await createPopToken(
|
|
52
|
+
{
|
|
53
|
+
jti: `${uuid.v4()}`,
|
|
54
|
+
aud,
|
|
55
|
+
iss,
|
|
56
|
+
},
|
|
57
|
+
wiaCryptoContext
|
|
58
|
+
);
|
|
59
|
+
|
|
51
60
|
/** A code challenge is provided so that the PAR is bound
|
|
52
61
|
to the subsequent authorization code request
|
|
53
62
|
@see https://datatracker.ietf.org/doc/html/rfc9126#name-request */
|
|
54
|
-
const codeChallengeMethod = "
|
|
63
|
+
const codeChallengeMethod = "S256";
|
|
55
64
|
const codeChallenge = await sha256ToBase64(codeVerifier);
|
|
56
65
|
|
|
57
66
|
/** The PAR request token is signed used the Wallet Instance Attestation key.
|
|
@@ -60,23 +69,26 @@ export const makeParRequest =
|
|
|
60
69
|
The key is matched by its kid */
|
|
61
70
|
const signedJwtForPar = await new SignJWT(wiaCryptoContext)
|
|
62
71
|
.setProtectedHeader({
|
|
72
|
+
typ: "jwk",
|
|
63
73
|
kid: wiaPublicKey.kid,
|
|
64
74
|
})
|
|
65
75
|
.setPayload({
|
|
66
|
-
iss,
|
|
67
|
-
aud,
|
|
68
76
|
jti: `${uuid.v4()}`,
|
|
69
|
-
|
|
70
|
-
authorization_details: authorizationDetails,
|
|
77
|
+
aud,
|
|
71
78
|
response_type: "code",
|
|
72
|
-
|
|
73
|
-
state: `${uuid.v4()}`,
|
|
79
|
+
response_mode: responseMode,
|
|
74
80
|
client_id: clientId,
|
|
75
|
-
|
|
81
|
+
iss,
|
|
82
|
+
state: generateRandomAlphaNumericString(32),
|
|
76
83
|
code_challenge: codeChallenge,
|
|
84
|
+
code_challenge_method: codeChallengeMethod,
|
|
85
|
+
authorization_details: authorizationDetails,
|
|
86
|
+
redirect_uri: redirectUri,
|
|
87
|
+
client_assertion_type: assertionType,
|
|
88
|
+
client_assertion: walletInstanceAttestation + "~" + signedWiaPoP,
|
|
77
89
|
})
|
|
78
|
-
.setIssuedAt()
|
|
79
|
-
.setExpirationTime("
|
|
90
|
+
.setIssuedAt() //iat is set to now
|
|
91
|
+
.setExpirationTime("5min")
|
|
80
92
|
.sign();
|
|
81
93
|
|
|
82
94
|
/** The request body for the Pushed Authorization Request */
|
|
@@ -85,9 +97,9 @@ export const makeParRequest =
|
|
|
85
97
|
client_id: clientId,
|
|
86
98
|
code_challenge: codeChallenge,
|
|
87
99
|
code_challenge_method: "S256",
|
|
88
|
-
client_assertion_type: assertionType,
|
|
89
|
-
client_assertion: walletInstanceAttestation,
|
|
90
100
|
request: signedJwtForPar,
|
|
101
|
+
client_assertion_type: assertionType,
|
|
102
|
+
client_assertion: walletInstanceAttestation + "~" + signedWiaPoP,
|
|
91
103
|
});
|
|
92
104
|
|
|
93
105
|
return await appFetch(parEndpoint, {
|
package/src/utils/pop.ts
ADDED
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import * as z from "zod";
|
|
2
|
+
|
|
3
|
+
import { SignJWT, type CryptoContext } from "@pagopa/io-react-native-jwt";
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Create a signed PoP token
|
|
7
|
+
*
|
|
8
|
+
* @param payload The payload to be included in the token.
|
|
9
|
+
* @param crypto The crypto context that handles the key bound to the DPoP.
|
|
10
|
+
*
|
|
11
|
+
* @returns The signed crypto token.
|
|
12
|
+
*/
|
|
13
|
+
export const createPopToken = async (
|
|
14
|
+
payload: PoPPayload,
|
|
15
|
+
crypto: CryptoContext
|
|
16
|
+
): Promise<string> => {
|
|
17
|
+
const kid = await crypto.getPublicKey().then((_) => _.kid);
|
|
18
|
+
return new SignJWT(crypto)
|
|
19
|
+
.setPayload(payload)
|
|
20
|
+
.setProtectedHeader({
|
|
21
|
+
typ: "jwt-client-attestation-pop",
|
|
22
|
+
kid,
|
|
23
|
+
})
|
|
24
|
+
.setIssuedAt()
|
|
25
|
+
.setExpirationTime("5min")
|
|
26
|
+
.sign();
|
|
27
|
+
};
|
|
28
|
+
|
|
29
|
+
export type PoPPayload = z.infer<typeof PoPPayload>;
|
|
30
|
+
export const PoPPayload = z.object({
|
|
31
|
+
jti: z.string(),
|
|
32
|
+
aud: z.string(),
|
|
33
|
+
iss: z.string(),
|
|
34
|
+
});
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { getWalletProviderClient } from "../client";
|
|
2
|
+
import type { IntegrityContext } from "..";
|
|
3
|
+
|
|
4
|
+
export async function createWalletInstance(context: {
|
|
5
|
+
integrityContext: IntegrityContext;
|
|
6
|
+
walletProviderBaseUrl: string;
|
|
7
|
+
appFetch?: GlobalFetch["fetch"];
|
|
8
|
+
}) {
|
|
9
|
+
const { integrityContext } = context;
|
|
10
|
+
|
|
11
|
+
const api = getWalletProviderClient(context);
|
|
12
|
+
|
|
13
|
+
//1. Obtain nonce
|
|
14
|
+
const challenge = await api.get("/nonce").then((response) => response.nonce);
|
|
15
|
+
|
|
16
|
+
const keyAttestation = await integrityContext.getAttestation(challenge);
|
|
17
|
+
const hardwareKeyTag = integrityContext.getHardwareKeyTag();
|
|
18
|
+
|
|
19
|
+
//2. Create Wallet Instance
|
|
20
|
+
await api.post("/wallet-instances", {
|
|
21
|
+
body: {
|
|
22
|
+
challenge,
|
|
23
|
+
key_attestation: keyAttestation,
|
|
24
|
+
hardware_key_tag: hardwareKeyTag,
|
|
25
|
+
},
|
|
26
|
+
});
|
|
27
|
+
|
|
28
|
+
return hardwareKeyTag;
|
|
29
|
+
}
|