@gerege-systems/eid-mongolia-sdk 0.9.1 → 0.11.0

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/index.d.cts CHANGED
@@ -1,5 +1,5 @@
1
- import { R as RpCredentials, C as CertificateLevel, I as Interaction, S as SignatureAlgorithm, H as HashAlgorithm, N as NotificationSession, D as DeviceLinkSession, a as SessionResult, P as PdfSessionBlock, b as RepresentationsResponse, A as AcspContext, F as FlowType, E as EidError } from './browser-B_XtyuFG.cjs';
2
- export { c as ApiError, d as AuthenticationError, e as DeviceLinkError, f as DeviceLinkInput, g as EndResult, h as ForbiddenError, i as NavigatorLike, j as NetworkError, O as ON_BEHALF_ERROR_CODES, k as OnBehalfErrorCode, l as OpenOrShowQROptions, m as OrgResult, n as PdfDocumentStatus, o as PdfSigner, p as Representation, q as SessionFailedError, r as SessionState, s as SignatureAlgorithmParameters, t as SignatureProtocol, V as ValidationError, u as deviceLink, v as isMobileUserAgent, w as openOrShowQR } from './browser-B_XtyuFG.cjs';
1
+ import { R as RpCredentials, C as CertificateLevel, I as Interaction, S as SignatureAlgorithm, H as HashAlgorithm, N as NotificationSession, D as DeviceLinkSession, a as SessionResult, P as PersonBlock, b as PdfSessionBlock, c as RepresentationsResponse, A as AcspContext, F as FlowType, E as EidError } from './browser-BVR6gtrx.cjs';
2
+ export { d as ApiError, e as AuthenticationError, f as DeviceLinkError, g as DeviceLinkInput, h as EndResult, i as ForbiddenError, j as HttpErrorInit, k as NavigatorLike, l as NetworkError, O as ON_BEHALF_ERROR_CODES, m as OnBehalfErrorCode, n as OpenOrShowQROptions, o as OrgResult, p as PdfDocumentStatus, q as PdfSigner, r as RETRYABLE_ERROR_CODES, s as Representation, t as ResponseTooLargeError, u as RetryableErrorCode, v as SessionFailedError, w as SessionState, x as SignatureAlgorithmParameters, y as SignatureProtocol, T as TokenCertSessionBlock, z as TokenCertStatus, V as ValidationError, B as deviceLink, G as isMobileUserAgent, J as openOrShowQR, K as parseRetryAfter } from './browser-BVR6gtrx.cjs';
3
3
  import { X509Certificate, KeyObject } from 'node:crypto';
4
4
 
5
5
  interface HttpConfig {
@@ -25,8 +25,8 @@ declare class Http {
25
25
  get(path: string, timeoutMs?: number): Promise<unknown>;
26
26
  /** multipart/form-data POST (Content-Type-ийг boundary-тай нь fetch тавина). JSON хариу. */
27
27
  postMultipart(path: string, form: FormData, timeoutMs?: number): Promise<unknown>;
28
- /** GET — хариуг байтаар (ж: гарын үсэгтэй PDF). */
29
- getBytes(path: string, timeoutMs?: number): Promise<Uint8Array>;
28
+ /** GET — хариуг байтаар (ж: гарын үсэгтэй PDF), `maxBytes` хүртэл; хэтэрвэл {@link ResponseTooLargeError}. */
29
+ getBytes(path: string, timeoutMs?: number, maxBytes?: number): Promise<Uint8Array>;
30
30
  private json;
31
31
  private send;
32
32
  }
@@ -100,6 +100,11 @@ interface SignOptions {
100
100
  * өөрөө иргэний PIN2 гэрчилгээгээр — байгууллага нь digest-д ОРОХГҮЙ.
101
101
  */
102
102
  onBehalfOf?: string;
103
+ /**
104
+ * Гарын үсэг зурагдах баримтын нэр — CA-ийн /verify хуудас ба иргэний түүхэнд харагдана. Заавал биш: өгөөгүй бол CA
105
+ * interaction текстээс таамаглана.
106
+ */
107
+ fileName?: string;
103
108
  }
104
109
  declare class SignApi {
105
110
  private readonly http;
@@ -121,6 +126,14 @@ declare class SignApi {
121
126
 
122
127
  /** RP-API-ийн session JSON-ийг SessionResult болгон задална (rpclient.ts-тэй ижил mapping). */
123
128
  declare function parseSessionResult(raw: unknown): SessionResult;
129
+ /**
130
+ * Person блокийн `civilId` нь баталгаажсан гэрчилгээний SERIALNUMBER-тэй (`PNOMN-<civilId>`) таарах эсэх — хоёулаа
131
+ * хоосон биш байх ёстой. Person блок гарын үсэгт ордоггүй тул RP үүнийг validateAuth-ийн дараа шалгаж байж нэр /
132
+ * төрсөн огноонд итгэнэ. `subject` — validateAuth-ийн `parsedSubject` (эсвэл түүний `serialNumber`).
133
+ */
134
+ declare function personMatchesCertificate(person: PersonBlock | null | undefined, subject: {
135
+ serialNumber?: string;
136
+ } | string | null | undefined): boolean;
124
137
  declare class SessionApi {
125
138
  private readonly http;
126
139
  constructor(http: Http);
@@ -138,7 +151,19 @@ declare class SessionApi {
138
151
 
139
152
  interface PdfDefaults {
140
153
  certificateLevel: CertificateLevel;
154
+ /** prepare / document дуудлагын хугацаа (мс); анхдагч {@link DEFAULT_PDF_TIMEOUT_MS}. */
155
+ timeoutMs?: number;
156
+ /** document / tokenDocument-ийн санах ойд унших дээд хэмжээ (байт); анхдагч {@link DEFAULT_PDF_MAX_BYTES}. */
157
+ maxBytes?: number;
141
158
  }
159
+ /** Гарын үсэгтэй PDF татахад санах ойд уншиж болох анхдагч дээд хэмжээ (64 MiB) — `ClientConfig.pdfMaxBytes`. */
160
+ declare const DEFAULT_PDF_MAX_BYTES: number;
161
+ /**
162
+ * PAdES prepare / баримт татах нэг дуудлагын анхдагч хугацаа (мс). CA prepare нь ≤ 10 MiB уншиж, өмнөх гарын үсэг +
163
+ * LTV өгөгдөл шалгаад push эхлүүлдэг; баримт татахад угсралтыг ≤ 30с хүлээдэг (PADES_SIGNING §3.4). 80с нь хоёуланд
164
+ * хүрэлцэнэ, CA-ийн nginx proxy_read_timeout-оос бага.
165
+ */
166
+ declare const DEFAULT_PDF_TIMEOUT_MS = 80000;
142
167
  /** Гарын үсэг зурагч — яг нэг нь. */
143
168
  type PdfSignerRef = {
144
169
  etsi: string;
@@ -188,18 +213,74 @@ interface PdfPrepareSession {
188
213
  /** SDK хариу хүлээн авсан мөч (ms epoch) — QR-ийн `receivedAt` ({@link buildDeviceLink}). */
189
214
  receivedAt: number;
190
215
  }
216
+ /** USB токены PAdES — POST /pdf/token/prepare-ийн оролт. */
217
+ interface PdfTokenPrepareInput {
218
+ /** Эх PDF (≤ 10 223 616 байт). */
219
+ pdf: Uint8Array;
220
+ /** Баримтын нэр (≤ 120 тэмдэгт, заавал). */
221
+ fileName: string;
222
+ /** Иргэний ETSI (`PNOMN-…`) — токены гэрчилгээний SERIALNUMBER-тэй таарна. */
223
+ signerEtsi: string;
224
+ /** Токены SIGN гэрчилгээ (DER): eID Mongolia Issuing CA-аас, ACTIVE токенд холбогдсон. */
225
+ certificate: Uint8Array;
226
+ /** Олон гарын үсэгтэй баримтын docID (заавал биш, UUID). */
227
+ docID?: string;
228
+ /** Байгууллагын токенд ЗААВАЛ тухайн байгууллага (`NTRMN-…`); хувийн токенд хоосон. Зөрвөл 403 TOKEN_ORG_MISMATCH. */
229
+ onBehalfOf?: string;
230
+ }
231
+ /** POST /pdf/token/prepare-ийн хариу. */
232
+ interface PdfTokenPrepareSession {
233
+ signingId: string;
234
+ docId: string;
235
+ /** Токеноор зурах 32 байт (SHA-256 DTBS): CKM_ECDSA (prehashed) → түүхий r||s (64 байт). */
236
+ hashToSign: Uint8Array;
237
+ hashAlgorithm: string;
238
+ signatureAlgorithm: string;
239
+ /** "RAW_RS". */
240
+ signatureFormat: string;
241
+ /** tokenFinalize-ийн эцсийн хугацаа (prepare-ээс 10 мин), ISO-8601. */
242
+ expiresAt: string;
243
+ raw: unknown;
244
+ }
191
245
  declare class PdfApi {
192
246
  private readonly http;
193
247
  private readonly creds;
194
248
  private readonly defaults;
195
249
  constructor(http: Http, creds: RpCredentials, defaults: PdfDefaults);
196
- /** POST /pdf/sign/prepare — multipart (`request` JSON + `pdf`). SIGN эрх шаардана. */
250
+ /**
251
+ * POST /pdf/sign/prepare — multipart (`request` JSON + `pdf`). SIGN эрх шаардана. Түр алдаа: `ApiError` 429
252
+ * PDF_PREPARE_BUSY, 503 LTV_UNAVAILABLE / TSA_UNAVAILABLE — `retryAfterMs`-ийн дараа дахин (`retryable`).
253
+ */
197
254
  prepare(input: PdfPrepareInput): Promise<PdfPrepareSession>;
198
255
  /**
199
256
  * GET /pdf/sign/{sessionID}/document — гарын үсэгтэй PDF (READY-ээс хойш 30 мин). Татсан байтын SHA-256-ийг
200
- * session-ий `pdf.outSha256`-тай тулга. Эрх хасагдсан бол `ForbiddenError` `.code = "REPRESENTATION_REVOKED"`.
257
+ * session-ий `pdf.outSha256`-тай тулга. Эрх хасагдсан бол `ForbiddenError` `.code = "REPRESENTATION_REVOKED"`. Баримт
258
+ * бэлэн болоогүй бол `ApiError` 503 `.code` DOCUMENT_PENDING / TSA_UNAVAILABLE / LTV_UNAVAILABLE — `retryAfterMs`-ийн
259
+ * дараа дахин татна (`retryable`).
201
260
  */
202
261
  document(sessionId: string): Promise<Uint8Array>;
262
+ private get timeout();
263
+ private get maxBytes();
264
+ /**
265
+ * USB токены PAdES (CA docs/PADES_SIGNING.md §16.5, TOKEN_CERT.md) — session / утас оролцохгүй. POST /pdf/token/prepare
266
+ * (multipart: `request` JSON + `pdf`), SIGN эрх. Дараа нь токеноор `hashToSign`-ийг CKM_ECDSA (prehashed, P-256)-аар
267
+ * зурж {@link tokenFinalize}. Түр алдаа: `ApiError` 429 PDF_PREPARE_BUSY / RATE_LIMITED, 503 TSA_UNAVAILABLE /
268
+ * LTV_UNAVAILABLE / STATE_UNAVAILABLE (`retryable`). Гэрчилгээ токенд холбогдоогүй / цуцлагдсан → 409
269
+ * TOKEN_CERT_INVALID. Зам нь CA-д бий ч `/.well-known/eid`-д хараахан алга (гэрээний тест WARN).
270
+ */
271
+ tokenPrepare(input: PdfTokenPrepareInput): Promise<PdfTokenPrepareSession>;
272
+ /**
273
+ * POST /pdf/token/{signingID}/finalize `{signature: base64 түүхий r||s}` — `signature` 64 байт (P-256 r||s, DER БИШ).
274
+ * Амжвал READY баримтын блок (`outSha256` — {@link tokenDocument}-оор татсан файлтай тулга). READY-ээс хойш идэмпотент.
275
+ * Алдаа: 400 SIGNATURE_INVALID (3 удаа → FAILED), 409 DOCUMENT_FAILED, 410 DOCUMENT_EXPIRED, 503 DOCUMENT_PENDING /
276
+ * TSA_UNAVAILABLE / LTV_UNAVAILABLE — ижил гарын үсгийг `retryAfterMs`-ийн дараа дахин илгээнэ.
277
+ */
278
+ tokenFinalize(signingId: string, signature: Uint8Array): Promise<PdfSessionBlock>;
279
+ /**
280
+ * GET /pdf/token/{signingID}/document — гарын үсэгтэй PDF (зөвхөн үүсгэсэн RP, expiresAt хүртэл), `pdfMaxBytes`
281
+ * хүртэл. SHA-256-ийг {@link tokenFinalize}-ийн `outSha256`-тай заавал тулга.
282
+ */
283
+ tokenDocument(signingId: string): Promise<Uint8Array>;
203
284
  /**
204
285
  * {@link document} + тулгалт: татсан байтын SHA-256 нь session poll-ийн `pdf.outSha256`-тай тэнцүү байх ёстой.
205
286
  * `expected` — poll-ийн `result.pdf` блок (`documentStatus` READY + `outSha256` заавал) эсвэл SHA-256 hex.
@@ -216,6 +297,264 @@ declare class OrganizationApi {
216
297
  getRepresentations(personEtsi: string): Promise<RepresentationsResponse>;
217
298
  }
218
299
 
300
+ /** Токенд холбогдсон байгууллага. */
301
+ interface TokenOrganization {
302
+ etsi: string;
303
+ name: string;
304
+ }
305
+ /** Иргэний нэг гэрчилгээ. */
306
+ interface PersonCertificate {
307
+ documentNumber: string;
308
+ /** AUTH | SIGN | SEAL. */
309
+ type: string;
310
+ /** MOBILE | TOKEN | HSM. */
311
+ keyMedium: string;
312
+ serialNumber: string;
313
+ certificateLevel: string;
314
+ /** VALID | REVOKED | EXPIRED | SUSPENDED. */
315
+ status: string;
316
+ /** RFC 3339. */
317
+ notBefore: string;
318
+ notAfter: string;
319
+ issuerDn: string;
320
+ /** base64 DER (нийтийн артефакт). */
321
+ certValue?: string;
322
+ /** TOKEN мөрөнд токенд холбогдсон байгууллага; хувийн токенд алга. */
323
+ organization?: TokenOrganization;
324
+ }
325
+ interface CertCounts {
326
+ valid: number;
327
+ revoked: number;
328
+ expired: number;
329
+ suspended: number;
330
+ total: number;
331
+ }
332
+ /** GET /certificates/etsi/{personEtsi}. */
333
+ interface PersonCertificates {
334
+ personEtsi: string;
335
+ counts: CertCounts;
336
+ certificates: PersonCertificate[];
337
+ raw: unknown;
338
+ }
339
+ interface PersonDevice {
340
+ deviceId?: string;
341
+ documentNumber: string;
342
+ /** APNS | FCM. */
343
+ platform?: string;
344
+ pushTopic?: string;
345
+ enrolledAt: string;
346
+ active: boolean;
347
+ deactivatedAt?: string | null;
348
+ }
349
+ /** GET /devices/etsi/{personEtsi}. */
350
+ interface PersonDevices {
351
+ personEtsi: string;
352
+ devices: PersonDevice[];
353
+ activeCount: number;
354
+ total: number;
355
+ raw: unknown;
356
+ }
357
+ /** Үйл ажиллагааны нэг бичлэг (kind/reason: EID_PERSON_PKI §Activity kind/reason; шинэ код нэмэгдэж болно). */
358
+ interface ActivityItem {
359
+ id?: string;
360
+ sessionId?: string;
361
+ /** AUTH | SIGN | PIN_CHECK | ENROLL | TOKEN_AUTH | … */
362
+ kind: string;
363
+ /** AUTHENTICATION | SIGNATURE (зөвхөн AUTH/SIGN). */
364
+ flow?: string;
365
+ /** OK | DENIED | FAILED. */
366
+ outcome: string;
367
+ reason?: string;
368
+ pinSlot?: string;
369
+ endResult?: string;
370
+ rpName?: string;
371
+ subsystemName?: string;
372
+ docText?: string;
373
+ interactionType?: string;
374
+ documentNumber?: string;
375
+ clientIp?: string;
376
+ timestamp: string;
377
+ onBehalfOfName?: string;
378
+ }
379
+ interface ActivityCounts {
380
+ authentication: number;
381
+ signature: number;
382
+ }
383
+ /** GET /rp/activity/etsi/{personEtsi} (RP-scoped; eID портал — бүрэн түүх). */
384
+ interface PersonActivity {
385
+ personEtsi: string;
386
+ counts: ActivityCounts;
387
+ sessions: ActivityItem[];
388
+ total: number;
389
+ limit: number;
390
+ offset: number;
391
+ raw: unknown;
392
+ }
393
+ /** activity-ийн шүүлт. Өгөөгүй = серверийн анхдагч (limit 20, offset 0, бүх flow). */
394
+ interface ActivityQuery {
395
+ flow?: "AUTHENTICATION" | "SIGNATURE";
396
+ /** 1–200. */
397
+ limit?: number;
398
+ offset?: number;
399
+ }
400
+ /** GET /person/summary/etsi/{personEtsi}. `lastName` = ЭЦГИЙН нэр, `familyName` = УРГИЙН овог. */
401
+ interface PersonSummary {
402
+ personEtsi: string;
403
+ firstName?: string;
404
+ lastName?: string;
405
+ familyName?: string;
406
+ certificates: CertCounts;
407
+ activity: ActivityCounts;
408
+ devicesActive: number;
409
+ devicesTotal: number;
410
+ representationCount: number;
411
+ raw: unknown;
412
+ }
413
+ interface PersonChild {
414
+ etsi: string;
415
+ regNo: string;
416
+ /** «Овог Нэр». */
417
+ name: string;
418
+ /** YYYY-MM-DD. */
419
+ birthDate?: string;
420
+ registered: boolean;
421
+ /** 18 нас хүрэх өдөр; бүртгэлгүй бол алга. */
422
+ certNotAfter?: string;
423
+ }
424
+ /** GET /person/children/etsi/{personEtsi}. */
425
+ interface PersonChildren {
426
+ children: PersonChild[];
427
+ raw: unknown;
428
+ }
429
+ declare class PersonApi {
430
+ private readonly http;
431
+ constructor(http: Http);
432
+ private get;
433
+ /** Иргэний бүх гэрчилгээ + статусын тоолол. */
434
+ certificates(personEtsi: string): Promise<PersonCertificates>;
435
+ /** Иргэний холбоотой төхөөрөмжүүд (идэвхтэй + идэвхгүй). */
436
+ devices(personEtsi: string): Promise<PersonDevices>;
437
+ /** Иргэний үйл ажиллагааны түүх. */
438
+ activity(personEtsi: string, query?: ActivityQuery): Promise<PersonActivity>;
439
+ /** Самбарын нэгдсэн тоо. */
440
+ summary(personEtsi: string): Promise<PersonSummary>;
441
+ /** Асран хамгаалж буй хүүхдүүд (зөвхөн унших). */
442
+ children(personEtsi: string): Promise<PersonChildren>;
443
+ }
444
+
445
+ interface TokenCertInput {
446
+ /** Иргэн (PNOMN-…) — батлах push түүний утсанд очно. */
447
+ signerEtsi: string;
448
+ /** PKCS#10 DER (EC P-256, ecdsa-with-SHA256, өөр өөр түлхүүр, ≤ 4 KiB). */
449
+ csrAuth: Uint8Array;
450
+ csrSign: Uint8Array;
451
+ /** `[A-Za-z0-9-]{1,64}`. */
452
+ tokenSerial: string;
453
+ /** Заавал биш (≤ 64). */
454
+ tokenLabel?: string;
455
+ /** Байгууллагын токен (NTRMN-…); хоосон/алга = хувийн токен. */
456
+ onBehalfOf?: string;
457
+ }
458
+ interface TokenCertStart {
459
+ sessionId: string;
460
+ /** Иргэнд ХАРУУЛАХ баталгаажуулах код (ПИН биш). */
461
+ vc: string | null;
462
+ /** hex(SHA-256(CSR DER)) — SDK илгээсэн CSR-тэй тулгасан (жижиг үсэг). */
463
+ csrAuthSha256: string;
464
+ csrSignSha256: string;
465
+ expiresAt?: string;
466
+ }
467
+ interface TokenCertItem {
468
+ /** base64 DER. */
469
+ certificate: string;
470
+ certificatePem: string;
471
+ serialHex: string;
472
+ notBefore: string;
473
+ notAfter: string;
474
+ }
475
+ /** GET /token/certificate/{sessionID} (зөвхөн үүсгэсэн RP, 24 цаг идэмпотент). */
476
+ interface TokenCertResult {
477
+ status: string;
478
+ auth: TokenCertItem | null;
479
+ sign: TokenCertItem | null;
480
+ /** base64 DER: 04, 03, 02 (root-гүй). */
481
+ chain: string[];
482
+ chainPem: string;
483
+ /** Хувийн токенд null. */
484
+ organization: TokenOrganization | null;
485
+ keyMedium: string;
486
+ certificateLevel: string;
487
+ raw: unknown;
488
+ }
489
+ interface TokenAuthChallenge {
490
+ challengeId: string;
491
+ /** base64 (32 байт). */
492
+ challenge: string;
493
+ /** CA-ийн холбосон RP (жижиг үсэг) — hash-д ЯГ ЭНЭ мөр орно. */
494
+ rpUUID: string;
495
+ expiresAt: string;
496
+ }
497
+ /** CA-ийн баталгаажуулсан иргэн; givenName/surname — KYC бүртгэлээс (кирилл). */
498
+ interface TokenIdentity {
499
+ etsi: string;
500
+ givenName: string;
501
+ surname: string;
502
+ }
503
+ interface TokenAuthResult {
504
+ identity: TokenIdentity;
505
+ serialHex: string;
506
+ notAfter: string;
507
+ /** Токен байгууллагад холбогдсон бол; эс бөгөөс null. */
508
+ organization: TokenOrganization | null;
509
+ raw: unknown;
510
+ }
511
+ /** 409 TOKEN_LIMIT_REACHED-ийн дэлгэрэнгүй. `limit` 0 = тухайн төрлийн олголт хаалттай. */
512
+ interface TokenLimit {
513
+ kind: "PERSONAL" | "ORGANIZATION";
514
+ limit: number;
515
+ /** Зөвхөн ORGANIZATION-д (NTRMN-…). */
516
+ organization?: string;
517
+ }
518
+ declare class TokenApi {
519
+ private readonly http;
520
+ private readonly creds;
521
+ constructor(http: Http, creds: RpCredentials);
522
+ /**
523
+ * POST /token/certificate — токены AUTH + SIGN гэрчилгээ олголт эхлүүлнэ (иргэн утсаараа батална). CA-ийн буцаасан
524
+ * CSR hash-ууд илгээсэнтэй таарахгүй бол ValidationError.
525
+ */
526
+ issueCertificate(input: TokenCertInput): Promise<TokenCertStart>;
527
+ /**
528
+ * GET /token/certificate/{sessionID} — олгосон AUTH + SIGN гэрчилгээ + гинж. Токенд бичихээс өмнө
529
+ * {@link verifyTokenCertificates}-ээр CSR-ийн түлхүүртэй тулга.
530
+ */
531
+ certificateResult(sessionId: string): Promise<TokenCertResult>;
532
+ /** POST /token/auth/challenge — энэ RP-д холбогдсон нэг удаагийн challenge (2 мин). */
533
+ authChallenge(): Promise<TokenAuthChallenge>;
534
+ /**
535
+ * POST /token/auth/verify — токены AUTH гэрчилгээ (DER) + challenge дээрх түүхий r||s. CA гинж, төлөв, цуцлалт, гарын
536
+ * үсгийг шалгана; SDK нэмж endResult === OK ба identity.etsi === гэрчилгээний SERIALNUMBER-ийг тулгана (эс бөгөөс
537
+ * ValidationError). Challenge нэг удаагийн — алдааны дараа шинээр авна.
538
+ */
539
+ authVerify(challengeId: string, certDer: Uint8Array, signature: Uint8Array): Promise<TokenAuthResult>;
540
+ }
541
+ /**
542
+ * Олгосон AUTH/SIGN гэрчилгээ бүр задарч, илгээсэн CSR-ийн public key-тэй (SPKI) ЯГ таарахыг шалгана. Таарахгүй бол
543
+ * ValidationError — гэрчилгээг токенд бүү бич.
544
+ */
545
+ declare function verifyTokenCertificates(result: TokenCertResult, csrAuth: Uint8Array, csrSign: Uint8Array): void;
546
+ /**
547
+ * Токены зурах 32 байт: SHA-256("eID-TOKEN-AUTH" || rpUUID || challenge) (docs/TOKEN_AUTH.md). `rpUUID` — challenge
548
+ * хариуны `rpUUID` (жижиг үсэг, 36), `challengeB64` — 32 байт base64. Токен үүнийг CKM_ECDSA-аар зурж, түүхий r||s
549
+ * (64 байт)-ийг authVerify-д өгнө.
550
+ */
551
+ declare function tokenAuthDigest(rpUUID: string, challengeB64: string): Buffer;
552
+ /**
553
+ * err нь 409 TOKEN_LIMIT_REACHED бол түүний `{kind, limit, organization}`. Гэрээнээс гадуур хэлбэр бол undefined —
554
+ * татгалзал хүчинтэй хэвээр, дэлгэрэнгүйгүй.
555
+ */
556
+ declare function tokenLimitOf(err: unknown): TokenLimit | undefined;
557
+
219
558
  /** Задалсан subject. Cert-д байхгүй талбар — undefined. Давхардсан OID-ийн эхнийх нь. */
220
559
  interface CertSubject {
221
560
  /** 2.5.4.42 GIVENNAME. */
@@ -291,6 +630,16 @@ interface ValidateSignOptions {
291
630
  * хэрэгжүүлнэ. "good" = хүчинтэй, "revoked" = цуцлагдсан, "unknown" = тогтоогдсонгүй.
292
631
  */
293
632
  type RevocationStatus = "good" | "revoked" | "unknown";
633
+ /**
634
+ * {@link ResponseValidator.checkRevocationStatus}-ийн амжилттай дүн: "good" — issuer хүчинтэй гэж хариулсан;
635
+ * "unchecked" — "unknown", soft-fail горимд зөвшөөрөв; "skipped" — revocation hook тохируулаагүй.
636
+ */
637
+ type RevocationOutcome = "good" | "unchecked" | "skipped";
638
+ /**
639
+ * eID Mongolia Issuing CA (04)-ийн Subject Key Identifier — иргэний утасны болон USB токены AUTH/SIGN гэрчилгээг
640
+ * гаргадаг цорын ганц CA. `TrustConfig.allowedIssuerSkis`-д.
641
+ */
642
+ declare const CITIZEN_ISSUING_CA_SKI = "b8a37f2c64ad677912db7d9e34f246358a2fb909";
294
643
  type RevocationChecker = (cert: X509Certificate, issuer: X509Certificate | undefined) => Promise<RevocationStatus>;
295
644
  interface TrustConfig {
296
645
  /**
@@ -320,6 +669,19 @@ interface TrustConfig {
320
669
  * revocation тохируулсан үед); "soft-fail" — "unknown"-г зөвшөөрнө.
321
670
  */
322
671
  revocationMode?: "hard-fail" | "soft-fail";
672
+ /**
673
+ * Иргэний гэрчилгээг шууд гаргасан CA-ийн Subject Key Identifier (hex, ":" зөвшөөрнө) жагсаалт. Хоосон/алга бол trust
674
+ * anchor хүртэл гинжлэгдсэн дурын CA зөвшөөрөгдөнө (хуучин зан). Ижил root-ийн доорх өөр CA (ж: байгууллагын Issuing
675
+ * CA) иргэний гэрчилгээ гаргахаас хамгаалахад: `[CITIZEN_ISSUING_CA_SKI]`.
676
+ */
677
+ allowedIssuerSkis?: string[];
678
+ /**
679
+ * true бол гэрчилгээний зориулалтыг CA-ийн профайлаар шалгана: auth → KeyUsage digitalSignature + ExtKeyUsage
680
+ * clientAuth (P-CITIZEN-AUTH); sign → KeyUsage contentCommitment / nonRepudiation (P-CITIZEN-SIGN). Анхдагч false.
681
+ */
682
+ checkKeyUsage?: boolean;
683
+ /** ACSP_V2 payload-ийн scheme нэр (CA-ийн `capabilities.acsp_scheme_name`); анхдагч "smart-id". */
684
+ schemeName?: string;
323
685
  }
324
686
  /** Баталгаажсан иргэний таних мэдээлэл (auth). */
325
687
  interface VerifiedIdentity {
@@ -350,6 +712,9 @@ declare class ResponseValidator {
350
712
  private readonly allowUntrusted;
351
713
  private readonly revocation?;
352
714
  private readonly revocationMode;
715
+ private readonly allowedIssuers?;
716
+ private readonly checkKeyUsage;
717
+ private readonly schemeName?;
353
718
  constructor(trust?: TrustConfig);
354
719
  /**
355
720
  * Auth session-ийн хариуг бүрэн шалгаж, баталгаажсан иргэнийг буцаана.
@@ -377,9 +742,24 @@ declare class ResponseValidator {
377
742
  private algorithmOf;
378
743
  /** state/endResult, cert байгаа эсэх, chain, validity, certLevel — нийтлэг шалгалт. */
379
744
  private precheck;
745
+ /**
746
+ * checkKeyUsage үед гэрчилгээний зориулалт протоколд тохирох эсэх (CA crypto/ca_profile.go): ACSP_V2 (auth) → KU
747
+ * digitalSignature + EKU clientAuth (эсвэл anyExtendedKeyUsage); RAW_DIGEST_SIGNATURE (sign) → KU contentCommitment.
748
+ */
749
+ private checkPurpose;
750
+ /** allowedIssuerSkis үед leaf-ийн шууд issuer-ийн SKI (issuer-т алга бол leaf-ийн AKI) жагсаалтад байх ёстой. */
751
+ private checkIssuer;
380
752
  private checkValidity;
381
753
  private checkLevel;
382
- /** leaf-ээс эхлэн issuer-ийг intermediates/anchors дотроос олж, anchor хүртэл chain зангидна. */
754
+ /**
755
+ * RFC 5280 замын шалгалт (Go SDK-ийн `x509.Certificate.Verify`-тэй ижил дүрэм): leaf-ээс trust anchor хүртэлх
756
+ * замыг intermediates/anchors-оос (backtracking-тай) угсарна. Issuer бүр: subject = child.issuer, AKI/SKI таарах,
757
+ * гарын үсэг, CA (basicConstraints CA:TRUE), KeyUsage тавьсан бол keyCertSign, **pathLenConstraint** (доорх
758
+ * завсрын CA-ийн тоо), хүчинтэй хугацаа, EKU тавьсан бол `usage` / anyExtendedKeyUsage агуулах. Leaf болон CA
759
+ * бүрийн үл таних **critical extension** → татгалзана. **Name constraints**-ийг SDK үнэлдэггүй — гинжинд байвал
760
+ * fail-closed (CA-ийн бодит гинж 01–04-т алга). Цаг = now, leaf-ийн хүчинтэй хугацаанд хавчсан (`clockSkewMs`-ийн
761
+ * хүрээнд; leaf-ийн хугацааг checkValidity шалгасан). certificatePolicies шалгахгүй (Go-той ижил).
762
+ */
383
763
  private verifyChain;
384
764
  /** leaf-ийн шууд issuer-ийг trust pool-оос буцаана (revocation шалгагчид issuer хэрэгтэй). */
385
765
  private findIssuer;
@@ -390,6 +770,11 @@ declare class ResponseValidator {
390
770
  * дуудна (тэдгээр нь sync; revocation нь сүлжээ I/O тул async).
391
771
  */
392
772
  checkRevocation(cert: X509Certificate): Promise<void>;
773
+ /**
774
+ * {@link checkRevocation} + юу шийдсэнийг буцаана (лог/аудитад): "good" | "unchecked" (unknown, soft-fail) |
775
+ * "skipped" (hook алга). "revoked", мөн hard-fail горимд "unknown" → ValidationError; hook-ийн алдаа дамжина.
776
+ */
777
+ checkRevocationStatus(cert: X509Certificate): Promise<RevocationOutcome>;
393
778
  }
394
779
  /** Payload (auth) дээрх гарын үсэг — алгоритмаар салаалж node:crypto verify. */
395
780
  /** Smart-ID: userChallenge = BASE64URL(SHA-256(UTF-8(userChallengeVerifier))), padding-гүй. */
@@ -410,6 +795,13 @@ interface ClientConfig {
410
795
  defaultCertificateLevel?: CertificateLevel;
411
796
  /** HTTP timeout (мс). */
412
797
  timeoutMs?: number;
798
+ /** PAdES prepare / баримт татах дуудлагын хугацаа (мс). Анхдагч 80000 ({@link DEFAULT_PDF_TIMEOUT_MS}). */
799
+ pdfTimeoutMs?: number;
800
+ /**
801
+ * `pdf.document` / `pdf.tokenDocument`-ийн санах ойд унших дээд хэмжээ (байт). Анхдагч 64 MiB
802
+ * ({@link DEFAULT_PDF_MAX_BYTES}); хэтэрвэл `ResponseTooLargeError`.
803
+ */
804
+ pdfMaxBytes?: number;
413
805
  /** undici Dispatcher (mTLS client cert). */
414
806
  dispatcher?: unknown;
415
807
  /** fetch орлуулагч (тест). */
@@ -426,6 +818,8 @@ declare class EidClient {
426
818
  readonly sign: SignApi;
427
819
  readonly pdf: PdfApi;
428
820
  readonly organization: OrganizationApi;
821
+ readonly person: PersonApi;
822
+ readonly token: TokenApi;
429
823
  readonly session: SessionApi;
430
824
  readonly validator: ResponseValidator;
431
825
  constructor(cfg: ClientConfig);
@@ -663,4 +1057,4 @@ declare class EidOidcClient {
663
1057
  /** PKCE S256: `BASE64URL(SHA-256(ASCII(code_verifier)))` (RFC 7636 §4.2). */
664
1058
  declare function pkceChallenge(codeVerifier: string): Promise<string>;
665
1059
 
666
- export { AcspContext, type AcspV2Params, AuthApi, type AuthDefaults, type AuthOptions, type BuildDeviceLinkInput, type CertSubject, CertificateLevel, type ClientConfig, type CreateAuthorizationOptions, DEFAULT_BASE_URL, DeviceLinkSession, type DeviceLinkSessionType, type DeviceLinkType, EID_ACR_ADVANCED, EID_ACR_QUALIFIED, EID_OIDC_ISSUER, type EidAuthorization, type EidCallbackChecks, type EidCallbackResult, EidClient, EidError, type EidIdTokenClaims, EidOidcClient, type EidOidcClientConfig, type EidOidcDiscovery, EidOidcError, type EidOidcErrorCode, FlowType, HashAlgorithm, Http, type HttpConfig, Interaction, NotificationSession, OrganizationApi, PdfApi, type PdfDefaults, type PdfPrepareInput, type PdfPrepareSession, PdfSessionBlock, type PdfSignerRef, type QrDeviceLinkTickerOptions, RepresentationsResponse, ResponseValidator, type RevocationChecker, type RevocationStatus, RpCredentials, SessionApi, SessionResult, SignApi, type SignDefaults, type SignOptions, SignatureAlgorithm, type TrustConfig, type ValidateAuthOptions, type ValidateSignOptions, type VerifiedIdentity, type VerifiedSignature, acspV2Digest, buildAcspV2Payload, buildDeviceLink, interactionsToBase64, parseSessionResult, parseSubject, pkceChallenge, qrDeviceLinkTicker, randomChallenge, resolveBaseUrl, sha256Base64, userChallengeOf, verifyPayloadSignature, verifyPrehashedSignature };
1060
+ export { AcspContext, type AcspV2Params, type ActivityCounts, type ActivityItem, type ActivityQuery, AuthApi, type AuthDefaults, type AuthOptions, type BuildDeviceLinkInput, CITIZEN_ISSUING_CA_SKI, type CertCounts, type CertSubject, CertificateLevel, type ClientConfig, type CreateAuthorizationOptions, DEFAULT_BASE_URL, DEFAULT_PDF_MAX_BYTES, DEFAULT_PDF_TIMEOUT_MS, DeviceLinkSession, type DeviceLinkSessionType, type DeviceLinkType, EID_ACR_ADVANCED, EID_ACR_QUALIFIED, EID_OIDC_ISSUER, type EidAuthorization, type EidCallbackChecks, type EidCallbackResult, EidClient, EidError, type EidIdTokenClaims, EidOidcClient, type EidOidcClientConfig, type EidOidcDiscovery, EidOidcError, type EidOidcErrorCode, FlowType, HashAlgorithm, Http, type HttpConfig, Interaction, NotificationSession, OrganizationApi, PdfApi, type PdfDefaults, type PdfPrepareInput, type PdfPrepareSession, PdfSessionBlock, type PdfSignerRef, type PdfTokenPrepareInput, type PdfTokenPrepareSession, type PersonActivity, PersonApi, PersonBlock, type PersonCertificate, type PersonCertificates, type PersonChild, type PersonChildren, type PersonDevice, type PersonDevices, type PersonSummary, type QrDeviceLinkTickerOptions, RepresentationsResponse, ResponseValidator, type RevocationChecker, type RevocationOutcome, type RevocationStatus, RpCredentials, SessionApi, SessionResult, SignApi, type SignDefaults, type SignOptions, SignatureAlgorithm, TokenApi, type TokenAuthChallenge, type TokenAuthResult, type TokenCertInput, type TokenCertItem, type TokenCertResult, type TokenCertStart, type TokenIdentity, type TokenLimit, type TokenOrganization, type TrustConfig, type ValidateAuthOptions, type ValidateSignOptions, type VerifiedIdentity, type VerifiedSignature, acspV2Digest, buildAcspV2Payload, buildDeviceLink, interactionsToBase64, parseSessionResult, parseSubject, personMatchesCertificate, pkceChallenge, qrDeviceLinkTicker, randomChallenge, resolveBaseUrl, sha256Base64, tokenAuthDigest, tokenLimitOf, userChallengeOf, verifyPayloadSignature, verifyPrehashedSignature, verifyTokenCertificates };