From ba4173f34e2a0ca66bc5857fd2fc951df204bc12 Mon Sep 17 00:00:00 2001 From: Yannick Spreen Date: Thu, 22 Apr 2021 23:03:59 +0200 Subject: [PATCH] Fix tests. --- PatientScannerDemo.xcodeproj/project.pbxproj | 4 +++ PatientScannerDemo/Services/KID.swift | 35 +++++++++++++++++++ PatientScannerDemo/ViewControllers/Scan.swift | 20 +++++++++++ PatientScannerDemoTests/EHNTests.swift | 15 +++++--- 4 files changed, 69 insertions(+), 5 deletions(-) create mode 100644 PatientScannerDemo/Services/KID.swift diff --git a/PatientScannerDemo.xcodeproj/project.pbxproj b/PatientScannerDemo.xcodeproj/project.pbxproj index f5127a5..4addceb 100644 --- a/PatientScannerDemo.xcodeproj/project.pbxproj +++ b/PatientScannerDemo.xcodeproj/project.pbxproj @@ -23,6 +23,7 @@ CE44799226306C86009A836B /* String.swift in Sources */ = {isa = PBXBuildFile; fileRef = CE44799126306C86009A836B /* String.swift */; }; CE44799726306C9B009A836B /* Data+Base45.swift in Sources */ = {isa = PBXBuildFile; fileRef = CE44799626306C9B009A836B /* Data+Base45.swift */; }; CE7DE7FA2625EF18007E6694 /* SwiftCBOR in Frameworks */ = {isa = PBXBuildFile; productRef = CE7DE7F92625EF18007E6694 /* SwiftCBOR */; }; + CE8912E526321AA500CB92AF /* KID.swift in Sources */ = {isa = PBXBuildFile; fileRef = CE8912E426321AA500CB92AF /* KID.swift */; }; CEA1555D262F63B30024B7AC /* EuDgcSchema.swift in Sources */ = {isa = PBXBuildFile; fileRef = CEA1555C262F63B30024B7AC /* EuDgcSchema.swift */; }; CEA15563262F6DAB0024B7AC /* ChildDismissedDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = CEA15562262F6DAB0024B7AC /* ChildDismissedDelegate.swift */; }; CEA1556B262F784E0024B7AC /* SelfSizedTableView.swift in Sources */ = {isa = PBXBuildFile; fileRef = CEA1556A262F784E0024B7AC /* SelfSizedTableView.swift */; }; @@ -75,6 +76,7 @@ CE3CC9432628C2130079FB78 /* CBOR.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CBOR.swift; sourceTree = ""; }; CE44799126306C86009A836B /* String.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = String.swift; sourceTree = ""; }; CE44799626306C9B009A836B /* Data+Base45.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Data+Base45.swift"; sourceTree = ""; }; + CE8912E426321AA500CB92AF /* KID.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KID.swift; sourceTree = ""; }; CEA1555C262F63B30024B7AC /* EuDgcSchema.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EuDgcSchema.swift; sourceTree = ""; }; CEA15562262F6DAB0024B7AC /* ChildDismissedDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ChildDismissedDelegate.swift; sourceTree = ""; }; CEA1556A262F784E0024B7AC /* SelfSizedTableView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SelfSizedTableView.swift; sourceTree = ""; }; @@ -153,6 +155,7 @@ CEFAD87926271414009AFEF9 /* COSE.swift */, CE3CC9432628C2130079FB78 /* CBOR.swift */, CE1BDF98262A4CD600766F97 /* X509.swift */, + CE8912E426321AA500CB92AF /* KID.swift */, ); path = Services; sourceTree = ""; @@ -439,6 +442,7 @@ CEC2C4C22625ED030056E406 /* ZLib.swift in Sources */, CEA15570262F79DE0024B7AC /* InfoCell.swift in Sources */, CEA6D6EE261F8D2700715333 /* SceneDelegate.swift in Sources */, + CE8912E526321AA500CB92AF /* KID.swift in Sources */, CE157F9B262E2A9F00FE4821 /* SwiftCBOR.CBOR.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; diff --git a/PatientScannerDemo/Services/KID.swift b/PatientScannerDemo/Services/KID.swift new file mode 100644 index 0000000..81bf340 --- /dev/null +++ b/PatientScannerDemo/Services/KID.swift @@ -0,0 +1,35 @@ +// +/*- + * ---license-start + * eu-digital-green-certificates / dgca-verifier-app-ios + * --- + * Copyright (C) 2021 T-Systems International GmbH and all other contributors + * --- + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * ---license-end + */ +// +// KID.swift +// PatientScannerDemo +// +// Created by Yannick Spreen on 4/22/21. +// + + +import Foundation + +struct KID { + public static func stringFrom(kidBytes: [UInt8]) -> String { + return Data(kidBytes.prefix(8)).base64EncodedString() + } +} diff --git a/PatientScannerDemo/ViewControllers/Scan.swift b/PatientScannerDemo/ViewControllers/Scan.swift index 6504f80..49a3464 100644 --- a/PatientScannerDemo/ViewControllers/Scan.swift +++ b/PatientScannerDemo/ViewControllers/Scan.swift @@ -31,6 +31,7 @@ import Vision import AVFoundation import SwiftCBOR import FloatingPanel +import LocalAuthentication class ScanVC: UIViewController { @@ -50,6 +51,25 @@ class ScanVC: UIViewController { // setupCameraLiveView() DispatchQueue.main.asyncAfter(deadline: .now() + 0.1) { self.observationHandler(payloadS: nil) +// let reason = "Log in to your account" +// var context = LAContext() +// context.localizedCancelTitle = "Enter Username/Password" +// context.evaluatePolicy(.deviceOwnerAuthentication, localizedReason: reason ) { success, error in +// +// if success { +// +// // Move to the main thread because a state update triggers UI changes. +// DispatchQueue.main.async { [unowned self] in +// print("loggedin") +// } +// +// } else { +// print(error?.localizedDescription ?? "Failed to authenticate") +// +// // Fall back to a asking for username and password. +// // ... +// } +// } } } override func viewWillDisappear(_ animated: Bool) { diff --git a/PatientScannerDemoTests/EHNTests.swift b/PatientScannerDemoTests/EHNTests.swift index 391a691..23e31a4 100644 --- a/PatientScannerDemoTests/EHNTests.swift +++ b/PatientScannerDemoTests/EHNTests.swift @@ -75,11 +75,11 @@ class EHNTests: XCTestCase { XCTAssert(false) } func testCoseEcAT() throws { - let barcode = "HC1:NCFI.L3B6AP2YQ2%MNBCHC51/CAOZDL+OL7S99U60SVOGSHD%24R4PCTH7Y9KL6EVJBIMBL364D X1KKLZ*I9K4RLDR7B011EROZS6022WR5VX4QG9W72HWCC12B:TWZG.%N8GWBCOV0O%5F9U7H 8P4L.%2/:6TXB/-J6ZJ.*QYIBYSD6/T.6RDMMK0PX6HTPO1REO*CWMFG5CJ38+FBS+8DB9*2FFP9Z8HEM137CRBQ.893$I.R7 DRFOVMUQRVDP4IU613/G-0LZ:43+MM:QO.CQPJU21-7PJ*L/*DVLO:Q5G-7%WF4ZO*JJR:KH+O1707M6.73VXG0+0050+IMIFH:3V+DL3JK/21/LEI$T5TUT8P:40P10AXGBRS%-GZS8TGF-IT3-HU2SVJUAVG%AGO98R00Y.QT23DVP0TB*-J6YJP 8TU9U/OJSQGGMK+K3MH IR U7H%9/UU07AGEWMVTOBAYIV4SPGC2Y5FJJ67I4/J4FXM3GP:SAOZQJPL%WGP4BT59Q8K5MB*M44%K9JTWB9K+LS-2I9ST+3J%0X%1YGN0E0KL3/FHTZHEF9WIC4Q1HVK74L186BWT9+TJR7C2M%9JXN8S%0PVU8GFBET%0PG RR1KD2F11G-CW8A4124N9VN-T-:292AX*B%ER*$12-O:6K:/N$ 7IYFFXQ/5F NC49M/W5501B2OKU7E:NHMM8SETWUK*I$JR" + let barcode = "HC1:NCFC:M/8OBK2 53WGEI1J%1IEAKE%GKV5B8M38S78UU+RRIR+1CT013E9ZI8$*NVQE+PQKR434V:-NN551/A*HSD87*JGTPKU77HTHOTIY/9VPKP859+1Q-1JCFL:O8SBM:5I%7X2NRAQ1XL0$E867W1FH-NIAWOQJEFELCNXMT7S739DJ2G2*CYG9IEMEU7/.B%E9 $0DKJPRIK-RRX2WBPOFE32TW HL24/YI4SO5LF04NZ-D O9$K9$IHYTC4JB622YMQ.5LVXH64JFGG-L0LJTW88O.L5T48AW2MTJD8CL4OUE4V2HX88FAH 89NKJS2SMPU%I8OC0AEPJ0 F2SMTERNC7CM20P00C9L8MBI.PMP9WWG6ICY$FK/QARHN+JX8S24UU00CEAA:SQUTY0LPRGQXVN6Q*UR-WH/FC8CJQ8WLBJH$47O8+.GMF78*A85H1GU4SPNC3TVKQBK:7C836%WI/QR$EC0YE:E77%LHAE5T07AVLUPLW38MMNF00 CE9U$-VKYU ZN1V3C:M9YH.RDK%VQSC.GRN29JSENCEX7SQ.J6:4D28Z*E*3V5/R6Q7*:3I R+1GUZQ$LBB 7B-E2KTU/0X1B- UKUJJ2U0.H 0RM2GBGIQ+M" return baseTestAT(barcode: barcode) } func testCoseRsaAT() throws { - let barcode = "HC1:NCFI.LUZB.P2YQ2E R002$DLTLIYXM/+0JNEAFUP.CV5GKCL /A0SQT/O8ZA85D0IJ$5D4.J+MR8-EGK6DM1R58V1ERUCWM4.E4ZM4$WG O E6KX9$KHCQMFE0B$KPKA*A2+ELQ*5ZQE/*1ZMSM5S.:KGQ33LQOWN67QW68LXM867D6837QCWEU*E*OKZCJPSCPIM1:Q83FBODLRD/W8K$E4 SG4P2JM6GCMU9FFSZAKNJH6ZNZVSWU78MHB4TO5J0N51U2F:17AB8O0*N0CQSA-9VIN904*STT$6R1LLXDT8J1ZN4I4368L02N72ZMGV496.0NO3OQCPFVF+C$BKQH1$+8L:AAEGRIB548B68D/3-ZTZ.JNM84E0F59$N6DY2*6FACA448900U42ZEMMO7-LO.45*IMXYIODF:82RN4L8Q%20HDJ-YCHIA1YT87A2/C1NO1F6DPCLCK9+BDXEEK23JH0/I8XJQEQ1T8BQ5GNDRFPQKKV6WT$A+98TIOUSAFA0J8OMY87$P-LESPS1KO+:O%HOY*C8XH4ZE7D16QR WNN$EP:U7E2HTLS023X0GJBW887LCKVHDGJ+Q88I0A73$H6R30XYH-LDC$4+24*JSE*H98A471BJ3:R0LU3MZA+ 4/GMZ9J D4E7L.TI$L8L:TN4G2S552748V$%D0CPH9RJ-7Z4AXFN*SS/ZC44O3P5%%AE936OUSR1H7WP%CP8KQUCY9I%A5FDBV+0A%HPVP5SKP9TKAFKT9FYROAABDBEHVQ9317O0D7MS5Z.Q2+K2.1RGGS3B5OTO2ROD60Z6LE98E94TV09JXM395VA0N.98EP3*4E5SHA7I96Q70UF74SPSIJI.BUHQJ$:K$9M51H9Z6RPHR.K-XT855UJJZC8C*MSITGMRE%O+:JQXV$LS7SJ1:DE LCX7RP7T JH4RR-NK.PASIWKA8J5Z1NA*BE7KFTJXO4BM5QVF.S0-5CG8KQWB8RCA1VP*1Q.ELZ1Q21G.JEGLOFH1:FR09$SCY/OGBU1QIE/2 9SK3" + let barcode = "HC1:NCFOXNYTS3DH$YO:CQSU40 H 804 2FI15B3LR5OGILG9N:5-RII9DL-VAD65D6 NI4EFFZSE+S.SSH2HGUS XKVD9HB58QHVM6IQ17XH0S9S-JX%EI$HGL24EGYJ2SKISE02UQHPMYO9MN9JUHLKH.O93UQFJ6GL28LHXOAYJAPRAAUICO10W59UE1YHU-H4PIUF2VSJGV4J4LV/AYVG2$436D$X40YC2ATNS4Y6TKR2*G5C%CO8TJV4423 L0VV2 73-E3ND3DAJ-432$4U1JS.S./0LWTKD33236J3TA3E-4%:K7-SN2H N37J3JFTULJ5CBP:2C 2+*4HTC/2DBAJDAJCNB-43GV4MCTKD08DJHSI PISVDGZK4EC8.SX1LC8C8DJOMI$MI-N09*0245$UH8QIBD2GMJCKH9AO2R7./HBR6$LE KMDGKRFRSGHQED10H% 0R%0D 8YIPFHL:OTEGJUY25$0P/HX$4T0H//CI+CF/8-0LO1PX$4D4TVZ0D-4VZ0S1LZ0L:M623Q$B65VCNAIO38ZIIT-ROGV86O*$2/6PSQHV-P TN3H38EU2VME.3F$MM3WYC3A1N%IFBZV3P6$A9X81M:L-5TTPNFIVD6KL/O63UX0O7V9BYEB:IB BUAA9JM:ATN.AR81Y4GP21CPVY6P:KPG:LNLL%70/6MRVMT0LV0E7*EVLS2UIU6V2M3%26%Q3J*H:5L-28SXRWUH$LCQ/S3QTY5NG.8C5MN$V4-BXJMF5RG3U6-1RDVRWNY$3/ZB3MOQDWC*08M0AV5*/0QX4B-EF0MGH5X1FYHRGX8:+RY/EI%BQ95TC5*DW/ESR4S0:1ZF59*5GK1-OH4Z6-6FUOTN*H$38IPR4GT1$OE07B*SWKN*HF83N MO.CFOW3R%GB28Z$UOH7DROI9BW/CXPS0.PS USQE:LAVZP320%R902" return baseTestAT(barcode: barcode) } func baseTestAT(barcode: String) { @@ -99,9 +99,14 @@ class EHNTests: XCTestCase { let data = decompress(compressed) guard - let kidBytes = CBOR.kid(from: data), - let kid = String(data: Data(kidBytes), encoding: .utf8), - let url = URL(string: "https://dev.a-sit.at/certservice/cert/\(kid)") + let kidBytes = CBOR.kid(from: data) + else { + XCTAssert(false) + return + } + let kid = KID.stringFrom(kidBytes: kidBytes) + guard + let url = URL(string: "https://dgc.a-sit.at/ehn/cert/\(kid)") else { XCTAssert(false) return