@pagopa/io-react-native-wallet 0.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/README.md +91 -0
- package/lib/commonjs/index.js +17 -0
- package/lib/commonjs/index.js.map +1 -0
- package/lib/commonjs/pid/index.js +11 -0
- package/lib/commonjs/pid/index.js.map +1 -0
- package/lib/commonjs/pid/sd-jwt/converters.js +29 -0
- package/lib/commonjs/pid/sd-jwt/converters.js.map +1 -0
- package/lib/commonjs/pid/sd-jwt/index.js +76 -0
- package/lib/commonjs/pid/sd-jwt/index.js.map +1 -0
- package/lib/commonjs/pid/sd-jwt/types.js +50 -0
- package/lib/commonjs/pid/sd-jwt/types.js.map +1 -0
- package/lib/commonjs/sd-jwt/__test__/converters.test.js +25 -0
- package/lib/commonjs/sd-jwt/__test__/converters.test.js.map +1 -0
- package/lib/commonjs/sd-jwt/__test__/types.test.js +70 -0
- package/lib/commonjs/sd-jwt/__test__/types.test.js.map +1 -0
- package/lib/commonjs/sd-jwt/converters.js +30 -0
- package/lib/commonjs/sd-jwt/converters.js.map +1 -0
- package/lib/commonjs/sd-jwt/index.js +77 -0
- package/lib/commonjs/sd-jwt/index.js.map +1 -0
- package/lib/commonjs/sd-jwt/types.js +53 -0
- package/lib/commonjs/sd-jwt/types.js.map +1 -0
- package/lib/commonjs/sd-jwt/verifier.js +18 -0
- package/lib/commonjs/sd-jwt/verifier.js.map +1 -0
- package/lib/commonjs/utils/errors.js +82 -0
- package/lib/commonjs/utils/errors.js.map +1 -0
- package/lib/commonjs/utils/jwk.js +45 -0
- package/lib/commonjs/utils/jwk.js.map +1 -0
- package/lib/commonjs/wallet-instance-attestation/index.js +63 -0
- package/lib/commonjs/wallet-instance-attestation/index.js.map +1 -0
- package/lib/commonjs/wallet-instance-attestation/issuing.js +96 -0
- package/lib/commonjs/wallet-instance-attestation/issuing.js.map +1 -0
- package/lib/commonjs/wallet-instance-attestation/types.js +65 -0
- package/lib/commonjs/wallet-instance-attestation/types.js.map +1 -0
- package/lib/module/index.js +7 -0
- package/lib/module/index.js.map +1 -0
- package/lib/module/pid/index.js +3 -0
- package/lib/module/pid/index.js.map +1 -0
- package/lib/module/pid/sd-jwt/converters.js +23 -0
- package/lib/module/pid/sd-jwt/converters.js.map +1 -0
- package/lib/module/pid/sd-jwt/index.js +66 -0
- package/lib/module/pid/sd-jwt/index.js.map +1 -0
- package/lib/module/pid/sd-jwt/types.js +43 -0
- package/lib/module/pid/sd-jwt/types.js.map +1 -0
- package/lib/module/sd-jwt/__test__/converters.test.js +23 -0
- package/lib/module/sd-jwt/__test__/converters.test.js.map +1 -0
- package/lib/module/sd-jwt/__test__/types.test.js +68 -0
- package/lib/module/sd-jwt/__test__/types.test.js.map +1 -0
- package/lib/module/sd-jwt/converters.js +24 -0
- package/lib/module/sd-jwt/converters.js.map +1 -0
- package/lib/module/sd-jwt/index.js +71 -0
- package/lib/module/sd-jwt/index.js.map +1 -0
- package/lib/module/sd-jwt/types.js +44 -0
- package/lib/module/sd-jwt/types.js.map +1 -0
- package/lib/module/sd-jwt/verifier.js +11 -0
- package/lib/module/sd-jwt/verifier.js.map +1 -0
- package/lib/module/utils/errors.js +73 -0
- package/lib/module/utils/errors.js.map +1 -0
- package/lib/module/utils/jwk.js +38 -0
- package/lib/module/utils/jwk.js.map +1 -0
- package/lib/module/wallet-instance-attestation/index.js +52 -0
- package/lib/module/wallet-instance-attestation/index.js.map +1 -0
- package/lib/module/wallet-instance-attestation/issuing.js +90 -0
- package/lib/module/wallet-instance-attestation/issuing.js.map +1 -0
- package/lib/module/wallet-instance-attestation/types.js +55 -0
- package/lib/module/wallet-instance-attestation/types.js.map +1 -0
- package/lib/typescript/index.d.ts +5 -0
- package/lib/typescript/index.d.ts.map +1 -0
- package/lib/typescript/pid/index.d.ts +3 -0
- package/lib/typescript/pid/index.d.ts.map +1 -0
- package/lib/typescript/pid/sd-jwt/converters.d.ts +4 -0
- package/lib/typescript/pid/sd-jwt/converters.d.ts.map +1 -0
- package/lib/typescript/pid/sd-jwt/index.d.ts +50 -0
- package/lib/typescript/pid/sd-jwt/index.d.ts.map +1 -0
- package/lib/typescript/pid/sd-jwt/types.d.ts +196 -0
- package/lib/typescript/pid/sd-jwt/types.d.ts.map +1 -0
- package/lib/typescript/sd-jwt/__test__/converters.test.d.ts +2 -0
- package/lib/typescript/sd-jwt/__test__/converters.test.d.ts.map +1 -0
- package/lib/typescript/sd-jwt/__test__/types.test.d.ts +2 -0
- package/lib/typescript/sd-jwt/__test__/types.test.d.ts.map +1 -0
- package/lib/typescript/sd-jwt/converters.d.ts +3 -0
- package/lib/typescript/sd-jwt/converters.d.ts.map +1 -0
- package/lib/typescript/sd-jwt/index.d.ts +42 -0
- package/lib/typescript/sd-jwt/index.d.ts.map +1 -0
- package/lib/typescript/sd-jwt/types.d.ts +416 -0
- package/lib/typescript/sd-jwt/types.d.ts.map +1 -0
- package/lib/typescript/sd-jwt/verifier.d.ts +3 -0
- package/lib/typescript/sd-jwt/verifier.d.ts.map +1 -0
- package/lib/typescript/utils/errors.d.ts +45 -0
- package/lib/typescript/utils/errors.d.ts.map +1 -0
- package/lib/typescript/utils/jwk.d.ts +85 -0
- package/lib/typescript/utils/jwk.d.ts.map +1 -0
- package/lib/typescript/wallet-instance-attestation/index.d.ts +36 -0
- package/lib/typescript/wallet-instance-attestation/index.d.ts.map +1 -0
- package/lib/typescript/wallet-instance-attestation/issuing.d.ts +32 -0
- package/lib/typescript/wallet-instance-attestation/issuing.d.ts.map +1 -0
- package/lib/typescript/wallet-instance-attestation/types.d.ts +733 -0
- package/lib/typescript/wallet-instance-attestation/types.d.ts.map +1 -0
- package/package.json +108 -0
- package/src/index.ts +8 -0
- package/src/pid/index.ts +2 -0
- package/src/pid/sd-jwt/converters.ts +26 -0
- package/src/pid/sd-jwt/index.ts +71 -0
- package/src/pid/sd-jwt/types.ts +44 -0
- package/src/sd-jwt/__test__/converters.test.ts +27 -0
- package/src/sd-jwt/__test__/types.test.ts +85 -0
- package/src/sd-jwt/converters.ts +24 -0
- package/src/sd-jwt/index.ts +92 -0
- package/src/sd-jwt/types.ts +54 -0
- package/src/sd-jwt/verifier.ts +20 -0
- package/src/utils/errors.ts +74 -0
- package/src/utils/jwk.ts +39 -0
- package/src/wallet-instance-attestation/index.ts +56 -0
- package/src/wallet-instance-attestation/issuing.ts +107 -0
- package/src/wallet-instance-attestation/types.ts +77 -0
package/README.md
ADDED
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
# 🪪 @pagopa/io-react-native-wallet
|
|
2
|
+
|
|
3
|
+
📲 Provide data structures, helpers, and API to Wallet Instance.
|
|
4
|
+
|
|
5
|
+
Depends on [@pagopa/io-react-native-jwt](https://github.com/pagopa/io-react-native-jwt)
|
|
6
|
+
|
|
7
|
+
## Installation
|
|
8
|
+
|
|
9
|
+
```sh
|
|
10
|
+
# First install JWT dependency if you don't have it
|
|
11
|
+
npm install @pagopa/io-react-native-jwt
|
|
12
|
+
|
|
13
|
+
npm install @pagopa/io-react-native-wallet
|
|
14
|
+
```
|
|
15
|
+
|
|
16
|
+
## Usage
|
|
17
|
+
|
|
18
|
+
### PID
|
|
19
|
+
|
|
20
|
+
#### Encode and Decode
|
|
21
|
+
|
|
22
|
+
```ts
|
|
23
|
+
import { PID } from "@pagopa/io-react-native-wallet";
|
|
24
|
+
|
|
25
|
+
//Only for decode
|
|
26
|
+
PID.SdJwt.decode("<token>");
|
|
27
|
+
|
|
28
|
+
//Decode and verification
|
|
29
|
+
PID.SdJwt.verify("<token>");
|
|
30
|
+
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
### Wallet Instance Attestation
|
|
34
|
+
|
|
35
|
+
#### Issuing
|
|
36
|
+
|
|
37
|
+
```ts
|
|
38
|
+
import { WalletInstanceAttestation } from "@pagopa/io-react-native-wallet";
|
|
39
|
+
|
|
40
|
+
const issuing = new WalletInstanceAttestation.Issuing(
|
|
41
|
+
yourWalletProviderUrl
|
|
42
|
+
);
|
|
43
|
+
|
|
44
|
+
// Genrate keys
|
|
45
|
+
const publicKey = await yourCustomPublicKey("TEE_KEY_TAG");
|
|
46
|
+
|
|
47
|
+
const walletInstanceAttestationRequest =
|
|
48
|
+
await issuing.getAttestationRequestToSign(
|
|
49
|
+
publicKey
|
|
50
|
+
);
|
|
51
|
+
|
|
52
|
+
//Sign with TEE
|
|
53
|
+
const signature = await yourCustomSignatureFunction(
|
|
54
|
+
walletInstanceAttestationRequest,
|
|
55
|
+
"TEE_KEY_TAG"
|
|
56
|
+
);
|
|
57
|
+
|
|
58
|
+
const walletInstanceAttestation =
|
|
59
|
+
await issuing.getAttestation(
|
|
60
|
+
walletInstanceAttestationRequest,
|
|
61
|
+
signature
|
|
62
|
+
);
|
|
63
|
+
|
|
64
|
+
console.log(walletInstanceAttestation);
|
|
65
|
+
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
#### Encode and Decode
|
|
69
|
+
|
|
70
|
+
```ts
|
|
71
|
+
import { WalletInstanceAttestation } from "io-react-native-wallet";
|
|
72
|
+
|
|
73
|
+
WalletInstanceAttestation.decode("<token>");
|
|
74
|
+
```
|
|
75
|
+
|
|
76
|
+
## Example
|
|
77
|
+
|
|
78
|
+
You can use the [sample app](example) to test and understand how to use the library.
|
|
79
|
+
|
|
80
|
+
```sh
|
|
81
|
+
cd example
|
|
82
|
+
|
|
83
|
+
yarn install
|
|
84
|
+
|
|
85
|
+
# To use iOS
|
|
86
|
+
yarn ios
|
|
87
|
+
|
|
88
|
+
# To use Android
|
|
89
|
+
yarn android
|
|
90
|
+
|
|
91
|
+
```
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.WalletInstanceAttestation = exports.PID = void 0;
|
|
7
|
+
exports.multiply = multiply;
|
|
8
|
+
var PID = _interopRequireWildcard(require("./pid"));
|
|
9
|
+
exports.PID = PID;
|
|
10
|
+
var WalletInstanceAttestation = _interopRequireWildcard(require("./wallet-instance-attestation"));
|
|
11
|
+
exports.WalletInstanceAttestation = WalletInstanceAttestation;
|
|
12
|
+
function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function (nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
|
|
13
|
+
function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
|
|
14
|
+
function multiply(a, b) {
|
|
15
|
+
return Promise.resolve(a * b);
|
|
16
|
+
}
|
|
17
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["PID","_interopRequireWildcard","require","exports","WalletInstanceAttestation","_getRequireWildcardCache","nodeInterop","WeakMap","cacheBabelInterop","cacheNodeInterop","obj","__esModule","default","cache","has","get","newObj","hasPropertyDescriptor","Object","defineProperty","getOwnPropertyDescriptor","key","prototype","hasOwnProperty","call","desc","set","multiply","a","b","Promise","resolve"],"sourceRoot":"../../src","sources":["index.ts"],"mappings":";;;;;;;AAAA,IAAAA,GAAA,GAAAC,uBAAA,CAAAC,OAAA;AAA6BC,OAAA,CAAAH,GAAA,GAAAA,GAAA;AAC7B,IAAAI,yBAAA,GAAAH,uBAAA,CAAAC,OAAA;AAA2EC,OAAA,CAAAC,yBAAA,GAAAA,yBAAA;AAAA,SAAAC,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,SAAAL,wBAAAS,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;AAEpE,SAASW,QAAQA,CAACC,CAAS,EAAEC,CAAS,EAAmB;EAC9D,OAAOC,OAAO,CAACC,OAAO,CAACH,CAAC,GAAGC,CAAC,CAAC;AAC/B"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.SdJwt = void 0;
|
|
7
|
+
var SdJwt = _interopRequireWildcard(require("./sd-jwt"));
|
|
8
|
+
exports.SdJwt = SdJwt;
|
|
9
|
+
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); }
|
|
10
|
+
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; }
|
|
11
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["SdJwt","_interopRequireWildcard","require","exports","_getRequireWildcardCache","nodeInterop","WeakMap","cacheBabelInterop","cacheNodeInterop","obj","__esModule","default","cache","has","get","newObj","hasPropertyDescriptor","Object","defineProperty","getOwnPropertyDescriptor","key","prototype","hasOwnProperty","call","desc","set"],"sourceRoot":"../../../src","sources":["pid/index.ts"],"mappings":";;;;;;AAAA,IAAAA,KAAA,GAAAC,uBAAA,CAAAC,OAAA;AAAkCC,OAAA,CAAAH,KAAA,GAAAA,KAAA;AAAA,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,SAAAJ,wBAAAQ,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"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.pidFromToken = pidFromToken;
|
|
7
|
+
var _converters = require("../../sd-jwt/converters");
|
|
8
|
+
var _types = require("./types");
|
|
9
|
+
function pidFromToken(sdJwt, disclosures) {
|
|
10
|
+
return _types.PID.parse({
|
|
11
|
+
issuer: sdJwt.payload.iss,
|
|
12
|
+
issuedAt: new Date(sdJwt.payload.iat * 1000),
|
|
13
|
+
expiration: new Date(sdJwt.payload.exp * 1000),
|
|
14
|
+
verification: {
|
|
15
|
+
trustFramework: sdJwt.payload.verified_claims.verification.trust_framework,
|
|
16
|
+
assuranceLevel: sdJwt.payload.verified_claims.verification.assurance_level,
|
|
17
|
+
evidence: (0, _converters.getValueFromDisclosures)(disclosures, "evidence")
|
|
18
|
+
},
|
|
19
|
+
claims: {
|
|
20
|
+
uniqueId: (0, _converters.getValueFromDisclosures)(disclosures, "unique_id"),
|
|
21
|
+
givenName: (0, _converters.getValueFromDisclosures)(disclosures, "given_name"),
|
|
22
|
+
familyName: (0, _converters.getValueFromDisclosures)(disclosures, "family_name"),
|
|
23
|
+
birthdate: (0, _converters.getValueFromDisclosures)(disclosures, "birthdate"),
|
|
24
|
+
placeOfBirth: (0, _converters.getValueFromDisclosures)(disclosures, "place_of_birth"),
|
|
25
|
+
taxIdCode: (0, _converters.getValueFromDisclosures)(disclosures, "tax_id_number")
|
|
26
|
+
}
|
|
27
|
+
});
|
|
28
|
+
}
|
|
29
|
+
//# sourceMappingURL=converters.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["_converters","require","_types","pidFromToken","sdJwt","disclosures","PID","parse","issuer","payload","iss","issuedAt","Date","iat","expiration","exp","verification","trustFramework","verified_claims","trust_framework","assuranceLevel","assurance_level","evidence","getValueFromDisclosures","claims","uniqueId","givenName","familyName","birthdate","placeOfBirth","taxIdCode"],"sourceRoot":"../../../../src","sources":["pid/sd-jwt/converters.ts"],"mappings":";;;;;;AAAA,IAAAA,WAAA,GAAAC,OAAA;AAEA,IAAAC,MAAA,GAAAD,OAAA;AAEO,SAASE,YAAYA,CAACC,KAAe,EAAEC,WAAyB,EAAO;EAC5E,OAAOC,UAAG,CAACC,KAAK,CAAC;IACfC,MAAM,EAAEJ,KAAK,CAACK,OAAO,CAACC,GAAG;IACzBC,QAAQ,EAAE,IAAIC,IAAI,CAACR,KAAK,CAACK,OAAO,CAACI,GAAG,GAAG,IAAI,CAAC;IAC5CC,UAAU,EAAE,IAAIF,IAAI,CAACR,KAAK,CAACK,OAAO,CAACM,GAAG,GAAG,IAAI,CAAC;IAC9CC,YAAY,EAAE;MACZC,cAAc,EACZb,KAAK,CAACK,OAAO,CAACS,eAAe,CAACF,YAAY,CAACG,eAAe;MAC5DC,cAAc,EACZhB,KAAK,CAACK,OAAO,CAACS,eAAe,CAACF,YAAY,CAACK,eAAe;MAC5DC,QAAQ,EAAE,IAAAC,mCAAuB,EAAClB,WAAW,EAAE,UAAU;IAC3D,CAAC;IACDmB,MAAM,EAAE;MACNC,QAAQ,EAAE,IAAAF,mCAAuB,EAAClB,WAAW,EAAE,WAAW,CAAC;MAC3DqB,SAAS,EAAE,IAAAH,mCAAuB,EAAClB,WAAW,EAAE,YAAY,CAAC;MAC7DsB,UAAU,EAAE,IAAAJ,mCAAuB,EAAClB,WAAW,EAAE,aAAa,CAAC;MAC/DuB,SAAS,EAAE,IAAAL,mCAAuB,EAAClB,WAAW,EAAE,WAAW,CAAC;MAC5DwB,YAAY,EAAE,IAAAN,mCAAuB,EAAClB,WAAW,EAAE,gBAAgB,CAAC;MACpEyB,SAAS,EAAE,IAAAP,mCAAuB,EAAClB,WAAW,EAAE,eAAe;IACjE;EACF,CAAC,CAAC;AACJ"}
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
Object.defineProperty(exports, "PID", {
|
|
7
|
+
enumerable: true,
|
|
8
|
+
get: function () {
|
|
9
|
+
return _types2.PID;
|
|
10
|
+
}
|
|
11
|
+
});
|
|
12
|
+
exports.decode = decode;
|
|
13
|
+
exports.verify = verify;
|
|
14
|
+
var _sdJwt = require("../../sd-jwt");
|
|
15
|
+
var _converters = require("./converters");
|
|
16
|
+
var _types = require("../../sd-jwt/types");
|
|
17
|
+
var _types2 = require("./types");
|
|
18
|
+
/**
|
|
19
|
+
* Decode a given SD-JWT with Disclosures to get the parsed PID object they define.
|
|
20
|
+
* It ensures provided data is in a valid shape.
|
|
21
|
+
*
|
|
22
|
+
* It DOES NOT verify token signature nor check disclosures are correctly referenced by the SD-JWT.
|
|
23
|
+
* Use {@link verify} instead
|
|
24
|
+
*
|
|
25
|
+
* @function
|
|
26
|
+
* @param token The encoded token that represents a valid sd-jwt for verifiable credentials
|
|
27
|
+
*
|
|
28
|
+
* @returns The validated PID object along with the parsed SD-JWT token and the parsed disclosures
|
|
29
|
+
* @throws A decoding error if the token doesn't resolve in a valid SD-JWT
|
|
30
|
+
* @throws A validation error if the provided data doesn't result in a valid PID
|
|
31
|
+
*
|
|
32
|
+
*/
|
|
33
|
+
function decode(token) {
|
|
34
|
+
let {
|
|
35
|
+
sdJwt,
|
|
36
|
+
disclosures
|
|
37
|
+
} = (0, _sdJwt.decode)(token, _types.SdJwt4VC);
|
|
38
|
+
const pid = (0, _converters.pidFromToken)(sdJwt, disclosures);
|
|
39
|
+
return {
|
|
40
|
+
pid,
|
|
41
|
+
sdJwt,
|
|
42
|
+
disclosures
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
/**
|
|
47
|
+
* Verify a given SD-JWT with Disclosures to get the parsed PID object they define.
|
|
48
|
+
* Same as {@link decode} plus:
|
|
49
|
+
* - token signature verification
|
|
50
|
+
* - ensure disclosures are well-defined inside the SD-JWT
|
|
51
|
+
*
|
|
52
|
+
* @async @function
|
|
53
|
+
*
|
|
54
|
+
* @todo implement signature validation
|
|
55
|
+
* @todo check disclosures in sd-jwt
|
|
56
|
+
*
|
|
57
|
+
* @param token The encoded token that represents a valid sd-jwt for verifiable credentials
|
|
58
|
+
*
|
|
59
|
+
* @returns {VerifyResult} The validated PID object along with the parsed SD-JWT token and the parsed disclosures
|
|
60
|
+
* @throws A decoding error if the token doesn't resolve in a valid SD-JWT
|
|
61
|
+
* @throws A validation error if the provided data doesn't result in a valid PID
|
|
62
|
+
* @throws A validation error if the provided disclosures are not defined in the SD-JWT
|
|
63
|
+
* @throws Invalid signature error if the token signature is not valid
|
|
64
|
+
*
|
|
65
|
+
*/
|
|
66
|
+
async function verify(token) {
|
|
67
|
+
const decoded = decode(token);
|
|
68
|
+
const publicKey = decoded.sdJwt.payload.cnf.jwk;
|
|
69
|
+
await (0, _sdJwt.verify)(token, publicKey, _types.SdJwt4VC);
|
|
70
|
+
return decoded;
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
/**
|
|
74
|
+
* Result object for {@link verify}
|
|
75
|
+
*/
|
|
76
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["_sdJwt","require","_converters","_types","_types2","decode","token","sdJwt","disclosures","decodeJwt","SdJwt4VC","pid","pidFromToken","verify","decoded","publicKey","payload","cnf","jwk","verifyJwt"],"sourceRoot":"../../../../src","sources":["pid/sd-jwt/index.ts"],"mappings":";;;;;;;;;;;;;AAAA,IAAAA,MAAA,GAAAC,OAAA;AAGA,IAAAC,WAAA,GAAAD,OAAA;AACA,IAAAE,MAAA,GAAAF,OAAA;AAkEA,IAAAG,OAAA,GAAAH,OAAA;AAhEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO,SAASI,MAAMA,CAACC,KAAa,EAAgB;EAClD,IAAI;IAAEC,KAAK;IAAEC;EAAY,CAAC,GAAG,IAAAC,aAAS,EAACH,KAAK,EAAEI,eAAQ,CAAC;EACvD,MAAMC,GAAG,GAAG,IAAAC,wBAAY,EAACL,KAAK,EAAEC,WAAW,CAAC;EAE5C,OAAO;IAAEG,GAAG;IAAEJ,KAAK;IAAEC;EAAY,CAAC;AACpC;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO,eAAeK,MAAMA,CAACP,KAAa,EAAyB;EACjE,MAAMQ,OAAO,GAAGT,MAAM,CAACC,KAAK,CAAC;EAC7B,MAAMS,SAAS,GAAGD,OAAO,CAACP,KAAK,CAACS,OAAO,CAACC,GAAG,CAACC,GAAG;EAC/C,MAAM,IAAAC,aAAS,EAACb,KAAK,EAAES,SAAS,EAAEL,eAAQ,CAAC;EAE3C,OAAOI,OAAO;AAChB;;AAWA;AACA;AACA"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.PID = void 0;
|
|
7
|
+
var _zod = require("zod");
|
|
8
|
+
const VerificationEvidence = _zod.z.object({
|
|
9
|
+
type: _zod.z.string(),
|
|
10
|
+
record: _zod.z.object({
|
|
11
|
+
type: _zod.z.string(),
|
|
12
|
+
source: _zod.z.object({
|
|
13
|
+
organization_name: _zod.z.string(),
|
|
14
|
+
organization_id: _zod.z.string(),
|
|
15
|
+
country_code: _zod.z.string()
|
|
16
|
+
})
|
|
17
|
+
})
|
|
18
|
+
});
|
|
19
|
+
const Verification = _zod.z.object({
|
|
20
|
+
trustFramework: _zod.z.literal("eidas"),
|
|
21
|
+
assuranceLevel: _zod.z.string(),
|
|
22
|
+
evidence: _zod.z.array(VerificationEvidence)
|
|
23
|
+
});
|
|
24
|
+
|
|
25
|
+
/**
|
|
26
|
+
* Data structure for the PID.
|
|
27
|
+
* It contains PID claims in plain text as well as verification data with the issuer's information
|
|
28
|
+
*
|
|
29
|
+
* @see https://italia.github.io/eidas-it-wallet-docs/en/pid-data-model.html
|
|
30
|
+
*/
|
|
31
|
+
|
|
32
|
+
const PID = _zod.z.object({
|
|
33
|
+
issuer: _zod.z.string(),
|
|
34
|
+
issuedAt: _zod.z.date(),
|
|
35
|
+
expiration: _zod.z.date(),
|
|
36
|
+
verification: Verification,
|
|
37
|
+
claims: _zod.z.object({
|
|
38
|
+
uniqueId: _zod.z.string(),
|
|
39
|
+
givenName: _zod.z.string(),
|
|
40
|
+
familyName: _zod.z.string(),
|
|
41
|
+
birthdate: _zod.z.string(),
|
|
42
|
+
placeOfBirth: _zod.z.object({
|
|
43
|
+
country: _zod.z.string(),
|
|
44
|
+
locality: _zod.z.string()
|
|
45
|
+
}),
|
|
46
|
+
taxIdCode: _zod.z.string()
|
|
47
|
+
})
|
|
48
|
+
});
|
|
49
|
+
exports.PID = PID;
|
|
50
|
+
//# sourceMappingURL=types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["_zod","require","VerificationEvidence","z","object","type","string","record","source","organization_name","organization_id","country_code","Verification","trustFramework","literal","assuranceLevel","evidence","array","PID","issuer","issuedAt","date","expiration","verification","claims","uniqueId","givenName","familyName","birthdate","placeOfBirth","country","locality","taxIdCode","exports"],"sourceRoot":"../../../../src","sources":["pid/sd-jwt/types.ts"],"mappings":";;;;;;AAAA,IAAAA,IAAA,GAAAC,OAAA;AAEA,MAAMC,oBAAoB,GAAGC,MAAC,CAACC,MAAM,CAAC;EACpCC,IAAI,EAAEF,MAAC,CAACG,MAAM,CAAC,CAAC;EAChBC,MAAM,EAAEJ,MAAC,CAACC,MAAM,CAAC;IACfC,IAAI,EAAEF,MAAC,CAACG,MAAM,CAAC,CAAC;IAChBE,MAAM,EAAEL,MAAC,CAACC,MAAM,CAAC;MACfK,iBAAiB,EAAEN,MAAC,CAACG,MAAM,CAAC,CAAC;MAC7BI,eAAe,EAAEP,MAAC,CAACG,MAAM,CAAC,CAAC;MAC3BK,YAAY,EAAER,MAAC,CAACG,MAAM,CAAC;IACzB,CAAC;EACH,CAAC;AACH,CAAC,CAAC;AAEF,MAAMM,YAAY,GAAGT,MAAC,CAACC,MAAM,CAAC;EAC5BS,cAAc,EAAEV,MAAC,CAACW,OAAO,CAAC,OAAO,CAAC;EAClCC,cAAc,EAAEZ,MAAC,CAACG,MAAM,CAAC,CAAC;EAC1BU,QAAQ,EAAEb,MAAC,CAACc,KAAK,CAACf,oBAAoB;AACxC,CAAC,CAAC;;AAEF;AACA;AACA;AACA;AACA;AACA;;AAEO,MAAMgB,GAAG,GAAGf,MAAC,CAACC,MAAM,CAAC;EAC1Be,MAAM,EAAEhB,MAAC,CAACG,MAAM,CAAC,CAAC;EAClBc,QAAQ,EAAEjB,MAAC,CAACkB,IAAI,CAAC,CAAC;EAClBC,UAAU,EAAEnB,MAAC,CAACkB,IAAI,CAAC,CAAC;EACpBE,YAAY,EAAEX,YAAY;EAC1BY,MAAM,EAAErB,MAAC,CAACC,MAAM,CAAC;IACfqB,QAAQ,EAAEtB,MAAC,CAACG,MAAM,CAAC,CAAC;IACpBoB,SAAS,EAAEvB,MAAC,CAACG,MAAM,CAAC,CAAC;IACrBqB,UAAU,EAAExB,MAAC,CAACG,MAAM,CAAC,CAAC;IACtBsB,SAAS,EAAEzB,MAAC,CAACG,MAAM,CAAC,CAAC;IACrBuB,YAAY,EAAE1B,MAAC,CAACC,MAAM,CAAC;MACrB0B,OAAO,EAAE3B,MAAC,CAACG,MAAM,CAAC,CAAC;MACnByB,QAAQ,EAAE5B,MAAC,CAACG,MAAM,CAAC;IACrB,CAAC,CAAC;IACF0B,SAAS,EAAE7B,MAAC,CAACG,MAAM,CAAC;EACtB,CAAC;AACH,CAAC,CAAC;AAAC2B,OAAA,CAAAf,GAAA,GAAAA,GAAA"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
var _converters = require("../converters");
|
|
4
|
+
const disclosures = [["6w1_soRXFgaHKfpYn3cvfQ", "given_name", "Mario"], ["fuNp97Hf3wV6y48y-QZhIg", "birthdate", "1980-10-01"], ["p-9LzyWHZBVDvhXDWkN2xA", "place_of_birth", {
|
|
5
|
+
country: "IT",
|
|
6
|
+
locality: "Rome"
|
|
7
|
+
}]];
|
|
8
|
+
describe("getValueFromDisclosures", () => {
|
|
9
|
+
it("should return correct value for given_name", () => {
|
|
10
|
+
const success = (0, _converters.getValueFromDisclosures)(disclosures, "given_name");
|
|
11
|
+
expect(success).toBe("Mario");
|
|
12
|
+
});
|
|
13
|
+
it("should return correct value for place_of_birth", () => {
|
|
14
|
+
const success = (0, _converters.getValueFromDisclosures)(disclosures, "place_of_birth");
|
|
15
|
+
expect(success).toEqual({
|
|
16
|
+
country: "IT",
|
|
17
|
+
locality: "Rome"
|
|
18
|
+
});
|
|
19
|
+
});
|
|
20
|
+
it("should fail", () => {
|
|
21
|
+
const success = (0, _converters.getValueFromDisclosures)(disclosures, "given_surname");
|
|
22
|
+
expect(success).toBeUndefined();
|
|
23
|
+
});
|
|
24
|
+
});
|
|
25
|
+
//# sourceMappingURL=converters.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["_converters","require","disclosures","country","locality","describe","it","success","getValueFromDisclosures","expect","toBe","toEqual","toBeUndefined"],"sourceRoot":"../../../../src","sources":["sd-jwt/__test__/converters.test.ts"],"mappings":";;AAAA,IAAAA,WAAA,GAAAC,OAAA;AAGA,MAAMC,WAAyB,GAAG,CAChC,CAAC,wBAAwB,EAAE,YAAY,EAAE,OAAO,CAAC,EACjD,CAAC,wBAAwB,EAAE,WAAW,EAAE,YAAY,CAAC,EACrD,CACE,wBAAwB,EACxB,gBAAgB,EAChB;EAAEC,OAAO,EAAE,IAAI;EAAEC,QAAQ,EAAE;AAAO,CAAC,CACpC,CACF;AAEDC,QAAQ,CAAC,yBAAyB,EAAE,MAAM;EACxCC,EAAE,CAAC,4CAA4C,EAAE,MAAM;IACrD,MAAMC,OAAO,GAAG,IAAAC,mCAAuB,EAACN,WAAW,EAAE,YAAY,CAAC;IAClEO,MAAM,CAACF,OAAO,CAAC,CAACG,IAAI,CAAC,OAAO,CAAC;EAC/B,CAAC,CAAC;EACFJ,EAAE,CAAC,gDAAgD,EAAE,MAAM;IACzD,MAAMC,OAAO,GAAG,IAAAC,mCAAuB,EAACN,WAAW,EAAE,gBAAgB,CAAC;IACtEO,MAAM,CAACF,OAAO,CAAC,CAACI,OAAO,CAAC;MAAER,OAAO,EAAE,IAAI;MAAEC,QAAQ,EAAE;IAAO,CAAC,CAAC;EAC9D,CAAC,CAAC;EACFE,EAAE,CAAC,aAAa,EAAE,MAAM;IACtB,MAAMC,OAAO,GAAG,IAAAC,mCAAuB,EAACN,WAAW,EAAE,eAAe,CAAC;IACrEO,MAAM,CAACF,OAAO,CAAC,CAACK,aAAa,CAAC,CAAC;EACjC,CAAC,CAAC;AACJ,CAAC,CAAC"}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
var _types = require("../types");
|
|
4
|
+
describe("SdJwt4VC", () => {
|
|
5
|
+
it("should accept a valid token", () => {
|
|
6
|
+
// example provided at https://italia.github.io/eidas-it-wallet-docs/en/pid-data-model.html
|
|
7
|
+
const token = {
|
|
8
|
+
header: {
|
|
9
|
+
typ: "vc+sd-jwt",
|
|
10
|
+
alg: "RS512",
|
|
11
|
+
kid: "dB67gL7ck3TFiIAf7N6_7SHvqk0MDYMEQcoGGlkUAAw",
|
|
12
|
+
trust_chain: ["NEhRdERpYnlHY3M5WldWTWZ2aUhm ...", "eyJhbGciOiJSUzI1NiIsImtpZCI6 ...", "IkJYdmZybG5oQU11SFIwN2FqVW1B ..."]
|
|
13
|
+
},
|
|
14
|
+
payload: {
|
|
15
|
+
iss: "https://pidprovider.example.org",
|
|
16
|
+
sub: "NzbLsXh8uDCcd7noWXFZAfHkxZsRGC9Xs...",
|
|
17
|
+
jti: "urn:uuid:6c5c0a49-b589-431d-bae7-219122a9ec2c",
|
|
18
|
+
iat: 1541493724,
|
|
19
|
+
exp: 1541493724,
|
|
20
|
+
status: "https://pidprovider.example.org/status",
|
|
21
|
+
cnf: {
|
|
22
|
+
jwk: {
|
|
23
|
+
kty: "RSA",
|
|
24
|
+
use: "sig",
|
|
25
|
+
n: "1Ta-sE …",
|
|
26
|
+
e: "AQAB",
|
|
27
|
+
kid: "YhNFS3YnC9tjiCaivhWLVUJ3AxwGGz_98uRFaqMEEs"
|
|
28
|
+
}
|
|
29
|
+
},
|
|
30
|
+
type: "PersonIdentificationData",
|
|
31
|
+
verified_claims: {
|
|
32
|
+
verification: {
|
|
33
|
+
_sd: ["OGm7ryXgt5Xzlevp-Hu-UTk0a-TxAaPAobqv1pIWMfw"],
|
|
34
|
+
trust_framework: "eidas",
|
|
35
|
+
assurance_level: "high"
|
|
36
|
+
},
|
|
37
|
+
claims: {
|
|
38
|
+
_sd: ["8JjozBfovMNvQ3HflmPWy4O19Gpxs61FWHjZebU589E", "BoMGktW1rbikntw8Fzx_BeL4YbAndr6AHsdgpatFCig", "CFLGzentGNRFngnLVVQVcoAFi05r6RJUX-rdbLdEfew", "JU_sTaHCngS32X-0ajHrd1-HCLCkpT5YqgcfQme168w", "VQI-S1mT1Kxfq2o8J9io7xMMX2MIxaG9M9PeJVqrMcA", "zVdghcmClMVWlUgGsGpSkCPkEHZ4u9oWj1SlIBlCc1o"]
|
|
39
|
+
}
|
|
40
|
+
},
|
|
41
|
+
_sd_alg: "sha-256"
|
|
42
|
+
}
|
|
43
|
+
};
|
|
44
|
+
const {
|
|
45
|
+
success
|
|
46
|
+
} = _types.SdJwt4VC.safeParse(token);
|
|
47
|
+
expect(success).toBe(true);
|
|
48
|
+
});
|
|
49
|
+
});
|
|
50
|
+
describe("Disclosure", () => {
|
|
51
|
+
it("should accept a valid disclosure", () => {
|
|
52
|
+
// example provided at https://italia.github.io/eidas-it-wallet-docs/en/pid-data-model.html
|
|
53
|
+
const value = ["2GLC42sKQveCfGfryNRN9w", "evidence", [{
|
|
54
|
+
type: "electronic_record",
|
|
55
|
+
record: {
|
|
56
|
+
type: "eidas.it.cie",
|
|
57
|
+
source: {
|
|
58
|
+
organization_name: "Ministero dell'Interno",
|
|
59
|
+
organization_id: "m_it",
|
|
60
|
+
country_code: "IT"
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
}]];
|
|
64
|
+
const {
|
|
65
|
+
success
|
|
66
|
+
} = _types.Disclosure.safeParse(value);
|
|
67
|
+
expect(success).toBe(true);
|
|
68
|
+
});
|
|
69
|
+
});
|
|
70
|
+
//# sourceMappingURL=types.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["_types","require","describe","it","token","header","typ","alg","kid","trust_chain","payload","iss","sub","jti","iat","exp","status","cnf","jwk","kty","use","n","e","type","verified_claims","verification","_sd","trust_framework","assurance_level","claims","_sd_alg","success","SdJwt4VC","safeParse","expect","toBe","value","record","source","organization_name","organization_id","country_code","Disclosure"],"sourceRoot":"../../../../src","sources":["sd-jwt/__test__/types.test.ts"],"mappings":";;AAAA,IAAAA,MAAA,GAAAC,OAAA;AAEAC,QAAQ,CAAC,UAAU,EAAE,MAAM;EACzBC,EAAE,CAAC,6BAA6B,EAAE,MAAM;IACtC;IACA,MAAMC,KAAK,GAAG;MACZC,MAAM,EAAE;QACNC,GAAG,EAAE,WAAW;QAChBC,GAAG,EAAE,OAAO;QACZC,GAAG,EAAE,6CAA6C;QAClDC,WAAW,EAAE,CACX,kCAAkC,EAClC,kCAAkC,EAClC,kCAAkC;MAEtC,CAAC;MACDC,OAAO,EAAE;QACPC,GAAG,EAAE,iCAAiC;QACtCC,GAAG,EAAE,sCAAsC;QAC3CC,GAAG,EAAE,+CAA+C;QACpDC,GAAG,EAAE,UAAU;QACfC,GAAG,EAAE,UAAU;QACfC,MAAM,EAAE,wCAAwC;QAChDC,GAAG,EAAE;UACHC,GAAG,EAAE;YACHC,GAAG,EAAE,KAAK;YACVC,GAAG,EAAE,KAAK;YACVC,CAAC,EAAE,UAAU;YACbC,CAAC,EAAE,MAAM;YACTd,GAAG,EAAE;UACP;QACF,CAAC;QACDe,IAAI,EAAE,0BAA0B;QAChCC,eAAe,EAAE;UACfC,YAAY,EAAE;YACZC,GAAG,EAAE,CAAC,6CAA6C,CAAC;YACpDC,eAAe,EAAE,OAAO;YACxBC,eAAe,EAAE;UACnB,CAAC;UACDC,MAAM,EAAE;YACNH,GAAG,EAAE,CACH,6CAA6C,EAC7C,6CAA6C,EAC7C,6CAA6C,EAC7C,6CAA6C,EAC7C,6CAA6C,EAC7C,6CAA6C;UAEjD;QACF,CAAC;QACDI,OAAO,EAAE;MACX;IACF,CAAC;IAED,MAAM;MAAEC;IAAQ,CAAC,GAAGC,eAAQ,CAACC,SAAS,CAAC7B,KAAK,CAAC;IAE7C8B,MAAM,CAACH,OAAO,CAAC,CAACI,IAAI,CAAC,IAAI,CAAC;EAC5B,CAAC,CAAC;AACJ,CAAC,CAAC;AAEFjC,QAAQ,CAAC,YAAY,EAAE,MAAM;EAC3BC,EAAE,CAAC,kCAAkC,EAAE,MAAM;IAC3C;IACA,MAAMiC,KAAK,GAAG,CACZ,wBAAwB,EACxB,UAAU,EACV,CACE;MACEb,IAAI,EAAE,mBAAmB;MACzBc,MAAM,EAAE;QACNd,IAAI,EAAE,cAAc;QACpBe,MAAM,EAAE;UACNC,iBAAiB,EAAE,wBAAwB;UAC3CC,eAAe,EAAE,MAAM;UACvBC,YAAY,EAAE;QAChB;MACF;IACF,CAAC,CACF,CACF;IAED,MAAM;MAAEV;IAAQ,CAAC,GAAGW,iBAAU,CAACT,SAAS,CAACG,KAAK,CAAC;IAC/CF,MAAM,CAACH,OAAO,CAAC,CAACI,IAAI,CAAC,IAAI,CAAC;EAC5B,CAAC,CAAC;AACJ,CAAC,CAAC"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.getValueFromDisclosures = getValueFromDisclosures;
|
|
7
|
+
function getValueFromDisclosures(disclosures, claimName) {
|
|
8
|
+
var _disclosures$find;
|
|
9
|
+
const value = (_disclosures$find = disclosures.find(_ref => {
|
|
10
|
+
let [, name] = _ref;
|
|
11
|
+
return name === claimName;
|
|
12
|
+
})) === null || _disclosures$find === void 0 ? void 0 : _disclosures$find[2];
|
|
13
|
+
// value didn't found, we return nothing
|
|
14
|
+
if (!value) {
|
|
15
|
+
return undefined;
|
|
16
|
+
}
|
|
17
|
+
// value is not a string, it's probably fine
|
|
18
|
+
if (typeof value !== "string") {
|
|
19
|
+
return value;
|
|
20
|
+
}
|
|
21
|
+
// value is a string, we try to parse it
|
|
22
|
+
// maybe it's a serialized object
|
|
23
|
+
try {
|
|
24
|
+
return JSON.parse(value);
|
|
25
|
+
} catch (error) {
|
|
26
|
+
// It's definitely a string
|
|
27
|
+
return value;
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
//# sourceMappingURL=converters.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["getValueFromDisclosures","disclosures","claimName","_disclosures$find","value","find","_ref","name","undefined","JSON","parse","error"],"sourceRoot":"../../../src","sources":["sd-jwt/converters.ts"],"mappings":";;;;;;AAEO,SAASA,uBAAuBA,CACrCC,WAAyB,EACzBC,SAAiB,EACjB;EAAA,IAAAC,iBAAA;EACA,MAAMC,KAAK,IAAAD,iBAAA,GAAGF,WAAW,CAACI,IAAI,CAACC,IAAA;IAAA,IAAC,GAAGC,IAAI,CAAC,GAAAD,IAAA;IAAA,OAAKC,IAAI,KAAKL,SAAS;EAAA,EAAC,cAAAC,iBAAA,uBAAlDA,iBAAA,CAAqD,CAAC,CAAC;EACrE;EACA,IAAI,CAACC,KAAK,EAAE;IACV,OAAOI,SAAS;EAClB;EACA;EACA,IAAI,OAAOJ,KAAK,KAAK,QAAQ,EAAE;IAC7B,OAAOA,KAAK;EACd;EACA;EACA;EACA,IAAI;IACF,OAAOK,IAAI,CAACC,KAAK,CAACN,KAAK,CAAC;EAC1B,CAAC,CAAC,OAAOO,KAAK,EAAE;IACd;IACA,OAAOP,KAAK;EACd;AACF"}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.verify = exports.decode = void 0;
|
|
7
|
+
var _ioReactNativeJwt = require("@pagopa/io-react-native-jwt");
|
|
8
|
+
var _types = require("./types");
|
|
9
|
+
var _verifier = require("./verifier");
|
|
10
|
+
/**
|
|
11
|
+
* Decode a given SD-JWT with Disclosures to get the parsed SD-JWT object they define.
|
|
12
|
+
* It ensures provided data is in a valid shape.
|
|
13
|
+
*
|
|
14
|
+
* It DOES NOT verify token signature nor check disclosures are correctly referenced by the SD-JWT.
|
|
15
|
+
* Use {@link verify} instead
|
|
16
|
+
*
|
|
17
|
+
* @function
|
|
18
|
+
* @param token The encoded token that represents a valid sd-jwt for verifiable credentials
|
|
19
|
+
* @param schema Schema to use to parse the SD-JWT
|
|
20
|
+
*
|
|
21
|
+
* @returns The parsed SD-JWT token and the parsed disclosures
|
|
22
|
+
*
|
|
23
|
+
*/
|
|
24
|
+
const decode = (token, schema) => {
|
|
25
|
+
// token are expected in the form "sd-jwt~disclosure0~disclosure1~...~disclosureN"
|
|
26
|
+
const [rawSdJwt = "", ...rawDisclosures] = token.split("~");
|
|
27
|
+
|
|
28
|
+
// get the sd-jwt as object
|
|
29
|
+
// validate it's a valid SD-JWT for Verifiable Credentials
|
|
30
|
+
const decodedJwt = (0, _ioReactNativeJwt.decode)(rawSdJwt);
|
|
31
|
+
const sdJwt = schema.parse({
|
|
32
|
+
header: decodedJwt.protectedHeader,
|
|
33
|
+
payload: decodedJwt.payload
|
|
34
|
+
});
|
|
35
|
+
|
|
36
|
+
// get disclosures as list of triples
|
|
37
|
+
// validate each triple
|
|
38
|
+
// throw a validation error if at least one fails to parse
|
|
39
|
+
const disclosures = rawDisclosures.map(_ioReactNativeJwt.decodeBase64).map(e => JSON.parse(e)).map(e => _types.Disclosure.parse(e));
|
|
40
|
+
return {
|
|
41
|
+
sdJwt,
|
|
42
|
+
disclosures
|
|
43
|
+
};
|
|
44
|
+
};
|
|
45
|
+
|
|
46
|
+
/**
|
|
47
|
+
* Verify a given SD-JWT with Disclosures
|
|
48
|
+
* Same as {@link decode} plus:
|
|
49
|
+
* - token signature verification
|
|
50
|
+
* - ensure disclosures are well-defined inside the SD-JWT
|
|
51
|
+
*
|
|
52
|
+
* @async @function
|
|
53
|
+
*
|
|
54
|
+
*
|
|
55
|
+
* @param token The encoded token that represents a valid sd-jwt for verifiable credentials
|
|
56
|
+
* @param publicKey The public key to validate the signature
|
|
57
|
+
* @param schema Schema to use to parse the SD-JWT
|
|
58
|
+
*
|
|
59
|
+
* @returns The parsed SD-JWT token and the parsed disclosures
|
|
60
|
+
*
|
|
61
|
+
*/
|
|
62
|
+
exports.decode = decode;
|
|
63
|
+
const verify = async (token, publicKey, schema) => {
|
|
64
|
+
// get decoded data
|
|
65
|
+
const [rawSdJwt = ""] = token.split("~");
|
|
66
|
+
const decoded = decode(token, schema);
|
|
67
|
+
|
|
68
|
+
//Check signature
|
|
69
|
+
await (0, _ioReactNativeJwt.verify)(rawSdJwt, publicKey);
|
|
70
|
+
|
|
71
|
+
//Check disclosures in sd-jwt
|
|
72
|
+
const claims = [...decoded.sdJwt.payload.verified_claims.verification._sd, ...decoded.sdJwt.payload.verified_claims.claims._sd];
|
|
73
|
+
await Promise.all(decoded.disclosures.map(async disclosure => await (0, _verifier.verifyDisclosure)(disclosure, claims)));
|
|
74
|
+
return decoded;
|
|
75
|
+
};
|
|
76
|
+
exports.verify = verify;
|
|
77
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["_ioReactNativeJwt","require","_types","_verifier","decode","token","schema","rawSdJwt","rawDisclosures","split","decodedJwt","decodeJwt","sdJwt","parse","header","protectedHeader","payload","disclosures","map","decodeBase64","e","JSON","Disclosure","exports","verify","publicKey","decoded","verifyJwt","claims","verified_claims","verification","_sd","Promise","all","disclosure","verifyDisclosure"],"sourceRoot":"../../../src","sources":["sd-jwt/index.ts"],"mappings":";;;;;;AAEA,IAAAA,iBAAA,GAAAC,OAAA;AAIA,IAAAC,MAAA,GAAAD,OAAA;AACA,IAAAE,SAAA,GAAAF,OAAA;AAGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO,MAAMG,MAAM,GAAGA,CACpBC,KAAa,EACbC,MAAS,KAC4C;EACrD;EACA,MAAM,CAACC,QAAQ,GAAG,EAAE,EAAE,GAAGC,cAAc,CAAC,GAAGH,KAAK,CAACI,KAAK,CAAC,GAAG,CAAC;;EAE3D;EACA;EACA,MAAMC,UAAU,GAAG,IAAAC,wBAAS,EAACJ,QAAQ,CAAC;EACtC,MAAMK,KAAK,GAAGN,MAAM,CAACO,KAAK,CAAC;IACzBC,MAAM,EAAEJ,UAAU,CAACK,eAAe;IAClCC,OAAO,EAAEN,UAAU,CAACM;EACtB,CAAC,CAAC;;EAEF;EACA;EACA;EACA,MAAMC,WAAW,GAAGT,cAAc,CAC/BU,GAAG,CAACC,8BAAY,CAAC,CACjBD,GAAG,CAAEE,CAAC,IAAKC,IAAI,CAACR,KAAK,CAACO,CAAC,CAAC,CAAC,CACzBF,GAAG,CAAEE,CAAC,IAAKE,iBAAU,CAACT,KAAK,CAACO,CAAC,CAAC,CAAC;EAElC,OAAO;IAAER,KAAK;IAAEK;EAAY,CAAC;AAC/B,CAAC;;AAED;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AAfAM,OAAA,CAAAnB,MAAA,GAAAA,MAAA;AAgBO,MAAMoB,MAAM,GAAG,MAAAA,CACpBnB,KAAa,EACboB,SAAc,EACdnB,MAAS,KACqD;EAC9D;EACA,MAAM,CAACC,QAAQ,GAAG,EAAE,CAAC,GAAGF,KAAK,CAACI,KAAK,CAAC,GAAG,CAAC;EACxC,MAAMiB,OAAO,GAAGtB,MAAM,CAACC,KAAK,EAAEC,MAAM,CAAC;;EAErC;EACA,MAAM,IAAAqB,wBAAS,EAACpB,QAAQ,EAAEkB,SAAS,CAAC;;EAEpC;EACA,MAAMG,MAAM,GAAG,CACb,GAAGF,OAAO,CAACd,KAAK,CAACI,OAAO,CAACa,eAAe,CAACC,YAAY,CAACC,GAAG,EACzD,GAAGL,OAAO,CAACd,KAAK,CAACI,OAAO,CAACa,eAAe,CAACD,MAAM,CAACG,GAAG,CACpD;EAED,MAAMC,OAAO,CAACC,GAAG,CACfP,OAAO,CAACT,WAAW,CAACC,GAAG,CACrB,MAAOgB,UAAU,IAAK,MAAM,IAAAC,0BAAgB,EAACD,UAAU,EAAEN,MAAM,CACjE,CACF,CAAC;EAED,OAAOF,OAAO;AAChB,CAAC;AAACH,OAAA,CAAAC,MAAA,GAAAA,MAAA"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.UnixTime = exports.SdJwt4VC = exports.ObfuscatedDisclosures = exports.Disclosure = void 0;
|
|
7
|
+
var _jwk = require("../utils/jwk");
|
|
8
|
+
var _zod = require("zod");
|
|
9
|
+
const UnixTime = _zod.z.number().min(0).max(2147483647000);
|
|
10
|
+
exports.UnixTime = UnixTime;
|
|
11
|
+
const ObfuscatedDisclosures = _zod.z.object({
|
|
12
|
+
_sd: _zod.z.array(_zod.z.string())
|
|
13
|
+
});
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
* A triple of values in the form of {salt, claim name, claim value} that represent a parsed disclosure.
|
|
17
|
+
*
|
|
18
|
+
* @see https://datatracker.ietf.org/doc/html/draft-ietf-oauth-selective-disclosure-jwt-04
|
|
19
|
+
* @see https://vcstuff.github.io/draft-terbu-sd-jwt-vc/draft-terbu-oauth-sd-jwt-vc.html
|
|
20
|
+
*/
|
|
21
|
+
exports.ObfuscatedDisclosures = ObfuscatedDisclosures;
|
|
22
|
+
const Disclosure = _zod.z.tuple([/* salt */_zod.z.string(), /* claim name */_zod.z.string(), /* claim value */_zod.z.unknown()]);
|
|
23
|
+
exports.Disclosure = Disclosure;
|
|
24
|
+
const SdJwt4VC = _zod.z.object({
|
|
25
|
+
header: _zod.z.object({
|
|
26
|
+
typ: _zod.z.literal("vc+sd-jwt"),
|
|
27
|
+
alg: _zod.z.string(),
|
|
28
|
+
kid: _zod.z.string(),
|
|
29
|
+
trust_chain: _zod.z.array(_zod.z.string())
|
|
30
|
+
}),
|
|
31
|
+
payload: _zod.z.object({
|
|
32
|
+
iss: _zod.z.string(),
|
|
33
|
+
sub: _zod.z.string(),
|
|
34
|
+
jti: _zod.z.string(),
|
|
35
|
+
iat: UnixTime,
|
|
36
|
+
exp: UnixTime,
|
|
37
|
+
status: _zod.z.string(),
|
|
38
|
+
cnf: _zod.z.object({
|
|
39
|
+
jwk: _jwk.JWK
|
|
40
|
+
}),
|
|
41
|
+
type: _zod.z.literal("PersonIdentificationData"),
|
|
42
|
+
verified_claims: _zod.z.object({
|
|
43
|
+
verification: _zod.z.intersection(_zod.z.object({
|
|
44
|
+
trust_framework: _zod.z.literal("eidas"),
|
|
45
|
+
assurance_level: _zod.z.string()
|
|
46
|
+
}), ObfuscatedDisclosures),
|
|
47
|
+
claims: ObfuscatedDisclosures
|
|
48
|
+
}),
|
|
49
|
+
_sd_alg: _zod.z.literal("sha-256")
|
|
50
|
+
})
|
|
51
|
+
});
|
|
52
|
+
exports.SdJwt4VC = SdJwt4VC;
|
|
53
|
+
//# sourceMappingURL=types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["_jwk","require","_zod","UnixTime","z","number","min","max","exports","ObfuscatedDisclosures","object","_sd","array","string","Disclosure","tuple","unknown","SdJwt4VC","header","typ","literal","alg","kid","trust_chain","payload","iss","sub","jti","iat","exp","status","cnf","jwk","JWK","type","verified_claims","verification","intersection","trust_framework","assurance_level","claims","_sd_alg"],"sourceRoot":"../../../src","sources":["sd-jwt/types.ts"],"mappings":";;;;;;AAAA,IAAAA,IAAA,GAAAC,OAAA;AACA,IAAAC,IAAA,GAAAD,OAAA;AAEO,MAAME,QAAQ,GAAGC,MAAC,CAACC,MAAM,CAAC,CAAC,CAACC,GAAG,CAAC,CAAC,CAAC,CAACC,GAAG,CAAC,aAAa,CAAC;AAACC,OAAA,CAAAL,QAAA,GAAAA,QAAA;AAItD,MAAMM,qBAAqB,GAAGL,MAAC,CAACM,MAAM,CAAC;EAAEC,GAAG,EAAEP,MAAC,CAACQ,KAAK,CAACR,MAAC,CAACS,MAAM,CAAC,CAAC;AAAE,CAAC,CAAC;;AAE3E;AACA;AACA;AACA;AACA;AACA;AALAL,OAAA,CAAAC,qBAAA,GAAAA,qBAAA;AAOO,MAAMK,UAAU,GAAGV,MAAC,CAACW,KAAK,CAAC,CAChC,UAAWX,MAAC,CAACS,MAAM,CAAC,CAAC,EACrB,gBAAiBT,MAAC,CAACS,MAAM,CAAC,CAAC,EAC3B,iBAAkBT,MAAC,CAACY,OAAO,CAAC,CAAC,CAC9B,CAAC;AAACR,OAAA,CAAAM,UAAA,GAAAA,UAAA;AAGI,MAAMG,QAAQ,GAAGb,MAAC,CAACM,MAAM,CAAC;EAC/BQ,MAAM,EAAEd,MAAC,CAACM,MAAM,CAAC;IACfS,GAAG,EAAEf,MAAC,CAACgB,OAAO,CAAC,WAAW,CAAC;IAC3BC,GAAG,EAAEjB,MAAC,CAACS,MAAM,CAAC,CAAC;IACfS,GAAG,EAAElB,MAAC,CAACS,MAAM,CAAC,CAAC;IACfU,WAAW,EAAEnB,MAAC,CAACQ,KAAK,CAACR,MAAC,CAACS,MAAM,CAAC,CAAC;EACjC,CAAC,CAAC;EACFW,OAAO,EAAEpB,MAAC,CAACM,MAAM,CAAC;IAChBe,GAAG,EAAErB,MAAC,CAACS,MAAM,CAAC,CAAC;IACfa,GAAG,EAAEtB,MAAC,CAACS,MAAM,CAAC,CAAC;IACfc,GAAG,EAAEvB,MAAC,CAACS,MAAM,CAAC,CAAC;IACfe,GAAG,EAAEzB,QAAQ;IACb0B,GAAG,EAAE1B,QAAQ;IACb2B,MAAM,EAAE1B,MAAC,CAACS,MAAM,CAAC,CAAC;IAClBkB,GAAG,EAAE3B,MAAC,CAACM,MAAM,CAAC;MACZsB,GAAG,EAAEC;IACP,CAAC,CAAC;IACFC,IAAI,EAAE9B,MAAC,CAACgB,OAAO,CAAC,0BAA0B,CAAC;IAC3Ce,eAAe,EAAE/B,MAAC,CAACM,MAAM,CAAC;MACxB0B,YAAY,EAAEhC,MAAC,CAACiC,YAAY,CAC1BjC,MAAC,CAACM,MAAM,CAAC;QACP4B,eAAe,EAAElC,MAAC,CAACgB,OAAO,CAAC,OAAO,CAAC;QACnCmB,eAAe,EAAEnC,MAAC,CAACS,MAAM,CAAC;MAC5B,CAAC,CAAC,EACFJ,qBACF,CAAC;MACD+B,MAAM,EAAE/B;IACV,CAAC,CAAC;IACFgC,OAAO,EAAErC,MAAC,CAACgB,OAAO,CAAC,SAAS;EAC9B,CAAC;AACH,CAAC,CAAC;AAACZ,OAAA,CAAAS,QAAA,GAAAA,QAAA"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.verifyDisclosure = void 0;
|
|
7
|
+
var _ioReactNativeJwt = require("@pagopa/io-react-native-jwt");
|
|
8
|
+
var _errors = require("../utils/errors");
|
|
9
|
+
const verifyDisclosure = async (disclosure, claims) => {
|
|
10
|
+
let disclosureString = JSON.stringify(disclosure);
|
|
11
|
+
let encodedDisclosure = (0, _ioReactNativeJwt.encodeBase64)(disclosureString);
|
|
12
|
+
let hash = await (0, _ioReactNativeJwt.sha256ToBase64)(encodedDisclosure);
|
|
13
|
+
if (!claims.includes(hash)) {
|
|
14
|
+
throw new _errors.ValidationFailed("Validation of disclosure failed", `${disclosure}`, "Disclosure hash not found in claims");
|
|
15
|
+
}
|
|
16
|
+
};
|
|
17
|
+
exports.verifyDisclosure = verifyDisclosure;
|
|
18
|
+
//# sourceMappingURL=verifier.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["_ioReactNativeJwt","require","_errors","verifyDisclosure","disclosure","claims","disclosureString","JSON","stringify","encodedDisclosure","encodeBase64","hash","sha256ToBase64","includes","ValidationFailed","exports"],"sourceRoot":"../../../src","sources":["sd-jwt/verifier.ts"],"mappings":";;;;;;AAAA,IAAAA,iBAAA,GAAAC,OAAA;AAEA,IAAAC,OAAA,GAAAD,OAAA;AAGO,MAAME,gBAAgB,GAAG,MAAAA,CAC9BC,UAAsB,EACtBC,MAAoC,KACjC;EACH,IAAIC,gBAAgB,GAAGC,IAAI,CAACC,SAAS,CAACJ,UAAU,CAAC;EACjD,IAAIK,iBAAiB,GAAG,IAAAC,8BAAY,EAACJ,gBAAgB,CAAC;EACtD,IAAIK,IAAI,GAAG,MAAM,IAAAC,gCAAc,EAACH,iBAAiB,CAAC;EAClD,IAAI,CAACJ,MAAM,CAACQ,QAAQ,CAACF,IAAI,CAAC,EAAE;IAC1B,MAAM,IAAIG,wBAAgB,CACxB,iCAAiC,EAChC,GAAEV,UAAW,EAAC,EACf,qCACF,CAAC;EACH;AACF,CAAC;AAACW,OAAA,CAAAZ,gBAAA,GAAAA,gBAAA"}
|