@vess-id/mdl 0.0.4 → 0.0.5
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/mdoc/model/IssuerAuth.js +123 -17
- package/package.json +1 -1
|
@@ -75,11 +75,64 @@ class IssuerAuth extends cose_kit_1.Sign1 {
|
|
|
75
75
|
* This allows external signing (HSM, remote signing, etc.) without exposing private keys
|
|
76
76
|
*/
|
|
77
77
|
static async signWithCallback(protectedHeaders, unprotectedHeaders, payload, signer, algorithm) {
|
|
78
|
-
// Create the protected headers map
|
|
79
|
-
const protectedHeadersMap = new Map(
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
78
|
+
// Create the protected headers map using standard COSE header mappings
|
|
79
|
+
const protectedHeadersMap = new Map();
|
|
80
|
+
for (const [key, value] of Object.entries(protectedHeaders)) {
|
|
81
|
+
let numericKey;
|
|
82
|
+
let processedValue = value;
|
|
83
|
+
// Map COSE header parameter names to their numeric keys
|
|
84
|
+
switch (key) {
|
|
85
|
+
case 'alg':
|
|
86
|
+
numericKey = 1;
|
|
87
|
+
// Convert algorithm string to COSE algorithm identifier
|
|
88
|
+
if (value === 'ES256')
|
|
89
|
+
processedValue = -7;
|
|
90
|
+
else if (value === 'ES384')
|
|
91
|
+
processedValue = -35;
|
|
92
|
+
else if (value === 'ES512')
|
|
93
|
+
processedValue = -36;
|
|
94
|
+
else if (value === 'EdDSA')
|
|
95
|
+
processedValue = -8;
|
|
96
|
+
else if (typeof value === 'number')
|
|
97
|
+
processedValue = value;
|
|
98
|
+
else
|
|
99
|
+
throw new Error(`Unsupported algorithm: ${value}`);
|
|
100
|
+
break;
|
|
101
|
+
case 'crit':
|
|
102
|
+
numericKey = 2;
|
|
103
|
+
break;
|
|
104
|
+
case 'ctyp':
|
|
105
|
+
numericKey = 3;
|
|
106
|
+
// Convert string to UTF-8 bytes if needed
|
|
107
|
+
if (typeof value === 'string') {
|
|
108
|
+
processedValue = new TextEncoder().encode(value);
|
|
109
|
+
}
|
|
110
|
+
break;
|
|
111
|
+
case 'kid':
|
|
112
|
+
numericKey = 4;
|
|
113
|
+
// Convert string to UTF-8 bytes
|
|
114
|
+
if (typeof value === 'string') {
|
|
115
|
+
processedValue = new TextEncoder().encode(value);
|
|
116
|
+
}
|
|
117
|
+
break;
|
|
118
|
+
case 'x5chain':
|
|
119
|
+
numericKey = 33;
|
|
120
|
+
break;
|
|
121
|
+
default: {
|
|
122
|
+
// Try parsing as numeric key
|
|
123
|
+
const parsedKey = typeof key === 'string' ? parseInt(key, 10) : key;
|
|
124
|
+
if (Number.isNaN(parsedKey)) {
|
|
125
|
+
throw new Error(`Unknown COSE header parameter: ${key}`);
|
|
126
|
+
}
|
|
127
|
+
numericKey = parsedKey;
|
|
128
|
+
// Convert strings to bytes for consistency with cose-kit
|
|
129
|
+
if (typeof value === 'string') {
|
|
130
|
+
processedValue = new TextEncoder().encode(value);
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
protectedHeadersMap.set(numericKey, processedValue);
|
|
135
|
+
}
|
|
83
136
|
// Manually encode protected headers according to COSE specification
|
|
84
137
|
// Protected headers must be a CBOR-encoded map
|
|
85
138
|
const encodedProtectedHeaders = (0, cbor_1.cborEncode)(protectedHeadersMap);
|
|
@@ -128,20 +181,73 @@ class IssuerAuth extends cose_kit_1.Sign1 {
|
|
|
128
181
|
unprotectedHeadersMap = unprotectedHeaders;
|
|
129
182
|
}
|
|
130
183
|
else {
|
|
131
|
-
unprotectedHeadersMap = new Map(
|
|
132
|
-
|
|
184
|
+
unprotectedHeadersMap = new Map();
|
|
185
|
+
for (const [key, value] of Object.entries(unprotectedHeaders)) {
|
|
133
186
|
let numericKey;
|
|
134
|
-
|
|
135
|
-
|
|
187
|
+
let processedValue = value;
|
|
188
|
+
// if value is undefined, skip
|
|
189
|
+
if (value === undefined) {
|
|
190
|
+
continue;
|
|
136
191
|
}
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
192
|
+
// Map COSE header parameter names to their numeric keys
|
|
193
|
+
switch (key) {
|
|
194
|
+
case 'alg':
|
|
195
|
+
numericKey = 1;
|
|
196
|
+
// Convert algorithm string to COSE algorithm identifier
|
|
197
|
+
if (value === 'ES256')
|
|
198
|
+
processedValue = -7;
|
|
199
|
+
else if (value === 'ES384')
|
|
200
|
+
processedValue = -35;
|
|
201
|
+
else if (value === 'ES512')
|
|
202
|
+
processedValue = -36;
|
|
203
|
+
else if (value === 'EdDSA')
|
|
204
|
+
processedValue = -8;
|
|
205
|
+
else if (typeof value === 'number')
|
|
206
|
+
processedValue = value;
|
|
207
|
+
else
|
|
208
|
+
throw new Error(`Unsupported algorithm: ${value}`);
|
|
209
|
+
break;
|
|
210
|
+
case 'crit':
|
|
211
|
+
numericKey = 2;
|
|
212
|
+
break;
|
|
213
|
+
case 'ctyp':
|
|
214
|
+
numericKey = 3;
|
|
215
|
+
// Convert string to UTF-8 bytes if needed
|
|
216
|
+
if (typeof value === 'string') {
|
|
217
|
+
processedValue = new TextEncoder().encode(value);
|
|
218
|
+
}
|
|
219
|
+
break;
|
|
220
|
+
case 'kid':
|
|
221
|
+
numericKey = 4;
|
|
222
|
+
// RFC 8152: kid must be encoded as byte string (bstr)
|
|
223
|
+
if (typeof value === 'string') {
|
|
224
|
+
processedValue = new TextEncoder().encode(value);
|
|
225
|
+
}
|
|
226
|
+
else if (value instanceof Uint8Array) {
|
|
227
|
+
processedValue = value; // Already byte array
|
|
228
|
+
}
|
|
229
|
+
else {
|
|
230
|
+
throw new Error('kid parameter must be a string or Uint8Array');
|
|
231
|
+
}
|
|
232
|
+
break;
|
|
233
|
+
case 'x5chain':
|
|
234
|
+
numericKey = 33;
|
|
235
|
+
break;
|
|
236
|
+
default: {
|
|
237
|
+
// Try parsing as numeric key
|
|
238
|
+
const parsedKey = typeof key === 'string' ? parseInt(key, 10) : key;
|
|
239
|
+
if (Number.isNaN(parsedKey)) {
|
|
240
|
+
throw new Error(`Unknown COSE header parameter: ${key}`);
|
|
241
|
+
}
|
|
242
|
+
numericKey = parsedKey;
|
|
243
|
+
// Convert strings to bytes for consistency with cose-kit
|
|
244
|
+
if (typeof value === 'string') {
|
|
245
|
+
processedValue = new TextEncoder().encode(value);
|
|
246
|
+
}
|
|
247
|
+
}
|
|
142
248
|
}
|
|
143
|
-
|
|
144
|
-
}
|
|
249
|
+
unprotectedHeadersMap.set(numericKey, processedValue);
|
|
250
|
+
}
|
|
145
251
|
}
|
|
146
252
|
}
|
|
147
253
|
else {
|
|
@@ -152,4 +258,4 @@ class IssuerAuth extends cose_kit_1.Sign1 {
|
|
|
152
258
|
}
|
|
153
259
|
_IssuerAuth_decodedPayload = new WeakMap(), _IssuerAuth_certificate = new WeakMap();
|
|
154
260
|
exports.default = IssuerAuth;
|
|
155
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
261
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiSXNzdWVyQXV0aC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9tZG9jL21vZGVsL0lzc3VlckF1dGgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7QUFBQSx1Q0FBdUU7QUFDdkUseUNBQWlEO0FBRWpELHFDQUFvRDtBQUNwRCxrREFBK0M7QUFRL0M7OztHQUdHO0FBQ0gsTUFBcUIsVUFBVyxTQUFRLGdCQUFLO0lBSTNDLFlBQ0UsZUFBa0QsRUFDbEQsaUJBQXVDLEVBQ3ZDLE9BQW1CLEVBQ25CLFNBQXFCO1FBRXJCLEtBQUssQ0FBQyxlQUFlLEVBQUUsaUJBQWlCLEVBQUUsT0FBTyxFQUFFLFNBQVMsQ0FBQyxDQUFDO1FBVGhFLDZDQUFxQjtRQUNyQiwwQ0FBOEI7SUFTOUIsQ0FBQztJQUVELElBQVcsY0FBYztRQUN2QixJQUFJLHVCQUFBLElBQUksa0NBQWdCLEVBQUUsQ0FBQztZQUN6QixPQUFPLHVCQUFBLElBQUksa0NBQWdCLENBQUM7UUFDOUIsQ0FBQztRQUNELElBQUksT0FBTyxHQUFHLElBQUEsaUJBQVUsRUFBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDdkMsT0FBTyxHQUFHLE9BQU8sWUFBWSxtQkFBUSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUM7UUFDL0QsT0FBTyxHQUFHLE1BQU0sQ0FBQyxXQUFXLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDdEMsTUFBTSxlQUFlLEdBQUcsQ0FBQyxZQUFxQyxFQUFFLEVBQUU7WUFDaEUsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO2dCQUNsQixPQUFPLFlBQVksQ0FBQztZQUN0QixDQUFDO1lBQ0QsT0FBTyxNQUFNLENBQUMsV0FBVyxDQUN2QixDQUFDLEdBQUcsWUFBWSxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsS0FBSyxDQUFD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
|