@vess-id/mdl 0.0.8 → 0.0.10
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 +1 -1
- package/lib/index.js +3 -2
- package/lib/mdoc/parser.d.ts +22 -0
- package/lib/mdoc/parser.js +84 -14
- package/package.json +1 -1
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==
|
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");
|
|
@@ -64,25 +64,95 @@ const parse = (encoded) => {
|
|
|
64
64
|
catch (err) {
|
|
65
65
|
throw new errors_1.MDLParseError(`Unable to decode device response: ${err.message}`);
|
|
66
66
|
}
|
|
67
|
-
|
|
67
|
+
// Handle both Map and Object responses from cbor-x
|
|
68
|
+
const isResponseMap = deviceResponse instanceof Map;
|
|
69
|
+
const responseData = isResponseMap
|
|
70
|
+
? Object.fromEntries(deviceResponse)
|
|
71
|
+
: deviceResponse;
|
|
72
|
+
const { version, documents, status } = responseData;
|
|
68
73
|
const parsedDocuments = documents.map((doc) => {
|
|
69
|
-
|
|
70
|
-
const
|
|
71
|
-
|
|
72
|
-
|
|
74
|
+
// Helper functions to handle both Map and Object
|
|
75
|
+
const isDocMap = doc instanceof Map;
|
|
76
|
+
const getDocKey = (key) => isDocMap ? doc.get(key) : doc[key];
|
|
77
|
+
const hasDocKey = (key) => isDocMap ? doc.has(key) : key in doc;
|
|
78
|
+
const issuerSignedData = getDocKey('issuerSigned');
|
|
79
|
+
const getIssuerSignedKey = (key) => issuerSignedData instanceof Map ? issuerSignedData.get(key) : issuerSignedData[key];
|
|
80
|
+
const issuerAuth = parseIssuerAuthElement(getIssuerSignedKey('issuerAuth'), getDocKey('docType'));
|
|
81
|
+
const issuerSigned = hasDocKey('issuerSigned') ? {
|
|
82
|
+
...issuerSignedData,
|
|
83
|
+
nameSpaces: mapIssuerNameSpaces(getIssuerSignedKey('nameSpaces')),
|
|
73
84
|
issuerAuth,
|
|
74
85
|
} : undefined;
|
|
75
|
-
const deviceSigned =
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
86
|
+
const deviceSigned = hasDocKey('deviceSigned') ? (() => {
|
|
87
|
+
const deviceSignedData = getDocKey('deviceSigned');
|
|
88
|
+
const getDeviceSignedKey = (key) => deviceSignedData instanceof Map ? deviceSignedData.get(key) : deviceSignedData[key];
|
|
89
|
+
const nameSpacesData = getDeviceSignedKey('nameSpaces');
|
|
90
|
+
const nameSpacesDataValue = nameSpacesData instanceof Map ? nameSpacesData.get('data') : nameSpacesData.data;
|
|
91
|
+
return {
|
|
92
|
+
...deviceSignedData,
|
|
93
|
+
nameSpaces: mapDeviceNameSpaces(nameSpacesDataValue),
|
|
94
|
+
deviceAuth: parseDeviceAuthElement(getDeviceSignedKey('deviceAuth')),
|
|
95
|
+
};
|
|
96
|
+
})() : undefined;
|
|
80
97
|
if (deviceSigned) {
|
|
81
|
-
return new DeviceSignedDocument_1.DeviceSignedDocument(
|
|
98
|
+
return new DeviceSignedDocument_1.DeviceSignedDocument(getDocKey('docType'), issuerSigned, deviceSigned);
|
|
82
99
|
}
|
|
83
|
-
return new IssuerSignedDocument_1.IssuerSignedDocument(
|
|
100
|
+
return new IssuerSignedDocument_1.IssuerSignedDocument(getDocKey('docType'), issuerSigned);
|
|
84
101
|
});
|
|
85
102
|
return new MDoc_1.MDoc(parsedDocuments, version, status);
|
|
86
103
|
};
|
|
87
104
|
exports.parse = parse;
|
|
88
|
-
|
|
105
|
+
/**
|
|
106
|
+
* Parse IssuerSigned CBOR and create IssuerSignedDocument.
|
|
107
|
+
* Used for OID4VCI issued credentials that only contain IssuerSigned structure.
|
|
108
|
+
*
|
|
109
|
+
* OID4VCI 1.0 Section A.2.4:
|
|
110
|
+
* The credential claim contains a base64url-encoded CBOR-encoded IssuerSigned structure.
|
|
111
|
+
*
|
|
112
|
+
* @param issuerSignedCbor - CBOR-encoded IssuerSigned structure
|
|
113
|
+
* @param docType - Document type (e.g., 'org.iso.18013.5.1.mDL')
|
|
114
|
+
* @returns IssuerSignedDocument
|
|
115
|
+
*
|
|
116
|
+
* @example
|
|
117
|
+
* ```typescript
|
|
118
|
+
* // Parse OID4VCI issued credential
|
|
119
|
+
* const issuerSignedDoc = parseIssuerSigned(credentialBytes, 'org.iso.18013.5.1.mDL');
|
|
120
|
+
*
|
|
121
|
+
* // Create MDoc for OID4VP presentation
|
|
122
|
+
* const mdoc = new MDoc([issuerSignedDoc]);
|
|
123
|
+
* ```
|
|
124
|
+
*/
|
|
125
|
+
const parseIssuerSigned = (issuerSignedCbor, docType) => {
|
|
126
|
+
// Decode CBOR
|
|
127
|
+
const decoded = (0, cbor_1.cborDecode)(issuerSignedCbor);
|
|
128
|
+
// Validate IssuerSigned structure
|
|
129
|
+
if (!decoded || typeof decoded !== 'object') {
|
|
130
|
+
throw new errors_1.MDLParseError('Invalid IssuerSigned CBOR');
|
|
131
|
+
}
|
|
132
|
+
// Check for Map or Object structure (cbor-x may decode to either)
|
|
133
|
+
const isMap = decoded instanceof Map;
|
|
134
|
+
const isObject = !isMap && typeof decoded === 'object' && decoded !== null;
|
|
135
|
+
if (!isMap && !isObject) {
|
|
136
|
+
throw new errors_1.MDLParseError('IssuerSigned must be a CBOR Map or Object');
|
|
137
|
+
}
|
|
138
|
+
// Helper functions to access properties regardless of Map or Object
|
|
139
|
+
const hasKey = (key) => isMap ? decoded.has(key) : key in decoded;
|
|
140
|
+
const getKey = (key) => isMap ? decoded.get(key) : decoded[key];
|
|
141
|
+
if (!hasKey('nameSpaces') || !hasKey('issuerAuth')) {
|
|
142
|
+
throw new errors_1.MDLParseError('Invalid IssuerSigned structure: missing nameSpaces or issuerAuth');
|
|
143
|
+
}
|
|
144
|
+
// Parse issuerAuth
|
|
145
|
+
const rawIssuerAuth = getKey('issuerAuth');
|
|
146
|
+
const issuerAuth = parseIssuerAuthElement(rawIssuerAuth, docType);
|
|
147
|
+
// Parse nameSpaces
|
|
148
|
+
const rawNameSpaces = getKey('nameSpaces');
|
|
149
|
+
const nameSpaces = mapIssuerNameSpaces(rawNameSpaces);
|
|
150
|
+
// Create IssuerSigned object
|
|
151
|
+
const issuerSigned = {
|
|
152
|
+
nameSpaces,
|
|
153
|
+
issuerAuth,
|
|
154
|
+
};
|
|
155
|
+
return new IssuerSignedDocument_1.IssuerSignedDocument(docType, issuerSigned);
|
|
156
|
+
};
|
|
157
|
+
exports.parseIssuerSigned = parseIssuerSigned;
|
|
158
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFyc2VyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL21kb2MvcGFyc2VyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBLHVEQUFtRDtBQUNuRCx1Q0FBdUM7QUFDdkMsa0NBQXFDO0FBQ3JDLHVDQUFvQztBQUlwQyxvRUFBNEM7QUFDNUMseURBQXNEO0FBQ3RELHFDQUF5QztBQUN6Qyx1RUFBb0U7QUFDcEUsdUVBQW9FO0FBRXBFLE1BQU0sc0JBQXNCLEdBQUcsQ0FDN0IsYUFBNEIsRUFDNUIsZUFBdUIsRUFDWCxFQUFFO0lBQ2QsTUFBTSxVQUFVLEdBQUcsSUFBSSxvQkFBVSxDQUFDLEdBQUcsYUFBYSxDQUFDLENBQUM7SUFDcEQsTUFBTSxFQUFFLGNBQWMsRUFBRSxHQUFHLFVBQVUsQ0FBQztJQUN0QyxNQUFNLEVBQUUsT0FBTyxFQUFFLE9BQU8sRUFBRSxHQUFHLGNBQWMsQ0FBQztJQUU1QyxJQUFJLE9BQU8sS0FBSyxlQUFlLEVBQUUsQ0FBQztRQUNoQyxNQUFNLElBQUksc0JBQWEsQ0FBQyxrQ0FBa0MsZUFBZSxFQUFFLENBQUMsQ0FBQztJQUMvRSxDQUFDO0lBRUQsSUFBSSxDQUFDLE9BQU8sSUFBSSxJQUFBLGtDQUFlLEVBQUMsT0FBTyxFQUFFLEtBQUssQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO1FBQ3RELE1BQU0sSUFBSSxzQkFBYSxDQUFDLHNDQUFzQyxDQUFDLENBQUM7SUFDbEUsQ0FBQztJQUVELE9BQU8sVUFBVSxDQUFDO0FBQ3BCLENBQUMsQ0FBQztBQUVGLE1BQU0sc0JBQXNCLEdBQUcsQ0FBQyxhQUE0QixFQUFjLEVBQUU7SUFDMUUsTUFBTSxFQUFFLGVBQWUsRUFBRSxTQUFTLEVBQUUsR0FBRyxNQUFNLENBQUMsV0FBVyxDQUFDLGFBQWEsQ0FBQyxDQUFDO0lBQ3pFLElBQUksZUFBZSxFQUFFLENBQUM7UUFDcEIsT0FBTyxFQUFFLGVBQWUsRUFBRSxJQUFJLGdCQUFLLENBQUMsR0FB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
|