SDK for iOS
Introduction
The IDEMIA Verify SDK for iOS provides customers with the resources to customize the SDK to their preferred user-experience and integrate it within an existing mobile application. The IDEMIA Mobile ID Verify App works in conjunction with the IDEMIA Mobile ID App allowing verifiers to authenticate the user's physical ID or digital credential (i.e., drivers license or identity card).
You can use the iOS SDK to:
-
**Create and design your preferred user-experience and UI while leveraging the IDEMIA Verify functionalities **
You can build a custom mobile application that implements your user-experience design and leverages all of the SDK functionalities allowing you to apply your branding and preferred user flow. Maintain complete control over the display and functionality of the application.
-
**Embed IDEMIA Verify into an existing application **
You can automatically integrate an existing mobile application with IDEMIA by adding the SDK frameworks, which removes the need to use and maintain an additional application to leverage the Mobile ID's functionalities.
Get started
Skills required
The integration tasks require developers to have knowledge of:
- iOS frameworks built in Xcode 12.0 or higher
- Swift 5.0 or higher
- macOS 10.14 or higher
Resources required
The tools required for integration on macOS are:
- Xcode 12.0 or above
- iOS SDK tools: release 11 or above (preferably latest version)
- Physical iOS device (simulator is not supported)
Other requirements
External Libraries
- SwCrypt: pod 'SwCrypt', '~> 5.1.3'
- SwiftCBOR: pod 'SwiftCBOR', '~> 0.4.3'
- DLParser: pod 'DLParser', '~> 3.0'
Optical Inspection Requirements
- pod 'BiometricSDK-face/Framework', '~> 4.23.1'
- pod 'BiometricSDK-face/Plugins/FaceCaptureNormal', '~> 4.23.1'
- pod 'BiometricSDK-face/Algorithms/F5_4_LOW75', '~> 4.23.1'
- pod 'IDZSwiftCommonCrypto', '~> 0.13.0', => true
- pod 'SwiftBytes', '~> 0.6.0'
- pod "OpenSSL-Universal", '~> 1.1.180*'
User permission
When designing your app,consider that your iOS app must handle user permissions to protect the resources on the target mobile device. Specifically, you must verify that the app permissions are granted by the user. If the required permissions are not granted, the SDK will throw an exception or error and may even crash.
The following user permission are required:
- Camera permission for the QR code scan
- Bluetooth permission for the BLE data transfer
The required permissions in the app info.plist
file are:
- Privacy: Bluetooth Always Usage Description
- Privacy: Bluetooth Peripheral Usage Description
- Privacy: Camera Usage Description
Create your own app
If you already have access for Mi-Artifactory, download the sample app: https://mi-artifactory.otlabs.fr/artifactory/verify-sdk-ios-release/com/idemia/idverify/ios/2.3.0/Sample/2.3.0-sample-ios.zip
To create your own app, you must add the following SDK libraries to your project. You can add these libraries manually as shown in Option A, or through CocoaPods as shown in Option B.
Add SDK libraries
The Podfile specifies the dependencies of each user target, and the SDK pods are used to declare a specific dependency. The target
scopes the pod dependencies to specific targets in your Xcode project.
Required pods
- pod 'DLParser', '~> 3.0'
- pod 'SwCrypt', '~> 5.1.3'
- pod 'SwiftCBOR', '~> 0.4.3'
- pod 'PPpdf417', '~> 7.2.0'
Requirements for optical inspection only
- pod 'BiometricSDK-face/Framework', '~> 4.23.1'
- pod 'BiometricSDK-face/Plugins/FaceCaptureNormal', '~> 4.23.1'
- pod 'BiometricSDK-face/Algorithms/F5_4_LOW75', '~> 4.23.1'
- pod 'IDZSwiftCommonCrypto', '~> 0.13.0', => true
- pod 'SwiftBytes', '~> 0.6.0'
- pod 'OpenSSL-Universal', '~> 1.1.180'
Note: You only need to add the SDK libraries for Optical Inspection if you plan to use the Optical Inspection feature.
Option A: Import SDK manually
The manual method allows you to import the SDK files using Verify.framework
using the steps below:
- Add the
Verify.framework
file to your project by pasting this file in project folder at path:/verify-ios-tester-app/src/xcode/VerifyTesterApp/VerifyTesterApp/Frameworks/Verify.framework
. - Download the
Verify.framework
andTesterApp
from the mi-artifactory: https://mi-artifactory.otlabs.fr/artifactory/verify-sdk-ios-release/com/idemia/idverify/ios/ - Link
Verify.framework
to your project by dragging and dropping it on Project Settings (General > Frameworks, Libraries, and Embedded Content).
Option B: Import SDK through CocoaPods
Alternatively, the CocoaPods method allows you import the SDK files using CocoaPods (along with cocoapods-artplugin) using these steps.
-
If you don't already have CocoaPods with the Artifactory tool, install it by running the following command as shown in the snippet:
Swift1gem install cocoapods-art -
The plugin uses authentication that is specified in a standard .netrc file, as shown in the snippet:
Swift1machine mi-artifactory.otlabs.fr2login ##USERNAME##3password ##PASSWORD## -
Once set, add our repository to your CocoaPod's dependency management system as shown in the snippet:
Swift1pod repo-art add verify-sdk-ios-release "https://mi-artifactory.otlabs.fr/artifactory/api/pods/verify-sdk-ios-release" -
At the top of your project
Podfile
add the lines shown in the snippet:Swift1plugin 'cocoapods-art', :sources => [2 'verify-sdk-ios-release', # so it could resolve dependencies for Verify3 'master', # so it could resolve dependencies from master repo (the4main one)5 'smartsdk' # so it could resolve BiometricSDK depdendency6] -
Add the
Verify
SDK in yourPodfile
in one of its pod's version, as shown in the snippet:Swift1pod 'Verify', '~> 2.3.0.910' # Verify SDK -
Now
install
as shown in the snippet:Swift1pod installNOTE: If you are already using our repository, and you cannot resolve some dependency, try to update the specs:
Swift1pod repo-art update verify-sdk-ios-release
Obtain an LKMS license
You can skip this step if you do not intend to use the Optical Inspection feature in the Verify App.
-
Contact the IDEMIA support team to get an LKMS license for your app.
-
Scan the QR or PDF417 codes as shown in the snippet:
Swift1/**2 * Response callback for parse engagement QR code data or PDF417 raw data from physical or **Mobile ID** credential holder3 */4 //MARK: parsed QRCode5 func parsedDataForQRCode(trimmedQRCode: String){6 DispatchQueue.global(qos: .default).asyncAfter(deadline: .now() + 0.2) {7 let config = self.formAndReturnAppConfigsParamForAPI(qrString: trimmedQRCode)8 sharedVSDKClient?.initDeviceEngagement(apiConfig: config, responseCallback: self)910 }11 }1213 //MARK: parsed 2DBarCode14 func parsedDataFor2DBarCode(trimmedQRCode: String){15 DispatchQueue.global(qos: .default).asyncAfter(deadline: .now() + 0.2) {16 let config = self.formAndReturnAppConfigsParamForAPI(qrString: trimmedQRCode)17 sharedVSDKClient?.parsePDF417(apiConfig: config, responseCallback: self)18 }19 }2021 // Returns ApiConfigs with all the parameters22 func formAndReturnAppConfigsParamForAPI(qrString qr: String?) -> ApiConfigs? {23 guard let tempQRString = qr else {24 return nil25 }26 // Build app configs27 let apiConfigs = ApiConfigs.ConfigBuilder()28 .withData(inputData:tempQRString)29 .setAgeOverNN(age: pickedAge)30 .build()31 return apiConfigs32 } -
After scanning the QR or 2D barcode successfully, you will get the result response in
onSuccess
as shown in the snippet:Swift1func onSuccess(response: Any?){2 }3 func onError(error: VerifyError){45 } -
Send a request to the Mobile ID App to get the license details as shown in the snippet.:
1// Set 'appConfig' as follows if you want to use all attributes as optional parameters2var dataItems = getMandatoryParams()3dataItems.append(contentsOf: getOptionalParams())45let apiConfigs = AppConfigs.MIDRequestBuilder()6 .addParam(listParams: dataItems)7 .build() -
Use the
sendRequest()
method to return the response from the user's Mobile ID credential as shown in the snippet:Language not specified1//Send the request by using `appConfig` which you set earlier2sharedVSDKClient?.sendRequest(apiConfig: apiConfigs, responseCallback: self)3} -
If the
sendRequest()
method is received successfully, then all the attributes of the Mobile ID App response will appear in the view controller as shown in the snippet:Swift1// send request using new namespace and paramList support23func sendrequest(){45 var aamvaParamsList = [MIDRequestParam]()6 var namespaceParamList = [String: [MIDRequestParam]]()7 var isoParamsList = [MIDRequestParam]()8 isoParamsList.append(MIDRequestParam(paramName: MIDParamConstants.GIVEN_NAME))9 isoParamsList.append(MIDRequestParam(paramName: MIDParamConstants.FAMILY_NAME))10 isoParamsList.append(MIDRequestParam(paramName: MIDParamConstants.RESIDENT_ADDRESS))11 isoParamsList.append(MIDRequestParam(paramName: MIDParamConstants.RESIDENT_CITY))12 isoParamsList.append(MIDRequestParam(paramName: MIDParamConstants.RESIDENT_CITY))1314 namespaceParamList[MIDParamConstants.DOCTYPE_ORG_AAMVA_US] = aamvaParamsList15 namespaceParamList[MIDParamConstants.NAMESPACE_18013_5 ] = isoParamsList1617 let apiConfigs = ApiConfigs.MIDRequestBuilder()18 .version(version: MIDParamConstants.REQUEST_VERSION)19 .addDocType(docType: "my.cusom.docType.custom1") //example docType12021 //1. add22 .addParams(namespaceParamList)23 // add again to test if duplicates are removed24 .addParams(MIDParamConstants.NAMESPACE_18013_5,isoParamsList)25 //2. add more params one by one with custom namespce26 .addParam(MIDParamConstants.NAMESPACE_18013_5,MIDRequestParam(paramName: "custom_param1"))27 .addParam("my.custom.namespace",MIDRequestParam(paramName: "custom_param1"))2829 .addParam("my.custom.namespace",MIDRequestParam(paramName: "custom_param2"))30 .addParam("my.custom.namespace",MIDRequestParam(paramName: "custom_param3"))31 //duplicates will be removed32 .addParam("my.custom.namespace",MIDRequestParam(paramName: "custom_param1"))33 .addParam("my.custom.namespace",MIDRequestParam(paramName: "custom_param3"))34 //3. or add a custom namespace like this35 .addParams("my.custom.namespace2", [36 MIDRequestParam(paramName: "custom_param_nm21"),37 MIDRequestParam(paramName: "custom_param_nm22"),38 MIDRequestParam(paramName: "custom_param_nm23"),39 MIDRequestParam(paramName: "custom_param_nm21") ]//duplicate40 )4142 .buildDoc() //build doctype143 .addDocType(docType: "my.cusom.docType.custom2") //example docType244 .addParams("my.custom.namespace2", [45 MIDRequestParam(paramName: "custom_param_nm21"),46 MIDRequestParam(paramName: "custom_param_nm22"),47 MIDRequestParam(paramName: "custom_param_nm23"),48 MIDRequestParam(paramName: "custom_param_nm21") ]//duplicate49 )50 .buildDoc() //build doctype25152 .build()5354 //call sendRequest API55 sharedVSDKClient?.sendRequest(apiConfig: apiConfigs, responseCallback: self)56 // 3. Read request params supplied from app and make the request structure accordingly.5758} -
Request the callback for the
sendRequest
SDK API to receive and display the response data from the Mobile ID App as shown in the snippet:Swift1/**2 * Request callback for the `sendRequest` SDK API to receive and display the response data from the mDL.3 */45 func onSuccess(response: Any?){6 }7 func onError(error: VerifyError){8 }9 func onRequestCanceled(response: Any?){10 }11 func onProgress(totalBytesRecived: Int){12 }13 func onRequestSent(status: Bool?){14 }15 func currentBLEStatus(currentState: TransferState){16 } -
You can cancel the transaction at any time by calling the
cancelRequest()
method as shown in the snippet:Swift1sharedVSDKClient?.cancelRequest(responseCallback: self,cancellationReason: .CANCELED_BY_USER) -
You can get the SDK version by calling it directly with the class name as shown in the snippet:
Swift1IDVerifyTerminal.version -
Added new configuration
setReaderAuthInfo
for reader authentication; here is a sample code snippet:
Swift1let apiConfigs = ApiConfigs.MIDRequestBuilder()2 .version(version: MIDParamConstants.REQUEST_VERSION)3 .addDocType(docType: "org.iso.18013.5.1.mDL")4 .addParams(namespaceParamList)5 .buildDoc()6 .setReaderAuthInfo(readerAuthSignerCallback: self.callbackReceiverVC, signingAlgo: .ALGO_SHA256WITHECDSA)7 .withData(inputData: MOCK_QR_CODE_DATA_N1938)8 .build()
- Added new protocol
ReaderAuthSignerCallback
for reader authentication callback; here is a sample code snippet of implementation:
Swift1extension ViewController: ReaderAuthSignerCallback {2 func doSignItemRequest(readerAuthenticationBytes: Data, docType: String) -> ReaderAuthSign? {3 //Generating Public Private KeyPair4 let keyPairDict = try? ECUtils.generateKeyPair()5 let privateKey = keyPairDict?["private"]67 //Generating Signature8 let signedDataSignature = (try? EncyptionDecryption.createSignature(privateKey: privateKey, dataToSign: readerAuthenticationBytes, algorithm: .ecdsaSignatureDigestX962SHA256)) ?? Data()910 //returning Signature and Certificate11 return ReaderAuthSign(signature: signedDataSignature, x509Certificate: x509CertSample.bytes.getData())12 }13}
- Call
loadCertificates()
API to load IACA certificates from given path. This step is necessary for a successful transaction since Verify SDK will validate the mDL response against the certificates from supplied path.
Swift1sharedVSDKClient?.loadCertificates(path: "CERTIFICATEDIRECTORY_NAME", responseCallback: self())23 func onSuccess(response: Any?){4 print("Certificate load success \(response)")5 }67 func onError(error: Any?){8 print(error)9 }
Test and production apps
The Verify SDK allows you to create a test app with the steps below. You can also use these steps to create your production application by changing the target
definition in your Podfile
to your Xcode production project.
-
Open your terminal and type the command "cd project_path" (the path to the project file where .xcodeproj file is located) and press
. -
Type the command "pod init" and press
. -
Go to the finder and open the pod file (in the same place where your .xcodeproj file is located).
-
Type the following in podfile under your target. In our case, the target is
VerifyIDTestApp
; change it according to your target in podfile and add the snippet shown:Language not specified1target 'VerifyIDTestApp' do2 use_frameworks!3 pod 'Verify', '~> 2.3.0.910'45 target 'VerifyIDTestAppTests' do6 inherit! :search_paths7 # Pods for testing8 end910 target 'VerifyIDTestAppUITests' do11 # Pods for testing12 end -
Type the command “pod install” and then press
. -
Open .xcworkspace (i.e., at the same place where your .xcodeproj file is located).
-
Call
IDVerifyTerminal.getClient
and initialize theIDVerifyTerminal
shared object in theAppDelegate.swift
file as shown in the snippet:Language not specified1let config = Configs.Builder()2 .enableDebug(isDebuggable: isDebuggable)3 .setBioSDKLicense(bioSDKLicense: license) //Optional: required only if you're to use Optical Inspection4 .build()56 sharedVSDKClient = IDVerifyTerminal.getClient(configs: config) -
If you are using Optical Inspection, you must obtain an LKMS license first. Then add the following
license
snippet only if you are using Optical Inspection:Swift1//Only for Optical Inspection2let license = BioSDKLicense(lkmsURL:serverEndpointUrl, lkmsProfileId: profileID, lkmsApiKey: apiKey)Notes:
- The minimum threshold for the BioTemplate authentication score (Optical Inspection use case) is 3500 by default.
- Internet connection is required for the first time transaction of Optical Inspection for attributes retrieval. The Mobile ID credential is downloaded from the server only once, and will not be downloaded again until it is either expired or the app is reinstalled and the data is cleared.
- By default no logs shall be visible on the logcat from the SDK.
-
Use
enableDebug(true)
for debugging purposes only if needed, and toggle it to false for production release as shown in the snippet:Swift1let config = Configs.Builder()2 .enableDebug(isDebuggable: isDebuggable)3 .setBioSDKLicense(bioSDKLicense: license) //Optional: required only if you're to use Optical Inspection4 .build()56sharedVSDKClient = IDVerifyTerminal.getClient(configs: config)
Request parameters
The following table provides a list of user attributes that can be called by the SDK.
Item# | Identifier | Param Name | CBOR Type |
---|---|---|---|
1 | ADMINISTRATIVE_NUMBER | administrative_number | Major type 3 |
2 | GENDER | gender | Major type 3 |
3 | HEIGHT | height | Major type 0 |
4 | WEIGHT | weight | Major type 0 |
5 | EYE_COLOR | eye_color | Major type 3 |
6 | HAIR_COLOR | hair_color | Major type |
7 | BIRTH_PLACE | birthplace | Major type 3 |
8 | RESIDENT_ADDRESS | resident_address | Major type 3 |
9 | PORTRAIT_CAPTURE_DATE | portrait_capture_date | Tag value 0 of major type 6 |
10 | AGE_IN_YEARS | age_in_years | Major type 0 |
11 | AGE_BIRTH_YEAR | age_birth_year | Major type 0 |
12 | AGE_OVER_NN | age_over_NN | Value 20/21 of major type 7 |
13 | ISSUING_JURISDICTION | issuing_jurisdiction | Major Type 3 |
14 | NATIONALITY | nationality | Major type 3 |
15 | RESIDENT_CITY | resident_city | Major type 3 |
16 | RESIDENT_STATE | resident_state | Major type 3 |
17 | RESIDENT_POSTAL_CODE | resident_postal_code | Major type 3 |
18 | BIOMETRIC_TEMPLATE_XX | biometric_template_xx | Major type 2 |
19 | NAME_NAT_CHAR | name_nat_char | Major type 3 |
20 | MGMT_NEXT_UPDATE | mgmt_nextupdate | Tag value 0 of major type 6 |
21 | FAMILY_NAME | family_name | Major type 3 |
22 | GIVEN_NAME | given_name | Tag value 0 of major type 6 |
23 | BIRTHDATE | birthdate | Tag value 0 of major type 6 |
24 | ISSUE_DATE | issue_date | Tag value 0 of major type 6 |
25 | EXPIRY_DATE | expiry_date | Major type 3 |
26 | ISSUING_COUNTRY | issuing_country | Major type 3 |
27 | ISSUING_AUTHORITY | issuing_authority | Major type 3 |
28 | DOCUMENT_NUMBER | document_number | Major type 3 |
29 | PORTRAIT | portrait | Major type 2 |
30 | MGMT_LAST_UPDATE | mgmt_lastupdate | Tag value 0 of major type 6 |
31 | MGMT_VALIDITY | mgmt_validity | Tag value 0 of major type 6 |
32 | ONLINE_TOKEN_XXXX | online_token_xxxx | Major type 3 |
34 | DRIVING_PRIVILEGES | driving_privileges | Major type 4 |
35 | REAL_ID | RealID | Major type 3 //org.aamva namespace |
36 | SIGNATURE_USUAL_MARK | signature_usual_mark | Major type 3 |
37 | ONLINE_URL_XXXX | online_url_xxxx | Major type 3 |
38 | BIRTHDATE | birth_date | Major type 3 |
39 | BIRTH_PLACE | birth_place | Major type 3 |
40 | NAME_NAT_CHAR | name_national_character | Major type 3 |
41 | FAMILY_NAME_NAT_CHAR | family_name_national_character | Major type 3 |
42 | GIVEN_NAME_NAT_CHAR | given_name_national_character | Major type 3 |
43 | EYE_COLOUR | eye_colour | Major type 3 |
44 | HAIR_COLOUR | hair_colour | Major type 3 |
45 | NAME_NAT_CHAR | name_national_character | Major type 3 |
46 | DHS_COMPLIANCE | DHS_compliance | Major type 3 //org.iso.18013.5.1.US |
47 | DOMESTIC_DRIVING_PRIVILEGES | domestic_driving_privileges | Major type 3 //org.iso.18013.5.1.US |
Expected results
QR code
The following table provides a list of user attributes captured in the QR code that can be called by the SDK.
Data Fields | Data type/Unit | Sample Value |
---|---|---|
administrative_number | Text/String | "1234453" |
gender | Text/String | "M" |
height | Integer/Centimeter | "157" |
weight | Integer/Kg | "56" |
eye_color | Text/String | "BLU" |
hair_color | Text/String | "BLACK" |
birthplace | Text/String | "NY" |
resident_address | Text/String | "123, ABC Street" |
portrait_capture_date | DateTime/RFC3339 | "1985-04-12T23:20:50Z" |
age_in_years | Integer/String | "34" |
age_birth_year | Integer/String | "1978" |
age_over_NN | Boolean/String | "true" |
issuing_jurisdiction | Text/String | "NY" |
nationality | Text/String | "US" |
resident_city | Text/String | "NY" |
resident_state | Text/String | "NY" |
resident_postal_code | Text/String | "58773" |
name_nat_char | Text/String | "US" |
mgmt_nextupdate | DateTime/RFC3339 | "1985-04-12T23:20:50Z" |
family_name | Text/String | "Sample" |
given_name | Text/String | "Joe" |
birthdate | DateTime/RFC3339 | "1985-04-12T23:20:50Z" |
issue_date | DateTime/RFC3339 | "1985-04-12T23:20:50Z" |
expiry_date | DateTime/RFC3339 | "1985-04-12T23:20:50Z" |
issuing_country | Text/String | "US" |
issuing_authority | Text/String | "NY" |
document_number | Int/String | "782593823" |
portrait | ByteArray/Bytes | |
mgmt_lastupdate | DateTime/RFC3339 | "1985-04-12T23:20:50Z" |
mgmt_validity | DateTime/RFC3339 | "1985-04-12T23:20:50Z" |
driving_privileges | Text/String | "C" |
RealID | Boolean/String | true |
signature_usual_mark | ByteArray/Bytes | |
birth_date | DateTime/RFC3339 | "1985-04-12T23:20:50Z" |
birth_place | Text/String | "NY" |
name_national_character | Text/String | "US" |
family_name_national_character | Text/String | "US" |
given_name_national_character | Text/String | "US" |
PDF417 scan
The following table provides a list of user attributes captured in the PDF417 scan that can be called by the SDK.
Data Fields | Data type/Unit | Sample Value |
---|---|---|
gender | Text/String | "M" |
height | Integer/inches | "71" |
eye_color | Text/String | "BLU" |
resident_address | Text/String | "123, ABC Street" |
age_in_years | Integer/String | "34" |
age_over_NN | Boolean/String | "true" |
resident_city | Text/String | "NY" |
resident_state | Text/String | "NY" |
resident_postal_code | Text/String | "58773" |
family_name | Text/String | "Sample" |
birthdate | DateTime/RFC3339 | "1985-04-12T23:20:50Z" |
issue_date | DateTime/RFC3339 | "1985-04-12T23:20:50Z" |
expiry_date | DateTime/RFC3339 | "1985-04-12T23:20:50Z" |
issuing_country | Text/String | "USA" |
document_number | Int/String | "782593823" |
driving_privileges | Text/String | "C" |
Optical inspection
Data Fields | Data type/Unit | Sample Value |
---|---|---|
gender | Text/String | "M" |
family_name | Text/String | "Sample" |
given_name | Text/String | "Joe" |
birthdate | DateTime/RFC3339 | "1985-04-12T23:20:50Z" |
expiry_date | DateTime/RFC3339 | "1985-04-12T23:20:50Z" |
Additions and updates
isIssuingCountryMatchWithDS
: check issuing_country matches with countryName element in the subject field within the DS certificate
isIssuingJurisdictionMatchWithDS
: check issuing_jurisdiction matches with stateOrProvinceName element in the subject field within the DS certificate
Notes:
- IDEMIA has many IACA certificates added to our SDK, so we must categorize these certificates, such as Production, Demo, UAT, in our SDK. This allows the Verify App integrator to know which certificate matches pertain to which environment at any time during a transaction.
- A certificate validation match is performed with the Mobile ID credential, and a certification tag is created for every certificate. This flag is used used in the Verify SDK to distinguish between different purposes of the certifications, leading to indicators in the Verify App results screen that some Mobile IDs credentials are “Not for Official Use”. If a certificate is not in production, then it is not meant for official use.
- A popup/updated UI on the Verify App displays whether the Mobile ID credential is applicable for official use or not, based on the matched IACA certificate. Currently, for integrators this provides additional information for IACA certificate matching.
- The classification of these SDK certificates is shown in this link: https://idemiadigitallabs.atlassian.net/wiki/spaces/MI/pages/478052581/IACA+Certificates
Error codes
This table contains the list of data error codes, messages, descriptions, and actions required.
Error Code | Error Code Message | Description | Action Required |
---|---|---|---|
101 | Invalid QR Code | Please try again. | Try Again. |
102 | QR Data item is missing or found any issue | If item type is not as expected. | Try Again. |
103 | QR Data item is missing or found any issue | If DataItem(Map) is empty. | Try Again. |
104 | QR Data item is missing or found any issue | If DataItem(Array) is empty. | Try Again. |
105 | QR code scan error | Unable to Scan QR code may be because of invalid data or bad encoding. | Try Again. |
106 | Error PDF417 decoder | Error in generating PDF417 barcode. | Try Again. |
121 | License Validation for Optical Inspection Failed | Please try again with the correct credentials/ stable internet connection. | Try Again. |
122 | License expired | Please contact support to renew the license | Try Again. |
123 | Parsing Error | Error in compact mode qr code parsing and verification | Try Again. |
124 | Image Conversion Error | Error in convert image from bitmap to Image | Try Again. |
201 | Unable to initialize BLE | Error in initializing BLE feature of this | The Mobile ID reader is not able to get BLE. The Mobile ID credential reader may abort the transaction. |
202 | Device Doesn't Support BLE | This device doesn't support the BLE feature. | The Mobile ID reader is not able to get BLE. The Mobile ID reader may abort the transaction. |
203 | BLE Scanning Error | Scanning of the BLE devices failed. | The Mobile ID reader is not able to scan the BLE devices. The Mobile ID reader may abort the transaction. |
204 | Bluetooth is OFF | This device's Bluetooth is off. | The Bluetooth of the device is not enabled. The Mobile ID credential reader may abort the transaction. |
205 | BLE Scanning Error | Please provide the BLUETOOTH permissions. | |
206 | BLE Connection Timeout | Unable to create BLE communication channel with the Mobile ID device. | BLE connection failure. The Mobile ID reader may abort the transaction. |
301 | Transaction Cancelled | The transaction has been cancelled by the user. | Unable to scan the QR code. |
302 | Device Disconnected | Unfortunately device has disconnected. Maybe the device is not in the range of BLE. | The Mobile ID credential reader may abort the transaction. |
303 | Timed Out, Please try again | BLE connection failure. The Mobile ID credential reader may abort the transaction. | |
304 | Request Incomplete. | Please select one or more attributes to be included in the request to the Mobile ID credential. | The Mobile ID credential reader may inspect the request, ensure request is complete, and resend. The Mobile ID credential reader may abort the transaction. |
305 | Incomplete Request | An Mobile ID comes to an end of data when expecting more data. For example, an Mobile ID expects certain length, number of arrays elements, or map entries but instead encounters the end of the data. The Mobile ID does not return any data but the error message. | The Mobile ID credential reader may inspect the request, ensure request is complete, and resend. The Mobile ID credential reader may abort the transaction. |
306 | Request Rejected | The Mobile ID App indicates that the request is rejected. | The Mobile ID credential reader may inspect the problem. The Mobile ID credential reader may continue the transaction. |
307 | Mobile ID Reader Authentication Failed | The Mobile ID indicates there is an error with Mobile ID Reader authentication | The Mobile ID credential reader may inspect the problem. The Mobile ID credential reader may continue the transaction. |
308 | General Error | The Mobile ID App returns an error without any given reason. | The Mobile ID credential reader may inspect the request, ensure request is complete, and resend. The Mobile ID credential reader may abort the transaction. |
309 | Invalid Request | Request can't contain more than 2 age_over_nn as request attributes. | |
310 | Error in Reader Authentication | ReaderAuthSign Signature or Certificate cannot be null or empty. | |
401 | Parsing Error | A Mobile ID credential request encountered a data element that is not well-formed (e.g., invalid initial byte) and failed decoding data. The Mobile ID App does not return any data but the error message. | The Mobile ID credential reader may inspect the request, ensure request is complete, and resend. The Mobile ID credential reader may abort the transaction. |
402 | Invalid Format | The Mobile ID App cannot process the requested data element due to a formatting error. | |
403 | Data Not Found | The requested NameSpace or data element within a NameSpace is not found. | |
404 | Data Request Denied | The release of requested data element was rejected by the Mobile ID credential holder. | |
405 | Data Not Returned | The Mobile ID App does not provide the requested data element without any given reason. | |
406 | CBOR decoding error | The mdoc indicates an error during CBOR decoding that the data received is not valid CBOR.. Returning this status code is optional. | |
407 | CBOR validation error | The mdoc indicates an error during CBOR validation, e.g. wrong CBOR structures. Returning this status code is optional. | |
451 | Certificate Path Error | Either Path is invalid or inaccessible or not a folder path or folder is empty. |
Test samples
Optical inspection sample
The following screen shows the optical inspection feature results.
PDF417 sample
The following screen shows a PDF417 scan from the Mobile ID App or a physical driver's license.
QR + BLE sample
The following screen shows a scan of QR code in the IDEMIA Mobile ID App.
Note: This is for device engagement QR code testing. The full QR code + BLE scenario will only work with a real device using the IDEMIA Mobile ID App.