@gerege-systems/eid-mongolia-sdk 0.1.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/LICENSE +21 -0
- package/README.md +111 -0
- package/dist/index.cjs +740 -0
- package/dist/index.d.cts +447 -0
- package/dist/index.d.ts +447 -0
- package/dist/index.js +693 -0
- package/package.json +58 -0
package/dist/index.d.cts
ADDED
|
@@ -0,0 +1,447 @@
|
|
|
1
|
+
import { X509Certificate, KeyObject } from 'node:crypto';
|
|
2
|
+
|
|
3
|
+
interface HttpConfig {
|
|
4
|
+
/** RP-API суурь URL, /v3 хүртэл. Ж: https://ca.eidmongolia.mn/v3 */
|
|
5
|
+
baseUrl: string;
|
|
6
|
+
/** API secret (rp_sk_…) — Authorization: Bearer-д орно. */
|
|
7
|
+
apiSecret: string;
|
|
8
|
+
/** Дуудлагын timeout (мс). Default 15000. Long-poll нь өөрийн уртыг дамжуулна. */
|
|
9
|
+
timeoutMs?: number;
|
|
10
|
+
/**
|
|
11
|
+
* undici Dispatcher — mTLS client cert тохируулахад. RP тал:
|
|
12
|
+
* new Agent({ connect: { cert, key, ca } })
|
|
13
|
+
* Дамжуулсан бол fetch дуудлага бүрд хэрэглэнэ. Зөвхөн Node орчинд.
|
|
14
|
+
*/
|
|
15
|
+
dispatcher?: unknown;
|
|
16
|
+
/** Тест/custom орчинд fetch-ийг орлуулах (default — global fetch). */
|
|
17
|
+
fetchImpl?: typeof fetch;
|
|
18
|
+
}
|
|
19
|
+
declare class Http {
|
|
20
|
+
private readonly cfg;
|
|
21
|
+
constructor(cfg: HttpConfig);
|
|
22
|
+
post(path: string, body: unknown, timeoutMs?: number): Promise<unknown>;
|
|
23
|
+
get(path: string, timeoutMs?: number): Promise<unknown>;
|
|
24
|
+
private request;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
/** Сертификатын баталгаажуулалтын түвшин (eIDAS LoA). QUALIFIED — хууль ёсны гарын үсэгт. */
|
|
28
|
+
type CertificateLevel = "ADVANCED" | "QUALIFIED" | "QSCD";
|
|
29
|
+
/** Гарын үсгийн протокол: auth → ACSP_V2, sign → RAW_DIGEST_SIGNATURE (Smart-ID v3). */
|
|
30
|
+
type SignatureProtocol = "ACSP_V2" | "RAW_DIGEST_SIGNATURE";
|
|
31
|
+
/** Гарын үсгийн алгоритм. rsassa-pss анхдагч; ecdsa-with-SHA256 — хуучин threshold-ECDSA cert. */
|
|
32
|
+
type SignatureAlgorithm = "rsassa-pss" | "sha256WithRSAEncryption" | "sha384WithRSAEncryption" | "sha512WithRSAEncryption" | "ecdsa-with-SHA256";
|
|
33
|
+
/** Hash алгоритм (Smart-ID v3 нэршил). Хуучин "SHA256" нэршил SDK-д БАЙХГҮЙ. */
|
|
34
|
+
type HashAlgorithm = "SHA-256" | "SHA-384" | "SHA-512";
|
|
35
|
+
/** Урсгалын төрөл — хариуны signature.flowType; RP өөрийн санал болгосонтой тулгана. */
|
|
36
|
+
type FlowType = "QR" | "App2App" | "Web2App" | "Notification";
|
|
37
|
+
/** rsassa-pss хариуны параметр (signature.signatureAlgorithmParameters). */
|
|
38
|
+
interface SignatureAlgorithmParameters {
|
|
39
|
+
hashAlgorithm: HashAlgorithm | string;
|
|
40
|
+
maskGenAlgorithm?: {
|
|
41
|
+
algorithm: string;
|
|
42
|
+
parameters?: {
|
|
43
|
+
hashAlgorithm: string;
|
|
44
|
+
};
|
|
45
|
+
};
|
|
46
|
+
saltLength?: number;
|
|
47
|
+
trailerField?: string;
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Auth session-ийн ACSP_V2 контекст — RP ХҮСЭЛТЭД илгээсэн утгууд. validator энэ + хариугаар
|
|
51
|
+
* payload-ийг дахин угсарна. Session эхлүүлэхэд SDK өөрөө бөглөнө; RP үүнийг хадгална.
|
|
52
|
+
*/
|
|
53
|
+
interface AcspContext {
|
|
54
|
+
rpChallenge: string;
|
|
55
|
+
relyingPartyName: string;
|
|
56
|
+
brokeredRpName: string;
|
|
57
|
+
/** Илгээсэн base64 МӨР (дахин serialize хийхгүй). */
|
|
58
|
+
interactions: string;
|
|
59
|
+
initialCallbackUrl: string;
|
|
60
|
+
/** RP-ийн санал болгосон урсгалууд — хариуны flowType эдгээрийн нэг байх ёстой. */
|
|
61
|
+
flowTypes: FlowType[];
|
|
62
|
+
signatureAlgorithm: SignatureAlgorithm;
|
|
63
|
+
hashAlgorithm: HashAlgorithm;
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Interaction — иргэний утсан дээр харагдах харилцан үйлдэл. displayTextAndPIN нь PIN асууж
|
|
67
|
+
* текст харуулна (хамгийн түгээмэл). text60 — 60 тэмдэгт хүртэл; text200 — 200 хүртэл.
|
|
68
|
+
*/
|
|
69
|
+
interface Interaction {
|
|
70
|
+
type: "displayTextAndPIN" | "confirmationMessage" | "confirmationMessageAndVerificationCodeChoice";
|
|
71
|
+
displayText60?: string;
|
|
72
|
+
displayText200?: string;
|
|
73
|
+
}
|
|
74
|
+
/** Session-ийн төлөв. RUNNING — иргэн хариу өгөөгүй; COMPLETE — дууссан (endResult-ыг үз). */
|
|
75
|
+
type SessionState = "RUNNING" | "COMPLETE";
|
|
76
|
+
/**
|
|
77
|
+
* endResult — COMPLETE session-ийн эцсийн үр дүн.
|
|
78
|
+
* OK — амжилттай (signature/cert бэлэн)
|
|
79
|
+
* USER_REFUSED* — иргэн татгалзсан
|
|
80
|
+
* TIMEOUT — иргэн хугацаанд хариу өгөөгүй
|
|
81
|
+
* DOCUMENT_UNUSABLE — гэрчилгээ/төхөөрөмж ашиглах боломжгүй
|
|
82
|
+
* WRONG_VC — баталгаажуулах код таарсангүй
|
|
83
|
+
*/
|
|
84
|
+
type EndResult = "OK" | "USER_REFUSED" | "USER_REFUSED_DISPLAYTEXTANDPIN" | "USER_REFUSED_VC_CHOICE" | "USER_REFUSED_CONFIRMATIONMESSAGE" | "USER_REFUSED_CERT_CHOICE" | "TIMEOUT" | "DOCUMENT_UNUSABLE" | "WRONG_VC" | "PROTOCOL_FAILURE" | string;
|
|
85
|
+
/**
|
|
86
|
+
* Push (notification) session эхлүүлсний хариу. vc — иргэний дэлгэцэд ХАРУУЛАХ 5 оронтой
|
|
87
|
+
* баталгаажуулах код: утсан дээрх кодтой ижил эсэхийг НҮДЭЭР тулгах зориулалттай.
|
|
88
|
+
*
|
|
89
|
+
* VC нь ПИН БИШ — RP нь үүнийг хэрэглэгчээр оруулуулж болохгүй, зөвхөн харуулна. (PIN1 нь
|
|
90
|
+
* 4 оронтой; VC-г 5 оронтой болгосон нь хэрэглэгч андуурч PIN-ий талбарт оруулаад PIN
|
|
91
|
+
* блок болохоос сэргийлсэн зориудын ялгаа.)
|
|
92
|
+
*/
|
|
93
|
+
interface NotificationSession {
|
|
94
|
+
sessionId: string;
|
|
95
|
+
/** Verification Code — иргэний утсан дээр харагдах код. RP UI-даа ижлийг харуулна (man-in-the-middle хамгаалалт). */
|
|
96
|
+
vc: string | null;
|
|
97
|
+
/** RP-ийн илгээсэн санамсаргүй challenge (base64). Хариуны signature-ийг үүний эсрэг шалгана. */
|
|
98
|
+
rpChallenge: string;
|
|
99
|
+
/** Auth session-д validator-т өгөх контекст (sign session-д undefined). */
|
|
100
|
+
acsp?: AcspContext;
|
|
101
|
+
}
|
|
102
|
+
/** Device-link (QR/App2App) session. Иргэн QR уншиж эсвэл deeplink дарж нэгдэнэ. */
|
|
103
|
+
interface DeviceLinkSession {
|
|
104
|
+
sessionId: string;
|
|
105
|
+
sessionToken: string | null;
|
|
106
|
+
sessionSecret: string | null;
|
|
107
|
+
/** QR/deeplink үүсгэх суурь URL. */
|
|
108
|
+
deviceLinkBase: string | null;
|
|
109
|
+
rpChallenge: string;
|
|
110
|
+
acsp?: AcspContext;
|
|
111
|
+
}
|
|
112
|
+
/** Session poll-ийн нэгтгэсэн үр дүн (validator-т орох түүхий материал). */
|
|
113
|
+
interface SessionResult {
|
|
114
|
+
state: SessionState | string;
|
|
115
|
+
endResult: EndResult | null;
|
|
116
|
+
documentNumber: string | null;
|
|
117
|
+
/** Иргэний X.509 гэрчилгээ (DER, base64). cert chain validation-д орно. */
|
|
118
|
+
certificateDerB64: string | null;
|
|
119
|
+
certificateLevel: CertificateLevel | string | null;
|
|
120
|
+
/** Гарын үсгийн утга (base64). rpChallenge/digest-ийн эсрэг баталгаажна. */
|
|
121
|
+
signatureValueB64: string | null;
|
|
122
|
+
signatureAlgorithm: string | null;
|
|
123
|
+
signatureProtocol: string | null;
|
|
124
|
+
/** ACSP_V2 (auth): серверийн санамсаргүй (base64), утасны challenge (base64url), урсгал. */
|
|
125
|
+
serverRandom: string | null;
|
|
126
|
+
userChallenge: string | null;
|
|
127
|
+
flowType: string | null;
|
|
128
|
+
signatureAlgorithmParameters: SignatureAlgorithmParameters | null;
|
|
129
|
+
interactionTypeUsed: string | null;
|
|
130
|
+
/**
|
|
131
|
+
* Байгууллагын нэрийн өмнөөс (нэвтрэлт эсвэл гарын үсэг) байсан бол — СЕРВЕР төлөөллийн
|
|
132
|
+
* эрхийг session үүсэх үед шалгасны баталгаа. null бол ердийн хувь хүний session.
|
|
133
|
+
* RP энэ талбарыг л итгэж уншина (клиентийн сонголтод биш). docs/ORG_LOGIN.md.
|
|
134
|
+
*/
|
|
135
|
+
onBehalfOf: OrgResult | null;
|
|
136
|
+
}
|
|
137
|
+
/** Session-ий байгууллагын блок — байгууллага + тухайн иргэний эрх (бүртгэлээс real-time). */
|
|
138
|
+
interface OrgResult {
|
|
139
|
+
/** `NTRMN-<улсын бүртгэлийн дугаар>`. */
|
|
140
|
+
orgEtsi: string;
|
|
141
|
+
orgName: string | null;
|
|
142
|
+
/** Албан тушаал (ж: "Захирал"). Эрх хураагдсан бол null. */
|
|
143
|
+
role: string | null;
|
|
144
|
+
/** ADMIN | MANAGER. Эрх хураагдсан бол null. */
|
|
145
|
+
rightType: string | null;
|
|
146
|
+
}
|
|
147
|
+
/** RP-ийн нэвтрэх мэдээлэл — бүх дуудлагад хэрэгтэй таних тэмдэг + secret. */
|
|
148
|
+
interface RpCredentials {
|
|
149
|
+
/** relying_parties-д бүртгэлтэй RP UUID. */
|
|
150
|
+
rpUUID: string;
|
|
151
|
+
/** Иргэнд харагдах RP нэр (≤32 байт UTF-8). */
|
|
152
|
+
rpName: string;
|
|
153
|
+
/** API secret (rp_sk_…). Зөвхөн backend-д хадгална — браузерт ХЭЗЭЭ Ч задлахгүй. */
|
|
154
|
+
apiSecret: string;
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
interface AuthDefaults {
|
|
158
|
+
certificateLevel: CertificateLevel;
|
|
159
|
+
}
|
|
160
|
+
interface AuthOptions {
|
|
161
|
+
/** Энэ session-д certLevel-ийг дарж бичих (default — client-ийн тохиргоо). */
|
|
162
|
+
certificateLevel?: CertificateLevel;
|
|
163
|
+
/**
|
|
164
|
+
* Same-device App2App буцах URL (notification). Өгвөл initialCallbackUrl-аар илгээнэ.
|
|
165
|
+
*
|
|
166
|
+
* Query-д буцах browser-ийн hint нэмэхийг ЗӨВЛӨНӨ (`?retScheme=` iOS / `?retPkg=` Android) —
|
|
167
|
+
* эс бөгөөс апп системийн default browser-оор буцаж, иргэн эхэлсэн цонхоо алддаг.
|
|
168
|
+
* Жагсаалт: docs/RP_GEREGE_INTEGRATION.md §1.1b.
|
|
169
|
+
*/
|
|
170
|
+
callbackUrl?: string;
|
|
171
|
+
/**
|
|
172
|
+
* Байгууллагаар нэвтрэх (docs/ORG_LOGIN.md) — байгууллагын ETSI (`NTRMN-<register>`).
|
|
173
|
+
* Иргэн тухайн байгууллагыг ТӨЛӨӨЛӨН нэвтэрнэ: сервер төлөөллийн эрхийг шалгаж
|
|
174
|
+
* (эрхгүй бол 403), утсанд байгууллагын нэрийг харуулж, дууссан session-ий хариунд
|
|
175
|
+
* `onBehalfOf` блок (orgEtsi/orgName/role/rightType) буцаана.
|
|
176
|
+
*
|
|
177
|
+
* (!) Байгууллага нь ГАРЫН ҮСЭГ ЗУРАГДАХ өгөгдөлд (ACSP_V2) ОРОХГҮЙ — холбоос нь
|
|
178
|
+
* серверийн баталгаа. RP энэ талбарыг өөрөө шалгаж болохгүй, session хариунаас уншина.
|
|
179
|
+
*/
|
|
180
|
+
onBehalfOf?: string;
|
|
181
|
+
/** Гарын үсгийн алгоритм (default rsassa-pss). */
|
|
182
|
+
signatureAlgorithm?: SignatureAlgorithm;
|
|
183
|
+
/** ACSP_V2 payload-ийн hash (default SHA-512 — Smart-ID v3 жишээтэй ижил). */
|
|
184
|
+
hashAlgorithm?: HashAlgorithm;
|
|
185
|
+
}
|
|
186
|
+
declare class AuthApi {
|
|
187
|
+
private readonly http;
|
|
188
|
+
private readonly creds;
|
|
189
|
+
private readonly defaults;
|
|
190
|
+
constructor(http: Http, creds: RpCredentials, defaults: AuthDefaults);
|
|
191
|
+
/** v3 nested body + validator-т хэрэгтэй контекст (ижил утгуудаас — байт зөрөхгүй). */
|
|
192
|
+
private baseBody;
|
|
193
|
+
private parseNotification;
|
|
194
|
+
private parseDeviceLink;
|
|
195
|
+
/** Push — РД/иргэний дугаар/ETSI-ээр (сервер төрлийг таьна). Иргэний утас руу мэдэгдэл очно. */
|
|
196
|
+
notificationByEtsi(id: string, interactions: Interaction[], opts?: AuthOptions): Promise<NotificationSession>;
|
|
197
|
+
/** Push — баримтын дугаараар (тодорхой төхөөрөмж рүү). */
|
|
198
|
+
notificationByDocument(documentNumber: string, interactions: Interaction[], opts?: AuthOptions): Promise<NotificationSession>;
|
|
199
|
+
/** QR/App2App — нэр томьёололгүй (иргэн хэн болохыг урьдчилж мэдэхгүй). QR код үүсгэхэд. */
|
|
200
|
+
deviceLinkAnonymous(interactions: Interaction[], opts?: AuthOptions): Promise<DeviceLinkSession>;
|
|
201
|
+
/** QR/App2App — тодорхой иргэн (РД/civil_id/ETSI). */
|
|
202
|
+
deviceLinkByEtsi(id: string, interactions: Interaction[], opts?: AuthOptions): Promise<DeviceLinkSession>;
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
interface SignDefaults {
|
|
206
|
+
certificateLevel: CertificateLevel;
|
|
207
|
+
}
|
|
208
|
+
interface SignOptions {
|
|
209
|
+
certificateLevel?: CertificateLevel;
|
|
210
|
+
/**
|
|
211
|
+
* Same-device App2App буцах URL. Query-д буцах browser-ийн hint нэмэхийг ЗӨВЛӨНӨ
|
|
212
|
+
* (`?retScheme=` iOS / `?retPkg=` Android) — docs/RP_GEREGE_INTEGRATION.md §1.1b.
|
|
213
|
+
*/
|
|
214
|
+
callbackUrl?: string;
|
|
215
|
+
/** digest-ийн hash (default SHA-256). digest-ийг өөрөө бэлдсэн бол тааруулна (урт = hLen). */
|
|
216
|
+
hashAlgorithm?: HashAlgorithm;
|
|
217
|
+
/** Гарын үсгийн алгоритм (default rsassa-pss; PKCS#1 v1.5 нь deprecated). */
|
|
218
|
+
signatureAlgorithm?: SignatureAlgorithm;
|
|
219
|
+
/**
|
|
220
|
+
* Байгууллагын нэрийн өмнөөс гарын үсэг (docs/ORG_LOGIN.md) — байгууллагын ETSI
|
|
221
|
+
* (`NTRMN-<register>`). Сервер төлөөллийн эрхийг шалгаж (эрхгүй бол 403), утсанд
|
|
222
|
+
* байгууллагын нэрийг харуулж, session хариунд `onBehalfOf` блок буцаана. Гарын үсэг
|
|
223
|
+
* өөрөө иргэний PIN2 гэрчилгээгээр — байгууллага нь digest-д ОРОХГҮЙ.
|
|
224
|
+
*/
|
|
225
|
+
onBehalfOf?: string;
|
|
226
|
+
}
|
|
227
|
+
declare class SignApi {
|
|
228
|
+
private readonly http;
|
|
229
|
+
private readonly creds;
|
|
230
|
+
private readonly defaults;
|
|
231
|
+
constructor(http: Http, creds: RpCredentials, defaults: SignDefaults);
|
|
232
|
+
private body;
|
|
233
|
+
private parse;
|
|
234
|
+
/**
|
|
235
|
+
* Бэлэн digest-ээр push sign (РД/civil_id/ETSI). Баримт (PDF/файл)-ын байтын SHA-256
|
|
236
|
+
* digest-ийг гаднаас бэлдэж өгнө — текст бус бинар баримтад тохиромжтой.
|
|
237
|
+
*/
|
|
238
|
+
digestByEtsi(id: string, digestB64: string, interactions: Interaction[], opts?: SignOptions): Promise<NotificationSession>;
|
|
239
|
+
/** Бэлэн digest-ээр push sign — баримтын дугаараар (auth-аас гарсан documentNumber дээр). */
|
|
240
|
+
digestByDocument(documentNumber: string, digestB64: string, interactions: Interaction[], opts?: SignOptions): Promise<NotificationSession>;
|
|
241
|
+
/** Текстийн SHA-256 digest-ийг дотроо тооцоод push sign (богино текст баримтад тохиромжтой). */
|
|
242
|
+
textByEtsi(id: string, text: string, interactions: Interaction[], opts?: SignOptions): Promise<NotificationSession>;
|
|
243
|
+
}
|
|
244
|
+
|
|
245
|
+
/** RP-API-ийн session JSON-ийг SessionResult болгон задална (rpclient.ts-тэй ижил mapping). */
|
|
246
|
+
declare function parseSessionResult(raw: unknown): SessionResult;
|
|
247
|
+
declare class SessionApi {
|
|
248
|
+
private readonly http;
|
|
249
|
+
constructor(http: Http);
|
|
250
|
+
/** Нэг удаагийн long-poll. serverPollMs хүртэл хүлээнэ. */
|
|
251
|
+
poll(sessionId: string, serverPollMs?: number): Promise<SessionResult>;
|
|
252
|
+
/**
|
|
253
|
+
* COMPLETE болтол давтаж poll хийнэ. maxWaitMs дуустал хүлээгээд гараагүй бол сүүлчийн
|
|
254
|
+
* (RUNNING) үр дүнг буцаана — дуудагч endResult==null-ийг TIMEOUT мэт боловсруулна.
|
|
255
|
+
*/
|
|
256
|
+
waitForResult(sessionId: string, opts?: {
|
|
257
|
+
maxWaitMs?: number;
|
|
258
|
+
serverPollMs?: number;
|
|
259
|
+
}): Promise<SessionResult>;
|
|
260
|
+
}
|
|
261
|
+
|
|
262
|
+
/**
|
|
263
|
+
* RevocationChecker — иргэний cert revoke хийгдсэн эсэхийг шалгах hook (OCSP/CRL).
|
|
264
|
+
* Сүлжээний I/O шаардсан тул async. RP нь cert доторх AIA (OCSP) / CDP (CRL) URL-аар
|
|
265
|
+
* хэрэгжүүлнэ. "good" = хүчинтэй, "revoked" = цуцлагдсан, "unknown" = тогтоогдсонгүй.
|
|
266
|
+
*/
|
|
267
|
+
type RevocationStatus = "good" | "revoked" | "unknown";
|
|
268
|
+
type RevocationChecker = (cert: X509Certificate, issuer: X509Certificate | undefined) => Promise<RevocationStatus>;
|
|
269
|
+
interface TrustConfig {
|
|
270
|
+
/**
|
|
271
|
+
* Trust anchor (Root CA) PEM-үүд. Cert chain эдгээрийн аль нэг хүрэх ёстой.
|
|
272
|
+
* ⚠️ Production-д ЗААВАЛ өг — хоосон бол ValidationError шиднэ (allowUntrusted-аар л
|
|
273
|
+
* үл тоомсорлоно — зөвхөн dev/тест).
|
|
274
|
+
*/
|
|
275
|
+
trustAnchorsPem?: string[];
|
|
276
|
+
/** Intermediate CA PEM-үүд (leaf ↔ root хооронд). */
|
|
277
|
+
intermediatesPem?: string[];
|
|
278
|
+
/** Шаардах certLevel (default QUALIFIED). ADVANCED тохируулбал доод түвшин зөвшөөрнө. */
|
|
279
|
+
requiredLevel?: CertificateLevel;
|
|
280
|
+
/** Cert validity шалгахад зөвшөөрөх цагийн зөрүү (мс, default 0). */
|
|
281
|
+
clockSkewMs?: number;
|
|
282
|
+
/**
|
|
283
|
+
* Trust anchor өгөөгүй ч баталгаажуулалт үргэлжлүүлэхийг ИЛ зөвшөөрнө (default false).
|
|
284
|
+
* ⚠️ true бол cert-ийг trust anchor хүртэл chain хийхгүй — зөвхөн dev/тест.
|
|
285
|
+
*/
|
|
286
|
+
allowUntrusted?: boolean;
|
|
287
|
+
/**
|
|
288
|
+
* Revocation (OCSP/CRL) шалгагч hook. Тохируулаагүй бол revocation ШАЛГАХГҮЙ
|
|
289
|
+
* (QUALIFIED non-repudiation-д RP-ийн үүрэг — checkRevocation-г үзнэ үү).
|
|
290
|
+
*/
|
|
291
|
+
revocation?: RevocationChecker;
|
|
292
|
+
/**
|
|
293
|
+
* Revocation шийдвэрийн горим: "hard-fail" — "unknown"-г татгалзана (default
|
|
294
|
+
* revocation тохируулсан үед); "soft-fail" — "unknown"-г зөвшөөрнө.
|
|
295
|
+
*/
|
|
296
|
+
revocationMode?: "hard-fail" | "soft-fail";
|
|
297
|
+
}
|
|
298
|
+
/** Баталгаажсан иргэний таних мэдээлэл (auth). */
|
|
299
|
+
interface VerifiedIdentity {
|
|
300
|
+
documentNumber: string;
|
|
301
|
+
/** Иргэний X.509 гэрчилгээ — subject-д РД/нэр. RP цааш parse хийж болно. */
|
|
302
|
+
certificate: X509Certificate;
|
|
303
|
+
/** Cert subject DN (түүхий). Ж: "C=MN, CN=..., SERIALNUMBER=PNOMN-...". */
|
|
304
|
+
subject: string;
|
|
305
|
+
certificateLevel: string;
|
|
306
|
+
}
|
|
307
|
+
/** Баталгаажсан гарын үсэг (sign). */
|
|
308
|
+
interface VerifiedSignature {
|
|
309
|
+
documentNumber: string;
|
|
310
|
+
signatureValueB64: string;
|
|
311
|
+
signatureAlgorithm: string | null;
|
|
312
|
+
certificate: X509Certificate;
|
|
313
|
+
subject: string;
|
|
314
|
+
}
|
|
315
|
+
declare class ResponseValidator {
|
|
316
|
+
private readonly anchors;
|
|
317
|
+
private readonly intermediates;
|
|
318
|
+
private readonly requiredLevel;
|
|
319
|
+
private readonly skew;
|
|
320
|
+
private readonly allowUntrusted;
|
|
321
|
+
private readonly revocation?;
|
|
322
|
+
private readonly revocationMode;
|
|
323
|
+
constructor(trust?: TrustConfig);
|
|
324
|
+
/**
|
|
325
|
+
* Auth session-ийн хариуг бүрэн шалгаж, баталгаажсан иргэнийг буцаана.
|
|
326
|
+
* @param acsp — session эхлүүлэхэд SDK-ийн буцаасан `acsp` контекст (RP хадгалсан).
|
|
327
|
+
*/
|
|
328
|
+
validateAuth(result: SessionResult, acsp: AcspContext): VerifiedIdentity;
|
|
329
|
+
/**
|
|
330
|
+
* Sign session-ийн хариуг бүрэн шалгаж, баталгаажсан гарын үсгийг буцаана.
|
|
331
|
+
* @param hashAlgorithm — digest-ийг үүсгэсэн hash (хүсэлтэд илгээсэнтэй ижил; default SHA-256).
|
|
332
|
+
*/
|
|
333
|
+
validateSign(result: SessionResult, digestB64: string, hashAlgorithm?: string): VerifiedSignature;
|
|
334
|
+
/**
|
|
335
|
+
* Хариуны signatureAlgorithm + hashAlgorithm-ийг RP-ийн хүссэнтэй тулгана (downgrade хаалт).
|
|
336
|
+
* ecdsa-with-SHA256 (хуучин cert) хүссэн rsassa-pss-ийн оронд ирэхийг зөвшөөрнө — SHA-256-аар л.
|
|
337
|
+
*/
|
|
338
|
+
private algorithmOf;
|
|
339
|
+
/** state/endResult, cert байгаа эсэх, chain, validity, certLevel — нийтлэг шалгалт. */
|
|
340
|
+
private precheck;
|
|
341
|
+
private checkValidity;
|
|
342
|
+
private checkLevel;
|
|
343
|
+
/** leaf-ээс эхлэн issuer-ийг intermediates/anchors дотроос олж, anchor хүртэл chain зангидна. */
|
|
344
|
+
private verifyChain;
|
|
345
|
+
/** leaf-ийн шууд issuer-ийг trust pool-оос буцаана (revocation шалгагчид issuer хэрэгтэй). */
|
|
346
|
+
private findIssuer;
|
|
347
|
+
/**
|
|
348
|
+
* checkRevocation — тохируулсан RevocationChecker hook-оор cert-ийн revoke төлвийг
|
|
349
|
+
* шалгана. revocation тохируулаагүй бол no-op (true буцаана). "revoked" үед, мөн
|
|
350
|
+
* hard-fail горимд "unknown" үед ValidationError шиднэ. validateAuth/Sign-ийн дараа
|
|
351
|
+
* дуудна (тэдгээр нь sync; revocation нь сүлжээ I/O тул async).
|
|
352
|
+
*/
|
|
353
|
+
checkRevocation(cert: X509Certificate): Promise<void>;
|
|
354
|
+
}
|
|
355
|
+
/** Payload (auth) дээрх гарын үсэг — алгоритмаар салаалж node:crypto verify. */
|
|
356
|
+
declare function verifyPayloadSignature(payload: Buffer, sigB64: string, key: KeyObject, alg: string, hash: string): boolean;
|
|
357
|
+
/** Prehashed digest (sign) дээрх гарын үсэг. RSA: raw public op + EMSA-PSS-VERIFY / PKCS#1 DigestInfo. */
|
|
358
|
+
declare function verifyPrehashedSignature(digest: Buffer, sigB64: string, key: KeyObject, alg: string, hash: string): boolean;
|
|
359
|
+
|
|
360
|
+
interface ClientConfig {
|
|
361
|
+
/** RP-API суурь URL (/v3-гүйгээр — SDK нэмнэ). Ж: https://ca.eidmongolia.mn */
|
|
362
|
+
baseUrl: string;
|
|
363
|
+
/** RP таних мэдээлэл + API secret. */
|
|
364
|
+
credentials: RpCredentials;
|
|
365
|
+
/** Default certLevel (auth/sign бүрд). Default QUALIFIED. */
|
|
366
|
+
defaultCertificateLevel?: CertificateLevel;
|
|
367
|
+
/** HTTP timeout (мс). */
|
|
368
|
+
timeoutMs?: number;
|
|
369
|
+
/** undici Dispatcher (mTLS client cert). */
|
|
370
|
+
dispatcher?: unknown;
|
|
371
|
+
/** fetch орлуулагч (тест). */
|
|
372
|
+
fetchImpl?: typeof fetch;
|
|
373
|
+
/** Trust anchor (Root CA) — validator-д. Production-д ЗААВАЛ. */
|
|
374
|
+
trust?: TrustConfig;
|
|
375
|
+
}
|
|
376
|
+
declare class EidClient {
|
|
377
|
+
readonly auth: AuthApi;
|
|
378
|
+
readonly sign: SignApi;
|
|
379
|
+
readonly session: SessionApi;
|
|
380
|
+
readonly validator: ResponseValidator;
|
|
381
|
+
constructor(cfg: ClientConfig);
|
|
382
|
+
}
|
|
383
|
+
|
|
384
|
+
/** SHA-256 digest, base64. Текст эсвэл байтаас. Sign flow-ийн baримтын digest үүсгэхэд. */
|
|
385
|
+
declare function sha256Base64(data: string | Uint8Array): string;
|
|
386
|
+
/** Санамсаргүй RP challenge (default 64 байт), base64. Auth flow-д replay-ээс хамгаална. */
|
|
387
|
+
declare function randomChallenge(bytes?: number): string;
|
|
388
|
+
/**
|
|
389
|
+
* interactions массивыг RP-API v3-ийн base64 мөр болгоно. RP энэ МӨРИЙГ хадгалж
|
|
390
|
+
* validator-т өгнө (дахин serialize хийхгүй — JSON байт зөрж болно).
|
|
391
|
+
*/
|
|
392
|
+
declare function interactionsToBase64(interactions: Interaction[]): string;
|
|
393
|
+
/** ACSP_V2 payload-ийн бүх орц (Smart-ID v3 §ACSP_V2 digest calculation). */
|
|
394
|
+
interface AcspV2Params {
|
|
395
|
+
/** default "smart-id" (серверийн SMARTID_ACSP_SCHEME_NAME-тэй ижил). */
|
|
396
|
+
schemeName?: string;
|
|
397
|
+
serverRandom: string;
|
|
398
|
+
rpChallenge: string;
|
|
399
|
+
userChallenge: string;
|
|
400
|
+
relyingPartyName: string;
|
|
401
|
+
brokeredRpName?: string;
|
|
402
|
+
interactions: string;
|
|
403
|
+
interactionTypeUsed: string;
|
|
404
|
+
initialCallbackUrl?: string;
|
|
405
|
+
flowType: FlowType | string;
|
|
406
|
+
}
|
|
407
|
+
/** ACSP_V2 payload — UTF-8 байт (гарын үсэг ЭНЭ дээр). */
|
|
408
|
+
declare function buildAcspV2Payload(p: AcspV2Params): Buffer;
|
|
409
|
+
/** HASH_{hashAlgorithm}(payload). */
|
|
410
|
+
declare function acspV2Digest(p: AcspV2Params, hashAlgorithm: HashAlgorithm | string): Buffer;
|
|
411
|
+
|
|
412
|
+
/** Бүх SDK алдааны суурь. */
|
|
413
|
+
declare class EidError extends Error {
|
|
414
|
+
constructor(message: string);
|
|
415
|
+
}
|
|
416
|
+
/** HTTP 401 — API secret буруу/байхгүй. Тохиргооны (RP secret) алдаа. */
|
|
417
|
+
declare class AuthenticationError extends EidError {
|
|
418
|
+
}
|
|
419
|
+
/** HTTP 403 — IP allowlist/mTLS зөвшөөрөөгүй. Танай серверийн IP бүртгэгдээгүй байж магадгүй. */
|
|
420
|
+
declare class ForbiddenError extends EidError {
|
|
421
|
+
}
|
|
422
|
+
/** RP-API-аас ирсэн бусад HTTP алдаа (4xx/5xx). status ба хариуны биеийг агуулна. */
|
|
423
|
+
declare class ApiError extends EidError {
|
|
424
|
+
readonly status: number;
|
|
425
|
+
readonly body: string;
|
|
426
|
+
constructor(status: number, body: string);
|
|
427
|
+
}
|
|
428
|
+
/** Сүлжээ/timeout — upstream хариу өгсөнгүй. */
|
|
429
|
+
declare class NetworkError extends EidError {
|
|
430
|
+
}
|
|
431
|
+
/**
|
|
432
|
+
* Session амжилтгүй дууссан (endResult ≠ OK): TIMEOUT, USER_REFUSED*, DOCUMENT_UNUSABLE гм.
|
|
433
|
+
* endResult-оор салгаж RP UI-д тохирох мессеж харуулна.
|
|
434
|
+
*/
|
|
435
|
+
declare class SessionFailedError extends EidError {
|
|
436
|
+
readonly endResult: string;
|
|
437
|
+
constructor(endResult: string);
|
|
438
|
+
}
|
|
439
|
+
/**
|
|
440
|
+
* Хариуны баталгаажуулалт бүтэлгүйтсэн — cert chain итгэлцэлгүй, signature challenge-тэй
|
|
441
|
+
* таарсангүй, эсвэл certLevel хүрэлцээгүй. ЭНЭ алдаа гарвал хариунд ИТГЭХГҮЙ
|
|
442
|
+
* (хуурамч/proxy хийгдсэн байж болзошгүй).
|
|
443
|
+
*/
|
|
444
|
+
declare class ValidationError extends EidError {
|
|
445
|
+
}
|
|
446
|
+
|
|
447
|
+
export { type AcspContext, type AcspV2Params, ApiError, AuthApi, type AuthDefaults, type AuthOptions, AuthenticationError, type CertificateLevel, type ClientConfig, type DeviceLinkSession, EidClient, EidError, type EndResult, type FlowType, ForbiddenError, type HashAlgorithm, Http, type HttpConfig, type Interaction, NetworkError, type NotificationSession, ResponseValidator, type RevocationChecker, type RevocationStatus, type RpCredentials, SessionApi, SessionFailedError, type SessionResult, type SessionState, SignApi, type SignDefaults, type SignOptions, type SignatureAlgorithm, type SignatureAlgorithmParameters, type SignatureProtocol, type TrustConfig, ValidationError, type VerifiedIdentity, type VerifiedSignature, acspV2Digest, buildAcspV2Payload, interactionsToBase64, parseSessionResult, randomChallenge, sha256Base64, verifyPayloadSignature, verifyPrehashedSignature };
|