@pagopa/io-react-native-wallet 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- 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
@@ -0,0 +1,82 @@
|
|
1
|
+
"use strict";
|
2
|
+
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
4
|
+
value: true
|
5
|
+
});
|
6
|
+
exports.WalletInstanceAttestationIssuingError = exports.ValidationFailed = exports.IoWalletError = void 0;
|
7
|
+
/**
|
8
|
+
* A generic Error that all other io-wallet specific Error subclasses extend.
|
9
|
+
*
|
10
|
+
* @example Checking thrown error is a io-wallet one
|
11
|
+
*
|
12
|
+
* ```js
|
13
|
+
* if (err instanceof errors.IoWalletError) {
|
14
|
+
* // ...
|
15
|
+
* }
|
16
|
+
* ```
|
17
|
+
*/
|
18
|
+
class IoWalletError extends Error {
|
19
|
+
/** A unique error code for the particular error subclass. */
|
20
|
+
static get code() {
|
21
|
+
return "ERR_IO_WALLET_GENERIC";
|
22
|
+
}
|
23
|
+
|
24
|
+
/** A unique error code for the particular error subclass. */
|
25
|
+
code = "ERR_IO_WALLET_GENERIC";
|
26
|
+
constructor(message) {
|
27
|
+
var _Error$captureStackTr;
|
28
|
+
super(message);
|
29
|
+
this.name = this.constructor.name;
|
30
|
+
// @ts-ignore
|
31
|
+
(_Error$captureStackTr = Error.captureStackTrace) === null || _Error$captureStackTr === void 0 ? void 0 : _Error$captureStackTr.call(Error, this, this.constructor);
|
32
|
+
}
|
33
|
+
}
|
34
|
+
/**
|
35
|
+
* An error subclass thrown when validation fail
|
36
|
+
*
|
37
|
+
*/
|
38
|
+
exports.IoWalletError = IoWalletError;
|
39
|
+
class ValidationFailed extends IoWalletError {
|
40
|
+
static get code() {
|
41
|
+
return "ERR_IO_WALLET_VALIDATION_FAILED";
|
42
|
+
}
|
43
|
+
code = "ERR_IO_WALLET_VALIDATION_FAILED";
|
44
|
+
|
45
|
+
/** The Claim for which the validation failed. */
|
46
|
+
|
47
|
+
/** Reason code for the validation failure. */
|
48
|
+
|
49
|
+
constructor(message) {
|
50
|
+
let claim = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : "unspecified";
|
51
|
+
let reason = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : "unspecified";
|
52
|
+
super(message);
|
53
|
+
this.claim = claim;
|
54
|
+
this.reason = reason;
|
55
|
+
}
|
56
|
+
}
|
57
|
+
|
58
|
+
/**
|
59
|
+
* An error subclass thrown when validation fail
|
60
|
+
*
|
61
|
+
*/
|
62
|
+
exports.ValidationFailed = ValidationFailed;
|
63
|
+
class WalletInstanceAttestationIssuingError extends IoWalletError {
|
64
|
+
static get code() {
|
65
|
+
return "ERR_IO_WALLET_INSTANCE_ATTESTATION_ISSUING_FAILED";
|
66
|
+
}
|
67
|
+
code = "ERR_IO_WALLET_INSTANCE_ATTESTATION_ISSUING_FAILED";
|
68
|
+
|
69
|
+
/** The Claim for which the validation failed. */
|
70
|
+
|
71
|
+
/** Reason code for the validation failure. */
|
72
|
+
|
73
|
+
constructor(message) {
|
74
|
+
let claim = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : "unspecified";
|
75
|
+
let reason = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : "unspecified";
|
76
|
+
super(message);
|
77
|
+
this.claim = claim;
|
78
|
+
this.reason = reason;
|
79
|
+
}
|
80
|
+
}
|
81
|
+
exports.WalletInstanceAttestationIssuingError = WalletInstanceAttestationIssuingError;
|
82
|
+
//# sourceMappingURL=errors.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"names":["IoWalletError","Error","code","constructor","message","_Error$captureStackTr","name","captureStackTrace","call","exports","ValidationFailed","claim","arguments","length","undefined","reason","WalletInstanceAttestationIssuingError"],"sourceRoot":"../../../src","sources":["utils/errors.ts"],"mappings":";;;;;;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO,MAAMA,aAAa,SAASC,KAAK,CAAC;EACvC;EACA,WAAWC,IAAIA,CAAA,EAAW;IACxB,OAAO,uBAAuB;EAChC;;EAEA;EACAA,IAAI,GAAW,uBAAuB;EAEtCC,WAAWA,CAACC,OAAgB,EAAE;IAAA,IAAAC,qBAAA;IAC5B,KAAK,CAACD,OAAO,CAAC;IACd,IAAI,CAACE,IAAI,GAAG,IAAI,CAACH,WAAW,CAACG,IAAI;IACjC;IACA,CAAAD,qBAAA,GAAAJ,KAAK,CAACM,iBAAiB,cAAAF,qBAAA,uBAAvBA,qBAAA,CAAAG,IAAA,CAAAP,KAAK,EAAqB,IAAI,EAAE,IAAI,CAACE,WAAW,CAAC;EACnD;AACF;AACA;AACA;AACA;AACA;AAHAM,OAAA,CAAAT,aAAA,GAAAA,aAAA;AAIO,MAAMU,gBAAgB,SAASV,aAAa,CAAC;EAClD,WAAWE,IAAIA,CAAA,EAAsC;IACnD,OAAO,iCAAiC;EAC1C;EAEAA,IAAI,GAAG,iCAAiC;;EAExC;;EAGA;;EAGAC,WAAWA,CAACC,OAAe,EAAiD;IAAA,IAA/CO,KAAK,GAAAC,SAAA,CAAAC,MAAA,QAAAD,SAAA,QAAAE,SAAA,GAAAF,SAAA,MAAG,aAAa;IAAA,IAAEG,MAAM,GAAAH,SAAA,CAAAC,MAAA,QAAAD,SAAA,QAAAE,SAAA,GAAAF,SAAA,MAAG,aAAa;IACxE,KAAK,CAACR,OAAO,CAAC;IACd,IAAI,CAACO,KAAK,GAAGA,KAAK;IAClB,IAAI,CAACI,MAAM,GAAGA,MAAM;EACtB;AACF;;AAEA;AACA;AACA;AACA;AAHAN,OAAA,CAAAC,gBAAA,GAAAA,gBAAA;AAIO,MAAMM,qCAAqC,SAAShB,aAAa,CAAC;EACvE,WAAWE,IAAIA,CAAA,EAAwD;IACrE,OAAO,mDAAmD;EAC5D;EAEAA,IAAI,GAAG,mDAAmD;;EAE1D;;EAGA;;EAGAC,WAAWA,CAACC,OAAe,EAAiD;IAAA,IAA/CO,KAAK,GAAAC,SAAA,CAAAC,MAAA,QAAAD,SAAA,QAAAE,SAAA,GAAAF,SAAA,MAAG,aAAa;IAAA,IAAEG,MAAM,GAAAH,SAAA,CAAAC,MAAA,QAAAD,SAAA,QAAAE,SAAA,GAAAF,SAAA,MAAG,aAAa;IACxE,KAAK,CAACR,OAAO,CAAC;IACd,IAAI,CAACO,KAAK,GAAGA,KAAK;IAClB,IAAI,CAACI,MAAM,GAAGA,MAAM;EACtB;AACF;AAACN,OAAA,CAAAO,qCAAA,GAAAA,qCAAA"}
|
@@ -0,0 +1,45 @@
|
|
1
|
+
"use strict";
|
2
|
+
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
4
|
+
value: true
|
5
|
+
});
|
6
|
+
exports.JWK = void 0;
|
7
|
+
var _zod = require("zod");
|
8
|
+
const JWK = _zod.z.object({
|
9
|
+
/** JWK "alg" (Algorithm) Parameter. */
|
10
|
+
alg: _zod.z.string().optional(),
|
11
|
+
crv: _zod.z.string().optional(),
|
12
|
+
d: _zod.z.string().optional(),
|
13
|
+
dp: _zod.z.string().optional(),
|
14
|
+
dq: _zod.z.string().optional(),
|
15
|
+
e: _zod.z.string().optional(),
|
16
|
+
/** JWK "ext" (Extractable) Parameter. */
|
17
|
+
ext: _zod.z.boolean().optional(),
|
18
|
+
k: _zod.z.string().optional(),
|
19
|
+
/** JWK "key_ops" (Key Operations) Parameter. */
|
20
|
+
key_ops: _zod.z.array(_zod.z.string()).optional(),
|
21
|
+
/** JWK "kid" (Key ID) Parameter. */
|
22
|
+
kid: _zod.z.string().optional(),
|
23
|
+
/** JWK "kty" (Key Type) Parameter.
|
24
|
+
* This attribute is required to discriminate the
|
25
|
+
* type of EC/RSA algorithm */
|
26
|
+
kty: _zod.z.union([_zod.z.literal("RSA"), _zod.z.literal("EC")]),
|
27
|
+
n: _zod.z.string().optional(),
|
28
|
+
p: _zod.z.string().optional(),
|
29
|
+
q: _zod.z.string().optional(),
|
30
|
+
qi: _zod.z.string().optional(),
|
31
|
+
/** JWK "use" (Public Key Use) Parameter. */
|
32
|
+
use: _zod.z.string().optional(),
|
33
|
+
x: _zod.z.string().optional(),
|
34
|
+
y: _zod.z.string().optional(),
|
35
|
+
/** JWK "x5c" (X.509 Certificate Chain) Parameter. */
|
36
|
+
x5c: _zod.z.array(_zod.z.string()).optional(),
|
37
|
+
/** JWK "x5t" (X.509 Certificate SHA-1 Thumbprint) Parameter. */
|
38
|
+
x5t: _zod.z.string().optional(),
|
39
|
+
/** "x5t#S256" (X.509 Certificate SHA-256 Thumbprint) Parameter. */
|
40
|
+
"x5t#S256": _zod.z.string().optional(),
|
41
|
+
/** JWK "x5u" (X.509 URL) Parameter. */
|
42
|
+
x5u: _zod.z.string().optional()
|
43
|
+
});
|
44
|
+
exports.JWK = JWK;
|
45
|
+
//# sourceMappingURL=jwk.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"names":["_zod","require","JWK","z","object","alg","string","optional","crv","d","dp","dq","e","ext","boolean","k","key_ops","array","kid","kty","union","literal","n","p","q","qi","use","x","y","x5c","x5t","x5u","exports"],"sourceRoot":"../../../src","sources":["utils/jwk.ts"],"mappings":";;;;;;AAAA,IAAAA,IAAA,GAAAC,OAAA;AAGO,MAAMC,GAAG,GAAGC,MAAC,CAACC,MAAM,CAAC;EAC1B;EACAC,GAAG,EAAEF,MAAC,CAACG,MAAM,CAAC,CAAC,CAACC,QAAQ,CAAC,CAAC;EAC1BC,GAAG,EAAEL,MAAC,CAACG,MAAM,CAAC,CAAC,CAACC,QAAQ,CAAC,CAAC;EAC1BE,CAAC,EAAEN,MAAC,CAACG,MAAM,CAAC,CAAC,CAACC,QAAQ,CAAC,CAAC;EACxBG,EAAE,EAAEP,MAAC,CAACG,MAAM,CAAC,CAAC,CAACC,QAAQ,CAAC,CAAC;EACzBI,EAAE,EAAER,MAAC,CAACG,MAAM,CAAC,CAAC,CAACC,QAAQ,CAAC,CAAC;EACzBK,CAAC,EAAET,MAAC,CAACG,MAAM,CAAC,CAAC,CAACC,QAAQ,CAAC,CAAC;EACxB;EACAM,GAAG,EAAEV,MAAC,CAACW,OAAO,CAAC,CAAC,CAACP,QAAQ,CAAC,CAAC;EAC3BQ,CAAC,EAAEZ,MAAC,CAACG,MAAM,CAAC,CAAC,CAACC,QAAQ,CAAC,CAAC;EACxB;EACAS,OAAO,EAAEb,MAAC,CAACc,KAAK,CAACd,MAAC,CAACG,MAAM,CAAC,CAAC,CAAC,CAACC,QAAQ,CAAC,CAAC;EACvC;EACAW,GAAG,EAAEf,MAAC,CAACG,MAAM,CAAC,CAAC,CAACC,QAAQ,CAAC,CAAC;EAC1B;AACF;AACA;EACEY,GAAG,EAAEhB,MAAC,CAACiB,KAAK,CAAC,CAACjB,MAAC,CAACkB,OAAO,CAAC,KAAK,CAAC,EAAElB,MAAC,CAACkB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;EACjDC,CAAC,EAAEnB,MAAC,CAACG,MAAM,CAAC,CAAC,CAACC,QAAQ,CAAC,CAAC;EACxBgB,CAAC,EAAEpB,MAAC,CAACG,MAAM,CAAC,CAAC,CAACC,QAAQ,CAAC,CAAC;EACxBiB,CAAC,EAAErB,MAAC,CAACG,MAAM,CAAC,CAAC,CAACC,QAAQ,CAAC,CAAC;EACxBkB,EAAE,EAAEtB,MAAC,CAACG,MAAM,CAAC,CAAC,CAACC,QAAQ,CAAC,CAAC;EACzB;EACAmB,GAAG,EAAEvB,MAAC,CAACG,MAAM,CAAC,CAAC,CAACC,QAAQ,CAAC,CAAC;EAC1BoB,CAAC,EAAExB,MAAC,CAACG,MAAM,CAAC,CAAC,CAACC,QAAQ,CAAC,CAAC;EACxBqB,CAAC,EAAEzB,MAAC,CAACG,MAAM,CAAC,CAAC,CAACC,QAAQ,CAAC,CAAC;EACxB;EACAsB,GAAG,EAAE1B,MAAC,CAACc,KAAK,CAACd,MAAC,CAACG,MAAM,CAAC,CAAC,CAAC,CAACC,QAAQ,CAAC,CAAC;EACnC;EACAuB,GAAG,EAAE3B,MAAC,CAACG,MAAM,CAAC,CAAC,CAACC,QAAQ,CAAC,CAAC;EAC1B;EACA,UAAU,EAAEJ,MAAC,CAACG,MAAM,CAAC,CAAC,CAACC,QAAQ,CAAC,CAAC;EACjC;EACAwB,GAAG,EAAE5B,MAAC,CAACG,MAAM,CAAC,CAAC,CAACC,QAAQ,CAAC;AAC3B,CAAC,CAAC;AAACyB,OAAA,CAAA9B,GAAA,GAAAA,GAAA"}
|
@@ -0,0 +1,63 @@
|
|
1
|
+
"use strict";
|
2
|
+
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
4
|
+
value: true
|
5
|
+
});
|
6
|
+
Object.defineProperty(exports, "Issuing", {
|
7
|
+
enumerable: true,
|
8
|
+
get: function () {
|
9
|
+
return _issuing.Issuing;
|
10
|
+
}
|
11
|
+
});
|
12
|
+
exports.decode = decode;
|
13
|
+
exports.verify = verify;
|
14
|
+
var _types = require("./types");
|
15
|
+
var _ioReactNativeJwt = require("@pagopa/io-react-native-jwt");
|
16
|
+
var _issuing = require("./issuing");
|
17
|
+
/**
|
18
|
+
* Decode a given JWT to get the parsed Wallet Instance Attestation object they define.
|
19
|
+
* It ensures provided data is in a valid shape.
|
20
|
+
*
|
21
|
+
* It DOES NOT verify token signature nor check disclosures are correctly referenced by the JWT.
|
22
|
+
* Use {@link verify} instead
|
23
|
+
*
|
24
|
+
* @function
|
25
|
+
* @param token The encoded token that represents a valid jwt for Wallet Instance Attestation
|
26
|
+
*
|
27
|
+
* @returns The validated Wallet Instance Attestation object
|
28
|
+
* @throws A decoding error if the token doesn't resolve in a valid JWT
|
29
|
+
* @throws A validation error if the provided data doesn't result in a valid Wallet Instance Attestation
|
30
|
+
*
|
31
|
+
*/
|
32
|
+
function decode(token) {
|
33
|
+
// decode JWT parts
|
34
|
+
const decodedJwt = (0, _ioReactNativeJwt.decode)(token);
|
35
|
+
// parse JWT to ensure it has the shape of a WalletInstanceAttestationJwt
|
36
|
+
return _types.WalletInstanceAttestationJwt.parse({
|
37
|
+
header: decodedJwt.protectedHeader,
|
38
|
+
payload: decodedJwt.payload
|
39
|
+
});
|
40
|
+
}
|
41
|
+
|
42
|
+
/**
|
43
|
+
* Verify a given JWT to get the parsed Wallet Instance Attestation object they define.
|
44
|
+
* Same as {@link decode} plus token signature verification
|
45
|
+
*
|
46
|
+
* @async @function
|
47
|
+
*
|
48
|
+
*
|
49
|
+
* @param token The encoded token that represents a valid jwt
|
50
|
+
*
|
51
|
+
* @returns {WalletInstanceAttestationJwt} The validated Wallet Instance Attestation object
|
52
|
+
* @throws A decoding error if the token doesn't resolve in a valid JWT
|
53
|
+
* @throws A validation error if the provided data doesn't result in a valid Wallet Instance Attestation
|
54
|
+
* @throws Invalid signature error if the token signature is not valid
|
55
|
+
*
|
56
|
+
*/
|
57
|
+
async function verify(token) {
|
58
|
+
const decoded = decode(token);
|
59
|
+
const pubKey = decoded.payload.cnf.jwk;
|
60
|
+
await (0, _ioReactNativeJwt.verify)(token, pubKey);
|
61
|
+
return decoded;
|
62
|
+
}
|
63
|
+
//# sourceMappingURL=index.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"names":["_types","require","_ioReactNativeJwt","_issuing","decode","token","decodedJwt","decodeJwt","WalletInstanceAttestationJwt","parse","header","protectedHeader","payload","verify","decoded","pubKey","cnf","jwk","verifyJwt"],"sourceRoot":"../../../src","sources":["wallet-instance-attestation/index.ts"],"mappings":";;;;;;;;;;;;;AAAA,IAAAA,MAAA,GAAAC,OAAA;AACA,IAAAC,iBAAA,GAAAD,OAAA;AAGA,IAAAE,QAAA,GAAAF,OAAA;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO,SAASG,MAAMA,CAACC,KAAa,EAAgC;EAClE;EACA,MAAMC,UAAU,GAAG,IAAAC,wBAAS,EAACF,KAAK,CAAC;EACnC;EACA,OAAOG,mCAA4B,CAACC,KAAK,CAAC;IACxCC,MAAM,EAAEJ,UAAU,CAACK,eAAe;IAClCC,OAAO,EAAEN,UAAU,CAACM;EACtB,CAAC,CAAC;AACJ;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO,eAAeC,MAAMA,CAC1BR,KAAa,EAC0B;EACvC,MAAMS,OAAO,GAAGV,MAAM,CAACC,KAAK,CAAC;EAC7B,MAAMU,MAAM,GAAGD,OAAO,CAACF,OAAO,CAACI,GAAG,CAACC,GAAG;EAEtC,MAAM,IAAAC,wBAAS,EAACb,KAAK,EAAEU,MAAM,CAAC;EAE9B,OAAOD,OAAO;AAChB"}
|
@@ -0,0 +1,96 @@
|
|
1
|
+
"use strict";
|
2
|
+
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
4
|
+
value: true
|
5
|
+
});
|
6
|
+
exports.Issuing = void 0;
|
7
|
+
var _ioReactNativeJwt = require("@pagopa/io-react-native-jwt");
|
8
|
+
var _jwk = require("../utils/jwk");
|
9
|
+
var _types = require("./types");
|
10
|
+
var _reactNativeUuid = _interopRequireDefault(require("react-native-uuid"));
|
11
|
+
var _errors = require("../utils/errors");
|
12
|
+
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
13
|
+
class Issuing {
|
14
|
+
constructor(walletProviderBaseUrl) {
|
15
|
+
this.walletProviderBaseUrl = walletProviderBaseUrl;
|
16
|
+
}
|
17
|
+
|
18
|
+
/**
|
19
|
+
* Get the Wallet Instance Attestation Request to sign
|
20
|
+
*
|
21
|
+
* @async @function
|
22
|
+
*
|
23
|
+
* @param jwk Public key of the wallet instance
|
24
|
+
*
|
25
|
+
* @returns {string} Wallet Instance Attestation Request to sign
|
26
|
+
*
|
27
|
+
*/
|
28
|
+
async getAttestationRequestToSign(jwk) {
|
29
|
+
const parsedJwk = _jwk.JWK.parse(jwk);
|
30
|
+
const keyThumbprint = await (0, _ioReactNativeJwt.thumbprint)(parsedJwk);
|
31
|
+
const publicKey = {
|
32
|
+
...parsedJwk,
|
33
|
+
kid: keyThumbprint
|
34
|
+
};
|
35
|
+
const walletInstanceAttestationRequest = new _ioReactNativeJwt.SignJWT({
|
36
|
+
iss: keyThumbprint,
|
37
|
+
sub: this.walletProviderBaseUrl,
|
38
|
+
jti: `${_reactNativeUuid.default.v4()}`,
|
39
|
+
type: "WalletInstanceAttestationRequest",
|
40
|
+
cnf: {
|
41
|
+
jwk: publicKey
|
42
|
+
}
|
43
|
+
}).setProtectedHeader({
|
44
|
+
alg: "ES256",
|
45
|
+
kid: publicKey.kid,
|
46
|
+
typ: "var+jwt"
|
47
|
+
}).setIssuedAt().setExpirationTime("1h").toSign();
|
48
|
+
return walletInstanceAttestationRequest;
|
49
|
+
}
|
50
|
+
|
51
|
+
/**
|
52
|
+
* Get the Wallet Instance Attestation given a
|
53
|
+
* Wallet Instance Attestation Request and signature
|
54
|
+
*
|
55
|
+
* @async @function
|
56
|
+
*
|
57
|
+
* @param attestationRequest Wallet Instance Attestaion Request
|
58
|
+
* obtained with {@link getAttestationRequestToSign}
|
59
|
+
* @param signature Signature of the Wallet Instance Attestaion Request
|
60
|
+
* @param appFetch Optional object with fetch function to use
|
61
|
+
*
|
62
|
+
* @returns {string} Wallet Instance Attestation
|
63
|
+
*
|
64
|
+
*/
|
65
|
+
async getAttestation(attestationRequest, signature) {
|
66
|
+
let appFetch = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {
|
67
|
+
fetch
|
68
|
+
};
|
69
|
+
const signedAttestationRequest = await _ioReactNativeJwt.SignJWT.appendSignature(attestationRequest, signature);
|
70
|
+
const decodedRequest = (0, _ioReactNativeJwt.decode)(signedAttestationRequest);
|
71
|
+
const parsedRequest = _types.WalletInstanceAttestationRequestJwt.parse({
|
72
|
+
payload: decodedRequest.payload,
|
73
|
+
header: decodedRequest.protectedHeader
|
74
|
+
});
|
75
|
+
const publicKey = parsedRequest.payload.cnf.jwk;
|
76
|
+
await (0, _ioReactNativeJwt.verify)(signedAttestationRequest, publicKey);
|
77
|
+
const tokenUrl = new URL("token", this.walletProviderBaseUrl).href;
|
78
|
+
const requestBody = {
|
79
|
+
grant_type: "urn:ietf:params:oauth:client-assertion-type:jwt-key-attestation",
|
80
|
+
assertion: signedAttestationRequest
|
81
|
+
};
|
82
|
+
const response = await appFetch.fetch(tokenUrl, {
|
83
|
+
method: "POST",
|
84
|
+
headers: {
|
85
|
+
"Content-Type": "application/json"
|
86
|
+
},
|
87
|
+
body: JSON.stringify(requestBody)
|
88
|
+
});
|
89
|
+
if (response.status === 201) {
|
90
|
+
return await response.text();
|
91
|
+
}
|
92
|
+
throw new _errors.WalletInstanceAttestationIssuingError("Unable to obtain wallet instance attestation from wallet provider", `Response code: ${response.status}`);
|
93
|
+
}
|
94
|
+
}
|
95
|
+
exports.Issuing = Issuing;
|
96
|
+
//# sourceMappingURL=issuing.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"names":["_ioReactNativeJwt","require","_jwk","_types","_reactNativeUuid","_interopRequireDefault","_errors","obj","__esModule","default","Issuing","constructor","walletProviderBaseUrl","getAttestationRequestToSign","jwk","parsedJwk","JWK","parse","keyThumbprint","thumbprint","publicKey","kid","walletInstanceAttestationRequest","SignJWT","iss","sub","jti","uuid","v4","type","cnf","setProtectedHeader","alg","typ","setIssuedAt","setExpirationTime","toSign","getAttestation","attestationRequest","signature","appFetch","arguments","length","undefined","fetch","signedAttestationRequest","appendSignature","decodedRequest","decodeJwt","parsedRequest","WalletInstanceAttestationRequestJwt","payload","header","protectedHeader","verifyJwt","tokenUrl","URL","href","requestBody","grant_type","assertion","response","method","headers","body","JSON","stringify","status","text","WalletInstanceAttestationIssuingError","exports"],"sourceRoot":"../../../src","sources":["wallet-instance-attestation/issuing.ts"],"mappings":"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"}
|
@@ -0,0 +1,65 @@
|
|
1
|
+
"use strict";
|
2
|
+
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
4
|
+
value: true
|
5
|
+
});
|
6
|
+
exports.WalletInstanceAttestationRequestJwt = exports.WalletInstanceAttestationJwt = void 0;
|
7
|
+
var _jwk = require("../utils/jwk");
|
8
|
+
var z = _interopRequireWildcard(require("zod"));
|
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
|
+
const UnixTime = z.number().min(0).max(2147483647000);
|
12
|
+
const Jwt = z.object({
|
13
|
+
header: z.object({
|
14
|
+
alg: z.string(),
|
15
|
+
kid: z.string(),
|
16
|
+
typ: z.string(),
|
17
|
+
x5c: z.array(z.string()).optional(),
|
18
|
+
trust_chain: z.array(z.string()).optional()
|
19
|
+
}),
|
20
|
+
payload: z.object({
|
21
|
+
iss: z.string(),
|
22
|
+
sub: z.string(),
|
23
|
+
iat: UnixTime,
|
24
|
+
exp: UnixTime,
|
25
|
+
cnf: z.object({
|
26
|
+
jwk: _jwk.JWK
|
27
|
+
})
|
28
|
+
})
|
29
|
+
});
|
30
|
+
const WalletInstanceAttestationRequestJwt = z.object({
|
31
|
+
header: z.intersection(Jwt.shape.header, z.object({
|
32
|
+
typ: z.literal("var+jwt")
|
33
|
+
})),
|
34
|
+
payload: z.intersection(Jwt.shape.payload, z.object({
|
35
|
+
jti: z.string(),
|
36
|
+
type: z.literal("WalletInstanceAttestationRequest")
|
37
|
+
}))
|
38
|
+
});
|
39
|
+
exports.WalletInstanceAttestationRequestJwt = WalletInstanceAttestationRequestJwt;
|
40
|
+
const WalletInstanceAttestationJwt = z.object({
|
41
|
+
header: z.intersection(Jwt.shape.header, z.object({
|
42
|
+
typ: z.literal("va+jwt")
|
43
|
+
})),
|
44
|
+
payload: z.intersection(Jwt.shape.payload, z.object({
|
45
|
+
type: z.literal("WalletInstanceAttestation"),
|
46
|
+
policy_uri: z.string().url(),
|
47
|
+
tos_uri: z.string().url(),
|
48
|
+
logo_uri: z.string().url(),
|
49
|
+
asc: z.string(),
|
50
|
+
authorization_endpoint: z.string().url(),
|
51
|
+
response_types_supported: z.array(z.string()),
|
52
|
+
vp_formats_supported: z.object({
|
53
|
+
jwt_vp_json: z.object({
|
54
|
+
alg_values_supported: z.array(z.string())
|
55
|
+
}),
|
56
|
+
jwt_vc_json: z.object({
|
57
|
+
alg_values_supported: z.array(z.string())
|
58
|
+
})
|
59
|
+
}),
|
60
|
+
request_object_signing_alg_values_supported: z.array(z.string()),
|
61
|
+
presentation_definition_uri_supported: z.boolean()
|
62
|
+
}))
|
63
|
+
});
|
64
|
+
exports.WalletInstanceAttestationJwt = WalletInstanceAttestationJwt;
|
65
|
+
//# sourceMappingURL=types.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"names":["_jwk","require","z","_interopRequireWildcard","_getRequireWildcardCache","nodeInterop","WeakMap","cacheBabelInterop","cacheNodeInterop","obj","__esModule","default","cache","has","get","newObj","hasPropertyDescriptor","Object","defineProperty","getOwnPropertyDescriptor","key","prototype","hasOwnProperty","call","desc","set","UnixTime","number","min","max","Jwt","object","header","alg","string","kid","typ","x5c","array","optional","trust_chain","payload","iss","sub","iat","exp","cnf","jwk","JWK","WalletInstanceAttestationRequestJwt","intersection","shape","literal","jti","type","exports","WalletInstanceAttestationJwt","policy_uri","url","tos_uri","logo_uri","asc","authorization_endpoint","response_types_supported","vp_formats_supported","jwt_vp_json","alg_values_supported","jwt_vc_json","request_object_signing_alg_values_supported","presentation_definition_uri_supported","boolean"],"sourceRoot":"../../../src","sources":["wallet-instance-attestation/types.ts"],"mappings":"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"}
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"names":["PID","WalletInstanceAttestation","multiply","a","b","Promise","resolve"],"sourceRoot":"../../src","sources":["index.ts"],"mappings":"AAAA,OAAO,KAAKA,GAAG,MAAM,OAAO;AAC5B,OAAO,KAAKC,yBAAyB,MAAM,+BAA+B;AAE1E,OAAO,SAASC,QAAQA,CAACC,CAAS,EAAEC,CAAS,EAAmB;EAC9D,OAAOC,OAAO,CAACC,OAAO,CAACH,CAAC,GAAGC,CAAC,CAAC;AAC/B;AAEA,SAASJ,GAAG,EAAEC,yBAAyB"}
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"names":["SdJwt"],"sourceRoot":"../../../src","sources":["pid/index.ts"],"mappings":"AAAA,OAAO,KAAKA,KAAK,MAAM,UAAU;AACjC,SAASA,KAAK"}
|
@@ -0,0 +1,23 @@
|
|
1
|
+
import { getValueFromDisclosures } from "../../sd-jwt/converters";
|
2
|
+
import { PID } from "./types";
|
3
|
+
export function pidFromToken(sdJwt, disclosures) {
|
4
|
+
return PID.parse({
|
5
|
+
issuer: sdJwt.payload.iss,
|
6
|
+
issuedAt: new Date(sdJwt.payload.iat * 1000),
|
7
|
+
expiration: new Date(sdJwt.payload.exp * 1000),
|
8
|
+
verification: {
|
9
|
+
trustFramework: sdJwt.payload.verified_claims.verification.trust_framework,
|
10
|
+
assuranceLevel: sdJwt.payload.verified_claims.verification.assurance_level,
|
11
|
+
evidence: getValueFromDisclosures(disclosures, "evidence")
|
12
|
+
},
|
13
|
+
claims: {
|
14
|
+
uniqueId: getValueFromDisclosures(disclosures, "unique_id"),
|
15
|
+
givenName: getValueFromDisclosures(disclosures, "given_name"),
|
16
|
+
familyName: getValueFromDisclosures(disclosures, "family_name"),
|
17
|
+
birthdate: getValueFromDisclosures(disclosures, "birthdate"),
|
18
|
+
placeOfBirth: getValueFromDisclosures(disclosures, "place_of_birth"),
|
19
|
+
taxIdCode: getValueFromDisclosures(disclosures, "tax_id_number")
|
20
|
+
}
|
21
|
+
});
|
22
|
+
}
|
23
|
+
//# sourceMappingURL=converters.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"names":["getValueFromDisclosures","PID","pidFromToken","sdJwt","disclosures","parse","issuer","payload","iss","issuedAt","Date","iat","expiration","exp","verification","trustFramework","verified_claims","trust_framework","assuranceLevel","assurance_level","evidence","claims","uniqueId","givenName","familyName","birthdate","placeOfBirth","taxIdCode"],"sourceRoot":"../../../../src","sources":["pid/sd-jwt/converters.ts"],"mappings":"AAAA,SAASA,uBAAuB,QAAQ,yBAAyB;AAEjE,SAASC,GAAG,QAAQ,SAAS;AAE7B,OAAO,SAASC,YAAYA,CAACC,KAAe,EAAEC,WAAyB,EAAO;EAC5E,OAAOH,GAAG,CAACI,KAAK,CAAC;IACfC,MAAM,EAAEH,KAAK,CAACI,OAAO,CAACC,GAAG;IACzBC,QAAQ,EAAE,IAAIC,IAAI,CAACP,KAAK,CAACI,OAAO,CAACI,GAAG,GAAG,IAAI,CAAC;IAC5CC,UAAU,EAAE,IAAIF,IAAI,CAACP,KAAK,CAACI,OAAO,CAACM,GAAG,GAAG,IAAI,CAAC;IAC9CC,YAAY,EAAE;MACZC,cAAc,EACZZ,KAAK,CAACI,OAAO,CAACS,eAAe,CAACF,YAAY,CAACG,eAAe;MAC5DC,cAAc,EACZf,KAAK,CAACI,OAAO,CAACS,eAAe,CAACF,YAAY,CAACK,eAAe;MAC5DC,QAAQ,EAAEpB,uBAAuB,CAACI,WAAW,EAAE,UAAU;IAC3D,CAAC;IACDiB,MAAM,EAAE;MACNC,QAAQ,EAAEtB,uBAAuB,CAACI,WAAW,EAAE,WAAW,CAAC;MAC3DmB,SAAS,EAAEvB,uBAAuB,CAACI,WAAW,EAAE,YAAY,CAAC;MAC7DoB,UAAU,EAAExB,uBAAuB,CAACI,WAAW,EAAE,aAAa,CAAC;MAC/DqB,SAAS,EAAEzB,uBAAuB,CAACI,WAAW,EAAE,WAAW,CAAC;MAC5DsB,YAAY,EAAE1B,uBAAuB,CAACI,WAAW,EAAE,gBAAgB,CAAC;MACpEuB,SAAS,EAAE3B,uBAAuB,CAACI,WAAW,EAAE,eAAe;IACjE;EACF,CAAC,CAAC;AACJ"}
|
@@ -0,0 +1,66 @@
|
|
1
|
+
import { decode as decodeJwt } from "../../sd-jwt";
|
2
|
+
import { verify as verifyJwt } from "../../sd-jwt";
|
3
|
+
import { pidFromToken } from "./converters";
|
4
|
+
import { SdJwt4VC } from "../../sd-jwt/types";
|
5
|
+
|
6
|
+
/**
|
7
|
+
* Decode a given SD-JWT with Disclosures to get the parsed PID object they define.
|
8
|
+
* It ensures provided data is in a valid shape.
|
9
|
+
*
|
10
|
+
* It DOES NOT verify token signature nor check disclosures are correctly referenced by the SD-JWT.
|
11
|
+
* Use {@link verify} instead
|
12
|
+
*
|
13
|
+
* @function
|
14
|
+
* @param token The encoded token that represents a valid sd-jwt for verifiable credentials
|
15
|
+
*
|
16
|
+
* @returns The validated PID object along with the parsed SD-JWT token and the parsed disclosures
|
17
|
+
* @throws A decoding error if the token doesn't resolve in a valid SD-JWT
|
18
|
+
* @throws A validation error if the provided data doesn't result in a valid PID
|
19
|
+
*
|
20
|
+
*/
|
21
|
+
export function decode(token) {
|
22
|
+
let {
|
23
|
+
sdJwt,
|
24
|
+
disclosures
|
25
|
+
} = decodeJwt(token, SdJwt4VC);
|
26
|
+
const pid = pidFromToken(sdJwt, disclosures);
|
27
|
+
return {
|
28
|
+
pid,
|
29
|
+
sdJwt,
|
30
|
+
disclosures
|
31
|
+
};
|
32
|
+
}
|
33
|
+
|
34
|
+
/**
|
35
|
+
* Verify a given SD-JWT with Disclosures to get the parsed PID object they define.
|
36
|
+
* Same as {@link decode} plus:
|
37
|
+
* - token signature verification
|
38
|
+
* - ensure disclosures are well-defined inside the SD-JWT
|
39
|
+
*
|
40
|
+
* @async @function
|
41
|
+
*
|
42
|
+
* @todo implement signature validation
|
43
|
+
* @todo check disclosures in sd-jwt
|
44
|
+
*
|
45
|
+
* @param token The encoded token that represents a valid sd-jwt for verifiable credentials
|
46
|
+
*
|
47
|
+
* @returns {VerifyResult} The validated PID object along with the parsed SD-JWT token and the parsed disclosures
|
48
|
+
* @throws A decoding error if the token doesn't resolve in a valid SD-JWT
|
49
|
+
* @throws A validation error if the provided data doesn't result in a valid PID
|
50
|
+
* @throws A validation error if the provided disclosures are not defined in the SD-JWT
|
51
|
+
* @throws Invalid signature error if the token signature is not valid
|
52
|
+
*
|
53
|
+
*/
|
54
|
+
export async function verify(token) {
|
55
|
+
const decoded = decode(token);
|
56
|
+
const publicKey = decoded.sdJwt.payload.cnf.jwk;
|
57
|
+
await verifyJwt(token, publicKey, SdJwt4VC);
|
58
|
+
return decoded;
|
59
|
+
}
|
60
|
+
|
61
|
+
/**
|
62
|
+
* Result object for {@link verify}
|
63
|
+
*/
|
64
|
+
|
65
|
+
export { PID } from "./types";
|
66
|
+
//# sourceMappingURL=index.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"names":["decode","decodeJwt","verify","verifyJwt","pidFromToken","SdJwt4VC","token","sdJwt","disclosures","pid","decoded","publicKey","payload","cnf","jwk","PID"],"sourceRoot":"../../../../src","sources":["pid/sd-jwt/index.ts"],"mappings":"AAAA,SAASA,MAAM,IAAIC,SAAS,QAAQ,cAAc;AAClD,SAASC,MAAM,IAAIC,SAAS,QAAQ,cAAc;AAElD,SAASC,YAAY,QAAQ,cAAc;AAC3C,SAAqBC,QAAQ,QAAQ,oBAAoB;;AAEzD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,SAASL,MAAMA,CAACM,KAAa,EAAgB;EAClD,IAAI;IAAEC,KAAK;IAAEC;EAAY,CAAC,GAAGP,SAAS,CAACK,KAAK,EAAED,QAAQ,CAAC;EACvD,MAAMI,GAAG,GAAGL,YAAY,CAACG,KAAK,EAAEC,WAAW,CAAC;EAE5C,OAAO;IAAEC,GAAG;IAAEF,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;AACA,OAAO,eAAeN,MAAMA,CAACI,KAAa,EAAyB;EACjE,MAAMI,OAAO,GAAGV,MAAM,CAACM,KAAK,CAAC;EAC7B,MAAMK,SAAS,GAAGD,OAAO,CAACH,KAAK,CAACK,OAAO,CAACC,GAAG,CAACC,GAAG;EAC/C,MAAMX,SAAS,CAACG,KAAK,EAAEK,SAAS,EAAEN,QAAQ,CAAC;EAE3C,OAAOK,OAAO;AAChB;;AAWA;AACA;AACA;;AAGA,SAASK,GAAG,QAAQ,SAAS"}
|
@@ -0,0 +1,43 @@
|
|
1
|
+
import { z } from "zod";
|
2
|
+
const VerificationEvidence = z.object({
|
3
|
+
type: z.string(),
|
4
|
+
record: z.object({
|
5
|
+
type: z.string(),
|
6
|
+
source: z.object({
|
7
|
+
organization_name: z.string(),
|
8
|
+
organization_id: z.string(),
|
9
|
+
country_code: z.string()
|
10
|
+
})
|
11
|
+
})
|
12
|
+
});
|
13
|
+
const Verification = z.object({
|
14
|
+
trustFramework: z.literal("eidas"),
|
15
|
+
assuranceLevel: z.string(),
|
16
|
+
evidence: z.array(VerificationEvidence)
|
17
|
+
});
|
18
|
+
|
19
|
+
/**
|
20
|
+
* Data structure for the PID.
|
21
|
+
* It contains PID claims in plain text as well as verification data with the issuer's information
|
22
|
+
*
|
23
|
+
* @see https://italia.github.io/eidas-it-wallet-docs/en/pid-data-model.html
|
24
|
+
*/
|
25
|
+
|
26
|
+
export const PID = z.object({
|
27
|
+
issuer: z.string(),
|
28
|
+
issuedAt: z.date(),
|
29
|
+
expiration: z.date(),
|
30
|
+
verification: Verification,
|
31
|
+
claims: z.object({
|
32
|
+
uniqueId: z.string(),
|
33
|
+
givenName: z.string(),
|
34
|
+
familyName: z.string(),
|
35
|
+
birthdate: z.string(),
|
36
|
+
placeOfBirth: z.object({
|
37
|
+
country: z.string(),
|
38
|
+
locality: z.string()
|
39
|
+
}),
|
40
|
+
taxIdCode: z.string()
|
41
|
+
})
|
42
|
+
});
|
43
|
+
//# sourceMappingURL=types.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"names":["z","VerificationEvidence","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"],"sourceRoot":"../../../../src","sources":["pid/sd-jwt/types.ts"],"mappings":"AAAA,SAASA,CAAC,QAAQ,KAAK;AAEvB,MAAMC,oBAAoB,GAAGD,CAAC,CAACE,MAAM,CAAC;EACpCC,IAAI,EAAEH,CAAC,CAACI,MAAM,CAAC,CAAC;EAChBC,MAAM,EAAEL,CAAC,CAACE,MAAM,CAAC;IACfC,IAAI,EAAEH,CAAC,CAACI,MAAM,CAAC,CAAC;IAChBE,MAAM,EAAEN,CAAC,CAACE,MAAM,CAAC;MACfK,iBAAiB,EAAEP,CAAC,CAACI,MAAM,CAAC,CAAC;MAC7BI,eAAe,EAAER,CAAC,CAACI,MAAM,CAAC,CAAC;MAC3BK,YAAY,EAAET,CAAC,CAACI,MAAM,CAAC;IACzB,CAAC;EACH,CAAC;AACH,CAAC,CAAC;AAEF,MAAMM,YAAY,GAAGV,CAAC,CAACE,MAAM,CAAC;EAC5BS,cAAc,EAAEX,CAAC,CAACY,OAAO,CAAC,OAAO,CAAC;EAClCC,cAAc,EAAEb,CAAC,CAACI,MAAM,CAAC,CAAC;EAC1BU,QAAQ,EAAEd,CAAC,CAACe,KAAK,CAACd,oBAAoB;AACxC,CAAC,CAAC;;AAEF;AACA;AACA;AACA;AACA;AACA;;AAEA,OAAO,MAAMe,GAAG,GAAGhB,CAAC,CAACE,MAAM,CAAC;EAC1Be,MAAM,EAAEjB,CAAC,CAACI,MAAM,CAAC,CAAC;EAClBc,QAAQ,EAAElB,CAAC,CAACmB,IAAI,CAAC,CAAC;EAClBC,UAAU,EAAEpB,CAAC,CAACmB,IAAI,CAAC,CAAC;EACpBE,YAAY,EAAEX,YAAY;EAC1BY,MAAM,EAAEtB,CAAC,CAACE,MAAM,CAAC;IACfqB,QAAQ,EAAEvB,CAAC,CAACI,MAAM,CAAC,CAAC;IACpBoB,SAAS,EAAExB,CAAC,CAACI,MAAM,CAAC,CAAC;IACrBqB,UAAU,EAAEzB,CAAC,CAACI,MAAM,CAAC,CAAC;IACtBsB,SAAS,EAAE1B,CAAC,CAACI,MAAM,CAAC,CAAC;IACrBuB,YAAY,EAAE3B,CAAC,CAACE,MAAM,CAAC;MACrB0B,OAAO,EAAE5B,CAAC,CAACI,MAAM,CAAC,CAAC;MACnByB,QAAQ,EAAE7B,CAAC,CAACI,MAAM,CAAC;IACrB,CAAC,CAAC;IACF0B,SAAS,EAAE9B,CAAC,CAACI,MAAM,CAAC;EACtB,CAAC;AACH,CAAC,CAAC"}
|
@@ -0,0 +1,23 @@
|
|
1
|
+
import { getValueFromDisclosures } from "../converters";
|
2
|
+
const disclosures = [["6w1_soRXFgaHKfpYn3cvfQ", "given_name", "Mario"], ["fuNp97Hf3wV6y48y-QZhIg", "birthdate", "1980-10-01"], ["p-9LzyWHZBVDvhXDWkN2xA", "place_of_birth", {
|
3
|
+
country: "IT",
|
4
|
+
locality: "Rome"
|
5
|
+
}]];
|
6
|
+
describe("getValueFromDisclosures", () => {
|
7
|
+
it("should return correct value for given_name", () => {
|
8
|
+
const success = getValueFromDisclosures(disclosures, "given_name");
|
9
|
+
expect(success).toBe("Mario");
|
10
|
+
});
|
11
|
+
it("should return correct value for place_of_birth", () => {
|
12
|
+
const success = getValueFromDisclosures(disclosures, "place_of_birth");
|
13
|
+
expect(success).toEqual({
|
14
|
+
country: "IT",
|
15
|
+
locality: "Rome"
|
16
|
+
});
|
17
|
+
});
|
18
|
+
it("should fail", () => {
|
19
|
+
const success = getValueFromDisclosures(disclosures, "given_surname");
|
20
|
+
expect(success).toBeUndefined();
|
21
|
+
});
|
22
|
+
});
|
23
|
+
//# sourceMappingURL=converters.test.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"names":["getValueFromDisclosures","disclosures","country","locality","describe","it","success","expect","toBe","toEqual","toBeUndefined"],"sourceRoot":"../../../../src","sources":["sd-jwt/__test__/converters.test.ts"],"mappings":"AAAA,SAASA,uBAAuB,QAAQ,eAAe;AAGvD,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,GAAGN,uBAAuB,CAACC,WAAW,EAAE,YAAY,CAAC;IAClEM,MAAM,CAACD,OAAO,CAAC,CAACE,IAAI,CAAC,OAAO,CAAC;EAC/B,CAAC,CAAC;EACFH,EAAE,CAAC,gDAAgD,EAAE,MAAM;IACzD,MAAMC,OAAO,GAAGN,uBAAuB,CAACC,WAAW,EAAE,gBAAgB,CAAC;IACtEM,MAAM,CAACD,OAAO,CAAC,CAACG,OAAO,CAAC;MAAEP,OAAO,EAAE,IAAI;MAAEC,QAAQ,EAAE;IAAO,CAAC,CAAC;EAC9D,CAAC,CAAC;EACFE,EAAE,CAAC,aAAa,EAAE,MAAM;IACtB,MAAMC,OAAO,GAAGN,uBAAuB,CAACC,WAAW,EAAE,eAAe,CAAC;IACrEM,MAAM,CAACD,OAAO,CAAC,CAACI,aAAa,CAAC,CAAC;EACjC,CAAC,CAAC;AACJ,CAAC,CAAC"}
|