@trustchex/react-native-sdk 1.487.0 → 1.489.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/ios/ImageDecoder/ImageDecoderModule.m +12 -0
- package/ios/ImageDecoder/ImageDecoderModule.swift +43 -0
- package/lib/module/Shared/Components/EIDScanner.js +100 -37
- package/lib/module/Shared/Components/IdentityDocumentCamera.constants.js +9 -1
- package/lib/module/Shared/Components/IdentityDocumentCamera.flows.js +22 -2
- package/lib/module/Shared/Components/IdentityDocumentCamera.js +1 -1
- package/lib/module/Shared/Components/IdentityDocumentCamera.utils.js +7 -7
- package/lib/module/Shared/EIDReader/cardFileInputStream.js +25 -2
- package/lib/module/Shared/EIDReader/defaultFileSystem.js +56 -6
- package/lib/module/Shared/EIDReader/eidReader.js +138 -16
- package/lib/module/Shared/EIDReader/lds/icao/dg11File.js +23 -6
- package/lib/module/Shared/EIDReader/nfcManagerCardService.js +79 -9
- package/lib/module/Shared/EIDReader/protocol/paceDH.js +101 -0
- package/lib/module/Shared/EIDReader/protocol/paceErrors.js +34 -0
- package/lib/module/Shared/EIDReader/protocol/paceProtocol.js +53 -4
- package/lib/module/Shared/EIDReader/protocol/readBinaryAPDUSender.js +7 -3
- package/lib/module/Shared/Libs/country-display.utils.js +13 -1
- package/lib/module/Shared/Libs/diagnosticReport.js +24 -1
- package/lib/module/Shared/Libs/diagnostics.js +30 -8
- package/lib/module/Shared/Libs/jp2Decode.js +43 -0
- package/lib/module/Shared/Libs/mrz.utils.js +22 -5
- package/lib/module/Shared/Libs/mrzTransliteration.js +14 -1
- package/lib/module/Translation/Resources/en.js +12 -0
- package/lib/module/Translation/Resources/tr.js +12 -0
- package/lib/module/version.js +1 -1
- package/lib/typescript/src/Shared/Components/EIDScanner.d.ts.map +1 -1
- package/lib/typescript/src/Shared/Components/IdentityDocumentCamera.constants.d.ts.map +1 -1
- package/lib/typescript/src/Shared/Components/IdentityDocumentCamera.d.ts.map +1 -1
- package/lib/typescript/src/Shared/Components/IdentityDocumentCamera.flows.d.ts +11 -0
- package/lib/typescript/src/Shared/Components/IdentityDocumentCamera.flows.d.ts.map +1 -1
- package/lib/typescript/src/Shared/Components/IdentityDocumentCamera.utils.d.ts +1 -1
- package/lib/typescript/src/Shared/Components/IdentityDocumentCamera.utils.d.ts.map +1 -1
- package/lib/typescript/src/Shared/EIDReader/cardFileInputStream.d.ts +3 -0
- package/lib/typescript/src/Shared/EIDReader/cardFileInputStream.d.ts.map +1 -1
- package/lib/typescript/src/Shared/EIDReader/defaultFileSystem.d.ts +4 -0
- package/lib/typescript/src/Shared/EIDReader/defaultFileSystem.d.ts.map +1 -1
- package/lib/typescript/src/Shared/EIDReader/eidReader.d.ts.map +1 -1
- package/lib/typescript/src/Shared/EIDReader/lds/icao/dg11File.d.ts.map +1 -1
- package/lib/typescript/src/Shared/EIDReader/nfcManagerCardService.d.ts +9 -1
- package/lib/typescript/src/Shared/EIDReader/nfcManagerCardService.d.ts.map +1 -1
- package/lib/typescript/src/Shared/EIDReader/protocol/paceDH.d.ts +56 -0
- package/lib/typescript/src/Shared/EIDReader/protocol/paceDH.d.ts.map +1 -0
- package/lib/typescript/src/Shared/EIDReader/protocol/paceErrors.d.ts +26 -0
- package/lib/typescript/src/Shared/EIDReader/protocol/paceErrors.d.ts.map +1 -0
- package/lib/typescript/src/Shared/EIDReader/protocol/paceProtocol.d.ts.map +1 -1
- package/lib/typescript/src/Shared/EIDReader/protocol/readBinaryAPDUSender.d.ts.map +1 -1
- package/lib/typescript/src/Shared/Libs/country-display.utils.d.ts.map +1 -1
- package/lib/typescript/src/Shared/Libs/diagnosticReport.d.ts.map +1 -1
- package/lib/typescript/src/Shared/Libs/diagnostics.d.ts +9 -1
- package/lib/typescript/src/Shared/Libs/diagnostics.d.ts.map +1 -1
- package/lib/typescript/src/Shared/Libs/jp2Decode.d.ts +13 -0
- package/lib/typescript/src/Shared/Libs/jp2Decode.d.ts.map +1 -0
- package/lib/typescript/src/Shared/Libs/mrz.utils.d.ts.map +1 -1
- package/lib/typescript/src/Shared/Libs/mrzTransliteration.d.ts.map +1 -1
- package/lib/typescript/src/Translation/Resources/en.d.ts +12 -0
- package/lib/typescript/src/Translation/Resources/en.d.ts.map +1 -1
- package/lib/typescript/src/Translation/Resources/tr.d.ts +12 -0
- package/lib/typescript/src/Translation/Resources/tr.d.ts.map +1 -1
- package/lib/typescript/src/version.d.ts +1 -1
- package/package.json +1 -1
- package/src/Shared/Components/EIDScanner.tsx +153 -69
- package/src/Shared/Components/IdentityDocumentCamera.constants.ts +9 -1
- package/src/Shared/Components/IdentityDocumentCamera.flows.ts +22 -2
- package/src/Shared/Components/IdentityDocumentCamera.tsx +1 -2
- package/src/Shared/Components/IdentityDocumentCamera.utils.ts +6 -8
- package/src/Shared/EIDReader/cardFileInputStream.ts +30 -6
- package/src/Shared/EIDReader/defaultFileSystem.ts +75 -17
- package/src/Shared/EIDReader/eidReader.ts +172 -24
- package/src/Shared/EIDReader/lds/icao/dg11File.ts +28 -13
- package/src/Shared/EIDReader/nfcManagerCardService.ts +91 -13
- package/src/Shared/EIDReader/protocol/paceDH.ts +183 -0
- package/src/Shared/EIDReader/protocol/paceErrors.ts +41 -0
- package/src/Shared/EIDReader/protocol/paceProtocol.ts +72 -6
- package/src/Shared/EIDReader/protocol/readBinaryAPDUSender.ts +7 -4
- package/src/Shared/Libs/country-display.utils.ts +12 -1
- package/src/Shared/Libs/diagnosticReport.ts +32 -1
- package/src/Shared/Libs/diagnostics.ts +38 -14
- package/src/Shared/Libs/jp2Decode.ts +48 -0
- package/src/Shared/Libs/mrz.utils.ts +27 -6
- package/src/Shared/Libs/mrzTransliteration.ts +16 -3
- package/src/Translation/Resources/en.ts +19 -0
- package/src/Translation/Resources/tr.ts +19 -0
- package/src/version.ts +1 -1
|
@@ -24,6 +24,26 @@ const icaoCheckDigit = str => {
|
|
|
24
24
|
}
|
|
25
25
|
return String(sum);
|
|
26
26
|
};
|
|
27
|
+
|
|
28
|
+
/**
|
|
29
|
+
* Reportable NFC error code, e.g. `NFC-AUTH-6982`. MUST match the code shown to
|
|
30
|
+
* the user by EIDScanner (built in eidReader.buildNfcErrorCode) so a user who
|
|
31
|
+
* quotes "NFC-AUTH-6982" can be matched verbatim against their diagnostics.json.
|
|
32
|
+
* Local copy of the category→prefix map (eidReader pulls in native NFC deps).
|
|
33
|
+
*/
|
|
34
|
+
const NFC_CATEGORY_CODE = {
|
|
35
|
+
user_cancelled: 'CANCEL',
|
|
36
|
+
tag_lost: 'TAGLOST',
|
|
37
|
+
timeout: 'TIMEOUT',
|
|
38
|
+
unsupported: 'UNSUPPORTED',
|
|
39
|
+
not_enabled: 'DISABLED',
|
|
40
|
+
auth_failed: 'AUTH',
|
|
41
|
+
reading_error: 'READ'
|
|
42
|
+
};
|
|
43
|
+
const nfcErrorCode = (category, statusWord) => {
|
|
44
|
+
const part = NFC_CATEGORY_CODE[category ?? ''] ?? 'READ';
|
|
45
|
+
return statusWord ? `NFC-${part}-${statusWord}` : `NFC-${part}`;
|
|
46
|
+
};
|
|
27
47
|
/** Compute per-field check-digit pass/fail for a TD1 MRZ (best-effort). */
|
|
28
48
|
const computeTd1CheckDigits = mrzText => {
|
|
29
49
|
if (!mrzText) return undefined;
|
|
@@ -120,7 +140,10 @@ export const buildDiagnosticReport = params => {
|
|
|
120
140
|
|
|
121
141
|
// --- compact email body (always under MAX_BODY_BYTES) ---
|
|
122
142
|
const nfc = diag.nfc;
|
|
123
|
-
|
|
143
|
+
// Status word of the failing step (if any), used to build the reportable code.
|
|
144
|
+
const failingSw = nfc.failureStep ? nfc.steps.find(s => s.step === nfc.failureStep)?.sw : undefined;
|
|
145
|
+
const nfcCode = nfcErrorCode(nfc.errorCategory, failingSw);
|
|
146
|
+
const nfcLine = nfc.attempted ? `${nfc.authProtocol}${nfc.paceFellBackToBac ? '→BAC' : ''} · ${nfc.succeeded ? 'success' : `failed at ${nfc.failureStep ?? '?'} (${nfc.errorCategory ?? 'error'}) [${nfcCode}]`}` : 'not attempted';
|
|
124
147
|
const checksLine = checkDigits ? Object.entries(checkDigits).map(([k, v]) => `${k}:${v}`).join(' ') : 'n/a';
|
|
125
148
|
const body = ['TRUSTCHEX SCAN REPORT', `Device: ${device.brand} ${device.model} · ${device.systemName} ${device.systemVersion}${device.apiLevel ? ` (API ${device.apiLevel})` : ''}`, `SDK: ${sdkVersion} (build ${device.buildNumber}) · ${device.manufacturer} · ${device.deviceId}`, `Document: ${scanDataObj.documentType ?? 'unknown'} · source: ${scanDataObj.dataSource ?? 'unknown'}`, `MRZ: ${diag.mrz.reachedStable ? 'stable' : 'NOT stable'} after ${diag.mrz.framesProcessed} frames · checks: ${checksLine}`, `Camera: ${diag.camera.frames} frames · brightness ${diag.camera.avgBrightness} (low:${yesNo(diag.camera.hadLowBrightness)} blur:${yesNo(diag.camera.hadBlurryFrames)})`, `NFC: ${nfcLine}`, sessionId ? `Session: ${sessionId}` : '', '', 'Describe the issue here:', '', '', '— Full diagnostics and document images are attached. Please review before sending; do not edit the attachments. —'].filter(Boolean).join('\n');
|
|
126
149
|
const subject = `Trustchex scan report — ${scanDataObj.documentType ?? 'doc'} — ${device.brand} ${device.model} — v${sdkVersion}${sessionId ? ` — ${sessionId}` : ''}`;
|
|
@@ -100,7 +100,16 @@ export class DiagnosticsCollector {
|
|
|
100
100
|
|
|
101
101
|
nfcAttemptStarted() {
|
|
102
102
|
// A fresh attempt: bump retry count if a previous attempt left steps.
|
|
103
|
-
if (this.nfc.attempted)
|
|
103
|
+
if (this.nfc.attempted) {
|
|
104
|
+
this.nfc.retryCount += 1;
|
|
105
|
+
// A retry supersedes the prior attempt: that attempt's failure is stale,
|
|
106
|
+
// so clear it. The failure markers then reflect only the CURRENT attempt —
|
|
107
|
+
// a within-attempt failure (e.g. PACE failing before a BAC fallback in the
|
|
108
|
+
// same read) is retained, while a failure that a later retry recovered is
|
|
109
|
+
// not reported as the outcome.
|
|
110
|
+
this.nfc.failureStep = undefined;
|
|
111
|
+
this.nfc.errorCategory = undefined;
|
|
112
|
+
}
|
|
104
113
|
this.nfc.attempted = true;
|
|
105
114
|
}
|
|
106
115
|
nfcChipDetected() {
|
|
@@ -124,15 +133,28 @@ export class DiagnosticsCollector {
|
|
|
124
133
|
this.nfc.failureStep = step.step;
|
|
125
134
|
}
|
|
126
135
|
}
|
|
136
|
+
|
|
137
|
+
/** The first NFC step that failed in the current attempt (e.g. 'paceAuth',
|
|
138
|
+
* 'readDG2'), or undefined. Lets the caller build a step-specific error code
|
|
139
|
+
* without taking a full snapshot. */
|
|
140
|
+
getFailureStep() {
|
|
141
|
+
return this.nfc.failureStep;
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
/** APDU status word recorded for the failing step, if any (e.g. '6982'). */
|
|
145
|
+
getFailureStatusWord() {
|
|
146
|
+
const fs = this.nfc.failureStep;
|
|
147
|
+
if (!fs) return undefined;
|
|
148
|
+
return this.nfc.steps.find(s => s.step === fs && !s.ok)?.sw;
|
|
149
|
+
}
|
|
127
150
|
nfcResult(succeeded, errorCategory) {
|
|
128
151
|
this.nfc.succeeded = succeeded;
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
} else if (errorCategory) {
|
|
152
|
+
// Note: a failure recovered by a RETRY is already cleared in
|
|
153
|
+
// nfcAttemptStarted (the retry supersedes it). We deliberately do NOT clear
|
|
154
|
+
// here on success, so a within-attempt failure that a fallback recovered
|
|
155
|
+
// (e.g. PACE failing before BAC succeeds in the same read) stays visible in
|
|
156
|
+
// diagnostics — that is a meaningful signal, not the overall outcome.
|
|
157
|
+
if (!succeeded && errorCategory) {
|
|
136
158
|
this.nfc.errorCategory = errorCategory;
|
|
137
159
|
}
|
|
138
160
|
}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
import { NativeModules, Platform } from 'react-native';
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Native JPEG2000 decoder bridge.
|
|
7
|
+
*
|
|
8
|
+
* The passport chip portrait (DG2) is frequently stored as JPEG2000
|
|
9
|
+
* (image/jp2). React Native's <Image> renders a JP2 data URI on Android (its
|
|
10
|
+
* Fresco/Skia pipeline decodes it) but NOT on iOS (UIImage-backed <Image>
|
|
11
|
+
* refuses the data URI), so the chip photo showed as a placeholder on iOS.
|
|
12
|
+
*
|
|
13
|
+
* iOS's ImageIO *can* decode JPEG2000, so the native `ImageDecoderModule`
|
|
14
|
+
* round-trips the JP2 to JPEG. We only need this on iOS; on Android the raw
|
|
15
|
+
* JP2 already renders, so there is no native counterpart and we no-op.
|
|
16
|
+
*/
|
|
17
|
+
|
|
18
|
+
const ImageDecoder = NativeModules.ImageDecoderModule;
|
|
19
|
+
|
|
20
|
+
/**
|
|
21
|
+
* Decode a JPEG2000 buffer to JPEG using the native iOS decoder.
|
|
22
|
+
*
|
|
23
|
+
* Returns the JPEG bytes + mime type on success, or null when native decode is
|
|
24
|
+
* unavailable (Android, or the module isn't linked) or fails — callers should
|
|
25
|
+
* fall back to their existing behaviour (keep raw JP2).
|
|
26
|
+
*/
|
|
27
|
+
export async function decodeJp2ToJpeg(jp2Buffer) {
|
|
28
|
+
if (Platform.OS !== 'ios' || !ImageDecoder?.decodeJp2ToJpeg) {
|
|
29
|
+
return null;
|
|
30
|
+
}
|
|
31
|
+
try {
|
|
32
|
+
const jpegBase64 = await ImageDecoder.decodeJp2ToJpeg(jp2Buffer.toString('base64'));
|
|
33
|
+
if (!jpegBase64) {
|
|
34
|
+
return null;
|
|
35
|
+
}
|
|
36
|
+
return {
|
|
37
|
+
base64: jpegBase64,
|
|
38
|
+
mimeType: 'image/jpeg'
|
|
39
|
+
};
|
|
40
|
+
} catch {
|
|
41
|
+
return null;
|
|
42
|
+
}
|
|
43
|
+
}
|
|
@@ -30,6 +30,21 @@ const normalizeDocumentCode = code => {
|
|
|
30
30
|
return 'I';
|
|
31
31
|
};
|
|
32
32
|
|
|
33
|
+
/**
|
|
34
|
+
* Strip MRZ filler characters from a human-readable text field. In the MRZ a
|
|
35
|
+
* single `<` separates words and `<<` separates components; the `mrz` package
|
|
36
|
+
* usually trims trailing fillers but can leave embedded `<`/`<<` in name and
|
|
37
|
+
* optional-data fields, which then surfaced raw in the UI (e.g.
|
|
38
|
+
* "ANNA<<MARIA"). Convert any filler run to a single space and trim, so the
|
|
39
|
+
* displayed value reads "ANNA MARIA". Returns null for empty/filler-only input.
|
|
40
|
+
* Only for text fields — never call on dates, sex, codes, or check digits.
|
|
41
|
+
*/
|
|
42
|
+
const cleanMRZTextField = value => {
|
|
43
|
+
if (!value) return null;
|
|
44
|
+
const cleaned = value.replace(/</g, ' ').replace(/\s+/g, ' ').trim();
|
|
45
|
+
return cleaned.length > 0 ? cleaned : null;
|
|
46
|
+
};
|
|
47
|
+
|
|
33
48
|
/**
|
|
34
49
|
* Pads a TD1 line to the fixed 30-char width.
|
|
35
50
|
*
|
|
@@ -1264,14 +1279,16 @@ const validateMRZ = (mrzText, autocorrect = true) => {
|
|
|
1264
1279
|
issuingState: result.fields.issuingState || null,
|
|
1265
1280
|
documentNumber: result.fields.documentNumber || null,
|
|
1266
1281
|
nationality: result.fields.nationality || null,
|
|
1267
|
-
|
|
1268
|
-
|
|
1282
|
+
// Text fields can carry embedded MRZ filler (`<`/`<<`) — strip it so the
|
|
1283
|
+
// UI shows "ANNA MARIA", not "ANNA<<MARIA".
|
|
1284
|
+
lastName: cleanMRZTextField(result.fields.lastName),
|
|
1285
|
+
firstName: cleanMRZTextField(result.fields.firstName),
|
|
1269
1286
|
sex: result.fields.sex || null,
|
|
1270
1287
|
birthDate: result.fields.birthDate || null,
|
|
1271
1288
|
expirationDate: result.fields.expirationDate || null,
|
|
1272
|
-
personalNumber: result.fields.personalNumber
|
|
1273
|
-
optional1: result.fields.optional1
|
|
1274
|
-
optional2: result.fields.optional2
|
|
1289
|
+
personalNumber: cleanMRZTextField(result.fields.personalNumber),
|
|
1290
|
+
optional1: cleanMRZTextField(result.fields.optional1),
|
|
1291
|
+
optional2: cleanMRZTextField(result.fields.optional2)
|
|
1275
1292
|
};
|
|
1276
1293
|
return {
|
|
1277
1294
|
valid: true,
|
|
@@ -45,7 +45,20 @@ function convertName(rawName, map) {
|
|
|
45
45
|
return rawName.split(' ').map(word => applyDigraphMap(word, map)).join(' ');
|
|
46
46
|
}
|
|
47
47
|
export function buildDocumentName(rawFirst, rawLast, issuingState, dg11First, dg11Last) {
|
|
48
|
-
|
|
48
|
+
// Prefer DG11 (the chip's printed name in UTF-8) ONLY when it carries a proper
|
|
49
|
+
// two-part split — both a surname AND a given name. That is the authoritative
|
|
50
|
+
// correction for chips whose DG1 MRZ name lacks a `<<` separator (e.g. Turkish
|
|
51
|
+
// PACE passports), where the raw MRZ would otherwise put the full name into
|
|
52
|
+
// the surname.
|
|
53
|
+
//
|
|
54
|
+
// A one-sided DG11 result (only surname, or only given name) is NOT reliable —
|
|
55
|
+
// it usually means DG11 had no clear separator, so we don't know which part it
|
|
56
|
+
// is. Back-filling the missing side from the raw MRZ caused the given name to
|
|
57
|
+
// be duplicated into both fields, so we now fall through to the MRZ-based
|
|
58
|
+
// split instead, which is more trustworthy than mixing the two sources.
|
|
59
|
+
const hasFirst = (dg11First ?? '') !== '';
|
|
60
|
+
const hasLast = (dg11Last ?? '') !== '';
|
|
61
|
+
if (hasFirst && hasLast) {
|
|
49
62
|
return {
|
|
50
63
|
rawFirst,
|
|
51
64
|
rawLast,
|
|
@@ -50,6 +50,11 @@ export default {
|
|
|
50
50
|
'diagnosticReport.noticeBody': 'This opens a draft with your scan data, document images and technical details so support can help resolve a scanning issue. Review it before sending.',
|
|
51
51
|
'diagnosticReport.continue': 'Continue',
|
|
52
52
|
'diagnosticReport.cancel': 'Cancel',
|
|
53
|
+
'diagnosticReport.shareFailedTitle': "Couldn't open the share sheet",
|
|
54
|
+
'diagnosticReport.shareFailedBody': "We couldn't attach the report to share. Send it securely to support instead?",
|
|
55
|
+
'diagnosticReport.uploadAction': 'Send to support',
|
|
56
|
+
'diagnosticReport.uploadSuccess': 'Diagnostic report sent to support.',
|
|
57
|
+
'diagnosticReport.uploadFailed': "Couldn't send the report. Please try again later.",
|
|
53
58
|
'livenessDetectionScreen.guideHeader': 'Face Verification',
|
|
54
59
|
'livenessDetectionScreen.guideText': 'Please ensure the following for best results:',
|
|
55
60
|
'livenessDetectionScreen.guidePoint1': 'Remove glasses, hats, or face coverings',
|
|
@@ -72,6 +77,13 @@ export default {
|
|
|
72
77
|
'eidScannerScreen.guideHeader': 'NFC Document Scan',
|
|
73
78
|
'eidScannerScreen.guideText': 'When prompted, hold your document flat against the back of your device near the NFC antenna.',
|
|
74
79
|
'eidScannerScreen.invalidMRZFields': 'Document information could not be read. Please try again.',
|
|
80
|
+
'eidScannerScreen.error': 'Error',
|
|
81
|
+
'eidScannerScreen.errorCode': 'Error code',
|
|
82
|
+
'eidScannerScreen.nfcGenericError': 'Something went wrong while reading your document. Please try again. If the problem continues, contact support with the code below.',
|
|
83
|
+
'eidScannerScreen.nfcReadFailed': 'Could not read the chip. Hold the document flat against the back of your device and keep it still, then try again.',
|
|
84
|
+
'eidScannerScreen.nfcAuthFailed': 'Could not establish a secure connection to the chip. Make sure the document number, date of birth and expiry date are correct, then try again.',
|
|
85
|
+
'eidScannerScreen.nfcTagLost': 'Connection to the document was lost. Keep the document still against the device and try again.',
|
|
86
|
+
'eidScannerScreen.nfcTimeout': 'Reading the chip timed out. Hold the document steady against the device and try again.',
|
|
75
87
|
'eidScannerScreen.faceImageNotFound': 'Photo data not found on document.',
|
|
76
88
|
'eidScannerScreen.documentCode': 'Document Type',
|
|
77
89
|
'eidScannerScreen.nationality': 'Nationality',
|
|
@@ -50,6 +50,11 @@ export default {
|
|
|
50
50
|
'diagnosticReport.noticeBody': 'Bu işlem; tarama verilerinizi, belge görüntülerinizi ve teknik ayrıntıları içeren bir taslak açar; böylece destek ekibi tarama sorununu çözebilir. Göndermeden önce gözden geçirin.',
|
|
51
51
|
'diagnosticReport.continue': 'Devam et',
|
|
52
52
|
'diagnosticReport.cancel': 'İptal',
|
|
53
|
+
'diagnosticReport.shareFailedTitle': 'Paylaşım ekranı açılamadı',
|
|
54
|
+
'diagnosticReport.shareFailedBody': 'Raporu paylaşmak için ekleyemedik. Bunun yerine destek ekibine güvenli şekilde gönderelim mi?',
|
|
55
|
+
'diagnosticReport.uploadAction': 'Desteğe gönder',
|
|
56
|
+
'diagnosticReport.uploadSuccess': 'Tanılama raporu destek ekibine gönderildi.',
|
|
57
|
+
'diagnosticReport.uploadFailed': 'Rapor gönderilemedi. Lütfen daha sonra tekrar deneyin.',
|
|
53
58
|
'livenessDetectionScreen.guideHeader': 'Yüz Doğrulaması',
|
|
54
59
|
'livenessDetectionScreen.guideText': 'En iyi sonuç için lütfen şunları sağlayın:',
|
|
55
60
|
'livenessDetectionScreen.guidePoint1': 'Gözlük, şapka veya yüz aksesuarlarını çıkarın',
|
|
@@ -72,6 +77,13 @@ export default {
|
|
|
72
77
|
'eidScannerScreen.guideHeader': 'NFC Belge Taraması',
|
|
73
78
|
'eidScannerScreen.guideText': 'İstendiğinde, belgenizi cihazınızın arka tarafındaki NFC antenine düz bir şekilde yaklaştırın.',
|
|
74
79
|
'eidScannerScreen.invalidMRZFields': 'Belge bilgileri okunamadı. Lütfen tekrar deneyin.',
|
|
80
|
+
'eidScannerScreen.error': 'Hata',
|
|
81
|
+
'eidScannerScreen.errorCode': 'Hata kodu',
|
|
82
|
+
'eidScannerScreen.nfcGenericError': 'Belgeniz okunurken bir sorun oluştu. Lütfen tekrar deneyin. Sorun devam ederse aşağıdaki kod ile destek ekibimize başvurun.',
|
|
83
|
+
'eidScannerScreen.nfcReadFailed': 'Çip okunamadı. Belgeyi cihazınızın arkasına düz şekilde yaslayıp sabit tutun ve tekrar deneyin.',
|
|
84
|
+
'eidScannerScreen.nfcAuthFailed': 'Çip ile güvenli bağlantı kurulamadı. Belge numarası, doğum tarihi ve son geçerlilik tarihinin doğru olduğundan emin olup tekrar deneyin.',
|
|
85
|
+
'eidScannerScreen.nfcTagLost': 'Belge ile bağlantı kesildi. Belgeyi cihaza sabit tutun ve tekrar deneyin.',
|
|
86
|
+
'eidScannerScreen.nfcTimeout': 'Çip okuması zaman aşımına uğradı. Belgeyi cihaza sabit tutup tekrar deneyin.',
|
|
75
87
|
'eidScannerScreen.faceImageNotFound': 'Belgede fotoğraf verisi bulunamadı.',
|
|
76
88
|
'eidScannerScreen.documentCode': 'Belge Türü',
|
|
77
89
|
'eidScannerScreen.nationality': 'Uyruk',
|
package/lib/module/version.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"EIDScanner.d.ts","sourceRoot":"","sources":["../../../../../src/Shared/Components/EIDScanner.tsx"],"names":[],"mappings":"AAWA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"EIDScanner.d.ts","sourceRoot":"","sources":["../../../../../src/Shared/Components/EIDScanner.tsx"],"names":[],"mappings":"AAWA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAiBpD,UAAU,eAAe;IACvB,cAAc,EAAE,MAAM,CAAC;IACvB,WAAW,EAAE,MAAM,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,aAAa,CAAC,EAAE,CACd,OAAO,EAAE,SAAS,EAClB,SAAS,EAAE,MAAM,EACjB,iBAAiB,EAAE,MAAM,KACtB,IAAI,CAAC;IACV,cAAc,CAAC,EAAE,CAAC,SAAS,EAAE,OAAO,KAAK,IAAI,CAAC;CAC/C;AAED,QAAA,MAAM,UAAU,GAAI,6FAOjB,eAAe,4CAywBjB,CAAC;AA4NF,eAAe,UAAU,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"IdentityDocumentCamera.constants.d.ts","sourceRoot":"","sources":["../../../../../src/Shared/Components/IdentityDocumentCamera.constants.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,oBAAoB,KAAK,CAAC;AACvC,eAAO,MAAM,4BAA4B,OAAO,CAAC;AACjD,eAAO,MAAM,8BAA8B,IAAI,CAAC;AAChD,eAAO,MAAM,yBAAyB,MAAM,CAAC;AAC7C,eAAO,MAAM,gCAAgC,KAAK,CAAC;AAEnD,eAAO,MAAM,wBAAwB,KAAK,CAAC;AAC3C,eAAO,MAAM,wBAAwB,MAAM,CAAC;AAC5C,eAAO,MAAM,gCAAgC,KAAK,CAAC;AACnD,eAAO,MAAM,wBAAwB,OAAO,CAAC;AAC7C,eAAO,MAAM,0BAA0B,OAAO,CAAC;AAC/C,eAAO,MAAM,yBAAyB,OAAO,CAAC;AAE9C,eAAO,MAAM,6BAA6B,IAAI,CAAC;AAC/C,eAAO,MAAM,sCAAsC,IAAI,CAAC;AAExD,eAAO,MAAM,eAAe,QAAkC,CAAC;AAC/D,eAAO,MAAM,oBAAoB,QAAyB,CAAC;AAC3D,eAAO,MAAM,iBAAiB,QAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"IdentityDocumentCamera.constants.d.ts","sourceRoot":"","sources":["../../../../../src/Shared/Components/IdentityDocumentCamera.constants.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,oBAAoB,KAAK,CAAC;AACvC,eAAO,MAAM,4BAA4B,OAAO,CAAC;AACjD,eAAO,MAAM,8BAA8B,IAAI,CAAC;AAChD,eAAO,MAAM,yBAAyB,MAAM,CAAC;AAC7C,eAAO,MAAM,gCAAgC,KAAK,CAAC;AAEnD,eAAO,MAAM,wBAAwB,KAAK,CAAC;AAC3C,eAAO,MAAM,wBAAwB,MAAM,CAAC;AAC5C,eAAO,MAAM,gCAAgC,KAAK,CAAC;AACnD,eAAO,MAAM,wBAAwB,OAAO,CAAC;AAC7C,eAAO,MAAM,0BAA0B,OAAO,CAAC;AAC/C,eAAO,MAAM,yBAAyB,OAAO,CAAC;AAE9C,eAAO,MAAM,6BAA6B,IAAI,CAAC;AAC/C,eAAO,MAAM,sCAAsC,IAAI,CAAC;AAExD,eAAO,MAAM,eAAe,QAAkC,CAAC;AAC/D,eAAO,MAAM,oBAAoB,QAAyB,CAAC;AAC3D,eAAO,MAAM,iBAAiB,QAAsB,CAAC;AASrD,eAAO,MAAM,oBAAoB,QAAyC,CAAC;AAI3E,eAAO,MAAM,8BAA8B,IAAI,CAAC;AAChD,eAAO,MAAM,sBAAsB;;;;;;;;;;CAUzB,CAAC;AAKX,eAAO,MAAM,0BAA0B,MAAM,CAAC;AAC9C,eAAO,MAAM,gCAAgC,MAAM,CAAC;AACpD,eAAO,MAAM,2BAA2B,OAAO,CAAC;AAChD,eAAO,MAAM,mBAAmB,MAAM,CAAC;AACvC,eAAO,MAAM,mBAAmB,MAAM,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"IdentityDocumentCamera.d.ts","sourceRoot":"","sources":["../../../../../src/Shared/Components/IdentityDocumentCamera.tsx"],"names":[],"mappings":"AAyEA,OAAO,KAAK,EACV,mBAAmB,EACnB,SAAS,EACT,2BAA2B,EAK5B,MAAM,gCAAgC,CAAC;AAGxC,YAAY,EAAE,mBAAmB,EAAE,SAAS,EAAE,2BAA2B,EAAE,CAAC;AAC5E,YAAY,EAAE,YAAY,EAAE,MAAM,gCAAgC,CAAC;AAMnE,QAAA,MAAM,sBAAsB,GAAI,uDAI7B,2BAA2B,
|
|
1
|
+
{"version":3,"file":"IdentityDocumentCamera.d.ts","sourceRoot":"","sources":["../../../../../src/Shared/Components/IdentityDocumentCamera.tsx"],"names":[],"mappings":"AAyEA,OAAO,KAAK,EACV,mBAAmB,EACnB,SAAS,EACT,2BAA2B,EAK5B,MAAM,gCAAgC,CAAC;AAGxC,YAAY,EAAE,mBAAmB,EAAE,SAAS,EAAE,2BAA2B,EAAE,CAAC;AAC5E,YAAY,EAAE,YAAY,EAAE,MAAM,gCAAgC,CAAC;AAMnE,QAAA,MAAM,sBAAsB,GAAI,uDAI7B,2BAA2B,4CAmjF7B,CAAC;AAiIF,eAAe,sBAAsB,CAAC"}
|
|
@@ -83,6 +83,17 @@ export declare function handleIDBackFlow(mrzText: string | null, mrzFields: MRZF
|
|
|
83
83
|
*
|
|
84
84
|
* PASSPORT: → COMPLETED (no back side)
|
|
85
85
|
* ID CARD: → SCAN_ID_BACK
|
|
86
|
+
*
|
|
87
|
+
* Routing is PASSPORT-BIASED on purpose: a passport has no back side, so if we
|
|
88
|
+
* route it to SCAN_ID_BACK it deadlocks forever waiting for a back that will
|
|
89
|
+
* never appear. We therefore only go to SCAN_ID_BACK when there is POSITIVE
|
|
90
|
+
* evidence the document is an ID card (a parsed MRZ document code that is
|
|
91
|
+
* present and not 'P'). When the type is ambiguous — e.g. the passport MRZ was
|
|
92
|
+
* never read as 'P' so the front step locked `detectedDocumentType` as
|
|
93
|
+
* 'ID_FRONT' (the torch/tilt during hologram capture makes the MRZ unreadable),
|
|
94
|
+
* or no MRZ code survived at all — we COMPLETE rather than wait for a
|
|
95
|
+
* non-existent back side. A two-sided ID card always yields an 'I'/'A'/'C'
|
|
96
|
+
* (non-'P') MRZ code, so genuine ID cards still route to SCAN_ID_BACK.
|
|
86
97
|
*/
|
|
87
98
|
export declare function getNextStepAfterHologram(detectedDocumentType: 'ID_FRONT' | 'ID_BACK' | 'PASSPORT' | 'UNKNOWN', currentFrameDocType: 'ID_FRONT' | 'ID_BACK' | 'PASSPORT' | 'UNKNOWN', mrzDocCode: string | undefined): 'COMPLETED' | 'SCAN_ID_BACK';
|
|
88
99
|
//# sourceMappingURL=IdentityDocumentCamera.flows.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"IdentityDocumentCamera.flows.d.ts","sourceRoot":"","sources":["../../../../../src/Shared/Components/IdentityDocumentCamera.flows.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AAEH,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,gCAAgC,CAAC;AAC3D,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAUpD,MAAM,WAAW,kBAAkB;IACjC,aAAa,EAAE,OAAO,CAAC;IACvB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EACP,mBAAmB,GACnB,cAAc,GACd,qBAAqB,GACrB,sBAAsB,CAAC;CAC5B;AAED,MAAM,WAAW,iBAAiB;IAChC,aAAa,EAAE,OAAO,CAAC;IACvB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EACP,mBAAmB,GACnB,oBAAoB,GACpB,qBAAqB,CAAC;CAC3B;AAED,MAAM,WAAW,gBAAgB;IAC/B,aAAa,EAAE,OAAO,CAAC;IACvB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,cAAc,GAAG,kBAAkB,GAAG,sBAAsB,CAAC;CAC3E;AAED;;;;;;;;GAQG;AACH,wBAAgB,kBAAkB,CAChC,KAAK,EAAE,IAAI,EAAE,EACb,OAAO,EAAE,MAAM,GAAG,IAAI,EACtB,SAAS,EAAE,SAAS,GAAG,SAAS,EAChC,iBAAiB,EAAE,OAAO,EAC1B,WAAW,EAAE,OAAO,EACpB,iBAAiB,EAAE,OAAO,EAC1B,YAAY,EAAE,OAAO,GACpB,kBAAkB,CAgEpB;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,iBAAiB,CAC/B,KAAK,EAAE,IAAI,EAAE,EACb,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,MAAM,GAAG,IAAI,EACtB,SAAS,EAAE,SAAS,GAAG,SAAS,EAChC,UAAU,EAAE,MAAM,GACjB,iBAAiB,CA0EnB;AAED;;;;;;;GAOG;AACH,wBAAgB,gBAAgB,CAC9B,OAAO,EAAE,MAAM,GAAG,IAAI,EACtB,SAAS,EAAE,SAAS,GAAG,SAAS,EAChC,QAAQ,EAAE,OAAO,EACjB,iBAAiB,EAAE,OAAO,EAC1B,iBAAiB,EAAE,OAAO,EAC1B,YAAY,EAAE,MAAM,GAAG,SAAS,EAChC,WAAW,EAAE,OAAO,GACnB,gBAAgB,CA2DlB;AAED
|
|
1
|
+
{"version":3,"file":"IdentityDocumentCamera.flows.d.ts","sourceRoot":"","sources":["../../../../../src/Shared/Components/IdentityDocumentCamera.flows.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AAEH,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,gCAAgC,CAAC;AAC3D,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAUpD,MAAM,WAAW,kBAAkB;IACjC,aAAa,EAAE,OAAO,CAAC;IACvB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EACP,mBAAmB,GACnB,cAAc,GACd,qBAAqB,GACrB,sBAAsB,CAAC;CAC5B;AAED,MAAM,WAAW,iBAAiB;IAChC,aAAa,EAAE,OAAO,CAAC;IACvB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EACP,mBAAmB,GACnB,oBAAoB,GACpB,qBAAqB,CAAC;CAC3B;AAED,MAAM,WAAW,gBAAgB;IAC/B,aAAa,EAAE,OAAO,CAAC;IACvB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,cAAc,GAAG,kBAAkB,GAAG,sBAAsB,CAAC;CAC3E;AAED;;;;;;;;GAQG;AACH,wBAAgB,kBAAkB,CAChC,KAAK,EAAE,IAAI,EAAE,EACb,OAAO,EAAE,MAAM,GAAG,IAAI,EACtB,SAAS,EAAE,SAAS,GAAG,SAAS,EAChC,iBAAiB,EAAE,OAAO,EAC1B,WAAW,EAAE,OAAO,EACpB,iBAAiB,EAAE,OAAO,EAC1B,YAAY,EAAE,OAAO,GACpB,kBAAkB,CAgEpB;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,iBAAiB,CAC/B,KAAK,EAAE,IAAI,EAAE,EACb,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,MAAM,GAAG,IAAI,EACtB,SAAS,EAAE,SAAS,GAAG,SAAS,EAChC,UAAU,EAAE,MAAM,GACjB,iBAAiB,CA0EnB;AAED;;;;;;;GAOG;AACH,wBAAgB,gBAAgB,CAC9B,OAAO,EAAE,MAAM,GAAG,IAAI,EACtB,SAAS,EAAE,SAAS,GAAG,SAAS,EAChC,QAAQ,EAAE,OAAO,EACjB,iBAAiB,EAAE,OAAO,EAC1B,iBAAiB,EAAE,OAAO,EAC1B,YAAY,EAAE,MAAM,GAAG,SAAS,EAChC,WAAW,EAAE,OAAO,GACnB,gBAAgB,CA2DlB;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,wBAAwB,CACtC,oBAAoB,EAAE,UAAU,GAAG,SAAS,GAAG,UAAU,GAAG,SAAS,EACrE,mBAAmB,EAAE,UAAU,GAAG,SAAS,GAAG,UAAU,GAAG,SAAS,EACpE,UAAU,EAAE,MAAM,GAAG,SAAS,GAC7B,WAAW,GAAG,cAAc,CAqB9B"}
|
|
@@ -42,7 +42,7 @@ export declare function transformBoundsToScreen(bounds: {
|
|
|
42
42
|
* Unified status message logic used by both voice guidance and render text.
|
|
43
43
|
* Returns the appropriate i18n key arguments for the current scan state.
|
|
44
44
|
*/
|
|
45
|
-
export declare function getStatusMessage(nextStep: ScanStep, status: ScanStatus, detectedDocumentType: DocumentType, isBrightnessLow: boolean, isFrameBlurry: boolean, allElementsDetected: boolean, elementsOutsideScanArea: string[], t: (key: string, params?: Record<string, unknown>) => string
|
|
45
|
+
export declare function getStatusMessage(nextStep: ScanStep, status: ScanStatus, detectedDocumentType: DocumentType, isBrightnessLow: boolean, isFrameBlurry: boolean, allElementsDetected: boolean, elementsOutsideScanArea: string[], t: (key: string, params?: Record<string, unknown>) => string): string;
|
|
46
46
|
/**
|
|
47
47
|
* Calculate angle from two points in degrees
|
|
48
48
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"IdentityDocumentCamera.utils.d.ts","sourceRoot":"","sources":["../../../../../src/Shared/Components/IdentityDocumentCamera.utils.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,QAAQ,EACR,UAAU,EACV,YAAY,EACZ,IAAI,EACL,MAAM,gCAAgC,CAAC;AACxC,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAOpD;;;GAGG;AACH,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,OAAO,CAG7E;AAED;;GAEG;AACH,wBAAgB,yBAAyB,CACvC,UAAU,EAAE,MAAM,EAClB,WAAW,EAAE,MAAM;;;;;EAmBpB;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,UAAU,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM;;;;;sBAW9C,MAAM,KAAK,MAAM,KAAK,MAAM,KAAK,MAAM;EAIjE;AAED;;GAEG;AACH,wBAAgB,uBAAuB,CACrC,MAAM,EAAE;IAAE,CAAC,EAAE,MAAM,CAAC;IAAC,CAAC,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,EAC/D,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,MAAM;;;;;EAQhB;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAC9B,QAAQ,EAAE,QAAQ,EAClB,MAAM,EAAE,UAAU,EAClB,oBAAoB,EAAE,YAAY,EAClC,eAAe,EAAE,OAAO,EACxB,aAAa,EAAE,OAAO,EACtB,mBAAmB,EAAE,OAAO,EAC5B,uBAAuB,EAAE,MAAM,EAAE,EACjC,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,MAAM,
|
|
1
|
+
{"version":3,"file":"IdentityDocumentCamera.utils.d.ts","sourceRoot":"","sources":["../../../../../src/Shared/Components/IdentityDocumentCamera.utils.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,6 +1,9 @@
|
|
|
1
1
|
import { InputStream } from './java/inputStream';
|
|
2
2
|
import type { FileSystemStructured } from './smartcards/fileSystemStructured';
|
|
3
3
|
export declare class CardFileInputStream extends InputStream {
|
|
4
|
+
/** Max re-issues of a single block read before failing — mitigates transient
|
|
5
|
+
* iOS NFC transceive drops during large-file reads (e.g. DG2). */
|
|
6
|
+
private static readonly MAX_BLOCK_READ_RETRIES;
|
|
4
7
|
private path;
|
|
5
8
|
private buffer;
|
|
6
9
|
private bufferLength;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cardFileInputStream.d.ts","sourceRoot":"","sources":["../../../../../src/Shared/EIDReader/cardFileInputStream.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,mCAAmC,CAAC;AAG9E,qBAAa,mBAAoB,SAAQ,WAAW;IAClD,OAAO,CAAC,IAAI,CAAc;IAC1B,OAAO,CAAC,MAAM,CAAU;IACxB,OAAO,CAAC,YAAY,CAAU;IAC9B,OAAO,CAAC,kBAAkB,CAAU;IACpC,OAAO,CAAC,cAAc,CAAU;IAChC,OAAO,CAAC,YAAY,CAAU;IAC9B,OAAO,CAAC,UAAU,CAAU;IAC5B,OAAO,CAAC,EAAE,CAAuB;IACjC,OAAO,CAAC,YAAY,CAAS;gBAEjB,YAAY,EAAE,MAAM,EAAE,EAAE,EAAE,oBAAoB;IAMpD,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAgBrB,IAAI;
|
|
1
|
+
{"version":3,"file":"cardFileInputStream.d.ts","sourceRoot":"","sources":["../../../../../src/Shared/EIDReader/cardFileInputStream.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,mCAAmC,CAAC;AAG9E,qBAAa,mBAAoB,SAAQ,WAAW;IAClD;uEACmE;IACnE,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,sBAAsB,CAAK;IAEnD,OAAO,CAAC,IAAI,CAAc;IAC1B,OAAO,CAAC,MAAM,CAAU;IACxB,OAAO,CAAC,YAAY,CAAU;IAC9B,OAAO,CAAC,kBAAkB,CAAU;IACpC,OAAO,CAAC,cAAc,CAAU;IAChC,OAAO,CAAC,YAAY,CAAU;IAC9B,OAAO,CAAC,UAAU,CAAU;IAC5B,OAAO,CAAC,EAAE,CAAuB;IACjC,OAAO,CAAC,YAAY,CAAS;gBAEjB,YAAY,EAAE,MAAM,EAAE,EAAE,EAAE,oBAAoB;IAMpD,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAgBrB,IAAI;IA2EV,IAAI,CAAC,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAahC,SAAS,IAAI,MAAM;IAInB,IAAI,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI;IAI9B,KAAK,IAAI,IAAI;IAUb,aAAa,IAAI,OAAO;IAIxB,SAAS,IAAI,MAAM;IAInB,WAAW,IAAI,MAAM;YAIP,kBAAkB;IA+BhC,OAAO,CAAC,YAAY;CAoBrB"}
|
|
@@ -15,6 +15,10 @@ export declare class DefaultFileSystem implements FileSystemStructured {
|
|
|
15
15
|
private wrapper;
|
|
16
16
|
private oldWrapper;
|
|
17
17
|
constructor(service: APDULevelReadBinaryCapable, isSFIEnabled: boolean, fidToSFI?: Map<number, number>);
|
|
18
|
+
/** Deep-copy a secure-messaging wrapper PRESERVING its cipher type (AES vs
|
|
19
|
+
* 3DES), so the SSC can be rewound for a retry without changing the MAC/enc
|
|
20
|
+
* algorithm. Non-SM wrappers are returned as-is. */
|
|
21
|
+
private cloneWrapper;
|
|
18
22
|
setWrapper(wrapper: APDUWrapper): void;
|
|
19
23
|
getWrapper(): APDUWrapper;
|
|
20
24
|
getMaxReadBinaryLength(): number;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"defaultFileSystem.d.ts","sourceRoot":"","sources":["../../../../../src/Shared/EIDReader/defaultFileSystem.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,8BAA8B,CAAC;AAG/E,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"defaultFileSystem.d.ts","sourceRoot":"","sources":["../../../../../src/Shared/EIDReader/defaultFileSystem.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,8BAA8B,CAAC;AAG/E,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAKtC,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAK5D,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,mCAAmC,CAAC;AAE9E,qBAAa,iBAAkB,YAAW,oBAAoB;IAC5D,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAc;IAC5C,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,iBAAiB,CAAa;IAEtD,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,YAAY,CAAU;IAC9B,OAAO,CAAC,mBAAmB,CAAS;IACpC,OAAO,CAAC,UAAU,CAAU;IAC5B,OAAO,CAAC,OAAO,CAA6B;IAC5C,OAAO,CAAC,SAAS,CAA+B;IAChD,OAAO,CAAC,QAAQ,CAAsB;IACtC,OAAO,CAAC,OAAO,CAAe;IAC9B,OAAO,CAAC,UAAU,CAAe;gBAG/B,OAAO,EAAE,0BAA0B,EACnC,YAAY,EAAE,OAAO,EACrB,QAAQ,GAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAA6B;IAsB3D;;yDAEqD;IACrD,OAAO,CAAC,YAAY;IAgBb,UAAU,CAAC,OAAO,EAAE,WAAW,GAAG,IAAI;IAKtC,UAAU;IAIV,sBAAsB,IAAI,MAAM;IAI1B,eAAe,IAAI,OAAO,CAAC,QAAQ,EAAE,GAAG,IAAI,CAAC;IASnD,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI;IAQvB,UAAU,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC;YA2G9D,WAAW;YA4DX,cAAc;IAI5B,OAAO,CAAC,mBAAmB;IAqB3B,OAAO,CAAC,cAAc;YAgBR,aAAa;CAgC5B"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"eidReader.d.ts","sourceRoot":"","sources":["../../../../../src/Shared/EIDReader/eidReader.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"eidReader.d.ts","sourceRoot":"","sources":["../../../../../src/Shared/EIDReader/eidReader.ts"],"names":[],"mappings":"AAUA,OAAO,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAyY7C,QAAA,MAAM,SAAS,GACb,gBAAgB,MAAM,EACtB,aAAa,MAAM,EACnB,cAAc,MAAM,EACpB,mBAAmB,CAAC,QAAQ,EAAE,MAAM,KAAK,IAAI,KAC5C,OAAO,CACN;IACE,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;CAC7B,GACD,SAAS,CA+XZ,CAAC;AAEF,OAAO,EAAE,SAAS,EAAE,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dg11File.d.ts","sourceRoot":"","sources":["../../../../../../../src/Shared/EIDReader/lds/icao/dg11File.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAErD,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAEzC;;;;;;;;;;;GAWG;AACH,qBAAa,QAAS,SAAQ,SAAS;IACrC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAQ;IACxC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,YAAY,CAAQ;IAC5C,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,kBAAkB,CAAU;IAEpD,OAAO,CAAC,SAAS,CAAuB;IACxC,OAAO,CAAC,QAAQ,CAAuB;gBAE3B,EAAE,CAAC,EAAE,WAAW;IAI5B,gEAAgE;IAChE,YAAY,IAAI,MAAM,GAAG,IAAI;IAI7B,+DAA+D;IAC/D,WAAW,IAAI,MAAM,GAAG,IAAI;IAItB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;cAIX,WAAW,CAAC,WAAW,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC;IAyBpE,SAAS,CAAC,YAAY,IAAI,IAAI;IAI9B;;;OAGG;IACH,OAAO,CAAC,SAAS;
|
|
1
|
+
{"version":3,"file":"dg11File.d.ts","sourceRoot":"","sources":["../../../../../../../src/Shared/EIDReader/lds/icao/dg11File.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAErD,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAEzC;;;;;;;;;;;GAWG;AACH,qBAAa,QAAS,SAAQ,SAAS;IACrC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAQ;IACxC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,YAAY,CAAQ;IAC5C,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,kBAAkB,CAAU;IAEpD,OAAO,CAAC,SAAS,CAAuB;IACxC,OAAO,CAAC,QAAQ,CAAuB;gBAE3B,EAAE,CAAC,EAAE,WAAW;IAI5B,gEAAgE;IAChE,YAAY,IAAI,MAAM,GAAG,IAAI;IAI7B,+DAA+D;IAC/D,WAAW,IAAI,MAAM,GAAG,IAAI;IAItB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;cAIX,WAAW,CAAC,WAAW,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC;IAyBpE,SAAS,CAAC,YAAY,IAAI,IAAI;IAI9B;;;OAGG;IACH,OAAO,CAAC,SAAS;CAgClB"}
|
|
@@ -5,9 +5,17 @@ export declare class NFCManagerCardService extends CardService {
|
|
|
5
5
|
private isOpened;
|
|
6
6
|
open(): Promise<void>;
|
|
7
7
|
getIsOpen(): boolean;
|
|
8
|
+
private sessionRestartEnabled;
|
|
9
|
+
setSessionRestartEnabled(enabled: boolean): void;
|
|
8
10
|
transmit(commandAPDU: CommandAPDU): Promise<ResponseAPDU>;
|
|
9
11
|
getATR(): Uint8Array;
|
|
10
|
-
getIsConnectionLost(
|
|
12
|
+
getIsConnectionLost(error: Error): boolean;
|
|
13
|
+
/** True if the error looks like a dropped/timed-out CoreNFC tag connection
|
|
14
|
+
* (as opposed to a real APDU/crypto failure). */
|
|
15
|
+
isTagLost(error: unknown): boolean;
|
|
16
|
+
/** Re-establish the CoreNFC session (iOS) so a fresh handshake can be retried
|
|
17
|
+
* after a tag drop. No-op on Android. Best-effort. */
|
|
18
|
+
restartSession(): Promise<void>;
|
|
11
19
|
close(): Promise<void>;
|
|
12
20
|
}
|
|
13
21
|
//# sourceMappingURL=nfcManagerCardService.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"nfcManagerCardService.d.ts","sourceRoot":"","sources":["../../../../../src/Shared/EIDReader/nfcManagerCardService.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AACvD,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;
|
|
1
|
+
{"version":3,"file":"nfcManagerCardService.d.ts","sourceRoot":"","sources":["../../../../../src/Shared/EIDReader/nfcManagerCardService.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AACvD,OAAO,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAiCzD,qBAAa,qBAAsB,SAAQ,WAAW;IACpD,OAAO,CAAC,QAAQ,CAAS;IACZ,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAc3B,SAAS,IAAI,OAAO;IAQ3B,OAAO,CAAC,qBAAqB,CAAS;IAE/B,wBAAwB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI;IAI1C,QAAQ,CAAC,WAAW,EAAE,WAAW,GAAG,OAAO,CAAC,YAAY,CAAC;IAwC/D,MAAM,IAAI,UAAU;IAIpB,mBAAmB,CAAC,KAAK,EAAE,KAAK,GAAG,OAAO;IAKjD;sDACkD;IAC3C,SAAS,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO;IAIzC;2DACuD;IAC1C,cAAc,IAAI,OAAO,CAAC,IAAI,CAAC;IAM/B,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;CAIpC"}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* DH (modular exponentiation, non-EC) primitives for PACE Generic Mapping.
|
|
3
|
+
*
|
|
4
|
+
* Modern ePassports/eIDs use ECDH almost universally; a minority of documents
|
|
5
|
+
* negotiate classic DH PACE. This module provides the DH math as pure,
|
|
6
|
+
* unit-testable functions so it can be verified against the ICAO 9303 Part 11
|
|
7
|
+
* worked example before it ever touches a chip. It is deliberately separate from
|
|
8
|
+
* the EC path in paceProtocol.ts — the working ECDH handshake is not modified.
|
|
9
|
+
*
|
|
10
|
+
* References: ICAO Doc 9303 Part 11 §4.4.3.2 (Generic Mapping), BSI TR-03110
|
|
11
|
+
* Part 3 §3.3.1, RFC 5114 (standardized MODP groups), TR-03110 Table A.1
|
|
12
|
+
* (standardized domain parameter IDs 0–7).
|
|
13
|
+
*/
|
|
14
|
+
/** A DH group: safe-prime modulus p, generator g, and subgroup order q. */
|
|
15
|
+
export interface DHGroup {
|
|
16
|
+
/** prime modulus */
|
|
17
|
+
p: bigint;
|
|
18
|
+
/** generator */
|
|
19
|
+
g: bigint;
|
|
20
|
+
/** subgroup order (q) — used to size exponents */
|
|
21
|
+
q: bigint;
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Standardized DH domain parameters by TR-03110 parameter ID.
|
|
25
|
+
* 0 → RFC 5114 §2.1 1024-bit MODP Group with 160-bit Prime Order Subgroup
|
|
26
|
+
* 1 → RFC 5114 §2.2 2048-bit MODP Group with 224-bit Prime Order Subgroup
|
|
27
|
+
* 2 → RFC 5114 §2.3 2048-bit MODP Group with 256-bit Prime Order Subgroup
|
|
28
|
+
* (IDs 3–7 are reserved/unused in practice; EC params start at 8.)
|
|
29
|
+
*/
|
|
30
|
+
export declare const DH_GROUPS: Record<number, DHGroup>;
|
|
31
|
+
/**
|
|
32
|
+
* PACE DH Generic Mapping (ICAO 9303 Part 11 §4.4.3.2):
|
|
33
|
+
* shared secret h = PK_PICC ^ SK_PCD mod p
|
|
34
|
+
* mapped generator g~ = g^s · h mod p
|
|
35
|
+
* where s is the decrypted PICC nonce (a big-endian integer).
|
|
36
|
+
*
|
|
37
|
+
* Pure function over the group + the three inputs, so it can be checked against
|
|
38
|
+
* the ICAO worked example. `pkPicc` is the PICC mapping public key; `skPcd` the
|
|
39
|
+
* PCD mapping private key; `nonce` the decrypted nonce s.
|
|
40
|
+
*/
|
|
41
|
+
export declare const dhGenericMapping: (group: DHGroup, skPcd: bigint, pkPicc: bigint, nonce: bigint) => {
|
|
42
|
+
sharedH: bigint;
|
|
43
|
+
mappedGenerator: bigint;
|
|
44
|
+
};
|
|
45
|
+
/**
|
|
46
|
+
* DH key agreement with a mapped generator (PACE step 3):
|
|
47
|
+
* PK = g~ ^ SK mod p (public key to send)
|
|
48
|
+
* K = PK_PICC ^ SK mod p (shared secret)
|
|
49
|
+
*/
|
|
50
|
+
export declare const dhPublicKey: (group: DHGroup, mappedGenerator: bigint, sk: bigint) => bigint;
|
|
51
|
+
export declare const dhSharedSecret: (group: DHGroup, pkPicc: bigint, sk: bigint) => bigint;
|
|
52
|
+
/** Square-and-multiply modular exponentiation (constant-shape, bigint). */
|
|
53
|
+
export declare function modPow(base: bigint, exp: bigint, mod: bigint): bigint;
|
|
54
|
+
/** Fixed-width big-endian byte encoding of a DH value (left-padded to p's size). */
|
|
55
|
+
export declare const dhEncode: (value: bigint, group: DHGroup) => Buffer;
|
|
56
|
+
//# sourceMappingURL=paceDH.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"paceDH.d.ts","sourceRoot":"","sources":["../../../../../../src/Shared/EIDReader/protocol/paceDH.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,2EAA2E;AAC3E,MAAM,WAAW,OAAO;IACtB,oBAAoB;IACpB,CAAC,EAAE,MAAM,CAAC;IACV,gBAAgB;IAChB,CAAC,EAAE,MAAM,CAAC;IACV,kDAAkD;IAClD,CAAC,EAAE,MAAM,CAAC;CACX;AAID;;;;;;GAMG;AACH,eAAO,MAAM,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAoF7C,CAAC;AAEF;;;;;;;;;GASG;AACH,eAAO,MAAM,gBAAgB,GAC3B,OAAO,OAAO,EACd,OAAO,MAAM,EACb,QAAQ,MAAM,EACd,OAAO,MAAM,KACZ;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,eAAe,EAAE,MAAM,CAAA;CAK5C,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,WAAW,GACtB,OAAO,OAAO,EACd,iBAAiB,MAAM,EACvB,IAAI,MAAM,KACT,MAA8C,CAAC;AAElD,eAAO,MAAM,cAAc,GACzB,OAAO,OAAO,EACd,QAAQ,MAAM,EACd,IAAI,MAAM,KACT,MAAqC,CAAC;AAEzC,2EAA2E;AAC3E,wBAAgB,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,CAWrE;AAED,oFAAoF;AACpF,eAAO,MAAM,QAAQ,GAAI,OAAO,MAAM,EAAE,OAAO,OAAO,KAAG,MASxD,CAAC"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Typed PACE errors.
|
|
3
|
+
*
|
|
4
|
+
* The point is to let the caller distinguish a PACE CAPABILITY gap (this build
|
|
5
|
+
* cannot run the variant the chip advertises — e.g. DH agreement, CAM mapping,
|
|
6
|
+
* an unregistered curve) from a RUNTIME failure (wrong key, tag lost, APDU
|
|
7
|
+
* error). Both fall back to BAC, but the diagnostics reason must differ so we
|
|
8
|
+
* can tell "we don't support this document's PACE" from "the read went wrong".
|
|
9
|
+
*/
|
|
10
|
+
/** Why a PACE attempt could not even be run by this implementation. */
|
|
11
|
+
export type PACEUnsupportedReason = 'agreement' | 'mapping' | 'curve' | 'cipher';
|
|
12
|
+
/**
|
|
13
|
+
* Thrown when the chip advertises a PACE variant this build cannot perform.
|
|
14
|
+
* Carries a coarse, non-PII reason that maps directly to a diagnostics fallback
|
|
15
|
+
* reason (`pace_unsupported_<reason>`), so support can see exactly which
|
|
16
|
+
* capability was missing for a given document.
|
|
17
|
+
*/
|
|
18
|
+
export declare class PACEUnsupportedError extends Error {
|
|
19
|
+
readonly paceUnsupported = true;
|
|
20
|
+
readonly reason: PACEUnsupportedReason;
|
|
21
|
+
constructor(reason: PACEUnsupportedReason, detail: string);
|
|
22
|
+
}
|
|
23
|
+
/** Type guard usable across module boundaries (instanceof is unreliable after
|
|
24
|
+
* transpilation/bundling, so we also check the marker flag). */
|
|
25
|
+
export declare const isPACEUnsupportedError: (e: unknown) => e is PACEUnsupportedError;
|
|
26
|
+
//# sourceMappingURL=paceErrors.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"paceErrors.d.ts","sourceRoot":"","sources":["../../../../../../src/Shared/EIDReader/protocol/paceErrors.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,uEAAuE;AACvE,MAAM,MAAM,qBAAqB,GAC7B,WAAW,GACX,SAAS,GACT,OAAO,GACP,QAAQ,CAAC;AAEb;;;;;GAKG;AACH,qBAAa,oBAAqB,SAAQ,KAAK;IAC7C,QAAQ,CAAC,eAAe,QAAQ;IAChC,QAAQ,CAAC,MAAM,EAAE,qBAAqB,CAAC;gBAE3B,MAAM,EAAE,qBAAqB,EAAE,MAAM,EAAE,MAAM;CAK1D;AAED;iEACiE;AACjE,eAAO,MAAM,sBAAsB,GAAI,GAAG,OAAO,KAAG,CAAC,IAAI,oBAIS,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"paceProtocol.d.ts","sourceRoot":"","sources":["../../../../../../src/Shared/EIDReader/protocol/paceProtocol.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,yBAAyB,CAAC;AACpE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACtD,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,2BAA2B,CAAC;
|
|
1
|
+
{"version":3,"file":"paceProtocol.d.ts","sourceRoot":"","sources":["../../../../../../src/Shared/EIDReader/protocol/paceProtocol.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,yBAAyB,CAAC;AACpE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACtD,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,2BAA2B,CAAC;AAKxE,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAoI1C;;;;;GAKG;AACH,qBAAa,YAAY;IACvB,OAAO,CAAC,OAAO,CAAuB;IACtC,OAAO,CAAC,OAAO,CAAgC;IAC/C,OAAO,CAAC,8BAA8B,CAAS;IAC/C,OAAO,CAAC,qCAAqC,CAAS;IACtD,OAAO,CAAC,cAAc,CAAU;gBAG9B,OAAO,EAAE,oBAAoB,EAC7B,OAAO,EAAE,sBAAsB,GAAG,IAAI,EACtC,8BAA8B,EAAE,MAAM,EACtC,qCAAqC,EAAE,MAAM,EAC7C,cAAc,EAAE,OAAO;IAUzB;;;;;;OAMG;IACU,MAAM,CACjB,SAAS,EAAE,aAAa,EACxB,GAAG,EAAE,MAAM,EACX,WAAW,EAAE,MAAM,GAAG,IAAI,EAC1B,gBAAgB,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,IAAI,GAC5C,OAAO,CAAC,UAAU,CAAC;IAyKtB;;OAEG;YACW,WAAW;IAoCzB;;;OAGG;YACW,aAAa;IAmE3B;;;;;OAKG;YACW,aAAa;IAyD3B;;;OAGG;YACW,WAAW;IA+EzB;;;OAGG;YACW,WAAW;IAqDzB;;;;OAIG;IACH,OAAO,CAAC,MAAM,CAAC,6BAA6B;IA4B5C,OAAO,CAAC,MAAM,CAAC,iBAAiB;IAUhC;;OAEG;IACH,OAAO,CAAC,MAAM,CAAC,0BAA0B;IAczC;;OAEG;WACW,mBAAmB,CAC/B,SAAS,EAAE,aAAa,EACxB,SAAS,EAAE,MAAM,EACjB,SAAS,EAAE,MAAM,EACjB,UAAU,EAAE,MAAM,GACjB,MAAM;IAoBT,OAAO,CAAC,MAAM,CAAC,iBAAiB;IAQhC,OAAO,CAAC,MAAM,CAAC,aAAa;IAY5B,OAAO,CAAC,MAAM,CAAC,UAAU;IAMzB,OAAO,CAAC,MAAM,CAAC,cAAc;IA+B7B;;OAEG;IACH,OAAO,CAAC,MAAM,CAAC,MAAM;IAcrB;;;;;;;;;;;OAWG;IACH,OAAO,CAAC,MAAM,CAAC,oBAAoB;IAwDnC;;;;;;;;;OASG;IACH,OAAO,CAAC,MAAM,CAAC,gBAAgB;IAgE/B,OAAO,CAAC,MAAM,CAAC,IAAI;IAWnB;;OAEG;WACW,YAAY,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM;CAgCxD"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"readBinaryAPDUSender.d.ts","sourceRoot":"","sources":["../../../../../../src/Shared/EIDReader/protocol/readBinaryAPDUSender.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,+BAA+B,CAAC;AAChF,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAC7C,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AAO7D,qBAAa,oBAAqB,YAAW,0BAA0B;IACrE,OAAO,CAAC,qBAAqB,CAA4B;IACzD,OAAO,CAAC,OAAO,CAAc;gBAEjB,OAAO,EAAE,WAAW;IAKnB,gBAAgB,CAAC,OAAO,EAAE,WAAW,GAAG,IAAI,EAAE,GAAG,EAAE,UAAU;IAuB7D,YAAY;IAqBZ,cAAc,CACzB,OAAO,EAAE,WAAW,EACpB,GAAG,EAAE,MAAM,GACV,OAAO,CAAC,IAAI,CAAC;IA0BH,cAAc,CACzB,OAAO,EAAE,WAAW,EACpB,GAAG,EAAE,MAAM,EACX,MAAM,EAAE,MAAM,EACd,EAAE,EAAE,MAAM,EACV,YAAY,EAAE,OAAO,EACrB,wBAAwB,EAAE,OAAO,GAChC,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"readBinaryAPDUSender.d.ts","sourceRoot":"","sources":["../../../../../../src/Shared/EIDReader/protocol/readBinaryAPDUSender.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,+BAA+B,CAAC;AAChF,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAC7C,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AAO7D,qBAAa,oBAAqB,YAAW,0BAA0B;IACrE,OAAO,CAAC,qBAAqB,CAA4B;IACzD,OAAO,CAAC,OAAO,CAAc;gBAEjB,OAAO,EAAE,WAAW;IAKnB,gBAAgB,CAAC,OAAO,EAAE,WAAW,GAAG,IAAI,EAAE,GAAG,EAAE,UAAU;IAuB7D,YAAY;IAqBZ,cAAc,CACzB,OAAO,EAAE,WAAW,EACpB,GAAG,EAAE,MAAM,GACV,OAAO,CAAC,IAAI,CAAC;IA0BH,cAAc,CACzB,OAAO,EAAE,WAAW,EACpB,GAAG,EAAE,MAAM,EACX,MAAM,EAAE,MAAM,EACd,EAAE,EAAE,MAAM,EACV,YAAY,EAAE,OAAO,EACrB,wBAAwB,EAAE,OAAO,GAChC,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC;IAqF7B,OAAO,CAAC,MAAM,CAAC,eAAe;IAgC9B,OAAO,CAAC,MAAM,CAAC,iCAAiC;CAsCjD"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"country-display.utils.d.ts","sourceRoot":"","sources":["../../../../../src/Shared/Libs/country-display.utils.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"country-display.utils.d.ts","sourceRoot":"","sources":["../../../../../src/Shared/Libs/country-display.utils.ts"],"names":[],"mappings":"AAoBA,eAAO,MAAM,uBAAuB,GAClC,aAAa,MAAM,GAAG,IAAI,EAC1B,YAAY,MAAM,GAAG,IAAI,KACxB,MA0CF,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"diagnosticReport.d.ts","sourceRoot":"","sources":["../../../../../src/Shared/Libs/diagnosticReport.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AACH,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAC;AACzD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAChE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"diagnosticReport.d.ts","sourceRoot":"","sources":["../../../../../src/Shared/Libs/diagnosticReport.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AACH,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAC;AACzD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAChE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AA2CpD,MAAM,WAAW,iBAAiB;IAChC,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,SAAS,CAAC,EAAE,SAAS,GAAG,IAAI,CAAC;IAC7B,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,6EAA6E;IAC7E,MAAM,CAAC,EAAE;QACP,OAAO,CAAC,EAAE,OAAO,CAAC;QAClB,KAAK,CAAC,EAAE,OAAO,CAAC;QAChB,IAAI,CAAC,EAAE,OAAO,CAAC;QACf,OAAO,CAAC,EAAE,OAAO,CAAC;KACnB,CAAC;CACH;AAyDD,MAAM,WAAW,sBAAsB;IACrC,uCAAuC;IACvC,eAAe,EAAE,MAAM,CAAC;IACxB,kDAAkD;IAClD,YAAY,EAAE,MAAM,CAAC;IACrB,mDAAmD;IACnD,IAAI,EAAE,MAAM,CAAC;IACb,+BAA+B;IAC/B,OAAO,EAAE,MAAM,CAAC;CACjB;AAMD,uEAAuE;AACvE,eAAO,MAAM,qBAAqB,GAAI,QAAQ;IAC5C,IAAI,EAAE,mBAAmB,CAAC;IAC1B,MAAM,EAAE,aAAa,CAAC;IACtB,IAAI,EAAE,iBAAiB,CAAC;IACxB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,KAAG,sBAuFH,CAAC"}
|
|
@@ -38,7 +38,9 @@ export interface NfcDiagnostics {
|
|
|
38
38
|
/** PACE object identifier string when PACE was attempted. */
|
|
39
39
|
paceOid?: string;
|
|
40
40
|
/** Why PACE wasn't used / fell back: 'no_card_access' | 'no_pace_info' |
|
|
41
|
-
* 'pace_failed'
|
|
41
|
+
* 'pace_failed' | 'pace_unsupported_<agreement|mapping|curve|cipher>'.
|
|
42
|
+
* The pace_unsupported_* reasons mark a CAPABILITY gap (this build can't run
|
|
43
|
+
* the variant the chip advertises) vs pace_failed (a runtime failure). */
|
|
42
44
|
paceFallbackReason?: string;
|
|
43
45
|
steps: NfcStep[];
|
|
44
46
|
/** Name of the first failing step, if any. */
|
|
@@ -131,6 +133,12 @@ export declare class DiagnosticsCollector {
|
|
|
131
133
|
nfcPaceFellBackToBac(reason?: string): void;
|
|
132
134
|
/** Record one completed step. Keep messages short and free of PII. */
|
|
133
135
|
nfcStep(step: NfcStep): void;
|
|
136
|
+
/** The first NFC step that failed in the current attempt (e.g. 'paceAuth',
|
|
137
|
+
* 'readDG2'), or undefined. Lets the caller build a step-specific error code
|
|
138
|
+
* without taking a full snapshot. */
|
|
139
|
+
getFailureStep(): string | undefined;
|
|
140
|
+
/** APDU status word recorded for the failing step, if any (e.g. '6982'). */
|
|
141
|
+
getFailureStatusWord(): string | undefined;
|
|
134
142
|
nfcResult(succeeded: boolean, errorCategory?: string): void;
|
|
135
143
|
addError(e: {
|
|
136
144
|
code?: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"diagnostics.d.ts","sourceRoot":"","sources":["../../../../../src/Shared/Libs/diagnostics.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH,sEAAsE;AACtE,MAAM,WAAW,OAAO;IACtB;sDACkD;IAClD,IAAI,EAAE,MAAM,CAAC;IACb,EAAE,EAAE,OAAO,CAAC;IACZ,EAAE,EAAE,MAAM,CAAC;IACX,kFAAkF;IAClF,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ;kEAC8D;IAC9D,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,cAAc;IAC7B,SAAS,EAAE,OAAO,CAAC;IACnB,YAAY,EAAE,OAAO,CAAC;IACtB,8BAA8B;IAC9B,YAAY,EAAE,MAAM,GAAG,KAAK,GAAG,MAAM,CAAC;IACtC,iBAAiB,EAAE,OAAO,CAAC;IAC3B,6DAA6D;IAC7D,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB;
|
|
1
|
+
{"version":3,"file":"diagnostics.d.ts","sourceRoot":"","sources":["../../../../../src/Shared/Libs/diagnostics.ts"],"names":[],"mappings":"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"}
|