@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/index.d.cts CHANGED
@@ -25,6 +25,11 @@ declare class Http {
25
25
  private readonly cfg;
26
26
  constructor(cfg: HttpConfig);
27
27
  post(path: string, body: unknown, timeoutMs?: number): Promise<unknown>;
28
+ /** {@link post} + HTTP статус (201 / 200-г ялгах: `POST /pdf/signatures`). */
29
+ postWithStatus(path: string, body: unknown, timeoutMs?: number): Promise<{
30
+ status: number;
31
+ body: unknown;
32
+ }>;
28
33
  get(path: string, timeoutMs?: number): Promise<unknown>;
29
34
  private json;
30
35
  private send;
@@ -187,11 +192,26 @@ interface RegisterSignatureInput {
187
192
  priorCmsSha256?: string[];
188
193
  /** Горим A-ийн (CA угсарсан) өмнөх гарын үсгүүдийн revision SHA-256. `priorCmsSha256`-тай нийлээд = `revIndex − 1`. */
189
194
  priorRevisionSha256?: string[];
195
+ /**
196
+ * SDK-д л (CA руу илгээхгүй): өмнөх гарын үсэг бүрийн хоёр түлхүүр, баримтын дарааллаар — {@link registrationFromCompleted}
197
+ * бөглөнө. CA өмнөх мөр бүрийг өөрийнх нь түлхүүрээр таньдаг (клиент талын мөр — CMS, горим A — revision), файлаас аль
198
+ * нь болохыг ялгах боломжгүй. Тиймээс `registerSignature` эхлээд бүгдийг CMS-ээр илгээж, 409 `PRIOR_MISMATCH` бол
199
+ * эхний k-г revision-оор (горим A нь клиент талынхаас өмнө), өмнөх нь ≤ 4 бол бүх хослолыг оролдоно.
200
+ * `priorRevisionSha256`-г гараар өгсөн бол оролдохгүй.
201
+ */
202
+ priorSignatures?: PriorSignature[];
190
203
  /** Байгууллагын нэрийн өмнөөс (`NTRMN-…`) — session-ийнхтэй ижил. */
191
204
  onBehalfOf?: string;
192
205
  /** Заавал биш (`PNOMN-…`): ирвэл CMS-ийн зурагчийн SERIALNUMBER-тэй тэнцүү (эс бөгөөс 409 `SIGNER_MISMATCH`). */
193
206
  signerEtsi?: string;
194
207
  }
208
+ /** Өмнөх нэг гарын үсгийн хоёр түлхүүр ({@link RegisterSignatureInput.priorSignatures}). */
209
+ interface PriorSignature {
210
+ /** CMS DER-ийн SHA-256 (hex) — клиент талын мөр. */
211
+ cmsSha256: string;
212
+ /** `sha256(doc[0 : ByteRange[2]+ByteRange[3]])` (hex) — горим A-ийн мөр (CA `sig_rev_sha256`). */
213
+ revisionSha256: string;
214
+ }
195
215
  /** {@link registrationFromCompleted}-д хэрэгтэй `pades.complete()`-ийн хэсэг (JSON-оор дамжсан бол `cms` нь base64). */
196
216
  interface CompletedForRegistration {
197
217
  docId: string;
@@ -203,6 +223,8 @@ interface CompletedForRegistration {
203
223
  sigRevSha256: string;
204
224
  outSha256: string;
205
225
  priorCmsSha256: string[];
226
+ /** `complete().priorRevisionSha256` (0.15.2+) — байвал `priorSignatures` бөглөгдөж горим A-ийн өмнөх мөрийг SDK өөрөө тааруулна. */
227
+ priorRevisionSha256?: string[];
206
228
  }
207
229
  /**
208
230
  * `pades.complete()`-ийн үр дүнгээс `registerSignature`-ийн биеийг бөглөнө (`hasPage`-ийг илгээхгүй — CA `revIndex`-ээс
@@ -217,6 +239,8 @@ interface RegisterSignatureResult {
217
239
  registeredAt: string;
218
240
  /** Нийтийн шалгах хуудас (`https://ca.eidmongolia.mn/verify/<docID>`). */
219
241
  verifyUrl: string;
242
+ /** true — 201 (шинээр бүртгэв); false — 200 (ижил биеийн идэмпотент давталт, анхны хариу). */
243
+ created: boolean;
220
244
  raw: unknown;
221
245
  }
222
246
  /**
@@ -860,6 +884,11 @@ declare class ResponseValidator {
860
884
  * "skipped" (hook алга). "revoked", мөн hard-fail горимд "unknown" → ValidationError; hook-ийн алдаа дамжина.
861
885
  */
862
886
  checkRevocationStatus(cert: X509Certificate): Promise<RevocationOutcome>;
887
+ /**
888
+ * {@link checkRevocationStatus}-тэй ижил, гэхдээ TrustConfig-ийн биш өгсөн checker ба горимоор (issuer-ийг trust
889
+ * pool-оос олно). checker алга бол "skipped"; горим анхдагч "hard-fail".
890
+ */
891
+ checkRevocationWith(cert: X509Certificate, checker: RevocationChecker | undefined, mode?: "hard-fail" | "soft-fail"): Promise<RevocationOutcome>;
863
892
  }
864
893
  /** Payload (auth) дээрх гарын үсэг — алгоритмаар салаалж node:crypto verify. */
865
894
  /** Smart-ID: userChallenge = BASE64URL(SHA-256(UTF-8(userChallengeVerifier))), padding-гүй. */
@@ -926,6 +955,27 @@ declare class EidClient {
926
955
  */
927
956
  declare const PDF_SIGNATURE_REGISTER_FIELDS: readonly ["docID", "revIndex", "medium", "sessionID", "cms", "fileName", "inSha256", "pageSha256", "sigRevSha256", "outSha256", "priorCmsSha256", "priorRevisionSha256", "onBehalfOf", "signerEtsi"];
928
957
 
958
+ interface OcspCheckerOptions {
959
+ /** fetch (тест/proxy). Анхдагч globalThis.fetch. Redirect дагахгүй ("manual"). */
960
+ fetchImpl?: typeof fetch;
961
+ /** Нэг асуултын хугацаа (мс). Анхдагч 2000 — иргэн poll дээр хүлээж байна. */
962
+ timeoutMs?: number;
963
+ /** Цаг (мс, тест). Анхдагч Date.now. */
964
+ now?: () => number;
965
+ }
966
+ /**
967
+ * AIA OCSP-оор цуцлалт шалгагч ({@link RevocationChecker}):
968
+ *
969
+ * - good → "good" (5 мин кэшлэнэ);
970
+ * - revoked, мөн unknown (олгогч энэ serial-ийг олгоогүй — өөр хэн нэгний хийсэн гэрчилгээ) → "revoked";
971
+ * - хариугүй (AIA алга, issuer олдоогүй, timeout, HTTP ≠ 200, гарын үсэг/serial/хугацаа таараагүй) → "unknown" —
972
+ * `revocationMode` шийднэ: soft-fail — зөвшөөрнө ("unchecked"), hard-fail — татгалзана.
973
+ *
974
+ * Хариуг олгогч эсвэл олгогчийн id-kp-OCSPSigning EKU-тэй (одоо хүчинтэй) responder зурсан, энэ serial-ийн тухай,
975
+ * thisUpdate ∈ [now−48ц, now+5мин], nextUpdate өнгөрөөгүй байх ёстой.
976
+ */
977
+ declare function ocspRevocationChecker(opts?: OcspCheckerOptions): RevocationChecker;
978
+
929
979
  /** SHA-256 digest, base64. Текст эсвэл байтаас. Sign flow-ийн baримтын digest үүсгэхэд. */
930
980
  declare function sha256Base64(data: string | Uint8Array): string;
931
981
  /** Санамсаргүй RP challenge (default 64 байт), base64. Auth flow-д replay-ээс хамгаална. */
@@ -1051,6 +1101,11 @@ interface EidLoginIdentity {
1051
1101
  flowType: FlowType;
1052
1102
  /** Session-ийн `person` блок (кирилл нэр г.м.) — гэрчилгээтэй таарсан үед л, эс бөгөөс null. */
1053
1103
  person: PersonBlock | null;
1104
+ /**
1105
+ * Гэрчилгээний цуцлалтын шалгалтын дүн: "good" | "unchecked" (OCSP хариугүй, soft-fail-ээр зөвшөөрөв) | "skipped"
1106
+ * (`revocation: false`). Аудитад хадгал.
1107
+ */
1108
+ revocation: RevocationOutcome;
1054
1109
  }
1055
1110
  /** Серверт хадгалах нэвтрэлтийн төлөв (JSON-д хувирна). */
1056
1111
  interface EidLoginTx {
@@ -1069,6 +1124,8 @@ interface EidLoginTx {
1069
1124
  receivedAt: number;
1070
1125
  lang: string;
1071
1126
  };
1127
+ /** eID татгалзсан push-ийн оронд өгсөн хуурмаг session (eID-д байхгүй; хэзээ ч дуусахгүй). Зөвхөн серверт. */
1128
+ decoy?: boolean;
1072
1129
  }
1073
1130
  /** Төлөвийн сан. Анхдагч — процессын санах ой ({@link memoryLoginStore}); олон instance бол Redis г.м. */
1074
1131
  interface EidLoginStore {
@@ -1092,6 +1149,39 @@ interface EidLoginSuccess {
1092
1149
  data?: unknown;
1093
1150
  headers?: Record<string, string | string[]>;
1094
1151
  }
1152
+ /**
1153
+ * Аудитын үйл явдал (`onEvent`):
1154
+ * - `push_sent` — push start амжилттай хариулсан (meta: mode, pushKey, decoy). `decoy: true` бол eID дугаарыг татгалзаж
1155
+ * утас руу юу ч очоогүй — хөтөч рүү хэзээ ч илэрхийлэгдэхгүй, зөвхөн таны аудитад.
1156
+ * - `push_limited` — push хязгаарт хүрсэн, 429 (meta: mode, pushKey; sessionId null).
1157
+ * - `refused` — иргэн утсан дээрээ татгалзсан (endResult USER_REFUSED*).
1158
+ * - `expired` — eID session хугацаа дууссан (endResult TIMEOUT эсвэл eID-д олдохгүй).
1159
+ * - `unverified` — баталгаажуулалт унасан (meta.reason: "validation" | "revoked" | "revocation_unavailable").
1160
+ * - `flow_refused` — Web2App callback эхлүүлсэн хөтчийн session-тэй холбогдоогүй (meta.reason: "unbound").
1161
+ * - `success` — иргэн баталгаажиж onSuccess дуудагдсан (meta: mode, flow, revocation).
1162
+ * - `failed` — бусад endResult (WRONG_VC, DOCUMENT_UNUSABLE г.м.; meta.endResult).
1163
+ */
1164
+ type EidLoginEventKind = "push_sent" | "push_limited" | "refused" | "expired" | "unverified" | "flow_refused" | "success" | "failed";
1165
+ /** `onEvent`-ийн аргумент. meta-д токен/нууц, регистрийн дугаар (PII) орохгүй. */
1166
+ interface EidLoginEvent {
1167
+ kind: EidLoginEventKind;
1168
+ sessionId: string | null;
1169
+ meta: Record<string, unknown>;
1170
+ }
1171
+ /** Хязгаарлагч: true — зөвшөөрөх, false — 429. */
1172
+ type EidLoginRateLimitFn = (key: string) => boolean | Promise<boolean>;
1173
+ /** Нэг төрлийн хязгаар: санах ойн гулсах цонх, өөрийн функц, эсвэл `false` (хязгааргүй). */
1174
+ type EidLoginRateRule = {
1175
+ limit: number;
1176
+ windowMs: number;
1177
+ } | EidLoginRateLimitFn | false;
1178
+ /** Төрөл тус бүрийн хязгаар: `start` — `start:<ip>`, `push` — `push:<idCode>`. */
1179
+ interface EidLoginRateLimits {
1180
+ start?: EidLoginRateRule;
1181
+ push?: EidLoginRateRule;
1182
+ }
1183
+ /** Анхдагч хязгаар — `rateLimit`-ийн объектод өгөөгүй төрөл энүүгээр үлдэнэ. `{ ...defaultRateLimit, start: … }`. */
1184
+ declare const defaultRateLimit: Readonly<EidLoginRateLimits>;
1095
1185
  interface EidLoginOptions {
1096
1186
  client: EidClient;
1097
1187
  /**
@@ -1123,10 +1213,15 @@ interface EidLoginOptions {
1123
1213
  domain?: string;
1124
1214
  };
1125
1215
  /**
1126
- * Хязгаарлалт: `start:<ip>` (ip мэдэгдэж байвал) ба `push:<idCode>` түлхүүрээр дуудагдана; false → 429.
1127
- * Анхдагч: push-д нэг дугаарт 60 секундэд 3 (санах ойд) — хохирогчийн утсыг мэдэгдлээр дарахаас (MFA fatigue).
1216
+ * Хязгаарлалт. Түлхүүр: `start:<ip>` (ip мэдэгдэж байвал), `push:<idCode>`; false → 429.
1217
+ * Анхдагч {@link defaultRateLimit}: push-д нэг дугаарт 60 секундэд 3 (санах ойд) — MFA fatigue-ээс.
1218
+ *
1219
+ * - Объект `{ start?, push? }` — анхдагчтай НЭГТГЭГДЭНЭ: өгсөн төрөл анхдагчийг дарна, өгөөгүй нь анхдагчаараа.
1220
+ * Утга: `{ limit, windowMs }` (санах ойн гулсах цонх), функц (Redis г.м.) эсвэл `false` (тухайн төрлийг хязгаарлахгүй).
1221
+ * - Функц `(key) => boolean` — бүх түлхүүрт дуудагдана, анхдагч хязгаар ДЭЭР НЭМЭГДЭНЭ (хоёулаа зөвшөөрөх ёстой).
1222
+ * Анхдагчийг сулруулах/солих бол объект хэлбэрээр тухайн төрлийг өг.
1128
1223
  */
1129
- rateLimit?: (key: string) => boolean | Promise<boolean>;
1224
+ rateLimit?: EidLoginRateLimitFn | EidLoginRateLimits;
1130
1225
  /**
1131
1226
  * `handle(Request)`-ийн клиент IP (`start:<ip>` хязгаарт). Web-standard `Request`-д IP байдаггүй тул эсвэл энийг, эсвэл
1132
1227
  * {@link EidLoginOptions.trustProxy}-г өг; аль нь ч үгүй бол IP-ээр хязгаарлахгүй (анхны дуудлагад onError-оор анхааруулна).
@@ -1142,6 +1237,40 @@ interface EidLoginOptions {
1142
1237
  trustProxy?: boolean | number;
1143
1238
  /** Дотоод алдаа (eID API, store). Анхдагч console.error (мессеж л). */
1144
1239
  onError?: (err: unknown, ctx: EidLoginContext) => void;
1240
+ /**
1241
+ * eID push-ийг дугаарын шалтгаанаар татгалзвал (eID-ийн өөрийн JSON 4xx — танихгүй / ашиглах боломжгүй дугаар) decoy
1242
+ * session-оор хариулна (анхдагч `true`). ⚠️ `false` бол `/start` нь «энэ регистр eID-д бүртгэлтэй эсэх»-ийг
1243
+ * нэвтрээгүй хэнд ч хэлдэг oracle болно — зөвхөн дотоод/тестийн орчинд.
1244
+ */
1245
+ decoy?: boolean;
1246
+ /**
1247
+ * Push start-ийн хариу (бодит, decoy, 502) хамгийн багадаа энэ хугацаанд (мс) гарна: decoy микросекундэд, бодит push
1248
+ * eID-ийн round trip-ээр бэлэн болдог тул цаг нь л ялгана. Анхдагч 1000; `0` — унтраана (⚠️ decoy-г хугацаагаар
1249
+ * ялгаж болно). Хүсэлт тасарвал (`signal`) хүлээхгүй. 429 ба 400-д хамаарахгүй.
1250
+ */
1251
+ pushFloorMs?: number;
1252
+ /**
1253
+ * Иргэний гэрчилгээний цуцлалт шалгагч (onSuccess-ийн өмнө). Анхдагч {@link ocspRevocationChecker} — гэрчилгээний AIA
1254
+ * OCSP. Цуцлагдсан / олгогч мэдэхгүй → FAILED "VALIDATION". ⚠️ `false` — шалгахгүй: цуцалсан (хулгайлагдсан утасны)
1255
+ * гэрчилгээгээр нэвтэрнэ.
1256
+ */
1257
+ revocation?: RevocationChecker | false;
1258
+ /**
1259
+ * OCSP хариугүй үед (timeout, 5xx, AIA алга): "soft-fail" (анхдагч) — зөвшөөрч onError-оор анхааруулна,
1260
+ * `identity.revocation = "unchecked"` (eID порталын EID_OCSP=soft: CA-ийн responder унавал бүх иргэн түгжигдэхгүй);
1261
+ * "hard-fail" — FAILED "VALIDATION".
1262
+ */
1263
+ revocationMode?: "soft-fail" | "hard-fail";
1264
+ /**
1265
+ * Аудитын hook ({@link EidLoginEventKind}). Хариу өгөхөөс өмнө await хийгдэнэ — удаан ажлыг өөрөө async болго; алдаа нь
1266
+ * onError руу (урсгалыг зогсоохгүй). Push-д регистр биш `pushKey` = HMAC-SHA256(auditKey, дугаар)-ын 32 hex.
1267
+ */
1268
+ onEvent?: (event: EidLoginEvent) => void | Promise<void>;
1269
+ /**
1270
+ * pushKey-ийн HMAC түлхүүр (≥ 32 байт санал болгоно). Алга бол санамсаргүй — pushKey зөвхөн процесс дотор тогтвортой;
1271
+ * instance/restart хооронд харьцуулах бол тогтмол нууц өг.
1272
+ */
1273
+ auditKey?: string | Uint8Array;
1145
1274
  }
1146
1275
  /** Framework-аас хамааралгүй хүсэлт (Express: `req.headers`, `req.body`, `req.ip`). */
1147
1276
  interface EidLoginRequest {
@@ -1152,6 +1281,8 @@ interface EidLoginRequest {
1152
1281
  /** POST-ийн задалсан JSON (Express `express.json()`), эсвэл түүхий мөр. */
1153
1282
  body?: unknown;
1154
1283
  ip?: string;
1284
+ /** Хүсэлт тасрахад (клиент холболтоо хаасан) — `pushFloorMs` ба decoy poll-ын хүлээлтийг таслана. */
1285
+ signal?: AbortSignal;
1155
1286
  }
1156
1287
  interface EidLoginResponse {
1157
1288
  status: number;
@@ -1178,4 +1309,4 @@ declare function withReturnHint(callbackUrl: string, userAgent: string): string;
1178
1309
  */
1179
1310
  declare function createEidLogin(opts: EidLoginOptions): EidLogin;
1180
1311
 
1181
- export { AcspContext, type AcspV2Params, type ActivityCounts, type ActivityItem, type ActivityQuery, AuthApi, type AuthDefaults, type AuthOptions, type BuildDeviceLinkInput, CITIZEN_ISSUING_CA_SKI, type CertChoiceOptions, type CertCounts, type CertSubject, CertificateLevel, type ClientConfig, type CompletedForRegistration, DEFAULT_BASE_URL, DeviceLinkSession, type DeviceLinkSessionType, type DeviceLinkType, EidClient, type EidLogin, type EidLoginContext, type EidLoginIdentity, type EidLoginMode, type EidLoginOptions, type EidLoginRequest, type EidLoginResponse, type EidLoginStore, type EidLoginSuccess, type EidLoginTx, FlowType, HashAlgorithm, Http, type HttpConfig, Interaction, NotificationSession, OrganizationApi, PDF_SIGNATURE_REGISTER_FIELDS, type PdfDigestInput, type PdfDigestSession, type PdfDigestSigner, type PersonActivity, PersonApi, PersonBlock, type PersonCertificate, type PersonCertificates, type PersonChild, type PersonChildren, type PersonDevice, type PersonDevices, type PersonSummary, type QrDeviceLinkTickerOptions, type RegisterSignatureInput, type RegisterSignatureResult, RepresentationsResponse, ResponseValidator, type RevocationChecker, type RevocationOutcome, type RevocationStatus, RpCredentials, SessionApi, SessionResult, SignApi, type SignDefaults, type SignOptions, SignatureAlgorithm, type Signer, type SignerRef, 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, buildRegisterBody, createEidLogin, deviceLinkInput, forwardedClientIp, interactionsToBase64, memoryLoginStore, parseSessionResult, parseSubject, personMatchesCertificate, qrDeviceLinkTicker, randomChallenge, registrationFromCompleted, resolveBaseUrl, sha256Base64, tokenAuthDigest, tokenLimitOf, userChallengeOf, verifyPayloadSignature, verifyPrehashedSignature, verifyTokenCertificates, withReturnHint };
1312
+ export { AcspContext, type AcspV2Params, type ActivityCounts, type ActivityItem, type ActivityQuery, AuthApi, type AuthDefaults, type AuthOptions, type BuildDeviceLinkInput, CITIZEN_ISSUING_CA_SKI, type CertChoiceOptions, type CertCounts, type CertSubject, CertificateLevel, type ClientConfig, type CompletedForRegistration, DEFAULT_BASE_URL, DeviceLinkSession, type DeviceLinkSessionType, type DeviceLinkType, EidClient, type EidLogin, type EidLoginContext, type EidLoginEvent, type EidLoginEventKind, type EidLoginIdentity, type EidLoginMode, type EidLoginOptions, type EidLoginRateLimitFn, type EidLoginRateLimits, type EidLoginRateRule, type EidLoginRequest, type EidLoginResponse, type EidLoginStore, type EidLoginSuccess, type EidLoginTx, FlowType, HashAlgorithm, Http, type HttpConfig, Interaction, NotificationSession, type OcspCheckerOptions, OrganizationApi, PDF_SIGNATURE_REGISTER_FIELDS, type PdfDigestInput, type PdfDigestSession, type PdfDigestSigner, type PersonActivity, PersonApi, PersonBlock, type PersonCertificate, type PersonCertificates, type PersonChild, type PersonChildren, type PersonDevice, type PersonDevices, type PersonSummary, type PriorSignature, type QrDeviceLinkTickerOptions, type RegisterSignatureInput, type RegisterSignatureResult, RepresentationsResponse, ResponseValidator, type RevocationChecker, type RevocationOutcome, type RevocationStatus, RpCredentials, SessionApi, SessionResult, SignApi, type SignDefaults, type SignOptions, SignatureAlgorithm, type Signer, type SignerRef, 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, buildRegisterBody, createEidLogin, defaultRateLimit, deviceLinkInput, forwardedClientIp, interactionsToBase64, memoryLoginStore, ocspRevocationChecker, parseSessionResult, parseSubject, personMatchesCertificate, qrDeviceLinkTicker, randomChallenge, registrationFromCompleted, resolveBaseUrl, sha256Base64, tokenAuthDigest, tokenLimitOf, userChallengeOf, verifyPayloadSignature, verifyPrehashedSignature, verifyTokenCertificates, withReturnHint };
package/dist/index.d.ts CHANGED
@@ -25,6 +25,11 @@ declare class Http {
25
25
  private readonly cfg;
26
26
  constructor(cfg: HttpConfig);
27
27
  post(path: string, body: unknown, timeoutMs?: number): Promise<unknown>;
28
+ /** {@link post} + HTTP статус (201 / 200-г ялгах: `POST /pdf/signatures`). */
29
+ postWithStatus(path: string, body: unknown, timeoutMs?: number): Promise<{
30
+ status: number;
31
+ body: unknown;
32
+ }>;
28
33
  get(path: string, timeoutMs?: number): Promise<unknown>;
29
34
  private json;
30
35
  private send;
@@ -187,11 +192,26 @@ interface RegisterSignatureInput {
187
192
  priorCmsSha256?: string[];
188
193
  /** Горим A-ийн (CA угсарсан) өмнөх гарын үсгүүдийн revision SHA-256. `priorCmsSha256`-тай нийлээд = `revIndex − 1`. */
189
194
  priorRevisionSha256?: string[];
195
+ /**
196
+ * SDK-д л (CA руу илгээхгүй): өмнөх гарын үсэг бүрийн хоёр түлхүүр, баримтын дарааллаар — {@link registrationFromCompleted}
197
+ * бөглөнө. CA өмнөх мөр бүрийг өөрийнх нь түлхүүрээр таньдаг (клиент талын мөр — CMS, горим A — revision), файлаас аль
198
+ * нь болохыг ялгах боломжгүй. Тиймээс `registerSignature` эхлээд бүгдийг CMS-ээр илгээж, 409 `PRIOR_MISMATCH` бол
199
+ * эхний k-г revision-оор (горим A нь клиент талынхаас өмнө), өмнөх нь ≤ 4 бол бүх хослолыг оролдоно.
200
+ * `priorRevisionSha256`-г гараар өгсөн бол оролдохгүй.
201
+ */
202
+ priorSignatures?: PriorSignature[];
190
203
  /** Байгууллагын нэрийн өмнөөс (`NTRMN-…`) — session-ийнхтэй ижил. */
191
204
  onBehalfOf?: string;
192
205
  /** Заавал биш (`PNOMN-…`): ирвэл CMS-ийн зурагчийн SERIALNUMBER-тэй тэнцүү (эс бөгөөс 409 `SIGNER_MISMATCH`). */
193
206
  signerEtsi?: string;
194
207
  }
208
+ /** Өмнөх нэг гарын үсгийн хоёр түлхүүр ({@link RegisterSignatureInput.priorSignatures}). */
209
+ interface PriorSignature {
210
+ /** CMS DER-ийн SHA-256 (hex) — клиент талын мөр. */
211
+ cmsSha256: string;
212
+ /** `sha256(doc[0 : ByteRange[2]+ByteRange[3]])` (hex) — горим A-ийн мөр (CA `sig_rev_sha256`). */
213
+ revisionSha256: string;
214
+ }
195
215
  /** {@link registrationFromCompleted}-д хэрэгтэй `pades.complete()`-ийн хэсэг (JSON-оор дамжсан бол `cms` нь base64). */
196
216
  interface CompletedForRegistration {
197
217
  docId: string;
@@ -203,6 +223,8 @@ interface CompletedForRegistration {
203
223
  sigRevSha256: string;
204
224
  outSha256: string;
205
225
  priorCmsSha256: string[];
226
+ /** `complete().priorRevisionSha256` (0.15.2+) — байвал `priorSignatures` бөглөгдөж горим A-ийн өмнөх мөрийг SDK өөрөө тааруулна. */
227
+ priorRevisionSha256?: string[];
206
228
  }
207
229
  /**
208
230
  * `pades.complete()`-ийн үр дүнгээс `registerSignature`-ийн биеийг бөглөнө (`hasPage`-ийг илгээхгүй — CA `revIndex`-ээс
@@ -217,6 +239,8 @@ interface RegisterSignatureResult {
217
239
  registeredAt: string;
218
240
  /** Нийтийн шалгах хуудас (`https://ca.eidmongolia.mn/verify/<docID>`). */
219
241
  verifyUrl: string;
242
+ /** true — 201 (шинээр бүртгэв); false — 200 (ижил биеийн идэмпотент давталт, анхны хариу). */
243
+ created: boolean;
220
244
  raw: unknown;
221
245
  }
222
246
  /**
@@ -860,6 +884,11 @@ declare class ResponseValidator {
860
884
  * "skipped" (hook алга). "revoked", мөн hard-fail горимд "unknown" → ValidationError; hook-ийн алдаа дамжина.
861
885
  */
862
886
  checkRevocationStatus(cert: X509Certificate): Promise<RevocationOutcome>;
887
+ /**
888
+ * {@link checkRevocationStatus}-тэй ижил, гэхдээ TrustConfig-ийн биш өгсөн checker ба горимоор (issuer-ийг trust
889
+ * pool-оос олно). checker алга бол "skipped"; горим анхдагч "hard-fail".
890
+ */
891
+ checkRevocationWith(cert: X509Certificate, checker: RevocationChecker | undefined, mode?: "hard-fail" | "soft-fail"): Promise<RevocationOutcome>;
863
892
  }
864
893
  /** Payload (auth) дээрх гарын үсэг — алгоритмаар салаалж node:crypto verify. */
865
894
  /** Smart-ID: userChallenge = BASE64URL(SHA-256(UTF-8(userChallengeVerifier))), padding-гүй. */
@@ -926,6 +955,27 @@ declare class EidClient {
926
955
  */
927
956
  declare const PDF_SIGNATURE_REGISTER_FIELDS: readonly ["docID", "revIndex", "medium", "sessionID", "cms", "fileName", "inSha256", "pageSha256", "sigRevSha256", "outSha256", "priorCmsSha256", "priorRevisionSha256", "onBehalfOf", "signerEtsi"];
928
957
 
958
+ interface OcspCheckerOptions {
959
+ /** fetch (тест/proxy). Анхдагч globalThis.fetch. Redirect дагахгүй ("manual"). */
960
+ fetchImpl?: typeof fetch;
961
+ /** Нэг асуултын хугацаа (мс). Анхдагч 2000 — иргэн poll дээр хүлээж байна. */
962
+ timeoutMs?: number;
963
+ /** Цаг (мс, тест). Анхдагч Date.now. */
964
+ now?: () => number;
965
+ }
966
+ /**
967
+ * AIA OCSP-оор цуцлалт шалгагч ({@link RevocationChecker}):
968
+ *
969
+ * - good → "good" (5 мин кэшлэнэ);
970
+ * - revoked, мөн unknown (олгогч энэ serial-ийг олгоогүй — өөр хэн нэгний хийсэн гэрчилгээ) → "revoked";
971
+ * - хариугүй (AIA алга, issuer олдоогүй, timeout, HTTP ≠ 200, гарын үсэг/serial/хугацаа таараагүй) → "unknown" —
972
+ * `revocationMode` шийднэ: soft-fail — зөвшөөрнө ("unchecked"), hard-fail — татгалзана.
973
+ *
974
+ * Хариуг олгогч эсвэл олгогчийн id-kp-OCSPSigning EKU-тэй (одоо хүчинтэй) responder зурсан, энэ serial-ийн тухай,
975
+ * thisUpdate ∈ [now−48ц, now+5мин], nextUpdate өнгөрөөгүй байх ёстой.
976
+ */
977
+ declare function ocspRevocationChecker(opts?: OcspCheckerOptions): RevocationChecker;
978
+
929
979
  /** SHA-256 digest, base64. Текст эсвэл байтаас. Sign flow-ийн baримтын digest үүсгэхэд. */
930
980
  declare function sha256Base64(data: string | Uint8Array): string;
931
981
  /** Санамсаргүй RP challenge (default 64 байт), base64. Auth flow-д replay-ээс хамгаална. */
@@ -1051,6 +1101,11 @@ interface EidLoginIdentity {
1051
1101
  flowType: FlowType;
1052
1102
  /** Session-ийн `person` блок (кирилл нэр г.м.) — гэрчилгээтэй таарсан үед л, эс бөгөөс null. */
1053
1103
  person: PersonBlock | null;
1104
+ /**
1105
+ * Гэрчилгээний цуцлалтын шалгалтын дүн: "good" | "unchecked" (OCSP хариугүй, soft-fail-ээр зөвшөөрөв) | "skipped"
1106
+ * (`revocation: false`). Аудитад хадгал.
1107
+ */
1108
+ revocation: RevocationOutcome;
1054
1109
  }
1055
1110
  /** Серверт хадгалах нэвтрэлтийн төлөв (JSON-д хувирна). */
1056
1111
  interface EidLoginTx {
@@ -1069,6 +1124,8 @@ interface EidLoginTx {
1069
1124
  receivedAt: number;
1070
1125
  lang: string;
1071
1126
  };
1127
+ /** eID татгалзсан push-ийн оронд өгсөн хуурмаг session (eID-д байхгүй; хэзээ ч дуусахгүй). Зөвхөн серверт. */
1128
+ decoy?: boolean;
1072
1129
  }
1073
1130
  /** Төлөвийн сан. Анхдагч — процессын санах ой ({@link memoryLoginStore}); олон instance бол Redis г.м. */
1074
1131
  interface EidLoginStore {
@@ -1092,6 +1149,39 @@ interface EidLoginSuccess {
1092
1149
  data?: unknown;
1093
1150
  headers?: Record<string, string | string[]>;
1094
1151
  }
1152
+ /**
1153
+ * Аудитын үйл явдал (`onEvent`):
1154
+ * - `push_sent` — push start амжилттай хариулсан (meta: mode, pushKey, decoy). `decoy: true` бол eID дугаарыг татгалзаж
1155
+ * утас руу юу ч очоогүй — хөтөч рүү хэзээ ч илэрхийлэгдэхгүй, зөвхөн таны аудитад.
1156
+ * - `push_limited` — push хязгаарт хүрсэн, 429 (meta: mode, pushKey; sessionId null).
1157
+ * - `refused` — иргэн утсан дээрээ татгалзсан (endResult USER_REFUSED*).
1158
+ * - `expired` — eID session хугацаа дууссан (endResult TIMEOUT эсвэл eID-д олдохгүй).
1159
+ * - `unverified` — баталгаажуулалт унасан (meta.reason: "validation" | "revoked" | "revocation_unavailable").
1160
+ * - `flow_refused` — Web2App callback эхлүүлсэн хөтчийн session-тэй холбогдоогүй (meta.reason: "unbound").
1161
+ * - `success` — иргэн баталгаажиж onSuccess дуудагдсан (meta: mode, flow, revocation).
1162
+ * - `failed` — бусад endResult (WRONG_VC, DOCUMENT_UNUSABLE г.м.; meta.endResult).
1163
+ */
1164
+ type EidLoginEventKind = "push_sent" | "push_limited" | "refused" | "expired" | "unverified" | "flow_refused" | "success" | "failed";
1165
+ /** `onEvent`-ийн аргумент. meta-д токен/нууц, регистрийн дугаар (PII) орохгүй. */
1166
+ interface EidLoginEvent {
1167
+ kind: EidLoginEventKind;
1168
+ sessionId: string | null;
1169
+ meta: Record<string, unknown>;
1170
+ }
1171
+ /** Хязгаарлагч: true — зөвшөөрөх, false — 429. */
1172
+ type EidLoginRateLimitFn = (key: string) => boolean | Promise<boolean>;
1173
+ /** Нэг төрлийн хязгаар: санах ойн гулсах цонх, өөрийн функц, эсвэл `false` (хязгааргүй). */
1174
+ type EidLoginRateRule = {
1175
+ limit: number;
1176
+ windowMs: number;
1177
+ } | EidLoginRateLimitFn | false;
1178
+ /** Төрөл тус бүрийн хязгаар: `start` — `start:<ip>`, `push` — `push:<idCode>`. */
1179
+ interface EidLoginRateLimits {
1180
+ start?: EidLoginRateRule;
1181
+ push?: EidLoginRateRule;
1182
+ }
1183
+ /** Анхдагч хязгаар — `rateLimit`-ийн объектод өгөөгүй төрөл энүүгээр үлдэнэ. `{ ...defaultRateLimit, start: … }`. */
1184
+ declare const defaultRateLimit: Readonly<EidLoginRateLimits>;
1095
1185
  interface EidLoginOptions {
1096
1186
  client: EidClient;
1097
1187
  /**
@@ -1123,10 +1213,15 @@ interface EidLoginOptions {
1123
1213
  domain?: string;
1124
1214
  };
1125
1215
  /**
1126
- * Хязгаарлалт: `start:<ip>` (ip мэдэгдэж байвал) ба `push:<idCode>` түлхүүрээр дуудагдана; false → 429.
1127
- * Анхдагч: push-д нэг дугаарт 60 секундэд 3 (санах ойд) — хохирогчийн утсыг мэдэгдлээр дарахаас (MFA fatigue).
1216
+ * Хязгаарлалт. Түлхүүр: `start:<ip>` (ip мэдэгдэж байвал), `push:<idCode>`; false → 429.
1217
+ * Анхдагч {@link defaultRateLimit}: push-д нэг дугаарт 60 секундэд 3 (санах ойд) — MFA fatigue-ээс.
1218
+ *
1219
+ * - Объект `{ start?, push? }` — анхдагчтай НЭГТГЭГДЭНЭ: өгсөн төрөл анхдагчийг дарна, өгөөгүй нь анхдагчаараа.
1220
+ * Утга: `{ limit, windowMs }` (санах ойн гулсах цонх), функц (Redis г.м.) эсвэл `false` (тухайн төрлийг хязгаарлахгүй).
1221
+ * - Функц `(key) => boolean` — бүх түлхүүрт дуудагдана, анхдагч хязгаар ДЭЭР НЭМЭГДЭНЭ (хоёулаа зөвшөөрөх ёстой).
1222
+ * Анхдагчийг сулруулах/солих бол объект хэлбэрээр тухайн төрлийг өг.
1128
1223
  */
1129
- rateLimit?: (key: string) => boolean | Promise<boolean>;
1224
+ rateLimit?: EidLoginRateLimitFn | EidLoginRateLimits;
1130
1225
  /**
1131
1226
  * `handle(Request)`-ийн клиент IP (`start:<ip>` хязгаарт). Web-standard `Request`-д IP байдаггүй тул эсвэл энийг, эсвэл
1132
1227
  * {@link EidLoginOptions.trustProxy}-г өг; аль нь ч үгүй бол IP-ээр хязгаарлахгүй (анхны дуудлагад onError-оор анхааруулна).
@@ -1142,6 +1237,40 @@ interface EidLoginOptions {
1142
1237
  trustProxy?: boolean | number;
1143
1238
  /** Дотоод алдаа (eID API, store). Анхдагч console.error (мессеж л). */
1144
1239
  onError?: (err: unknown, ctx: EidLoginContext) => void;
1240
+ /**
1241
+ * eID push-ийг дугаарын шалтгаанаар татгалзвал (eID-ийн өөрийн JSON 4xx — танихгүй / ашиглах боломжгүй дугаар) decoy
1242
+ * session-оор хариулна (анхдагч `true`). ⚠️ `false` бол `/start` нь «энэ регистр eID-д бүртгэлтэй эсэх»-ийг
1243
+ * нэвтрээгүй хэнд ч хэлдэг oracle болно — зөвхөн дотоод/тестийн орчинд.
1244
+ */
1245
+ decoy?: boolean;
1246
+ /**
1247
+ * Push start-ийн хариу (бодит, decoy, 502) хамгийн багадаа энэ хугацаанд (мс) гарна: decoy микросекундэд, бодит push
1248
+ * eID-ийн round trip-ээр бэлэн болдог тул цаг нь л ялгана. Анхдагч 1000; `0` — унтраана (⚠️ decoy-г хугацаагаар
1249
+ * ялгаж болно). Хүсэлт тасарвал (`signal`) хүлээхгүй. 429 ба 400-д хамаарахгүй.
1250
+ */
1251
+ pushFloorMs?: number;
1252
+ /**
1253
+ * Иргэний гэрчилгээний цуцлалт шалгагч (onSuccess-ийн өмнө). Анхдагч {@link ocspRevocationChecker} — гэрчилгээний AIA
1254
+ * OCSP. Цуцлагдсан / олгогч мэдэхгүй → FAILED "VALIDATION". ⚠️ `false` — шалгахгүй: цуцалсан (хулгайлагдсан утасны)
1255
+ * гэрчилгээгээр нэвтэрнэ.
1256
+ */
1257
+ revocation?: RevocationChecker | false;
1258
+ /**
1259
+ * OCSP хариугүй үед (timeout, 5xx, AIA алга): "soft-fail" (анхдагч) — зөвшөөрч onError-оор анхааруулна,
1260
+ * `identity.revocation = "unchecked"` (eID порталын EID_OCSP=soft: CA-ийн responder унавал бүх иргэн түгжигдэхгүй);
1261
+ * "hard-fail" — FAILED "VALIDATION".
1262
+ */
1263
+ revocationMode?: "soft-fail" | "hard-fail";
1264
+ /**
1265
+ * Аудитын hook ({@link EidLoginEventKind}). Хариу өгөхөөс өмнө await хийгдэнэ — удаан ажлыг өөрөө async болго; алдаа нь
1266
+ * onError руу (урсгалыг зогсоохгүй). Push-д регистр биш `pushKey` = HMAC-SHA256(auditKey, дугаар)-ын 32 hex.
1267
+ */
1268
+ onEvent?: (event: EidLoginEvent) => void | Promise<void>;
1269
+ /**
1270
+ * pushKey-ийн HMAC түлхүүр (≥ 32 байт санал болгоно). Алга бол санамсаргүй — pushKey зөвхөн процесс дотор тогтвортой;
1271
+ * instance/restart хооронд харьцуулах бол тогтмол нууц өг.
1272
+ */
1273
+ auditKey?: string | Uint8Array;
1145
1274
  }
1146
1275
  /** Framework-аас хамааралгүй хүсэлт (Express: `req.headers`, `req.body`, `req.ip`). */
1147
1276
  interface EidLoginRequest {
@@ -1152,6 +1281,8 @@ interface EidLoginRequest {
1152
1281
  /** POST-ийн задалсан JSON (Express `express.json()`), эсвэл түүхий мөр. */
1153
1282
  body?: unknown;
1154
1283
  ip?: string;
1284
+ /** Хүсэлт тасрахад (клиент холболтоо хаасан) — `pushFloorMs` ба decoy poll-ын хүлээлтийг таслана. */
1285
+ signal?: AbortSignal;
1155
1286
  }
1156
1287
  interface EidLoginResponse {
1157
1288
  status: number;
@@ -1178,4 +1309,4 @@ declare function withReturnHint(callbackUrl: string, userAgent: string): string;
1178
1309
  */
1179
1310
  declare function createEidLogin(opts: EidLoginOptions): EidLogin;
1180
1311
 
1181
- export { AcspContext, type AcspV2Params, type ActivityCounts, type ActivityItem, type ActivityQuery, AuthApi, type AuthDefaults, type AuthOptions, type BuildDeviceLinkInput, CITIZEN_ISSUING_CA_SKI, type CertChoiceOptions, type CertCounts, type CertSubject, CertificateLevel, type ClientConfig, type CompletedForRegistration, DEFAULT_BASE_URL, DeviceLinkSession, type DeviceLinkSessionType, type DeviceLinkType, EidClient, type EidLogin, type EidLoginContext, type EidLoginIdentity, type EidLoginMode, type EidLoginOptions, type EidLoginRequest, type EidLoginResponse, type EidLoginStore, type EidLoginSuccess, type EidLoginTx, FlowType, HashAlgorithm, Http, type HttpConfig, Interaction, NotificationSession, OrganizationApi, PDF_SIGNATURE_REGISTER_FIELDS, type PdfDigestInput, type PdfDigestSession, type PdfDigestSigner, type PersonActivity, PersonApi, PersonBlock, type PersonCertificate, type PersonCertificates, type PersonChild, type PersonChildren, type PersonDevice, type PersonDevices, type PersonSummary, type QrDeviceLinkTickerOptions, type RegisterSignatureInput, type RegisterSignatureResult, RepresentationsResponse, ResponseValidator, type RevocationChecker, type RevocationOutcome, type RevocationStatus, RpCredentials, SessionApi, SessionResult, SignApi, type SignDefaults, type SignOptions, SignatureAlgorithm, type Signer, type SignerRef, 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, buildRegisterBody, createEidLogin, deviceLinkInput, forwardedClientIp, interactionsToBase64, memoryLoginStore, parseSessionResult, parseSubject, personMatchesCertificate, qrDeviceLinkTicker, randomChallenge, registrationFromCompleted, resolveBaseUrl, sha256Base64, tokenAuthDigest, tokenLimitOf, userChallengeOf, verifyPayloadSignature, verifyPrehashedSignature, verifyTokenCertificates, withReturnHint };
1312
+ export { AcspContext, type AcspV2Params, type ActivityCounts, type ActivityItem, type ActivityQuery, AuthApi, type AuthDefaults, type AuthOptions, type BuildDeviceLinkInput, CITIZEN_ISSUING_CA_SKI, type CertChoiceOptions, type CertCounts, type CertSubject, CertificateLevel, type ClientConfig, type CompletedForRegistration, DEFAULT_BASE_URL, DeviceLinkSession, type DeviceLinkSessionType, type DeviceLinkType, EidClient, type EidLogin, type EidLoginContext, type EidLoginEvent, type EidLoginEventKind, type EidLoginIdentity, type EidLoginMode, type EidLoginOptions, type EidLoginRateLimitFn, type EidLoginRateLimits, type EidLoginRateRule, type EidLoginRequest, type EidLoginResponse, type EidLoginStore, type EidLoginSuccess, type EidLoginTx, FlowType, HashAlgorithm, Http, type HttpConfig, Interaction, NotificationSession, type OcspCheckerOptions, OrganizationApi, PDF_SIGNATURE_REGISTER_FIELDS, type PdfDigestInput, type PdfDigestSession, type PdfDigestSigner, type PersonActivity, PersonApi, PersonBlock, type PersonCertificate, type PersonCertificates, type PersonChild, type PersonChildren, type PersonDevice, type PersonDevices, type PersonSummary, type PriorSignature, type QrDeviceLinkTickerOptions, type RegisterSignatureInput, type RegisterSignatureResult, RepresentationsResponse, ResponseValidator, type RevocationChecker, type RevocationOutcome, type RevocationStatus, RpCredentials, SessionApi, SessionResult, SignApi, type SignDefaults, type SignOptions, SignatureAlgorithm, type Signer, type SignerRef, 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, buildRegisterBody, createEidLogin, defaultRateLimit, deviceLinkInput, forwardedClientIp, interactionsToBase64, memoryLoginStore, ocspRevocationChecker, parseSessionResult, parseSubject, personMatchesCertificate, qrDeviceLinkTicker, randomChallenge, registrationFromCompleted, resolveBaseUrl, sha256Base64, tokenAuthDigest, tokenLimitOf, userChallengeOf, verifyPayloadSignature, verifyPrehashedSignature, verifyTokenCertificates, withReturnHint };