@gerege-systems/eid-mongolia-sdk 0.15.0 → 0.15.2

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/dist/pades.js CHANGED
@@ -1,3 +1,33 @@
1
+ import {
2
+ ByteWriter,
3
+ CLAIMED_ROLE_MAX_RUNES,
4
+ LTVError,
5
+ OID,
6
+ TAG,
7
+ assembleCMS,
8
+ checkSignatureFrom,
9
+ children,
10
+ collectLTVWithWait,
11
+ concat,
12
+ enc,
13
+ fromB64,
14
+ fromHex,
15
+ fromLatin1,
16
+ latin1,
17
+ oidString,
18
+ parseCertificate,
19
+ parseSignedData,
20
+ randomBytes,
21
+ readNode,
22
+ sha1,
23
+ sha256,
24
+ signedAttributes,
25
+ timestampToken,
26
+ toB64,
27
+ toHex,
28
+ verifyCitizen,
29
+ verifySignedData
30
+ } from "./chunk-52O3T7DZ.js";
1
31
  import {
2
32
  EidError
3
33
  } from "./chunk-TB2KQH3W.js";
@@ -24,765 +54,6 @@ var EID_ISSUERS = [
24
54
  "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"
25
55
  ];
26
56
 
27
- // src/pades/bytes.ts
28
- var enc = new TextEncoder();
29
- function latin1(s) {
30
- const out = new Uint8Array(s.length);
31
- for (let i = 0; i < s.length; i++) out[i] = s.charCodeAt(i) & 255;
32
- return out;
33
- }
34
- function fromLatin1(b, start = 0, end = b.length) {
35
- let s = "";
36
- for (let i = start; i < end; i += 32768) s += String.fromCharCode(...b.subarray(i, Math.min(end, i + 32768)));
37
- return s;
38
- }
39
- function concat(parts) {
40
- let n = 0;
41
- for (const p of parts) n += p.length;
42
- const out = new Uint8Array(n);
43
- let o = 0;
44
- for (const p of parts) {
45
- out.set(p, o);
46
- o += p.length;
47
- }
48
- return out;
49
- }
50
- function equal(a, b) {
51
- if (a.length !== b.length) return false;
52
- for (let i = 0; i < a.length; i++) if (a[i] !== b[i]) return false;
53
- return true;
54
- }
55
- function compare(a, b) {
56
- const n = Math.min(a.length, b.length);
57
- for (let i = 0; i < n; i++) if (a[i] !== b[i]) return a[i] - b[i];
58
- return a.length - b.length;
59
- }
60
- var HEX = "0123456789abcdef";
61
- function toHex(b) {
62
- let s = "";
63
- for (const x of b) s += HEX[x >> 4] + HEX[x & 15];
64
- return s;
65
- }
66
- function fromHex(s) {
67
- if (s.length % 2 !== 0 || /[^0-9a-fA-F]/.test(s)) throw new Error("hex \u0431\u0443\u0440\u0443\u0443");
68
- const out = new Uint8Array(s.length / 2);
69
- for (let i = 0; i < out.length; i++) out[i] = parseInt(s.substr(i * 2, 2), 16);
70
- return out;
71
- }
72
- function toB64(b) {
73
- return btoa(fromLatin1(b));
74
- }
75
- function fromB64(s) {
76
- return latin1(atob(s));
77
- }
78
- var ByteWriter = class {
79
- buf = new Uint8Array(1 << 16);
80
- len = 0;
81
- grow(n) {
82
- if (this.len + n <= this.buf.length) return;
83
- let cap = this.buf.length * 2;
84
- while (cap < this.len + n) cap *= 2;
85
- const nb = new Uint8Array(cap);
86
- nb.set(this.buf.subarray(0, this.len));
87
- this.buf = nb;
88
- }
89
- bytes(b) {
90
- this.grow(b.length);
91
- this.buf.set(b, this.len);
92
- this.len += b.length;
93
- return this;
94
- }
95
- /** ASCII/latin1 мөр. */
96
- str(s) {
97
- this.grow(s.length);
98
- for (let i = 0; i < s.length; i++) this.buf[this.len + i] = s.charCodeAt(i) & 255;
99
- this.len += s.length;
100
- return this;
101
- }
102
- byte(x) {
103
- this.grow(1);
104
- this.buf[this.len++] = x & 255;
105
- return this;
106
- }
107
- /** Хуулбар. */
108
- result() {
109
- return this.buf.slice(0, this.len);
110
- }
111
- };
112
-
113
- // src/pades/asn1.ts
114
- var Asn1Error = class extends Error {
115
- };
116
- var TAG = {
117
- BOOLEAN: 1,
118
- INTEGER: 2,
119
- BIT_STRING: 3,
120
- OCTET_STRING: 4,
121
- NULL: 5,
122
- OID: 6,
123
- ENUMERATED: 10,
124
- UTF8String: 12,
125
- SEQUENCE: 48,
126
- SET: 49,
127
- PrintableString: 19,
128
- IA5String: 22,
129
- UTCTime: 23,
130
- GeneralizedTime: 24
131
- };
132
- function readNode(b, off = 0) {
133
- if (off + 2 > b.length) throw new Asn1Error("asn1: \u0434\u0443\u0442\u0443\u0443");
134
- const tag = b[off];
135
- if ((tag & 31) === 31) throw new Asn1Error("asn1: \u043E\u043B\u043E\u043D \u0431\u0430\u0439\u0442 tag \u0434\u044D\u043C\u0436\u0438\u0433\u0434\u044D\u0445\u0433\u04AF\u0439");
136
- let len = b[off + 1];
137
- let p = off + 2;
138
- if (len & 128) {
139
- const n = len & 127;
140
- if (n === 0 || n > 4) throw new Asn1Error("asn1: \u0443\u0440\u0442 \u0431\u0443\u0440\u0443\u0443");
141
- if (p + n > b.length) throw new Asn1Error("asn1: \u0434\u0443\u0442\u0443\u0443");
142
- if (b[p] === 0) throw new Asn1Error("asn1: \u0443\u0440\u0442 minimal \u0431\u0438\u0448");
143
- len = 0;
144
- for (let i = 0; i < n; i++) len = len * 256 + b[p + i];
145
- if (len < 128) throw new Asn1Error("asn1: \u0443\u0440\u0442 minimal \u0431\u0438\u0448");
146
- p += n;
147
- }
148
- if (p + len > b.length) throw new Asn1Error("asn1: \u0434\u0443\u0442\u0443\u0443");
149
- return { tag, raw: b.subarray(off, p + len), value: b.subarray(p, p + len) };
150
- }
151
- function parseOne(b) {
152
- const n = readNode(b, 0);
153
- if (n.raw.length !== b.length) throw new Asn1Error("asn1: \u0438\u043B\u04AF\u04AF \u04E9\u0433\u04E9\u0433\u0434\u04E9\u043B");
154
- return n;
155
- }
156
- function children(n) {
157
- const v = n instanceof Uint8Array ? n : n.value;
158
- const out = [];
159
- for (let p = 0; p < v.length; ) {
160
- const c = readNode(v, p);
161
- out.push(c);
162
- p += c.raw.length;
163
- }
164
- return out;
165
- }
166
- function expect(n, tag, what) {
167
- if (!n || n.tag !== tag) throw new Asn1Error(`asn1: ${what} \u0445\u04AF\u043B\u044D\u044D\u0441\u044D\u043D`);
168
- return n;
169
- }
170
- function lenBytes(n) {
171
- if (n < 128) return Uint8Array.of(n);
172
- const out = [];
173
- for (let x = n; x > 0; x = Math.floor(x / 256)) out.unshift(x & 255);
174
- return Uint8Array.from([128 | out.length, ...out]);
175
- }
176
- function tlv(tag, ...content) {
177
- const v = concat(content);
178
- return concat([Uint8Array.of(tag), lenBytes(v.length), v]);
179
- }
180
- var seq = (...c) => tlv(TAG.SEQUENCE, ...c);
181
- var set = (...c) => tlv(TAG.SET, ...c);
182
- var octet = (b) => tlv(TAG.OCTET_STRING, b);
183
- var nullDer = () => Uint8Array.of(5, 0);
184
- var ctx = (n, constructed, ...c) => tlv(128 | (constructed ? 32 : 0) | n, ...c);
185
- function oid(s) {
186
- const parts = s.split(".").map((x) => BigInt(x));
187
- const body = [];
188
- const enc2 = (v) => {
189
- const tmp = [Number(v & 0x7fn)];
190
- for (v >>= 7n; v > 0n; v >>= 7n) tmp.unshift(Number(v & 0x7fn) | 128);
191
- body.push(...tmp);
192
- };
193
- enc2(parts[0] * 40n + parts[1]);
194
- for (const p of parts.slice(2)) enc2(p);
195
- return tlv(TAG.OID, Uint8Array.from(body));
196
- }
197
- function oidString(v) {
198
- const out = [];
199
- let cur = 0n;
200
- for (const b of v) {
201
- cur = cur << 7n | BigInt(b & 127);
202
- if (!(b & 128)) {
203
- out.push(cur);
204
- cur = 0n;
205
- }
206
- }
207
- if (out.length === 0) return "";
208
- const first = out[0];
209
- const a = first < 40n ? 0n : first < 80n ? 1n : 2n;
210
- return [a, first - a * 40n, ...out.slice(1)].join(".");
211
- }
212
- function intFromBig(v) {
213
- if (v === 0n) return tlv(TAG.INTEGER, Uint8Array.of(0));
214
- const bytes = [];
215
- if (v > 0n) {
216
- for (let x = v; x > 0n; x >>= 8n) bytes.unshift(Number(x & 0xffn));
217
- if (bytes[0] & 128) bytes.unshift(0);
218
- } else {
219
- let x = v;
220
- for (; ; ) {
221
- bytes.unshift(Number(x & 0xffn));
222
- x >>= 8n;
223
- if (x === -1n && bytes[0] & 128) break;
224
- }
225
- }
226
- return tlv(TAG.INTEGER, Uint8Array.from(bytes));
227
- }
228
- function bigFromBytes(b) {
229
- let v = 0n;
230
- for (const x of b) v = v << 8n | BigInt(x);
231
- return v;
232
- }
233
- function intValue(v) {
234
- if (v.length === 0) throw new Asn1Error("asn1: \u0445\u043E\u043E\u0441\u043E\u043D INTEGER");
235
- let x = bigFromBytes(v);
236
- if (v[0] & 128) x -= 1n << BigInt(v.length * 8);
237
- return x;
238
- }
239
- function parseTime(n) {
240
- const s = String.fromCharCode(...n.value);
241
- let m;
242
- if (n.tag === TAG.UTCTime) {
243
- m = /^(\d{2})(\d{2})(\d{2})(\d{2})(\d{2})(\d{2})?(Z|[+-]\d{4})$/.exec(s);
244
- if (!m) throw new Asn1Error("asn1: UTCTime \u0431\u0443\u0440\u0443\u0443");
245
- let y = Number(m[1]);
246
- y += y < 50 ? 2e3 : 1900;
247
- return mkDate(y, m[2], m[3], m[4], m[5], m[6] ?? "00", "", m[7]);
248
- }
249
- if (n.tag === TAG.GeneralizedTime) {
250
- m = /^(\d{4})(\d{2})(\d{2})(\d{2})(\d{2})(\d{2})(\.\d+)?(Z|[+-]\d{4})$/.exec(s);
251
- if (!m) throw new Asn1Error("asn1: GeneralizedTime \u0431\u0443\u0440\u0443\u0443");
252
- return mkDate(Number(m[1]), m[2], m[3], m[4], m[5], m[6], m[7] ?? "", m[8]);
253
- }
254
- throw new Asn1Error("asn1: \u0446\u0430\u0433 \u0445\u04AF\u043B\u044D\u044D\u0441\u044D\u043D");
255
- }
256
- function parsePreciseTime(n) {
257
- const date = parseTime(n);
258
- const m = /\.(\d+)/.exec(String.fromCharCode(...n.value));
259
- const nanos = m ? Number((m[1] + "000000000").slice(0, 9)) : 0;
260
- return { date, nanos };
261
- }
262
- function mkDate(y, mo, d, h, mi, s, frac, z) {
263
- let t = Date.UTC(y, Number(mo) - 1, Number(d), Number(h), Number(mi), Number(s));
264
- if (frac) t += Math.floor(Number("0" + frac) * 1e3);
265
- if (z !== "Z") {
266
- const off = (Number(z.slice(1, 3)) * 60 + Number(z.slice(3, 5))) * 6e4;
267
- t += z[0] === "+" ? -off : off;
268
- }
269
- return new Date(t);
270
- }
271
-
272
- // src/pades/crypto.ts
273
- var subtlePromise;
274
- var nodeImport = (m) => import(
275
- /* @vite-ignore */
276
- /* webpackIgnore: true */
277
- m
278
- );
279
- async function webcrypto() {
280
- const g = globalThis.crypto;
281
- if (g?.subtle) return g;
282
- const m = await nodeImport("node:crypto");
283
- if (!m.webcrypto) throw new Error("Web Crypto \u0430\u043B\u0433\u0430");
284
- return m.webcrypto;
285
- }
286
- function subtle() {
287
- subtlePromise ??= webcrypto().then((c) => c.subtle);
288
- return subtlePromise;
289
- }
290
- async function randomBytes(n) {
291
- return (await webcrypto()).getRandomValues(new Uint8Array(n));
292
- }
293
- async function sha256(b) {
294
- return new Uint8Array(await (await subtle()).digest("SHA-256", b));
295
- }
296
- async function sha1(b) {
297
- return new Uint8Array(await (await subtle()).digest("SHA-1", b));
298
- }
299
- async function digest(alg, b) {
300
- return new Uint8Array(await (await subtle()).digest(alg, b));
301
- }
302
-
303
- // src/pades/x509.ts
304
- var OID = {
305
- rsaEncryption: "1.2.840.113549.1.1.1",
306
- rsaPSS: "1.2.840.113549.1.1.10",
307
- sha256WithRSA: "1.2.840.113549.1.1.11",
308
- sha384WithRSA: "1.2.840.113549.1.1.12",
309
- sha512WithRSA: "1.2.840.113549.1.1.13",
310
- ecPublicKey: "1.2.840.10045.2.1",
311
- ecdsaSHA256: "1.2.840.10045.4.3.2",
312
- ecdsaSHA384: "1.2.840.10045.4.3.3",
313
- ecdsaSHA512: "1.2.840.10045.4.3.4",
314
- p256: "1.2.840.10045.3.1.7",
315
- p384: "1.3.132.0.34",
316
- p521: "1.3.132.0.35",
317
- sha1: "1.3.14.3.2.26",
318
- sha256: "2.16.840.1.101.3.4.2.1",
319
- sha384: "2.16.840.1.101.3.4.2.2",
320
- sha512: "2.16.840.1.101.3.4.2.3",
321
- commonName: "2.5.4.3",
322
- surname: "2.5.4.4",
323
- givenName: "2.5.4.42",
324
- extKeyUsage: "2.5.29.37",
325
- keyUsage: "2.5.29.15",
326
- basicConstraints: "2.5.29.19",
327
- crlDP: "2.5.29.31",
328
- aia: "1.3.6.1.5.5.7.1.1",
329
- ocspMethod: "1.3.6.1.5.5.7.48.1",
330
- kpTimeStamping: "1.3.6.1.5.5.7.3.8",
331
- kpOCSPSigning: "1.3.6.1.5.5.7.3.9",
332
- kpAny: "2.5.29.37.0"
333
- };
334
- var CertError = class extends Error {
335
- };
336
- function bitString(n) {
337
- expect(n, TAG.BIT_STRING, "BIT STRING");
338
- if (n.value.length === 0) throw new Asn1Error("BIT STRING \u0445\u043E\u043E\u0441\u043E\u043D");
339
- return n.value.subarray(1);
340
- }
341
- function decodeDirString(n) {
342
- if (n.tag === 30) {
343
- let s = "";
344
- for (let i = 0; i + 1 < n.value.length; i += 2) s += String.fromCharCode(n.value[i] << 8 | n.value[i + 1]);
345
- return s;
346
- }
347
- if (n.tag === TAG.UTF8String) return new TextDecoder().decode(n.value);
348
- return String.fromCharCode(...n.value);
349
- }
350
- function nameAttrs(name) {
351
- const out = [];
352
- for (const rdn of children(name)) {
353
- for (const atv of children(rdn)) {
354
- const [t, v] = children(atv);
355
- if (!t || !v) continue;
356
- out.push([oidString(t.value), decodeDirString(v)]);
357
- }
358
- }
359
- return out;
360
- }
361
- function parseCertificate(der2) {
362
- try {
363
- const top = parseOne(der2);
364
- expect(top, TAG.SEQUENCE, "Certificate");
365
- const [tbsN, sigAlg, sigN] = children(top);
366
- const tbs = expect(tbsN, TAG.SEQUENCE, "TBSCertificate");
367
- const f = children(tbs);
368
- let i = 0;
369
- let version = 1;
370
- if (f[0]?.tag === 160) {
371
- const v = expect(children(f[0])[0], TAG.INTEGER, "version");
372
- version = v.value[0] + 1;
373
- i++;
374
- }
375
- const serial = expect(f[i++], TAG.INTEGER, "serial").value;
376
- i++;
377
- const issuer = expect(f[i++], TAG.SEQUENCE, "issuer");
378
- const validity = children(expect(f[i++], TAG.SEQUENCE, "validity"));
379
- const subject = expect(f[i++], TAG.SEQUENCE, "subject");
380
- const spki = expect(f[i++], TAG.SEQUENCE, "SPKI");
381
- const [algN, pkN] = children(spki);
382
- const algParts = children(expect(algN, TAG.SEQUENCE, "AlgorithmIdentifier"));
383
- const keyAlg = oidString(expect(algParts[0], TAG.OID, "alg").value);
384
- const curve = keyAlg === OID.ecPublicKey && algParts[1]?.tag === TAG.OID ? oidString(algParts[1].value) : void 0;
385
- const extensions = [];
386
- for (; i < f.length; i++) {
387
- if (f[i].tag !== 163) continue;
388
- for (const e of children(expect(children(f[i])[0], TAG.SEQUENCE, "extensions"))) {
389
- const p = children(e);
390
- const o = oidString(expect(p[0], TAG.OID, "ext oid").value);
391
- let critical = false;
392
- let val = p[1];
393
- if (val?.tag === TAG.BOOLEAN) {
394
- critical = val.value[0] !== 0;
395
- val = p[2];
396
- }
397
- extensions.push({ oid: o, critical, value: expect(val, TAG.OCTET_STRING, "ext value").value });
398
- }
399
- }
400
- const subj = nameAttrs(subject);
401
- const iss = nameAttrs(issuer);
402
- const last = (a, o) => a.filter(([k]) => k === o).map(([, v]) => v).pop() ?? "";
403
- const cert = {
404
- raw: top.raw,
405
- tbs: tbs.raw,
406
- version,
407
- serial,
408
- sigAlg: expect(sigAlg, TAG.SEQUENCE, "sigAlg"),
409
- signature: bitString(sigN),
410
- rawIssuer: issuer.raw,
411
- rawSubject: subject.raw,
412
- spki: spki.raw,
413
- keyAlg,
414
- curve,
415
- publicKey: bitString(pkN),
416
- notBefore: parseTime(validity[0]),
417
- notAfter: parseTime(validity[1]),
418
- extensions,
419
- subjectCN: last(subj, OID.commonName),
420
- issuerCN: last(iss, OID.commonName),
421
- // Go SignerDisplayName: Subject.Names-ийн давталтын сүүлийн утга.
422
- givenName: last(subj, OID.givenName),
423
- surname: last(subj, OID.surname),
424
- ocspServers: [],
425
- crlDPs: [],
426
- isCA: false,
427
- basicConstraintsValid: false,
428
- keyUsage: 0,
429
- extKeyUsage: []
430
- };
431
- for (const e of extensions) parseExtension(cert, e);
432
- return cert;
433
- } catch (e) {
434
- throw new CertError(`\u0433\u044D\u0440\u0447\u0438\u043B\u0433\u044D\u044D \u0437\u0430\u0434\u0430\u0440\u0441\u0430\u043D\u0433\u04AF\u0439: ${e instanceof Error ? e.message : String(e)}`);
435
- }
436
- }
437
- function parseExtension(c, e) {
438
- const n = parseOne(e.value);
439
- switch (e.oid) {
440
- case OID.basicConstraints: {
441
- c.basicConstraintsValid = true;
442
- const p = children(n);
443
- c.isCA = p[0]?.tag === TAG.BOOLEAN && p[0].value[0] !== 0;
444
- break;
445
- }
446
- case OID.keyUsage: {
447
- const bs = n.value;
448
- let ku = 0;
449
- for (let i = 1; i < bs.length; i++) {
450
- for (let b = 0; b < 8; b++) if (bs[i] & 128 >> b) ku |= 1 << (i - 1) * 8 + b;
451
- }
452
- c.keyUsage = ku;
453
- break;
454
- }
455
- case OID.extKeyUsage:
456
- c.extKeyUsage = children(n).map((x) => oidString(x.value));
457
- break;
458
- case OID.aia:
459
- for (const ad of children(n)) {
460
- const [m, loc] = children(ad);
461
- if (m && loc && oidString(m.value) === OID.ocspMethod && loc.tag === 134) c.ocspServers.push(String.fromCharCode(...loc.value));
462
- }
463
- break;
464
- case OID.crlDP:
465
- for (const dp of children(n)) {
466
- for (const f of children(dp)) {
467
- if (f.tag !== 160) continue;
468
- for (const fn of children(f)) {
469
- if (fn.tag !== 160) continue;
470
- for (const gn of children(fn)) if (gn.tag === 134) c.crlDPs.push(String.fromCharCode(...gn.value));
471
- }
472
- }
473
- }
474
- break;
475
- }
476
- }
477
- function isTSASigningCert(c) {
478
- const ekus = c.extensions.filter((e2) => e2.oid === OID.extKeyUsage);
479
- if (ekus.length !== 1) return false;
480
- const e = ekus[0];
481
- try {
482
- const oids = children(parseOne(e.value));
483
- return e.critical && oids.length === 1 && oids[0].tag === TAG.OID && oidString(oids[0].value) === OID.kpTimeStamping;
484
- } catch {
485
- return false;
486
- }
487
- }
488
- var HASH_BY_OID = {
489
- [OID.sha1]: "SHA-1",
490
- [OID.sha256]: "SHA-256",
491
- [OID.sha384]: "SHA-384",
492
- [OID.sha512]: "SHA-512"
493
- };
494
- function schemeFor(alg) {
495
- const p = children(alg);
496
- const o = oidString(expect(p[0], TAG.OID, "sigAlg").value);
497
- switch (o) {
498
- case "1.2.840.113549.1.1.5":
499
- return { kind: "rsa", hash: "SHA-1" };
500
- case OID.sha256WithRSA:
501
- return { kind: "rsa", hash: "SHA-256" };
502
- case OID.sha384WithRSA:
503
- return { kind: "rsa", hash: "SHA-384" };
504
- case OID.sha512WithRSA:
505
- return { kind: "rsa", hash: "SHA-512" };
506
- case OID.ecdsaSHA256:
507
- return { kind: "ecdsa", hash: "SHA-256" };
508
- case OID.ecdsaSHA384:
509
- return { kind: "ecdsa", hash: "SHA-384" };
510
- case OID.ecdsaSHA512:
511
- return { kind: "ecdsa", hash: "SHA-512" };
512
- case OID.rsaPSS: {
513
- let hash = "SHA-1";
514
- let salt = 20;
515
- for (const f of p[1] ? children(p[1]) : []) {
516
- if (f.tag === 160) hash = HASH_BY_OID[oidString(children(children(f)[0])[0].value)] ?? hash;
517
- if (f.tag === 162) salt = Number(children(f)[0].value[0]);
518
- }
519
- return { kind: "pss", hash, saltLength: salt };
520
- }
521
- }
522
- throw new CertError(`\u0433\u0430\u0440\u044B\u043D \u04AF\u0441\u0433\u0438\u0439\u043D \u0430\u043B\u0433\u043E\u0440\u0438\u0442\u043C \u0434\u044D\u043C\u0436\u0438\u0433\u0434\u044D\u0445\u0433\u04AF\u0439: ${o}`);
523
- }
524
- var CURVES = {
525
- [OID.p256]: { name: "P-256", size: 32 },
526
- [OID.p384]: { name: "P-384", size: 48 },
527
- [OID.p521]: { name: "P-521", size: 66 }
528
- };
529
- function ecdsaDerToRaw(der2, size) {
530
- const [r, s] = children(parseOne(der2));
531
- const out = new Uint8Array(2 * size);
532
- const put = (v, at) => {
533
- let x = v;
534
- while (x.length > 0 && x[0] === 0) x = x.subarray(1);
535
- if (x.length > size) throw new CertError("ECDSA \u0443\u0442\u0433\u0430 \u0445\u044D\u0442 \u0443\u0440\u0442");
536
- out.set(x, at + size - x.length);
537
- };
538
- put(expect(r, TAG.INTEGER, "r").value, 0);
539
- put(expect(s, TAG.INTEGER, "s").value, size);
540
- return out;
541
- }
542
- async function verifySignature(pub, alg, data, sig) {
543
- const sch = schemeFor(alg);
544
- return verifyWith(pub, sch, data, sig);
545
- }
546
- async function verifyWith(pub, sch, data, sig) {
547
- const s = await subtle();
548
- try {
549
- if (sch.kind === "ecdsa") {
550
- if (pub.keyAlg !== OID.ecPublicKey) return false;
551
- const c = CURVES[pub.curve ?? ""];
552
- if (!c) return false;
553
- const key2 = await s.importKey("spki", pub.spki, { name: "ECDSA", namedCurve: c.name }, false, ["verify"]);
554
- return await s.verify({ name: "ECDSA", hash: sch.hash }, key2, ecdsaDerToRaw(sig, c.size), data);
555
- }
556
- if (pub.keyAlg !== OID.rsaEncryption) return false;
557
- if (sch.kind === "pss") {
558
- const key2 = await s.importKey("spki", pub.spki, { name: "RSA-PSS", hash: sch.hash }, false, ["verify"]);
559
- return await s.verify({ name: "RSA-PSS", saltLength: sch.saltLength ?? 32 }, key2, sig, data);
560
- }
561
- const key = await s.importKey("spki", pub.spki, { name: "RSASSA-PKCS1-v1_5", hash: sch.hash }, false, ["verify"]);
562
- return await s.verify({ name: "RSASSA-PKCS1-v1_5" }, key, sig, data);
563
- } catch {
564
- return false;
565
- }
566
- }
567
- async function verifyCitizen(cert, signedAttrs, sig) {
568
- if (cert.keyAlg === OID.rsaEncryption) {
569
- return await verifyWith(cert, { kind: "rsa", hash: "SHA-256" }, signedAttrs, sig) ? sig : void 0;
570
- }
571
- if (cert.keyAlg === OID.ecPublicKey) {
572
- const c = CURVES[cert.curve ?? ""];
573
- if (!c) return void 0;
574
- if (sig.length === 2 * c.size) {
575
- const der2 = rawToEcdsaDer(sig, c.size);
576
- if (await verifyWith(cert, { kind: "ecdsa", hash: "SHA-256" }, signedAttrs, der2)) return der2;
577
- }
578
- try {
579
- return await verifyWith(cert, { kind: "ecdsa", hash: "SHA-256" }, signedAttrs, sig) ? sig : void 0;
580
- } catch {
581
- return void 0;
582
- }
583
- }
584
- return void 0;
585
- }
586
- function rawToEcdsaDer(raw, size) {
587
- const int = (v) => {
588
- let x = Array.from(v);
589
- while (x.length > 1 && x[0] === 0) x = x.slice(1);
590
- if (x.length === 1 && x[0] === 0) return [2, 1, 0];
591
- if (x[0] & 128) x = [0, ...x];
592
- return [2, x.length, ...x];
593
- };
594
- const body = [...int(raw.subarray(0, size)), ...int(raw.subarray(size))];
595
- return Uint8Array.from(body.length < 128 ? [48, body.length, ...body] : [48, 129, body.length, ...body]);
596
- }
597
- function checkSignature(parent, alg, signed, sig) {
598
- return verifySignature(parent, alg, signed, sig);
599
- }
600
- async function checkSignatureFrom(c, parent) {
601
- if (parent.version === 3 && !parent.basicConstraintsValid || parent.basicConstraintsValid && !parent.isCA) return false;
602
- if (parent.keyUsage !== 0 && !(parent.keyUsage & 1 << 5)) return false;
603
- return verifySignature(parent, c.sigAlg, c.tbs, c.signature);
604
- }
605
- async function verifyChain(leaf, pool, roots, at, eku) {
606
- const valid = (c) => c.notBefore.getTime() <= at.getTime() && at.getTime() <= c.notAfter.getTime();
607
- if (!valid(leaf)) return false;
608
- if (leaf.extKeyUsage.length > 0 && !leaf.extKeyUsage.includes(eku) && !leaf.extKeyUsage.includes(OID.kpAny)) return false;
609
- if (hasUnhandledCritical(leaf)) return false;
610
- const walk = async (cur, depth) => {
611
- if (depth > 8) return false;
612
- for (const r of roots) {
613
- if (equal(r.rawSubject, cur.rawIssuer) && await checkSignatureFrom(cur, r)) return true;
614
- }
615
- for (const p of pool) {
616
- if (equal(p.raw, cur.raw) || !equal(p.rawSubject, cur.rawIssuer) || !valid(p) || hasUnhandledCritical(p)) continue;
617
- if (p.extKeyUsage.length > 0 && !p.extKeyUsage.includes(eku) && !p.extKeyUsage.includes(OID.kpAny)) continue;
618
- if (await checkSignatureFrom(cur, p) && await walk(p, depth + 1)) return true;
619
- }
620
- return false;
621
- };
622
- return walk(leaf, 0);
623
- }
624
- var HANDLED = /* @__PURE__ */ new Set([
625
- OID.keyUsage,
626
- OID.extKeyUsage,
627
- OID.basicConstraints,
628
- "2.5.29.17",
629
- // SAN
630
- "2.5.29.30",
631
- // name constraints
632
- "2.5.29.32",
633
- // policies
634
- OID.crlDP,
635
- OID.aia,
636
- "2.5.29.14",
637
- "2.5.29.35"
638
- ]);
639
- function hasUnhandledCritical(c) {
640
- return c.extensions.some((e) => e.critical && !HANDLED.has(e.oid));
641
- }
642
-
643
- // src/pades/cms.ts
644
- var O = {
645
- data: "1.2.840.113549.1.7.1",
646
- signedData: "1.2.840.113549.1.7.2",
647
- contentType: "1.2.840.113549.1.9.3",
648
- messageDigest: "1.2.840.113549.1.9.4",
649
- signingTime: "1.2.840.113549.1.9.5",
650
- signingCertV2: "1.2.840.113549.1.9.16.2.47",
651
- timeStampToken: "1.2.840.113549.1.9.16.2.14",
652
- signerAttrV2: "0.4.0.19122.1.1",
653
- role: "2.5.4.72"
654
- };
655
- var CLAIMED_ROLE_MAX_RUNES = 900;
656
- async function signedAttributes(messageDigest, signer, claimedRole) {
657
- if (messageDigest.length !== 32) throw new Error("pades: messageDigest SHA-256 \u0431\u0438\u0448");
658
- if (claimedRole !== "" && ([...claimedRole].length > CLAIMED_ROLE_MAX_RUNES || /[\ud800-\udfff]/.test(claimedRole.replace(/[\ud800-\udbff][\udc00-\udfff]/g, "")))) {
659
- throw new Error("pades: claimed role \u0431\u0443\u0440\u0443\u0443 \u044D\u0441\u0432\u044D\u043B \u0445\u044D\u0442 \u0443\u0440\u0442");
660
- }
661
- const certHash = await sha256(signer.raw);
662
- const attr = (o, ...vals) => seq(oid(o), set(...vals));
663
- const attrs = [
664
- attr(O.contentType, oid(O.data)),
665
- attr(O.messageDigest, octet(messageDigest)),
666
- attr(
667
- O.signingCertV2,
668
- seq(seq(seq(octet(certHash), seq(seq(ctx(4, true, signer.rawIssuer)), tlv(TAG.INTEGER, signer.serial)))))
669
- )
670
- ];
671
- if (claimedRole !== "") {
672
- attrs.push(attr(O.signerAttrV2, seq(ctx(0, true, seq(seq(oid(O.role), set(tlv(TAG.UTF8String, enc.encode(claimedRole)))))))));
673
- }
674
- attrs.sort(compare);
675
- return set(...attrs);
676
- }
677
- function assembleCMS(signedAttrs, signer, chain, signature, tst) {
678
- if (signedAttrs.length < 2 || signedAttrs[0] !== 49) throw new Error("pades: signedAttrs \u043D\u044C DER SET \u0431\u0438\u0448");
679
- let sigAlg;
680
- if (signer.keyAlg === OID.rsaEncryption) sigAlg = seq(oid(OID.sha256WithRSA), nullDer());
681
- else if (signer.keyAlg === OID.ecPublicKey) sigAlg = seq(oid(OID.ecdsaSHA256));
682
- else throw new Error("pades: \u0433\u0430\u0440\u044B\u043D \u04AF\u0441\u0433\u0438\u0439\u043D \u0442\u04AF\u043B\u0445\u04AF\u04AF\u0440\u0438\u0439\u043D \u0442\u04E9\u0440\u04E9\u043B \u0434\u044D\u043C\u0436\u0438\u0433\u0434\u044D\u0445\u0433\u04AF\u0439");
683
- const implicitAttrs = signedAttrs.slice();
684
- implicitAttrs[0] = 160;
685
- const certs = [signer.raw];
686
- for (const c of chain) if (!equal(c.raw, signer.raw)) certs.push(c.raw);
687
- certs.sort(compare);
688
- const sha256Alg = seq(oid(OID.sha256));
689
- const unsigned = tst.length > 0 ? [ctx(1, true, seq(oid(O.timeStampToken), set(tst)))] : [];
690
- const signerInfo = seq(
691
- intFromBig(1n),
692
- seq(signer.rawIssuer, tlv(TAG.INTEGER, signer.serial)),
693
- sha256Alg,
694
- implicitAttrs,
695
- sigAlg,
696
- octet(signature),
697
- ...unsigned
698
- );
699
- const sd = seq(intFromBig(1n), set(sha256Alg), seq(oid(O.data)), ctx(0, true, ...certs), set(signerInfo));
700
- return seq(oid(O.signedData), ctx(0, true, sd));
701
- }
702
- function parseSignedData(contentInfo) {
703
- const ci = children(expect(parseOne(contentInfo), TAG.SEQUENCE, "ContentInfo"));
704
- if (oidString(expect(ci[0], TAG.OID, "contentType").value) !== O.signedData) throw new Error("pkcs7: SignedData \u0431\u0438\u0448");
705
- const sd = children(expect(children(expect(ci[1], 160, "[0]"))[0], TAG.SEQUENCE, "SignedData"));
706
- let i = 1;
707
- const digestAlgs = children(expect(sd[i++], TAG.SET, "digestAlgorithms"));
708
- const eci = children(expect(sd[i++], TAG.SEQUENCE, "EncapsulatedContentInfo"));
709
- let content = new Uint8Array();
710
- if (eci[1]) {
711
- const inner = children(expect(eci[1], 160, "eContent"))[0];
712
- if (inner?.tag === TAG.OCTET_STRING) content = inner.value;
713
- else if (inner?.tag === 36) content = concat(children(inner).map((x) => x.value));
714
- }
715
- const certificates = [];
716
- if (sd[i]?.tag === 160) {
717
- for (const c of children(sd[i])) if (c.tag === TAG.SEQUENCE) certificates.push(parseCertificate(c.raw));
718
- i++;
719
- }
720
- if (sd[i]?.tag === 161) i++;
721
- const signerInfos = children(expect(sd[i], TAG.SET, "signerInfos"));
722
- return { content, certificates, signerInfos, digestAlgs };
723
- }
724
- var HASHES = {
725
- [OID.sha1]: "SHA-1",
726
- [OID.sha256]: "SHA-256",
727
- [OID.sha384]: "SHA-384",
728
- [OID.sha512]: "SHA-512"
729
- };
730
- function signerCert(sd, si) {
731
- const f = children(si);
732
- const sid = f[1];
733
- if (sid.tag === TAG.SEQUENCE) {
734
- const [iss, ser] = children(sid);
735
- return sd.certificates.find((c) => equal(c.rawIssuer, iss.raw) && equal(c.serial, ser.value));
736
- }
737
- return void 0;
738
- }
739
- async function verifySignedData(sd) {
740
- if (sd.signerInfos.length === 0) return false;
741
- for (const si of sd.signerInfos) {
742
- const cert = signerCert(sd, si);
743
- if (!cert) return false;
744
- const f = children(si);
745
- let i = 2;
746
- const digAlg = oidString(children(f[i++])[0].value);
747
- const hash = HASHES[digAlg];
748
- if (!hash) return false;
749
- let attrs;
750
- if (f[i]?.tag === 160) attrs = f[i++];
751
- const sigAlg = f[i++];
752
- const sig = expect(f[i++], TAG.OCTET_STRING, "signature").value;
753
- let signed = sd.content;
754
- if (attrs) {
755
- let md;
756
- let signingTime;
757
- for (const a of children(attrs)) {
758
- const [t, v] = children(a);
759
- if (!t || !v) continue;
760
- const o = oidString(t.value);
761
- if (o === O.messageDigest) md = children(v)[0]?.value;
762
- if (o === O.signingTime) {
763
- const n = children(v)[0];
764
- if (n) signingTime = parseTime(n);
765
- }
766
- }
767
- if (!md || !equal(md, await digest(hash, sd.content))) return false;
768
- if (signingTime && (signingTime > cert.notAfter || signingTime < cert.notBefore)) return false;
769
- signed = concat([Uint8Array.of(49), attrs.raw.subarray(1)]);
770
- }
771
- let alg = sigAlg;
772
- const so = oidString(children(sigAlg)[0].value);
773
- if (so === OID.rsaEncryption) {
774
- const m = { "SHA-1": "1.2.840.113549.1.1.5", "SHA-256": OID.sha256WithRSA, "SHA-384": OID.sha384WithRSA, "SHA-512": OID.sha512WithRSA };
775
- alg = parseOne(seq(oid(m[hash]), nullDer()));
776
- } else if (so === OID.ecPublicKey) {
777
- const m = { "SHA-256": OID.ecdsaSHA256, "SHA-384": OID.ecdsaSHA384, "SHA-512": OID.ecdsaSHA512 };
778
- if (!m[hash]) return false;
779
- alg = parseOne(seq(oid(m[hash])));
780
- }
781
- if (!await verifySignature(cert, alg, signed, sig)) return false;
782
- }
783
- return true;
784
- }
785
-
786
57
  // src/pades/fetch.ts
787
58
  var DEFAULT_TSA_URL = "https://tsa.timeserver.mn/";
788
59
  var HTTP_TIMEOUT_MS = 1e4;
@@ -842,257 +113,6 @@ function isBrowser() {
842
113
  return typeof g.window !== "undefined" || typeof g.process?.versions?.node !== "string";
843
114
  }
844
115
 
845
- // src/pades/ltv.ts
846
- var MAX_TSA_SKEW_MS = 10 * 6e4;
847
- var tsMs = (t) => t.date.getTime();
848
- function after(a, b) {
849
- const am = Math.floor(a.date.getTime() / 1e3);
850
- const bm = Math.floor(b.date.getTime() / 1e3);
851
- if (am !== bm) return am > bm;
852
- return a.nanos > b.nanos;
853
- }
854
- function tsaRequest(hash, nonce) {
855
- return seq(intFromBig(1n), seq(seq(oid(OID.sha256), nullDer()), octet(hash)), intFromBig(bigFromBytes(nonce)), Uint8Array.of(1, 1, 255));
856
- }
857
- async function timestampToken(f, tsaURL, signature, roots, inter, now, nonce) {
858
- const sum = await sha256(signature);
859
- const body = await f.do("POST", tsaURL, "application/timestamp-query", tsaRequest(sum, nonce));
860
- const top = children(expect(parseOne(body), TAG.SEQUENCE, "TimeStampResp"));
861
- const status = intValue(expect(children(expect(top[0], TAG.SEQUENCE, "PKIStatusInfo"))[0], TAG.INTEGER, "status").value);
862
- if (status > 0n) throw new Error(`TSA status ${status}`);
863
- const tok = top[1];
864
- if (!tok || tok.value.length === 0) throw new Error("no pkcs7 data in Time-Stamp response");
865
- const rawToken = tok.raw;
866
- const sd = parseSignedData(rawToken);
867
- if (sd.certificates.length > 0 && !await verifySignedData(sd)) throw new Error("TSA token-\u0438\u0439\u043D \u0433\u0430\u0440\u044B\u043D \u04AF\u0441\u044D\u0433 \u0431\u0443\u0440\u0443\u0443");
868
- const info = children(expect(parseOne(sd.content), TAG.SEQUENCE, "TSTInfo"));
869
- const mi = children(expect(info[2], TAG.SEQUENCE, "messageImprint"));
870
- const hashAlg = oidString(children(mi[0])[0].value);
871
- const hashed = expect(mi[1], TAG.OCTET_STRING, "hashedMessage").value;
872
- if (hashed.length === 0) throw new Error("Time-Stamp response contains no hashed message");
873
- const genTime = parsePreciseTime(expect(info[4], TAG.GeneralizedTime, "genTime"));
874
- let tsNonce;
875
- for (const n of info.slice(5)) if (n.tag === TAG.INTEGER) tsNonce = n.value;
876
- if (!tsNonce || intValue(tsNonce) !== bigFromBytes(nonce)) throw new Error("nonce \u0442\u0430\u0430\u0440\u0430\u0445\u0433\u04AF\u0439");
877
- if (!equal(hashed, sum) || hashAlg !== OID.sha256) throw new Error("timestamp hash does not match");
878
- if (sd.signerInfos.length !== 1) throw new Error("TSA signer \u0433\u0430\u043D\u0446 \u0431\u0438\u0448");
879
- const sid = children(sd.signerInfos[0])[1];
880
- const [iss, ser] = children(sid);
881
- const signer = sd.certificates.find((c) => equal(c.rawIssuer, iss.raw) && equal(c.serial, ser.value));
882
- if (!signer) throw new Error("signer cert \u043E\u043B\u0434\u0441\u043E\u043D\u0433\u04AF\u0439");
883
- if (!isTSASigningCert(signer)) throw new Error("signer cert-\u0438\u0439\u043D EKU \u043D\u044C critical {timeStamping} \u0431\u0438\u0448 (RFC 3161 \xA72.3)");
884
- const pool = [...sd.certificates, ...inter].filter((c) => !equal(c.raw, signer.raw));
885
- if (!await verifyChain(signer, pool, roots, genTime.date, OID.kpTimeStamping)) throw new Error("TSA cert \u0433\u0438\u043D\u0436");
886
- const d = now.getTime() - tsMs(genTime);
887
- if (d > MAX_TSA_SKEW_MS || d < -MAX_TSA_SKEW_MS) throw new Error("TSA genTime \u043B\u043E\u043A\u0430\u043B \u0446\u0430\u0433\u0430\u0430\u0441 10 \u043C\u0438\u043D\u0443\u0442\u0430\u0430\u0441 \u0438\u0445 \u0437\u04E9\u0440\u04E9\u0432");
888
- if (sd.certificates.length === 0) throw new Error("TSA token-\u0434 \u0433\u044D\u0440\u0447\u0438\u043B\u0433\u044D\u044D \u0430\u043B\u0433\u0430");
889
- return { rawToken, time: genTime, certificates: sd.certificates };
890
- }
891
- async function ocspRequest(c, issuer) {
892
- const keyHash = await sha1(issuer.publicKey);
893
- const nameHash = await sha1(issuer.rawSubject);
894
- const certID = seq(seq(oid(OID.sha1), nullDer()), octet(nameHash), octet(keyHash), Uint8Array.of(TAG.INTEGER, ...lenOf(c.serial.length), ...c.serial));
895
- return seq(seq(seq(seq(certID))));
896
- }
897
- function lenOf(n) {
898
- if (n < 128) return [n];
899
- const out = [];
900
- for (let x = n; x > 0; x = Math.floor(x / 256)) out.unshift(x & 255);
901
- return [128 | out.length, ...out];
902
- }
903
- var OID_OCSP_BASIC = "1.3.6.1.5.5.7.48.1.1";
904
- async function parseOCSPForCert(der2, c, issuer) {
905
- const top = children(expect(parseOne(der2), TAG.SEQUENCE, "OCSPResponse"));
906
- if (expect(top[0], TAG.ENUMERATED, "status").value[0] !== 0) throw new Error("OCSP response status");
907
- const rb = children(expect(children(expect(top[1], 160, "responseBytes"))[0], TAG.SEQUENCE, "ResponseBytes"));
908
- if (oidString(expect(rb[0], TAG.OID, "responseType").value) !== OID_OCSP_BASIC) throw new Error("bad OCSP response type");
909
- const basic = children(expect(parseOne(expect(rb[1], TAG.OCTET_STRING, "response").value), TAG.SEQUENCE, "BasicOCSPResponse"));
910
- const tbs = expect(basic[0], TAG.SEQUENCE, "tbsResponseData");
911
- const sigAlg = expect(basic[1], TAG.SEQUENCE, "sigAlg");
912
- const sigBits = expect(basic[2], TAG.BIT_STRING, "signature").value.subarray(1);
913
- const tf = children(tbs);
914
- let i = 0;
915
- if (tf[0]?.tag === 160) i++;
916
- const rid = tf[i++];
917
- if (rid.tag !== 161 && rid.tag !== 162) throw new Error("invalid responder id tag");
918
- i++;
919
- const responses = children(expect(tf[i], TAG.SEQUENCE, "responses"));
920
- if (responses.length === 0) throw new Error("OCSP response contains bad number of responses");
921
- const serial = intValue(c.serial);
922
- let single;
923
- for (const r of responses) {
924
- const f = children(r);
925
- const cid2 = children(f[0]);
926
- if (intValue(expect(cid2[3], TAG.INTEGER, "serial").value) === serial) {
927
- single = f;
928
- break;
929
- }
930
- }
931
- if (!single) throw new Error("no response matching the supplied certificate");
932
- let certificate;
933
- if (basic[3]?.tag === 160) {
934
- const certs = children(expect(children(basic[3])[0], TAG.SEQUENCE, "certs"));
935
- if (certs[0]) certificate = parseCertificate(certs[0].raw);
936
- }
937
- if (certificate) {
938
- if (!await verifySignature(certificate, sigAlg, tbs.raw, sigBits)) throw new Error("bad signature on embedded certificate");
939
- if (!await checkSignature(issuer, certificate.sigAlg, certificate.tbs, certificate.signature)) throw new Error("bad OCSP signature");
940
- } else if (!await verifySignature(issuer, sigAlg, tbs.raw, sigBits)) {
941
- throw new Error("bad OCSP signature");
942
- }
943
- const cid = children(single[0]);
944
- const hashAlg = oidString(children(cid[0])[0].value);
945
- if (![OID.sha1, OID.sha256, OID.sha384, OID.sha512].includes(hashAlg)) throw new Error("unsupported issuer hash algorithm");
946
- const st = single[1];
947
- const status = st.tag === 128 ? "good" : st.tag === 161 ? "revoked" : st.tag === 130 ? "unknown" : void 0;
948
- if (!status) throw new Error("OCSP certStatus");
949
- const thisUpdate = parsePreciseTime(expect(single[2], TAG.GeneralizedTime, "thisUpdate"));
950
- let nextUpdate;
951
- for (const x of single.slice(3)) {
952
- if (x.tag === 160) nextUpdate = parsePreciseTime(children(x)[0]).date;
953
- if (x.tag === 161) {
954
- for (const ext of children(children(x)[0])) {
955
- const e = children(ext);
956
- if (e[1]?.tag === TAG.BOOLEAN && e[1].value[0] !== 0) throw new Error("unsupported critical extension");
957
- }
958
- }
959
- }
960
- return { status, thisUpdate, nextUpdate, certificate };
961
- }
962
- function responderOK(resp, issuer) {
963
- if (!resp.certificate || equal(resp.certificate.raw, issuer.raw)) return true;
964
- return resp.certificate.extKeyUsage.includes(OID.kpOCSPSigning);
965
- }
966
- var NotFresh = class extends Error {
967
- };
968
- async function fetchOCSP(f, url, c, issuer, now, fresh) {
969
- const der2 = await f.do("POST", url, "application/ocsp-request", await ocspRequest(c, issuer));
970
- const resp = await parseOCSPForCert(der2, c, issuer);
971
- if (!responderOK(resp, issuer)) throw new Error("OCSP responder-\u0438\u0439\u043D EKU OCSPSigning \u0431\u0438\u0448");
972
- if (resp.status !== "good" || resp.nextUpdate && resp.nextUpdate.getTime() < now.getTime()) throw new Error(`OCSP ${c.subjectCN}: ${resp.status}`);
973
- if (fresh && !after(resp.thisUpdate, fresh)) throw new NotFresh("OCSP thisUpdate \u043D\u044C timestamp-\u0430\u0430\u0441 \u0445\u043E\u0436\u0443\u0443 \u0431\u0438\u0448");
974
- return [der2, resp];
975
- }
976
- async function crlCovers(der2, c, issuer, now) {
977
- try {
978
- const top = children(expect(parseOne(der2), TAG.SEQUENCE, "CertificateList"));
979
- const tbs = expect(top[0], TAG.SEQUENCE, "TBSCertList");
980
- const sigAlg = expect(top[1], TAG.SEQUENCE, "sigAlg");
981
- const sig = expect(top[2], TAG.BIT_STRING, "sig").value.subarray(1);
982
- const f = children(tbs);
983
- let i = 0;
984
- if (f[0]?.tag === TAG.INTEGER) i++;
985
- i++;
986
- const iss = expect(f[i++], TAG.SEQUENCE, "issuer");
987
- if (!equal(iss.raw, c.rawIssuer)) return false;
988
- if (issuer.version === 3 && !issuer.basicConstraintsValid) return false;
989
- if (issuer.keyUsage !== 0 && !(issuer.keyUsage & 1 << 6)) return false;
990
- if (!await verifySignature(issuer, sigAlg, tbs.raw, sig)) return false;
991
- i++;
992
- const nu = f[i];
993
- if (!nu || nu.tag !== TAG.UTCTime && nu.tag !== TAG.GeneralizedTime) return false;
994
- if (parsePreciseTime(nu).date.getTime() < now.getTime()) return false;
995
- i++;
996
- const serial = intValue(c.serial);
997
- const revoked = f[i];
998
- if (revoked?.tag === TAG.SEQUENCE) {
999
- for (const e of children(revoked)) {
1000
- if (intValue(expect(children(e)[0], TAG.INTEGER, "serial").value) === serial) return false;
1001
- }
1002
- }
1003
- return true;
1004
- } catch {
1005
- return false;
1006
- }
1007
- }
1008
- async function collectLTV(f, now, fresh, roots, chains) {
1009
- const d = { certs: [], ocsps: [], crls: [] };
1010
- const addTo = (list, der2) => {
1011
- if (!list.some((b) => equal(b, der2))) list.push(der2);
1012
- };
1013
- const pool = chains.flat();
1014
- const issuerOf = async (c) => {
1015
- for (const cand of [...pool, ...roots]) if (equal(cand.rawSubject, c.rawIssuer) && await checkSignatureFrom(c, cand)) return cand;
1016
- return void 0;
1017
- };
1018
- const isRoot = (c) => roots.some((r) => equal(r.raw, c.raw));
1019
- const seen = /* @__PURE__ */ new Set();
1020
- for (const ch of chains) {
1021
- for (let i = 0; i < ch.length; i++) {
1022
- const c = ch[i];
1023
- const k = toHex(c.raw);
1024
- if (seen.has(k) || isRoot(c)) continue;
1025
- seen.add(k);
1026
- addTo(d.certs, c.raw);
1027
- const issuer = await issuerOf(c);
1028
- if (!issuer) throw new LTVError(`${c.subjectCN}-\u0438\u0439\u043D \u043E\u043B\u0433\u043E\u0433\u0447 \u043E\u043B\u0434\u0441\u043E\u043D\u0433\u04AF\u0439`);
1029
- let ok = false;
1030
- let freshErr;
1031
- const fr = i === 0 ? fresh : void 0;
1032
- for (const u of c.ocspServers) {
1033
- try {
1034
- const [der2, resp] = await fetchOCSP(f, u, c, issuer, now, fr);
1035
- addTo(d.ocsps, der2);
1036
- if (resp.certificate && !equal(resp.certificate.raw, issuer.raw)) addTo(d.certs, resp.certificate.raw);
1037
- ok = true;
1038
- break;
1039
- } catch (e) {
1040
- if (e instanceof NotFresh) freshErr = e;
1041
- }
1042
- }
1043
- for (const u of c.crlDPs) {
1044
- let der2;
1045
- try {
1046
- der2 = await f.do("GET", u, "");
1047
- } catch {
1048
- continue;
1049
- }
1050
- if (await crlCovers(der2, c, issuer, now)) {
1051
- addTo(d.crls, der2);
1052
- ok = true;
1053
- }
1054
- }
1055
- if (!ok) {
1056
- if (freshErr) throw freshErr;
1057
- throw new LTVError(`${c.subjectCN}-\u0434 \u0445\u04AF\u0447\u0438\u043D\u0442\u044D\u0439 OCSP/CRL \u0430\u043B\u0433\u0430`);
1058
- }
1059
- if (i === 0 && freshErr && c.ocspServers.length > 0 && !await hasFreshOCSP(d.ocsps, c, issuer, fresh)) throw freshErr;
1060
- }
1061
- }
1062
- return d;
1063
- }
1064
- async function hasFreshOCSP(list, c, issuer, fresh) {
1065
- for (const der2 of list) {
1066
- try {
1067
- if (after((await parseOCSPForCert(der2, c, issuer)).thisUpdate, fresh)) return true;
1068
- } catch {
1069
- }
1070
- }
1071
- return false;
1072
- }
1073
- var LTVError = class extends Error {
1074
- };
1075
- var OCSP_AFTER_TS_MS = 2e3;
1076
- var OCSP_WAIT_MAX_MS = 5e3;
1077
- var OCSP_RETRY_MS = 1e3;
1078
- async function collectLTVWithWait(f, now, sleep, genTime, roots, chains) {
1079
- let waited = 0;
1080
- const genSec = Math.floor(genTime.date.getTime() / 1e3) * 1e3;
1081
- let d = Math.min(genSec + OCSP_AFTER_TS_MS - now().getTime(), OCSP_WAIT_MAX_MS);
1082
- for (; ; ) {
1083
- if (d > 0) {
1084
- await sleep(d);
1085
- waited += d;
1086
- }
1087
- try {
1088
- return await collectLTV(f, now(), genTime, roots, chains);
1089
- } catch (e) {
1090
- if (!(e instanceof NotFresh) || waited + OCSP_RETRY_MS > OCSP_WAIT_MAX_MS) throw e;
1091
- }
1092
- d = OCSP_RETRY_MS;
1093
- }
1094
- }
1095
-
1096
116
  // src/pades/assets/fonts.ts
1097
117
  var REGULAR = {
1098
118
  psName: "NotoSans",
@@ -2041,8 +1061,8 @@ function findLastLine(buf, s) {
2041
1061
  const i = str.lastIndexOf(s, max - s.length);
2042
1062
  if (i <= 0 || i + s.length >= buf.length) return -1;
2043
1063
  const before = buf[i - 1];
2044
- const after2 = buf[i + s.length];
2045
- if ((before === 10 || before === 13) && (after2 === 10 || after2 === 13)) return i;
1064
+ const after = buf[i + s.length];
1065
+ if ((before === 10 || before === 13) && (after === 10 || after === 13)) return i;
2046
1066
  max = i;
2047
1067
  }
2048
1068
  }
@@ -2299,7 +1319,7 @@ function place(ver, vi, final) {
2299
1319
  const n = 17 + 4 * ver;
2300
1320
  const m = Array.from({ length: n }, () => new Array(n).fill(false));
2301
1321
  const fn = Array.from({ length: n }, () => new Array(n).fill(false));
2302
- const set2 = (r, c, dark) => {
1322
+ const set = (r, c, dark) => {
2303
1323
  m[r][c] = dark;
2304
1324
  fn[r][c] = true;
2305
1325
  };
@@ -2310,7 +1330,7 @@ function place(ver, vi, final) {
2310
1330
  const cc = c0 + c;
2311
1331
  if (rr < 0 || cc < 0 || rr >= n || cc >= n) continue;
2312
1332
  const dark = r >= 0 && r <= 6 && c >= 0 && c <= 6 && (r === 0 || r === 6 || c === 0 || c === 6 || r >= 2 && r <= 4 && c >= 2 && c <= 4);
2313
- set2(rr, cc, dark);
1333
+ set(rr, cc, dark);
2314
1334
  }
2315
1335
  }
2316
1336
  };
@@ -2318,25 +1338,25 @@ function place(ver, vi, final) {
2318
1338
  finder(0, n - 7);
2319
1339
  finder(n - 7, 0);
2320
1340
  for (let i = 8; i < n - 8; i++) {
2321
- set2(6, i, i % 2 === 0);
2322
- set2(i, 6, i % 2 === 0);
1341
+ set(6, i, i % 2 === 0);
1342
+ set(i, 6, i % 2 === 0);
2323
1343
  }
2324
1344
  for (const r of vi.align) {
2325
1345
  for (const c of vi.align) {
2326
1346
  if (r < 9 && c < 9 || r < 9 && c > n - 9 || r > n - 9 && c < 9) continue;
2327
- for (let dr = -2; dr <= 2; dr++) for (let dc = -2; dc <= 2; dc++) set2(r + dr, c + dc, Math.max(Math.abs(dr), Math.abs(dc)) !== 1);
1347
+ for (let dr = -2; dr <= 2; dr++) for (let dc = -2; dc <= 2; dc++) set(r + dr, c + dc, Math.max(Math.abs(dr), Math.abs(dc)) !== 1);
2328
1348
  }
2329
1349
  }
2330
1350
  const f = formatBits(0 << 3 | MASK);
2331
1351
  const fb = (i) => (f >> i & 1) === 1;
2332
- for (let i = 0; i <= 5; i++) set2(i, 8, fb(i));
2333
- set2(7, 8, fb(6));
2334
- set2(8, 8, fb(7));
2335
- set2(8, 7, fb(8));
2336
- for (let i = 9; i < 15; i++) set2(8, 14 - i, fb(i));
2337
- for (let i = 0; i < 8; i++) set2(8, n - 1 - i, fb(i));
2338
- for (let i = 8; i < 15; i++) set2(n - 15 + i, 8, fb(i));
2339
- set2(n - 8, 8, true);
1352
+ for (let i = 0; i <= 5; i++) set(i, 8, fb(i));
1353
+ set(7, 8, fb(6));
1354
+ set(8, 8, fb(7));
1355
+ set(8, 7, fb(8));
1356
+ for (let i = 9; i < 15; i++) set(8, 14 - i, fb(i));
1357
+ for (let i = 0; i < 8; i++) set(8, n - 1 - i, fb(i));
1358
+ for (let i = 8; i < 15; i++) set(n - 15 + i, 8, fb(i));
1359
+ set(n - 8, 8, true);
2340
1360
  let bit = 0;
2341
1361
  let up = true;
2342
1362
  for (let col = n - 1; col > 0; col -= 2) {
@@ -3138,12 +2158,20 @@ function signatureCMSList(doc) {
3138
2158
  if (v.kind() !== "dict" || v.key("Contents").isNull() || v.key("ByteRange").isNull()) continue;
3139
2159
  const t = v.key("Type").name();
3140
2160
  if (t !== "" && t !== "Sig") continue;
2161
+ let cms;
3141
2162
  try {
3142
2163
  const n = readNode(v.key("Contents").rawString(), 0);
3143
- out.push(n.tag === TAG.SEQUENCE ? n.raw : void 0);
2164
+ cms = n.tag === TAG.SEQUENCE ? n.raw : void 0;
3144
2165
  } catch {
3145
- out.push(void 0);
2166
+ cms = void 0;
3146
2167
  }
2168
+ let end;
2169
+ const br = v.key("ByteRange");
2170
+ if (br.len() === 4 && br.index(2).kind() === "int" && br.index(3).kind() === "int") {
2171
+ const e = br.index(2).int64() + br.index(3).int64();
2172
+ if (e > 0 && e <= doc.length) end = e;
2173
+ }
2174
+ out.push({ cms, end });
3147
2175
  }
3148
2176
  return out;
3149
2177
  }
@@ -3454,9 +2482,13 @@ async function complete(state, signature, opts = {}) {
3454
2482
  }
3455
2483
  if (out.length > MAX_OUTPUT_BYTES) throw new PadesError("PDF_TOO_LARGE", "\u0433\u0430\u0440\u0430\u043B\u0442 10 MiB-\u0430\u0430\u0441 \u0438\u0445");
3456
2484
  const prior = [];
2485
+ const priorRev = [];
3457
2486
  try {
3458
2487
  const list = signatureCMSList(signed);
3459
- for (const c of list.slice(0, -1)) prior.push(c ? toHex(await sha256(c)) : "");
2488
+ for (const s of list.slice(0, -1)) {
2489
+ prior.push(s.cms ? toHex(await sha256(s.cms)) : "");
2490
+ priorRev.push(s.end !== void 0 ? toHex(await sha256(signed.subarray(0, s.end))) : "");
2491
+ }
3460
2492
  } catch (e) {
3461
2493
  throw new PadesError("SELF_VALIDATION_FAILED", "\u0433\u0430\u0440\u0430\u043B\u0442\u044B\u0433 \u0437\u0430\u0434\u0430\u043B\u0436 \u0447\u0430\u0434\u0441\u0430\u043D\u0433\u04AF\u0439", { cause: e });
3462
2494
  }
@@ -3471,6 +2503,7 @@ async function complete(state, signature, opts = {}) {
3471
2503
  revIndex: st.revIndex,
3472
2504
  sigRevSha256: toHex(await sha256(signed)),
3473
2505
  priorCmsSha256: prior,
2506
+ priorRevisionSha256: priorRev,
3474
2507
  signerCert: cert.raw
3475
2508
  };
3476
2509
  }