@gerege-systems/eid-mongolia-sdk 0.6.0 → 0.6.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.
package/README.md CHANGED
@@ -160,6 +160,9 @@ OK ирж болзошгүй. Иймд `ResponseValidator`:
160
160
  4. Гарын үсгийг иргэний public key-ээр шалгана:
161
161
  - **auth** → ACSP_V2 payload (`smart-id|ACSP_V2|serverRandom|rpChallenge|userChallenge|B64(rpName)|B64(brokeredRpName)|B64(SHA-256(interactions))|interactionTypeUsed|initialCallbackUrl|flowType`, hash = хүсэлтийн `hashAlgorithm`) дээр — `flowType`, `userChallenge`, `serverRandom` ба алгоритмын downgrade-ийг мөн шалгана;
162
162
  `expectedFlowType` өгвөл `flowType` эхлүүлсэн урсгалтай ЯГ таарах, Web2App/App2App-д `userChallengeVerifier` заавал
163
+ `initialCallbackUrl`-ийг хариуны `signature.initialCallbackUrl`-аас авна (CA урсгалаар шийднэ: QR/Notification →
164
+ `""`, Web2App/App2App → таны callback; шилжилтийн үед legacy `/dl` ба push-д таны callback) — зөвхөн `""` эсвэл
165
+ таны илгээсэн callback байхад, Web2App/App2App-д заавал таны callback; өөр утга → татгалзана
163
166
  - **sign** → RP-ийн өгсөн digest дээр
164
167
 
165
168
  Аль нэг алхам бүтэлгүйтвэл `ValidationError` шиднэ — хариунд **итгэхгүй**.
@@ -116,6 +116,12 @@ interface SessionResult {
116
116
  serverRandom: string | null;
117
117
  userChallenge: string | null;
118
118
  flowType: string | null;
119
+ /**
120
+ * ACSP_V2 payload-д гарын үсэг зурагдсан `initialCallbackUrl` (хариуны `signature.initialCallbackUrl`,
121
+ * eID нэмэлт). Smart-ID: QR/Notification → `""`, Web2App/App2App → RP-ийн илгээсэн URL. null = хариунд
122
+ * талбар алга (хуучин CA). Validator үүнийг зөвхөн `""` эсвэл RP-ийн өөрийн callback байхад л хүлээн авна.
123
+ */
124
+ initialCallbackUrl?: string | null;
119
125
  signatureAlgorithmParameters: SignatureAlgorithmParameters | null;
120
126
  interactionTypeUsed: string | null;
121
127
  /**
@@ -116,6 +116,12 @@ interface SessionResult {
116
116
  serverRandom: string | null;
117
117
  userChallenge: string | null;
118
118
  flowType: string | null;
119
+ /**
120
+ * ACSP_V2 payload-д гарын үсэг зурагдсан `initialCallbackUrl` (хариуны `signature.initialCallbackUrl`,
121
+ * eID нэмэлт). Smart-ID: QR/Notification → `""`, Web2App/App2App → RP-ийн илгээсэн URL. null = хариунд
122
+ * талбар алга (хуучин CA). Validator үүнийг зөвхөн `""` эсвэл RP-ийн өөрийн callback байхад л хүлээн авна.
123
+ */
124
+ initialCallbackUrl?: string | null;
119
125
  signatureAlgorithmParameters: SignatureAlgorithmParameters | null;
120
126
  interactionTypeUsed: string | null;
121
127
  /**
@@ -1 +1 @@
1
- export { d as DeviceLinkError, e as DeviceLinkInput, D as DeviceLinkSession, E as EidError, h as NavigatorLike, O as OpenOrShowQROptions, n as deviceLink, o as isMobileUserAgent, p as openOrShowQR } from './browser-PhjcbuAN.cjs';
1
+ export { d as DeviceLinkError, e as DeviceLinkInput, D as DeviceLinkSession, E as EidError, h as NavigatorLike, O as OpenOrShowQROptions, n as deviceLink, o as isMobileUserAgent, p as openOrShowQR } from './browser-BU9ShPWO.cjs';
package/dist/browser.d.ts CHANGED
@@ -1 +1 @@
1
- export { d as DeviceLinkError, e as DeviceLinkInput, D as DeviceLinkSession, E as EidError, h as NavigatorLike, O as OpenOrShowQROptions, n as deviceLink, o as isMobileUserAgent, p as openOrShowQR } from './browser-PhjcbuAN.js';
1
+ export { d as DeviceLinkError, e as DeviceLinkInput, D as DeviceLinkSession, E as EidError, h as NavigatorLike, O as OpenOrShowQROptions, n as deviceLink, o as isMobileUserAgent, p as openOrShowQR } from './browser-BU9ShPWO.js';
package/dist/index.cjs CHANGED
@@ -336,6 +336,9 @@ function parseSessionResult(raw) {
336
336
  serverRandom: str(sig.serverRandom),
337
337
  userChallenge: str(sig.userChallenge),
338
338
  flowType: str(sig.flowType),
339
+ // CA-ийн eID нэмэлт (f59d14ee-оос): гарын үсэг зурагдсан ACSP_V2 initialCallbackUrl. "" нь утга —
340
+ // null/undefined-аас ялгана (талбар алга = хуучин CA).
341
+ initialCallbackUrl: typeof sig.initialCallbackUrl === "string" ? sig.initialCallbackUrl : null,
339
342
  signatureAlgorithmParameters: parseSigParams(sig.signatureAlgorithmParameters),
340
343
  interactionTypeUsed: str(r.interactionTypeUsed),
341
344
  onBehalfOf: parseOrg(r.onBehalfOf)
@@ -447,7 +450,7 @@ var ResponseValidator = class {
447
450
  brokeredRpName: acsp.brokeredRpName,
448
451
  interactions: acsp.interactions,
449
452
  interactionTypeUsed,
450
- initialCallbackUrl: acsp.initialCallbackUrl,
453
+ initialCallbackUrl: signedCallbackUrl(result.initialCallbackUrl, acsp.initialCallbackUrl, flowType),
451
454
  flowType
452
455
  });
453
456
  if (!verifyPayloadSignature(payload, result.signatureValueB64, leaf.publicKey, alg, hash)) {
@@ -584,6 +587,17 @@ var ResponseValidator = class {
584
587
  }
585
588
  }
586
589
  };
590
+ function signedCallbackUrl(fromResponse, rpCallback, flowType) {
591
+ const rp = rpCallback ?? "";
592
+ if (fromResponse == null) return rp;
593
+ if (fromResponse !== "" && fromResponse !== rp) {
594
+ throw new ValidationError("signature.initialCallbackUrl \u043D\u044C \u0445\u043E\u043E\u0441\u043E\u043D \u0447 \u0431\u0438\u0448, \u0438\u043B\u0433\u044D\u044D\u0441\u044D\u043D callback \u0447 \u0431\u0438\u0448 (\u0445\u0443\u0443\u0440\u0430\u043C\u0447 \u0445\u0430\u0440\u0438\u0443 \u0431\u0430\u0439\u0436 \u0431\u043E\u043B\u0437\u043E\u0448\u0433\u04AF\u0439)");
595
+ }
596
+ if ((flowType === "Web2App" || flowType === "App2App") && fromResponse !== rp) {
597
+ throw new ValidationError(`${flowType} \u0443\u0440\u0441\u0433\u0430\u043B\u0434 signature.initialCallbackUrl \u043D\u044C \u0438\u043B\u0433\u044D\u044D\u0441\u044D\u043D callback \u0431\u0430\u0439\u0445 \u0451\u0441\u0442\u043E\u0439`);
598
+ }
599
+ return fromResponse;
600
+ }
587
601
  function userChallengeOf(verifier) {
588
602
  return (0, import_node_crypto2.createHash)("sha256").update(verifier, "utf8").digest("base64url");
589
603
  }
package/dist/index.d.cts CHANGED
@@ -1,5 +1,5 @@
1
- import { R as RpCredentials, C as CertificateLevel, I as Interaction, S as SignatureAlgorithm, H as HashAlgorithm, N as NotificationSession, D as DeviceLinkSession, a as SessionResult, A as AcspContext, F as FlowType } from './browser-PhjcbuAN.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-PhjcbuAN.cjs';
1
+ import { R as RpCredentials, C as CertificateLevel, I as Interaction, S as SignatureAlgorithm, H as HashAlgorithm, N as NotificationSession, D as DeviceLinkSession, a as SessionResult, A as AcspContext, F as FlowType } from './browser-BU9ShPWO.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-BU9ShPWO.cjs';
3
3
  import { X509Certificate, KeyObject } from 'node:crypto';
4
4
 
5
5
  interface HttpConfig {
package/dist/index.d.ts CHANGED
@@ -1,5 +1,5 @@
1
- import { R as RpCredentials, C as CertificateLevel, I as Interaction, S as SignatureAlgorithm, H as HashAlgorithm, N as NotificationSession, D as DeviceLinkSession, a as SessionResult, A as AcspContext, F as FlowType } from './browser-PhjcbuAN.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-PhjcbuAN.js';
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-BU9ShPWO.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-BU9ShPWO.js';
3
3
  import { X509Certificate, KeyObject } from 'node:crypto';
4
4
 
5
5
  interface HttpConfig {
package/dist/index.js CHANGED
@@ -261,6 +261,9 @@ function parseSessionResult(raw) {
261
261
  serverRandom: str(sig.serverRandom),
262
262
  userChallenge: str(sig.userChallenge),
263
263
  flowType: str(sig.flowType),
264
+ // CA-ийн eID нэмэлт (f59d14ee-оос): гарын үсэг зурагдсан ACSP_V2 initialCallbackUrl. "" нь утга —
265
+ // null/undefined-аас ялгана (талбар алга = хуучин CA).
266
+ initialCallbackUrl: typeof sig.initialCallbackUrl === "string" ? sig.initialCallbackUrl : null,
264
267
  signatureAlgorithmParameters: parseSigParams(sig.signatureAlgorithmParameters),
265
268
  interactionTypeUsed: str(r.interactionTypeUsed),
266
269
  onBehalfOf: parseOrg(r.onBehalfOf)
@@ -372,7 +375,7 @@ var ResponseValidator = class {
372
375
  brokeredRpName: acsp.brokeredRpName,
373
376
  interactions: acsp.interactions,
374
377
  interactionTypeUsed,
375
- initialCallbackUrl: acsp.initialCallbackUrl,
378
+ initialCallbackUrl: signedCallbackUrl(result.initialCallbackUrl, acsp.initialCallbackUrl, flowType),
376
379
  flowType
377
380
  });
378
381
  if (!verifyPayloadSignature(payload, result.signatureValueB64, leaf.publicKey, alg, hash)) {
@@ -509,6 +512,17 @@ var ResponseValidator = class {
509
512
  }
510
513
  }
511
514
  };
515
+ function signedCallbackUrl(fromResponse, rpCallback, flowType) {
516
+ const rp = rpCallback ?? "";
517
+ if (fromResponse == null) return rp;
518
+ if (fromResponse !== "" && fromResponse !== rp) {
519
+ throw new ValidationError("signature.initialCallbackUrl \u043D\u044C \u0445\u043E\u043E\u0441\u043E\u043D \u0447 \u0431\u0438\u0448, \u0438\u043B\u0433\u044D\u044D\u0441\u044D\u043D callback \u0447 \u0431\u0438\u0448 (\u0445\u0443\u0443\u0440\u0430\u043C\u0447 \u0445\u0430\u0440\u0438\u0443 \u0431\u0430\u0439\u0436 \u0431\u043E\u043B\u0437\u043E\u0448\u0433\u04AF\u0439)");
520
+ }
521
+ if ((flowType === "Web2App" || flowType === "App2App") && fromResponse !== rp) {
522
+ throw new ValidationError(`${flowType} \u0443\u0440\u0441\u0433\u0430\u043B\u0434 signature.initialCallbackUrl \u043D\u044C \u0438\u043B\u0433\u044D\u044D\u0441\u044D\u043D callback \u0431\u0430\u0439\u0445 \u0451\u0441\u0442\u043E\u0439`);
523
+ }
524
+ return fromResponse;
525
+ }
512
526
  function userChallengeOf(verifier) {
513
527
  return createHash2("sha256").update(verifier, "utf8").digest("base64url");
514
528
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@gerege-systems/eid-mongolia-sdk",
3
- "version": "0.6.0",
3
+ "version": "0.6.1",
4
4
  "description": "e-ID Mongolia Relying Party SDK — иргэнээр утсаар нь нэвтрэлт ба хууль ёсны цахим гарын үсэг (RP-API v3, Smart-ID нийцтэй).",
5
5
  "license": "MIT",
6
6
  "type": "module",