@vess-id/mdl 0.0.7 → 0.0.9
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/lib/index.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
export { Verifier } from './mdoc/Verifier';
|
|
2
|
-
export { parse } from './mdoc/parser';
|
|
2
|
+
export { parse, parseIssuerSigned } from './mdoc/parser';
|
|
3
3
|
export { DataItem } from './cbor/DataItem';
|
|
4
4
|
export { DiagnosticInformation as DianosticInformation } from './mdoc/model/types';
|
|
5
5
|
export { MDoc } from './mdoc/model/MDoc';
|
package/lib/index.js
CHANGED
|
@@ -1,10 +1,11 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.setCborEncodeDecodeOptions = exports.getCborEncodeDecodeOptions = exports.VerificationAssessmentId = exports.MDLParseError = exports.MDLError = exports.DeviceResponse = exports.DeviceSignedDocument = exports.IssuerSignedDocument = exports.Document = exports.MDoc = exports.DataItem = exports.parse = exports.Verifier = void 0;
|
|
3
|
+
exports.setCborEncodeDecodeOptions = exports.getCborEncodeDecodeOptions = exports.VerificationAssessmentId = exports.MDLParseError = exports.MDLError = exports.DeviceResponse = exports.DeviceSignedDocument = exports.IssuerSignedDocument = exports.Document = exports.MDoc = exports.DataItem = exports.parseIssuerSigned = exports.parse = exports.Verifier = void 0;
|
|
4
4
|
var Verifier_1 = require("./mdoc/Verifier");
|
|
5
5
|
Object.defineProperty(exports, "Verifier", { enumerable: true, get: function () { return Verifier_1.Verifier; } });
|
|
6
6
|
var parser_1 = require("./mdoc/parser");
|
|
7
7
|
Object.defineProperty(exports, "parse", { enumerable: true, get: function () { return parser_1.parse; } });
|
|
8
|
+
Object.defineProperty(exports, "parseIssuerSigned", { enumerable: true, get: function () { return parser_1.parseIssuerSigned; } });
|
|
8
9
|
var DataItem_1 = require("./cbor/DataItem");
|
|
9
10
|
Object.defineProperty(exports, "DataItem", { enumerable: true, get: function () { return DataItem_1.DataItem; } });
|
|
10
11
|
var MDoc_1 = require("./mdoc/model/MDoc");
|
|
@@ -25,4 +26,4 @@ Object.defineProperty(exports, "VerificationAssessmentId", { enumerable: true, g
|
|
|
25
26
|
var cbor_1 = require("./cbor");
|
|
26
27
|
Object.defineProperty(exports, "getCborEncodeDecodeOptions", { enumerable: true, get: function () { return cbor_1.getCborEncodeDecodeOptions; } });
|
|
27
28
|
Object.defineProperty(exports, "setCborEncodeDecodeOptions", { enumerable: true, get: function () { return cbor_1.setCborEncodeDecodeOptions; } });
|
|
28
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
29
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsNENBQTJDO0FBQWxDLG9HQUFBLFFBQVEsT0FBQTtBQUNqQix3Q0FBeUQ7QUFBaEQsK0ZBQUEsS0FBSyxPQUFBO0FBQUUsMkdBQUEsaUJBQWlCLE9BQUE7QUFDakMsNENBQTJDO0FBQWxDLG9HQUFBLFFBQVEsT0FBQTtBQUVqQiwwQ0FBeUM7QUFBaEMsNEZBQUEsSUFBSSxPQUFBO0FBQ2Isa0RBQWlEO0FBQXhDLG9HQUFBLFFBQVEsT0FBQTtBQUNqQiwwRUFBeUU7QUFBaEUsNEhBQUEsb0JBQW9CLE9BQUE7QUFDN0IsMEVBQXlFO0FBQWhFLDRIQUFBLG9CQUFvQixPQUFBO0FBQzdCLDhEQUE2RDtBQUFwRCxnSEFBQSxjQUFjLE9BQUE7QUFDdkIsd0NBQXdEO0FBQS9DLGtHQUFBLFFBQVEsT0FBQTtBQUFFLHVHQUFBLGFBQWEsT0FBQTtBQUNoQyxzREFBZ0U7QUFBdkQseUhBQUEsd0JBQXdCLE9BQUE7QUFDakMsK0JBQWdGO0FBQXZFLGtIQUFBLDBCQUEwQixPQUFBO0FBQUUsa0hBQUEsMEJBQTBCLE9BQUEifQ==
|
|
@@ -26,4 +26,28 @@ export declare class IssuerSignedDocument {
|
|
|
26
26
|
* List of namespaces in the document.
|
|
27
27
|
*/
|
|
28
28
|
get issuerSignedNameSpaces(): string[];
|
|
29
|
+
/**
|
|
30
|
+
* Prepare IssuerSigned structure only (for OID4VCI issuance).
|
|
31
|
+
* Returns only the IssuerSigned part without docType wrapper.
|
|
32
|
+
*
|
|
33
|
+
* OID4VCI 1.0 Section A.2.4:
|
|
34
|
+
* The credential claim MUST be a base64url-encoded CBOR-encoded IssuerSigned structure.
|
|
35
|
+
*
|
|
36
|
+
* @returns {Object} - The IssuerSigned structure ready for CBOR encoding
|
|
37
|
+
*/
|
|
38
|
+
prepareIssuerSigned(): {
|
|
39
|
+
nameSpaces: Map<string, any>;
|
|
40
|
+
issuerAuth: any;
|
|
41
|
+
};
|
|
42
|
+
/**
|
|
43
|
+
* Encode IssuerSigned structure for OID4VCI credential response.
|
|
44
|
+
* Returns CBOR-encoded IssuerSigned structure as Buffer.
|
|
45
|
+
*
|
|
46
|
+
* This method is specifically designed for OID4VCI 1.0 credential issuance,
|
|
47
|
+
* where only the IssuerSigned structure (not the full DeviceResponse/MDoc)
|
|
48
|
+
* should be returned in the Credential Response.
|
|
49
|
+
*
|
|
50
|
+
* @returns {Buffer} - CBOR-encoded IssuerSigned structure
|
|
51
|
+
*/
|
|
52
|
+
encodeIssuerSigned(): Buffer;
|
|
29
53
|
}
|
|
@@ -44,6 +44,37 @@ class IssuerSignedDocument {
|
|
|
44
44
|
get issuerSignedNameSpaces() {
|
|
45
45
|
return Object.keys(this.issuerSigned.nameSpaces);
|
|
46
46
|
}
|
|
47
|
+
/**
|
|
48
|
+
* Prepare IssuerSigned structure only (for OID4VCI issuance).
|
|
49
|
+
* Returns only the IssuerSigned part without docType wrapper.
|
|
50
|
+
*
|
|
51
|
+
* OID4VCI 1.0 Section A.2.4:
|
|
52
|
+
* The credential claim MUST be a base64url-encoded CBOR-encoded IssuerSigned structure.
|
|
53
|
+
*
|
|
54
|
+
* @returns {Object} - The IssuerSigned structure ready for CBOR encoding
|
|
55
|
+
*/
|
|
56
|
+
prepareIssuerSigned() {
|
|
57
|
+
return {
|
|
58
|
+
nameSpaces: new Map(Object.entries(this.issuerSigned?.nameSpaces ?? {}).map(([nameSpace, items]) => {
|
|
59
|
+
return [nameSpace, items.map((item) => item.dataItem)];
|
|
60
|
+
})),
|
|
61
|
+
issuerAuth: this.issuerSigned?.issuerAuth.getContentForEncoding(),
|
|
62
|
+
};
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Encode IssuerSigned structure for OID4VCI credential response.
|
|
66
|
+
* Returns CBOR-encoded IssuerSigned structure as Buffer.
|
|
67
|
+
*
|
|
68
|
+
* This method is specifically designed for OID4VCI 1.0 credential issuance,
|
|
69
|
+
* where only the IssuerSigned structure (not the full DeviceResponse/MDoc)
|
|
70
|
+
* should be returned in the Credential Response.
|
|
71
|
+
*
|
|
72
|
+
* @returns {Buffer} - CBOR-encoded IssuerSigned structure
|
|
73
|
+
*/
|
|
74
|
+
encodeIssuerSigned() {
|
|
75
|
+
const { cborEncode } = require('../../cbor');
|
|
76
|
+
return cborEncode(this.prepareIssuerSigned());
|
|
77
|
+
}
|
|
47
78
|
}
|
|
48
79
|
exports.IssuerSignedDocument = IssuerSignedDocument;
|
|
49
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
80
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiSXNzdWVyU2lnbmVkRG9jdW1lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvbWRvYy9tb2RlbC9Jc3N1ZXJTaWduZWREb2N1bWVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFFQTs7Ozs7R0FLRztBQUNILE1BQWEsb0JBQW9CO0lBQy9CLFlBQ2tCLE9BQWdCLEVBQ2hCLFlBQTBCO1FBRDFCLFlBQU8sR0FBUCxPQUFPLENBQVM7UUFDaEIsaUJBQVksR0FBWixZQUFZLENBQWM7SUFDeEMsQ0FBQztJQUVMOzs7O09BSUc7SUFDSCxPQUFPO1FBQ0wsTUFBTSxNQUFNLEdBQUcsSUFBSSxHQUFHLEVBQWUsQ0FBQztRQUN0QyxNQUFNLENBQUMsR0FBRyxDQUFDLFNBQVMsRUFBRSxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDcEMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxjQUFjLEVBQUU7WUFDekIsVUFBVSxFQUFFLElBQUksR0FBRyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLFlBQVksRUFBRSxVQUFVLElBQUksRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxTQUFTLEVBQUUsS0FBSyxDQUFDLEVBQUUsRUFBRTtnQkFDakcsT0FBTyxDQUFDLFNBQVMsRUFBRSxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQztZQUN6RCxDQUFDLENBQUMsQ0FBQztZQUNILFVBQVUsRUFBRSxJQUFJLENBQUMsWUFBWSxFQUFFLFVBQVUsQ0FBQyxxQkFBcUIsRUFBRTtTQUNsRSxDQUFDLENBQUM7UUFDSCxPQUFPLE1BQU0sQ0FBQztJQUNoQixDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSCxrQkFBa0IsQ0FBQyxTQUFpQjtRQUNsQyxNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLFVBQVUsQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUMxRCxPQUFPLE1BQU0sQ0FBQyxXQUFXLENBQ3ZCLFNBQVMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLGlCQUFpQixFQUFFLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQyxDQUNyRSxDQUFDO0lBQ0osQ0FBQztJQUVEOztPQUVHO0lBQ0gsSUFBSSxzQkFBc0I7UUFDeEIsT0FBTyxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsVUFBVSxDQUFDLENBQUM7SUFDbkQsQ0FBQztJQUVEOzs7Ozs7OztPQVFHO0lBQ0gsbUJBQW1CO1FBSWpCLE9BQU87WUFDTCxVQUFVLEVBQUUsSUFBSSxHQUFHLENBQ2pCLE1BQU0sQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLFlBQVksRUFBRSxVQUFVLElBQUksRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxTQUFTLEVBQUUsS0FBSyxDQUFDLEVBQUUsRUFBRTtnQkFDN0UsT0FBTyxDQUFDLFNBQVMsRUFBRSxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQztZQUN6RCxDQUFDLENBQUMsQ0FDSDtZQUNELFVBQVUsRUFBRSxJQUFJLENBQUMsWUFBWSxFQUFFLFVBQVUsQ0FBQyxxQkFBcUIsRUFBRTtTQUNsRSxDQUFDO0lBQ0osQ0FBQztJQUVEOzs7Ozs7Ozs7T0FTRztJQUNILGtCQUFrQjtRQUNoQixNQUFNLEVBQUUsVUFBVSxFQUFFLEdBQUcsT0FBTyxDQUFDLFlBQVksQ0FBQyxDQUFDO1FBQzdDLE9BQU8sVUFBVSxDQUFDLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxDQUFDLENBQUM7SUFDaEQsQ0FBQztDQUNGO0FBaEZELG9EQWdGQyJ9
|
package/lib/mdoc/parser.d.ts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { MDoc } from './model/MDoc';
|
|
2
|
+
import { IssuerSignedDocument } from './model/IssuerSignedDocument';
|
|
2
3
|
/**
|
|
3
4
|
* Parse an mdoc
|
|
4
5
|
*
|
|
@@ -6,3 +7,24 @@ import { MDoc } from './model/MDoc';
|
|
|
6
7
|
* @returns {Promise<MDoc>} - The parsed device response
|
|
7
8
|
*/
|
|
8
9
|
export declare const parse: (encoded: Buffer | Uint8Array) => MDoc;
|
|
10
|
+
/**
|
|
11
|
+
* Parse IssuerSigned CBOR and create IssuerSignedDocument.
|
|
12
|
+
* Used for OID4VCI issued credentials that only contain IssuerSigned structure.
|
|
13
|
+
*
|
|
14
|
+
* OID4VCI 1.0 Section A.2.4:
|
|
15
|
+
* The credential claim contains a base64url-encoded CBOR-encoded IssuerSigned structure.
|
|
16
|
+
*
|
|
17
|
+
* @param issuerSignedCbor - CBOR-encoded IssuerSigned structure
|
|
18
|
+
* @param docType - Document type (e.g., 'org.iso.18013.5.1.mDL')
|
|
19
|
+
* @returns IssuerSignedDocument
|
|
20
|
+
*
|
|
21
|
+
* @example
|
|
22
|
+
* ```typescript
|
|
23
|
+
* // Parse OID4VCI issued credential
|
|
24
|
+
* const issuerSignedDoc = parseIssuerSigned(credentialBytes, 'org.iso.18013.5.1.mDL');
|
|
25
|
+
*
|
|
26
|
+
* // Create MDoc for OID4VP presentation
|
|
27
|
+
* const mdoc = new MDoc([issuerSignedDoc]);
|
|
28
|
+
* ```
|
|
29
|
+
*/
|
|
30
|
+
export declare const parseIssuerSigned: (issuerSignedCbor: Uint8Array, docType: string) => IssuerSignedDocument;
|
package/lib/mdoc/parser.js
CHANGED
|
@@ -3,7 +3,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
3
3
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
4
|
};
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
-
exports.parse = void 0;
|
|
6
|
+
exports.parseIssuerSigned = exports.parse = void 0;
|
|
7
7
|
const compare_versions_1 = require("compare-versions");
|
|
8
8
|
const cose_kit_1 = require("cose-kit");
|
|
9
9
|
const cbor_1 = require("../cbor");
|
|
@@ -85,4 +85,52 @@ const parse = (encoded) => {
|
|
|
85
85
|
return new MDoc_1.MDoc(parsedDocuments, version, status);
|
|
86
86
|
};
|
|
87
87
|
exports.parse = parse;
|
|
88
|
-
|
|
88
|
+
/**
|
|
89
|
+
* Parse IssuerSigned CBOR and create IssuerSignedDocument.
|
|
90
|
+
* Used for OID4VCI issued credentials that only contain IssuerSigned structure.
|
|
91
|
+
*
|
|
92
|
+
* OID4VCI 1.0 Section A.2.4:
|
|
93
|
+
* The credential claim contains a base64url-encoded CBOR-encoded IssuerSigned structure.
|
|
94
|
+
*
|
|
95
|
+
* @param issuerSignedCbor - CBOR-encoded IssuerSigned structure
|
|
96
|
+
* @param docType - Document type (e.g., 'org.iso.18013.5.1.mDL')
|
|
97
|
+
* @returns IssuerSignedDocument
|
|
98
|
+
*
|
|
99
|
+
* @example
|
|
100
|
+
* ```typescript
|
|
101
|
+
* // Parse OID4VCI issued credential
|
|
102
|
+
* const issuerSignedDoc = parseIssuerSigned(credentialBytes, 'org.iso.18013.5.1.mDL');
|
|
103
|
+
*
|
|
104
|
+
* // Create MDoc for OID4VP presentation
|
|
105
|
+
* const mdoc = new MDoc([issuerSignedDoc]);
|
|
106
|
+
* ```
|
|
107
|
+
*/
|
|
108
|
+
const parseIssuerSigned = (issuerSignedCbor, docType) => {
|
|
109
|
+
// Decode CBOR
|
|
110
|
+
const decoded = (0, cbor_1.cborDecode)(issuerSignedCbor);
|
|
111
|
+
// Validate IssuerSigned structure
|
|
112
|
+
if (!decoded || typeof decoded !== 'object') {
|
|
113
|
+
throw new errors_1.MDLParseError('Invalid IssuerSigned CBOR');
|
|
114
|
+
}
|
|
115
|
+
// Check for Map structure (CBOR decodes to Map)
|
|
116
|
+
if (!(decoded instanceof Map)) {
|
|
117
|
+
throw new errors_1.MDLParseError('IssuerSigned must be a CBOR Map');
|
|
118
|
+
}
|
|
119
|
+
if (!decoded.has('nameSpaces') || !decoded.has('issuerAuth')) {
|
|
120
|
+
throw new errors_1.MDLParseError('Invalid IssuerSigned structure: missing nameSpaces or issuerAuth');
|
|
121
|
+
}
|
|
122
|
+
// Parse issuerAuth
|
|
123
|
+
const rawIssuerAuth = decoded.get('issuerAuth');
|
|
124
|
+
const issuerAuth = parseIssuerAuthElement(rawIssuerAuth, docType);
|
|
125
|
+
// Parse nameSpaces
|
|
126
|
+
const rawNameSpaces = decoded.get('nameSpaces');
|
|
127
|
+
const nameSpaces = mapIssuerNameSpaces(rawNameSpaces);
|
|
128
|
+
// Create IssuerSigned object
|
|
129
|
+
const issuerSigned = {
|
|
130
|
+
nameSpaces,
|
|
131
|
+
issuerAuth,
|
|
132
|
+
};
|
|
133
|
+
return new IssuerSignedDocument_1.IssuerSignedDocument(docType, issuerSigned);
|
|
134
|
+
};
|
|
135
|
+
exports.parseIssuerSigned = parseIssuerSigned;
|
|
136
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFyc2VyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL21kb2MvcGFyc2VyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBLHVEQUFtRDtBQUNuRCx1Q0FBdUM7QUFDdkMsa0NBQXFDO0FBQ3JDLHVDQUFvQztBQUlwQyxvRUFBNEM7QUFDNUMseURBQXNEO0FBQ3RELHFDQUF5QztBQUN6Qyx1RUFBb0U7QUFDcEUsdUVBQW9FO0FBRXBFLE1BQU0sc0JBQXNCLEdBQUcsQ0FDN0IsYUFBNEIsRUFDNUIsZUFBdUIsRUFDWCxFQUFFO0lBQ2QsTUFBTSxVQUFVLEdBQUcsSUFBSSxvQkFBVSxDQUFDLEdBQUcsYUFBYSxDQUFDLENBQUM7SUFDcEQsTUFBTSxFQUFFLGNBQWMsRUFBRSxHQUFHLFVBQVUsQ0FBQztJQUN0QyxNQUFNLEVBQUUsT0FBTyxFQUFFLE9BQU8sRUFBRSxHQUFHLGNBQWMsQ0FBQztJQUU1QyxJQUFJLE9BQU8sS0FBSyxlQUFlLEVBQUUsQ0FBQztRQUNoQyxNQUFNLElBQUksc0JBQWEsQ0FBQyxrQ0FBa0MsZUFBZSxFQUFFLENBQUMsQ0FBQztJQUMvRSxDQUFDO0lBRUQsSUFBSSxDQUFDLE9BQU8sSUFBSSxJQUFBLGtDQUFlLEVBQUMsT0FBTyxFQUFFLEtBQUssQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO1FBQ3RELE1BQU0sSUFBSSxzQkFBYSxDQUFDLHNDQUFzQyxDQUFDLENBQUM7SUFDbEUsQ0FBQztJQUVELE9BQU8sVUFBVSxDQUFDO0FBQ3BCLENBQUMsQ0FBQztBQUVGLE1BQU0sc0JBQXNCLEdBQUcsQ0FBQyxhQUE0QixFQUFjLEVBQUU7SUFDMUUsTUFBTSxFQUFFLGVBQWUsRUFBRSxTQUFTLEVBQUUsR0FBRyxNQUFNLENBQUMsV0FBVyxDQUFDLGFBQWEsQ0FBQyxDQUFDO0lBQ3pFLElBQUksZUFBZSxFQUFFLENBQUM7UUFDcEIsT0FBTyxFQUFFLGVBQWUsRUFBRSxJQUFJLGdCQUFLLENBQUMsR0FB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
|