@gerege-systems/eid-mongolia-sdk 0.3.0 → 0.4.1

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.
@@ -0,0 +1,89 @@
1
+ // src/errors.ts
2
+ var EidError = class extends Error {
3
+ constructor(message) {
4
+ super(message);
5
+ this.name = new.target.name;
6
+ }
7
+ };
8
+ var AuthenticationError = class extends EidError {
9
+ };
10
+ var ForbiddenError = class extends EidError {
11
+ };
12
+ var ApiError = class extends EidError {
13
+ constructor(status, body) {
14
+ super(`RP-API ${status}: ${body}`);
15
+ this.status = status;
16
+ this.body = body;
17
+ }
18
+ status;
19
+ body;
20
+ };
21
+ var NetworkError = class extends EidError {
22
+ };
23
+ var SessionFailedError = class extends EidError {
24
+ constructor(endResult) {
25
+ super(`Session \u0430\u043C\u0436\u0438\u043B\u0442\u0433\u04AF\u0439: ${endResult}`);
26
+ this.endResult = endResult;
27
+ }
28
+ endResult;
29
+ };
30
+ var ValidationError = class extends EidError {
31
+ };
32
+ var DeviceLinkError = class extends EidError {
33
+ };
34
+
35
+ // src/devicelink.ts
36
+ var SESSION_ID_RE = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/;
37
+ var VC_RE = /^[0-9]{5}$/;
38
+ function deviceLink(session) {
39
+ const base = session.deviceLinkBase?.trim();
40
+ if (!base) throw new DeviceLinkError("deviceLink: \u0445\u0430\u0440\u0438\u0443\u043D\u0434 deviceLinkBase \u0431\u0430\u0439\u0445\u0433\u04AF\u0439 \u2014 device-link session \u044D\u0441\u044D\u0445\u0438\u0439\u0433 \u0448\u0430\u043B\u0433\u0430");
41
+ let u;
42
+ try {
43
+ u = new URL(base);
44
+ } catch {
45
+ throw new DeviceLinkError(`deviceLink: deviceLinkBase \u0431\u0443\u0440\u0443\u0443 URL: ${base}`);
46
+ }
47
+ if (u.protocol !== "https:" && u.protocol !== "http:") {
48
+ throw new DeviceLinkError(`deviceLink: deviceLinkBase https URL \u0431\u0430\u0439\u0445 \u0451\u0441\u0442\u043E\u0439: ${u.protocol}`);
49
+ }
50
+ if (!SESSION_ID_RE.test(session.sessionId)) throw new DeviceLinkError("deviceLink: sessionId UUID (lowercase) \u0431\u0438\u0448");
51
+ if (session.vc == null || !VC_RE.test(session.vc)) throw new DeviceLinkError("deviceLink: vc 5 \u043E\u0440\u043E\u043D\u0442\u043E\u0439 \u0442\u043E\u043E \u0431\u0438\u0448");
52
+ u.searchParams.set("sessionId", session.sessionId);
53
+ u.searchParams.set("vc", session.vc);
54
+ return u.toString();
55
+ }
56
+ function isMobileUserAgent(nav) {
57
+ const n = nav ?? globalThis.navigator;
58
+ if (!n) return false;
59
+ if (n.userAgentData?.mobile === true) return true;
60
+ const ua = n.userAgent ?? "";
61
+ if (/Android|iPhone|iPod|iPad/i.test(ua)) return true;
62
+ return /Macintosh/.test(ua) && (n.maxTouchPoints ?? 0) > 1;
63
+ }
64
+ function openOrShowQR(session, opts) {
65
+ const link = deviceLink(session);
66
+ const mobile = typeof opts.isMobile === "function" ? opts.isMobile() : opts.isMobile ?? isMobileUserAgent();
67
+ if (mobile) {
68
+ const loc = globalThis.location;
69
+ if (!loc) throw new DeviceLinkError("openOrShowQR: location \u0431\u0430\u0439\u0445\u0433\u04AF\u0439 \u2014 \u0437\u04E9\u0432\u0445\u04E9\u043D \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u0442");
70
+ loc.assign(link);
71
+ return "opened";
72
+ }
73
+ opts.showQR(link);
74
+ return "qr";
75
+ }
76
+
77
+ export {
78
+ EidError,
79
+ AuthenticationError,
80
+ ForbiddenError,
81
+ ApiError,
82
+ NetworkError,
83
+ SessionFailedError,
84
+ ValidationError,
85
+ DeviceLinkError,
86
+ deviceLink,
87
+ isMobileUserAgent,
88
+ openOrShowQR
89
+ };
package/dist/index.cjs CHANGED
@@ -24,6 +24,7 @@ __export(index_exports, {
24
24
  AuthApi: () => AuthApi,
25
25
  AuthenticationError: () => AuthenticationError,
26
26
  DEFAULT_BASE_URL: () => DEFAULT_BASE_URL,
27
+ DeviceLinkError: () => DeviceLinkError,
27
28
  EidClient: () => EidClient,
28
29
  EidError: () => EidError,
29
30
  ForbiddenError: () => ForbiddenError,
@@ -36,7 +37,10 @@ __export(index_exports, {
36
37
  ValidationError: () => ValidationError,
37
38
  acspV2Digest: () => acspV2Digest,
38
39
  buildAcspV2Payload: () => buildAcspV2Payload,
40
+ deviceLink: () => deviceLink,
39
41
  interactionsToBase64: () => interactionsToBase64,
42
+ isMobileUserAgent: () => isMobileUserAgent,
43
+ openOrShowQR: () => openOrShowQR,
40
44
  parseSessionResult: () => parseSessionResult,
41
45
  randomChallenge: () => randomChallenge,
42
46
  resolveBaseUrl: () => resolveBaseUrl,
@@ -77,6 +81,8 @@ var SessionFailedError = class extends EidError {
77
81
  };
78
82
  var ValidationError = class extends EidError {
79
83
  };
84
+ var DeviceLinkError = class extends EidError {
85
+ };
80
86
 
81
87
  // src/http.ts
82
88
  var DEFAULT_TIMEOUT_MS = 15e3;
@@ -209,11 +215,13 @@ var AuthApi = class {
209
215
  }
210
216
  parseDeviceLink(raw, acsp) {
211
217
  const r = rec(raw);
218
+ const vc = typeof r.vc === "object" && r.vc !== null ? rec(r.vc).value : r.vc;
212
219
  return {
213
220
  sessionId: String(r.sessionID),
214
221
  sessionToken: r.sessionToken != null ? String(r.sessionToken) : null,
215
222
  sessionSecret: r.sessionSecret != null ? String(r.sessionSecret) : null,
216
223
  deviceLinkBase: r.deviceLinkBase != null ? String(r.deviceLinkBase) : null,
224
+ vc: vc != null ? String(vc) : null,
217
225
  rpChallenge: acsp.rpChallenge,
218
226
  acsp
219
227
  };
@@ -732,12 +740,55 @@ var EidClient = class {
732
740
  this.validator = new ResponseValidator(cfg.trust ?? {});
733
741
  }
734
742
  };
743
+
744
+ // src/devicelink.ts
745
+ var SESSION_ID_RE = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/;
746
+ var VC_RE = /^[0-9]{5}$/;
747
+ function deviceLink(session) {
748
+ const base = session.deviceLinkBase?.trim();
749
+ if (!base) throw new DeviceLinkError("deviceLink: \u0445\u0430\u0440\u0438\u0443\u043D\u0434 deviceLinkBase \u0431\u0430\u0439\u0445\u0433\u04AF\u0439 \u2014 device-link session \u044D\u0441\u044D\u0445\u0438\u0439\u0433 \u0448\u0430\u043B\u0433\u0430");
750
+ let u;
751
+ try {
752
+ u = new URL(base);
753
+ } catch {
754
+ throw new DeviceLinkError(`deviceLink: deviceLinkBase \u0431\u0443\u0440\u0443\u0443 URL: ${base}`);
755
+ }
756
+ if (u.protocol !== "https:" && u.protocol !== "http:") {
757
+ throw new DeviceLinkError(`deviceLink: deviceLinkBase https URL \u0431\u0430\u0439\u0445 \u0451\u0441\u0442\u043E\u0439: ${u.protocol}`);
758
+ }
759
+ if (!SESSION_ID_RE.test(session.sessionId)) throw new DeviceLinkError("deviceLink: sessionId UUID (lowercase) \u0431\u0438\u0448");
760
+ if (session.vc == null || !VC_RE.test(session.vc)) throw new DeviceLinkError("deviceLink: vc 5 \u043E\u0440\u043E\u043D\u0442\u043E\u0439 \u0442\u043E\u043E \u0431\u0438\u0448");
761
+ u.searchParams.set("sessionId", session.sessionId);
762
+ u.searchParams.set("vc", session.vc);
763
+ return u.toString();
764
+ }
765
+ function isMobileUserAgent(nav) {
766
+ const n = nav ?? globalThis.navigator;
767
+ if (!n) return false;
768
+ if (n.userAgentData?.mobile === true) return true;
769
+ const ua = n.userAgent ?? "";
770
+ if (/Android|iPhone|iPod|iPad/i.test(ua)) return true;
771
+ return /Macintosh/.test(ua) && (n.maxTouchPoints ?? 0) > 1;
772
+ }
773
+ function openOrShowQR(session, opts) {
774
+ const link = deviceLink(session);
775
+ const mobile = typeof opts.isMobile === "function" ? opts.isMobile() : opts.isMobile ?? isMobileUserAgent();
776
+ if (mobile) {
777
+ const loc = globalThis.location;
778
+ if (!loc) throw new DeviceLinkError("openOrShowQR: location \u0431\u0430\u0439\u0445\u0433\u04AF\u0439 \u2014 \u0437\u04E9\u0432\u0445\u04E9\u043D \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u0442");
779
+ loc.assign(link);
780
+ return "opened";
781
+ }
782
+ opts.showQR(link);
783
+ return "qr";
784
+ }
735
785
  // Annotate the CommonJS export names for ESM import in node:
736
786
  0 && (module.exports = {
737
787
  ApiError,
738
788
  AuthApi,
739
789
  AuthenticationError,
740
790
  DEFAULT_BASE_URL,
791
+ DeviceLinkError,
741
792
  EidClient,
742
793
  EidError,
743
794
  ForbiddenError,
@@ -750,7 +801,10 @@ var EidClient = class {
750
801
  ValidationError,
751
802
  acspV2Digest,
752
803
  buildAcspV2Payload,
804
+ deviceLink,
753
805
  interactionsToBase64,
806
+ isMobileUserAgent,
807
+ openOrShowQR,
754
808
  parseSessionResult,
755
809
  randomChallenge,
756
810
  resolveBaseUrl,
package/dist/index.d.cts CHANGED
@@ -1,3 +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, A as AcspContext, F as FlowType } from './browser-BS8JwSQk.cjs';
2
+ export { b as ApiError, c as AuthenticationError, d as DeviceLinkError, e as DeviceLinkInput, E as EidError, f as EndResult, g as ForbiddenError, h as NavigatorLike, i as NetworkError, O as OpenOrShowQROptions, j as SessionFailedError, k as SessionState, l as SignatureAlgorithmParameters, m as SignatureProtocol, V as ValidationError, n as deviceLink, o as isMobileUserAgent, p as openOrShowQR } from './browser-BS8JwSQk.cjs';
1
3
  import { X509Certificate, KeyObject } from 'node:crypto';
2
4
 
3
5
  interface HttpConfig {
@@ -24,139 +26,6 @@ declare class Http {
24
26
  private request;
25
27
  }
26
28
 
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
- /**
152
- * Дэд системийн нэр (ж: «Интернэт банк») — CA-д session бүрд хадгалагдана, ≤120 тэмдэгт
153
- * (сервер илүүг таслана). Иргэний утсан дээр харагдах нэр нь RP-ийн бүртгэлийн нэр.
154
- */
155
- rpName: string;
156
- /** API secret (rp_sk_…). Зөвхөн backend-д хадгална — браузерт ХЭЗЭЭ Ч задлахгүй. */
157
- apiSecret: string;
158
- }
159
-
160
29
  interface AuthDefaults {
161
30
  certificateLevel: CertificateLevel;
162
31
  }
@@ -419,39 +288,4 @@ declare function buildAcspV2Payload(p: AcspV2Params): Buffer;
419
288
  /** HASH_{hashAlgorithm}(payload). */
420
289
  declare function acspV2Digest(p: AcspV2Params, hashAlgorithm: HashAlgorithm | string): Buffer;
421
290
 
422
- /** Бүх SDK алдааны суурь. */
423
- declare class EidError extends Error {
424
- constructor(message: string);
425
- }
426
- /** HTTP 401 — API secret буруу/байхгүй. Тохиргооны (RP secret) алдаа. */
427
- declare class AuthenticationError extends EidError {
428
- }
429
- /** HTTP 403 — IP allowlist/mTLS зөвшөөрөөгүй. Танай серверийн IP бүртгэгдээгүй байж магадгүй. */
430
- declare class ForbiddenError extends EidError {
431
- }
432
- /** RP-API-аас ирсэн бусад HTTP алдаа (4xx/5xx). status ба хариуны биеийг агуулна. */
433
- declare class ApiError extends EidError {
434
- readonly status: number;
435
- readonly body: string;
436
- constructor(status: number, body: string);
437
- }
438
- /** Сүлжээ/timeout — upstream хариу өгсөнгүй. */
439
- declare class NetworkError extends EidError {
440
- }
441
- /**
442
- * Session амжилтгүй дууссан (endResult ≠ OK): TIMEOUT, USER_REFUSED*, DOCUMENT_UNUSABLE гм.
443
- * endResult-оор салгаж RP UI-д тохирох мессеж харуулна.
444
- */
445
- declare class SessionFailedError extends EidError {
446
- readonly endResult: string;
447
- constructor(endResult: string);
448
- }
449
- /**
450
- * Хариуны баталгаажуулалт бүтэлгүйтсэн — cert chain итгэлцэлгүй, signature challenge-тэй
451
- * таарсангүй, эсвэл certLevel хүрэлцээгүй. ЭНЭ алдаа гарвал хариунд ИТГЭХГҮЙ
452
- * (хуурамч/proxy хийгдсэн байж болзошгүй).
453
- */
454
- declare class ValidationError extends EidError {
455
- }
456
-
457
- export { type AcspContext, type AcspV2Params, ApiError, AuthApi, type AuthDefaults, type AuthOptions, AuthenticationError, type CertificateLevel, type ClientConfig, DEFAULT_BASE_URL, 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, resolveBaseUrl, sha256Base64, verifyPayloadSignature, verifyPrehashedSignature };
291
+ export { AcspContext, type AcspV2Params, AuthApi, type AuthDefaults, type AuthOptions, CertificateLevel, type ClientConfig, DEFAULT_BASE_URL, DeviceLinkSession, EidClient, FlowType, HashAlgorithm, Http, type HttpConfig, Interaction, NotificationSession, ResponseValidator, type RevocationChecker, type RevocationStatus, RpCredentials, SessionApi, SessionResult, SignApi, type SignDefaults, type SignOptions, SignatureAlgorithm, type TrustConfig, type VerifiedIdentity, type VerifiedSignature, acspV2Digest, buildAcspV2Payload, interactionsToBase64, parseSessionResult, randomChallenge, resolveBaseUrl, sha256Base64, verifyPayloadSignature, verifyPrehashedSignature };
package/dist/index.d.ts CHANGED
@@ -1,3 +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, A as AcspContext, F as FlowType } from './browser-BS8JwSQk.js';
2
+ export { b as ApiError, c as AuthenticationError, d as DeviceLinkError, e as DeviceLinkInput, E as EidError, f as EndResult, g as ForbiddenError, h as NavigatorLike, i as NetworkError, O as OpenOrShowQROptions, j as SessionFailedError, k as SessionState, l as SignatureAlgorithmParameters, m as SignatureProtocol, V as ValidationError, n as deviceLink, o as isMobileUserAgent, p as openOrShowQR } from './browser-BS8JwSQk.js';
1
3
  import { X509Certificate, KeyObject } from 'node:crypto';
2
4
 
3
5
  interface HttpConfig {
@@ -24,139 +26,6 @@ declare class Http {
24
26
  private request;
25
27
  }
26
28
 
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
- /**
152
- * Дэд системийн нэр (ж: «Интернэт банк») — CA-д session бүрд хадгалагдана, ≤120 тэмдэгт
153
- * (сервер илүүг таслана). Иргэний утсан дээр харагдах нэр нь RP-ийн бүртгэлийн нэр.
154
- */
155
- rpName: string;
156
- /** API secret (rp_sk_…). Зөвхөн backend-д хадгална — браузерт ХЭЗЭЭ Ч задлахгүй. */
157
- apiSecret: string;
158
- }
159
-
160
29
  interface AuthDefaults {
161
30
  certificateLevel: CertificateLevel;
162
31
  }
@@ -419,39 +288,4 @@ declare function buildAcspV2Payload(p: AcspV2Params): Buffer;
419
288
  /** HASH_{hashAlgorithm}(payload). */
420
289
  declare function acspV2Digest(p: AcspV2Params, hashAlgorithm: HashAlgorithm | string): Buffer;
421
290
 
422
- /** Бүх SDK алдааны суурь. */
423
- declare class EidError extends Error {
424
- constructor(message: string);
425
- }
426
- /** HTTP 401 — API secret буруу/байхгүй. Тохиргооны (RP secret) алдаа. */
427
- declare class AuthenticationError extends EidError {
428
- }
429
- /** HTTP 403 — IP allowlist/mTLS зөвшөөрөөгүй. Танай серверийн IP бүртгэгдээгүй байж магадгүй. */
430
- declare class ForbiddenError extends EidError {
431
- }
432
- /** RP-API-аас ирсэн бусад HTTP алдаа (4xx/5xx). status ба хариуны биеийг агуулна. */
433
- declare class ApiError extends EidError {
434
- readonly status: number;
435
- readonly body: string;
436
- constructor(status: number, body: string);
437
- }
438
- /** Сүлжээ/timeout — upstream хариу өгсөнгүй. */
439
- declare class NetworkError extends EidError {
440
- }
441
- /**
442
- * Session амжилтгүй дууссан (endResult ≠ OK): TIMEOUT, USER_REFUSED*, DOCUMENT_UNUSABLE гм.
443
- * endResult-оор салгаж RP UI-д тохирох мессеж харуулна.
444
- */
445
- declare class SessionFailedError extends EidError {
446
- readonly endResult: string;
447
- constructor(endResult: string);
448
- }
449
- /**
450
- * Хариуны баталгаажуулалт бүтэлгүйтсэн — cert chain итгэлцэлгүй, signature challenge-тэй
451
- * таарсангүй, эсвэл certLevel хүрэлцээгүй. ЭНЭ алдаа гарвал хариунд ИТГЭХГҮЙ
452
- * (хуурамч/proxy хийгдсэн байж болзошгүй).
453
- */
454
- declare class ValidationError extends EidError {
455
- }
456
-
457
- export { type AcspContext, type AcspV2Params, ApiError, AuthApi, type AuthDefaults, type AuthOptions, AuthenticationError, type CertificateLevel, type ClientConfig, DEFAULT_BASE_URL, 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, resolveBaseUrl, sha256Base64, verifyPayloadSignature, verifyPrehashedSignature };
291
+ export { AcspContext, type AcspV2Params, AuthApi, type AuthDefaults, type AuthOptions, CertificateLevel, type ClientConfig, DEFAULT_BASE_URL, DeviceLinkSession, EidClient, FlowType, HashAlgorithm, Http, type HttpConfig, Interaction, NotificationSession, ResponseValidator, type RevocationChecker, type RevocationStatus, RpCredentials, SessionApi, SessionResult, SignApi, type SignDefaults, type SignOptions, SignatureAlgorithm, type TrustConfig, type VerifiedIdentity, type VerifiedSignature, acspV2Digest, buildAcspV2Payload, interactionsToBase64, parseSessionResult, randomChallenge, resolveBaseUrl, sha256Base64, verifyPayloadSignature, verifyPrehashedSignature };
package/dist/index.js CHANGED
@@ -1,34 +1,16 @@
1
- // src/errors.ts
2
- var EidError = class extends Error {
3
- constructor(message) {
4
- super(message);
5
- this.name = new.target.name;
6
- }
7
- };
8
- var AuthenticationError = class extends EidError {
9
- };
10
- var ForbiddenError = class extends EidError {
11
- };
12
- var ApiError = class extends EidError {
13
- constructor(status, body) {
14
- super(`RP-API ${status}: ${body}`);
15
- this.status = status;
16
- this.body = body;
17
- }
18
- status;
19
- body;
20
- };
21
- var NetworkError = class extends EidError {
22
- };
23
- var SessionFailedError = class extends EidError {
24
- constructor(endResult) {
25
- super(`Session \u0430\u043C\u0436\u0438\u043B\u0442\u0433\u04AF\u0439: ${endResult}`);
26
- this.endResult = endResult;
27
- }
28
- endResult;
29
- };
30
- var ValidationError = class extends EidError {
31
- };
1
+ import {
2
+ ApiError,
3
+ AuthenticationError,
4
+ DeviceLinkError,
5
+ EidError,
6
+ ForbiddenError,
7
+ NetworkError,
8
+ SessionFailedError,
9
+ ValidationError,
10
+ deviceLink,
11
+ isMobileUserAgent,
12
+ openOrShowQR
13
+ } from "./chunk-Q5TQMCJC.js";
32
14
 
33
15
  // src/http.ts
34
16
  var DEFAULT_TIMEOUT_MS = 15e3;
@@ -161,11 +143,13 @@ var AuthApi = class {
161
143
  }
162
144
  parseDeviceLink(raw, acsp) {
163
145
  const r = rec(raw);
146
+ const vc = typeof r.vc === "object" && r.vc !== null ? rec(r.vc).value : r.vc;
164
147
  return {
165
148
  sessionId: String(r.sessionID),
166
149
  sessionToken: r.sessionToken != null ? String(r.sessionToken) : null,
167
150
  sessionSecret: r.sessionSecret != null ? String(r.sessionSecret) : null,
168
151
  deviceLinkBase: r.deviceLinkBase != null ? String(r.deviceLinkBase) : null,
152
+ vc: vc != null ? String(vc) : null,
169
153
  rpChallenge: acsp.rpChallenge,
170
154
  acsp
171
155
  };
@@ -689,6 +673,7 @@ export {
689
673
  AuthApi,
690
674
  AuthenticationError,
691
675
  DEFAULT_BASE_URL,
676
+ DeviceLinkError,
692
677
  EidClient,
693
678
  EidError,
694
679
  ForbiddenError,
@@ -701,7 +686,10 @@ export {
701
686
  ValidationError,
702
687
  acspV2Digest,
703
688
  buildAcspV2Payload,
689
+ deviceLink,
704
690
  interactionsToBase64,
691
+ isMobileUserAgent,
692
+ openOrShowQR,
705
693
  parseSessionResult,
706
694
  randomChallenge,
707
695
  resolveBaseUrl,