From d3f92ce2bc9ab1db6925839626600f31198b5946 Mon Sep 17 00:00:00 2001 From: Roman Mazeev Date: Mon, 30 Aug 2021 21:00:52 +0300 Subject: [PATCH] Update MRZ hash checking --- .../MRZParser/Private/MRZCode/MRZCode.swift | 22 +++++++++++++------ .../Private/MRZCode/MRZCodeFactory.swift | 1 + Sources/MRZParser/Public/MRZResult.swift | 3 +++ 3 files changed, 19 insertions(+), 7 deletions(-) diff --git a/Sources/MRZParser/Private/MRZCode/MRZCode.swift b/Sources/MRZParser/Private/MRZCode/MRZCode.swift index 9236d8f..d518899 100644 --- a/Sources/MRZParser/Private/MRZCode/MRZCode.swift +++ b/Sources/MRZParser/Private/MRZCode/MRZCode.swift @@ -8,6 +8,7 @@ import Foundation struct MRZCode { + let format: MRZFormat var documentTypeField: Field var countryCodeField: Field var documentNumberField: ValidatedField @@ -22,15 +23,22 @@ struct MRZCode { var isValid: Bool { if !finalCheckDigit.isEmpty { - var fieldsValidate: [ValidatedFieldProtocol] = [ - documentNumberField, - birthdateField, - expiryDateField, - optionalDataField - ] + var fieldsValidate: [ValidatedFieldProtocol] = [ documentNumberField ] - if let optionalData2Field = optionalData2Field { + if format == .td1, let optionalData2Field = optionalData2Field { + fieldsValidate.append(optionalDataField) + fieldsValidate.append(contentsOf: [ + birthdateField, + expiryDateField + ]) fieldsValidate.append(optionalData2Field) + } else { + fieldsValidate.append(contentsOf: [ + birthdateField, + expiryDateField + ]) + + fieldsValidate.append(optionalDataField) } let compositedValue = fieldsValidate.reduce("", { $0 + $1.rawValue + $1.checkDigit }) diff --git a/Sources/MRZParser/Private/MRZCode/MRZCodeFactory.swift b/Sources/MRZParser/Private/MRZCode/MRZCodeFactory.swift index 3563c1a..4b65cdf 100644 --- a/Sources/MRZParser/Private/MRZCode/MRZCodeFactory.swift +++ b/Sources/MRZParser/Private/MRZCode/MRZCodeFactory.swift @@ -124,6 +124,7 @@ struct MRZCodeFactory { } return MRZCode( + format: format, documentTypeField: formatter.createField(from: firstLine, at: 0, length: 2, fieldType: .documentType), countryCodeField: formatter.createField(from: firstLine, at: 2, length: 3, fieldType: .countryCode), documentNumberField: documentNumberField, diff --git a/Sources/MRZParser/Public/MRZResult.swift b/Sources/MRZParser/Public/MRZResult.swift index f69fe0b..87d04c2 100644 --- a/Sources/MRZParser/Public/MRZResult.swift +++ b/Sources/MRZParser/Public/MRZResult.swift @@ -36,6 +36,7 @@ public struct MRZResult: Hashable { case visa case passport case id + case residencePermit case undefined var identifiers: [String] { @@ -46,6 +47,8 @@ public struct MRZResult: Hashable { return ["P", "PN"] case .id: return ["I"] + case .residencePermit: + return ["IR"] case .undefined: return [] }