@vess-id/mdl 0.0.1
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/LICENSE +179 -0
- package/README.md +181 -0
- package/lib/buffer_utils.d.ts +6 -0
- package/lib/buffer_utils.js +36 -0
- package/lib/cbor/DataItem.d.ts +26 -0
- package/lib/cbor/DataItem.js +77 -0
- package/lib/cbor/index.d.ts +15 -0
- package/lib/cbor/index.js +73 -0
- package/lib/cose/coseKey.d.ts +14 -0
- package/lib/cose/coseKey.js +36 -0
- package/lib/index.d.ts +12 -0
- package/lib/index.js +28 -0
- package/lib/mdoc/IssuerSignedItem.d.ts +18 -0
- package/lib/mdoc/IssuerSignedItem.js +101 -0
- package/lib/mdoc/Verifier.d.ts +33 -0
- package/lib/mdoc/Verifier.js +405 -0
- package/lib/mdoc/checkCallback.d.ts +49 -0
- package/lib/mdoc/checkCallback.js +63 -0
- package/lib/mdoc/errors.d.ts +7 -0
- package/lib/mdoc/errors.js +21 -0
- package/lib/mdoc/model/DeviceResponse.d.ts +120 -0
- package/lib/mdoc/model/DeviceResponse.js +295 -0
- package/lib/mdoc/model/DeviceSignedDocument.d.ts +20 -0
- package/lib/mdoc/model/DeviceSignedDocument.js +50 -0
- package/lib/mdoc/model/Document.d.ts +75 -0
- package/lib/mdoc/model/Document.js +249 -0
- package/lib/mdoc/model/IssuerAuth.d.ts +17 -0
- package/lib/mdoc/model/IssuerAuth.js +72 -0
- package/lib/mdoc/model/IssuerSignedDocument.d.ts +29 -0
- package/lib/mdoc/model/IssuerSignedDocument.js +49 -0
- package/lib/mdoc/model/MDoc.d.ts +21 -0
- package/lib/mdoc/model/MDoc.js +34 -0
- package/lib/mdoc/model/PresentationDefinition.d.ts +21 -0
- package/lib/mdoc/model/PresentationDefinition.js +3 -0
- package/lib/mdoc/model/types.d.ts +110 -0
- package/lib/mdoc/model/types.js +3 -0
- package/lib/mdoc/parser.d.ts +8 -0
- package/lib/mdoc/parser.js +88 -0
- package/lib/mdoc/utils.d.ts +17 -0
- package/lib/mdoc/utils.js +145 -0
- package/package.json +82 -0
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
import * as jose from 'jose';
|
|
2
|
+
import { DigestAlgorithm, DocType, SupportedAlgs, ValidityInfo } from './types';
|
|
3
|
+
import { IssuerSignedDocument } from './IssuerSignedDocument';
|
|
4
|
+
/**
|
|
5
|
+
* Use this class when building new documents.
|
|
6
|
+
*
|
|
7
|
+
* This class allow you to build a document and sign it with the issuer's private key.
|
|
8
|
+
*/
|
|
9
|
+
export declare class Document {
|
|
10
|
+
#private;
|
|
11
|
+
readonly docType: DocType;
|
|
12
|
+
constructor(doc?: DocType);
|
|
13
|
+
private validateValues;
|
|
14
|
+
/**
|
|
15
|
+
* Add a namespace to an unsigned document.
|
|
16
|
+
*
|
|
17
|
+
* @param {string} namespace - The namespace to add.
|
|
18
|
+
* @param {Record<string, any>} values - The values to add to the namespace.
|
|
19
|
+
* @returns {Document} - The document
|
|
20
|
+
*/
|
|
21
|
+
addIssuerNameSpace(namespace: 'org.iso.18013.5.1' | string, values: Record<string, any>): Document;
|
|
22
|
+
/**
|
|
23
|
+
* Get the values in a namespace.
|
|
24
|
+
*
|
|
25
|
+
* @param {string} namespace - The namespace to add.
|
|
26
|
+
* @returns {Record<string, any>} - The values in the namespace as an object
|
|
27
|
+
*/
|
|
28
|
+
getIssuerNameSpace(namespace: string): Record<string, any>;
|
|
29
|
+
/**
|
|
30
|
+
* Add the device public key which will be include in the issuer signature.
|
|
31
|
+
* The device public key could be in JWK format or as COSE_Key format.
|
|
32
|
+
*
|
|
33
|
+
* @param params
|
|
34
|
+
* @param {jose.JWK | Uint8Array} params.devicePublicKey - The device public key.
|
|
35
|
+
*/
|
|
36
|
+
addDeviceKeyInfo({ deviceKey }: {
|
|
37
|
+
deviceKey: jose.JWK | Uint8Array;
|
|
38
|
+
}): Document;
|
|
39
|
+
/**
|
|
40
|
+
* Add validity info to the document that will be used in the issuer signature.
|
|
41
|
+
*
|
|
42
|
+
* @param info - the validity info
|
|
43
|
+
* @param {Date} [info.signed] - The date the document is signed. default: now
|
|
44
|
+
* @param {Date} [info.validFrom] - The date the document is valid from. default: signed
|
|
45
|
+
* @param {Date} [info.validUntil] - The date the document is valid until. default: signed + 1 year
|
|
46
|
+
* @param {Date} [info.expectedUpdate] - [Optional] The date the document is expected to be re-signed and potentially have its data updated.
|
|
47
|
+
* @returns
|
|
48
|
+
*/
|
|
49
|
+
addValidityInfo(info?: Partial<ValidityInfo>): Document;
|
|
50
|
+
/**
|
|
51
|
+
* Set the digest algorithm used for the value digests in the issuer signature.
|
|
52
|
+
*
|
|
53
|
+
* The default is SHA-256.
|
|
54
|
+
*
|
|
55
|
+
* @param {DigestAlgorithm} digestAlgorithm - The digest algorithm to use.
|
|
56
|
+
* @returns
|
|
57
|
+
*/
|
|
58
|
+
useDigestAlgorithm(digestAlgorithm: DigestAlgorithm): Document;
|
|
59
|
+
/**
|
|
60
|
+
* Generate the issuer signature for the document.
|
|
61
|
+
*
|
|
62
|
+
* @param {Object} params - The parameters object
|
|
63
|
+
* @param {jose.JWK | Uint8Array} params.issuerPrivateKey - The issuer's private key either in JWK format or COSE_KEY format as buffer.
|
|
64
|
+
* @param {string | Uint8Array | Array<string | Uint8Array>} params.issuerCertificate - The issuer's certificate in pem format, as a buffer, or an array.
|
|
65
|
+
* @param {SupportedAlgs} params.alg - The algorhitm used for the MSO signature.
|
|
66
|
+
* @param {string | Uint8Array} [params.kid] - The key id of the issuer's private key. default: issuerPrivateKey.kid
|
|
67
|
+
* @returns {Promise<IssuerSignedDoc>} - The signed document
|
|
68
|
+
*/
|
|
69
|
+
sign(params: {
|
|
70
|
+
issuerPrivateKey: jose.JWK | Uint8Array;
|
|
71
|
+
issuerCertificate: string | Uint8Array | Array<string | Uint8Array>;
|
|
72
|
+
alg: SupportedAlgs;
|
|
73
|
+
kid?: string | Uint8Array;
|
|
74
|
+
}): Promise<IssuerSignedDocument>;
|
|
75
|
+
}
|
|
@@ -0,0 +1,249 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) {
|
|
36
|
+
if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter");
|
|
37
|
+
if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it");
|
|
38
|
+
return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
|
|
39
|
+
};
|
|
40
|
+
var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (receiver, state, value, kind, f) {
|
|
41
|
+
if (kind === "m") throw new TypeError("Private method is not writable");
|
|
42
|
+
if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter");
|
|
43
|
+
if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it");
|
|
44
|
+
return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;
|
|
45
|
+
};
|
|
46
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
47
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
48
|
+
};
|
|
49
|
+
var _Document_issuerNameSpaces, _Document_deviceKeyInfo, _Document_validityInfo, _Document_digestAlgorithm;
|
|
50
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
51
|
+
exports.Document = void 0;
|
|
52
|
+
const jose = __importStar(require("jose"));
|
|
53
|
+
const cose_kit_1 = require("cose-kit");
|
|
54
|
+
const utils_1 = require("../utils");
|
|
55
|
+
const cbor_1 = require("../../cbor");
|
|
56
|
+
const IssuerSignedItem_1 = require("../IssuerSignedItem");
|
|
57
|
+
const IssuerAuth_1 = __importDefault(require("./IssuerAuth"));
|
|
58
|
+
const IssuerSignedDocument_1 = require("./IssuerSignedDocument");
|
|
59
|
+
const DEFAULT_NS = 'org.iso.18013.5.1';
|
|
60
|
+
const addYears = (date, years) => {
|
|
61
|
+
const r = new Date(date.getTime());
|
|
62
|
+
r.setFullYear(date.getFullYear() + years);
|
|
63
|
+
return r;
|
|
64
|
+
};
|
|
65
|
+
/**
|
|
66
|
+
* Use this class when building new documents.
|
|
67
|
+
*
|
|
68
|
+
* This class allow you to build a document and sign it with the issuer's private key.
|
|
69
|
+
*/
|
|
70
|
+
class Document {
|
|
71
|
+
constructor(doc = 'org.iso.18013.5.1.mDL') {
|
|
72
|
+
_Document_issuerNameSpaces.set(this, {});
|
|
73
|
+
_Document_deviceKeyInfo.set(this, void 0);
|
|
74
|
+
_Document_validityInfo.set(this, {
|
|
75
|
+
signed: new Date(),
|
|
76
|
+
validFrom: new Date(),
|
|
77
|
+
validUntil: addYears(new Date(), 1),
|
|
78
|
+
});
|
|
79
|
+
_Document_digestAlgorithm.set(this, 'SHA-256');
|
|
80
|
+
this.docType = doc;
|
|
81
|
+
}
|
|
82
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
83
|
+
validateValues(values) {
|
|
84
|
+
// TODO
|
|
85
|
+
// validate required fields, no extra fields, data types, etc...
|
|
86
|
+
}
|
|
87
|
+
/**
|
|
88
|
+
* Add a namespace to an unsigned document.
|
|
89
|
+
*
|
|
90
|
+
* @param {string} namespace - The namespace to add.
|
|
91
|
+
* @param {Record<string, any>} values - The values to add to the namespace.
|
|
92
|
+
* @returns {Document} - The document
|
|
93
|
+
*/
|
|
94
|
+
addIssuerNameSpace(namespace, values) {
|
|
95
|
+
if (namespace === DEFAULT_NS) {
|
|
96
|
+
this.validateValues(values);
|
|
97
|
+
}
|
|
98
|
+
__classPrivateFieldGet(this, _Document_issuerNameSpaces, "f")[namespace] = __classPrivateFieldGet(this, _Document_issuerNameSpaces, "f")[namespace] ?? [];
|
|
99
|
+
const addAttribute = (key, value) => {
|
|
100
|
+
let elementValue = value;
|
|
101
|
+
if (namespace === DEFAULT_NS) {
|
|
102
|
+
// the following namespace attributes must be a full-date as specified in RFC 3339
|
|
103
|
+
if (['birth_date', 'issue_date', 'expiry_date'].includes(key) && typeof value === 'string') {
|
|
104
|
+
elementValue = new cbor_1.DateOnly(value);
|
|
105
|
+
}
|
|
106
|
+
if (key === 'driving_privileges' && Array.isArray(value)) {
|
|
107
|
+
value.forEach((v, i) => {
|
|
108
|
+
if (typeof v.issue_date === 'string') {
|
|
109
|
+
elementValue[i].issue_date = new cbor_1.DateOnly(v.issue_date);
|
|
110
|
+
}
|
|
111
|
+
if (typeof v.expiry_date === 'string') {
|
|
112
|
+
elementValue[i].expiry_date = new cbor_1.DateOnly(v.expiry_date);
|
|
113
|
+
}
|
|
114
|
+
});
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
const digestID = __classPrivateFieldGet(this, _Document_issuerNameSpaces, "f")[namespace].length;
|
|
118
|
+
const issuerSignedItem = IssuerSignedItem_1.IssuerSignedItem.create(digestID, key, elementValue);
|
|
119
|
+
__classPrivateFieldGet(this, _Document_issuerNameSpaces, "f")[namespace].push(issuerSignedItem);
|
|
120
|
+
};
|
|
121
|
+
for (const [key, value] of Object.entries(values)) {
|
|
122
|
+
addAttribute(key, value);
|
|
123
|
+
}
|
|
124
|
+
return this;
|
|
125
|
+
}
|
|
126
|
+
/**
|
|
127
|
+
* Get the values in a namespace.
|
|
128
|
+
*
|
|
129
|
+
* @param {string} namespace - The namespace to add.
|
|
130
|
+
* @returns {Record<string, any>} - The values in the namespace as an object
|
|
131
|
+
*/
|
|
132
|
+
getIssuerNameSpace(namespace) {
|
|
133
|
+
const nameSpace = __classPrivateFieldGet(this, _Document_issuerNameSpaces, "f")[namespace];
|
|
134
|
+
return Object.fromEntries(nameSpace.map((item) => [item.elementIdentifier, item.elementValue]));
|
|
135
|
+
}
|
|
136
|
+
/**
|
|
137
|
+
* Add the device public key which will be include in the issuer signature.
|
|
138
|
+
* The device public key could be in JWK format or as COSE_Key format.
|
|
139
|
+
*
|
|
140
|
+
* @param params
|
|
141
|
+
* @param {jose.JWK | Uint8Array} params.devicePublicKey - The device public key.
|
|
142
|
+
*/
|
|
143
|
+
addDeviceKeyInfo({ deviceKey }) {
|
|
144
|
+
const deviceKeyCOSEKey = deviceKey instanceof Uint8Array ?
|
|
145
|
+
deviceKey :
|
|
146
|
+
(0, cose_kit_1.COSEKeyFromJWK)(deviceKey);
|
|
147
|
+
const decodedCoseKey = (0, cbor_1.cborDecode)(deviceKeyCOSEKey);
|
|
148
|
+
__classPrivateFieldSet(this, _Document_deviceKeyInfo, {
|
|
149
|
+
deviceKey: decodedCoseKey,
|
|
150
|
+
}, "f");
|
|
151
|
+
return this;
|
|
152
|
+
}
|
|
153
|
+
/**
|
|
154
|
+
* Add validity info to the document that will be used in the issuer signature.
|
|
155
|
+
*
|
|
156
|
+
* @param info - the validity info
|
|
157
|
+
* @param {Date} [info.signed] - The date the document is signed. default: now
|
|
158
|
+
* @param {Date} [info.validFrom] - The date the document is valid from. default: signed
|
|
159
|
+
* @param {Date} [info.validUntil] - The date the document is valid until. default: signed + 1 year
|
|
160
|
+
* @param {Date} [info.expectedUpdate] - [Optional] The date the document is expected to be re-signed and potentially have its data updated.
|
|
161
|
+
* @returns
|
|
162
|
+
*/
|
|
163
|
+
addValidityInfo(info = {}) {
|
|
164
|
+
const signed = info.signed ?? new Date();
|
|
165
|
+
const validFrom = info.validFrom ?? signed;
|
|
166
|
+
const validUntil = info.validUntil ?? addYears(signed, 1);
|
|
167
|
+
__classPrivateFieldSet(this, _Document_validityInfo, {
|
|
168
|
+
signed,
|
|
169
|
+
validFrom,
|
|
170
|
+
validUntil,
|
|
171
|
+
}, "f");
|
|
172
|
+
if (info.expectedUpdate) {
|
|
173
|
+
__classPrivateFieldGet(this, _Document_validityInfo, "f").expectedUpdate = info.expectedUpdate;
|
|
174
|
+
}
|
|
175
|
+
return this;
|
|
176
|
+
}
|
|
177
|
+
/**
|
|
178
|
+
* Set the digest algorithm used for the value digests in the issuer signature.
|
|
179
|
+
*
|
|
180
|
+
* The default is SHA-256.
|
|
181
|
+
*
|
|
182
|
+
* @param {DigestAlgorithm} digestAlgorithm - The digest algorithm to use.
|
|
183
|
+
* @returns
|
|
184
|
+
*/
|
|
185
|
+
useDigestAlgorithm(digestAlgorithm) {
|
|
186
|
+
__classPrivateFieldSet(this, _Document_digestAlgorithm, digestAlgorithm, "f");
|
|
187
|
+
return this;
|
|
188
|
+
}
|
|
189
|
+
/**
|
|
190
|
+
* Generate the issuer signature for the document.
|
|
191
|
+
*
|
|
192
|
+
* @param {Object} params - The parameters object
|
|
193
|
+
* @param {jose.JWK | Uint8Array} params.issuerPrivateKey - The issuer's private key either in JWK format or COSE_KEY format as buffer.
|
|
194
|
+
* @param {string | Uint8Array | Array<string | Uint8Array>} params.issuerCertificate - The issuer's certificate in pem format, as a buffer, or an array.
|
|
195
|
+
* @param {SupportedAlgs} params.alg - The algorhitm used for the MSO signature.
|
|
196
|
+
* @param {string | Uint8Array} [params.kid] - The key id of the issuer's private key. default: issuerPrivateKey.kid
|
|
197
|
+
* @returns {Promise<IssuerSignedDoc>} - The signed document
|
|
198
|
+
*/
|
|
199
|
+
async sign(params) {
|
|
200
|
+
if (!__classPrivateFieldGet(this, _Document_issuerNameSpaces, "f")) {
|
|
201
|
+
throw new Error('No namespaces added');
|
|
202
|
+
}
|
|
203
|
+
let issuerCertificateChain;
|
|
204
|
+
if (Array.isArray(params.issuerCertificate)) {
|
|
205
|
+
issuerCertificateChain = params.issuerCertificate.flatMap((cert) => (typeof cert === 'string' ? (0, utils_1.fromPEM)(cert) : [cert]));
|
|
206
|
+
}
|
|
207
|
+
else if (typeof params.issuerCertificate === 'string') {
|
|
208
|
+
issuerCertificateChain = (0, utils_1.fromPEM)(params.issuerCertificate);
|
|
209
|
+
}
|
|
210
|
+
else {
|
|
211
|
+
issuerCertificateChain = [params.issuerCertificate];
|
|
212
|
+
}
|
|
213
|
+
const issuerPrivateKeyJWK = params.issuerPrivateKey instanceof Uint8Array ?
|
|
214
|
+
(0, cose_kit_1.COSEKeyToJWK)(params.issuerPrivateKey) :
|
|
215
|
+
params.issuerPrivateKey;
|
|
216
|
+
const issuerPrivateKey = await jose.importJWK(issuerPrivateKeyJWK);
|
|
217
|
+
const valueDigests = new Map(await Promise.all(Object.entries(__classPrivateFieldGet(this, _Document_issuerNameSpaces, "f")).map(async ([namespace, items]) => {
|
|
218
|
+
const digestMap = new Map();
|
|
219
|
+
await Promise.all(items.map(async (item, index) => {
|
|
220
|
+
const hash = await item.calculateDigest(__classPrivateFieldGet(this, _Document_digestAlgorithm, "f"));
|
|
221
|
+
digestMap.set(index, new Uint8Array(hash));
|
|
222
|
+
}));
|
|
223
|
+
return [namespace, digestMap];
|
|
224
|
+
})));
|
|
225
|
+
const mso = {
|
|
226
|
+
version: '1.0',
|
|
227
|
+
digestAlgorithm: __classPrivateFieldGet(this, _Document_digestAlgorithm, "f"),
|
|
228
|
+
valueDigests,
|
|
229
|
+
deviceKeyInfo: __classPrivateFieldGet(this, _Document_deviceKeyInfo, "f"),
|
|
230
|
+
docType: this.docType,
|
|
231
|
+
validityInfo: __classPrivateFieldGet(this, _Document_validityInfo, "f"),
|
|
232
|
+
};
|
|
233
|
+
const payload = (0, cbor_1.cborEncode)(cbor_1.DataItem.fromData(mso));
|
|
234
|
+
const protectedHeader = { alg: params.alg };
|
|
235
|
+
const unprotectedHeader = {
|
|
236
|
+
kid: params.kid ?? issuerPrivateKeyJWK.kid,
|
|
237
|
+
x5chain: issuerCertificateChain.length === 1 ? issuerCertificateChain[0] : issuerCertificateChain,
|
|
238
|
+
};
|
|
239
|
+
const issuerAuth = await IssuerAuth_1.default.sign(protectedHeader, unprotectedHeader, payload, issuerPrivateKey);
|
|
240
|
+
const issuerSigned = {
|
|
241
|
+
issuerAuth,
|
|
242
|
+
nameSpaces: __classPrivateFieldGet(this, _Document_issuerNameSpaces, "f"),
|
|
243
|
+
};
|
|
244
|
+
return new IssuerSignedDocument_1.IssuerSignedDocument(this.docType, issuerSigned);
|
|
245
|
+
}
|
|
246
|
+
}
|
|
247
|
+
exports.Document = Document;
|
|
248
|
+
_Document_issuerNameSpaces = new WeakMap(), _Document_deviceKeyInfo = new WeakMap(), _Document_validityInfo = new WeakMap(), _Document_digestAlgorithm = new WeakMap();
|
|
249
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRG9jdW1lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbWRvYy9tb2RlbC9Eb2N1bWVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSwyQ0FBNkI7QUFDN0IsdUNBQThGO0FBQzlGLG9DQUFtQztBQUNuQyxxQ0FBd0U7QUFDeEUsMERBQXVEO0FBQ3ZELDhEQUFzQztBQUV0QyxpRUFBOEQ7QUFFOUQsTUFBTSxVQUFVLEdBQUcsbUJBQW1CLENBQUM7QUFFdkMsTUFBTSxRQUFRLEdBQUcsQ0FBQyxJQUFVLEVBQUUsS0FBYSxFQUFRLEVBQUU7SUFDbkQsTUFBTSxDQUFDLEdBQUcsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUM7SUFDbkMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLEdBQUcsS0FBSyxDQUFDLENBQUM7SUFDMUMsT0FBTyxDQUFDLENBQUM7QUFDWCxDQUFDLENBQUM7QUFFRjs7OztHQUlHO0FBQ0gsTUFBYSxRQUFRO0lBV25CLFlBQVksTUFBZSx1QkFBdUI7UUFUbEQscUNBQXNDLEVBQUUsRUFBQztRQUN6QywwQ0FBOEI7UUFDOUIsaUNBQThCO1lBQzVCLE1BQU0sRUFBRSxJQUFJLElBQUksRUFBRTtZQUNsQixTQUFTLEVBQUUsSUFBSSxJQUFJLEVBQUU7WUFDckIsVUFBVSxFQUFFLFFBQVEsQ0FBQyxJQUFJLElBQUksRUFBRSxFQUFFLENBQUMsQ0FBQztTQUNwQyxFQUFDO1FBQ0Ysb0NBQW9DLFNBQVMsRUFBQztRQUc1QyxJQUFJLENBQUMsT0FBTyxHQUFHLEdBQUcsQ0FBQztJQUNyQixDQUFDO0lBRUQsNkRBQTZEO0lBQ3JELGNBQWMsQ0FBQyxNQUEyQjtRQUNoRCxPQUFPO1FBQ1AsZ0VBQWdFO0lBQ2xFLENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSCxrQkFBa0IsQ0FBQyxTQUF1QyxFQUFFLE1BQTJCO1FBQ3JGLElBQUksU0FBUyxLQUFLLFVBQVUsRUFBRSxDQUFDO1lBQzdCLElBQUksQ0FBQyxjQUFjLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDOUIsQ0FBQztRQUVELHVCQUFBLElBQUksa0NBQWtCLENBQUMsU0FBUyxDQUFDLEdBQUcsdUJBQUEsSUFBSSxrQ0FBa0IsQ0FBQyxTQUFTLENBQUMsSUFBSSxFQUFFLENBQUM7UUFFNUUsTUFBTSxZQUFZLEdBQUcsQ0FBQyxHQUFXLEVBQUUsS0FBVSxFQUFFLEVBQUU7WUFDL0MsSUFBSSxZQUFZLEdBQUcsS0FBSyxDQUFDO1lBRXpCLElBQUksU0FBUyxLQUFLLFVBQVUsRUFBRSxDQUFDO2dCQUM3QixrRkFBa0Y7Z0JBQ2xGLElBQUksQ0FBQyxZQUFZLEVBQUUsWUFBWSxFQUFFLGFBQWEsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsSUFBSSxPQUFPLEtBQUssS0FBSyxRQUFRLEVBQUUsQ0FBQztvQkFDM0YsWUFBWSxHQUFHLElBQUksZUFBUSxDQUFDLEtBQUssQ0FBQyxDQUFDO2dCQUNyQyxDQUFDO2dCQUVELElBQUksR0FBRyxLQUFLLG9CQUFvQixJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQztvQkFDekQsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRTt3QkFDckIsSUFBSSxPQUFPLENBQUMsQ0FBQyxVQUFVLEtBQUssUUFBUSxFQUFFLENBQUM7NEJBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLFVBQVUsR0FBRyxJQUFJLGVBQVEsQ0FBQyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUM7d0JBQUMsQ0FBQzt3QkFDbEcsSUFBSSxPQUFPLENBQUMsQ0FBQyxXQUFXLEtBQUssUUFBUSxFQUFFLENBQUM7NEJBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsR0FBRyxJQUFJLGVBQVEsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUM7d0JBQUMsQ0FBQztvQkFDdkcsQ0FBQyxDQUFDLENBQUM7Z0JBQ0wsQ0FBQztZQUNILENBQUM7WUFFRCxNQUFNLFFBQVEsR0FBRyx1QkFBQSxJQUFJLGtDQUFrQixDQUFDLFNBQVMsQ0FBQyxDQUFDLE1BQU0sQ0FBQztZQUMxRCxNQUFNLGdCQUFnQixHQUFHLG1DQUFnQixDQUFDLE1BQU0sQ0FBQyxRQUFRLEVBQUUsR0FBRyxFQUFFLFlBQVksQ0FBQyxDQUFDO1lBQzlFLHVCQUFBLElBQUksa0NBQWtCLENBQUMsU0FBUyxDQUFDLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUM7UUFDM0QsQ0FBQyxDQUFDO1FBRUYsS0FBSyxNQUFNLENBQUMsR0FBRyxFQUFFLEtBQUssQ0FBQyxJQUFJLE1BQU0sQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQztZQUNsRCxZQUFZLENBQUMsR0FBRyxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQzNCLENBQUM7UUFFRCxPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFFRDs7Ozs7T0FLRztJQUNILGtCQUFrQixDQUFDLFNBQWlCO1FBQ2xDLE1BQU0sU0FBUyxHQUFHLHVCQUFBLElBQUksa0NBQWtCLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDcEQsT0FBTyxNQUFNLENBQUMsV0FBVyxDQUN2QixTQUFTLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FDckUsQ0FBQztJQUNKLENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSCxnQkFBZ0IsQ0FBQyxFQUFFLFNBQVMsRUFBd0M7UUFDbEUsTUFBTSxnQkFBZ0IsR0FDcEIsU0FBUyxZQUFZLFVBQVUsQ0FBQyxDQUFDO1lBQy9CLFNBQVMsQ0FBQyxDQUFDO1lBQ1gsSUFBQSx5QkFBYyxFQUFDLFNBQVMsQ0FBQyxDQUFDO1FBQzlCLE1BQU0sY0FBYyxHQUFHLElBQUEsaUJBQVUsRUFBQyxnQkFBZ0IsQ0FBQyxDQUFDO1FBRXBELHVCQUFBLElBQUksMkJBQWtCO1lBQ3BCLFNBQVMsRUFBRSxjQUFjO1NBQzFCLE1BQUEsQ0FBQztRQUVGLE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUVEOzs7Ozs7Ozs7T0FTRztJQUNILGVBQWUsQ0FBQyxPQUE4QixFQUFFO1FBQzlDLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxNQUFNLElBQUksSUFBSSxJQUFJLEVBQUUsQ0FBQztRQUN6QyxNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsU0FBUyxJQUFJLE1BQU0sQ0FBQztRQUMzQyxNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsVUFBVSxJQUFJLFFBQVEsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDMUQsdUJBQUEsSUFBSSwwQkFBaUI7WUFDbkIsTUFBTTtZQUNOLFNBQVM7WUFDVCxVQUFVO1NBQ1gsTUFBQSxDQUFDO1FBRUYsSUFBSSxJQUFJLENBQUMsY0FBYyxFQUFFLENBQUM7WUFDeEIsdUJBQUEsSUFBSSw4QkFBYyxDQUFDLGNBQWMsR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDO1FBQzFELENBQUM7UUFFRCxPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFFRDs7Ozs7OztPQU9HO0lBQ0gsa0JBQWtCLENBQUMsZUFBZ0M7UUFDakQsdUJBQUEsSUFBSSw2QkFBb0IsZUFBZSxNQUFBLENBQUM7UUFDeEMsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBRUQ7Ozs7Ozs7OztPQVNHO0lBQ0gsS0FBSyxDQUFDLElBQUksQ0FBQyxNQUtWO1FBQ0MsSUFBSSxDQUFDLHVCQUFBLElBQUksa0NBQWtCLEVBQUUsQ0FBQztZQUM1QixNQUFNLElBQUksS0FBSyxDQUFDLHFCQUFxQixDQUFDLENBQUM7UUFDekMsQ0FBQztRQUVELElBQUksc0JBQW9DLENBQUM7UUFFekMsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQyxFQUFFLENBQUM7WUFDNUMsc0JBQXNCLEdBQUcsTUFBTSxDQUFDLGlCQUFpQixDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsQ0FBQyxPQUFPLElBQUksS0FBSyxRQUFRLENBQUMsQ0FBQyxDQUFDLElBQUEsZUFBTyxFQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUMzSCxDQUFDO2FBQU0sSUFBSSxPQUFPLE1BQU0sQ0FBQyxpQkFBaUIsS0FBSyxRQUFRLEVBQUUsQ0FBQztZQUN4RCxzQkFBc0IsR0FBRyxJQUFBLGVBQU8sRUFBQyxNQUFNLENBQUMsaUJBQWlCLENBQUMsQ0FBQztRQUM3RCxDQUFDO2FBQU0sQ0FBQztZQUNOLHNCQUFzQixHQUFHLENBQUMsTUFBTSxDQUFDLGlCQUFpQixDQUFDLENBQUM7UUFDdEQsQ0FBQztRQUVELE1BQU0sbUJBQW1CLEdBQUcsTUFBTSxDQUFDLGdCQUFnQixZQUFZLFVBQVUsQ0FBQyxDQUFDO1lBQ3pFLElBQUEsdUJBQVksRUFBQyxNQUFNLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDO1lBQ3ZDLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQztRQUUxQixNQUFNLGdCQUFnQixHQUFHLE1BQU0sSUFBSSxDQUFDLFNBQVMsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDO1FBRW5FLE1BQU0sWUFBWSxHQUFHLElBQUksR0FBRyxDQUFDLE1BQU0sT0FBTyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLHVCQUFBLElBQUksa0NBQWtCLENBQUMsQ0FBQyxHQUFHLENBQUMsS0FBSyxFQUFFLENBQUMsU0FBUyxFQUFFLEtBQUssQ0FBQyxFQUFFLEVBQUU7WUFDckgsTUFBTSxTQUFTLEdBQUcsSUFBSSxHQUFHLEVBQXNCLENBQUM7WUFDaEQsTUFBTSxPQUFPLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsS0FBSyxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsRUFBRTtnQkFDaEQsTUFBTSxJQUFJLEdBQUcsTUFBTSxJQUFJLENBQUMsZUFBZSxDQUFDLHVCQUFBLElBQUksaUNBQWlCLENBQUMsQ0FBQztnQkFDL0QsU0FBUyxDQUFDLEdBQUcsQ0FBQyxLQUFLLEVBQUUsSUFBSSxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztZQUM3QyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQ0osT0FBTyxDQUFDLFNBQVMsRUFBRSxTQUFTLENBQXNDLENBQUM7UUFDckUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBRUwsTUFBTSxHQUFHLEdBQVE7WUFDZixPQUFPLEVBQUUsS0FBSztZQUNkLGVBQWUsRUFBRSx1QkFBQSxJQUFJLGlDQUFpQjtZQUN0QyxZQUFZO1lBQ1osYUFBYSxFQUFFLHVCQUFBLElBQUksK0JBQWU7WUFDbEMsT0FBTyxFQUFFLElBQUksQ0FBQyxPQUFPO1lBQ3JCLFlBQVksRUFBRSx1QkFBQSxJQUFJLDhCQUFjO1NBQ2pDLENBQUM7UUFFRixNQUFNLE9BQU8sR0FBRyxJQUFBLGlCQUFVLEVBQUMsZUFBUSxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBQ25ELE1BQU0sZUFBZSxHQUFxQixFQUFFLEdBQUcsRUFBRSxNQUFNLENBQUMsR0FBRyxFQUFFLENBQUM7UUFDOUQsTUFBTSxpQkFBaUIsR0FBdUI7WUFDNUMsR0FBRyxFQUFFLE1BQU0sQ0FBQyxHQUFHLElBQUksbUJBQW1CLENBQUMsR0FBRztZQUMxQyxPQUFPLEVBQUUsc0JBQXNCLENBQUMsTUFBTSxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsc0JBQXNCLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLHNCQUFzQjtTQUNsRyxDQUFDO1FBRUYsTUFBTSxVQUFVLEdBQUcsTUFBTSxvQkFBVSxDQUFDLElBQUksQ0FDdEMsZUFBZSxFQUNmLGlCQUFpQixFQUNqQixPQUFPLEVBQ1AsZ0JBQWdCLENBQ2pCLENBQUM7UUFFRixNQUFNLFlBQVksR0FBRztZQUNuQixVQUFVO1lBQ1YsVUFBVSxFQUFFLHVCQUFBLElBQUksa0NBQWtCO1NBQ25DLENBQUM7UUFFRixPQUFPLElBQUksMkNBQW9CLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxZQUFZLENBQUMsQ0FBQztJQUM5RCxDQUFDO0NBQ0Y7QUFyTkQsNEJBcU5DIn0=
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { ProtectedHeaders, Sign1, UnprotectedHeaders } from 'cose-kit';
|
|
2
|
+
import { X509Certificate } from '@peculiar/x509';
|
|
3
|
+
import { KeyLike } from 'jose';
|
|
4
|
+
import { MSO } from './types';
|
|
5
|
+
/**
|
|
6
|
+
* The IssuerAuth which is a COSE_Sign1 message
|
|
7
|
+
* as defined in https://www.iana.org/assignments/cose/cose.xhtml#messages
|
|
8
|
+
*/
|
|
9
|
+
export default class IssuerAuth extends Sign1 {
|
|
10
|
+
#private;
|
|
11
|
+
constructor(protectedHeader: Map<number, unknown> | Uint8Array, unprotectedHeader: Map<number, unknown>, payload: Uint8Array, signature: Uint8Array);
|
|
12
|
+
get decodedPayload(): MSO;
|
|
13
|
+
get certificate(): X509Certificate;
|
|
14
|
+
get countryName(): string;
|
|
15
|
+
get stateOrProvince(): string;
|
|
16
|
+
static sign(protectedHeaders: ProtectedHeaders, unprotectedHeaders: UnprotectedHeaders | undefined, payload: Uint8Array, key: KeyLike | Uint8Array): Promise<IssuerAuth>;
|
|
17
|
+
}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) {
|
|
3
|
+
if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter");
|
|
4
|
+
if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it");
|
|
5
|
+
return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
|
|
6
|
+
};
|
|
7
|
+
var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (receiver, state, value, kind, f) {
|
|
8
|
+
if (kind === "m") throw new TypeError("Private method is not writable");
|
|
9
|
+
if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter");
|
|
10
|
+
if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it");
|
|
11
|
+
return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;
|
|
12
|
+
};
|
|
13
|
+
var _IssuerAuth_decodedPayload, _IssuerAuth_certificate;
|
|
14
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
15
|
+
const cose_kit_1 = require("cose-kit");
|
|
16
|
+
const x509_1 = require("@peculiar/x509");
|
|
17
|
+
const cbor_1 = require("../../cbor");
|
|
18
|
+
const DataItem_1 = require("../../cbor/DataItem");
|
|
19
|
+
/**
|
|
20
|
+
* The IssuerAuth which is a COSE_Sign1 message
|
|
21
|
+
* as defined in https://www.iana.org/assignments/cose/cose.xhtml#messages
|
|
22
|
+
*/
|
|
23
|
+
class IssuerAuth extends cose_kit_1.Sign1 {
|
|
24
|
+
constructor(protectedHeader, unprotectedHeader, payload, signature) {
|
|
25
|
+
super(protectedHeader, unprotectedHeader, payload, signature);
|
|
26
|
+
_IssuerAuth_decodedPayload.set(this, void 0);
|
|
27
|
+
_IssuerAuth_certificate.set(this, void 0);
|
|
28
|
+
}
|
|
29
|
+
get decodedPayload() {
|
|
30
|
+
if (__classPrivateFieldGet(this, _IssuerAuth_decodedPayload, "f")) {
|
|
31
|
+
return __classPrivateFieldGet(this, _IssuerAuth_decodedPayload, "f");
|
|
32
|
+
}
|
|
33
|
+
let decoded = (0, cbor_1.cborDecode)(this.payload);
|
|
34
|
+
decoded = decoded instanceof DataItem_1.DataItem ? decoded.data : decoded;
|
|
35
|
+
decoded = Object.fromEntries(decoded);
|
|
36
|
+
const mapValidityInfo = (validityInfo) => {
|
|
37
|
+
if (!validityInfo) {
|
|
38
|
+
return validityInfo;
|
|
39
|
+
}
|
|
40
|
+
return Object.fromEntries([...validityInfo.entries()].map(([key, value]) => {
|
|
41
|
+
return [key, value instanceof Uint8Array ? (0, cbor_1.cborDecode)(value) : value];
|
|
42
|
+
}));
|
|
43
|
+
};
|
|
44
|
+
const result = {
|
|
45
|
+
...decoded,
|
|
46
|
+
validityInfo: mapValidityInfo(decoded.validityInfo),
|
|
47
|
+
validityDigests: decoded.validityDigests ? Object.fromEntries(decoded.validityDigests) : decoded.validityDigests,
|
|
48
|
+
deviceKeyInfo: decoded.deviceKeyInfo ? Object.fromEntries(decoded.deviceKeyInfo) : decoded.deviceKeyInfo,
|
|
49
|
+
};
|
|
50
|
+
__classPrivateFieldSet(this, _IssuerAuth_decodedPayload, result, "f");
|
|
51
|
+
return result;
|
|
52
|
+
}
|
|
53
|
+
get certificate() {
|
|
54
|
+
if (typeof __classPrivateFieldGet(this, _IssuerAuth_certificate, "f") === 'undefined' && this.x5chain?.length) {
|
|
55
|
+
__classPrivateFieldSet(this, _IssuerAuth_certificate, new x509_1.X509Certificate(this.x5chain[0]), "f");
|
|
56
|
+
}
|
|
57
|
+
return __classPrivateFieldGet(this, _IssuerAuth_certificate, "f");
|
|
58
|
+
}
|
|
59
|
+
get countryName() {
|
|
60
|
+
return this.certificate?.issuerName.getField('C')[0];
|
|
61
|
+
}
|
|
62
|
+
get stateOrProvince() {
|
|
63
|
+
return this.certificate?.issuerName.getField('ST')[0];
|
|
64
|
+
}
|
|
65
|
+
static async sign(protectedHeaders, unprotectedHeaders, payload, key) {
|
|
66
|
+
const sign1 = await cose_kit_1.Sign1.sign(protectedHeaders, unprotectedHeaders, payload, key);
|
|
67
|
+
return new IssuerAuth(sign1.protectedHeaders, sign1.unprotectedHeaders, sign1.payload, sign1.signature);
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
_IssuerAuth_decodedPayload = new WeakMap(), _IssuerAuth_certificate = new WeakMap();
|
|
71
|
+
exports.default = IssuerAuth;
|
|
72
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiSXNzdWVyQXV0aC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9tZG9jL21vZGVsL0lzc3VlckF1dGgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7QUFBQSx1Q0FBdUU7QUFDdkUseUNBQWlEO0FBRWpELHFDQUF3QztBQUN4QyxrREFBK0M7QUFHL0M7OztHQUdHO0FBQ0gsTUFBcUIsVUFBVyxTQUFRLGdCQUFLO0lBSTNDLFlBQ0UsZUFBa0QsRUFDbEQsaUJBQXVDLEVBQ3ZDLE9BQW1CLEVBQ25CLFNBQXFCO1FBRXJCLEtBQUssQ0FBQyxlQUFlLEVBQUUsaUJBQWlCLEVBQUUsT0FBTyxFQUFFLFNBQVMsQ0FBQyxDQUFDO1FBVGhFLDZDQUFxQjtRQUNyQiwwQ0FBOEI7SUFTOUIsQ0FBQztJQUVELElBQVcsY0FBYztRQUN2QixJQUFJLHVCQUFBLElBQUksa0NBQWdCLEVBQUUsQ0FBQztZQUFDLE9BQU8sdUJBQUEsSUFBSSxrQ0FBZ0IsQ0FBQztRQUFDLENBQUM7UUFDMUQsSUFBSSxPQUFPLEdBQUcsSUFBQSxpQkFBVSxFQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUN2QyxPQUFPLEdBQUcsT0FBTyxZQUFZLG1CQUFRLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQztRQUMvRCxPQUFPLEdBQUcsTUFBTSxDQUFDLFdBQVcsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUN0QyxNQUFNLGVBQWUsR0FBRyxDQUFDLFlBQXFDLEVBQUUsRUFBRTtZQUNoRSxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7Z0JBQUMsT0FBTyxZQUFZLENBQUM7WUFBQyxDQUFDO1lBQzNDLE9BQU8sTUFBTSxDQUFDLFdBQVcsQ0FBQyxDQUFDLEdBQUcsWUFBWSxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsS0FBSyxDQUFDLEVBQUUsRUFBRTtnQkFDekUsT0FBTyxDQUFDLEdBQUcsRUFBRSxLQUFLLFlBQVksVUFBVSxDQUFDLENBQUMsQ0FBQyxJQUFBLGlCQUFVLEVBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQ3hFLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDTixDQUFDLENBQUM7UUFDRixNQUFNLE1BQU0sR0FBUTtZQUNsQixHQUFHLE9BQU87WUFDVixZQUFZLEVBQUUsZUFBZSxDQUFDLE9BQU8sQ0FBQyxZQUFZLENBQUM7WUFDbkQsZUFBZSxFQUFFLE9BQU8sQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsZUFBZTtZQUNoSCxhQUFhLEVBQUUsT0FBTyxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLFdBQVcsQ0FBQyxPQUFPLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxhQUFhO1NBQ3pHLENBQUM7UUFDRix1QkFBQSxJQUFJLDhCQUFtQixNQUFNLE1BQUEsQ0FBQztRQUM5QixPQUFPLE1BQU0sQ0FBQztJQUNoQixDQUFDO0lBRUQsSUFBVyxXQUFXO1FBQ3BCLElBQUksT0FBTyx1QkFBQSxJQUFJLCtCQUFhLEtBQUssV0FBVyxJQUFJLElBQUksQ0FBQyxPQUFPLEVBQUUsTUFBTSxFQUFFLENBQUM7WUFDckUsdUJBQUEsSUFBSSwyQkFBZ0IsSUFBSSxzQkFBZSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBQSxDQUFDO1FBQzNELENBQUM7UUFDRCxPQUFPLHVCQUFBLElBQUksK0JBQWEsQ0FBQztJQUMzQixDQUFDO0lBRUQsSUFBVyxXQUFXO1FBQ3BCLE9BQU8sSUFBSSxDQUFDLFdBQVcsRUFBRSxVQUFVLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQ3ZELENBQUM7SUFFRCxJQUFXLGVBQWU7UUFDeEIsT0FBTyxJQUFJLENBQUMsV0FBVyxFQUFFLFVBQVUsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDeEQsQ0FBQztJQUVELE1BQU0sQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUNmLGdCQUFrQyxFQUNsQyxrQkFBa0QsRUFDbEQsT0FBbUIsRUFDbkIsR0FBeUI7UUFFekIsTUFBTSxLQUFLLEdBQUcsTUFBTSxnQkFBSyxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxrQkFBa0IsRUFBRSxPQUFPLEVBQUUsR0FBRyxDQUFDLENBQUM7UUFDbkYsT0FBTyxJQUFJLFVBQVUsQ0FDbkIsS0FBSyxDQUFDLGdCQUFnQixFQUN0QixLQUFLLENBQUMsa0JBQWtCLEVBQ3hCLEtBQUssQ0FBQyxPQUFPLEVBQ2IsS0FBSyxDQUFDLFNBQVMsQ0FDaEIsQ0FBQztJQUNKLENBQUM7Q0FDRjs7a0JBL0RvQixVQUFVIn0=
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { DocType, IssuerSigned } from './types';
|
|
2
|
+
/**
|
|
3
|
+
* Represents an issuer signed document.
|
|
4
|
+
*
|
|
5
|
+
* Note: You don't need instantiate this class.
|
|
6
|
+
* This is the return type of the parser and the document.sign() method.
|
|
7
|
+
*/
|
|
8
|
+
export declare class IssuerSignedDocument {
|
|
9
|
+
readonly docType: DocType;
|
|
10
|
+
readonly issuerSigned: IssuerSigned;
|
|
11
|
+
constructor(docType: DocType, issuerSigned: IssuerSigned);
|
|
12
|
+
/**
|
|
13
|
+
* Create the structure for encoding a document.
|
|
14
|
+
*
|
|
15
|
+
* @returns {Map<string, any>} - The document as a map
|
|
16
|
+
*/
|
|
17
|
+
prepare(): Map<string, any>;
|
|
18
|
+
/**
|
|
19
|
+
* Helper method to get the values in a namespace as a JS object.
|
|
20
|
+
*
|
|
21
|
+
* @param {string} namespace - The namespace to add.
|
|
22
|
+
* @returns {Record<string, any>} - The values in the namespace as an object
|
|
23
|
+
*/
|
|
24
|
+
getIssuerNameSpace(namespace: string): Record<string, any>;
|
|
25
|
+
/**
|
|
26
|
+
* List of namespaces in the document.
|
|
27
|
+
*/
|
|
28
|
+
get issuerSignedNameSpaces(): string[];
|
|
29
|
+
}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.IssuerSignedDocument = void 0;
|
|
4
|
+
/**
|
|
5
|
+
* Represents an issuer signed document.
|
|
6
|
+
*
|
|
7
|
+
* Note: You don't need instantiate this class.
|
|
8
|
+
* This is the return type of the parser and the document.sign() method.
|
|
9
|
+
*/
|
|
10
|
+
class IssuerSignedDocument {
|
|
11
|
+
constructor(docType, issuerSigned) {
|
|
12
|
+
this.docType = docType;
|
|
13
|
+
this.issuerSigned = issuerSigned;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Create the structure for encoding a document.
|
|
17
|
+
*
|
|
18
|
+
* @returns {Map<string, any>} - The document as a map
|
|
19
|
+
*/
|
|
20
|
+
prepare() {
|
|
21
|
+
const docMap = new Map();
|
|
22
|
+
docMap.set('docType', this.docType);
|
|
23
|
+
docMap.set('issuerSigned', {
|
|
24
|
+
nameSpaces: new Map(Object.entries(this.issuerSigned?.nameSpaces ?? {}).map(([nameSpace, items]) => {
|
|
25
|
+
return [nameSpace, items.map((item) => item.dataItem)];
|
|
26
|
+
})),
|
|
27
|
+
issuerAuth: this.issuerSigned?.issuerAuth.getContentForEncoding(),
|
|
28
|
+
});
|
|
29
|
+
return docMap;
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Helper method to get the values in a namespace as a JS object.
|
|
33
|
+
*
|
|
34
|
+
* @param {string} namespace - The namespace to add.
|
|
35
|
+
* @returns {Record<string, any>} - The values in the namespace as an object
|
|
36
|
+
*/
|
|
37
|
+
getIssuerNameSpace(namespace) {
|
|
38
|
+
const nameSpace = this.issuerSigned.nameSpaces[namespace];
|
|
39
|
+
return Object.fromEntries(nameSpace.map((item) => [item.elementIdentifier, item.elementValue]));
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* List of namespaces in the document.
|
|
43
|
+
*/
|
|
44
|
+
get issuerSignedNameSpaces() {
|
|
45
|
+
return Object.keys(this.issuerSigned.nameSpaces);
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
exports.IssuerSignedDocument = IssuerSignedDocument;
|
|
49
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiSXNzdWVyU2lnbmVkRG9jdW1lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbWRvYy9tb2RlbC9Jc3N1ZXJTaWduZWREb2N1bWVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFFQTs7Ozs7R0FLRztBQUNILE1BQWEsb0JBQW9CO0lBQy9CLFlBQ2tCLE9BQWdCLEVBQ2hCLFlBQTBCO1FBRDFCLFlBQU8sR0FBUCxPQUFPLENBQVM7UUFDaEIsaUJBQVksR0FBWixZQUFZLENBQWM7SUFDeEMsQ0FBQztJQUVMOzs7O09BSUc7SUFDSCxPQUFPO1FBQ0wsTUFBTSxNQUFNLEdBQUcsSUFBSSxHQUFHLEVBQWUsQ0FBQztRQUN0QyxNQUFNLENBQUMsR0FBRyxDQUFDLFNBQVMsRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDcEMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxjQUFjLEVBQUU7WUFDekIsVUFBVSxFQUFFLElBQUksR0FBRyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLFlBQVksRUFBRSxVQUFVLElBQUksRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxTQUFTLEVBQUUsS0FBSyxDQUFDLEVBQUUsRUFBRTtnQkFDakcsT0FBTyxDQUFDLFNBQVMsRUFBRSxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQztZQUN6RCxDQUFDLENBQUMsQ0FBQztZQUNILFVBQVUsRUFBRSxJQUFJLENBQUMsWUFBWSxFQUFFLFVBQVUsQ0FBQyxxQkFBcUIsRUFBRTtTQUNsRSxDQUFDLENBQUM7UUFDSCxPQUFPLE1BQU0sQ0FBQztJQUNoQixDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSCxrQkFBa0IsQ0FBQyxTQUFpQjtRQUNsQyxNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUMxRCxPQUFPLE1BQU0sQ0FBQyxXQUFXLENBQ3ZCLFNBQVMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLGlCQUFpQixFQUFFLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUNyRSxDQUFDO0lBQ0osQ0FBQztJQUVEOztPQUVHO0lBQ0gsSUFBSSxzQkFBc0I7UUFDeEIsT0FBTyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsVUFBVSxDQUFDLENBQUM7SUFDbkQsQ0FBQztDQUNGO0FBMUNELG9EQTBDQyJ9
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { IssuerSignedDocument } from './IssuerSignedDocument';
|
|
2
|
+
export type ErrorCode = number;
|
|
3
|
+
export type ErrorItems = Record<string, ErrorCode>;
|
|
4
|
+
export type DocumentError = {
|
|
5
|
+
DocType: ErrorCode;
|
|
6
|
+
};
|
|
7
|
+
export declare enum MDocStatus {
|
|
8
|
+
OK = 0,
|
|
9
|
+
GeneralError = 10,
|
|
10
|
+
CBORDecodingError = 11,
|
|
11
|
+
CBORValidationError = 12
|
|
12
|
+
}
|
|
13
|
+
export declare class MDoc {
|
|
14
|
+
readonly documents: IssuerSignedDocument[];
|
|
15
|
+
readonly version: string;
|
|
16
|
+
readonly status: MDocStatus;
|
|
17
|
+
readonly documentErrors: DocumentError[];
|
|
18
|
+
constructor(documents?: IssuerSignedDocument[], version?: string, status?: MDocStatus, documentErrors?: DocumentError[]);
|
|
19
|
+
addDocument(document: IssuerSignedDocument): void;
|
|
20
|
+
encode(): Buffer<ArrayBufferLike>;
|
|
21
|
+
}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.MDoc = exports.MDocStatus = void 0;
|
|
4
|
+
const cbor_1 = require("../../cbor");
|
|
5
|
+
var MDocStatus;
|
|
6
|
+
(function (MDocStatus) {
|
|
7
|
+
MDocStatus[MDocStatus["OK"] = 0] = "OK";
|
|
8
|
+
MDocStatus[MDocStatus["GeneralError"] = 10] = "GeneralError";
|
|
9
|
+
MDocStatus[MDocStatus["CBORDecodingError"] = 11] = "CBORDecodingError";
|
|
10
|
+
MDocStatus[MDocStatus["CBORValidationError"] = 12] = "CBORValidationError";
|
|
11
|
+
})(MDocStatus || (exports.MDocStatus = MDocStatus = {}));
|
|
12
|
+
class MDoc {
|
|
13
|
+
constructor(documents = [], version = '1.0', status = MDocStatus.OK, documentErrors = []) {
|
|
14
|
+
this.documents = documents;
|
|
15
|
+
this.version = version;
|
|
16
|
+
this.status = status;
|
|
17
|
+
this.documentErrors = documentErrors;
|
|
18
|
+
}
|
|
19
|
+
addDocument(document) {
|
|
20
|
+
if (typeof document.issuerSigned === 'undefined') {
|
|
21
|
+
throw new Error('Cannot add an unsigned document');
|
|
22
|
+
}
|
|
23
|
+
this.documents.push(document);
|
|
24
|
+
}
|
|
25
|
+
encode() {
|
|
26
|
+
return (0, cbor_1.cborEncode)({
|
|
27
|
+
version: this.version,
|
|
28
|
+
documents: this.documents.map((doc) => doc.prepare()),
|
|
29
|
+
status: this.status,
|
|
30
|
+
});
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
exports.MDoc = MDoc;
|
|
34
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiTURvYy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9tZG9jL21vZGVsL01Eb2MudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEscUNBQXdDO0FBU3hDLElBQVksVUFLWDtBQUxELFdBQVksVUFBVTtJQUNwQix1Q0FBTSxDQUFBO0lBQ04sNERBQWlCLENBQUE7SUFDakIsc0VBQXNCLENBQUE7SUFDdEIsMEVBQXdCLENBQUE7QUFDMUIsQ0FBQyxFQUxXLFVBQVUsMEJBQVYsVUFBVSxRQUtyQjtBQUVELE1BQWEsSUFBSTtJQUNmLFlBQ2tCLFlBQW9DLEVBQUUsRUFDdEMsVUFBVSxLQUFLLEVBQ2YsU0FBcUIsVUFBVSxDQUFDLEVBQUUsRUFDbEMsaUJBQWtDLEVBQUU7UUFIcEMsY0FBUyxHQUFULFNBQVMsQ0FBNkI7UUFDdEMsWUFBTyxHQUFQLE9BQU8sQ0FBUTtRQUNmLFdBQU0sR0FBTixNQUFNLENBQTRCO1FBQ2xDLG1CQUFjLEdBQWQsY0FBYyxDQUFzQjtJQUNsRCxDQUFDO0lBRUwsV0FBVyxDQUFDLFFBQThCO1FBQ3hDLElBQUksT0FBTyxRQUFRLENBQUMsWUFBWSxLQUFLLFdBQVcsRUFBRSxDQUFDO1lBQ2pELE1BQU0sSUFBSSxLQUFLLENBQUMsaUNBQWlDLENBQUMsQ0FBQztRQUNyRCxDQUFDO1FBQ0QsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsUUFBZ0MsQ0FBQyxDQUFDO0lBQ3hELENBQUM7SUFFRCxNQUFNO1FBQ0osT0FBTyxJQUFBLGlCQUFVLEVBQUM7WUFDaEIsT0FBTyxFQUFFLElBQUksQ0FBQyxPQUFPO1lBQ3JCLFNBQVMsRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsR0FBRyxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQ3JELE1BQU0sRUFBRSxJQUFJLENBQUMsTUFBTTtTQUNwQixDQUFDLENBQUM7SUFDTCxDQUFDO0NBQ0Y7QUF0QkQsb0JBc0JDIn0=
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
export type PresentationDefinitionField = {
|
|
2
|
+
path: string[];
|
|
3
|
+
intent_to_retain: boolean;
|
|
4
|
+
};
|
|
5
|
+
export type Format = {
|
|
6
|
+
mso_mdoc: {
|
|
7
|
+
alg: string[];
|
|
8
|
+
};
|
|
9
|
+
};
|
|
10
|
+
export type InputDescriptor = {
|
|
11
|
+
id: string;
|
|
12
|
+
format: Format;
|
|
13
|
+
constraints: {
|
|
14
|
+
limit_disclosure: string;
|
|
15
|
+
fields: PresentationDefinitionField[];
|
|
16
|
+
};
|
|
17
|
+
};
|
|
18
|
+
export type PresentationDefinition = {
|
|
19
|
+
id: string;
|
|
20
|
+
input_descriptors: InputDescriptor[];
|
|
21
|
+
};
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiUHJlc2VudGF0aW9uRGVmaW5pdGlvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9tZG9jL21vZGVsL1ByZXNlbnRhdGlvbkRlZmluaXRpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiJ9
|