diff --git a/enzevalos_iphone.xcodeproj/project.pbxproj b/enzevalos_iphone.xcodeproj/project.pbxproj index d6ec9600e9f25cc321c52924e73b7edbf10e492c..751942459cf4ef26f9cff358b98e8b589252250f 100644 --- a/enzevalos_iphone.xcodeproj/project.pbxproj +++ b/enzevalos_iphone.xcodeproj/project.pbxproj @@ -13,7 +13,26 @@ 0E1C457D24055F87006D104A /* signencinlineK9.eml in Resources */ = {isa = PBXBuildFile; fileRef = 0E1C457924055F87006D104A /* signencinlineK9.eml */; }; 0E1C458024055FB7006D104A /* Alice.v3.pubsec.asc in Resources */ = {isa = PBXBuildFile; fileRef = 0E1C457E24055FB7006D104A /* Alice.v3.pubsec.asc */; }; 0E1C458124055FB7006D104A /* Alice.v3.pub.asc in Resources */ = {isa = PBXBuildFile; fileRef = 0E1C457F24055FB7006D104A /* Alice.v3.pub.asc */; }; - 0E6551A72406A42300DE30FC /* SearchHelper.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0E6551A62406A42300DE30FC /* SearchHelper.swift */; }; + 0ECA5798240D496800B0F231 /* SMIME.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0ECA5797240D496800B0F231 /* SMIME.swift */; }; + 0ECEA0E8240E7081007DC71E /* SearchHelper.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0ECEA0E7240E7081007DC71E /* SearchHelper.swift */; }; + 0ECEA0EA240E7D64007DC71E /* SMIME Test 1 S.eml in Resources */ = {isa = PBXBuildFile; fileRef = 0ECEA0E9240E7D64007DC71E /* SMIME Test 1 S.eml */; }; + 0ECEA0EC240E7D85007DC71E /* johnny C1.json.eml in Resources */ = {isa = PBXBuildFile; fileRef = 0ECEA0EB240E7D85007DC71E /* johnny C1.json.eml */; }; + 0ECEA0F7240E7DB1007DC71E /* evilCA.p12 in Resources */ = {isa = PBXBuildFile; fileRef = 0ECEA0ED240E7DB0007DC71E /* evilCA.p12 */; }; + 0ECEA0F8240E7DB1007DC71E /* myTestCA.pem in Resources */ = {isa = PBXBuildFile; fileRef = 0ECEA0EE240E7DB0007DC71E /* myTestCA.pem */; }; + 0ECEA0F9240E7DB1007DC71E /* evilkey1.p12 in Resources */ = {isa = PBXBuildFile; fileRef = 0ECEA0EF240E7DB0007DC71E /* evilkey1.p12 */; }; + 0ECEA0FA240E7DB1007DC71E /* otherkey1.pem in Resources */ = {isa = PBXBuildFile; fileRef = 0ECEA0F0240E7DB0007DC71E /* otherkey1.pem */; }; + 0ECEA0FB240E7DB1007DC71E /* mykey.pem in Resources */ = {isa = PBXBuildFile; fileRef = 0ECEA0F1240E7DB0007DC71E /* mykey.pem */; }; + 0ECEA0FC240E7DB1007DC71E /* myTestCA.p12 in Resources */ = {isa = PBXBuildFile; fileRef = 0ECEA0F2240E7DB0007DC71E /* myTestCA.p12 */; }; + 0ECEA0FD240E7DB1007DC71E /* otherkey1.p12 in Resources */ = {isa = PBXBuildFile; fileRef = 0ECEA0F3240E7DB0007DC71E /* otherkey1.p12 */; }; + 0ECEA0FE240E7DB1007DC71E /* mykey.p12 in Resources */ = {isa = PBXBuildFile; fileRef = 0ECEA0F4240E7DB0007DC71E /* mykey.p12 */; }; + 0ECEA0FF240E7DB1007DC71E /* evilCA.pem in Resources */ = {isa = PBXBuildFile; fileRef = 0ECEA0F5240E7DB0007DC71E /* evilCA.pem */; }; + 0ECEA100240E7DB1007DC71E /* evilkey1.pem in Resources */ = {isa = PBXBuildFile; fileRef = 0ECEA0F6240E7DB1007DC71E /* evilkey1.pem */; }; + 0ED9073024338E3C008CF9D0 /* SMIMETests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0ED9072F24338E3C008CF9D0 /* SMIMETests.swift */; }; + 0EF148052422543E00B3C198 /* Certificate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0EF148042422543E00B3C198 /* Certificate.swift */; }; + 0EF148082422572500B3C198 /* general-helpers.c in Sources */ = {isa = PBXBuildFile; fileRef = 0EF148072422572500B3C198 /* general-helpers.c */; }; + 0EF1480B2422584F00B3C198 /* certificate-helpers.c in Sources */ = {isa = PBXBuildFile; fileRef = 0EF1480A2422584F00B3C198 /* certificate-helpers.c */; }; + 0EF73F4324237E6500932FA0 /* SMIMEHelpers.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0EF73F4224237E6500932FA0 /* SMIMEHelpers.swift */; }; + 0EFEF0952417C0B400BB2FF7 /* CHelpers.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0EFEF0942417C0B400BB2FF7 /* CHelpers.swift */; }; 3E6B07DE2011246500E49609 /* invitationText.html in Resources */ = {isa = PBXBuildFile; fileRef = 3E6B07DD2011246500E49609 /* invitationText.html */; }; 3EB4FA9F2012007C001D0625 /* DialogViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3EB4FA9D2012007C001D0625 /* DialogViewController.swift */; }; 3EB4FAA12012007C001D0625 /* Dialog.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 3EB4FA9E2012007C001D0625 /* Dialog.storyboard */; }; @@ -152,6 +171,10 @@ 47F867E22052B48E00AA832F /* libz.tbd in Frameworks */ = {isa = PBXBuildFile; fileRef = 47F867E12052B48E00AA832F /* libz.tbd */; }; 47F867E42052B49800AA832F /* libbz2.tbd in Frameworks */ = {isa = PBXBuildFile; fileRef = 47F867E32052B49800AA832F /* libbz2.tbd */; }; 50F2E7D66366C779705987A7 /* Pods_enzevalos_iphoneUITests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF67EF30BB065CC9C0D17940 /* Pods_enzevalos_iphoneUITests.framework */; }; + 676C2D3024321F8100B631B3 /* TyposquattingTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 676C2D2F24321F8100B631B3 /* TyposquattingTests.swift */; }; + 6789425F2430C3B300C746D1 /* MailComparison.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6789425E2430C3B300C746D1 /* MailComparison.swift */; }; + 678942612430C3D600C746D1 /* Typosquatting.swift in Sources */ = {isa = PBXBuildFile; fileRef = 678942602430C3D600C746D1 /* Typosquatting.swift */; }; + 678942632430C40600C746D1 /* MailComparisonTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 678942622430C40600C746D1 /* MailComparisonTests.swift */; }; 71DF08982421520D00162B74 /* EmailStringExtensionTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 71DF08972421520D00162B74 /* EmailStringExtensionTests.swift */; }; 71DFE5BA240679E80042019C /* HeaderExtractionValues.swift in Sources */ = {isa = PBXBuildFile; fileRef = 71DFE5B9240679E80042019C /* HeaderExtractionValues.swift */; }; 7500EE9D4F3130671F5C1AE2 /* Pods_enzevalos_iphoneTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 7977EA7012D8E98D186D5C60 /* Pods_enzevalos_iphoneTests.framework */; }; @@ -234,6 +257,7 @@ A1F992291DA7C9100073BF1B /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = A1F9922B1DA7C9100073BF1B /* Main.storyboard */; }; A1F992391DA7DD2E0073BF1B /* InboxTableViewCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = A1F9923B1DA7DD2E0073BF1B /* InboxTableViewCell.xib */; }; A1FA44A721E10E1400DB02AC /* TravelHandler.swift in Sources */ = {isa = PBXBuildFile; fileRef = A1FA44A621E10E1400DB02AC /* TravelHandler.swift */; }; + A5E303D824110F6400310264 /* smime-helpers.c in Sources */ = {isa = PBXBuildFile; fileRef = A5E303D724110F6400310264 /* smime-helpers.c */; }; AC4001CA169DC07A7A1E3AD3 /* Pods_enzevalos_iphone.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 94EE54279AB591E0CAB8EFD8 /* Pods_enzevalos_iphone.framework */; }; F113C3851F30D06800E7F1D6 /* QRScannerView.swift in Sources */ = {isa = PBXBuildFile; fileRef = F113C3841F30D06800E7F1D6 /* QRScannerView.swift */; }; F113C38B1F3344C200E7F1D6 /* ViewControllerPannable.swift in Sources */ = {isa = PBXBuildFile; fileRef = F113C38A1F3344C200E7F1D6 /* ViewControllerPannable.swift */; }; @@ -295,7 +319,28 @@ 0E1C457924055F87006D104A /* signencinlineK9.eml */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = signencinlineK9.eml; sourceTree = "<group>"; }; 0E1C457E24055FB7006D104A /* Alice.v3.pubsec.asc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = Alice.v3.pubsec.asc; sourceTree = "<group>"; }; 0E1C457F24055FB7006D104A /* Alice.v3.pub.asc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = Alice.v3.pub.asc; sourceTree = "<group>"; }; - 0E6551A62406A42300DE30FC /* SearchHelper.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SearchHelper.swift; sourceTree = "<group>"; }; + 0ECA5797240D496800B0F231 /* SMIME.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SMIME.swift; sourceTree = "<group>"; }; + 0ECEA0E7240E7081007DC71E /* SearchHelper.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SearchHelper.swift; sourceTree = "<group>"; }; + 0ECEA0E9240E7D64007DC71E /* SMIME Test 1 S.eml */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = "SMIME Test 1 S.eml"; sourceTree = "<group>"; }; + 0ECEA0EB240E7D85007DC71E /* johnny C1.json.eml */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = "johnny C1.json.eml"; sourceTree = "<group>"; }; + 0ECEA0ED240E7DB0007DC71E /* evilCA.p12 */ = {isa = PBXFileReference; lastKnownFileType = file; path = evilCA.p12; sourceTree = "<group>"; }; + 0ECEA0EE240E7DB0007DC71E /* myTestCA.pem */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = myTestCA.pem; sourceTree = "<group>"; }; + 0ECEA0EF240E7DB0007DC71E /* evilkey1.p12 */ = {isa = PBXFileReference; lastKnownFileType = file; path = evilkey1.p12; sourceTree = "<group>"; }; + 0ECEA0F0240E7DB0007DC71E /* otherkey1.pem */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = otherkey1.pem; sourceTree = "<group>"; }; + 0ECEA0F1240E7DB0007DC71E /* mykey.pem */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = mykey.pem; sourceTree = "<group>"; }; + 0ECEA0F2240E7DB0007DC71E /* myTestCA.p12 */ = {isa = PBXFileReference; lastKnownFileType = file; path = myTestCA.p12; sourceTree = "<group>"; }; + 0ECEA0F3240E7DB0007DC71E /* otherkey1.p12 */ = {isa = PBXFileReference; lastKnownFileType = file; path = otherkey1.p12; sourceTree = "<group>"; }; + 0ECEA0F4240E7DB0007DC71E /* mykey.p12 */ = {isa = PBXFileReference; lastKnownFileType = file; path = mykey.p12; sourceTree = "<group>"; }; + 0ECEA0F5240E7DB0007DC71E /* evilCA.pem */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = evilCA.pem; sourceTree = "<group>"; }; + 0ECEA0F6240E7DB1007DC71E /* evilkey1.pem */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = evilkey1.pem; sourceTree = "<group>"; }; + 0ED9072F24338E3C008CF9D0 /* SMIMETests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SMIMETests.swift; sourceTree = "<group>"; }; + 0EF148042422543E00B3C198 /* Certificate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Certificate.swift; sourceTree = "<group>"; }; + 0EF148062422570F00B3C198 /* generic-helpers.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "generic-helpers.h"; sourceTree = "<group>"; }; + 0EF148072422572500B3C198 /* general-helpers.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = "general-helpers.c"; sourceTree = "<group>"; }; + 0EF148092422584F00B3C198 /* certificate-helpers.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "certificate-helpers.h"; sourceTree = "<group>"; }; + 0EF1480A2422584F00B3C198 /* certificate-helpers.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = "certificate-helpers.c"; sourceTree = "<group>"; }; + 0EF73F4224237E6500932FA0 /* SMIMEHelpers.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SMIMEHelpers.swift; sourceTree = "<group>"; }; + 0EFEF0942417C0B400BB2FF7 /* CHelpers.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CHelpers.swift; sourceTree = "<group>"; }; 1D4A9E60565DECF52C011BC0 /* Pods-enzevalos_iphone-AdHoc.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-enzevalos_iphone-AdHoc.release.xcconfig"; path = "../enzevalos_iphone_workspace/Pods/Target Support Files/Pods-enzevalos_iphone-AdHoc/Pods-enzevalos_iphone-AdHoc.release.xcconfig"; sourceTree = "<group>"; }; 3E6B07DD2011246500E49609 /* invitationText.html */ = {isa = PBXFileReference; lastKnownFileType = text.html; name = invitationText.html; path = Invitation/invitationText.html; sourceTree = "<group>"; }; 3E9708AD1FAC925D005825C9 /* enzevalos_iphone.entitlements */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.entitlements; path = enzevalos_iphone.entitlements; sourceTree = "<group>"; }; @@ -552,6 +597,10 @@ 48C250BB32BF11B683003BA1 /* Pods-enzevalos_iphone-enzevalos_iphoneUITests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-enzevalos_iphone-enzevalos_iphoneUITests.debug.xcconfig"; path = "../enzevalos_iphone_workspace/Pods/Target Support Files/Pods-enzevalos_iphone-enzevalos_iphoneUITests/Pods-enzevalos_iphone-enzevalos_iphoneUITests.debug.xcconfig"; sourceTree = "<group>"; }; 66E758F271CD65AB3E5FE7A7 /* Pods-enzevalos_iphoneUITests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-enzevalos_iphoneUITests.debug.xcconfig"; path = "../enzevalos_iphone_workspace/Pods/Target Support Files/Pods-enzevalos_iphoneUITests/Pods-enzevalos_iphoneUITests.debug.xcconfig"; sourceTree = "<group>"; }; 670159DF240FB4E800797FA5 /* enzevalos_iphone 9.xcdatamodel */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcdatamodel; path = "enzevalos_iphone 9.xcdatamodel"; sourceTree = "<group>"; }; + 676C2D2F24321F8100B631B3 /* TyposquattingTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TyposquattingTests.swift; sourceTree = "<group>"; }; + 6789425E2430C3B300C746D1 /* MailComparison.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MailComparison.swift; sourceTree = "<group>"; }; + 678942602430C3D600C746D1 /* Typosquatting.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Typosquatting.swift; sourceTree = "<group>"; }; + 678942622430C40600C746D1 /* MailComparisonTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MailComparisonTests.swift; sourceTree = "<group>"; }; 6EBCCD02AD3B95D8317810E2 /* Pods-enzevalos_iphoneTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-enzevalos_iphoneTests.debug.xcconfig"; path = "../enzevalos_iphone_workspace/Pods/Target Support Files/Pods-enzevalos_iphoneTests/Pods-enzevalos_iphoneTests.debug.xcconfig"; sourceTree = "<group>"; }; 71DF08972421520D00162B74 /* EmailStringExtensionTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EmailStringExtensionTests.swift; sourceTree = "<group>"; }; 71DFE5B9240679E80042019C /* HeaderExtractionValues.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HeaderExtractionValues.swift; sourceTree = "<group>"; }; @@ -661,6 +710,8 @@ A1F9923D1DA7DD350073BF1B /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/InboxTableViewCell.strings; sourceTree = "<group>"; }; A1F9923F1DA7DD370073BF1B /* de */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = de; path = de.lproj/InboxTableViewCell.strings; sourceTree = "<group>"; }; A1FA44A621E10E1400DB02AC /* TravelHandler.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TravelHandler.swift; sourceTree = "<group>"; }; + A5E303D624110F6400310264 /* smime-helpers.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "smime-helpers.h"; sourceTree = "<group>"; }; + A5E303D724110F6400310264 /* smime-helpers.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = "smime-helpers.c"; sourceTree = "<group>"; }; AA686D4FC9B86445A0C87F0F /* Pods-enzevalos_iphone.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-enzevalos_iphone.release.xcconfig"; path = "../enzevalos_iphone_workspace/Pods/Target Support Files/Pods-enzevalos_iphone/Pods-enzevalos_iphone.release.xcconfig"; sourceTree = "<group>"; }; AF67EF30BB065CC9C0D17940 /* Pods_enzevalos_iphoneUITests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_enzevalos_iphoneUITests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; BC7D006B3B40A23E53B4F317 /* Pods-enzevalos_iphoneTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-enzevalos_iphoneTests.release.xcconfig"; path = "../enzevalos_iphone_workspace/Pods/Target Support Files/Pods-enzevalos_iphoneTests/Pods-enzevalos_iphoneTests.release.xcconfig"; sourceTree = "<group>"; }; @@ -732,6 +783,25 @@ /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ + 0ECEA101240EA905007DC71E /* SMIME */ = { + isa = PBXGroup; + children = ( + 0EF148042422543E00B3C198 /* Certificate.swift */, + A5E303D524110F6400310264 /* c */, + 0ECA5797240D496800B0F231 /* SMIME.swift */, + 0EF73F4224237E6500932FA0 /* SMIMEHelpers.swift */, + ); + name = SMIME; + sourceTree = "<group>"; + }; + 0EFEF0932417C08B00BB2FF7 /* C Helpers */ = { + isa = PBXGroup; + children = ( + 0EFEF0942417C0B400BB2FF7 /* CHelpers.swift */, + ); + name = "C Helpers"; + sourceTree = "<group>"; + }; 24472862977D71D3F0AD0D58 /* Pods */ = { isa = PBXGroup; children = ( @@ -786,6 +856,8 @@ 470709112189BB4A00DF71A3 /* testMails */ = { isa = PBXGroup; children = ( + 0ECEA0EB240E7D85007DC71E /* johnny C1.json.eml */, + 0ECEA0E9240E7D64007DC71E /* SMIME Test 1 S.eml */, 4774DD7422D0015F00BD8CF6 /* multiIDs.eml */, 4774DD7A22D3F5D100BD8CF6 /* multiIDs2.eml */, 4774DD8022D4067D00BD8CF6 /* signedEncMailFromApple.eml */, @@ -1160,11 +1232,22 @@ path = private; sourceTree = "<group>"; }; + 6789425D2430C38800C746D1 /* Phishing */ = { + isa = PBXGroup; + children = ( + 6789425E2430C3B300C746D1 /* MailComparison.swift */, + 678942602430C3D600C746D1 /* Typosquatting.swift */, + ); + name = Phishing; + sourceTree = "<group>"; + }; 71DF0896242151E200162B74 /* phishing */ = { isa = PBXGroup; children = ( 988C9C5C240D507A006213F0 /* UrlStringExtensionTests.swift */, 71DF08972421520D00162B74 /* EmailStringExtensionTests.swift */, + 678942622430C40600C746D1 /* MailComparisonTests.swift */, + 676C2D2F24321F8100B631B3 /* TyposquattingTests.swift */, ); path = phishing; sourceTree = "<group>"; @@ -1277,6 +1360,7 @@ A1230BD81E2F881E006642C7 /* Encryption */ = { isa = PBXGroup; children = ( + 0ECEA101240EA905007DC71E /* SMIME */, 475B00301F7B9565006CDD41 /* SwiftPGP.swift */, 476801DA218436B600F7F259 /* Autocrypt.swift */, 47A5D6E12294BF3A0084F81D /* TempKey.swift */, @@ -1322,6 +1406,8 @@ A13526771D955BDF00D3BFE1 /* enzevalos_iphone */ = { isa = PBXGroup; children = ( + 0EFEF0932417C08B00BB2FF7 /* C Helpers */, + 6789425D2430C38800C746D1 /* Phishing */, 971D40482428C852002FCD31 /* gamification_2 */, 47EABF05241A9C7000774A93 /* Authentication */, 476406872416B54D00C7D426 /* SwiftUI */, @@ -1366,7 +1452,8 @@ A135268F1D955BE000D3BFE1 /* enzevalos_iphoneTests */ = { isa = PBXGroup; children = ( - 71DF0896242151E200162B74 /* phishing */, + 0ED9072F24338E3C008CF9D0 /* SMIMETests.swift */, + 71DF0896242151E200162B74 /* phishing */, 97C5279D241A9F690030BBC9 /* authentication */, 47F0376C22A7278A0005C9DE /* private */, 470709202189C24800DF71A3 /* testKeys */, @@ -1483,6 +1570,16 @@ A1C7FF8B1E895316000D1E92 /* keys */ = { isa = PBXGroup; children = ( + 0ECEA0ED240E7DB0007DC71E /* evilCA.p12 */, + 0ECEA0F5240E7DB0007DC71E /* evilCA.pem */, + 0ECEA0EF240E7DB0007DC71E /* evilkey1.p12 */, + 0ECEA0F6240E7DB1007DC71E /* evilkey1.pem */, + 0ECEA0F4240E7DB0007DC71E /* mykey.p12 */, + 0ECEA0F1240E7DB0007DC71E /* mykey.pem */, + 0ECEA0F2240E7DB0007DC71E /* myTestCA.p12 */, + 0ECEA0EE240E7DB0007DC71E /* myTestCA.pem */, + 0ECEA0F3240E7DB0007DC71E /* otherkey1.p12 */, + 0ECEA0F0240E7DB0007DC71E /* otherkey1.pem */, A1E5960D1FCC871E003791E9 /* researchteam.asc */, 479C649521F2139B00A01071 /* support_pk.asc */, 47CD5AAC2012369300E771A1 /* support_pk2.asc */, @@ -1540,6 +1637,19 @@ name = read; sourceTree = "<group>"; }; + A5E303D524110F6400310264 /* c */ = { + isa = PBXGroup; + children = ( + A5E303D624110F6400310264 /* smime-helpers.h */, + A5E303D724110F6400310264 /* smime-helpers.c */, + 0EF148062422570F00B3C198 /* generic-helpers.h */, + 0EF148072422572500B3C198 /* general-helpers.c */, + 0EF148092422584F00B3C198 /* certificate-helpers.h */, + 0EF1480A2422584F00B3C198 /* certificate-helpers.c */, + ); + path = c; + sourceTree = "<group>"; + }; F113C3831F30D01A00E7F1D6 /* QRCode */ = { isa = PBXGroup; children = ( @@ -1553,6 +1663,7 @@ F17654DF1F9E48F600D659B0 /* inbox */ = { isa = PBXGroup; children = ( + 0ECEA0E7240E7081007DC71E /* SearchHelper.swift */, F1F070261FA0DF3F004A860A /* Inbox.storyboard */, F12041FA1DA3FBF7002E4940 /* ListViewController.swift */, F12041FC1DA409A5002E4940 /* ListViewCell.swift */, @@ -1562,7 +1673,6 @@ A1EB05971D956947008659C1 /* InboxViewController.swift */, F120607F1DA540FE00F6EF37 /* RefreshControlExtension.swift */, A1F9923B1DA7DD2E0073BF1B /* InboxTableViewCell.xib */, - 0E6551A62406A42300DE30FC /* SearchHelper.swift */, ); name = inbox; sourceTree = "<group>"; @@ -1745,9 +1855,14 @@ A102AA8A1EDDB4F40024B457 /* videoOnboarding2.m4v in Resources */, A1F992391DA7DD2E0073BF1B /* InboxTableViewCell.xib in Resources */, 47E737742284610E00972401 /* KeyCell.xib in Resources */, + 0ECEA0FE240E7DB1007DC71E /* mykey.p12 in Resources */, + 0ECEA0FF240E7DB1007DC71E /* evilCA.pem in Resources */, + 0ECEA0FA240E7DB1007DC71E /* otherkey1.pem in Resources */, 47CD5AAD2012369400E771A1 /* support_pk2.asc in Resources */, A1EB058A1D956890008659C1 /* ContactCell.xib in Resources */, F1F070281FA0DF3F004A860A /* Inbox.storyboard in Resources */, + 0ECEA0FC240E7DB1007DC71E /* myTestCA.p12 in Resources */, + 0ECEA0F8240E7DB1007DC71E /* myTestCA.pem in Resources */, 4761420A1E082F9C00FD5E4F /* Settings.bundle in Resources */, A16BA2121E0439B6005E29E3 /* providers.json in Resources */, F12D8DBB2069422A0068788E /* About.storyboard in Resources */, @@ -1755,6 +1870,8 @@ 477670C4228453FB00043604 /* ButtonCell.xib in Resources */, 47E7377022845F3A00972401 /* KeyViews.storyboard in Resources */, 4751C6F82343B37C006B2A4D /* Onboarding.Video.Click.Eng.m4v in Resources */, + 0ECEA0F9240E7DB1007DC71E /* evilkey1.p12 in Resources */, + 0ECEA0F7240E7DB1007DC71E /* evilCA.p12 in Resources */, A1E5960E1FCC871F003791E9 /* researchteam.asc in Resources */, A1123E6A1DA682850069551C /* Localizable.strings in Resources */, A1F992291DA7C9100073BF1B /* Main.storyboard in Resources */, @@ -1764,6 +1881,7 @@ A1B49E5F21E54EE700ED86FC /* IntroContactView.xib in Resources */, A1BE3FF61E9664660040114B /* InfoPlist.strings in Resources */, 3E6B07DE2011246500E49609 /* invitationText.html in Resources */, + 0ECEA0FB240E7DB1007DC71E /* mykey.pem in Resources */, 8428A8531F4369C0007649A5 /* Gamification.storyboard in Resources */, 8428A8551F4369CF007649A5 /* GamificationElements.xcassets in Resources */, A182183221E518A400918A29 /* IntroContactCell.xib in Resources */, @@ -1773,6 +1891,8 @@ 4756DE0E20402F8E00452288 /* invitationTextCensor.html in Resources */, A1EB058C1D9568AB008659C1 /* FrequentCell.xib in Resources */, A182182721E5012300918A29 /* Intro.storyboard in Resources */, + 0ECEA100240E7DB1007DC71E /* evilkey1.pem in Resources */, + 0ECEA0FD240E7DB1007DC71E /* otherkey1.p12 in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -1786,6 +1906,7 @@ 479B597B20691C1A00B3944D /* ObjectivePGP.framework in Resources */, 470709282189C73900DF71A3 /* encInlineThunderbird.eml in Resources */, 479AFDA222571AB90063A332 /* EccAlice(777879D4)–Public.asc in Resources */, + 0ECEA0EA240E7D64007DC71E /* SMIME Test 1 S.eml in Resources */, 470709292189C73900DF71A3 /* signedInlineThunderbird.eml in Resources */, 8428A8841F436ACC007649A5 /* GamificationElements.xcassets in Resources */, 4707092D2189C74200DF71A3 /* bobSecret.asc in Resources */, @@ -1807,6 +1928,7 @@ 0E1C457C24055F87006D104A /* signencK9.eml in Resources */, 4774DD8122D4067E00BD8CF6 /* signedEncMailFromApple.eml in Resources */, 4774DD7B22D3F5D100BD8CF6 /* multiIDs2.eml in Resources */, + 0ECEA0EC240E7D85007DC71E /* johnny C1.json.eml in Resources */, 470709272189C73900DF71A3 /* encThunderbird.eml in Resources */, 0E1C457A24055F87006D104A /* signinlineK9.eml in Resources */, 47E7BE5D22319B7100C8EF94 /* SignedMailFromMac.eml in Resources */, @@ -1847,12 +1969,15 @@ "${PODS_ROOT}/Target Support Files/Pods-enzevalos_iphone/Pods-enzevalos_iphone-frameworks.sh", "${BUILT_PRODUCTS_DIR}/AppAuth/AppAuth.framework", "${BUILT_PRODUCTS_DIR}/BZipCompression/BZipCompression.framework", + "${BUILT_PRODUCTS_DIR}/Cuckoo/Cuckoo.framework", "${BUILT_PRODUCTS_DIR}/FrameAccessor/FrameAccessor.framework", "${BUILT_PRODUCTS_DIR}/GTMAppAuth/GTMAppAuth.framework", "${BUILT_PRODUCTS_DIR}/GTMSessionFetcher/GTMSessionFetcher.framework", "${BUILT_PRODUCTS_DIR}/KeychainAccess/KeychainAccess.framework", "${BUILT_PRODUCTS_DIR}/Onboard/Onboard.framework", + "${BUILT_PRODUCTS_DIR}/Punycode/Punycode.framework", "${BUILT_PRODUCTS_DIR}/QAKit/QAKit.framework", + "${BUILT_PRODUCTS_DIR}/TLDExtract/TLDExtract.framework", "${BUILT_PRODUCTS_DIR}/Travellib/Travellib.framework", "${BUILT_PRODUCTS_DIR}/VENTokenField/VENTokenField.framework", ); @@ -1860,12 +1985,15 @@ outputPaths = ( "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/AppAuth.framework", "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/BZipCompression.framework", + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/Cuckoo.framework", "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/FrameAccessor.framework", "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/GTMAppAuth.framework", "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/GTMSessionFetcher.framework", "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/KeychainAccess.framework", "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/Onboard.framework", + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/Punycode.framework", "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/QAKit.framework", + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/TLDExtract.framework", "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/Travellib.framework", "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/VENTokenField.framework", ); @@ -2008,16 +2136,20 @@ A1EB05801D956851008659C1 /* SendViewController.swift in Sources */, 479C649B21F45DAF00A01071 /* PasswordToggleVisibilityView.swift in Sources */, 47691A8C1ECC3EC7004BCFC5 /* EphemeralMail.swift in Sources */, + A5E303D824110F6400310264 /* smime-helpers.c in Sources */, A142E70921E7919F000395E3 /* IntroContactViewController.swift in Sources */, 8428A8671F436A11007649A5 /* SubBadgeHeaderTableViewCell.swift in Sources */, A1EB05981D956947008659C1 /* InboxViewController.swift in Sources */, F1984D721E1D327200804E1E /* IconsStyleKit.swift in Sources */, F1737ACB2031D7D70000312B /* StudySettings.swift in Sources */, + 0ECA5798240D496800B0F231 /* SMIME.swift in Sources */, + 6789425F2430C3B300C746D1 /* MailComparison.swift in Sources */, 8428A8691F436A11007649A5 /* UserNameGamificationTableViewCell.swift in Sources */, A114E4321FACB23000E40243 /* StringExtension.swift in Sources */, 472F398C1E2519C8009260FB /* CNContactExtension.swift in Sources */, 476406A12416B5C800C7D426 /* OnboardingIntro.swift in Sources */, 476406972416B54D00C7D426 /* InboxCoordinator.swift in Sources */, + 0EF148082422572500B3C198 /* general-helpers.c in Sources */, F113C3851F30D06800E7F1D6 /* QRScannerView.swift in Sources */, 97BDE0432429188500B0BF03 /* BadgeProgressView.swift in Sources */, 477670C6228454F700043604 /* ButtonCell.swift in Sources */, @@ -2081,6 +2213,7 @@ A182182C21E5072200918A29 /* IntroDescriptionViewController.swift in Sources */, F1C7AC821FED6473007629DB /* AboutViewController.swift in Sources */, A182183421E51DD200918A29 /* IntroContactCell.swift in Sources */, + 678942612430C3D600C746D1 /* Typosquatting.swift in Sources */, 472F397C1E1D0B0B009260FB /* PersistentMail +CoreDataProperties.swift in Sources */, 8428A85C1F436A05007649A5 /* ArrowView.swift in Sources */, 47E737762284632F00972401 /* KeyCell.swift in Sources */, @@ -2091,6 +2224,7 @@ A111F6AD1FA77B170060AFDE /* LoggerDetail.swift in Sources */, A13526791D955BDF00D3BFE1 /* AppDelegate.swift in Sources */, 476916A2216B86CF00491527 /* EnzevalosContact+CoreDataClass.swift in Sources */, + 0EF148052422543E00B3C198 /* Certificate.swift in Sources */, A1ECE54B1EFBE7ED0009349F /* FolderCell.swift in Sources */, 8428A85F1F436A05007649A5 /* GamificationData.swift in Sources */, 475DF4791F0D54C9009D807F /* Folder+CoreDataClass.swift in Sources */, @@ -2101,6 +2235,7 @@ 475B00341F7B9565006CDD41 /* Cryptography.swift in Sources */, A1EB057C1D956838008659C1 /* MailHandler.swift in Sources */, A182182E21E50D8D00918A29 /* IntroButtonViewController.swift in Sources */, + 0EFEF0952417C0B400BB2FF7 /* CHelpers.swift in Sources */, 4764069D2416B54D00C7D426 /* Stroke.swift in Sources */, 478AF715222FD5C600AEF69E /* IncomingMail.swift in Sources */, 47EABF09241A9C8700774A93 /* AuthenticationModel.swift in Sources */, @@ -2109,12 +2244,12 @@ 472F39701E14F75C009260FB /* DataHandler.swift in Sources */, A1C62E9A2018F716000E5273 /* OnboardingValueState.swift in Sources */, A1EB05901D956923008659C1 /* ReadViewController.swift in Sources */, - 0E6551A72406A42300DE30FC /* SearchHelper.swift in Sources */, 472F398E1E251B8D009260FB /* MailAddress.swift in Sources */, A198D2292056B384004CC838 /* SendViewDelegate.swift in Sources */, 479011492289975D0057AB04 /* NoSecIconStyleKit.swift in Sources */, F12060821DA552FC00F6EF37 /* MailHandlerDelegator.swift in Sources */, 474994022261E4E6000F8DA5 /* SimpleSendIcon.swift in Sources */, + 0ECEA0E8240E7081007DC71E /* SearchHelper.swift in Sources */, A12F91D821F3A99800AB0589 /* NSLayoutConstraintExtension.swift in Sources */, 71DFE5BA240679E80042019C /* HeaderExtractionValues.swift in Sources */, 47EABF0D241A9CA800774A93 /* MailAccount.swift in Sources */, @@ -2124,6 +2259,7 @@ 47E7376E22845EC400972401 /* SecretKeyTableViewController.swift in Sources */, 478154A721FF3F0900A931EC /* Warning.swift in Sources */, 4764069F2416B5A600C7D426 /* NewOnboardingView.swift in Sources */, + 0EF73F4324237E6500932FA0 /* SMIMEHelpers.swift in Sources */, 47EABF0B241A9C8700774A93 /* AuthenticationScreen.swift in Sources */, 8428A8681F436A11007649A5 /* SubBadgeTableViewCell.swift in Sources */, A1EB05861D956872008659C1 /* FrequentCell.swift in Sources */, @@ -2134,6 +2270,7 @@ 478154AC21FF6A9600A931EC /* Mailbot.swift in Sources */, 8428A86E1F436A1E007649A5 /* BadgeCase.swift in Sources */, A1B49E5D21E54CBF00ED86FC /* IntroContactTableViewController.swift in Sources */, + 0EF1480B2422584F00B3C198 /* certificate-helpers.c in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -2141,13 +2278,16 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( + 676C2D3024321F8100B631B3 /* TyposquattingTests.swift in Sources */, 8428A8831F436AC9007649A5 /* GamificationDataUnitTest.swift in Sources */, 71DF08982421520D00162B74 /* EmailStringExtensionTests.swift in Sources */, 3EC35F302003838E008BDF95 /* InvitationTests.swift in Sources */, 474054982244D7A9007CF83B /* MailServerConfigurationTest.swift in Sources */, + 678942632430C40600C746D1 /* MailComparisonTests.swift in Sources */, 479B5977206914BE00B3944D /* CryptoTests.swift in Sources */, A15D215F223BE6E4003E0CE0 /* MailTest.swift in Sources */, - 47EABF0F2420C63600774A93 /* AuthenticationTests.swift in Sources */, + 0ED9073024338E3C008CF9D0 /* SMIMETests.swift in Sources */, + 47EABF0F2420C63600774A93 /* AuthenticationTests.swift in Sources */, 988C9C5D240D507A006213F0 /* UrlStringExtensionTests.swift in Sources */, 4715F637202A0248001BFFD0 /* CoreDataTests.swift in Sources */, 47C22281218AFD6300BD2C2B /* AutocryptTest.swift in Sources */, diff --git a/enzevalos_iphone.xcodeproj/project.pbxproj.orig b/enzevalos_iphone.xcodeproj/project.pbxproj.orig new file mode 100644 index 0000000000000000000000000000000000000000..28d911baec08c8a5d4bbbb5194599ed0d4f5a5df --- /dev/null +++ b/enzevalos_iphone.xcodeproj/project.pbxproj.orig @@ -0,0 +1,2833 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 46; + objects = { + +/* Begin PBXBuildFile section */ + 0E1C457A24055F87006D104A /* signinlineK9.eml in Resources */ = {isa = PBXBuildFile; fileRef = 0E1C457624055F87006D104A /* signinlineK9.eml */; }; + 0E1C457B24055F87006D104A /* signK9.eml in Resources */ = {isa = PBXBuildFile; fileRef = 0E1C457724055F87006D104A /* signK9.eml */; }; + 0E1C457C24055F87006D104A /* signencK9.eml in Resources */ = {isa = PBXBuildFile; fileRef = 0E1C457824055F87006D104A /* signencK9.eml */; }; + 0E1C457D24055F87006D104A /* signencinlineK9.eml in Resources */ = {isa = PBXBuildFile; fileRef = 0E1C457924055F87006D104A /* signencinlineK9.eml */; }; + 0E1C458024055FB7006D104A /* Alice.v3.pubsec.asc in Resources */ = {isa = PBXBuildFile; fileRef = 0E1C457E24055FB7006D104A /* Alice.v3.pubsec.asc */; }; + 0E1C458124055FB7006D104A /* Alice.v3.pub.asc in Resources */ = {isa = PBXBuildFile; fileRef = 0E1C457F24055FB7006D104A /* Alice.v3.pub.asc */; }; + 0ECA5798240D496800B0F231 /* SMIME.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0ECA5797240D496800B0F231 /* SMIME.swift */; }; + 0ECEA0E8240E7081007DC71E /* SearchHelper.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0ECEA0E7240E7081007DC71E /* SearchHelper.swift */; }; + 0ECEA0EA240E7D64007DC71E /* SMIME Test 1 S.eml in Resources */ = {isa = PBXBuildFile; fileRef = 0ECEA0E9240E7D64007DC71E /* SMIME Test 1 S.eml */; }; + 0ECEA0EC240E7D85007DC71E /* johnny C1.json.eml in Resources */ = {isa = PBXBuildFile; fileRef = 0ECEA0EB240E7D85007DC71E /* johnny C1.json.eml */; }; + 0ECEA0F7240E7DB1007DC71E /* evilCA.p12 in Resources */ = {isa = PBXBuildFile; fileRef = 0ECEA0ED240E7DB0007DC71E /* evilCA.p12 */; }; + 0ECEA0F8240E7DB1007DC71E /* myTestCA.pem in Resources */ = {isa = PBXBuildFile; fileRef = 0ECEA0EE240E7DB0007DC71E /* myTestCA.pem */; }; + 0ECEA0F9240E7DB1007DC71E /* evilkey1.p12 in Resources */ = {isa = PBXBuildFile; fileRef = 0ECEA0EF240E7DB0007DC71E /* evilkey1.p12 */; }; + 0ECEA0FA240E7DB1007DC71E /* otherkey1.pem in Resources */ = {isa = PBXBuildFile; fileRef = 0ECEA0F0240E7DB0007DC71E /* otherkey1.pem */; }; + 0ECEA0FB240E7DB1007DC71E /* mykey.pem in Resources */ = {isa = PBXBuildFile; fileRef = 0ECEA0F1240E7DB0007DC71E /* mykey.pem */; }; + 0ECEA0FC240E7DB1007DC71E /* myTestCA.p12 in Resources */ = {isa = PBXBuildFile; fileRef = 0ECEA0F2240E7DB0007DC71E /* myTestCA.p12 */; }; + 0ECEA0FD240E7DB1007DC71E /* otherkey1.p12 in Resources */ = {isa = PBXBuildFile; fileRef = 0ECEA0F3240E7DB0007DC71E /* otherkey1.p12 */; }; + 0ECEA0FE240E7DB1007DC71E /* mykey.p12 in Resources */ = {isa = PBXBuildFile; fileRef = 0ECEA0F4240E7DB0007DC71E /* mykey.p12 */; }; + 0ECEA0FF240E7DB1007DC71E /* evilCA.pem in Resources */ = {isa = PBXBuildFile; fileRef = 0ECEA0F5240E7DB0007DC71E /* evilCA.pem */; }; + 0ECEA100240E7DB1007DC71E /* evilkey1.pem in Resources */ = {isa = PBXBuildFile; fileRef = 0ECEA0F6240E7DB1007DC71E /* evilkey1.pem */; }; + 0ED9073024338E3C008CF9D0 /* SMIMETests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0ED9072F24338E3C008CF9D0 /* SMIMETests.swift */; }; + 0EF148052422543E00B3C198 /* Certificate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0EF148042422543E00B3C198 /* Certificate.swift */; }; + 0EF148082422572500B3C198 /* general-helpers.c in Sources */ = {isa = PBXBuildFile; fileRef = 0EF148072422572500B3C198 /* general-helpers.c */; }; + 0EF1480B2422584F00B3C198 /* certificate-helpers.c in Sources */ = {isa = PBXBuildFile; fileRef = 0EF1480A2422584F00B3C198 /* certificate-helpers.c */; }; + 0EF73F4324237E6500932FA0 /* SMIMEHelpers.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0EF73F4224237E6500932FA0 /* SMIMEHelpers.swift */; }; + 0EFEF0952417C0B400BB2FF7 /* CHelpers.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0EFEF0942417C0B400BB2FF7 /* CHelpers.swift */; }; + 3E6B07DE2011246500E49609 /* invitationText.html in Resources */ = {isa = PBXBuildFile; fileRef = 3E6B07DD2011246500E49609 /* invitationText.html */; }; + 3EB4FA9F2012007C001D0625 /* DialogViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3EB4FA9D2012007C001D0625 /* DialogViewController.swift */; }; + 3EB4FAA12012007C001D0625 /* Dialog.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 3EB4FA9E2012007C001D0625 /* Dialog.storyboard */; }; + 3EB4FAA420120096001D0625 /* DialogOption.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3EB4FAA320120096001D0625 /* DialogOption.swift */; }; + 3EC35F2420037651008BDF95 /* InvitationHelper.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3EC35F2320037651008BDF95 /* InvitationHelper.swift */; }; + 3EC35F2D200376A1008BDF95 /* SendViewController+Invitation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3EC35F2C200376A1008BDF95 /* SendViewController+Invitation.swift */; }; + 3EC35F302003838E008BDF95 /* InvitationTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3EC35F2F2003838E008BDF95 /* InvitationTests.swift */; }; + 4706D65F225B7B6B00B3F1D3 /* ItunesHandler.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4706D65E225B7B6B00B3F1D3 /* ItunesHandler.swift */; }; + 4706D661225CD21D00B3F1D3 /* ExportKeyHelper.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4706D660225CD21D00B3F1D3 /* ExportKeyHelper.swift */; }; + 4707091E2189BC3500DF71A3 /* plainThunderbird.eml in Resources */ = {isa = PBXBuildFile; fileRef = 470709172189BC3500DF71A3 /* plainThunderbird.eml */; }; + 470709262189C73900DF71A3 /* enc+signedInlineThunderbird.eml in Resources */ = {isa = PBXBuildFile; fileRef = 470709212189C73900DF71A3 /* enc+signedInlineThunderbird.eml */; }; + 470709272189C73900DF71A3 /* encThunderbird.eml in Resources */ = {isa = PBXBuildFile; fileRef = 470709222189C73900DF71A3 /* encThunderbird.eml */; }; + 470709282189C73900DF71A3 /* encInlineThunderbird.eml in Resources */ = {isa = PBXBuildFile; fileRef = 470709232189C73900DF71A3 /* encInlineThunderbird.eml */; }; + 470709292189C73900DF71A3 /* signedInlineThunderbird.eml in Resources */ = {isa = PBXBuildFile; fileRef = 470709242189C73900DF71A3 /* signedInlineThunderbird.eml */; }; + 4707092A2189C73900DF71A3 /* signedThunderbird.eml in Resources */ = {isa = PBXBuildFile; fileRef = 470709252189C73900DF71A3 /* signedThunderbird.eml */; }; + 4707092D2189C74200DF71A3 /* bobSecret.asc in Resources */ = {isa = PBXBuildFile; fileRef = 4707092B2189C74200DF71A3 /* bobSecret.asc */; }; + 4707092E2189C74200DF71A3 /* alicePublic.asc in Resources */ = {isa = PBXBuildFile; fileRef = 4707092C2189C74200DF71A3 /* alicePublic.asc */; }; + 470709302189E1C100DF71A3 /* enc+signedThunderbird.eml in Resources */ = {isa = PBXBuildFile; fileRef = 4707092F2189E1C000DF71A3 /* enc+signedThunderbird.eml */; }; + 4707096D1F8F9F4900657F41 /* ExportViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4707096C1F8F9F4900657F41 /* ExportViewController.swift */; }; + 4715F637202A0248001BFFD0 /* CoreDataTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4715F636202A0248001BFFD0 /* CoreDataTests.swift */; }; + 47184C3922F0D8F200712A7A /* CFNetwork.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 47184C3822F0D8F200712A7A /* CFNetwork.framework */; }; + 471876F7223FACA900912135 /* BobPWTEST1234.asc in Resources */ = {isa = PBXBuildFile; fileRef = 471876F5223FACA900912135 /* BobPWTEST1234.asc */; }; + 471876F8223FACA900912135 /* BobWithoutPW.asc in Resources */ = {isa = PBXBuildFile; fileRef = 471876F6223FACA900912135 /* BobWithoutPW.asc */; }; + 472F396E1E14F384009260FB /* CoreData.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 472F396D1E14F384009260FB /* CoreData.framework */; }; + 472F39701E14F75C009260FB /* DataHandler.swift in Sources */ = {isa = PBXBuildFile; fileRef = 472F396F1E14F75C009260FB /* DataHandler.swift */; }; + 472F397C1E1D0B0B009260FB /* PersistentMail +CoreDataProperties.swift in Sources */ = {isa = PBXBuildFile; fileRef = 472F39781E1D0B0B009260FB /* PersistentMail +CoreDataProperties.swift */; }; + 472F397E1E1D0B0B009260FB /* EnzevalosContact+CoreDataProperties.swift in Sources */ = {isa = PBXBuildFile; fileRef = 472F397A1E1D0B0B009260FB /* EnzevalosContact+CoreDataProperties.swift */; }; + 472F39811E1E5347009260FB /* Mail_Address+CoreDataClass.swift in Sources */ = {isa = PBXBuildFile; fileRef = 472F397F1E1E5347009260FB /* Mail_Address+CoreDataClass.swift */; }; + 472F39821E1E5347009260FB /* Mail_Address+CoreDataProperties.swift in Sources */ = {isa = PBXBuildFile; fileRef = 472F39801E1E5347009260FB /* Mail_Address+CoreDataProperties.swift */; }; + 472F39861E1FA34E009260FB /* Record.swift in Sources */ = {isa = PBXBuildFile; fileRef = 472F39851E1FA34E009260FB /* Record.swift */; }; + 472F398A1E251787009260FB /* Contact.swift in Sources */ = {isa = PBXBuildFile; fileRef = 472F39891E251787009260FB /* Contact.swift */; }; + 472F398C1E2519C8009260FB /* CNContactExtension.swift in Sources */ = {isa = PBXBuildFile; fileRef = 472F398B1E2519C8009260FB /* CNContactExtension.swift */; }; + 472F398E1E251B8D009260FB /* MailAddress.swift in Sources */ = {isa = PBXBuildFile; fileRef = 472F398D1E251B8D009260FB /* MailAddress.swift */; }; + 472F39901E252470009260FB /* CNMailAddressesExtension.swift in Sources */ = {isa = PBXBuildFile; fileRef = 472F398F1E252470009260FB /* CNMailAddressesExtension.swift */; }; + 474054982244D7A9007CF83B /* MailServerConfigurationTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 474054972244D7A9007CF83B /* MailServerConfigurationTest.swift */; }; + 474994022261E4E6000F8DA5 /* SimpleSendIcon.swift in Sources */ = {isa = PBXBuildFile; fileRef = 474994012261E4E6000F8DA5 /* SimpleSendIcon.swift */; }; + 4751C6EE233CA583006B2A4D /* DateExtension.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4751C6ED233CA583006B2A4D /* DateExtension.swift */; }; + 4751C6F82343B37C006B2A4D /* Onboarding.Video.Click.Eng.m4v in Resources */ = {isa = PBXBuildFile; fileRef = 4751C6F72343B377006B2A4D /* Onboarding.Video.Click.Eng.m4v */; }; + 4751C6FA23449699006B2A4D /* CryptoManagementViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4751C6F923449699006B2A4D /* CryptoManagementViewController.swift */; }; + 4751C6FC2344C8D1006B2A4D /* KeyTableViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4751C6FB2344C8D1006B2A4D /* KeyTableViewController.swift */; }; + 4751C7002344D37C006B2A4D /* SecretKey+CoreDataClass.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4751C6FE2344D37C006B2A4D /* SecretKey+CoreDataClass.swift */; }; + 4751C7012344D37C006B2A4D /* SecretKey+CoreDataProperties.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4751C6FF2344D37C006B2A4D /* SecretKey+CoreDataProperties.swift */; }; + 4756DE0E20402F8E00452288 /* invitationTextCensor.html in Resources */ = {isa = PBXBuildFile; fileRef = 4756DE0D20402F8E00452288 /* invitationTextCensor.html */; }; + 475B00331F7B9565006CDD41 /* SwiftPGP.swift in Sources */ = {isa = PBXBuildFile; fileRef = 475B00301F7B9565006CDD41 /* SwiftPGP.swift */; }; + 475B00341F7B9565006CDD41 /* Cryptography.swift in Sources */ = {isa = PBXBuildFile; fileRef = 475B00311F7B9565006CDD41 /* Cryptography.swift */; }; + 475B00351F7B9565006CDD41 /* CryptoObject.swift in Sources */ = {isa = PBXBuildFile; fileRef = 475B00321F7B9565006CDD41 /* CryptoObject.swift */; }; + 475B00421F7BB6D6006CDD41 /* PersistentKey+CoreDataClass.swift in Sources */ = {isa = PBXBuildFile; fileRef = 475B00401F7BB6D6006CDD41 /* PersistentKey+CoreDataClass.swift */; }; + 475B00431F7BB6D6006CDD41 /* PersistentKey+CoreDataProperties.swift in Sources */ = {isa = PBXBuildFile; fileRef = 475B00411F7BB6D6006CDD41 /* PersistentKey+CoreDataProperties.swift */; }; + 475DF4791F0D54C9009D807F /* Folder+CoreDataClass.swift in Sources */ = {isa = PBXBuildFile; fileRef = 475DF4771F0D54C9009D807F /* Folder+CoreDataClass.swift */; }; + 475DF47A1F0D54C9009D807F /* Folder+CoreDataProperties.swift in Sources */ = {isa = PBXBuildFile; fileRef = 475DF4781F0D54C9009D807F /* Folder+CoreDataProperties.swift */; }; + 476142081E07E52B00FD5E4F /* Theme.swift in Sources */ = {isa = PBXBuildFile; fileRef = 476142071E07E52B00FD5E4F /* Theme.swift */; }; + 4761420A1E082F9C00FD5E4F /* Settings.bundle in Resources */ = {isa = PBXBuildFile; fileRef = 476142091E082F9C00FD5E4F /* Settings.bundle */; }; + 476373C21E09BA88004D5EFE /* UserData.swift in Sources */ = {isa = PBXBuildFile; fileRef = 476373C11E09BA88004D5EFE /* UserData.swift */; }; + 4764067E2416AA6F00C7D426 /* libcrypto.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 476406092416AA6F00C7D426 /* libcrypto.a */; }; + 476406802416AA6F00C7D426 /* libssl.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 4764060B2416AA6F00C7D426 /* libssl.a */; }; + 476406822416AA6F00C7D426 /* LICENSE in Resources */ = {isa = PBXBuildFile; fileRef = 4764060F2416AA6F00C7D426 /* LICENSE */; }; + 476406842416AA9100C7D426 /* TestOpenSSL.swift in Sources */ = {isa = PBXBuildFile; fileRef = 476406832416AA9100C7D426 /* TestOpenSSL.swift */; }; + 476406952416B54D00C7D426 /* KeyRecordRow.swift in Sources */ = {isa = PBXBuildFile; fileRef = 476406892416B54D00C7D426 /* KeyRecordRow.swift */; }; + 476406962416B54D00C7D426 /* Inbox.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4764068A2416B54D00C7D426 /* Inbox.swift */; }; + 476406972416B54D00C7D426 /* InboxCoordinator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4764068B2416B54D00C7D426 /* InboxCoordinator.swift */; }; + 476406982416B54D00C7D426 /* CiricleImage.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4764068D2416B54D00C7D426 /* CiricleImage.swift */; }; + 476406992416B54D00C7D426 /* SearchView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4764068E2416B54D00C7D426 /* SearchView.swift */; }; + 4764069A2416B54D00C7D426 /* MailView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4764068F2416B54D00C7D426 /* MailView.swift */; }; + 4764069C2416B54D00C7D426 /* VCSwiftUIView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 476406922416B54D00C7D426 /* VCSwiftUIView.swift */; }; + 4764069D2416B54D00C7D426 /* Stroke.swift in Sources */ = {isa = PBXBuildFile; fileRef = 476406942416B54D00C7D426 /* Stroke.swift */; }; + 4764069F2416B5A600C7D426 /* NewOnboardingView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4764069E2416B5A600C7D426 /* NewOnboardingView.swift */; }; + 476406A12416B5C800C7D426 /* OnboardingIntro.swift in Sources */ = {isa = PBXBuildFile; fileRef = 476406A02416B5C800C7D426 /* OnboardingIntro.swift */; }; + 476801DB218436B600F7F259 /* Autocrypt.swift in Sources */ = {isa = PBXBuildFile; fileRef = 476801DA218436B600F7F259 /* Autocrypt.swift */; }; + 476801DE21846A5A00F7F259 /* OutgoingMail.swift in Sources */ = {isa = PBXBuildFile; fileRef = 476801DD21846A5A00F7F259 /* OutgoingMail.swift */; }; + 476916A0216B86A100491527 /* PersistentMail +CoreDataClass.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4769169F216B86A100491527 /* PersistentMail +CoreDataClass.swift */; }; + 476916A2216B86CF00491527 /* EnzevalosContact+CoreDataClass.swift in Sources */ = {isa = PBXBuildFile; fileRef = 476916A1216B86CF00491527 /* EnzevalosContact+CoreDataClass.swift */; }; + 47691A8A1ECB56D1004BCFC5 /* Mail.swift in Sources */ = {isa = PBXBuildFile; fileRef = 47691A891ECB56D1004BCFC5 /* Mail.swift */; }; + 47691A8C1ECC3EC7004BCFC5 /* EphemeralMail.swift in Sources */ = {isa = PBXBuildFile; fileRef = 47691A8B1ECC3EC7004BCFC5 /* EphemeralMail.swift */; }; + 476EEF9922A872BF00BB4EF7 /* enzevalos_iphoneUITests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 476EEF9822A872BF00BB4EF7 /* enzevalos_iphoneUITests.swift */; }; + 476EEFA122A873A800BB4EF7 /* OnboardingTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 476EEFA022A873A800BB4EF7 /* OnboardingTest.swift */; }; + 476EEFA722A87B9800BB4EF7 /* accounts.json in Resources */ = {isa = PBXBuildFile; fileRef = 476EEFA622A87B9800BB4EF7 /* accounts.json */; }; + 4774DD7322CFFD0E00BD8CF6 /* AliceMultiIDs (439EE43C) – Public.asc in Resources */ = {isa = PBXBuildFile; fileRef = 4774DD7222CFFD0E00BD8CF6 /* AliceMultiIDs (439EE43C) – Public.asc */; }; + 4774DD7522D0015F00BD8CF6 /* multiIDs.eml in Resources */ = {isa = PBXBuildFile; fileRef = 4774DD7422D0015F00BD8CF6 /* multiIDs.eml */; }; + 4774DD7B22D3F5D100BD8CF6 /* multiIDs2.eml in Resources */ = {isa = PBXBuildFile; fileRef = 4774DD7A22D3F5D100BD8CF6 /* multiIDs2.eml */; }; + 4774DD7E22D4062200BD8CF6 /* Bob Letterbox (0B6CD0A0) – Secret.asc in Resources */ = {isa = PBXBuildFile; fileRef = 4774DD7C22D4062200BD8CF6 /* Bob Letterbox (0B6CD0A0) – Secret.asc */; }; + 4774DD7F22D4062200BD8CF6 /* Alice Letterbox (439EE43C) – Public.asc in Resources */ = {isa = PBXBuildFile; fileRef = 4774DD7D22D4062200BD8CF6 /* Alice Letterbox (439EE43C) – Public.asc */; }; + 4774DD8122D4067E00BD8CF6 /* signedEncMailFromApple.eml in Resources */ = {isa = PBXBuildFile; fileRef = 4774DD8022D4067D00BD8CF6 /* signedEncMailFromApple.eml */; }; + 477548DE21F5DABE000B22A8 /* MailServerConnectionError.swift in Sources */ = {isa = PBXBuildFile; fileRef = 477548DD21F5DABE000B22A8 /* MailServerConnectionError.swift */; }; + 477548E221F77466000B22A8 /* SecurityIndicator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 477548E121F77466000B22A8 /* SecurityIndicator.swift */; }; + 477548E421F77BA0000B22A8 /* StudyParameterProtocol.swift in Sources */ = {isa = PBXBuildFile; fileRef = 477548E321F77BA0000B22A8 /* StudyParameterProtocol.swift */; }; + 477670C4228453FB00043604 /* ButtonCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = 477670C3228453FB00043604 /* ButtonCell.xib */; }; + 477670C6228454F700043604 /* ButtonCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 477670C5228454F700043604 /* ButtonCell.swift */; }; + 478154A721FF3F0900A931EC /* Warning.swift in Sources */ = {isa = PBXBuildFile; fileRef = 478154A621FF3F0900A931EC /* Warning.swift */; }; + 478154A921FF3FF400A931EC /* Invitation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 478154A821FF3FF400A931EC /* Invitation.swift */; }; + 478154AC21FF6A9600A931EC /* Mailbot.swift in Sources */ = {isa = PBXBuildFile; fileRef = 478154AB21FF6A9600A931EC /* Mailbot.swift */; }; + 478154AE2200641900A931EC /* StudyTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 478154AD2200641900A931EC /* StudyTest.swift */; }; + 478AF715222FD5C600AEF69E /* IncomingMail.swift in Sources */ = {isa = PBXBuildFile; fileRef = 478AF714222FD5C600AEF69E /* IncomingMail.swift */; }; + 479011492289975D0057AB04 /* NoSecIconStyleKit.swift in Sources */ = {isa = PBXBuildFile; fileRef = 479011482289975C0057AB04 /* NoSecIconStyleKit.swift */; }; + 479AFDA222571AB90063A332 /* EccAlice(777879D4)–Public.asc in Resources */ = {isa = PBXBuildFile; fileRef = 479AFDA122571AB90063A332 /* EccAlice(777879D4)–Public.asc */; }; + 479B5977206914BE00B3944D /* CryptoTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 479B5976206914BE00B3944D /* CryptoTests.swift */; }; + 479B597820691BE400B3944D /* ObjectivePGP.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 47CEF4EC2052C3E600887CDB /* ObjectivePGP.framework */; }; + 479B597920691BFB00B3944D /* libbz2.tbd in Frameworks */ = {isa = PBXBuildFile; fileRef = 47F867E32052B49800AA832F /* libbz2.tbd */; }; + 479B597A20691C0600B3944D /* libz.tbd in Frameworks */ = {isa = PBXBuildFile; fileRef = 47F867E12052B48E00AA832F /* libz.tbd */; }; + 479B597B20691C1A00B3944D /* ObjectivePGP.framework in Resources */ = {isa = PBXBuildFile; fileRef = 47CEF4EA2052C3C700887CDB /* ObjectivePGP.framework */; }; + 479C649621F2139B00A01071 /* support_pk.asc in Resources */ = {isa = PBXBuildFile; fileRef = 479C649521F2139B00A01071 /* support_pk.asc */; }; + 479C649A21F45DAF00A01071 /* HideShowPasswordTextField.swift in Sources */ = {isa = PBXBuildFile; fileRef = 479C649821F45DAF00A01071 /* HideShowPasswordTextField.swift */; }; + 479C649B21F45DAF00A01071 /* PasswordToggleVisibilityView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 479C649921F45DAF00A01071 /* PasswordToggleVisibilityView.swift */; }; + 47A2A56E2350A4EF0013883D /* MoreInformationViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 47A2A56D2350A4EF0013883D /* MoreInformationViewController.swift */; }; + 47A2A57223599D180013883D /* FeedbackButtonHelper.swift in Sources */ = {isa = PBXBuildFile; fileRef = 47A2A57123599D180013883D /* FeedbackButtonHelper.swift */; }; + 47A5D6E22294BF3B0084F81D /* TempKey.swift in Sources */ = {isa = PBXBuildFile; fileRef = 47A5D6E12294BF3A0084F81D /* TempKey.swift */; }; + 47A5D6E42294BFF50084F81D /* Logger.swift in Sources */ = {isa = PBXBuildFile; fileRef = 47A5D6E32294BFF50084F81D /* Logger.swift */; }; + 47C036FF2347C0F5006295E8 /* ImportKeyOverviewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 47C036FE2347C0F4006295E8 /* ImportKeyOverviewController.swift */; }; + 47C037032347D4D1006295E8 /* PasteKeyViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 47C037022347D4D1006295E8 /* PasteKeyViewController.swift */; }; + 47C22281218AFD6300BD2C2B /* AutocryptTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 47C22280218AFD6300BD2C2B /* AutocryptTest.swift */; }; + 47C22283218B02C700BD2C2B /* autocryptSimpleExample1.eml in Resources */ = {isa = PBXBuildFile; fileRef = 47C22282218B02C700BD2C2B /* autocryptSimpleExample1.eml */; }; + 47CD5AAA2012368D00E771A1 /* logging_pk.asc in Resources */ = {isa = PBXBuildFile; fileRef = 47CD5AA82012368D00E771A1 /* logging_pk.asc */; }; + 47CD5AAD2012369400E771A1 /* support_pk2.asc in Resources */ = {isa = PBXBuildFile; fileRef = 47CD5AAC2012369300E771A1 /* support_pk2.asc */; }; + 47CEAC98222541B40075B7DC /* MailSession.swift in Sources */ = {isa = PBXBuildFile; fileRef = 47CEAC97222541B40075B7DC /* MailSession.swift */; }; + 47CEF4EB2052C3C800887CDB /* ObjectivePGP.framework in CopyFiles */ = {isa = PBXBuildFile; fileRef = 47CEF4EA2052C3C700887CDB /* ObjectivePGP.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; + 47CEF4ED2052C3E700887CDB /* ObjectivePGP.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 47CEF4EC2052C3E600887CDB /* ObjectivePGP.framework */; }; + 47D1302B1F7CEE6D007B14DF /* DebugSettings.swift in Sources */ = {isa = PBXBuildFile; fileRef = 47D1302A1F7CEE6D007B14DF /* DebugSettings.swift */; }; + 47E7376E22845EC400972401 /* SecretKeyTableViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 47E7376D22845EC400972401 /* SecretKeyTableViewController.swift */; }; + 47E7377022845F3A00972401 /* KeyViews.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 47E7376F22845F3A00972401 /* KeyViews.storyboard */; }; + 47E737742284610E00972401 /* KeyCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = 47E737732284610E00972401 /* KeyCell.xib */; }; + 47E737762284632F00972401 /* KeyCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 47E737752284632F00972401 /* KeyCell.swift */; }; + 47E7BE5B22319B6900C8EF94 /* EncMailFromMac.eml in Resources */ = {isa = PBXBuildFile; fileRef = 47E7BE5A22319B6900C8EF94 /* EncMailFromMac.eml */; }; + 47E7BE5D22319B7100C8EF94 /* SignedMailFromMac.eml in Resources */ = {isa = PBXBuildFile; fileRef = 47E7BE5C22319B7000C8EF94 /* SignedMailFromMac.eml */; }; + 47E7BE5F22319B7D00C8EF94 /* SecureMailFromMac.eml in Resources */ = {isa = PBXBuildFile; fileRef = 47E7BE5E22319B7D00C8EF94 /* SecureMailFromMac.eml */; }; + 47E7BE6122319B8F00C8EF94 /* PlainMailFromMac.eml in Resources */ = {isa = PBXBuildFile; fileRef = 47E7BE6022319B8F00C8EF94 /* PlainMailFromMac.eml */; }; + 47E7BE632232BD0A00C8EF94 /* SignedEncMailFromMac.eml in Resources */ = {isa = PBXBuildFile; fileRef = 47E7BE622232BD0A00C8EF94 /* SignedEncMailFromMac.eml */; }; + 47EABF09241A9C8700774A93 /* AuthenticationModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 47EABF06241A9C8700774A93 /* AuthenticationModel.swift */; }; + 47EABF0A241A9C8700774A93 /* AuthenticationViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 47EABF07241A9C8700774A93 /* AuthenticationViewModel.swift */; }; + 47EABF0B241A9C8700774A93 /* AuthenticationScreen.swift in Sources */ = {isa = PBXBuildFile; fileRef = 47EABF08241A9C8700774A93 /* AuthenticationScreen.swift */; }; + 47EABF0D241A9CA800774A93 /* MailAccount.swift in Sources */ = {isa = PBXBuildFile; fileRef = 47EABF0C241A9CA800774A93 /* MailAccount.swift */; }; + 47EABF0E2420C63600774A93 /* GeneratedMocks.swift in Sources */ = {isa = PBXBuildFile; fileRef = 97C527A0241AA4090030BBC9 /* GeneratedMocks.swift */; }; + 47EABF0F2420C63600774A93 /* AuthenticationTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 97C5279E241A9F7B0030BBC9 /* AuthenticationTests.swift */; }; + 47F0376E22A7278A0005C9DE /* accounts.json in Resources */ = {isa = PBXBuildFile; fileRef = 47F0376D22A7278A0005C9DE /* accounts.json */; }; + 47F79240203492E3005E7DB6 /* KeyRecord+CoreDataClass.swift in Sources */ = {isa = PBXBuildFile; fileRef = 47F7923E203492E3005E7DB6 /* KeyRecord+CoreDataClass.swift */; }; + 47F79241203492E3005E7DB6 /* KeyRecord+CoreDataProperties.swift in Sources */ = {isa = PBXBuildFile; fileRef = 47F7923F203492E3005E7DB6 /* KeyRecord+CoreDataProperties.swift */; }; + 47F867E02052B47C00AA832F /* Security.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 47F867DF2052B47C00AA832F /* Security.framework */; }; + 47F867E22052B48E00AA832F /* libz.tbd in Frameworks */ = {isa = PBXBuildFile; fileRef = 47F867E12052B48E00AA832F /* libz.tbd */; }; + 47F867E42052B49800AA832F /* libbz2.tbd in Frameworks */ = {isa = PBXBuildFile; fileRef = 47F867E32052B49800AA832F /* libbz2.tbd */; }; + 50F2E7D66366C779705987A7 /* Pods_enzevalos_iphoneUITests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = AF67EF30BB065CC9C0D17940 /* Pods_enzevalos_iphoneUITests.framework */; }; + 71DF08982421520D00162B74 /* EmailStringExtensionTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 71DF08972421520D00162B74 /* EmailStringExtensionTests.swift */; }; + 71DFE5BA240679E80042019C /* HeaderExtractionValues.swift in Sources */ = {isa = PBXBuildFile; fileRef = 71DFE5B9240679E80042019C /* HeaderExtractionValues.swift */; }; + 7500EE9D4F3130671F5C1AE2 /* Pods_enzevalos_iphoneTests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 7977EA7012D8E98D186D5C60 /* Pods_enzevalos_iphoneTests.framework */; }; + 8428A8531F4369C0007649A5 /* Gamification.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 8428A8521F4369C0007649A5 /* Gamification.storyboard */; }; + 8428A8551F4369CF007649A5 /* GamificationElements.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 8428A8541F4369CF007649A5 /* GamificationElements.xcassets */; }; + 8428A85C1F436A05007649A5 /* ArrowView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8428A8581F436A05007649A5 /* ArrowView.swift */; }; + 8428A85D1F436A05007649A5 /* Badges.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8428A8591F436A05007649A5 /* Badges.swift */; }; + 8428A85E1F436A05007649A5 /* CircleView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8428A85A1F436A05007649A5 /* CircleView.swift */; }; + 8428A85F1F436A05007649A5 /* GamificationData.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8428A85B1F436A05007649A5 /* GamificationData.swift */; }; + 8428A8651F436A11007649A5 /* BadgeCaseCollectionViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8428A8601F436A11007649A5 /* BadgeCaseCollectionViewCell.swift */; }; + 8428A8661F436A11007649A5 /* ArrowTableViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8428A8611F436A11007649A5 /* ArrowTableViewCell.swift */; }; + 8428A8671F436A11007649A5 /* SubBadgeHeaderTableViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8428A8621F436A11007649A5 /* SubBadgeHeaderTableViewCell.swift */; }; + 8428A8681F436A11007649A5 /* SubBadgeTableViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8428A8631F436A11007649A5 /* SubBadgeTableViewCell.swift */; }; + 8428A8691F436A11007649A5 /* UserNameGamificationTableViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8428A8641F436A11007649A5 /* UserNameGamificationTableViewCell.swift */; }; + 8428A86E1F436A1E007649A5 /* BadgeCase.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8428A86A1F436A1E007649A5 /* BadgeCase.swift */; }; + 8428A86F1F436A1E007649A5 /* InviteFriendViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8428A86B1F436A1E007649A5 /* InviteFriendViewController.swift */; }; + 8428A8701F436A1E007649A5 /* LinearBadgeViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8428A86C1F436A1E007649A5 /* LinearBadgeViewController.swift */; }; + 8428A8711F436A1E007649A5 /* GamificationStatusViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8428A86D1F436A1E007649A5 /* GamificationStatusViewController.swift */; }; + 8428A8831F436AC9007649A5 /* GamificationDataUnitTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8428A8561F4369EA007649A5 /* GamificationDataUnitTest.swift */; }; + 8428A8841F436ACC007649A5 /* GamificationElements.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 8428A8541F4369CF007649A5 /* GamificationElements.xcassets */; }; + 988C9C5D240D507A006213F0 /* UrlStringExtensionTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 988C9C5C240D507A006213F0 /* UrlStringExtensionTests.swift */; }; + A102AA8A1EDDB4F40024B457 /* videoOnboarding2.m4v in Resources */ = {isa = PBXBuildFile; fileRef = A102AA891EDDB4E80024B457 /* videoOnboarding2.m4v */; }; + A1083A541E8BFEA6003666B7 /* Onboarding.swift in Sources */ = {isa = PBXBuildFile; fileRef = A1083A531E8BFEA6003666B7 /* Onboarding.swift */; }; + A10DAA5721F37600005D8BBB /* IntroInfoButton.swift in Sources */ = {isa = PBXBuildFile; fileRef = A10DAA5621F37600005D8BBB /* IntroInfoButton.swift */; }; + A10DE4201EFAA2CE005E8189 /* FolderViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = A10DE41F1EFAA2CE005E8189 /* FolderViewController.swift */; }; + A111F6AD1FA77B170060AFDE /* LoggerDetail.swift in Sources */ = {isa = PBXBuildFile; fileRef = A111F6AC1FA77B170060AFDE /* LoggerDetail.swift */; }; + A1123E6A1DA682850069551C /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = A1123E6C1DA682850069551C /* Localizable.strings */; }; + A114E4321FACB23000E40243 /* StringExtension.swift in Sources */ = {isa = PBXBuildFile; fileRef = A114E4311FACB23000E40243 /* StringExtension.swift */; }; + A12F91D821F3A99800AB0589 /* NSLayoutConstraintExtension.swift in Sources */ = {isa = PBXBuildFile; fileRef = A12F91D721F3A99800AB0589 /* NSLayoutConstraintExtension.swift */; }; + A12FC23120221A1400196008 /* ExportInfoViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = A12FC23020221A1400196008 /* ExportInfoViewController.swift */; }; + A13526791D955BDF00D3BFE1 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = A13526781D955BDF00D3BFE1 /* AppDelegate.swift */; }; + A13526811D955BDF00D3BFE1 /* enzevalos_iphone.xcdatamodeld in Sources */ = {isa = PBXBuildFile; fileRef = A135267F1D955BDF00D3BFE1 /* enzevalos_iphone.xcdatamodeld */; }; + A13526861D955BDF00D3BFE1 /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = A13526841D955BDF00D3BFE1 /* LaunchScreen.storyboard */; }; + A142E70921E7919F000395E3 /* IntroContactViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = A142E70821E7919F000395E3 /* IntroContactViewController.swift */; }; + A15D215B223BE5F4003E0CE0 /* TempAttachment.swift in Sources */ = {isa = PBXBuildFile; fileRef = A15D215A223BE5F4003E0CE0 /* TempAttachment.swift */; }; + A15D215D223BE614003E0CE0 /* attachment.eml in Resources */ = {isa = PBXBuildFile; fileRef = A15D215C223BE614003E0CE0 /* attachment.eml */; }; + A15D215F223BE6E4003E0CE0 /* MailTest.swift in Sources */ = {isa = PBXBuildFile; fileRef = A15D215E223BE6E4003E0CE0 /* MailTest.swift */; }; + A16BA2121E0439B6005E29E3 /* providers.json in Resources */ = {isa = PBXBuildFile; fileRef = A16BA2111E0439B6005E29E3 /* providers.json */; }; + A1735DFA205AB88500B336DB /* SendViewState.swift in Sources */ = {isa = PBXBuildFile; fileRef = A1735DF9205AB88500B336DB /* SendViewState.swift */; }; + A182182721E5012300918A29 /* Intro.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = A182182621E5012300918A29 /* Intro.storyboard */; }; + A182182C21E5072200918A29 /* IntroDescriptionViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = A182182B21E5072200918A29 /* IntroDescriptionViewController.swift */; }; + A182182E21E50D8D00918A29 /* IntroButtonViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = A182182D21E50D8D00918A29 /* IntroButtonViewController.swift */; }; + A182183221E518A400918A29 /* IntroContactCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = A182183121E518A400918A29 /* IntroContactCell.xib */; }; + A182183421E51DD200918A29 /* IntroContactCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = A182183321E51DD200918A29 /* IntroContactCell.swift */; }; + A18E7D771FBDE5D9002F7CC9 /* LoggingEventType.swift in Sources */ = {isa = PBXBuildFile; fileRef = A18E7D761FBDE5D9002F7CC9 /* LoggingEventType.swift */; }; + A198D2292056B384004CC838 /* SendViewDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = A198D2282056B384004CC838 /* SendViewDelegate.swift */; }; + A1A9DE731F864B0500B808AA /* ExportCells.swift in Sources */ = {isa = PBXBuildFile; fileRef = A1A9DE721F864B0500B808AA /* ExportCells.swift */; }; + A1ACDD0921EB9C4C00A059D0 /* IntroInputViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = A1ACDD0821EB9C4C00A059D0 /* IntroInputViewController.swift */; }; + A1AEBA5921E808CB00C84E59 /* IntroYesNoViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = A1AEBA5821E808CB00C84E59 /* IntroYesNoViewController.swift */; }; + A1B49E5D21E54CBF00ED86FC /* IntroContactTableViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = A1B49E5C21E54CBF00ED86FC /* IntroContactTableViewController.swift */; }; + A1B49E5F21E54EE700ED86FC /* IntroContactView.xib in Resources */ = {isa = PBXBuildFile; fileRef = A1B49E5E21E54EE700ED86FC /* IntroContactView.xib */; }; + A1B49E6421E55ECD00ED86FC /* IntroPageViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = A1B49E6321E55ECD00ED86FC /* IntroPageViewController.swift */; }; + A1BE3FF61E9664660040114B /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = A1BE3FF81E9664660040114B /* InfoPlist.strings */; }; + A1C3270E1DB907D900CE2ED5 /* TextFormatter.swift in Sources */ = {isa = PBXBuildFile; fileRef = A1C3270D1DB907D900CE2ED5 /* TextFormatter.swift */; }; + A1C62E9A2018F716000E5273 /* OnboardingValueState.swift in Sources */ = {isa = PBXBuildFile; fileRef = A1C62E992018F716000E5273 /* OnboardingValueState.swift */; }; + A1D5076F1E80257A00B68B38 /* KeyViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = A1D5076E1E80257A00B68B38 /* KeyViewController.swift */; }; + A1E2324E1F0FA41A00DC9D40 /* FolderListCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = A1E2324D1F0FA41A00DC9D40 /* FolderListCell.swift */; }; + A1E5960E1FCC871F003791E9 /* researchteam.asc in Resources */ = {isa = PBXBuildFile; fileRef = A1E5960D1FCC871E003791E9 /* researchteam.asc */; }; + A1EB057A1D956829008659C1 /* ContactCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = A1EB05791D956829008659C1 /* ContactCell.swift */; }; + A1EB057C1D956838008659C1 /* MailHandler.swift in Sources */ = {isa = PBXBuildFile; fileRef = A1EB057B1D956838008659C1 /* MailHandler.swift */; }; + A1EB057E1D956848008659C1 /* VENDataDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = A1EB057D1D956848008659C1 /* VENDataDelegate.swift */; }; + A1EB05801D956851008659C1 /* SendViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = A1EB057F1D956851008659C1 /* SendViewController.swift */; }; + A1EB05821D95685B008659C1 /* CollectionDataDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = A1EB05811D95685B008659C1 /* CollectionDataDelegate.swift */; }; + A1EB05841D956867008659C1 /* TableViewDataDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = A1EB05831D956867008659C1 /* TableViewDataDelegate.swift */; }; + A1EB05861D956872008659C1 /* FrequentCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = A1EB05851D956872008659C1 /* FrequentCell.swift */; }; + A1EB05881D956879008659C1 /* AddressHandler.swift in Sources */ = {isa = PBXBuildFile; fileRef = A1EB05871D956879008659C1 /* AddressHandler.swift */; }; + A1EB058A1D956890008659C1 /* ContactCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = A1EB05891D956890008659C1 /* ContactCell.xib */; }; + A1EB058C1D9568AB008659C1 /* FrequentCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = A1EB058B1D9568AB008659C1 /* FrequentCell.xib */; }; + A1EB05901D956923008659C1 /* ReadViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = A1EB058F1D956923008659C1 /* ReadViewController.swift */; }; + A1EB05941D956931008659C1 /* InboxCellDelegator.swift in Sources */ = {isa = PBXBuildFile; fileRef = A1EB05931D956931008659C1 /* InboxCellDelegator.swift */; }; + A1EB05961D956939008659C1 /* InboxTableViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = A1EB05951D956939008659C1 /* InboxTableViewCell.swift */; }; + A1EB05981D956947008659C1 /* InboxViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = A1EB05971D956947008659C1 /* InboxViewController.swift */; }; + A1EB05A01D95696C008659C1 /* MessageBodyTableViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = A1EB059F1D95696C008659C1 /* MessageBodyTableViewCell.swift */; }; + A1EB05A41D956E32008659C1 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = A1EB05A31D956E32008659C1 /* Assets.xcassets */; }; + A1ECE54B1EFBE7ED0009349F /* FolderCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = A1ECE54A1EFBE7ED0009349F /* FolderCell.swift */; }; + A1EFF93321E6655C003BB240 /* IntroTableView.swift in Sources */ = {isa = PBXBuildFile; fileRef = A1EFF93221E6655C003BB240 /* IntroTableView.swift */; }; + A1F8541021E8A60800614514 /* IntroSecretViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = A1F8540F21E8A60800614514 /* IntroSecretViewController.swift */; }; + A1F992291DA7C9100073BF1B /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = A1F9922B1DA7C9100073BF1B /* Main.storyboard */; }; + A1F992391DA7DD2E0073BF1B /* InboxTableViewCell.xib in Resources */ = {isa = PBXBuildFile; fileRef = A1F9923B1DA7DD2E0073BF1B /* InboxTableViewCell.xib */; }; + A1FA44A721E10E1400DB02AC /* TravelHandler.swift in Sources */ = {isa = PBXBuildFile; fileRef = A1FA44A621E10E1400DB02AC /* TravelHandler.swift */; }; + A5E303D824110F6400310264 /* smime-helpers.c in Sources */ = {isa = PBXBuildFile; fileRef = A5E303D724110F6400310264 /* smime-helpers.c */; }; + AC4001CA169DC07A7A1E3AD3 /* Pods_enzevalos_iphone.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 94EE54279AB591E0CAB8EFD8 /* Pods_enzevalos_iphone.framework */; }; + F113C3851F30D06800E7F1D6 /* QRScannerView.swift in Sources */ = {isa = PBXBuildFile; fileRef = F113C3841F30D06800E7F1D6 /* QRScannerView.swift */; }; + F113C38B1F3344C200E7F1D6 /* ViewControllerPannable.swift in Sources */ = {isa = PBXBuildFile; fileRef = F113C38A1F3344C200E7F1D6 /* ViewControllerPannable.swift */; }; + F119D2901E364B59001D732A /* AnimatedSendIcon.swift in Sources */ = {isa = PBXBuildFile; fileRef = F119D28F1E364B59001D732A /* AnimatedSendIcon.swift */; }; + F12041FB1DA3FBF7002E4940 /* ListViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = F12041FA1DA3FBF7002E4940 /* ListViewController.swift */; }; + F12041FD1DA409A5002E4940 /* ListViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = F12041FC1DA409A5002E4940 /* ListViewCell.swift */; }; + F12060801DA540FE00F6EF37 /* RefreshControlExtension.swift in Sources */ = {isa = PBXBuildFile; fileRef = F120607F1DA540FE00F6EF37 /* RefreshControlExtension.swift */; }; + F12060821DA552FC00F6EF37 /* MailHandlerDelegator.swift in Sources */ = {isa = PBXBuildFile; fileRef = F12060811DA552FC00F6EF37 /* MailHandlerDelegator.swift */; }; + F12D8DBB2069422A0068788E /* About.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = F12D8DBD2069422A0068788E /* About.storyboard */; }; + F14239C11F30A99C00998A83 /* QRCodeGenerator.swift in Sources */ = {isa = PBXBuildFile; fileRef = F14239C01F30A99C00998A83 /* QRCodeGenerator.swift */; }; + F1737ACB2031D7D70000312B /* StudySettings.swift in Sources */ = {isa = PBXBuildFile; fileRef = A17FDFF2202C685800F7BA89 /* StudySettings.swift */; }; + F1866C86201F707200B72453 /* EmailHelper.m in Sources */ = {isa = PBXBuildFile; fileRef = F1866C85201F707200B72453 /* EmailHelper.m */; }; + F18B445E1E7044B70080C041 /* FlipTransition.swift in Sources */ = {isa = PBXBuildFile; fileRef = F18B445D1E7044B70080C041 /* FlipTransition.swift */; }; + F18B44601E704C550080C041 /* ReplaceSegue.swift in Sources */ = {isa = PBXBuildFile; fileRef = F18B445F1E704C550080C041 /* ReplaceSegue.swift */; }; + F18B44621E73286C0080C041 /* ReadVENDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = F18B44611E73286C0080C041 /* ReadVENDelegate.swift */; }; + F18C5E561FE025D300C3B86D /* BadgeCase.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = F18C5E551FE025D300C3B86D /* BadgeCase.storyboard */; }; + F1984D721E1D327200804E1E /* IconsStyleKit.swift in Sources */ = {isa = PBXBuildFile; fileRef = F1984D711E1D327200804E1E /* IconsStyleKit.swift */; }; + F1984D741E1E92B300804E1E /* LabelStyleKit.swift in Sources */ = {isa = PBXBuildFile; fileRef = F1984D731E1E92B300804E1E /* LabelStyleKit.swift */; }; + F1ACF21C1E0C1C6800C1B843 /* ContactViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = F1ACF21B1E0C1C6800C1B843 /* ContactViewController.swift */; }; + F1AF938F1E2D04BA00755128 /* CustomCells.swift in Sources */ = {isa = PBXBuildFile; fileRef = F1AF938E1E2D04BA00755128 /* CustomCells.swift */; }; + F1C7AC821FED6473007629DB /* AboutViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = F1C7AC811FED6473007629DB /* AboutViewController.swift */; }; + F1F070281FA0DF3F004A860A /* Inbox.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = F1F070261FA0DF3F004A860A /* Inbox.storyboard */; }; +/* End PBXBuildFile section */ + +/* Begin PBXContainerItemProxy section */ + 476EEF9B22A872BF00BB4EF7 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = A135266D1D955BDF00D3BFE1 /* Project object */; + proxyType = 1; + remoteGlobalIDString = A13526741D955BDF00D3BFE1; + remoteInfo = enzevalos_iphone; + }; + A135268D1D955BE000D3BFE1 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = A135266D1D955BDF00D3BFE1 /* Project object */; + proxyType = 1; + remoteGlobalIDString = A13526741D955BDF00D3BFE1; + remoteInfo = enzevalos_iphone; + }; +/* End PBXContainerItemProxy section */ + +/* Begin PBXCopyFilesBuildPhase section */ + 47F867DB2052B33C00AA832F /* CopyFiles */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = ""; + dstSubfolderSpec = 10; + files = ( + 47CEF4EB2052C3C800887CDB /* ObjectivePGP.framework in CopyFiles */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXCopyFilesBuildPhase section */ + +/* Begin PBXFileReference section */ + 0E1C457624055F87006D104A /* signinlineK9.eml */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = signinlineK9.eml; sourceTree = "<group>"; }; + 0E1C457724055F87006D104A /* signK9.eml */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = signK9.eml; sourceTree = "<group>"; }; + 0E1C457824055F87006D104A /* signencK9.eml */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = signencK9.eml; sourceTree = "<group>"; }; + 0E1C457924055F87006D104A /* signencinlineK9.eml */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = signencinlineK9.eml; sourceTree = "<group>"; }; + 0E1C457E24055FB7006D104A /* Alice.v3.pubsec.asc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = Alice.v3.pubsec.asc; sourceTree = "<group>"; }; + 0E1C457F24055FB7006D104A /* Alice.v3.pub.asc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = Alice.v3.pub.asc; sourceTree = "<group>"; }; + 0ECA5797240D496800B0F231 /* SMIME.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SMIME.swift; sourceTree = "<group>"; }; + 0ECEA0E7240E7081007DC71E /* SearchHelper.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SearchHelper.swift; sourceTree = "<group>"; }; + 0ECEA0E9240E7D64007DC71E /* SMIME Test 1 S.eml */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = "SMIME Test 1 S.eml"; sourceTree = "<group>"; }; + 0ECEA0EB240E7D85007DC71E /* johnny C1.json.eml */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = "johnny C1.json.eml"; sourceTree = "<group>"; }; + 0ECEA0ED240E7DB0007DC71E /* evilCA.p12 */ = {isa = PBXFileReference; lastKnownFileType = file; path = evilCA.p12; sourceTree = "<group>"; }; + 0ECEA0EE240E7DB0007DC71E /* myTestCA.pem */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = myTestCA.pem; sourceTree = "<group>"; }; + 0ECEA0EF240E7DB0007DC71E /* evilkey1.p12 */ = {isa = PBXFileReference; lastKnownFileType = file; path = evilkey1.p12; sourceTree = "<group>"; }; + 0ECEA0F0240E7DB0007DC71E /* otherkey1.pem */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = otherkey1.pem; sourceTree = "<group>"; }; + 0ECEA0F1240E7DB0007DC71E /* mykey.pem */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = mykey.pem; sourceTree = "<group>"; }; + 0ECEA0F2240E7DB0007DC71E /* myTestCA.p12 */ = {isa = PBXFileReference; lastKnownFileType = file; path = myTestCA.p12; sourceTree = "<group>"; }; + 0ECEA0F3240E7DB0007DC71E /* otherkey1.p12 */ = {isa = PBXFileReference; lastKnownFileType = file; path = otherkey1.p12; sourceTree = "<group>"; }; + 0ECEA0F4240E7DB0007DC71E /* mykey.p12 */ = {isa = PBXFileReference; lastKnownFileType = file; path = mykey.p12; sourceTree = "<group>"; }; + 0ECEA0F5240E7DB0007DC71E /* evilCA.pem */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = evilCA.pem; sourceTree = "<group>"; }; + 0ECEA0F6240E7DB1007DC71E /* evilkey1.pem */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = evilkey1.pem; sourceTree = "<group>"; }; + 0ED9072F24338E3C008CF9D0 /* SMIMETests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SMIMETests.swift; sourceTree = "<group>"; }; + 0EF148042422543E00B3C198 /* Certificate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Certificate.swift; sourceTree = "<group>"; }; + 0EF148062422570F00B3C198 /* generic-helpers.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "generic-helpers.h"; sourceTree = "<group>"; }; + 0EF148072422572500B3C198 /* general-helpers.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = "general-helpers.c"; sourceTree = "<group>"; }; + 0EF148092422584F00B3C198 /* certificate-helpers.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "certificate-helpers.h"; sourceTree = "<group>"; }; + 0EF1480A2422584F00B3C198 /* certificate-helpers.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = "certificate-helpers.c"; sourceTree = "<group>"; }; + 0EF73F4224237E6500932FA0 /* SMIMEHelpers.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SMIMEHelpers.swift; sourceTree = "<group>"; }; + 0EFEF0942417C0B400BB2FF7 /* CHelpers.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CHelpers.swift; sourceTree = "<group>"; }; + 1D4A9E60565DECF52C011BC0 /* Pods-enzevalos_iphone-AdHoc.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-enzevalos_iphone-AdHoc.release.xcconfig"; path = "../enzevalos_iphone_workspace/Pods/Target Support Files/Pods-enzevalos_iphone-AdHoc/Pods-enzevalos_iphone-AdHoc.release.xcconfig"; sourceTree = "<group>"; }; + 3E6B07DD2011246500E49609 /* invitationText.html */ = {isa = PBXFileReference; lastKnownFileType = text.html; name = invitationText.html; path = Invitation/invitationText.html; sourceTree = "<group>"; }; + 3E9708AD1FAC925D005825C9 /* enzevalos_iphone.entitlements */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.entitlements; path = enzevalos_iphone.entitlements; sourceTree = "<group>"; }; + 3E9708AE1FAC925D005825C9 /* enzevalos-Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; path = "enzevalos-Info.plist"; sourceTree = "<group>"; }; + 3EB4FA9D2012007C001D0625 /* DialogViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DialogViewController.swift; sourceTree = "<group>"; }; + 3EB4FA9E2012007C001D0625 /* Dialog.storyboard */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.storyboard; path = Dialog.storyboard; sourceTree = "<group>"; }; + 3EB4FAA320120096001D0625 /* DialogOption.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DialogOption.swift; sourceTree = "<group>"; }; + 3EC35F2320037651008BDF95 /* InvitationHelper.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; name = InvitationHelper.swift; path = Invitation/InvitationHelper.swift; sourceTree = "<group>"; }; + 3EC35F2C200376A1008BDF95 /* SendViewController+Invitation.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "SendViewController+Invitation.swift"; sourceTree = "<group>"; }; + 3EC35F2F2003838E008BDF95 /* InvitationTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = InvitationTests.swift; sourceTree = "<group>"; }; + 411EB2B85F99B48FFD36F966 /* Pods-enzevalos_iphoneTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-enzevalos_iphoneTests.debug.xcconfig"; path = "../enzevalos_iphone_workspace/Pods/Target Support Files/Pods-enzevalos_iphoneTests/Pods-enzevalos_iphoneTests.debug.xcconfig"; sourceTree = "<group>"; }; + 4706D65E225B7B6B00B3F1D3 /* ItunesHandler.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ItunesHandler.swift; sourceTree = "<group>"; }; + 4706D660225CD21D00B3F1D3 /* ExportKeyHelper.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ExportKeyHelper.swift; sourceTree = "<group>"; }; + 470709172189BC3500DF71A3 /* plainThunderbird.eml */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = plainThunderbird.eml; sourceTree = "<group>"; }; + 470709212189C73900DF71A3 /* enc+signedInlineThunderbird.eml */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = "enc+signedInlineThunderbird.eml"; sourceTree = "<group>"; }; + 470709222189C73900DF71A3 /* encThunderbird.eml */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = encThunderbird.eml; sourceTree = "<group>"; }; + 470709232189C73900DF71A3 /* encInlineThunderbird.eml */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = encInlineThunderbird.eml; sourceTree = "<group>"; }; + 470709242189C73900DF71A3 /* signedInlineThunderbird.eml */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = signedInlineThunderbird.eml; sourceTree = "<group>"; }; + 470709252189C73900DF71A3 /* signedThunderbird.eml */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = signedThunderbird.eml; sourceTree = "<group>"; }; + 4707092B2189C74200DF71A3 /* bobSecret.asc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = bobSecret.asc; sourceTree = "<group>"; }; + 4707092C2189C74200DF71A3 /* alicePublic.asc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = alicePublic.asc; sourceTree = "<group>"; }; + 4707092F2189E1C000DF71A3 /* enc+signedThunderbird.eml */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = "enc+signedThunderbird.eml"; sourceTree = "<group>"; }; + 4707096C1F8F9F4900657F41 /* ExportViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ExportViewController.swift; sourceTree = "<group>"; }; + 4715F636202A0248001BFFD0 /* CoreDataTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CoreDataTests.swift; sourceTree = "<group>"; }; + 47184C3822F0D8F200712A7A /* CFNetwork.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CFNetwork.framework; path = System/Library/Frameworks/CFNetwork.framework; sourceTree = SDKROOT; }; + 471876F5223FACA900912135 /* BobPWTEST1234.asc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = BobPWTEST1234.asc; sourceTree = "<group>"; }; + 471876F6223FACA900912135 /* BobWithoutPW.asc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = BobWithoutPW.asc; sourceTree = "<group>"; }; + 472F396D1E14F384009260FB /* CoreData.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreData.framework; path = System/Library/Frameworks/CoreData.framework; sourceTree = SDKROOT; }; + 472F396F1E14F75C009260FB /* DataHandler.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DataHandler.swift; sourceTree = "<group>"; }; + 472F39781E1D0B0B009260FB /* PersistentMail +CoreDataProperties.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "PersistentMail +CoreDataProperties.swift"; sourceTree = "<group>"; }; + 472F397A1E1D0B0B009260FB /* EnzevalosContact+CoreDataProperties.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "EnzevalosContact+CoreDataProperties.swift"; sourceTree = "<group>"; }; + 472F397F1E1E5347009260FB /* Mail_Address+CoreDataClass.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "Mail_Address+CoreDataClass.swift"; sourceTree = "<group>"; }; + 472F39801E1E5347009260FB /* Mail_Address+CoreDataProperties.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "Mail_Address+CoreDataProperties.swift"; sourceTree = "<group>"; }; + 472F39851E1FA34E009260FB /* Record.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Record.swift; sourceTree = "<group>"; }; + 472F39891E251787009260FB /* Contact.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Contact.swift; sourceTree = "<group>"; }; + 472F398B1E2519C8009260FB /* CNContactExtension.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CNContactExtension.swift; sourceTree = "<group>"; }; + 472F398D1E251B8D009260FB /* MailAddress.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MailAddress.swift; sourceTree = "<group>"; }; + 472F398F1E252470009260FB /* CNMailAddressesExtension.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CNMailAddressesExtension.swift; sourceTree = "<group>"; }; + 474054972244D7A9007CF83B /* MailServerConfigurationTest.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MailServerConfigurationTest.swift; sourceTree = "<group>"; }; + 474994012261E4E6000F8DA5 /* SimpleSendIcon.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SimpleSendIcon.swift; sourceTree = "<group>"; }; + 4751C6ED233CA583006B2A4D /* DateExtension.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DateExtension.swift; sourceTree = "<group>"; }; + 4751C6F0233CE1E4006B2A4D /* enzevalos_iphone 7.xcdatamodel */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcdatamodel; path = "enzevalos_iphone 7.xcdatamodel"; sourceTree = "<group>"; }; + 4751C6F72343B377006B2A4D /* Onboarding.Video.Click.Eng.m4v */ = {isa = PBXFileReference; lastKnownFileType = file; path = Onboarding.Video.Click.Eng.m4v; sourceTree = "<group>"; }; + 4751C6F923449699006B2A4D /* CryptoManagementViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CryptoManagementViewController.swift; sourceTree = "<group>"; }; + 4751C6FB2344C8D1006B2A4D /* KeyTableViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KeyTableViewController.swift; sourceTree = "<group>"; }; + 4751C6FD2344D169006B2A4D /* enzevalos_iphone 8.xcdatamodel */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcdatamodel; path = "enzevalos_iphone 8.xcdatamodel"; sourceTree = "<group>"; }; + 4751C6FE2344D37C006B2A4D /* SecretKey+CoreDataClass.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "SecretKey+CoreDataClass.swift"; sourceTree = "<group>"; }; + 4751C6FF2344D37C006B2A4D /* SecretKey+CoreDataProperties.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "SecretKey+CoreDataProperties.swift"; sourceTree = "<group>"; }; + 4756DE0D20402F8E00452288 /* invitationTextCensor.html */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.html; name = invitationTextCensor.html; path = Invitation/invitationTextCensor.html; sourceTree = "<group>"; }; + 475B00301F7B9565006CDD41 /* SwiftPGP.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SwiftPGP.swift; sourceTree = "<group>"; }; + 475B00311F7B9565006CDD41 /* Cryptography.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Cryptography.swift; sourceTree = "<group>"; }; + 475B00321F7B9565006CDD41 /* CryptoObject.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CryptoObject.swift; sourceTree = "<group>"; }; + 475B00401F7BB6D6006CDD41 /* PersistentKey+CoreDataClass.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "PersistentKey+CoreDataClass.swift"; sourceTree = "<group>"; }; + 475B00411F7BB6D6006CDD41 /* PersistentKey+CoreDataProperties.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "PersistentKey+CoreDataProperties.swift"; sourceTree = "<group>"; }; + 475DF4771F0D54C9009D807F /* Folder+CoreDataClass.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "Folder+CoreDataClass.swift"; sourceTree = "<group>"; }; + 475DF4781F0D54C9009D807F /* Folder+CoreDataProperties.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "Folder+CoreDataProperties.swift"; sourceTree = "<group>"; }; + 476142071E07E52B00FD5E4F /* Theme.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Theme.swift; sourceTree = "<group>"; }; + 476142091E082F9C00FD5E4F /* Settings.bundle */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.plug-in"; path = Settings.bundle; sourceTree = "<group>"; }; + 476373C11E09BA88004D5EFE /* UserData.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = UserData.swift; sourceTree = "<group>"; }; + 476406092416AA6F00C7D426 /* libcrypto.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; path = libcrypto.a; sourceTree = "<group>"; }; + 4764060B2416AA6F00C7D426 /* libssl.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; path = libssl.a; sourceTree = "<group>"; }; + 4764060E2416AA6F00C7D426 /* opensslconf-template.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "opensslconf-template.h"; sourceTree = "<group>"; }; + 4764060F2416AA6F00C7D426 /* LICENSE */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = LICENSE; sourceTree = "<group>"; }; + 476406112416AA6F00C7D426 /* pem2.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = pem2.h; sourceTree = "<group>"; }; + 476406122416AA6F00C7D426 /* kdf.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = kdf.h; sourceTree = "<group>"; }; + 476406132416AA6F00C7D426 /* pem.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = pem.h; sourceTree = "<group>"; }; + 476406142416AA6F00C7D426 /* asyncerr.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = asyncerr.h; sourceTree = "<group>"; }; + 476406152416AA6F00C7D426 /* md2.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = md2.h; sourceTree = "<group>"; }; + 476406162416AA6F00C7D426 /* ssl3.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ssl3.h; sourceTree = "<group>"; }; + 476406172416AA6F00C7D426 /* ossl_typ.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ossl_typ.h; sourceTree = "<group>"; }; + 476406182416AA6F00C7D426 /* dtls1.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = dtls1.h; sourceTree = "<group>"; }; + 476406192416AA6F00C7D426 /* err.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = err.h; sourceTree = "<group>"; }; + 4764061A2416AA6F00C7D426 /* bn.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = bn.h; sourceTree = "<group>"; }; + 4764061B2416AA6F00C7D426 /* blowfish.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = blowfish.h; sourceTree = "<group>"; }; + 4764061C2416AA6F00C7D426 /* cms.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = cms.h; sourceTree = "<group>"; }; + 4764061D2416AA6F00C7D426 /* engine.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = engine.h; sourceTree = "<group>"; }; + 4764061E2416AA6F00C7D426 /* conf_api.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = conf_api.h; sourceTree = "<group>"; }; + 4764061F2416AA6F00C7D426 /* x509.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = x509.h; sourceTree = "<group>"; }; + 476406202416AA6F00C7D426 /* asn1_mac.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = asn1_mac.h; sourceTree = "<group>"; }; + 476406212416AA6F00C7D426 /* objectserr.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = objectserr.h; sourceTree = "<group>"; }; + 476406222416AA6F00C7D426 /* opensslconf_ios_x86_64.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = opensslconf_ios_x86_64.h; sourceTree = "<group>"; }; + 476406232416AA6F00C7D426 /* cmserr.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = cmserr.h; sourceTree = "<group>"; }; + 476406242416AA6F00C7D426 /* ui.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ui.h; sourceTree = "<group>"; }; + 476406252416AA6F00C7D426 /* opensslconf_tvos_x86_64.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = opensslconf_tvos_x86_64.h; sourceTree = "<group>"; }; + 476406262416AA6F00C7D426 /* sha.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = sha.h; sourceTree = "<group>"; }; + 476406272416AA6F00C7D426 /* symhacks.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = symhacks.h; sourceTree = "<group>"; }; + 476406282416AA6F00C7D426 /* asn1.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = asn1.h; sourceTree = "<group>"; }; + 476406292416AA6F00C7D426 /* bioerr.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = bioerr.h; sourceTree = "<group>"; }; + 4764062A2416AA6F00C7D426 /* opensslconf.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = opensslconf.h; sourceTree = "<group>"; }; + 4764062B2416AA6F00C7D426 /* bio.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = bio.h; sourceTree = "<group>"; }; + 4764062C2416AA6F00C7D426 /* rc2.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = rc2.h; sourceTree = "<group>"; }; + 4764062D2416AA6F00C7D426 /* dh.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = dh.h; sourceTree = "<group>"; }; + 4764062E2416AA6F00C7D426 /* x509v3.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = x509v3.h; sourceTree = "<group>"; }; + 4764062F2416AA6F00C7D426 /* conf.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = conf.h; sourceTree = "<group>"; }; + 476406302416AA6F00C7D426 /* rand_drbg.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = rand_drbg.h; sourceTree = "<group>"; }; + 476406312416AA6F00C7D426 /* md5.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = md5.h; sourceTree = "<group>"; }; + 476406322416AA6F00C7D426 /* pemerr.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = pemerr.h; sourceTree = "<group>"; }; + 476406332416AA6F00C7D426 /* x509_vfy.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = x509_vfy.h; sourceTree = "<group>"; }; + 476406342416AA6F00C7D426 /* txt_db.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = txt_db.h; sourceTree = "<group>"; }; + 476406352416AA6F00C7D426 /* comperr.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = comperr.h; sourceTree = "<group>"; }; + 476406362416AA6F00C7D426 /* cterr.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = cterr.h; sourceTree = "<group>"; }; + 476406372416AA6F00C7D426 /* safestack.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = safestack.h; sourceTree = "<group>"; }; + 476406382416AA6F00C7D426 /* ecdsa.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ecdsa.h; sourceTree = "<group>"; }; + 476406392416AA6F00C7D426 /* sslerr.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = sslerr.h; sourceTree = "<group>"; }; + 4764063A2416AA6F00C7D426 /* rc5.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = rc5.h; sourceTree = "<group>"; }; + 4764063B2416AA6F00C7D426 /* uierr.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = uierr.h; sourceTree = "<group>"; }; + 4764063C2416AA6F00C7D426 /* x509v3err.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = x509v3err.h; sourceTree = "<group>"; }; + 4764063D2416AA6F00C7D426 /* objects.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = objects.h; sourceTree = "<group>"; }; + 4764063E2416AA6F00C7D426 /* pkcs12.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = pkcs12.h; sourceTree = "<group>"; }; + 4764063F2416AA6F00C7D426 /* crypto.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = crypto.h; sourceTree = "<group>"; }; + 476406402416AA6F00C7D426 /* opensslv.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = opensslv.h; sourceTree = "<group>"; }; + 476406412416AA6F00C7D426 /* evperr.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = evperr.h; sourceTree = "<group>"; }; + 476406422416AA6F00C7D426 /* pkcs7.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = pkcs7.h; sourceTree = "<group>"; }; + 476406432416AA6F00C7D426 /* obj_mac.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = obj_mac.h; sourceTree = "<group>"; }; + 476406442416AA6F00C7D426 /* ct.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ct.h; sourceTree = "<group>"; }; + 476406452416AA6F00C7D426 /* async.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = async.h; sourceTree = "<group>"; }; + 476406462416AA6F00C7D426 /* buffer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = buffer.h; sourceTree = "<group>"; }; + 476406472416AA6F00C7D426 /* ssl.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ssl.h; sourceTree = "<group>"; }; + 476406482416AA6F00C7D426 /* srp.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = srp.h; sourceTree = "<group>"; }; + 476406492416AA6F00C7D426 /* camellia.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = camellia.h; sourceTree = "<group>"; }; + 4764064A2416AA6F00C7D426 /* opensslconf_ios_arm64.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = opensslconf_ios_arm64.h; sourceTree = "<group>"; }; + 4764064B2416AA6F00C7D426 /* dherr.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = dherr.h; sourceTree = "<group>"; }; + 4764064C2416AA6F00C7D426 /* evp.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = evp.h; sourceTree = "<group>"; }; + 4764064D2416AA6F00C7D426 /* e_os2.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = e_os2.h; sourceTree = "<group>"; }; + 4764064E2416AA6F00C7D426 /* md4.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = md4.h; sourceTree = "<group>"; }; + 4764064F2416AA6F00C7D426 /* hmac.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = hmac.h; sourceTree = "<group>"; }; + 476406502416AA6F00C7D426 /* aes.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = aes.h; sourceTree = "<group>"; }; + 476406512416AA6F00C7D426 /* engineerr.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = engineerr.h; sourceTree = "<group>"; }; + 476406522416AA6F00C7D426 /* comp.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = comp.h; sourceTree = "<group>"; }; + 476406532416AA6F00C7D426 /* pkcs12err.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = pkcs12err.h; sourceTree = "<group>"; }; + 476406542416AA6F00C7D426 /* cast.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = cast.h; sourceTree = "<group>"; }; + 476406552416AA6F00C7D426 /* rc4.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = rc4.h; sourceTree = "<group>"; }; + 476406562416AA6F00C7D426 /* stack.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = stack.h; sourceTree = "<group>"; }; + 476406572416AA6F00C7D426 /* des.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = des.h; sourceTree = "<group>"; }; + 476406582416AA6F00C7D426 /* ocsp.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ocsp.h; sourceTree = "<group>"; }; + 476406592416AA6F00C7D426 /* ec.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ec.h; sourceTree = "<group>"; }; + 4764065A2416AA6F00C7D426 /* ecdh.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ecdh.h; sourceTree = "<group>"; }; + 4764065B2416AA6F00C7D426 /* rand.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = rand.h; sourceTree = "<group>"; }; + 4764065C2416AA6F00C7D426 /* opensslconf_tvos_arm64.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = opensslconf_tvos_arm64.h; sourceTree = "<group>"; }; + 4764065D2416AA6F00C7D426 /* ecerr.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ecerr.h; sourceTree = "<group>"; }; + 4764065E2416AA6F00C7D426 /* ts.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ts.h; sourceTree = "<group>"; }; + 4764065F2416AA6F00C7D426 /* cryptoerr.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = cryptoerr.h; sourceTree = "<group>"; }; + 476406602416AA6F00C7D426 /* storeerr.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = storeerr.h; sourceTree = "<group>"; }; + 476406612416AA6F00C7D426 /* buffererr.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = buffererr.h; sourceTree = "<group>"; }; + 476406622416AA6F00C7D426 /* seed.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = seed.h; sourceTree = "<group>"; }; + 476406632416AA6F00C7D426 /* modes.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = modes.h; sourceTree = "<group>"; }; + 476406642416AA6F00C7D426 /* ssl2.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ssl2.h; sourceTree = "<group>"; }; + 476406652416AA6F00C7D426 /* tserr.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = tserr.h; sourceTree = "<group>"; }; + 476406662416AA6F00C7D426 /* rsa.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = rsa.h; sourceTree = "<group>"; }; + 476406672416AA6F00C7D426 /* ripemd.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ripemd.h; sourceTree = "<group>"; }; + 476406682416AA6F00C7D426 /* whrlpool.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = whrlpool.h; sourceTree = "<group>"; }; + 476406692416AA6F00C7D426 /* tls1.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = tls1.h; sourceTree = "<group>"; }; + 4764066A2416AA6F00C7D426 /* rsaerr.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = rsaerr.h; sourceTree = "<group>"; }; + 4764066B2416AA6F00C7D426 /* randerr.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = randerr.h; sourceTree = "<group>"; }; + 4764066C2416AA6F00C7D426 /* mdc2.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = mdc2.h; sourceTree = "<group>"; }; + 4764066D2416AA6F00C7D426 /* ocsperr.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ocsperr.h; sourceTree = "<group>"; }; + 4764066E2416AA6F00C7D426 /* x509err.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = x509err.h; sourceTree = "<group>"; }; + 4764066F2416AA6F00C7D426 /* pkcs7err.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = pkcs7err.h; sourceTree = "<group>"; }; + 476406702416AA6F00C7D426 /* dsa.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = dsa.h; sourceTree = "<group>"; }; + 476406712416AA6F00C7D426 /* kdferr.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = kdferr.h; sourceTree = "<group>"; }; + 476406722416AA6F00C7D426 /* srtp.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = srtp.h; sourceTree = "<group>"; }; + 476406732416AA6F00C7D426 /* asn1t.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = asn1t.h; sourceTree = "<group>"; }; + 476406742416AA6F00C7D426 /* dsaerr.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = dsaerr.h; sourceTree = "<group>"; }; + 476406752416AA6F00C7D426 /* bnerr.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = bnerr.h; sourceTree = "<group>"; }; + 476406762416AA6F00C7D426 /* conferr.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = conferr.h; sourceTree = "<group>"; }; + 476406772416AA6F00C7D426 /* cmac.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = cmac.h; sourceTree = "<group>"; }; + 476406782416AA6F00C7D426 /* ebcdic.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ebcdic.h; sourceTree = "<group>"; }; + 476406792416AA6F00C7D426 /* opensslconf_ios_arm64e.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = opensslconf_ios_arm64e.h; sourceTree = "<group>"; }; + 4764067A2416AA6F00C7D426 /* store.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = store.h; sourceTree = "<group>"; }; + 4764067B2416AA6F00C7D426 /* idea.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = idea.h; sourceTree = "<group>"; }; + 4764067C2416AA6F00C7D426 /* lhash.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = lhash.h; sourceTree = "<group>"; }; + 4764067D2416AA6F00C7D426 /* asn1err.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = asn1err.h; sourceTree = "<group>"; }; + 476406832416AA9100C7D426 /* TestOpenSSL.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TestOpenSSL.swift; sourceTree = "<group>"; }; + 476406892416B54D00C7D426 /* KeyRecordRow.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = KeyRecordRow.swift; sourceTree = "<group>"; }; + 4764068A2416B54D00C7D426 /* Inbox.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Inbox.swift; sourceTree = "<group>"; }; + 4764068B2416B54D00C7D426 /* InboxCoordinator.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = InboxCoordinator.swift; sourceTree = "<group>"; }; + 4764068D2416B54D00C7D426 /* CiricleImage.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CiricleImage.swift; sourceTree = "<group>"; }; + 4764068E2416B54D00C7D426 /* SearchView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SearchView.swift; sourceTree = "<group>"; }; + 4764068F2416B54D00C7D426 /* MailView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MailView.swift; sourceTree = "<group>"; }; + 476406922416B54D00C7D426 /* VCSwiftUIView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = VCSwiftUIView.swift; sourceTree = "<group>"; }; + 476406942416B54D00C7D426 /* Stroke.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Stroke.swift; sourceTree = "<group>"; }; + 4764069E2416B5A600C7D426 /* NewOnboardingView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = NewOnboardingView.swift; sourceTree = "<group>"; }; + 476406A02416B5C800C7D426 /* OnboardingIntro.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = OnboardingIntro.swift; sourceTree = "<group>"; }; + 476801DA218436B600F7F259 /* Autocrypt.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Autocrypt.swift; sourceTree = "<group>"; }; + 476801DD21846A5A00F7F259 /* OutgoingMail.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OutgoingMail.swift; sourceTree = "<group>"; }; + 4769169F216B86A100491527 /* PersistentMail +CoreDataClass.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "PersistentMail +CoreDataClass.swift"; sourceTree = "<group>"; }; + 476916A1216B86CF00491527 /* EnzevalosContact+CoreDataClass.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "EnzevalosContact+CoreDataClass.swift"; sourceTree = "<group>"; }; + 47691A891ECB56D1004BCFC5 /* Mail.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Mail.swift; sourceTree = "<group>"; }; + 47691A8B1ECC3EC7004BCFC5 /* EphemeralMail.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = EphemeralMail.swift; sourceTree = "<group>"; }; + 476EEF9622A872BF00BB4EF7 /* enzevalos_iphoneUITests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = enzevalos_iphoneUITests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; + 476EEF9822A872BF00BB4EF7 /* enzevalos_iphoneUITests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = enzevalos_iphoneUITests.swift; sourceTree = "<group>"; }; + 476EEF9A22A872BF00BB4EF7 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; }; + 476EEFA022A873A800BB4EF7 /* OnboardingTest.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = OnboardingTest.swift; sourceTree = "<group>"; }; + 476EEFA622A87B9800BB4EF7 /* accounts.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; path = accounts.json; sourceTree = "<group>"; }; + 4774DD7222CFFD0E00BD8CF6 /* AliceMultiIDs (439EE43C) – Public.asc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = "AliceMultiIDs (439EE43C) – Public.asc"; sourceTree = "<group>"; }; + 4774DD7422D0015F00BD8CF6 /* multiIDs.eml */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = multiIDs.eml; sourceTree = "<group>"; }; + 4774DD7A22D3F5D100BD8CF6 /* multiIDs2.eml */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = multiIDs2.eml; sourceTree = "<group>"; }; + 4774DD7C22D4062200BD8CF6 /* Bob Letterbox (0B6CD0A0) – Secret.asc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = "Bob Letterbox (0B6CD0A0) – Secret.asc"; sourceTree = "<group>"; }; + 4774DD7D22D4062200BD8CF6 /* Alice Letterbox (439EE43C) – Public.asc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = "Alice Letterbox (439EE43C) – Public.asc"; sourceTree = "<group>"; }; + 4774DD8022D4067D00BD8CF6 /* signedEncMailFromApple.eml */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = signedEncMailFromApple.eml; sourceTree = "<group>"; }; + 477548DD21F5DABE000B22A8 /* MailServerConnectionError.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MailServerConnectionError.swift; sourceTree = "<group>"; }; + 477548E121F77466000B22A8 /* SecurityIndicator.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SecurityIndicator.swift; sourceTree = "<group>"; }; + 477548E321F77BA0000B22A8 /* StudyParameterProtocol.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StudyParameterProtocol.swift; sourceTree = "<group>"; }; + 477670C3228453FB00043604 /* ButtonCell.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = ButtonCell.xib; sourceTree = "<group>"; }; + 477670C5228454F700043604 /* ButtonCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ButtonCell.swift; sourceTree = "<group>"; }; + 478154A621FF3F0900A931EC /* Warning.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Warning.swift; sourceTree = "<group>"; }; + 478154A821FF3FF400A931EC /* Invitation.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Invitation.swift; sourceTree = "<group>"; }; + 478154AB21FF6A9600A931EC /* Mailbot.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Mailbot.swift; sourceTree = "<group>"; }; + 478154AD2200641900A931EC /* StudyTest.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StudyTest.swift; sourceTree = "<group>"; }; + 478AF714222FD5C600AEF69E /* IncomingMail.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; name = IncomingMail.swift; path = mail/IncomingMail.swift; sourceTree = "<group>"; }; + 479011482289975C0057AB04 /* NoSecIconStyleKit.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = NoSecIconStyleKit.swift; sourceTree = "<group>"; }; + 479AFDA122571AB90063A332 /* EccAlice(777879D4)–Public.asc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = "EccAlice(777879D4)–Public.asc"; sourceTree = "<group>"; }; + 479B5976206914BE00B3944D /* CryptoTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CryptoTests.swift; sourceTree = "<group>"; }; + 479C649521F2139B00A01071 /* support_pk.asc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = support_pk.asc; sourceTree = "<group>"; }; + 479C649821F45DAF00A01071 /* HideShowPasswordTextField.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = HideShowPasswordTextField.swift; sourceTree = "<group>"; }; + 479C649921F45DAF00A01071 /* PasswordToggleVisibilityView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PasswordToggleVisibilityView.swift; sourceTree = "<group>"; }; + 47A2A56D2350A4EF0013883D /* MoreInformationViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MoreInformationViewController.swift; sourceTree = "<group>"; }; + 47A2A57123599D180013883D /* FeedbackButtonHelper.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FeedbackButtonHelper.swift; sourceTree = "<group>"; }; + 47A5D6D52294B4830084F81D /* GTMAppAuth.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = GTMAppAuth.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 47A5D6DB2294B5220084F81D /* libz.1.1.3.tbd */ = {isa = PBXFileReference; lastKnownFileType = "sourcecode.text-based-dylib-definition"; name = libz.1.1.3.tbd; path = usr/lib/libz.1.1.3.tbd; sourceTree = SDKROOT; }; + 47A5D6DD2294B5480084F81D /* AppAuth.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = AppAuth.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 47A5D6E12294BF3A0084F81D /* TempKey.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TempKey.swift; sourceTree = "<group>"; }; + 47A5D6E32294BFF50084F81D /* Logger.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Logger.swift; sourceTree = "<group>"; }; + 47B2318A1F0D458100961B28 /* enzevalos_iphone 2.xcdatamodel */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcdatamodel; path = "enzevalos_iphone 2.xcdatamodel"; sourceTree = "<group>"; }; + 47C036FE2347C0F4006295E8 /* ImportKeyOverviewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ImportKeyOverviewController.swift; sourceTree = "<group>"; }; + 47C037022347D4D1006295E8 /* PasteKeyViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PasteKeyViewController.swift; sourceTree = "<group>"; }; + 47C22280218AFD6300BD2C2B /* AutocryptTest.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AutocryptTest.swift; sourceTree = "<group>"; }; + 47C22282218B02C700BD2C2B /* autocryptSimpleExample1.eml */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = autocryptSimpleExample1.eml; sourceTree = "<group>"; }; + 47CD5AA82012368D00E771A1 /* logging_pk.asc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; name = logging_pk.asc; path = keys/logging_pk.asc; sourceTree = "<group>"; }; + 47CD5AAC2012369300E771A1 /* support_pk2.asc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; name = support_pk2.asc; path = keys/support_pk2.asc; sourceTree = "<group>"; }; + 47CEAC97222541B40075B7DC /* MailSession.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MailSession.swift; sourceTree = "<group>"; }; + 47CEF4EA2052C3C700887CDB /* ObjectivePGP.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; path = ObjectivePGP.framework; sourceTree = "<group>"; }; + 47CEF4EC2052C3E600887CDB /* ObjectivePGP.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = ObjectivePGP.framework; path = ../enzevalos_iphone_workspace/ObjectivePGP.framework; sourceTree = "<group>"; }; + 47D1302A1F7CEE6D007B14DF /* DebugSettings.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DebugSettings.swift; sourceTree = "<group>"; }; + 47E7376D22845EC400972401 /* SecretKeyTableViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SecretKeyTableViewController.swift; sourceTree = "<group>"; }; + 47E7376F22845F3A00972401 /* KeyViews.storyboard */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; path = KeyViews.storyboard; sourceTree = "<group>"; }; + 47E737732284610E00972401 /* KeyCell.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = KeyCell.xib; sourceTree = "<group>"; }; + 47E737752284632F00972401 /* KeyCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KeyCell.swift; sourceTree = "<group>"; }; + 47E7BE5A22319B6900C8EF94 /* EncMailFromMac.eml */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = EncMailFromMac.eml; sourceTree = "<group>"; }; + 47E7BE5C22319B7000C8EF94 /* SignedMailFromMac.eml */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = SignedMailFromMac.eml; sourceTree = "<group>"; }; + 47E7BE5E22319B7D00C8EF94 /* SecureMailFromMac.eml */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = SecureMailFromMac.eml; sourceTree = "<group>"; }; + 47E7BE6022319B8F00C8EF94 /* PlainMailFromMac.eml */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = PlainMailFromMac.eml; sourceTree = "<group>"; }; + 47E7BE622232BD0A00C8EF94 /* SignedEncMailFromMac.eml */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = SignedEncMailFromMac.eml; sourceTree = "<group>"; }; + 47EABF06241A9C8700774A93 /* AuthenticationModel.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AuthenticationModel.swift; sourceTree = "<group>"; }; + 47EABF07241A9C8700774A93 /* AuthenticationViewModel.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AuthenticationViewModel.swift; sourceTree = "<group>"; }; + 47EABF08241A9C8700774A93 /* AuthenticationScreen.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AuthenticationScreen.swift; sourceTree = "<group>"; }; + 47EABF0C241A9CA800774A93 /* MailAccount.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MailAccount.swift; sourceTree = "<group>"; }; + 47F0376D22A7278A0005C9DE /* accounts.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; path = accounts.json; sourceTree = "<group>"; }; + 47F7923E203492E3005E7DB6 /* KeyRecord+CoreDataClass.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "KeyRecord+CoreDataClass.swift"; sourceTree = "<group>"; }; + 47F7923F203492E3005E7DB6 /* KeyRecord+CoreDataProperties.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "KeyRecord+CoreDataProperties.swift"; sourceTree = "<group>"; }; + 47F867DF2052B47C00AA832F /* Security.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Security.framework; path = System/Library/Frameworks/Security.framework; sourceTree = SDKROOT; }; + 47F867E12052B48E00AA832F /* libz.tbd */ = {isa = PBXFileReference; lastKnownFileType = "sourcecode.text-based-dylib-definition"; name = libz.tbd; path = usr/lib/libz.tbd; sourceTree = SDKROOT; }; + 47F867E32052B49800AA832F /* libbz2.tbd */ = {isa = PBXFileReference; lastKnownFileType = "sourcecode.text-based-dylib-definition"; name = libbz2.tbd; path = usr/lib/libbz2.tbd; sourceTree = SDKROOT; }; + 48C250BB32BF11B683003BA1 /* Pods-enzevalos_iphone-enzevalos_iphoneUITests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-enzevalos_iphone-enzevalos_iphoneUITests.debug.xcconfig"; path = "../enzevalos_iphone_workspace/Pods/Target Support Files/Pods-enzevalos_iphone-enzevalos_iphoneUITests/Pods-enzevalos_iphone-enzevalos_iphoneUITests.debug.xcconfig"; sourceTree = "<group>"; }; + 66E758F271CD65AB3E5FE7A7 /* Pods-enzevalos_iphoneUITests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-enzevalos_iphoneUITests.debug.xcconfig"; path = "../enzevalos_iphone_workspace/Pods/Target Support Files/Pods-enzevalos_iphoneUITests/Pods-enzevalos_iphoneUITests.debug.xcconfig"; sourceTree = "<group>"; }; + 670159DF240FB4E800797FA5 /* enzevalos_iphone 9.xcdatamodel */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcdatamodel; path = "enzevalos_iphone 9.xcdatamodel"; sourceTree = "<group>"; }; + 6EBCCD02AD3B95D8317810E2 /* Pods-enzevalos_iphoneTests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-enzevalos_iphoneTests.debug.xcconfig"; path = "../enzevalos_iphone_workspace/Pods/Target Support Files/Pods-enzevalos_iphoneTests/Pods-enzevalos_iphoneTests.debug.xcconfig"; sourceTree = "<group>"; }; + 71DF08972421520D00162B74 /* EmailStringExtensionTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EmailStringExtensionTests.swift; sourceTree = "<group>"; }; + 71DFE5B9240679E80042019C /* HeaderExtractionValues.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = HeaderExtractionValues.swift; sourceTree = "<group>"; }; + 796D16D79BED5D60B580E602 /* Pods-enzevalos_iphoneUITests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-enzevalos_iphoneUITests.release.xcconfig"; path = "../enzevalos_iphone_workspace/Pods/Target Support Files/Pods-enzevalos_iphoneUITests/Pods-enzevalos_iphoneUITests.release.xcconfig"; sourceTree = "<group>"; }; + 7977EA7012D8E98D186D5C60 /* Pods_enzevalos_iphoneTests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_enzevalos_iphoneTests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 8428A8521F4369C0007649A5 /* Gamification.storyboard */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.storyboard; path = Gamification.storyboard; sourceTree = "<group>"; }; + 8428A8541F4369CF007649A5 /* GamificationElements.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = GamificationElements.xcassets; sourceTree = "<group>"; }; + 8428A8561F4369EA007649A5 /* GamificationDataUnitTest.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = GamificationDataUnitTest.swift; sourceTree = "<group>"; }; + 8428A8581F436A05007649A5 /* ArrowView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ArrowView.swift; sourceTree = "<group>"; }; + 8428A8591F436A05007649A5 /* Badges.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Badges.swift; sourceTree = "<group>"; }; + 8428A85A1F436A05007649A5 /* CircleView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CircleView.swift; sourceTree = "<group>"; }; + 8428A85B1F436A05007649A5 /* GamificationData.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = GamificationData.swift; sourceTree = "<group>"; }; + 8428A8601F436A11007649A5 /* BadgeCaseCollectionViewCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BadgeCaseCollectionViewCell.swift; sourceTree = "<group>"; }; + 8428A8611F436A11007649A5 /* ArrowTableViewCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ArrowTableViewCell.swift; sourceTree = "<group>"; }; + 8428A8621F436A11007649A5 /* SubBadgeHeaderTableViewCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SubBadgeHeaderTableViewCell.swift; sourceTree = "<group>"; }; + 8428A8631F436A11007649A5 /* SubBadgeTableViewCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SubBadgeTableViewCell.swift; sourceTree = "<group>"; }; + 8428A8641F436A11007649A5 /* UserNameGamificationTableViewCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = UserNameGamificationTableViewCell.swift; sourceTree = "<group>"; }; + 8428A86A1F436A1E007649A5 /* BadgeCase.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = BadgeCase.swift; sourceTree = "<group>"; }; + 8428A86B1F436A1E007649A5 /* InviteFriendViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = InviteFriendViewController.swift; sourceTree = "<group>"; }; + 8428A86C1F436A1E007649A5 /* LinearBadgeViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = LinearBadgeViewController.swift; sourceTree = "<group>"; }; + 8428A86D1F436A1E007649A5 /* GamificationStatusViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = GamificationStatusViewController.swift; sourceTree = "<group>"; }; + 8478C5F0EC1CB76AEBE1F47A /* Pods-enzevalos_iphone-enzevalos_iphoneUITests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-enzevalos_iphone-enzevalos_iphoneUITests.release.xcconfig"; path = "../enzevalos_iphone_workspace/Pods/Target Support Files/Pods-enzevalos_iphone-enzevalos_iphoneUITests/Pods-enzevalos_iphone-enzevalos_iphoneUITests.release.xcconfig"; sourceTree = "<group>"; }; + 8B87EFB6CEAA31452F744015 /* Pods-enzevalos_iphoneUITests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-enzevalos_iphoneUITests.release.xcconfig"; path = "../enzevalos_iphone_workspace/Pods/Target Support Files/Pods-enzevalos_iphoneUITests/Pods-enzevalos_iphoneUITests.release.xcconfig"; sourceTree = "<group>"; }; + 91B6C9020C660BEA78FAEF28 /* Pods-enzevalos_iphone.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-enzevalos_iphone.debug.xcconfig"; path = "../enzevalos_iphone_workspace/Pods/Target Support Files/Pods-enzevalos_iphone/Pods-enzevalos_iphone.debug.xcconfig"; sourceTree = "<group>"; }; + 94EE54279AB591E0CAB8EFD8 /* Pods_enzevalos_iphone.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_enzevalos_iphone.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 9771AA8B241161190023A096 /* MailAccount.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MailAccount.swift; sourceTree = "<group>"; }; + 97AACD2324178C230078A68E /* AuthenticationModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AuthenticationModel.swift; sourceTree = "<group>"; }; + 97C5279E241A9F7B0030BBC9 /* AuthenticationTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AuthenticationTests.swift; sourceTree = "<group>"; }; + 97C527A0241AA4090030BBC9 /* GeneratedMocks.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; name = GeneratedMocks.swift; path = enzevalos_iphoneTests/GeneratedMocks.swift; sourceTree = SOURCE_ROOT; }; +<<<<<<< HEAD + 988C9C5C240D507A006213F0 /* PhishingTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PhishingTests.swift; sourceTree = "<group>"; }; +======= + 988C9C5C240D507A006213F0 /* UrlStringExtensionTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UrlStringExtensionTests.swift; sourceTree = "<group>"; }; +>>>>>>> dev + 9A132EDE8BCA06ACDB505C22 /* Pods-enzevalos_iphoneUITests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-enzevalos_iphoneUITests.debug.xcconfig"; path = "../enzevalos_iphone_workspace/Pods/Target Support Files/Pods-enzevalos_iphoneUITests/Pods-enzevalos_iphoneUITests.debug.xcconfig"; sourceTree = "<group>"; }; + 9B3D62838C729BAC6832270A /* Pods-enzevalos_iphone-AdHoc.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-enzevalos_iphone-AdHoc.debug.xcconfig"; path = "../enzevalos_iphone_workspace/Pods/Target Support Files/Pods-enzevalos_iphone-AdHoc/Pods-enzevalos_iphone-AdHoc.debug.xcconfig"; sourceTree = "<group>"; }; + A102AA891EDDB4E80024B457 /* videoOnboarding2.m4v */ = {isa = PBXFileReference; lastKnownFileType = file; path = videoOnboarding2.m4v; sourceTree = "<group>"; }; + A1083A531E8BFEA6003666B7 /* Onboarding.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Onboarding.swift; sourceTree = "<group>"; }; + A10DAA5621F37600005D8BBB /* IntroInfoButton.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = IntroInfoButton.swift; sourceTree = "<group>"; }; + A10DE41F1EFAA2CE005E8189 /* FolderViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = FolderViewController.swift; sourceTree = "<group>"; }; + A111F6AC1FA77B170060AFDE /* LoggerDetail.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LoggerDetail.swift; sourceTree = "<group>"; }; + A1123E6B1DA682850069551C /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/Localizable.strings; sourceTree = "<group>"; }; + A1123E6D1DA682870069551C /* de */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = de; path = de.lproj/Localizable.strings; sourceTree = "<group>"; }; + A114E4311FACB23000E40243 /* StringExtension.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StringExtension.swift; sourceTree = "<group>"; }; + A12F91D721F3A99800AB0589 /* NSLayoutConstraintExtension.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NSLayoutConstraintExtension.swift; sourceTree = "<group>"; }; + A12FC23020221A1400196008 /* ExportInfoViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ExportInfoViewController.swift; sourceTree = "<group>"; }; + A13526751D955BDF00D3BFE1 /* enzevalos_iphone.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = enzevalos_iphone.app; sourceTree = BUILT_PRODUCTS_DIR; }; + A13526781D955BDF00D3BFE1 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = "<group>"; }; + A13526801D955BDF00D3BFE1 /* enzevalos_iphone.xcdatamodel */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcdatamodel; path = enzevalos_iphone.xcdatamodel; sourceTree = "<group>"; }; + A135268C1D955BE000D3BFE1 /* enzevalos_iphoneTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = enzevalos_iphoneTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; + A13526921D955BE000D3BFE1 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; }; + A142E70821E7919F000395E3 /* IntroContactViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = IntroContactViewController.swift; sourceTree = "<group>"; }; + A15D215A223BE5F4003E0CE0 /* TempAttachment.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TempAttachment.swift; sourceTree = "<group>"; }; + A15D215C223BE614003E0CE0 /* attachment.eml */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = attachment.eml; sourceTree = "<group>"; }; + A15D215E223BE6E4003E0CE0 /* MailTest.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MailTest.swift; sourceTree = "<group>"; }; + A15D2D0B21F4CF13007AF2F4 /* enzevalos_iphone 5.xcdatamodel */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcdatamodel; path = "enzevalos_iphone 5.xcdatamodel"; sourceTree = "<group>"; }; + A16BA2111E0439B6005E29E3 /* providers.json */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.json; lineEnding = 0; path = providers.json; sourceTree = "<group>"; }; + A1735DF9205AB88500B336DB /* SendViewState.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SendViewState.swift; sourceTree = "<group>"; }; + A17FDFF2202C685800F7BA89 /* StudySettings.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StudySettings.swift; sourceTree = "<group>"; }; + A182182621E5012300918A29 /* Intro.storyboard */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; path = Intro.storyboard; sourceTree = "<group>"; }; + A182182B21E5072200918A29 /* IntroDescriptionViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = IntroDescriptionViewController.swift; sourceTree = "<group>"; }; + A182182D21E50D8D00918A29 /* IntroButtonViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = IntroButtonViewController.swift; sourceTree = "<group>"; }; + A182183121E518A400918A29 /* IntroContactCell.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = IntroContactCell.xib; sourceTree = "<group>"; }; + A182183321E51DD200918A29 /* IntroContactCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = IntroContactCell.swift; sourceTree = "<group>"; }; + A18E7D761FBDE5D9002F7CC9 /* LoggingEventType.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LoggingEventType.swift; sourceTree = "<group>"; }; + A1909719220F887D00FA7B2A /* enzevalos_iphone 6.xcdatamodel */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcdatamodel; path = "enzevalos_iphone 6.xcdatamodel"; sourceTree = "<group>"; }; + A198270D1D9A8ABC0027F65C /* enzevalos_iphone-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "enzevalos_iphone-Bridging-Header.h"; sourceTree = "<group>"; }; + A198D2282056B384004CC838 /* SendViewDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SendViewDelegate.swift; sourceTree = "<group>"; }; + A19BD0A721ED62AE00E4D603 /* enzevalos_iphone 3.xcdatamodel */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcdatamodel; path = "enzevalos_iphone 3.xcdatamodel"; sourceTree = "<group>"; }; + A19F3FFB21F0BE79005334F2 /* enzevalos_iphone 4.xcdatamodel */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcdatamodel; path = "enzevalos_iphone 4.xcdatamodel"; sourceTree = "<group>"; }; + A1A9DE721F864B0500B808AA /* ExportCells.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ExportCells.swift; sourceTree = "<group>"; }; + A1ACDD0821EB9C4C00A059D0 /* IntroInputViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = IntroInputViewController.swift; sourceTree = "<group>"; }; + A1AEBA5821E808CB00C84E59 /* IntroYesNoViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = IntroYesNoViewController.swift; sourceTree = "<group>"; }; + A1B49E5C21E54CBF00ED86FC /* IntroContactTableViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = IntroContactTableViewController.swift; sourceTree = "<group>"; }; + A1B49E5E21E54EE700ED86FC /* IntroContactView.xib */ = {isa = PBXFileReference; lastKnownFileType = file.xib; path = IntroContactView.xib; sourceTree = "<group>"; }; + A1B49E6321E55ECD00ED86FC /* IntroPageViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = IntroPageViewController.swift; sourceTree = "<group>"; }; + A1BE3FF71E9664660040114B /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/InfoPlist.strings; sourceTree = "<group>"; }; + A1BE3FF91E96646A0040114B /* de */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = de; path = de.lproj/InfoPlist.strings; sourceTree = "<group>"; }; + A1C3270D1DB907D900CE2ED5 /* TextFormatter.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TextFormatter.swift; sourceTree = "<group>"; }; + A1C62E992018F716000E5273 /* OnboardingValueState.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OnboardingValueState.swift; sourceTree = "<group>"; }; + A1D5076E1E80257A00B68B38 /* KeyViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = KeyViewController.swift; sourceTree = "<group>"; }; + A1E2324D1F0FA41A00DC9D40 /* FolderListCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = FolderListCell.swift; sourceTree = "<group>"; }; + A1E5960D1FCC871E003791E9 /* researchteam.asc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; name = researchteam.asc; path = keys/researchteam.asc; sourceTree = "<group>"; }; + A1EB05791D956829008659C1 /* ContactCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ContactCell.swift; sourceTree = "<group>"; }; + A1EB057B1D956838008659C1 /* MailHandler.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MailHandler.swift; sourceTree = "<group>"; }; + A1EB057D1D956848008659C1 /* VENDataDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = VENDataDelegate.swift; sourceTree = "<group>"; }; + A1EB057F1D956851008659C1 /* SendViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SendViewController.swift; sourceTree = "<group>"; }; + A1EB05811D95685B008659C1 /* CollectionDataDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CollectionDataDelegate.swift; sourceTree = "<group>"; }; + A1EB05831D956867008659C1 /* TableViewDataDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = TableViewDataDelegate.swift; sourceTree = "<group>"; }; + A1EB05851D956872008659C1 /* FrequentCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = FrequentCell.swift; sourceTree = "<group>"; }; + A1EB05871D956879008659C1 /* AddressHandler.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AddressHandler.swift; sourceTree = "<group>"; }; + A1EB05891D956890008659C1 /* ContactCell.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = ContactCell.xib; sourceTree = "<group>"; }; + A1EB058B1D9568AB008659C1 /* FrequentCell.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = FrequentCell.xib; sourceTree = "<group>"; }; + A1EB058F1D956923008659C1 /* ReadViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ReadViewController.swift; sourceTree = "<group>"; }; + A1EB05931D956931008659C1 /* InboxCellDelegator.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = InboxCellDelegator.swift; sourceTree = "<group>"; }; + A1EB05951D956939008659C1 /* InboxTableViewCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = InboxTableViewCell.swift; sourceTree = "<group>"; }; + A1EB05971D956947008659C1 /* InboxViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = InboxViewController.swift; sourceTree = "<group>"; }; + A1EB059F1D95696C008659C1 /* MessageBodyTableViewCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MessageBodyTableViewCell.swift; sourceTree = "<group>"; }; + A1EB05A31D956E32008659C1 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = "<group>"; }; + A1ECE54A1EFBE7ED0009349F /* FolderCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = FolderCell.swift; sourceTree = "<group>"; }; + A1EFF93221E6655C003BB240 /* IntroTableView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = IntroTableView.swift; sourceTree = "<group>"; }; + A1F8540F21E8A60800614514 /* IntroSecretViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = IntroSecretViewController.swift; sourceTree = "<group>"; }; + A1F992301DA7D22D0073BF1B /* de */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = de; path = de.lproj/LaunchScreen.storyboard; sourceTree = "<group>"; }; + A1F992321DA7D2360073BF1B /* en */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = en; path = en.lproj/LaunchScreen.storyboard; sourceTree = "<group>"; }; + A1F992341DA7DA570073BF1B /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = "<group>"; }; + A1F992371DA7DC760073BF1B /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/Main.strings; sourceTree = "<group>"; }; + A1F992381DA7DC7B0073BF1B /* de */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = de; path = de.lproj/Main.strings; sourceTree = "<group>"; }; + A1F9923A1DA7DD2E0073BF1B /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/InboxTableViewCell.xib; sourceTree = "<group>"; }; + A1F9923D1DA7DD350073BF1B /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/InboxTableViewCell.strings; sourceTree = "<group>"; }; + A1F9923F1DA7DD370073BF1B /* de */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = de; path = de.lproj/InboxTableViewCell.strings; sourceTree = "<group>"; }; + A1FA44A621E10E1400DB02AC /* TravelHandler.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TravelHandler.swift; sourceTree = "<group>"; }; + A5E303D624110F6400310264 /* smime-helpers.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "smime-helpers.h"; sourceTree = "<group>"; }; + A5E303D724110F6400310264 /* smime-helpers.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = "smime-helpers.c"; sourceTree = "<group>"; }; + AA686D4FC9B86445A0C87F0F /* Pods-enzevalos_iphone.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-enzevalos_iphone.release.xcconfig"; path = "../enzevalos_iphone_workspace/Pods/Target Support Files/Pods-enzevalos_iphone/Pods-enzevalos_iphone.release.xcconfig"; sourceTree = "<group>"; }; + AF67EF30BB065CC9C0D17940 /* Pods_enzevalos_iphoneUITests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_enzevalos_iphoneUITests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + BC7D006B3B40A23E53B4F317 /* Pods-enzevalos_iphoneTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-enzevalos_iphoneTests.release.xcconfig"; path = "../enzevalos_iphone_workspace/Pods/Target Support Files/Pods-enzevalos_iphoneTests/Pods-enzevalos_iphoneTests.release.xcconfig"; sourceTree = "<group>"; }; + C1F4458FC892EBE555836F55 /* Pods_enzevalos_iphone_AdHoc.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_enzevalos_iphone_AdHoc.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + C7733DFEFB7E7CFF38EC1665 /* Pods-enzevalos_iphoneTests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-enzevalos_iphoneTests.release.xcconfig"; path = "../enzevalos_iphone_workspace/Pods/Target Support Files/Pods-enzevalos_iphoneTests/Pods-enzevalos_iphoneTests.release.xcconfig"; sourceTree = "<group>"; }; + F113C3841F30D06800E7F1D6 /* QRScannerView.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = QRScannerView.swift; sourceTree = "<group>"; }; + F113C38A1F3344C200E7F1D6 /* ViewControllerPannable.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ViewControllerPannable.swift; sourceTree = "<group>"; }; + F119D28F1E364B59001D732A /* AnimatedSendIcon.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AnimatedSendIcon.swift; sourceTree = "<group>"; }; + F12041FA1DA3FBF7002E4940 /* ListViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ListViewController.swift; sourceTree = "<group>"; }; + F12041FC1DA409A5002E4940 /* ListViewCell.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ListViewCell.swift; sourceTree = "<group>"; }; + F120607F1DA540FE00F6EF37 /* RefreshControlExtension.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = RefreshControlExtension.swift; sourceTree = "<group>"; }; + F12060811DA552FC00F6EF37 /* MailHandlerDelegator.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = MailHandlerDelegator.swift; sourceTree = "<group>"; }; + F12D8DB320692E280068788E /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/Inbox.strings; sourceTree = "<group>"; }; + F12D8DB520692E2D0068788E /* de */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = de; path = de.lproj/Inbox.strings; sourceTree = "<group>"; }; + F12D8DBC2069422A0068788E /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/About.storyboard; sourceTree = "<group>"; }; + F14239C01F30A99C00998A83 /* QRCodeGenerator.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = QRCodeGenerator.swift; sourceTree = "<group>"; }; + F176A216206943080068788E /* en */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = en; path = en.lproj/About.storyboard; sourceTree = "<group>"; }; + F1866C85201F707200B72453 /* EmailHelper.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = EmailHelper.m; sourceTree = "<group>"; }; + F1866C87201F70B700B72453 /* EmailHelper.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = EmailHelper.h; sourceTree = "<group>"; }; + F18B445D1E7044B70080C041 /* FlipTransition.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = FlipTransition.swift; sourceTree = "<group>"; }; + F18B445F1E704C550080C041 /* ReplaceSegue.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ReplaceSegue.swift; sourceTree = "<group>"; }; + F18B44611E73286C0080C041 /* ReadVENDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ReadVENDelegate.swift; sourceTree = "<group>"; }; + F18C5E551FE025D300C3B86D /* BadgeCase.storyboard */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.storyboard; path = BadgeCase.storyboard; sourceTree = "<group>"; }; + F1984D711E1D327200804E1E /* IconsStyleKit.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = IconsStyleKit.swift; sourceTree = "<group>"; }; + F1984D731E1E92B300804E1E /* LabelStyleKit.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = LabelStyleKit.swift; sourceTree = "<group>"; }; + F1ACF21B1E0C1C6800C1B843 /* ContactViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ContactViewController.swift; sourceTree = "<group>"; }; + F1AF938E1E2D04BA00755128 /* CustomCells.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CustomCells.swift; sourceTree = "<group>"; }; + F1C7AC811FED6473007629DB /* AboutViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AboutViewController.swift; sourceTree = "<group>"; }; + F1E918D61FBDEECA00D60418 /* LoggerTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = LoggerTests.swift; sourceTree = "<group>"; }; + F1F070271FA0DF3F004A860A /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Inbox.storyboard; sourceTree = "<group>"; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 476EEF9322A872BF00BB4EF7 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 50F2E7D66366C779705987A7 /* Pods_enzevalos_iphoneUITests.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + A13526721D955BDF00D3BFE1 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 476406802416AA6F00C7D426 /* libssl.a in Frameworks */, + 47184C3922F0D8F200712A7A /* CFNetwork.framework in Frameworks */, + 47CEF4ED2052C3E700887CDB /* ObjectivePGP.framework in Frameworks */, + 4764067E2416AA6F00C7D426 /* libcrypto.a in Frameworks */, + 47F867E42052B49800AA832F /* libbz2.tbd in Frameworks */, + 47F867E22052B48E00AA832F /* libz.tbd in Frameworks */, + 47F867E02052B47C00AA832F /* Security.framework in Frameworks */, + 472F396E1E14F384009260FB /* CoreData.framework in Frameworks */, + AC4001CA169DC07A7A1E3AD3 /* Pods_enzevalos_iphone.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + A13526891D955BE000D3BFE1 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 479B597A20691C0600B3944D /* libz.tbd in Frameworks */, + 479B597920691BFB00B3944D /* libbz2.tbd in Frameworks */, + 479B597820691BE400B3944D /* ObjectivePGP.framework in Frameworks */, + 7500EE9D4F3130671F5C1AE2 /* Pods_enzevalos_iphoneTests.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 0ECEA101240EA905007DC71E /* SMIME */ = { + isa = PBXGroup; + children = ( + 0EF148042422543E00B3C198 /* Certificate.swift */, + A5E303D524110F6400310264 /* c */, + 0ECA5797240D496800B0F231 /* SMIME.swift */, + 0EF73F4224237E6500932FA0 /* SMIMEHelpers.swift */, + ); + name = SMIME; + sourceTree = "<group>"; + }; + 0EFEF0932417C08B00BB2FF7 /* C Helpers */ = { + isa = PBXGroup; + children = ( + 0EFEF0942417C0B400BB2FF7 /* CHelpers.swift */, + ); + name = "C Helpers"; + sourceTree = "<group>"; + }; + 24472862977D71D3F0AD0D58 /* Pods */ = { + isa = PBXGroup; + children = ( + 411EB2B85F99B48FFD36F966 /* Pods-enzevalos_iphoneTests.debug.xcconfig */, + C7733DFEFB7E7CFF38EC1665 /* Pods-enzevalos_iphoneTests.release.xcconfig */, + 9A132EDE8BCA06ACDB505C22 /* Pods-enzevalos_iphoneUITests.debug.xcconfig */, + 796D16D79BED5D60B580E602 /* Pods-enzevalos_iphoneUITests.release.xcconfig */, + 6EBCCD02AD3B95D8317810E2 /* Pods-enzevalos_iphoneTests.debug.xcconfig */, + BC7D006B3B40A23E53B4F317 /* Pods-enzevalos_iphoneTests.release.xcconfig */, + 66E758F271CD65AB3E5FE7A7 /* Pods-enzevalos_iphoneUITests.debug.xcconfig */, + 8B87EFB6CEAA31452F744015 /* Pods-enzevalos_iphoneUITests.release.xcconfig */, + 91B6C9020C660BEA78FAEF28 /* Pods-enzevalos_iphone.debug.xcconfig */, + AA686D4FC9B86445A0C87F0F /* Pods-enzevalos_iphone.release.xcconfig */, + 1D4A9E60565DECF52C011BC0 /* Pods-enzevalos_iphone-AdHoc.release.xcconfig */, + 9B3D62838C729BAC6832270A /* Pods-enzevalos_iphone-AdHoc.debug.xcconfig */, + 48C250BB32BF11B683003BA1 /* Pods-enzevalos_iphone-enzevalos_iphoneUITests.debug.xcconfig */, + 8478C5F0EC1CB76AEBE1F47A /* Pods-enzevalos_iphone-enzevalos_iphoneUITests.release.xcconfig */, + ); + name = Pods; + sourceTree = "<group>"; + }; + 3E9708AC1FAC925D005825C9 /* PLists */ = { + isa = PBXGroup; + children = ( + 3E9708AD1FAC925D005825C9 /* enzevalos_iphone.entitlements */, + 3E9708AE1FAC925D005825C9 /* enzevalos-Info.plist */, + ); + path = PLists; + sourceTree = "<group>"; + }; + 3EB4FA9C2012007C001D0625 /* Dialog */ = { + isa = PBXGroup; + children = ( + 3EB4FA9E2012007C001D0625 /* Dialog.storyboard */, + 3EB4FAA320120096001D0625 /* DialogOption.swift */, + 3EB4FA9D2012007C001D0625 /* DialogViewController.swift */, + ); + path = Dialog; + sourceTree = "<group>"; + }; + 3EC35F1F2003755F008BDF95 /* Invitation */ = { + isa = PBXGroup; + children = ( + 3EC35F2320037651008BDF95 /* InvitationHelper.swift */, + 3EC35F2C200376A1008BDF95 /* SendViewController+Invitation.swift */, + 4756DE0D20402F8E00452288 /* invitationTextCensor.html */, + 3E6B07DD2011246500E49609 /* invitationText.html */, + ); + name = Invitation; + sourceTree = "<group>"; + }; + 470709112189BB4A00DF71A3 /* testMails */ = { + isa = PBXGroup; + children = ( + 0ECEA0EB240E7D85007DC71E /* johnny C1.json.eml */, + 0ECEA0E9240E7D64007DC71E /* SMIME Test 1 S.eml */, + 4774DD7422D0015F00BD8CF6 /* multiIDs.eml */, + 4774DD7A22D3F5D100BD8CF6 /* multiIDs2.eml */, + 4774DD8022D4067D00BD8CF6 /* signedEncMailFromApple.eml */, + A15D215C223BE614003E0CE0 /* attachment.eml */, + 47E7BE622232BD0A00C8EF94 /* SignedEncMailFromMac.eml */, + 47E7BE5A22319B6900C8EF94 /* EncMailFromMac.eml */, + 0E1C457924055F87006D104A /* signencinlineK9.eml */, + 0E1C457824055F87006D104A /* signencK9.eml */, + 0E1C457624055F87006D104A /* signinlineK9.eml */, + 0E1C457724055F87006D104A /* signK9.eml */, + 47E7BE6022319B8F00C8EF94 /* PlainMailFromMac.eml */, + 47E7BE5E22319B7D00C8EF94 /* SecureMailFromMac.eml */, + 47E7BE5C22319B7000C8EF94 /* SignedMailFromMac.eml */, + 47C22282218B02C700BD2C2B /* autocryptSimpleExample1.eml */, + 4707092F2189E1C000DF71A3 /* enc+signedThunderbird.eml */, + 470709212189C73900DF71A3 /* enc+signedInlineThunderbird.eml */, + 470709232189C73900DF71A3 /* encInlineThunderbird.eml */, + 470709222189C73900DF71A3 /* encThunderbird.eml */, + 470709242189C73900DF71A3 /* signedInlineThunderbird.eml */, + 470709252189C73900DF71A3 /* signedThunderbird.eml */, + 470709172189BC3500DF71A3 /* plainThunderbird.eml */, + ); + path = testMails; + sourceTree = "<group>"; + }; + 470709202189C24800DF71A3 /* testKeys */ = { + isa = PBXGroup; + children = ( + 4774DD7222CFFD0E00BD8CF6 /* AliceMultiIDs (439EE43C) – Public.asc */, + 4707092C2189C74200DF71A3 /* alicePublic.asc */, + 4774DD7D22D4062200BD8CF6 /* Alice Letterbox (439EE43C) – Public.asc */, + 0E1C457F24055FB7006D104A /* Alice.v3.pub.asc */, + 0E1C457E24055FB7006D104A /* Alice.v3.pubsec.asc */, + 4774DD7C22D4062200BD8CF6 /* Bob Letterbox (0B6CD0A0) – Secret.asc */, + 471876F5223FACA900912135 /* BobPWTEST1234.asc */, + 479AFDA122571AB90063A332 /* EccAlice(777879D4)–Public.asc */, + 471876F6223FACA900912135 /* BobWithoutPW.asc */, + 4707092B2189C74200DF71A3 /* bobSecret.asc */, + ); + path = testKeys; + sourceTree = "<group>"; + }; + 472F39921E279792009260FB /* protocols */ = { + isa = PBXGroup; + children = ( + 472F398D1E251B8D009260FB /* MailAddress.swift */, + 472F39851E1FA34E009260FB /* Record.swift */, + 472F39891E251787009260FB /* Contact.swift */, + 47691A891ECB56D1004BCFC5 /* Mail.swift */, + ); + name = protocols; + sourceTree = "<group>"; + }; + 476403FA2413F95300C7D426 /* OpenSSL */ = { + isa = PBXGroup; + children = ( + 4764060D2416AA6F00C7D426 /* include */, + 476406082416AA6F00C7D426 /* lib */, + ); + path = OpenSSL; + sourceTree = "<group>"; + }; + 476406082416AA6F00C7D426 /* lib */ = { + isa = PBXGroup; + children = ( + 476406092416AA6F00C7D426 /* libcrypto.a */, + 4764060B2416AA6F00C7D426 /* libssl.a */, + ); + path = lib; + sourceTree = "<group>"; + }; + 4764060D2416AA6F00C7D426 /* include */ = { + isa = PBXGroup; + children = ( + 4764060E2416AA6F00C7D426 /* opensslconf-template.h */, + 4764060F2416AA6F00C7D426 /* LICENSE */, + 476406102416AA6F00C7D426 /* openssl */, + ); + path = include; + sourceTree = "<group>"; + }; + 476406102416AA6F00C7D426 /* openssl */ = { + isa = PBXGroup; + children = ( + 476406112416AA6F00C7D426 /* pem2.h */, + 476406122416AA6F00C7D426 /* kdf.h */, + 476406132416AA6F00C7D426 /* pem.h */, + 476406142416AA6F00C7D426 /* asyncerr.h */, + 476406152416AA6F00C7D426 /* md2.h */, + 476406162416AA6F00C7D426 /* ssl3.h */, + 476406172416AA6F00C7D426 /* ossl_typ.h */, + 476406182416AA6F00C7D426 /* dtls1.h */, + 476406192416AA6F00C7D426 /* err.h */, + 4764061A2416AA6F00C7D426 /* bn.h */, + 4764061B2416AA6F00C7D426 /* blowfish.h */, + 4764061C2416AA6F00C7D426 /* cms.h */, + 4764061D2416AA6F00C7D426 /* engine.h */, + 4764061E2416AA6F00C7D426 /* conf_api.h */, + 4764061F2416AA6F00C7D426 /* x509.h */, + 476406202416AA6F00C7D426 /* asn1_mac.h */, + 476406212416AA6F00C7D426 /* objectserr.h */, + 476406222416AA6F00C7D426 /* opensslconf_ios_x86_64.h */, + 476406232416AA6F00C7D426 /* cmserr.h */, + 476406242416AA6F00C7D426 /* ui.h */, + 476406252416AA6F00C7D426 /* opensslconf_tvos_x86_64.h */, + 476406262416AA6F00C7D426 /* sha.h */, + 476406272416AA6F00C7D426 /* symhacks.h */, + 476406282416AA6F00C7D426 /* asn1.h */, + 476406292416AA6F00C7D426 /* bioerr.h */, + 4764062A2416AA6F00C7D426 /* opensslconf.h */, + 4764062B2416AA6F00C7D426 /* bio.h */, + 4764062C2416AA6F00C7D426 /* rc2.h */, + 4764062D2416AA6F00C7D426 /* dh.h */, + 4764062E2416AA6F00C7D426 /* x509v3.h */, + 4764062F2416AA6F00C7D426 /* conf.h */, + 476406302416AA6F00C7D426 /* rand_drbg.h */, + 476406312416AA6F00C7D426 /* md5.h */, + 476406322416AA6F00C7D426 /* pemerr.h */, + 476406332416AA6F00C7D426 /* x509_vfy.h */, + 476406342416AA6F00C7D426 /* txt_db.h */, + 476406352416AA6F00C7D426 /* comperr.h */, + 476406362416AA6F00C7D426 /* cterr.h */, + 476406372416AA6F00C7D426 /* safestack.h */, + 476406382416AA6F00C7D426 /* ecdsa.h */, + 476406392416AA6F00C7D426 /* sslerr.h */, + 4764063A2416AA6F00C7D426 /* rc5.h */, + 4764063B2416AA6F00C7D426 /* uierr.h */, + 4764063C2416AA6F00C7D426 /* x509v3err.h */, + 4764063D2416AA6F00C7D426 /* objects.h */, + 4764063E2416AA6F00C7D426 /* pkcs12.h */, + 4764063F2416AA6F00C7D426 /* crypto.h */, + 476406402416AA6F00C7D426 /* opensslv.h */, + 476406412416AA6F00C7D426 /* evperr.h */, + 476406422416AA6F00C7D426 /* pkcs7.h */, + 476406432416AA6F00C7D426 /* obj_mac.h */, + 476406442416AA6F00C7D426 /* ct.h */, + 476406452416AA6F00C7D426 /* async.h */, + 476406462416AA6F00C7D426 /* buffer.h */, + 476406472416AA6F00C7D426 /* ssl.h */, + 476406482416AA6F00C7D426 /* srp.h */, + 476406492416AA6F00C7D426 /* camellia.h */, + 4764064A2416AA6F00C7D426 /* opensslconf_ios_arm64.h */, + 4764064B2416AA6F00C7D426 /* dherr.h */, + 4764064C2416AA6F00C7D426 /* evp.h */, + 4764064D2416AA6F00C7D426 /* e_os2.h */, + 4764064E2416AA6F00C7D426 /* md4.h */, + 4764064F2416AA6F00C7D426 /* hmac.h */, + 476406502416AA6F00C7D426 /* aes.h */, + 476406512416AA6F00C7D426 /* engineerr.h */, + 476406522416AA6F00C7D426 /* comp.h */, + 476406532416AA6F00C7D426 /* pkcs12err.h */, + 476406542416AA6F00C7D426 /* cast.h */, + 476406552416AA6F00C7D426 /* rc4.h */, + 476406562416AA6F00C7D426 /* stack.h */, + 476406572416AA6F00C7D426 /* des.h */, + 476406582416AA6F00C7D426 /* ocsp.h */, + 476406592416AA6F00C7D426 /* ec.h */, + 4764065A2416AA6F00C7D426 /* ecdh.h */, + 4764065B2416AA6F00C7D426 /* rand.h */, + 4764065C2416AA6F00C7D426 /* opensslconf_tvos_arm64.h */, + 4764065D2416AA6F00C7D426 /* ecerr.h */, + 4764065E2416AA6F00C7D426 /* ts.h */, + 4764065F2416AA6F00C7D426 /* cryptoerr.h */, + 476406602416AA6F00C7D426 /* storeerr.h */, + 476406612416AA6F00C7D426 /* buffererr.h */, + 476406622416AA6F00C7D426 /* seed.h */, + 476406632416AA6F00C7D426 /* modes.h */, + 476406642416AA6F00C7D426 /* ssl2.h */, + 476406652416AA6F00C7D426 /* tserr.h */, + 476406662416AA6F00C7D426 /* rsa.h */, + 476406672416AA6F00C7D426 /* ripemd.h */, + 476406682416AA6F00C7D426 /* whrlpool.h */, + 476406692416AA6F00C7D426 /* tls1.h */, + 4764066A2416AA6F00C7D426 /* rsaerr.h */, + 4764066B2416AA6F00C7D426 /* randerr.h */, + 4764066C2416AA6F00C7D426 /* mdc2.h */, + 4764066D2416AA6F00C7D426 /* ocsperr.h */, + 4764066E2416AA6F00C7D426 /* x509err.h */, + 4764066F2416AA6F00C7D426 /* pkcs7err.h */, + 476406702416AA6F00C7D426 /* dsa.h */, + 476406712416AA6F00C7D426 /* kdferr.h */, + 476406722416AA6F00C7D426 /* srtp.h */, + 476406732416AA6F00C7D426 /* asn1t.h */, + 476406742416AA6F00C7D426 /* dsaerr.h */, + 476406752416AA6F00C7D426 /* bnerr.h */, + 476406762416AA6F00C7D426 /* conferr.h */, + 476406772416AA6F00C7D426 /* cmac.h */, + 476406782416AA6F00C7D426 /* ebcdic.h */, + 476406792416AA6F00C7D426 /* opensslconf_ios_arm64e.h */, + 4764067A2416AA6F00C7D426 /* store.h */, + 4764067B2416AA6F00C7D426 /* idea.h */, + 4764067C2416AA6F00C7D426 /* lhash.h */, + 4764067D2416AA6F00C7D426 /* asn1err.h */, + ); + path = openssl; + sourceTree = "<group>"; + }; + 476406872416B54D00C7D426 /* SwiftUI */ = { + isa = PBXGroup; + children = ( + 476406882416B54D00C7D426 /* Inbox */, + 4764068C2416B54D00C7D426 /* SupportingViews */, + ); + path = SwiftUI; + sourceTree = "<group>"; + }; + 476406882416B54D00C7D426 /* Inbox */ = { + isa = PBXGroup; + children = ( + 476406892416B54D00C7D426 /* KeyRecordRow.swift */, + 4764068A2416B54D00C7D426 /* Inbox.swift */, + 4764068B2416B54D00C7D426 /* InboxCoordinator.swift */, + ); + path = Inbox; + sourceTree = "<group>"; + }; + 4764068C2416B54D00C7D426 /* SupportingViews */ = { + isa = PBXGroup; + children = ( + 4764068D2416B54D00C7D426 /* CiricleImage.swift */, + 4764068E2416B54D00C7D426 /* SearchView.swift */, + 4764068F2416B54D00C7D426 /* MailView.swift */, + 476406902416B54D00C7D426 /* SwiftUI to UIKit */, + 476406932416B54D00C7D426 /* Geometry */, + ); + path = SupportingViews; + sourceTree = "<group>"; + }; + 476406902416B54D00C7D426 /* SwiftUI to UIKit */ = { + isa = PBXGroup; + children = ( + 476406922416B54D00C7D426 /* VCSwiftUIView.swift */, + ); + path = "SwiftUI to UIKit"; + sourceTree = "<group>"; + }; + 476406932416B54D00C7D426 /* Geometry */ = { + isa = PBXGroup; + children = ( + 476406942416B54D00C7D426 /* Stroke.swift */, + ); + path = Geometry; + sourceTree = "<group>"; + }; + 476EEF9722A872BF00BB4EF7 /* enzevalos_iphoneUITests */ = { + isa = PBXGroup; + children = ( + 476EEF9822A872BF00BB4EF7 /* enzevalos_iphoneUITests.swift */, + 476EEFA522A87B9800BB4EF7 /* private */, + 476EEFA022A873A800BB4EF7 /* OnboardingTest.swift */, + 476EEF9A22A872BF00BB4EF7 /* Info.plist */, + ); + path = enzevalos_iphoneUITests; + sourceTree = "<group>"; + }; + 476EEFA522A87B9800BB4EF7 /* private */ = { + isa = PBXGroup; + children = ( + 476EEFA622A87B9800BB4EF7 /* accounts.json */, + ); + name = private; + path = enzevalos_iphoneTests/private; + sourceTree = SOURCE_ROOT; + }; + 477548DC21F5DA46000B22A8 /* mail */ = { + isa = PBXGroup; + children = ( + 476801DD21846A5A00F7F259 /* OutgoingMail.swift */, + A16BA2111E0439B6005E29E3 /* providers.json */, + A1EB057B1D956838008659C1 /* MailHandler.swift */, + 477548DD21F5DABE000B22A8 /* MailServerConnectionError.swift */, + 47CEAC97222541B40075B7DC /* MailSession.swift */, + 478AF714222FD5C600AEF69E /* IncomingMail.swift */, + 71DFE5B9240679E80042019C /* HeaderExtractionValues.swift */, + ); + name = mail; + sourceTree = "<group>"; + }; + 477548E021F77445000B22A8 /* study parameters */ = { + isa = PBXGroup; + children = ( + 477548E121F77466000B22A8 /* SecurityIndicator.swift */, + 478154A621FF3F0900A931EC /* Warning.swift */, + 477548E321F77BA0000B22A8 /* StudyParameterProtocol.swift */, + 478154A821FF3FF400A931EC /* Invitation.swift */, + ); + path = "study parameters"; + sourceTree = "<group>"; + }; + 478154AA21FF6A5300A931EC /* mailbot */ = { + isa = PBXGroup; + children = ( + 478154AB21FF6A9600A931EC /* Mailbot.swift */, + ); + name = mailbot; + path = "New Group"; + sourceTree = "<group>"; + }; + 4790114A228997620057AB04 /* StyleKits */ = { + isa = PBXGroup; + children = ( + 479011482289975C0057AB04 /* NoSecIconStyleKit.swift */, + F1984D711E1D327200804E1E /* IconsStyleKit.swift */, + F1984D731E1E92B300804E1E /* LabelStyleKit.swift */, + ); + path = StyleKits; + sourceTree = "<group>"; + }; + 47B91AC01EC0C1CF000AE3EE /* coredata */ = { + isa = PBXGroup; + children = ( + 4751C6FE2344D37C006B2A4D /* SecretKey+CoreDataClass.swift */, + 4751C6FF2344D37C006B2A4D /* SecretKey+CoreDataProperties.swift */, + 47F7923E203492E3005E7DB6 /* KeyRecord+CoreDataClass.swift */, + 47F7923F203492E3005E7DB6 /* KeyRecord+CoreDataProperties.swift */, + 475B00401F7BB6D6006CDD41 /* PersistentKey+CoreDataClass.swift */, + 475B00411F7BB6D6006CDD41 /* PersistentKey+CoreDataProperties.swift */, + 472F39781E1D0B0B009260FB /* PersistentMail +CoreDataProperties.swift */, + 4769169F216B86A100491527 /* PersistentMail +CoreDataClass.swift */, + 472F396F1E14F75C009260FB /* DataHandler.swift */, + 475DF4771F0D54C9009D807F /* Folder+CoreDataClass.swift */, + 475DF4781F0D54C9009D807F /* Folder+CoreDataProperties.swift */, + 472F397A1E1D0B0B009260FB /* EnzevalosContact+CoreDataProperties.swift */, + 472F39801E1E5347009260FB /* Mail_Address+CoreDataProperties.swift */, + 476916A1216B86CF00491527 /* EnzevalosContact+CoreDataClass.swift */, + 472F397F1E1E5347009260FB /* Mail_Address+CoreDataClass.swift */, + ); + name = coredata; + sourceTree = "<group>"; + }; + 47B91AC11EC0C1FB000AE3EE /* data */ = { + isa = PBXGroup; + children = ( + A15D215A223BE5F4003E0CE0 /* TempAttachment.swift */, + 472F39921E279792009260FB /* protocols */, + A114E4311FACB23000E40243 /* StringExtension.swift */, + 4751C6ED233CA583006B2A4D /* DateExtension.swift */, + 47691A8B1ECC3EC7004BCFC5 /* EphemeralMail.swift */, + 472F398B1E2519C8009260FB /* CNContactExtension.swift */, + 472F398F1E252470009260FB /* CNMailAddressesExtension.swift */, + A1EB05871D956879008659C1 /* AddressHandler.swift */, + 47B91AC01EC0C1CF000AE3EE /* coredata */, + ); + name = data; + sourceTree = "<group>"; + }; + 47EABF04241A9C6400774A93 /* Recovered References */ = { + isa = PBXGroup; + children = ( + 97AACD2324178C230078A68E /* AuthenticationModel.swift */, + 9771AA8B241161190023A096 /* MailAccount.swift */, + ); + name = "Recovered References"; + sourceTree = "<group>"; + }; + 47EABF05241A9C7000774A93 /* Authentication */ = { + isa = PBXGroup; + children = ( + 47EABF0C241A9CA800774A93 /* MailAccount.swift */, + 47EABF06241A9C8700774A93 /* AuthenticationModel.swift */, + 47EABF08241A9C8700774A93 /* AuthenticationScreen.swift */, + 47EABF07241A9C8700774A93 /* AuthenticationViewModel.swift */, + ); + name = Authentication; + sourceTree = "<group>"; + }; + 47F0376C22A7278A0005C9DE /* private */ = { + isa = PBXGroup; + children = ( + 47F0376D22A7278A0005C9DE /* accounts.json */, + ); + path = private; + sourceTree = "<group>"; + }; + 71DF0896242151E200162B74 /* phishing */ = { + isa = PBXGroup; + children = ( + 988C9C5C240D507A006213F0 /* UrlStringExtensionTests.swift */, + 71DF08972421520D00162B74 /* EmailStringExtensionTests.swift */, + ); + path = phishing; + sourceTree = "<group>"; + }; + 78280F99990BFF65543B7F0B /* Frameworks */ = { + isa = PBXGroup; + children = ( + 47184C3822F0D8F200712A7A /* CFNetwork.framework */, + 47A5D6DD2294B5480084F81D /* AppAuth.framework */, + 47A5D6DB2294B5220084F81D /* libz.1.1.3.tbd */, + 47A5D6D52294B4830084F81D /* GTMAppAuth.framework */, + 47CEF4EC2052C3E600887CDB /* ObjectivePGP.framework */, + 47F867E32052B49800AA832F /* libbz2.tbd */, + 47F867E12052B48E00AA832F /* libz.tbd */, + 47F867DF2052B47C00AA832F /* Security.framework */, + 472F396D1E14F384009260FB /* CoreData.framework */, + C1F4458FC892EBE555836F55 /* Pods_enzevalos_iphone_AdHoc.framework */, + 94EE54279AB591E0CAB8EFD8 /* Pods_enzevalos_iphone.framework */, + 7977EA7012D8E98D186D5C60 /* Pods_enzevalos_iphoneTests.framework */, + AF67EF30BB065CC9C0D17940 /* Pods_enzevalos_iphoneUITests.framework */, + ); + name = Frameworks; + sourceTree = "<group>"; + }; + 8428A8511F436952007649A5 /* Gamification */ = { + isa = PBXGroup; + children = ( + 8428A8521F4369C0007649A5 /* Gamification.storyboard */, + F18C5E551FE025D300C3B86D /* BadgeCase.storyboard */, + 8428A8541F4369CF007649A5 /* GamificationElements.xcassets */, + 8428A8751F436A81007649A5 /* Data */, + 8428A8731F436A45007649A5 /* Views und Cells */, + 8428A8741F436A71007649A5 /* ViewControllers */, + ); + name = Gamification; + sourceTree = "<group>"; + }; + 8428A8731F436A45007649A5 /* Views und Cells */ = { + isa = PBXGroup; + children = ( + 8428A8581F436A05007649A5 /* ArrowView.swift */, + 8428A85A1F436A05007649A5 /* CircleView.swift */, + 8428A8601F436A11007649A5 /* BadgeCaseCollectionViewCell.swift */, + 8428A8621F436A11007649A5 /* SubBadgeHeaderTableViewCell.swift */, + 8428A8631F436A11007649A5 /* SubBadgeTableViewCell.swift */, + 8428A8641F436A11007649A5 /* UserNameGamificationTableViewCell.swift */, + 8428A8611F436A11007649A5 /* ArrowTableViewCell.swift */, + ); + name = "Views und Cells"; + sourceTree = "<group>"; + }; + 8428A8741F436A71007649A5 /* ViewControllers */ = { + isa = PBXGroup; + children = ( + 8428A86A1F436A1E007649A5 /* BadgeCase.swift */, + 8428A86B1F436A1E007649A5 /* InviteFriendViewController.swift */, + 8428A86C1F436A1E007649A5 /* LinearBadgeViewController.swift */, + 8428A86D1F436A1E007649A5 /* GamificationStatusViewController.swift */, + ); + name = ViewControllers; + sourceTree = "<group>"; + }; + 8428A8751F436A81007649A5 /* Data */ = { + isa = PBXGroup; + children = ( + 8428A8591F436A05007649A5 /* Badges.swift */, + 8428A85B1F436A05007649A5 /* GamificationData.swift */, + ); + name = Data; + sourceTree = "<group>"; + }; + 97C5279D241A9F690030BBC9 /* authentication */ = { + isa = PBXGroup; + children = ( + 97C527A0241AA4090030BBC9 /* GeneratedMocks.swift */, + 97C5279E241A9F7B0030BBC9 /* AuthenticationTests.swift */, + ); + path = authentication; + sourceTree = "<group>"; + }; + A10DE41E1EFAA140005E8189 /* folders */ = { + isa = PBXGroup; + children = ( + A10DE41F1EFAA2CE005E8189 /* FolderViewController.swift */, + A1ECE54A1EFBE7ED0009349F /* FolderCell.swift */, + A1E2324D1F0FA41A00DC9D40 /* FolderListCell.swift */, + ); + name = folders; + sourceTree = "<group>"; + }; + A111F6AB1FA77AF80060AFDE /* Logging */ = { + isa = PBXGroup; + children = ( + A111F6AC1FA77B170060AFDE /* LoggerDetail.swift */, + 47A5D6E32294BFF50084F81D /* Logger.swift */, + A18E7D761FBDE5D9002F7CC9 /* LoggingEventType.swift */, + ); + name = Logging; + sourceTree = "<group>"; + }; + A1230BD81E2F881E006642C7 /* Encryption */ = { + isa = PBXGroup; + children = ( + 0ECEA101240EA905007DC71E /* SMIME */, + 475B00301F7B9565006CDD41 /* SwiftPGP.swift */, + 476801DA218436B600F7F259 /* Autocrypt.swift */, + 47A5D6E12294BF3A0084F81D /* TempKey.swift */, + 475B00311F7B9565006CDD41 /* Cryptography.swift */, + 475B00321F7B9565006CDD41 /* CryptoObject.swift */, + 476406832416AA9100C7D426 /* TestOpenSSL.swift */, + ); + name = Encryption; + sourceTree = "<group>"; + }; + A12F91D621F3A96300AB0589 /* extensions */ = { + isa = PBXGroup; + children = ( + A12F91D721F3A99800AB0589 /* NSLayoutConstraintExtension.swift */, + ); + name = extensions; + sourceTree = "<group>"; + }; + A135266C1D955BDF00D3BFE1 = { + isa = PBXGroup; + children = ( + 47CEF4EA2052C3C700887CDB /* ObjectivePGP.framework */, + A13526771D955BDF00D3BFE1 /* enzevalos_iphone */, + A135268F1D955BE000D3BFE1 /* enzevalos_iphoneTests */, + 476EEF9722A872BF00BB4EF7 /* enzevalos_iphoneUITests */, + A13526761D955BDF00D3BFE1 /* Products */, + 24472862977D71D3F0AD0D58 /* Pods */, + 78280F99990BFF65543B7F0B /* Frameworks */, + 47EABF04241A9C6400774A93 /* Recovered References */, + ); + sourceTree = "<group>"; + }; + A13526761D955BDF00D3BFE1 /* Products */ = { + isa = PBXGroup; + children = ( + A13526751D955BDF00D3BFE1 /* enzevalos_iphone.app */, + A135268C1D955BE000D3BFE1 /* enzevalos_iphoneTests.xctest */, + 476EEF9622A872BF00BB4EF7 /* enzevalos_iphoneUITests.xctest */, + ); + name = Products; + sourceTree = "<group>"; + }; + A13526771D955BDF00D3BFE1 /* enzevalos_iphone */ = { + isa = PBXGroup; + children = ( +<<<<<<< HEAD + 0EFEF0932417C08B00BB2FF7 /* C Helpers */, +======= +>>>>>>> dev + 47EABF05241A9C7000774A93 /* Authentication */, + 476406872416B54D00C7D426 /* SwiftUI */, + 476403FA2413F95300C7D426 /* OpenSSL */, + A1B9999D21DE7CD2002563F6 /* Travel */, + 477548DC21F5DA46000B22A8 /* mail */, + F1866C84201F703200B72453 /* OAuth */, + 3EB4FA9C2012007C001D0625 /* Dialog */, + 3EC35F1F2003755F008BDF95 /* Invitation */, + F1C733331FEC1CAC005A497E /* About */, + 8428A8511F436952007649A5 /* Gamification */, + A17FDFF1202C680A00F7BA89 /* debug and study */, + 47B91AC11EC0C1FB000AE3EE /* data */, + A1C7FF8B1E895316000D1E92 /* keys */, + A10DE41E1EFAA140005E8189 /* folders */, + A18C76851E8185ED00B21414 /* onboarding */, + A1EB05761D9567F2008659C1 /* read */, + F17654DF1F9E48F600D659B0 /* inbox */, + A1EB05751D956748008659C1 /* send */, + F1ACF21D1E0C290500C1B843 /* contactView */, + A19028E01F852D730030EA98 /* exportKey */, + A1D5076D1E80254D00B68B38 /* keyView */, + A13526781D955BDF00D3BFE1 /* AppDelegate.swift */, + F113C3831F30D01A00E7F1D6 /* QRCode */, + 476142071E07E52B00FD5E4F /* Theme.swift */, + A1230BD81E2F881E006642C7 /* Encryption */, + 476373C11E09BA88004D5EFE /* UserData.swift */, + A198270D1D9A8ABC0027F65C /* enzevalos_iphone-Bridging-Header.h */, + A1F9922B1DA7C9100073BF1B /* Main.storyboard */, + 4790114A228997620057AB04 /* StyleKits */, + A1123E6C1DA682850069551C /* Localizable.strings */, + A13526841D955BDF00D3BFE1 /* LaunchScreen.storyboard */, + A1EB05A31D956E32008659C1 /* Assets.xcassets */, + 476142091E082F9C00FD5E4F /* Settings.bundle */, + A1BE3FF81E9664660040114B /* InfoPlist.strings */, + A135267F1D955BDF00D3BFE1 /* enzevalos_iphone.xcdatamodeld */, + 3E9708AC1FAC925D005825C9 /* PLists */, + ); + path = enzevalos_iphone; + sourceTree = "<group>"; + }; + A135268F1D955BE000D3BFE1 /* enzevalos_iphoneTests */ = { + isa = PBXGroup; + children = ( +<<<<<<< HEAD + 0ED9072F24338E3C008CF9D0 /* SMIMETests.swift */, + 97C5279D241A9F690030BBC9 /* authentication */, + 988C9C5C240D507A006213F0 /* PhishingTests.swift */, +======= + 71DF0896242151E200162B74 /* phishing */, + 97C5279D241A9F690030BBC9 /* authentication */, +>>>>>>> dev + 47F0376C22A7278A0005C9DE /* private */, + 470709202189C24800DF71A3 /* testKeys */, + 470709112189BB4A00DF71A3 /* testMails */, + 4715F636202A0248001BFFD0 /* CoreDataTests.swift */, + A15D215E223BE6E4003E0CE0 /* MailTest.swift */, + A13526921D955BE000D3BFE1 /* Info.plist */, + F1E918D61FBDEECA00D60418 /* LoggerTests.swift */, + 3EC35F2F2003838E008BDF95 /* InvitationTests.swift */, + 8428A8561F4369EA007649A5 /* GamificationDataUnitTest.swift */, + 479B5976206914BE00B3944D /* CryptoTests.swift */, + 47C22280218AFD6300BD2C2B /* AutocryptTest.swift */, + 478154AD2200641900A931EC /* StudyTest.swift */, + 474054972244D7A9007CF83B /* MailServerConfigurationTest.swift */, + ); + path = enzevalos_iphoneTests; + sourceTree = "<group>"; + }; + A13A166421E6918600757890 /* views */ = { + isa = PBXGroup; + children = ( + A182183321E51DD200918A29 /* IntroContactCell.swift */, + A1EFF93221E6655C003BB240 /* IntroTableView.swift */, + A10DAA5621F37600005D8BBB /* IntroInfoButton.swift */, + ); + name = views; + sourceTree = "<group>"; + }; + A17FDFF1202C680A00F7BA89 /* debug and study */ = { + isa = PBXGroup; + children = ( + 478154AA21FF6A5300A931EC /* mailbot */, + 477548E021F77445000B22A8 /* study parameters */, + A17FDFF2202C685800F7BA89 /* StudySettings.swift */, + 47D1302A1F7CEE6D007B14DF /* DebugSettings.swift */, + A111F6AB1FA77AF80060AFDE /* Logging */, + 47A2A57123599D180013883D /* FeedbackButtonHelper.swift */, + ); + name = "debug and study"; + sourceTree = "<group>"; + }; + A182182521E500BC00918A29 /* Intro */ = { + isa = PBXGroup; + children = ( + A12F91D621F3A96300AB0589 /* extensions */, + A182182A21E5060F00918A29 /* templates */, + A13A166421E6918600757890 /* views */, + A182182921E505F200918A29 /* controller */, + ); + name = Intro; + sourceTree = "<group>"; + }; + A182182921E505F200918A29 /* controller */ = { + isa = PBXGroup; + children = ( + A182182B21E5072200918A29 /* IntroDescriptionViewController.swift */, + A182182D21E50D8D00918A29 /* IntroButtonViewController.swift */, + A1B49E5C21E54CBF00ED86FC /* IntroContactTableViewController.swift */, + A1B49E6321E55ECD00ED86FC /* IntroPageViewController.swift */, + A142E70821E7919F000395E3 /* IntroContactViewController.swift */, + A1AEBA5821E808CB00C84E59 /* IntroYesNoViewController.swift */, + A1F8540F21E8A60800614514 /* IntroSecretViewController.swift */, + A1ACDD0821EB9C4C00A059D0 /* IntroInputViewController.swift */, + ); + name = controller; + sourceTree = "<group>"; + }; + A182182A21E5060F00918A29 /* templates */ = { + isa = PBXGroup; + children = ( + A182182621E5012300918A29 /* Intro.storyboard */, + A182183121E518A400918A29 /* IntroContactCell.xib */, + A1B49E5E21E54EE700ED86FC /* IntroContactView.xib */, + ); + name = templates; + sourceTree = "<group>"; + }; + A18C76851E8185ED00B21414 /* onboarding */ = { + isa = PBXGroup; + children = ( + 476406A02416B5C800C7D426 /* OnboardingIntro.swift */, + 4764069E2416B5A600C7D426 /* NewOnboardingView.swift */, + 479C649821F45DAF00A01071 /* HideShowPasswordTextField.swift */, + 479C649921F45DAF00A01071 /* PasswordToggleVisibilityView.swift */, + A1083A531E8BFEA6003666B7 /* Onboarding.swift */, + 4751C6F72343B377006B2A4D /* Onboarding.Video.Click.Eng.m4v */, + A102AA891EDDB4E80024B457 /* videoOnboarding2.m4v */, + A1C62E992018F716000E5273 /* OnboardingValueState.swift */, + ); + name = onboarding; + sourceTree = "<group>"; + }; + A19028E01F852D730030EA98 /* exportKey */ = { + isa = PBXGroup; + children = ( + A12FC23020221A1400196008 /* ExportInfoViewController.swift */, + 4707096C1F8F9F4900657F41 /* ExportViewController.swift */, + A1A9DE721F864B0500B808AA /* ExportCells.swift */, + 4706D65E225B7B6B00B3F1D3 /* ItunesHandler.swift */, + 4706D660225CD21D00B3F1D3 /* ExportKeyHelper.swift */, + ); + name = exportKey; + sourceTree = "<group>"; + }; + A1B9999D21DE7CD2002563F6 /* Travel */ = { + isa = PBXGroup; + children = ( + A182182521E500BC00918A29 /* Intro */, + A1FA44A621E10E1400DB02AC /* TravelHandler.swift */, + ); + name = Travel; + sourceTree = "<group>"; + }; + A1C7FF8B1E895316000D1E92 /* keys */ = { + isa = PBXGroup; + children = ( + 0ECEA0ED240E7DB0007DC71E /* evilCA.p12 */, + 0ECEA0F5240E7DB0007DC71E /* evilCA.pem */, + 0ECEA0EF240E7DB0007DC71E /* evilkey1.p12 */, + 0ECEA0F6240E7DB1007DC71E /* evilkey1.pem */, + 0ECEA0F4240E7DB0007DC71E /* mykey.p12 */, + 0ECEA0F1240E7DB0007DC71E /* mykey.pem */, + 0ECEA0F2240E7DB0007DC71E /* myTestCA.p12 */, + 0ECEA0EE240E7DB0007DC71E /* myTestCA.pem */, + 0ECEA0F3240E7DB0007DC71E /* otherkey1.p12 */, + 0ECEA0F0240E7DB0007DC71E /* otherkey1.pem */, + A1E5960D1FCC871E003791E9 /* researchteam.asc */, + 479C649521F2139B00A01071 /* support_pk.asc */, + 47CD5AAC2012369300E771A1 /* support_pk2.asc */, + 47CD5AA82012368D00E771A1 /* logging_pk.asc */, + ); + name = keys; + sourceTree = "<group>"; + }; + A1D5076D1E80254D00B68B38 /* keyView */ = { + isa = PBXGroup; + children = ( + 4751C6F923449699006B2A4D /* CryptoManagementViewController.swift */, + A1D5076E1E80257A00B68B38 /* KeyViewController.swift */, + 477670C3228453FB00043604 /* ButtonCell.xib */, + 477670C5228454F700043604 /* ButtonCell.swift */, + 47A2A56D2350A4EF0013883D /* MoreInformationViewController.swift */, + 47E7376D22845EC400972401 /* SecretKeyTableViewController.swift */, + 47C037022347D4D1006295E8 /* PasteKeyViewController.swift */, + 47E7376F22845F3A00972401 /* KeyViews.storyboard */, + 47E737732284610E00972401 /* KeyCell.xib */, + 47E737752284632F00972401 /* KeyCell.swift */, + 4751C6FB2344C8D1006B2A4D /* KeyTableViewController.swift */, + 47C036FE2347C0F4006295E8 /* ImportKeyOverviewController.swift */, + ); + name = keyView; + sourceTree = "<group>"; + }; + A1EB05751D956748008659C1 /* send */ = { + isa = PBXGroup; + children = ( + A1EB057F1D956851008659C1 /* SendViewController.swift */, + F119D28F1E364B59001D732A /* AnimatedSendIcon.swift */, + 474994012261E4E6000F8DA5 /* SimpleSendIcon.swift */, + A1EB057D1D956848008659C1 /* VENDataDelegate.swift */, + A1EB05811D95685B008659C1 /* CollectionDataDelegate.swift */, + A1EB05831D956867008659C1 /* TableViewDataDelegate.swift */, + A1EB05791D956829008659C1 /* ContactCell.swift */, + A1EB05851D956872008659C1 /* FrequentCell.swift */, + A1C3270D1DB907D900CE2ED5 /* TextFormatter.swift */, + A1EB05891D956890008659C1 /* ContactCell.xib */, + A1EB058B1D9568AB008659C1 /* FrequentCell.xib */, + A198D2282056B384004CC838 /* SendViewDelegate.swift */, + A1735DF9205AB88500B336DB /* SendViewState.swift */, + ); + name = send; + sourceTree = "<group>"; + }; + A1EB05761D9567F2008659C1 /* read */ = { + isa = PBXGroup; + children = ( + A1EB058F1D956923008659C1 /* ReadViewController.swift */, + F18B44611E73286C0080C041 /* ReadVENDelegate.swift */, + A1EB059F1D95696C008659C1 /* MessageBodyTableViewCell.swift */, + ); + name = read; + sourceTree = "<group>"; + }; + A5E303D524110F6400310264 /* c */ = { + isa = PBXGroup; + children = ( + A5E303D624110F6400310264 /* smime-helpers.h */, + A5E303D724110F6400310264 /* smime-helpers.c */, + 0EF148062422570F00B3C198 /* generic-helpers.h */, + 0EF148072422572500B3C198 /* general-helpers.c */, + 0EF148092422584F00B3C198 /* certificate-helpers.h */, + 0EF1480A2422584F00B3C198 /* certificate-helpers.c */, + ); + path = c; + sourceTree = "<group>"; + }; + F113C3831F30D01A00E7F1D6 /* QRCode */ = { + isa = PBXGroup; + children = ( + F113C3841F30D06800E7F1D6 /* QRScannerView.swift */, + F113C38A1F3344C200E7F1D6 /* ViewControllerPannable.swift */, + F14239C01F30A99C00998A83 /* QRCodeGenerator.swift */, + ); + name = QRCode; + sourceTree = "<group>"; + }; + F17654DF1F9E48F600D659B0 /* inbox */ = { + isa = PBXGroup; + children = ( + 0ECEA0E7240E7081007DC71E /* SearchHelper.swift */, + F1F070261FA0DF3F004A860A /* Inbox.storyboard */, + F12041FA1DA3FBF7002E4940 /* ListViewController.swift */, + F12041FC1DA409A5002E4940 /* ListViewCell.swift */, + F12060811DA552FC00F6EF37 /* MailHandlerDelegator.swift */, + A1EB05931D956931008659C1 /* InboxCellDelegator.swift */, + A1EB05951D956939008659C1 /* InboxTableViewCell.swift */, + A1EB05971D956947008659C1 /* InboxViewController.swift */, + F120607F1DA540FE00F6EF37 /* RefreshControlExtension.swift */, + A1F9923B1DA7DD2E0073BF1B /* InboxTableViewCell.xib */, + ); + name = inbox; + sourceTree = "<group>"; + }; + F1866C84201F703200B72453 /* OAuth */ = { + isa = PBXGroup; + children = ( + F1866C85201F707200B72453 /* EmailHelper.m */, + F1866C87201F70B700B72453 /* EmailHelper.h */, + ); + path = OAuth; + sourceTree = "<group>"; + }; + F1ACF21D1E0C290500C1B843 /* contactView */ = { + isa = PBXGroup; + children = ( + F1ACF21B1E0C1C6800C1B843 /* ContactViewController.swift */, + F1AF938E1E2D04BA00755128 /* CustomCells.swift */, + F18B445D1E7044B70080C041 /* FlipTransition.swift */, + F18B445F1E704C550080C041 /* ReplaceSegue.swift */, + ); + name = contactView; + sourceTree = "<group>"; + }; + F1C733331FEC1CAC005A497E /* About */ = { + isa = PBXGroup; + children = ( + F12D8DBD2069422A0068788E /* About.storyboard */, + F1C7AC811FED6473007629DB /* AboutViewController.swift */, + ); + path = About; + sourceTree = "<group>"; + }; +/* End PBXGroup section */ + +/* Begin PBXNativeTarget section */ + 476EEF9522A872BF00BB4EF7 /* enzevalos_iphoneUITests */ = { + isa = PBXNativeTarget; + buildConfigurationList = 476EEF9D22A872BF00BB4EF7 /* Build configuration list for PBXNativeTarget "enzevalos_iphoneUITests" */; + buildPhases = ( + E1C52B0447A565FBE3CAA203 /* [CP] Check Pods Manifest.lock */, + 476EEF9222A872BF00BB4EF7 /* Sources */, + 476EEF9322A872BF00BB4EF7 /* Frameworks */, + 476EEF9422A872BF00BB4EF7 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + 476EEF9C22A872BF00BB4EF7 /* PBXTargetDependency */, + ); + name = enzevalos_iphoneUITests; + productName = enzevalos_iphoneUITests; + productReference = 476EEF9622A872BF00BB4EF7 /* enzevalos_iphoneUITests.xctest */; + productType = "com.apple.product-type.bundle.ui-testing"; + }; + A13526741D955BDF00D3BFE1 /* enzevalos_iphone */ = { + isa = PBXNativeTarget; + buildConfigurationList = A13526A01D955BE000D3BFE1 /* Build configuration list for PBXNativeTarget "enzevalos_iphone" */; + buildPhases = ( + 60E197910FD6B0523F9273AE /* [CP] Check Pods Manifest.lock */, + A13526711D955BDF00D3BFE1 /* Sources */, + A13526721D955BDF00D3BFE1 /* Frameworks */, + A13526731D955BDF00D3BFE1 /* Resources */, + 47F867DB2052B33C00AA832F /* CopyFiles */, + 47F867E52052B4B500AA832F /* ShellScript */, + 3992B0CB6412E8526773B814 /* [CP] Embed Pods Frameworks */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = enzevalos_iphone; + productName = enzevalos_iphone; + productReference = A13526751D955BDF00D3BFE1 /* enzevalos_iphone.app */; + productType = "com.apple.product-type.application"; + }; + A135268B1D955BE000D3BFE1 /* enzevalos_iphoneTests */ = { + isa = PBXNativeTarget; + buildConfigurationList = A13526A31D955BE000D3BFE1 /* Build configuration list for PBXNativeTarget "enzevalos_iphoneTests" */; + buildPhases = ( + D6F0EB205D61EA8C8A045390 /* [CP] Check Pods Manifest.lock */, + 47EABF01241A99DA00774A93 /* Cockoo run script */, + A13526881D955BE000D3BFE1 /* Sources */, + A13526891D955BE000D3BFE1 /* Frameworks */, + A135268A1D955BE000D3BFE1 /* Resources */, + 0811D368D52F1D9B243500D4 /* [CP] Embed Pods Frameworks */, + ); + buildRules = ( + ); + dependencies = ( + A135268E1D955BE000D3BFE1 /* PBXTargetDependency */, + ); + name = enzevalos_iphoneTests; + productName = enzevalos_iphoneTests; + productReference = A135268C1D955BE000D3BFE1 /* enzevalos_iphoneTests.xctest */; + productType = "com.apple.product-type.bundle.unit-test"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + A135266D1D955BDF00D3BFE1 /* Project object */ = { + isa = PBXProject; + attributes = { + KnownAssetTags = ( + MailCoreRessources, + ); + LastSwiftUpdateCheck = 1010; + LastUpgradeCheck = 0940; + ORGANIZATIONNAME = "fu-berlin"; + TargetAttributes = { + 476EEF9522A872BF00BB4EF7 = { + CreatedOnToolsVersion = 10.1; + DevelopmentTeam = VJ9C93G68Y; + LastSwiftMigration = 1020; + ProvisioningStyle = Automatic; + TestTargetID = A13526741D955BDF00D3BFE1; + }; + A13526741D955BDF00D3BFE1 = { + CreatedOnToolsVersion = 7.3.1; + DevelopmentTeam = VJ9C93G68Y; + LastSwiftMigration = 1020; + ProvisioningStyle = Automatic; + SystemCapabilities = { + com.apple.BackgroundModes = { + enabled = 1; + }; + com.apple.DataProtection = { + enabled = 1; + }; + com.apple.Keychain = { + enabled = 1; + }; + com.apple.Push = { + enabled = 1; + }; + }; + }; + A135268B1D955BE000D3BFE1 = { + CreatedOnToolsVersion = 7.3.1; + DevelopmentTeam = 4377G946WP; + LastSwiftMigration = 1020; + }; + }; + }; + buildConfigurationList = A13526701D955BDF00D3BFE1 /* Build configuration list for PBXProject "enzevalos_iphone" */; + compatibilityVersion = "Xcode 3.2"; + developmentRegion = English; + hasScannedForEncodings = 0; + knownRegions = ( + English, + en, + Base, + de, + ); + mainGroup = A135266C1D955BDF00D3BFE1; + productRefGroup = A13526761D955BDF00D3BFE1 /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + A13526741D955BDF00D3BFE1 /* enzevalos_iphone */, + A135268B1D955BE000D3BFE1 /* enzevalos_iphoneTests */, + 476EEF9522A872BF00BB4EF7 /* enzevalos_iphoneUITests */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + 476EEF9422A872BF00BB4EF7 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 476EEFA722A87B9800BB4EF7 /* accounts.json in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + A13526731D955BDF00D3BFE1 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + A102AA8A1EDDB4F40024B457 /* videoOnboarding2.m4v in Resources */, + A1F992391DA7DD2E0073BF1B /* InboxTableViewCell.xib in Resources */, + 47E737742284610E00972401 /* KeyCell.xib in Resources */, + 0ECEA0FE240E7DB1007DC71E /* mykey.p12 in Resources */, + 0ECEA0FF240E7DB1007DC71E /* evilCA.pem in Resources */, + 0ECEA0FA240E7DB1007DC71E /* otherkey1.pem in Resources */, + 47CD5AAD2012369400E771A1 /* support_pk2.asc in Resources */, + A1EB058A1D956890008659C1 /* ContactCell.xib in Resources */, + F1F070281FA0DF3F004A860A /* Inbox.storyboard in Resources */, + 0ECEA0FC240E7DB1007DC71E /* myTestCA.p12 in Resources */, + 0ECEA0F8240E7DB1007DC71E /* myTestCA.pem in Resources */, + 4761420A1E082F9C00FD5E4F /* Settings.bundle in Resources */, + A16BA2121E0439B6005E29E3 /* providers.json in Resources */, + F12D8DBB2069422A0068788E /* About.storyboard in Resources */, + 476406822416AA6F00C7D426 /* LICENSE in Resources */, + 477670C4228453FB00043604 /* ButtonCell.xib in Resources */, + 47E7377022845F3A00972401 /* KeyViews.storyboard in Resources */, + 4751C6F82343B37C006B2A4D /* Onboarding.Video.Click.Eng.m4v in Resources */, + 0ECEA0F9240E7DB1007DC71E /* evilkey1.p12 in Resources */, + 0ECEA0F7240E7DB1007DC71E /* evilCA.p12 in Resources */, + A1E5960E1FCC871F003791E9 /* researchteam.asc in Resources */, + A1123E6A1DA682850069551C /* Localizable.strings in Resources */, + A1F992291DA7C9100073BF1B /* Main.storyboard in Resources */, + F18C5E561FE025D300C3B86D /* BadgeCase.storyboard in Resources */, + 479C649621F2139B00A01071 /* support_pk.asc in Resources */, + 3EB4FAA12012007C001D0625 /* Dialog.storyboard in Resources */, + A1B49E5F21E54EE700ED86FC /* IntroContactView.xib in Resources */, + A1BE3FF61E9664660040114B /* InfoPlist.strings in Resources */, + 3E6B07DE2011246500E49609 /* invitationText.html in Resources */, + 0ECEA0FB240E7DB1007DC71E /* mykey.pem in Resources */, + 8428A8531F4369C0007649A5 /* Gamification.storyboard in Resources */, + 8428A8551F4369CF007649A5 /* GamificationElements.xcassets in Resources */, + A182183221E518A400918A29 /* IntroContactCell.xib in Resources */, + A13526861D955BDF00D3BFE1 /* LaunchScreen.storyboard in Resources */, + 47CD5AAA2012368D00E771A1 /* logging_pk.asc in Resources */, + A1EB05A41D956E32008659C1 /* Assets.xcassets in Resources */, + 4756DE0E20402F8E00452288 /* invitationTextCensor.html in Resources */, + A1EB058C1D9568AB008659C1 /* FrequentCell.xib in Resources */, + A182182721E5012300918A29 /* Intro.storyboard in Resources */, + 0ECEA100240E7DB1007DC71E /* evilkey1.pem in Resources */, + 0ECEA0FD240E7DB1007DC71E /* otherkey1.p12 in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + A135268A1D955BE000D3BFE1 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 470709262189C73900DF71A3 /* enc+signedInlineThunderbird.eml in Resources */, + 47E7BE632232BD0A00C8EF94 /* SignedEncMailFromMac.eml in Resources */, + 471876F8223FACA900912135 /* BobWithoutPW.asc in Resources */, + 479B597B20691C1A00B3944D /* ObjectivePGP.framework in Resources */, + 470709282189C73900DF71A3 /* encInlineThunderbird.eml in Resources */, + 479AFDA222571AB90063A332 /* EccAlice(777879D4)–Public.asc in Resources */, + 0ECEA0EA240E7D64007DC71E /* SMIME Test 1 S.eml in Resources */, + 470709292189C73900DF71A3 /* signedInlineThunderbird.eml in Resources */, + 8428A8841F436ACC007649A5 /* GamificationElements.xcassets in Resources */, + 4707092D2189C74200DF71A3 /* bobSecret.asc in Resources */, + 0E1C457D24055F87006D104A /* signencinlineK9.eml in Resources */, + 47F0376E22A7278A0005C9DE /* accounts.json in Resources */, + 47E7BE5B22319B6900C8EF94 /* EncMailFromMac.eml in Resources */, + 4774DD7522D0015F00BD8CF6 /* multiIDs.eml in Resources */, + 4774DD7322CFFD0E00BD8CF6 /* AliceMultiIDs (439EE43C) – Public.asc in Resources */, + 4707091E2189BC3500DF71A3 /* plainThunderbird.eml in Resources */, + 4707092E2189C74200DF71A3 /* alicePublic.asc in Resources */, + 4707092A2189C73900DF71A3 /* signedThunderbird.eml in Resources */, + 4774DD7E22D4062200BD8CF6 /* Bob Letterbox (0B6CD0A0) – Secret.asc in Resources */, + A15D215D223BE614003E0CE0 /* attachment.eml in Resources */, + 47C22283218B02C700BD2C2B /* autocryptSimpleExample1.eml in Resources */, + 471876F7223FACA900912135 /* BobPWTEST1234.asc in Resources */, + 4774DD7F22D4062200BD8CF6 /* Alice Letterbox (439EE43C) – Public.asc in Resources */, + 470709302189E1C100DF71A3 /* enc+signedThunderbird.eml in Resources */, + 47E7BE6122319B8F00C8EF94 /* PlainMailFromMac.eml in Resources */, + 0E1C457C24055F87006D104A /* signencK9.eml in Resources */, + 4774DD8122D4067E00BD8CF6 /* signedEncMailFromApple.eml in Resources */, + 4774DD7B22D3F5D100BD8CF6 /* multiIDs2.eml in Resources */, + 0ECEA0EC240E7D85007DC71E /* johnny C1.json.eml in Resources */, + 470709272189C73900DF71A3 /* encThunderbird.eml in Resources */, + 0E1C457A24055F87006D104A /* signinlineK9.eml in Resources */, + 47E7BE5D22319B7100C8EF94 /* SignedMailFromMac.eml in Resources */, + 47E7BE5F22319B7D00C8EF94 /* SecureMailFromMac.eml in Resources */, + 0E1C457B24055F87006D104A /* signK9.eml in Resources */, + 0E1C458024055FB7006D104A /* Alice.v3.pubsec.asc in Resources */, + 0E1C458124055FB7006D104A /* Alice.v3.pub.asc in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXShellScriptBuildPhase section */ + 0811D368D52F1D9B243500D4 /* [CP] Embed Pods Frameworks */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-enzevalos_iphoneTests/Pods-enzevalos_iphoneTests-frameworks.sh", + "${BUILT_PRODUCTS_DIR}/Cuckoo/Cuckoo.framework", + ); + name = "[CP] Embed Pods Frameworks"; + outputPaths = ( + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/Cuckoo.framework", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-enzevalos_iphoneTests/Pods-enzevalos_iphoneTests-frameworks.sh\"\n"; + showEnvVarsInLog = 0; + }; + 3992B0CB6412E8526773B814 /* [CP] Embed Pods Frameworks */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-enzevalos_iphone/Pods-enzevalos_iphone-frameworks.sh", + "${BUILT_PRODUCTS_DIR}/AppAuth/AppAuth.framework", + "${BUILT_PRODUCTS_DIR}/BZipCompression/BZipCompression.framework", + "${BUILT_PRODUCTS_DIR}/Cuckoo/Cuckoo.framework", + "${BUILT_PRODUCTS_DIR}/FrameAccessor/FrameAccessor.framework", + "${BUILT_PRODUCTS_DIR}/GTMAppAuth/GTMAppAuth.framework", + "${BUILT_PRODUCTS_DIR}/GTMSessionFetcher/GTMSessionFetcher.framework", + "${BUILT_PRODUCTS_DIR}/KeychainAccess/KeychainAccess.framework", + "${BUILT_PRODUCTS_DIR}/Onboard/Onboard.framework", + "${BUILT_PRODUCTS_DIR}/QAKit/QAKit.framework", + "${BUILT_PRODUCTS_DIR}/Travellib/Travellib.framework", + "${BUILT_PRODUCTS_DIR}/VENTokenField/VENTokenField.framework", + ); + name = "[CP] Embed Pods Frameworks"; + outputPaths = ( + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/AppAuth.framework", + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/BZipCompression.framework", + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/Cuckoo.framework", + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/FrameAccessor.framework", + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/GTMAppAuth.framework", + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/GTMSessionFetcher.framework", + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/KeychainAccess.framework", + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/Onboard.framework", + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/QAKit.framework", + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/Travellib.framework", + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/VENTokenField.framework", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-enzevalos_iphone/Pods-enzevalos_iphone-frameworks.sh\"\n"; + showEnvVarsInLog = 0; + }; + 47EABF01241A99DA00774A93 /* Cockoo run script */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + ); + inputPaths = ( + ); + name = "Cockoo run script"; + outputFileListPaths = ( + ); + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "# Define output file. Change \"${PROJECT_DIR}/${PROJECT_NAME}Tests\" to your test's root source folder, if it's not the default name.\nOUTPUT_FILE=\"${PROJECT_DIR}/${PROJECT_NAME}Tests/GeneratedMocks.swift\"\necho \"Generated Mocks File = ${OUTPUT_FILE}\"\n\n# Define input directory. Change \"${PROJECT_DIR}/${PROJECT_NAME}\" to your project's root source folder, if it's not the default name.\nINPUT_DIR=\"${PROJECT_DIR}/${PROJECT_NAME}\"\necho \"Mocks Input Directory = ${INPUT_DIR}\"\n\n# Generate mock files, include as many input files as you'd like to create mocks for.\n\"${PODS_ROOT}/Cuckoo/run\" generate --testable \"${PROJECT_NAME}\" \\\n--output \"${OUTPUT_FILE}\" \\\n\"${INPUT_DIR}/AuthenticationModel.swift\" \\\n\"${INPUT_DIR}/AuthenticationViewModel.swift\" \n# ... and so forth, the last line should never end with a backslash\n\n# After running once, locate `GeneratedMocks.swift` and drag it into your Xcode test target group.\n"; + }; + 47F867E52052B4B500AA832F /* ShellScript */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 8; + files = ( + ); + inputPaths = ( + ); + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 1; + shellPath = /bin/sh; + shellScript = "bash \"${BUILT_PRODUCTS_DIR}/${FRAMEWORKS_FOLDER_PATH}/ObjectivePGP.framework/strip-frameworks.sh\"\n"; + showEnvVarsInLog = 0; + }; + 60E197910FD6B0523F9273AE /* [CP] Check Pods Manifest.lock */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + "${PODS_PODFILE_DIR_PATH}/Podfile.lock", + "${PODS_ROOT}/Manifest.lock", + ); + name = "[CP] Check Pods Manifest.lock"; + outputPaths = ( + "$(DERIVED_FILE_DIR)/Pods-enzevalos_iphone-checkManifestLockResult.txt", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; + showEnvVarsInLog = 0; + }; + D6F0EB205D61EA8C8A045390 /* [CP] Check Pods Manifest.lock */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + "${PODS_PODFILE_DIR_PATH}/Podfile.lock", + "${PODS_ROOT}/Manifest.lock", + ); + name = "[CP] Check Pods Manifest.lock"; + outputPaths = ( + "$(DERIVED_FILE_DIR)/Pods-enzevalos_iphoneTests-checkManifestLockResult.txt", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; + showEnvVarsInLog = 0; + }; + E1C52B0447A565FBE3CAA203 /* [CP] Check Pods Manifest.lock */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + ); + inputPaths = ( + "${PODS_PODFILE_DIR_PATH}/Podfile.lock", + "${PODS_ROOT}/Manifest.lock", + ); + name = "[CP] Check Pods Manifest.lock"; + outputFileListPaths = ( + ); + outputPaths = ( + "$(DERIVED_FILE_DIR)/Pods-enzevalos_iphoneUITests-checkManifestLockResult.txt", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; + showEnvVarsInLog = 0; + }; +/* End PBXShellScriptBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + 476EEF9222A872BF00BB4EF7 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 476EEFA122A873A800BB4EF7 /* OnboardingTest.swift in Sources */, + 476EEF9922A872BF00BB4EF7 /* enzevalos_iphoneUITests.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + A13526711D955BDF00D3BFE1 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 47691A8A1ECB56D1004BCFC5 /* Mail.swift in Sources */, + 476801DE21846A5A00F7F259 /* OutgoingMail.swift in Sources */, + 472F398A1E251787009260FB /* Contact.swift in Sources */, + 472F39861E1FA34E009260FB /* Record.swift in Sources */, + A1C3270E1DB907D900CE2ED5 /* TextFormatter.swift in Sources */, + F12041FD1DA409A5002E4940 /* ListViewCell.swift in Sources */, + A1EFF93321E6655C003BB240 /* IntroTableView.swift in Sources */, + 4764069A2416B54D00C7D426 /* MailView.swift in Sources */, + A1E2324E1F0FA41A00DC9D40 /* FolderListCell.swift in Sources */, + A1F8541021E8A60800614514 /* IntroSecretViewController.swift in Sources */, + A1ACDD0921EB9C4C00A059D0 /* IntroInputViewController.swift in Sources */, + 476406952416B54D00C7D426 /* KeyRecordRow.swift in Sources */, + 476916A0216B86A100491527 /* PersistentMail +CoreDataClass.swift in Sources */, + 4751C7002344D37C006B2A4D /* SecretKey+CoreDataClass.swift in Sources */, + A1AEBA5921E808CB00C84E59 /* IntroYesNoViewController.swift in Sources */, + A1EB05941D956931008659C1 /* InboxCellDelegator.swift in Sources */, + 8428A85D1F436A05007649A5 /* Badges.swift in Sources */, + 8428A8651F436A11007649A5 /* BadgeCaseCollectionViewCell.swift in Sources */, + 472F39811E1E5347009260FB /* Mail_Address+CoreDataClass.swift in Sources */, + A1EB05821D95685B008659C1 /* CollectionDataDelegate.swift in Sources */, + 47A5D6E22294BF3B0084F81D /* TempKey.swift in Sources */, + 4751C7012344D37C006B2A4D /* SecretKey+CoreDataProperties.swift in Sources */, + 476406992416B54D00C7D426 /* SearchView.swift in Sources */, + 47D1302B1F7CEE6D007B14DF /* DebugSettings.swift in Sources */, + A1EB05801D956851008659C1 /* SendViewController.swift in Sources */, + 479C649B21F45DAF00A01071 /* PasswordToggleVisibilityView.swift in Sources */, + 47691A8C1ECC3EC7004BCFC5 /* EphemeralMail.swift in Sources */, + A5E303D824110F6400310264 /* smime-helpers.c in Sources */, + A142E70921E7919F000395E3 /* IntroContactViewController.swift in Sources */, + 8428A8671F436A11007649A5 /* SubBadgeHeaderTableViewCell.swift in Sources */, + A1EB05981D956947008659C1 /* InboxViewController.swift in Sources */, + F1984D721E1D327200804E1E /* IconsStyleKit.swift in Sources */, + F1737ACB2031D7D70000312B /* StudySettings.swift in Sources */, + 0ECA5798240D496800B0F231 /* SMIME.swift in Sources */, + 8428A8691F436A11007649A5 /* UserNameGamificationTableViewCell.swift in Sources */, + A114E4321FACB23000E40243 /* StringExtension.swift in Sources */, + 472F398C1E2519C8009260FB /* CNContactExtension.swift in Sources */, + 476406A12416B5C800C7D426 /* OnboardingIntro.swift in Sources */, + 476406972416B54D00C7D426 /* InboxCoordinator.swift in Sources */, +<<<<<<< HEAD + 0EF148082422572500B3C198 /* general-helpers.c in Sources */, +======= +>>>>>>> dev + F113C3851F30D06800E7F1D6 /* QRScannerView.swift in Sources */, + 477670C6228454F700043604 /* ButtonCell.swift in Sources */, + F18B44601E704C550080C041 /* ReplaceSegue.swift in Sources */, + 8428A8661F436A11007649A5 /* ArrowTableViewCell.swift in Sources */, + F1ACF21C1E0C1C6800C1B843 /* ContactViewController.swift in Sources */, + 476406962416B54D00C7D426 /* Inbox.swift in Sources */, + 475B00351F7B9565006CDD41 /* CryptoObject.swift in Sources */, + A1EB057E1D956848008659C1 /* VENDataDelegate.swift in Sources */, + 4706D661225CD21D00B3F1D3 /* ExportKeyHelper.swift in Sources */, + 8428A86F1F436A1E007649A5 /* InviteFriendViewController.swift in Sources */, + A1735DFA205AB88500B336DB /* SendViewState.swift in Sources */, + 475B00331F7B9565006CDD41 /* SwiftPGP.swift in Sources */, + 477548E421F77BA0000B22A8 /* StudyParameterProtocol.swift in Sources */, + 47A5D6E42294BFF50084F81D /* Logger.swift in Sources */, + 3EB4FAA420120096001D0625 /* DialogOption.swift in Sources */, + F14239C11F30A99C00998A83 /* QRCodeGenerator.swift in Sources */, + 4764069C2416B54D00C7D426 /* VCSwiftUIView.swift in Sources */, + 478154A921FF3FF400A931EC /* Invitation.swift in Sources */, + 47A2A56E2350A4EF0013883D /* MoreInformationViewController.swift in Sources */, + F1AF938F1E2D04BA00755128 /* CustomCells.swift in Sources */, + 8428A8711F436A1E007649A5 /* GamificationStatusViewController.swift in Sources */, + F1866C86201F707200B72453 /* EmailHelper.m in Sources */, + 47F79241203492E3005E7DB6 /* KeyRecord+CoreDataProperties.swift in Sources */, + A10DE4201EFAA2CE005E8189 /* FolderViewController.swift in Sources */, + 3EB4FA9F2012007C001D0625 /* DialogViewController.swift in Sources */, + 476142081E07E52B00FD5E4F /* Theme.swift in Sources */, + 47C037032347D4D1006295E8 /* PasteKeyViewController.swift in Sources */, + 8428A8701F436A1E007649A5 /* LinearBadgeViewController.swift in Sources */, + 476801DB218436B600F7F259 /* Autocrypt.swift in Sources */, + A1EB057A1D956829008659C1 /* ContactCell.swift in Sources */, + A12FC23120221A1400196008 /* ExportInfoViewController.swift in Sources */, + 4751C6EE233CA583006B2A4D /* DateExtension.swift in Sources */, + 477548DE21F5DABE000B22A8 /* MailServerConnectionError.swift in Sources */, + 475DF47A1F0D54C9009D807F /* Folder+CoreDataProperties.swift in Sources */, + 475B00431F7BB6D6006CDD41 /* PersistentKey+CoreDataProperties.swift in Sources */, + 479C649A21F45DAF00A01071 /* HideShowPasswordTextField.swift in Sources */, + 47CEAC98222541B40075B7DC /* MailSession.swift in Sources */, + F119D2901E364B59001D732A /* AnimatedSendIcon.swift in Sources */, + 4707096D1F8F9F4900657F41 /* ExportViewController.swift in Sources */, + F12060801DA540FE00F6EF37 /* RefreshControlExtension.swift in Sources */, + 4751C6FC2344C8D1006B2A4D /* KeyTableViewController.swift in Sources */, + A13526811D955BDF00D3BFE1 /* enzevalos_iphone.xcdatamodeld in Sources */, + 472F39821E1E5347009260FB /* Mail_Address+CoreDataProperties.swift in Sources */, + 477548E221F77466000B22A8 /* SecurityIndicator.swift in Sources */, + 476373C21E09BA88004D5EFE /* UserData.swift in Sources */, + A1EB05A01D95696C008659C1 /* MessageBodyTableViewCell.swift in Sources */, + F18B44621E73286C0080C041 /* ReadVENDelegate.swift in Sources */, + 475B00421F7BB6D6006CDD41 /* PersistentKey+CoreDataClass.swift in Sources */, + A10DAA5721F37600005D8BBB /* IntroInfoButton.swift in Sources */, + 47A2A57223599D180013883D /* FeedbackButtonHelper.swift in Sources */, + 476406842416AA9100C7D426 /* TestOpenSSL.swift in Sources */, + 3EC35F2420037651008BDF95 /* InvitationHelper.swift in Sources */, + A1B49E6421E55ECD00ED86FC /* IntroPageViewController.swift in Sources */, + A1D5076F1E80257A00B68B38 /* KeyViewController.swift in Sources */, + A1A9DE731F864B0500B808AA /* ExportCells.swift in Sources */, + 472F39901E252470009260FB /* CNMailAddressesExtension.swift in Sources */, + F113C38B1F3344C200E7F1D6 /* ViewControllerPannable.swift in Sources */, + A1EB05841D956867008659C1 /* TableViewDataDelegate.swift in Sources */, + 8428A85E1F436A05007649A5 /* CircleView.swift in Sources */, + A182182C21E5072200918A29 /* IntroDescriptionViewController.swift in Sources */, + F1C7AC821FED6473007629DB /* AboutViewController.swift in Sources */, + A182183421E51DD200918A29 /* IntroContactCell.swift in Sources */, + 472F397C1E1D0B0B009260FB /* PersistentMail +CoreDataProperties.swift in Sources */, + 8428A85C1F436A05007649A5 /* ArrowView.swift in Sources */, + 47E737762284632F00972401 /* KeyCell.swift in Sources */, + A1EB05961D956939008659C1 /* InboxTableViewCell.swift in Sources */, + 47F79240203492E3005E7DB6 /* KeyRecord+CoreDataClass.swift in Sources */, + A1083A541E8BFEA6003666B7 /* Onboarding.swift in Sources */, + 476406982416B54D00C7D426 /* CiricleImage.swift in Sources */, + A111F6AD1FA77B170060AFDE /* LoggerDetail.swift in Sources */, + A13526791D955BDF00D3BFE1 /* AppDelegate.swift in Sources */, + 476916A2216B86CF00491527 /* EnzevalosContact+CoreDataClass.swift in Sources */, + 0EF148052422543E00B3C198 /* Certificate.swift in Sources */, + A1ECE54B1EFBE7ED0009349F /* FolderCell.swift in Sources */, + 8428A85F1F436A05007649A5 /* GamificationData.swift in Sources */, + 475DF4791F0D54C9009D807F /* Folder+CoreDataClass.swift in Sources */, + A15D215B223BE5F4003E0CE0 /* TempAttachment.swift in Sources */, + 4706D65F225B7B6B00B3F1D3 /* ItunesHandler.swift in Sources */, + 3EC35F2D200376A1008BDF95 /* SendViewController+Invitation.swift in Sources */, + 47EABF0A241A9C8700774A93 /* AuthenticationViewModel.swift in Sources */, + 475B00341F7B9565006CDD41 /* Cryptography.swift in Sources */, + A1EB057C1D956838008659C1 /* MailHandler.swift in Sources */, + A182182E21E50D8D00918A29 /* IntroButtonViewController.swift in Sources */, +<<<<<<< HEAD + 0EFEF0952417C0B400BB2FF7 /* CHelpers.swift in Sources */, +======= +>>>>>>> dev + 4764069D2416B54D00C7D426 /* Stroke.swift in Sources */, + 478AF715222FD5C600AEF69E /* IncomingMail.swift in Sources */, + 47EABF09241A9C8700774A93 /* AuthenticationModel.swift in Sources */, + 47C036FF2347C0F5006295E8 /* ImportKeyOverviewController.swift in Sources */, + A1EB05881D956879008659C1 /* AddressHandler.swift in Sources */, + 472F39701E14F75C009260FB /* DataHandler.swift in Sources */, + A1C62E9A2018F716000E5273 /* OnboardingValueState.swift in Sources */, + A1EB05901D956923008659C1 /* ReadViewController.swift in Sources */, + 472F398E1E251B8D009260FB /* MailAddress.swift in Sources */, + A198D2292056B384004CC838 /* SendViewDelegate.swift in Sources */, + 479011492289975D0057AB04 /* NoSecIconStyleKit.swift in Sources */, + F12060821DA552FC00F6EF37 /* MailHandlerDelegator.swift in Sources */, + 474994022261E4E6000F8DA5 /* SimpleSendIcon.swift in Sources */, + 0ECEA0E8240E7081007DC71E /* SearchHelper.swift in Sources */, + A12F91D821F3A99800AB0589 /* NSLayoutConstraintExtension.swift in Sources */, + 71DFE5BA240679E80042019C /* HeaderExtractionValues.swift in Sources */, + 47EABF0D241A9CA800774A93 /* MailAccount.swift in Sources */, + A18E7D771FBDE5D9002F7CC9 /* LoggingEventType.swift in Sources */, + F1984D741E1E92B300804E1E /* LabelStyleKit.swift in Sources */, + A1FA44A721E10E1400DB02AC /* TravelHandler.swift in Sources */, + 47E7376E22845EC400972401 /* SecretKeyTableViewController.swift in Sources */, + 478154A721FF3F0900A931EC /* Warning.swift in Sources */, + 4764069F2416B5A600C7D426 /* NewOnboardingView.swift in Sources */, +<<<<<<< HEAD + 0EF73F4324237E6500932FA0 /* SMIMEHelpers.swift in Sources */, +======= +>>>>>>> dev + 47EABF0B241A9C8700774A93 /* AuthenticationScreen.swift in Sources */, + 8428A8681F436A11007649A5 /* SubBadgeTableViewCell.swift in Sources */, + A1EB05861D956872008659C1 /* FrequentCell.swift in Sources */, + F12041FB1DA3FBF7002E4940 /* ListViewController.swift in Sources */, + F18B445E1E7044B70080C041 /* FlipTransition.swift in Sources */, + 472F397E1E1D0B0B009260FB /* EnzevalosContact+CoreDataProperties.swift in Sources */, + 4751C6FA23449699006B2A4D /* CryptoManagementViewController.swift in Sources */, + 478154AC21FF6A9600A931EC /* Mailbot.swift in Sources */, + 8428A86E1F436A1E007649A5 /* BadgeCase.swift in Sources */, + A1B49E5D21E54CBF00ED86FC /* IntroContactTableViewController.swift in Sources */, + 0EF1480B2422584F00B3C198 /* certificate-helpers.c in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + A13526881D955BE000D3BFE1 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 8428A8831F436AC9007649A5 /* GamificationDataUnitTest.swift in Sources */, + 71DF08982421520D00162B74 /* EmailStringExtensionTests.swift in Sources */, + 3EC35F302003838E008BDF95 /* InvitationTests.swift in Sources */, + 474054982244D7A9007CF83B /* MailServerConfigurationTest.swift in Sources */, + 479B5977206914BE00B3944D /* CryptoTests.swift in Sources */, + A15D215F223BE6E4003E0CE0 /* MailTest.swift in Sources */, +<<<<<<< HEAD + 0ED9073024338E3C008CF9D0 /* SMIMETests.swift in Sources */, + 47EABF0F2420C63600774A93 /* AuthenticationTests.swift in Sources */, + 988C9C5D240D507A006213F0 /* PhishingTests.swift in Sources */, +======= + 47EABF0F2420C63600774A93 /* AuthenticationTests.swift in Sources */, + 988C9C5D240D507A006213F0 /* UrlStringExtensionTests.swift in Sources */, +>>>>>>> dev + 4715F637202A0248001BFFD0 /* CoreDataTests.swift in Sources */, + 47C22281218AFD6300BD2C2B /* AutocryptTest.swift in Sources */, + 478154AE2200641900A931EC /* StudyTest.swift in Sources */, + 47EABF0E2420C63600774A93 /* GeneratedMocks.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXTargetDependency section */ + 476EEF9C22A872BF00BB4EF7 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = A13526741D955BDF00D3BFE1 /* enzevalos_iphone */; + targetProxy = 476EEF9B22A872BF00BB4EF7 /* PBXContainerItemProxy */; + }; + A135268E1D955BE000D3BFE1 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = A13526741D955BDF00D3BFE1 /* enzevalos_iphone */; + targetProxy = A135268D1D955BE000D3BFE1 /* PBXContainerItemProxy */; + }; +/* End PBXTargetDependency section */ + +/* Begin PBXVariantGroup section */ + A1123E6C1DA682850069551C /* Localizable.strings */ = { + isa = PBXVariantGroup; + children = ( + A1123E6B1DA682850069551C /* en */, + A1123E6D1DA682870069551C /* de */, + ); + name = Localizable.strings; + sourceTree = "<group>"; + }; + A13526841D955BDF00D3BFE1 /* LaunchScreen.storyboard */ = { + isa = PBXVariantGroup; + children = ( + A1F992301DA7D22D0073BF1B /* de */, + A1F992321DA7D2360073BF1B /* en */, + ); + name = LaunchScreen.storyboard; + sourceTree = "<group>"; + }; + A1BE3FF81E9664660040114B /* InfoPlist.strings */ = { + isa = PBXVariantGroup; + children = ( + A1BE3FF71E9664660040114B /* en */, + A1BE3FF91E96646A0040114B /* de */, + ); + name = InfoPlist.strings; + sourceTree = "<group>"; + }; + A1F9922B1DA7C9100073BF1B /* Main.storyboard */ = { + isa = PBXVariantGroup; + children = ( + A1F992341DA7DA570073BF1B /* Base */, + A1F992371DA7DC760073BF1B /* en */, + A1F992381DA7DC7B0073BF1B /* de */, + ); + name = Main.storyboard; + sourceTree = "<group>"; + }; + A1F9923B1DA7DD2E0073BF1B /* InboxTableViewCell.xib */ = { + isa = PBXVariantGroup; + children = ( + A1F9923A1DA7DD2E0073BF1B /* Base */, + A1F9923D1DA7DD350073BF1B /* en */, + A1F9923F1DA7DD370073BF1B /* de */, + ); + name = InboxTableViewCell.xib; + sourceTree = "<group>"; + }; + F12D8DBD2069422A0068788E /* About.storyboard */ = { + isa = PBXVariantGroup; + children = ( + F12D8DBC2069422A0068788E /* Base */, + F176A216206943080068788E /* en */, + ); + name = About.storyboard; + sourceTree = "<group>"; + }; + F1F070261FA0DF3F004A860A /* Inbox.storyboard */ = { + isa = PBXVariantGroup; + children = ( + F1F070271FA0DF3F004A860A /* Base */, + F12D8DB320692E280068788E /* en */, + F12D8DB520692E2D0068788E /* de */, + ); + name = Inbox.storyboard; + sourceTree = "<group>"; + }; +/* End PBXVariantGroup section */ + +/* Begin XCBuildConfiguration section */ + 476EEF9E22A872BF00BB4EF7 /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 9A132EDE8BCA06ACDB505C22 /* Pods-enzevalos_iphoneUITests.debug.xcconfig */; + buildSettings = { + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = NO; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CODE_SIGN_IDENTITY = "iPhone Developer"; + CODE_SIGN_STYLE = Automatic; + DEVELOPMENT_TEAM = VJ9C93G68Y; + GCC_C_LANGUAGE_STANDARD = gnu11; + INFOPLIST_FILE = enzevalos_iphoneUITests/Info.plist; + IPHONEOS_DEPLOYMENT_TARGET = 12.1; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; + MTL_FAST_MATH = YES; + PRODUCT_BUNDLE_IDENTIFIER = "FU-Berlin.enzevalos-iphoneUITests"; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + TEST_TARGET_NAME = enzevalos_iphone; + }; + name = Debug; + }; + 476EEF9F22A872BF00BB4EF7 /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 796D16D79BED5D60B580E602 /* Pods-enzevalos_iphoneUITests.release.xcconfig */; + buildSettings = { + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = NO; + CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; + CLANG_ENABLE_OBJC_WEAK = YES; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; + CODE_SIGN_IDENTITY = "iPhone Developer"; + CODE_SIGN_STYLE = Automatic; + DEVELOPMENT_TEAM = VJ9C93G68Y; + GCC_C_LANGUAGE_STANDARD = gnu11; + INFOPLIST_FILE = enzevalos_iphoneUITests/Info.plist; + IPHONEOS_DEPLOYMENT_TARGET = 12.1; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + MTL_FAST_MATH = YES; + PRODUCT_BUNDLE_IDENTIFIER = "FU-Berlin.enzevalos-iphoneUITests"; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 5.0; + TARGETED_DEVICE_FAMILY = "1,2"; + TEST_TARGET_NAME = enzevalos_iphone; + }; + name = Release; + }; + A135269E1D955BE000D3BFE1 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = NO; + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_SECURITY_INSECUREAPI_RAND = NO; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = dwarf; + ENABLE_BITCODE = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_DYNAMIC_NO_PIC = NO; + GCC_NO_COMMON_BLOCKS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 13.0; + MTL_ENABLE_DEBUG_INFO = YES; + ONLY_ACTIVE_ARCH = YES; + OTHER_LDFLAGS = "-fprofile-instr-generate"; + SDKROOT = iphoneos; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_VERSION = ""; + }; + name = Debug; + }; + A135269F1D955BE000D3BFE1 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = NO; + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; + CLANG_ANALYZER_NONNULL = YES; + CLANG_ANALYZER_SECURITY_INSECUREAPI_RAND = NO; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_COMMA = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; + CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; + CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; + CLANG_WARN_STRICT_PROTOTYPES = YES; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + ENABLE_BITCODE = NO; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 13.0; + MTL_ENABLE_DEBUG_INFO = NO; + OTHER_LDFLAGS = "-fprofile-instr-generate"; + SDKROOT = iphoneos; + SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; + SWIFT_VERSION = ""; + VALIDATE_PRODUCT = YES; + }; + name = Release; + }; + A13526A11D955BE000D3BFE1 /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 91B6C9020C660BEA78FAEF28 /* Pods-enzevalos_iphone.debug.xcconfig */; + buildSettings = { + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = "$(inherited)"; + ASSETCATALOG_COMPILER_APPICON_NAME = Mailbox; + CLANG_ENABLE_MODULES = NO; + CODE_SIGN_ENTITLEMENTS = enzevalos_iphone/PLists/enzevalos_iphone.entitlements; + CODE_SIGN_IDENTITY = "iPhone Developer"; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + CODE_SIGN_STYLE = Automatic; + DEFINES_MODULE = NO; + DEVELOPMENT_TEAM = VJ9C93G68Y; + FRAMEWORK_SEARCH_PATHS = ( + "$(inherited)", + "$(PROJECT_DIR)/enzevalos_iphone", + "$(PROJECT_DIR)_workspace", + ); + GCC_SYMBOLS_PRIVATE_EXTERN = NO; + HEADER_SEARCH_PATHS = ( + "$(inherited)", + "\"${PODS_CONFIGURATION_BUILD_DIR}/AppAuth/AppAuth.framework/Headers\"", + "\"${PODS_CONFIGURATION_BUILD_DIR}/BZipCompression/BZipCompression.framework/Headers\"", + "\"${PODS_CONFIGURATION_BUILD_DIR}/FrameAccessor/FrameAccessor.framework/Headers\"", + "\"${PODS_CONFIGURATION_BUILD_DIR}/GTMAppAuth/GTMAppAuth.framework/Headers\"", + "\"${PODS_CONFIGURATION_BUILD_DIR}/GTMSessionFetcher/GTMSessionFetcher.framework/Headers\"", + "\"${PODS_CONFIGURATION_BUILD_DIR}/KeychainAccess/KeychainAccess.framework/Headers\"", + "\"${PODS_CONFIGURATION_BUILD_DIR}/Onboard/Onboard.framework/Headers\"", + "\"${PODS_CONFIGURATION_BUILD_DIR}/QAKit/QAKit.framework/Headers\"", + "\"${PODS_CONFIGURATION_BUILD_DIR}/Travellib/Travellib.framework/Headers\"", + "\"${PODS_CONFIGURATION_BUILD_DIR}/VENTokenField/VENTokenField.framework/Headers\"", + "\"${PODS_ROOT}/Headers/Public\"", + "\"${PODS_ROOT}/Headers/Public/mailcore2-ios\"", + "$(SRCROOT)/enzevalos_iphone/OpenSSL/include", + ); + INFOPLIST_FILE = "enzevalos_iphone/PLists/enzevalos-Info.plist"; + IPHONEOS_DEPLOYMENT_TARGET = 13.0; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + LIBRARY_SEARCH_PATHS = ( + "$(inherited)", + "$(inherited)", + "$(PROJECT_DIR)", + "$(PROJECT_DIR)/enzevalos_iphone/OpenSSL/lib", + ); + OTHER_LDFLAGS = ( + "$(inherited)", + "-ObjC", + "-l\"MailCore-ios\"", + "-l\"c++\"", + "-l\"crypto\"", + "-l\"iconv\"", + "-l\"resolv\"", + "-l\"ssl\"", + "-l\"xml2\"", + "-l\"z\"", + "-lbz2", + "-framework", + "\"BZipCompression\"", + "-framework", + "\"FrameAccessor\"", + "-framework", + "\"VENTokenField\"", + ); + OTHER_SWIFT_FLAGS = "$(inherited) -D DEBUG"; + PRODUCT_BUNDLE_IDENTIFIER = "fu-berlin.enzevalos-iphone"; + PRODUCT_NAME = "$(TARGET_NAME)"; + PROVISIONING_PROFILE = ""; + PROVISIONING_PROFILE_SPECIFIER = ""; + SWIFT_INCLUDE_PATHS = ""; + "SWIFT_INCLUDE_PATHS[arch=*]" = ""; + SWIFT_OBJC_BRIDGING_HEADER = "enzevalos_iphone-Bridging-Header.h"; + "SWIFT_OBJC_BRIDGING_HEADER[arch=*]" = "enzevalos_iphone/enzevalos_iphone-Bridging-Header.h"; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_VERSION = 5.0; + }; + name = Debug; + }; + A13526A21D955BE000D3BFE1 /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = AA686D4FC9B86445A0C87F0F /* Pods-enzevalos_iphone.release.xcconfig */; + buildSettings = { + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = "$(inherited)"; + ASSETCATALOG_COMPILER_APPICON_NAME = Mailbox; + CLANG_ENABLE_MODULES = NO; + CODE_SIGN_ENTITLEMENTS = enzevalos_iphone/PLists/enzevalos_iphone.entitlements; + CODE_SIGN_IDENTITY = "iPhone Developer"; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + CODE_SIGN_STYLE = Automatic; + DEFINES_MODULE = NO; + DEVELOPMENT_TEAM = VJ9C93G68Y; + FRAMEWORK_SEARCH_PATHS = ( + "$(inherited)", + "$(PROJECT_DIR)/enzevalos_iphone", + "$(PROJECT_DIR)_workspace", + ); + GCC_SYMBOLS_PRIVATE_EXTERN = NO; + HEADER_SEARCH_PATHS = ( + "$(inherited)", + "\"${PODS_CONFIGURATION_BUILD_DIR}/AppAuth/AppAuth.framework/Headers\"", + "\"${PODS_CONFIGURATION_BUILD_DIR}/BZipCompression/BZipCompression.framework/Headers\"", + "\"${PODS_CONFIGURATION_BUILD_DIR}/FrameAccessor/FrameAccessor.framework/Headers\"", + "\"${PODS_CONFIGURATION_BUILD_DIR}/GTMAppAuth/GTMAppAuth.framework/Headers\"", + "\"${PODS_CONFIGURATION_BUILD_DIR}/GTMSessionFetcher/GTMSessionFetcher.framework/Headers\"", + "\"${PODS_CONFIGURATION_BUILD_DIR}/KeychainAccess/KeychainAccess.framework/Headers\"", + "\"${PODS_CONFIGURATION_BUILD_DIR}/Onboard/Onboard.framework/Headers\"", + "\"${PODS_CONFIGURATION_BUILD_DIR}/QAKit/QAKit.framework/Headers\"", + "\"${PODS_CONFIGURATION_BUILD_DIR}/Travellib/Travellib.framework/Headers\"", + "\"${PODS_CONFIGURATION_BUILD_DIR}/VENTokenField/VENTokenField.framework/Headers\"", + "\"${PODS_ROOT}/Headers/Public\"", + "\"${PODS_ROOT}/Headers/Public/mailcore2-ios\"", + "$(SRCROOT)/enzevalos_iphone/OpenSSL/include", + ); + INFOPLIST_FILE = "enzevalos_iphone/PLists/enzevalos-Info.plist"; + IPHONEOS_DEPLOYMENT_TARGET = 13.0; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + LIBRARY_SEARCH_PATHS = ( + "$(inherited)", + "$(inherited)", + "$(PROJECT_DIR)", + "$(PROJECT_DIR)/enzevalos_iphone/OpenSSL/lib", + ); + OTHER_LDFLAGS = ( + "$(inherited)", + "-ObjC", + "-l\"MailCore-ios\"", + "-l\"c++\"", + "-l\"crypto\"", + "-l\"iconv\"", + "-l\"resolv\"", + "-l\"ssl\"", + "-l\"xml2\"", + "-l\"z\"", + "-lbz2", + "-framework", + "\"BZipCompression\"", + "-framework", + "\"FrameAccessor\"", + "-framework", + "\"VENTokenField\"", + ); + OTHER_SWIFT_FLAGS = "$(inherited) -D RELEASE"; + PRODUCT_BUNDLE_IDENTIFIER = "fu-berlin.enzevalos-iphone"; + PRODUCT_NAME = "$(TARGET_NAME)"; + PROVISIONING_PROFILE = ""; + PROVISIONING_PROFILE_SPECIFIER = ""; + SWIFT_INCLUDE_PATHS = ""; + SWIFT_OBJC_BRIDGING_HEADER = "enzevalos_iphone-Bridging-Header.h"; + "SWIFT_OBJC_BRIDGING_HEADER[sdk=*]" = "enzevalos_iphone/enzevalos_iphone-Bridging-Header.h"; + SWIFT_VERSION = 5.0; + }; + name = Release; + }; + A13526A41D955BE000D3BFE1 /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = 6EBCCD02AD3B95D8317810E2 /* Pods-enzevalos_iphoneTests.debug.xcconfig */; + buildSettings = { + BUNDLE_LOADER = "$(BUILT_PRODUCTS_DIR)/enzevalos_iphone.app/enzevalos_iphone"; + FRAMEWORK_SEARCH_PATHS = ( + "$(inherited)", + "$(PROJECT_DIR)/enzevalos_iphone", + "$(PROJECT_DIR)_workspace", + ); + GCC_SYMBOLS_PRIVATE_EXTERN = NO; + HEADER_SEARCH_PATHS = ( + "$(inherited)", + "\"${PODS_CONFIGURATION_BUILD_DIR}/AppAuth/AppAuth.framework/Headers\"", + "\"${PODS_CONFIGURATION_BUILD_DIR}/BZipCompression/BZipCompression.framework/Headers\"", + "\"${PODS_CONFIGURATION_BUILD_DIR}/FrameAccessor/FrameAccessor.framework/Headers\"", + "\"${PODS_CONFIGURATION_BUILD_DIR}/GTMAppAuth/GTMAppAuth.framework/Headers\"", + "\"${PODS_CONFIGURATION_BUILD_DIR}/GTMSessionFetcher/GTMSessionFetcher.framework/Headers\"", + "\"${PODS_CONFIGURATION_BUILD_DIR}/KeychainAccess/KeychainAccess.framework/Headers\"", + "\"${PODS_CONFIGURATION_BUILD_DIR}/Onboard/Onboard.framework/Headers\"", + "\"${PODS_CONFIGURATION_BUILD_DIR}/QAKit/QAKit.framework/Headers\"", + "\"${PODS_CONFIGURATION_BUILD_DIR}/Travellib/Travellib.framework/Headers\"", + "\"${PODS_CONFIGURATION_BUILD_DIR}/VENTokenField/VENTokenField.framework/Headers\"", + "\"${PODS_ROOT}/Headers/Public\"", + "\"${PODS_ROOT}/Headers/Public/mailcore2-ios\"", + "$(SRCROOT)/enzevalos_iphone/OpenSSL/include", + ); + INFOPLIST_FILE = enzevalos_iphoneTests/Info.plist; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + LIBRARY_SEARCH_PATHS = ( + "$(inherited)", + "$(inherited)", + "$(PROJECT_DIR)/enzevalos_iphone/OpenSSL/lib", + ); + PRODUCT_BUNDLE_IDENTIFIER = "fu-berlin.enzevalos-iphoneTests"; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 5.0; + TEST_HOST = "$(BUNDLE_LOADER)"; + }; + name = Debug; + }; + A13526A51D955BE000D3BFE1 /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = BC7D006B3B40A23E53B4F317 /* Pods-enzevalos_iphoneTests.release.xcconfig */; + buildSettings = { + BUNDLE_LOADER = "$(BUILT_PRODUCTS_DIR)/enzevalos_iphone.app/enzevalos_iphone"; + FRAMEWORK_SEARCH_PATHS = ( + "$(inherited)", + "$(PROJECT_DIR)/enzevalos_iphone", + "$(PROJECT_DIR)_workspace", + ); + GCC_SYMBOLS_PRIVATE_EXTERN = NO; + HEADER_SEARCH_PATHS = ( + "$(inherited)", + "\"${PODS_CONFIGURATION_BUILD_DIR}/AppAuth/AppAuth.framework/Headers\"", + "\"${PODS_CONFIGURATION_BUILD_DIR}/BZipCompression/BZipCompression.framework/Headers\"", + "\"${PODS_CONFIGURATION_BUILD_DIR}/FrameAccessor/FrameAccessor.framework/Headers\"", + "\"${PODS_CONFIGURATION_BUILD_DIR}/GTMAppAuth/GTMAppAuth.framework/Headers\"", + "\"${PODS_CONFIGURATION_BUILD_DIR}/GTMSessionFetcher/GTMSessionFetcher.framework/Headers\"", + "\"${PODS_CONFIGURATION_BUILD_DIR}/KeychainAccess/KeychainAccess.framework/Headers\"", + "\"${PODS_CONFIGURATION_BUILD_DIR}/Onboard/Onboard.framework/Headers\"", + "\"${PODS_CONFIGURATION_BUILD_DIR}/QAKit/QAKit.framework/Headers\"", + "\"${PODS_CONFIGURATION_BUILD_DIR}/Travellib/Travellib.framework/Headers\"", + "\"${PODS_CONFIGURATION_BUILD_DIR}/VENTokenField/VENTokenField.framework/Headers\"", + "\"${PODS_ROOT}/Headers/Public\"", + "\"${PODS_ROOT}/Headers/Public/mailcore2-ios\"", + "$(SRCROOT)/enzevalos_iphone/OpenSSL/include", + ); + INFOPLIST_FILE = enzevalos_iphoneTests/Info.plist; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + LIBRARY_SEARCH_PATHS = ( + "$(inherited)", + "$(inherited)", + "$(PROJECT_DIR)/enzevalos_iphone/OpenSSL/lib", + ); + PRODUCT_BUNDLE_IDENTIFIER = "fu-berlin.enzevalos-iphoneTests"; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_VERSION = 5.0; + TEST_HOST = "$(BUNDLE_LOADER)"; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 476EEF9D22A872BF00BB4EF7 /* Build configuration list for PBXNativeTarget "enzevalos_iphoneUITests" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 476EEF9E22A872BF00BB4EF7 /* Debug */, + 476EEF9F22A872BF00BB4EF7 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + A13526701D955BDF00D3BFE1 /* Build configuration list for PBXProject "enzevalos_iphone" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + A135269E1D955BE000D3BFE1 /* Debug */, + A135269F1D955BE000D3BFE1 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + A13526A01D955BE000D3BFE1 /* Build configuration list for PBXNativeTarget "enzevalos_iphone" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + A13526A11D955BE000D3BFE1 /* Debug */, + A13526A21D955BE000D3BFE1 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + A13526A31D955BE000D3BFE1 /* Build configuration list for PBXNativeTarget "enzevalos_iphoneTests" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + A13526A41D955BE000D3BFE1 /* Debug */, + A13526A51D955BE000D3BFE1 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + +/* Begin XCVersionGroup section */ + A135267F1D955BDF00D3BFE1 /* enzevalos_iphone.xcdatamodeld */ = { + isa = XCVersionGroup; + children = ( + 670159DF240FB4E800797FA5 /* enzevalos_iphone 9.xcdatamodel */, + 4751C6FD2344D169006B2A4D /* enzevalos_iphone 8.xcdatamodel */, + 4751C6F0233CE1E4006B2A4D /* enzevalos_iphone 7.xcdatamodel */, + A1909719220F887D00FA7B2A /* enzevalos_iphone 6.xcdatamodel */, + A15D2D0B21F4CF13007AF2F4 /* enzevalos_iphone 5.xcdatamodel */, + A19F3FFB21F0BE79005334F2 /* enzevalos_iphone 4.xcdatamodel */, + A19BD0A721ED62AE00E4D603 /* enzevalos_iphone 3.xcdatamodel */, + 47B2318A1F0D458100961B28 /* enzevalos_iphone 2.xcdatamodel */, + A13526801D955BDF00D3BFE1 /* enzevalos_iphone.xcdatamodel */, + ); + currentVersion = 670159DF240FB4E800797FA5 /* enzevalos_iphone 9.xcdatamodel */; + path = enzevalos_iphone.xcdatamodeld; + sourceTree = "<group>"; + versionGroupType = wrapper.xcdatamodel; + }; +/* End XCVersionGroup section */ + }; + rootObject = A135266D1D955BDF00D3BFE1 /* Project object */; +} diff --git a/enzevalos_iphone.xcodeproj/xcshareddata/xcschemes/enzevalos_iphone.xcscheme b/enzevalos_iphone.xcodeproj/xcshareddata/xcschemes/enzevalos_iphone.xcscheme index a96d2b4f5b40e52bd3d386370f8e2734d997743e..3a73a19b36e716b830ae25b5f3732b80a63ac844 100644 --- a/enzevalos_iphone.xcodeproj/xcshareddata/xcschemes/enzevalos_iphone.xcscheme +++ b/enzevalos_iphone.xcodeproj/xcshareddata/xcschemes/enzevalos_iphone.xcscheme @@ -26,8 +26,17 @@ buildConfiguration = "Debug" selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB" selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB" - codeCoverageEnabled = "YES" - shouldUseLaunchSchemeArgsEnv = "YES"> + shouldUseLaunchSchemeArgsEnv = "YES" + codeCoverageEnabled = "YES"> + <MacroExpansion> + <BuildableReference + BuildableIdentifier = "primary" + BlueprintIdentifier = "A13526741D955BDF00D3BFE1" + BuildableName = "enzevalos_iphone.app" + BlueprintName = "enzevalos_iphone" + ReferencedContainer = "container:enzevalos_iphone.xcodeproj"> + </BuildableReference> + </MacroExpansion> <Testables> <TestableReference skipped = "NO"> @@ -39,9 +48,39 @@ ReferencedContainer = "container:enzevalos_iphone.xcodeproj"> </BuildableReference> <SkippedTests> + <Test + Identifier = "CryptoTests/testfindNotSignedMailForPublicKey()"> + </Test> <Test Identifier = "GamificationDataUnitTest"> </Test> + <Test + Identifier = "MailServerConfigurationTest"> + </Test> + <Test + Identifier = "MailTest/testK9SecureInlineMail()"> + </Test> + <Test + Identifier = "MailTest/testK9SecureMail()"> + </Test> + <Test + Identifier = "MailTest/testK9SigedInlineMail()"> + </Test> + <Test + Identifier = "MailTest/testK9SigedMail()"> + </Test> + <Test + Identifier = "MailTest/testMacSecureMail()"> + </Test> + <Test + Identifier = "MailTest/testMacSigedMail()"> + </Test> + <Test + Identifier = "MailTest/testThunderbirdSigedInlineMail()"> + </Test> + <Test + Identifier = "MailTest/testThunderbirdSigedMail()"> + </Test> </SkippedTests> </TestableReference> <TestableReference @@ -55,17 +94,6 @@ </BuildableReference> </TestableReference> </Testables> - <MacroExpansion> - <BuildableReference - BuildableIdentifier = "primary" - BlueprintIdentifier = "A13526741D955BDF00D3BFE1" - BuildableName = "enzevalos_iphone.app" - BlueprintName = "enzevalos_iphone" - ReferencedContainer = "container:enzevalos_iphone.xcodeproj"> - </BuildableReference> - </MacroExpansion> - <AdditionalOptions> - </AdditionalOptions> </TestAction> <LaunchAction buildConfiguration = "Debug" @@ -88,8 +116,6 @@ ReferencedContainer = "container:enzevalos_iphone.xcodeproj"> </BuildableReference> </BuildableProductRunnable> - <AdditionalOptions> - </AdditionalOptions> <LocationScenarioReference identifier = "com.apple.dt.IDEFoundation.CurrentLocationScenarioIdentifier" referenceType = "1"> diff --git a/enzevalos_iphone/CHelpers.swift b/enzevalos_iphone/CHelpers.swift new file mode 100644 index 0000000000000000000000000000000000000000..7a492ac9b17f086d56161c8cb635c4350ad73997 --- /dev/null +++ b/enzevalos_iphone/CHelpers.swift @@ -0,0 +1,31 @@ +// +// CHelpers.swift +// enzevalos_iphone +// +// Created by lazarog98 on 10.03.20. +// Copyright © 2020 fu-berlin. All rights reserved. +// + +import Foundation + +/** + Creates an arraz of C Strings from an array of swift strings + Always call deallocateCStrArr after using this! + */ +func createCStrArr(sarr: [String]) -> UnsafeMutablePointer<UnsafeMutablePointer<Int8>?>?{ + let len = sarr.count + let carr = init_str_arr(Int32(len)) + for i in 0..<len + { + let str = sarr[i] + add_str_to_arr(str,carr,Int32(i)) + } + return carr +} + +/** + Deallocates an array of c strings + */ +func deallocateCStrArr(arr: UnsafeMutablePointer<UnsafeMutablePointer<Int8>?>?, len: Int){ + return deallocate_str_arr(arr, Int32(len)) +} diff --git a/enzevalos_iphone/Certificate.swift b/enzevalos_iphone/Certificate.swift new file mode 100644 index 0000000000000000000000000000000000000000..5ad3a33b51451c993f55f42e1b5e5370b2771837 --- /dev/null +++ b/enzevalos_iphone/Certificate.swift @@ -0,0 +1,142 @@ +// +// Certificate.swift +// enzevalos_iphone +// +// Created by lazarog98 on 18.03.20. +// Copyright © 2020 fu-berlin. All rights reserved. +// + +import Foundation + +/** + Contains information about a certificate + */ +class Certificate { + let pem: String // raw PEM string + let fingerPrint: String + let eMails: [String]? + let issuer: String? + let hasPrivateKey: Bool + let subject: String? + let startDate: String? + let endDate: String? + + init(pem: String) { + let cCertInfo = get_cert_data(pem) + + defer { + deallocateCertInfo(certInfo: cCertInfo) + } + + let certInfo = cCertInfo?.pointee + + self.hasPrivateKey = pem.contains("PRIVATE KEY") + + let (fingerPrint, _, errors) = getFingerprintFromPem(pem: pem) + + // if it crashes on this line, you can loop through the errors and see what's wrong + self.fingerPrint = fingerPrint! + self.pem = pem + + self.eMails = certInfo?.extractField(field: CertInfoString.emails) + self.endDate = certInfo?.extractField(field: CertInfoString.endDate) + self.startDate = certInfo?.extractField(field: CertInfoString.startDate) + self.subject = certInfo?.extractField(field: CertInfoString.subject) + self.issuer = certInfo?.extractField(field: CertInfoString.issuer) + } +} + +/** + An enum used in the extractString() method of cert_info + */ +enum CertInfoString { + case issuer; + case subject; + case startDate; + case endDate; + case emails; +} + +/** + extensions to the C struct so that memory deallocation is automatic + */ +extension cert_info { + /** + Extracts an array of certs in PEM of the respective function from the result object + Deallocates the "errors" part of the result object + Only use in combination with_extractOutput and _extractErrors + */ + private func extractEmails() -> [String]? { + let arr = self.emails + var strArr: [String]? = nil + + if arr != nil { + strArr = [] + let size = self.num_emails + //print("Size:",size) + for i in 0..<size { + let str = String(cString: arr![Int(i)]!) + strArr?.append(str) + // (arr![Int(i)])!.deallocate() + } + // arr?.deallocate() + } + + return strArr + } + + /** + Extracts the output of the respective function from the result object + Deallocates the "res" part of the result object + Only use in combination with_extractErrors + + - parameters: + - field: the result object + */ + private func extractString(field: CertInfoString) -> String? { + let cStr: UnsafeMutablePointer<Int8>? + switch field { + case .endDate: + cStr = self.date_end + case .startDate: + cStr = self.date_start + case .issuer: + cStr = self.issuer + case .subject: + cStr = self.subject + default: + return nil + } + + var swiftStr: String? = nil + + if cStr != nil { + swiftStr = String(cString: cStr!) + } + + return swiftStr + } + + /** + A generic function that reads a field and casts it to the type of the variable that stores the result. The variable must therefore have the correct type + + - parameters: + - field: enum, specifiying the field to extract + */ + func extractField<T>(field: CertInfoString) -> T? { + switch field { + case .emails: + let emails = self.extractEmails() + if emails is T? { + return emails as! T? + } + default: + let res = self.extractString(field: field) + if res is T? { + return res as! T? + } + } + + return nil + } +} diff --git a/enzevalos_iphone/CryptoObject.swift b/enzevalos_iphone/CryptoObject.swift index 3486804c7c46d4e031318377a544b9501f705f66..3deca6a04495ff95f59f66a4850a8b09e6779b24 100644 --- a/enzevalos_iphone/CryptoObject.swift +++ b/enzevalos_iphone/CryptoObject.swift @@ -55,12 +55,15 @@ enum EncryptionState: Int16 { public enum CryptoScheme { case PGP + case SMIME case UNKNOWN var description: String { switch self { case .PGP: return "PGP" + case .SMIME: + return "SMIME" default: return "" } @@ -78,6 +81,8 @@ public enum CryptoScheme { switch self { case CryptoScheme.PGP: return 0 + case CryptoScheme.SMIME: + return 1 case CryptoScheme.UNKNOWN: return 99 } @@ -91,6 +96,7 @@ public class CryptoObject { let signatureState: SignatureState var encryptionState: EncryptionState let signKey: String? + let signedKeys: [String] let encType: CryptoScheme let passcode: String? let signedAdrs: [String] @@ -109,7 +115,6 @@ public class CryptoObject { return nil } - init(chiphertext: Data?, plaintext: String?, decryptedData: Data?, sigState: SignatureState, encState: EncryptionState, signKey: String?, encType: CryptoScheme, signedAdrs: [String]) { self.chiphertext = chiphertext self.plaintext = plaintext @@ -120,5 +125,25 @@ public class CryptoObject { self.encType = encType self.passcode = nil self.signedAdrs = signedAdrs + if signKey != nil + { + self.signedKeys = [signKey!] + } + else{ + self.signedKeys = [] + } + } + + init(chiphertext: Data?, plaintext: String?, decryptedData: Data?, sigState: SignatureState, encState: EncryptionState, signKey: String?, encType: CryptoScheme, signedAdrs: [String], signedKeys: [String]) { + self.chiphertext = chiphertext + self.plaintext = plaintext + self.decryptedData = decryptedData + self.signatureState = sigState + self.encryptionState = encState + self.signKey = signKey + self.encType = encType + self.passcode = nil + self.signedAdrs = signedAdrs + self.signedKeys = signedKeys } } diff --git a/enzevalos_iphone/DataHandler.swift b/enzevalos_iphone/DataHandler.swift index 402f99c00c383dced15b6323e628c6a4c7ec60c5..c3f22f4c655dfa15235ae34bb2d69983c97c6403 100644 --- a/enzevalos_iphone/DataHandler.swift +++ b/enzevalos_iphone/DataHandler.swift @@ -1119,19 +1119,17 @@ class DataHandler { return [] } + /** + Filters all Presistent Mails with encState == EncryptionState.UnableToDecrypt + */ func getAllNotDecryptedPersistentMail() -> [PersistentMail] { let result = getAllPersistentMails().filter({ $0.encState == EncryptionState.UnableToDecrypt }) return result } - // filter all presistent mails without public key - func getAllNoPublicKeyPersistentMail() -> [PersistentMail] { - let result = getAllPersistentMails().filter({ $0.sigState == SignatureState.NoPublicKey }) - return result - } - - - + /** + Filters all Presistent Mails with sigState == SignatureState.NoPublicKey + */ func getAllNotSignedPersistentMail() -> [PersistentMail] { let result = getAllPersistentMails().filter({ $0.sigState == SignatureState.NoPublicKey }) return result diff --git a/enzevalos_iphone/InboxViewController.swift.orig b/enzevalos_iphone/InboxViewController.swift.orig new file mode 100644 index 0000000000000000000000000000000000000000..24180e8f25d14e98f688a487df7619001b0ed786 --- /dev/null +++ b/enzevalos_iphone/InboxViewController.swift.orig @@ -0,0 +1,371 @@ +// +// InboxViewController.swift +// readView +// +// Created by Joscha on 26.08.16. +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program. If not, see <https://www.gnu.org/licenses/>. +// + +import UIKit +import Foundation +import Contacts + +class InboxViewController: UITableViewController, InboxCellDelegator { + let dateFormatter = DateFormatter() + let searchController = UISearchController(searchResultsController: nil) + var filteredRecords = [KeyRecord]() + var counterRefreshs = 0 + let folder = DataHandler.handler.findFolder(with: UserManager.backendInboxFolderPath) + var loading = false { + didSet { + if loading { + let activityIndicator = UIActivityIndicatorView(style: UIActivityIndicatorView.Style.medium) + activityIndicator.frame = CGRect(x: 0, y: 0, width: 200, height: 44) + activityIndicator.startAnimating() + tableView.tableFooterView = activityIndicator + } else { + tableView.tableFooterView = nil + } + } + } + + // how many seconds should the app wait before processing search bar input + private let searchDelay = 0.5 + // holds the currently active search timer (if it exists) so it can be terminated if a new character is typed before the execution + private var searchBarTimer: Timer? + + @IBOutlet weak var lastUpdateButton: UIBarButtonItem! + var lastUpdateLabel = UILabel(frame: CGRect.zero) + var lastUpdateText: String? { + didSet { + lastUpdateLabel.text = lastUpdateText + lastUpdateLabel.sizeToFit() + } + } + + var lastUpdate: Date? + + override func viewDidLoad() { + super.viewDidLoad() + + self.navigationController?.navigationBar.barTintColor = ThemeManager.defaultColor + + tableView.sectionHeaderHeight = 1 + tableView.sectionFooterHeight = 0 + + self.refreshControl?.addTarget(self, action: #selector(InboxViewController.refresh(_:)), for: UIControl.Event.valueChanged) + self.refreshControl?.attributedTitle = NSAttributedString(string: NSLocalizedString("PullToRefresh", comment: "Pull to refresh")) + + lastUpdateLabel.sizeToFit() + lastUpdateLabel.backgroundColor = UIColor.clear + lastUpdateLabel.textAlignment = .center + lastUpdateLabel.font = UIFont.systemFont(ofSize: 13) + lastUpdateLabel.textColor = UIColor.black + lastUpdateButton.customView = lastUpdateLabel + + searchController.searchResultsUpdater = self + searchController.obscuresBackgroundDuringPresentation = false + searchController.searchBar.scopeButtonTitles = [NSLocalizedString("Sender", comment: ""), NSLocalizedString("Subject", comment: ""), NSLocalizedString("Body", comment: ""), NSLocalizedString("All", comment: "")] + searchController.searchBar.delegate = self + if #available(iOS 11.0, *) { + navigationItem.searchController = searchController + } else { + tableView.tableHeaderView = searchController.searchBar + } + definesPresentationContext = true + dateFormatter.locale = Locale.current + dateFormatter.timeStyle = .medium + + tableView.register(UINib(nibName: "InboxTableViewCell", bundle: nil), forCellReuseIdentifier: "inboxCell") + do{ + try AppDelegate.getAppDelegate().mailHandler.startIMAPIdleIfSupported() + } catch { + print("ERROR: Could not establish connection to server!") + } + NotificationCenter.default.addObserver(forName: Notification.Name.NSManagedObjectContextDidSave, object: nil, queue: nil, using: { + [weak self] _ in + self?.tableView.reloadData() + }) + let feedbackButton = UIBarButtonItem(title: FeedbackButtonHelper.Name, style: .plain, target: self, action:#selector(feedback)) + self.toolbarItems?.append(feedbackButton) + } + + @objc func feedback() { + FeedbackButtonHelper.composeFeedback(view: .Inbox, navigationController: self.navigationController) + } + + @objc func refresh(_ refreshControl: UIRefreshControl?) { + lastUpdateText = NSLocalizedString("Updating", comment: "Getting new data") + let folder = DataHandler.handler.findFolder(with: UserManager.backendInboxFolderPath) + AppDelegate.getAppDelegate().mailHandler.updateFolder(folder: folder, completionCallback: getMailCompleted) + } + + deinit { + print("===============|| InboxViewController deinitialized ||===============") + } + + func getMailCompleted(_ error: Error?) { + if let rc = self.refreshControl { + if error == nil { + lastUpdate = Date() + counterRefreshs = 0 + } else { + lastUpdateText = NSLocalizedString("NeverUpdated", comment: "Error while loading mailscomment") + if AppDelegate.getAppDelegate().currentReachabilityStatus != .notReachable && counterRefreshs < 100{ + counterRefreshs += 1 + refresh(nil) + } + } + rc.endRefreshing() + lastUpdateText = lastUpdate != nil ? "\(NSLocalizedString("LastUpdate", comment: "When the last update occured")): \(dateFormatter.string(from: lastUpdate!))" : NSLocalizedString("NeverUpdated", comment: "No internet connection since last launch") + } + } + + override func viewWillAppear(_ animated: Bool) { + tableView.reloadData() + if lastUpdate == nil || Date().timeIntervalSince(lastUpdate!) > 50 { + counterRefreshs = 0 + refresh(nil) + } + } + + func loadData() { + refresh(nil) + } + override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { + return 1 + } + + override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { + let cell = tableView.dequeueReusableCell(withIdentifier: "inboxCell", for: indexPath) as! InboxTableViewCell + + cell.delegate = self + if isFiltering { + cell.enzContact = filteredRecords[indexPath.section] + } else { + cell.enzContact = folder.records[indexPath.section] + } + + return cell + } + + override func numberOfSections(in tableView: UITableView) -> Int { + if isFiltering { + return filteredRecords.count + } + + return folder.records.count + } + + // set top and bottom seperator height + override func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat { + if section == 0 { + return 0.01 + } + return tableView.sectionHeaderHeight + } + + override func tableView(_ tableView: UITableView, heightForFooterInSection section: Int) -> CGFloat { + return 0.01 + } + + func callSegueFromCell(_ mail: PersistentMail?) { + if isFiltering, Logger.logging { + let categoryIndex = searchController.searchBar.selectedScopeButtonIndex + Logger.log(search: self.filteredRecords.count, category: categoryIndex, opened: "mail") + } + performSegue(withIdentifier: "readMailSegue", sender: mail) + } + + func callSegueFromCell2(_ contact: KeyRecord?) { + if isFiltering, Logger.logging { + let categoryIndex = searchController.searchBar.selectedScopeButtonIndex + Logger.log(search: self.filteredRecords.count, category: categoryIndex, opened: "mailList") + } + performSegue(withIdentifier: "mailListSegue", sender: contact) + } + + func callSegueToContact(_ contact: KeyRecord?) { + if isFiltering, Logger.logging { + let categoryIndex = searchController.searchBar.selectedScopeButtonIndex + Logger.log(search: self.filteredRecords.count, category: categoryIndex, opened: "contact") + } + performSegue(withIdentifier: "contactSegue", sender: contact) + } + + override func prepare(for segue: UIStoryboardSegue, sender: Any?) { + if segue.identifier == "readMailSegue" { + if let mail = sender as? PersistentMail { + let DestinationViewController: ReadViewController = segue.destination as! ReadViewController + DestinationViewController.mail = mail + } + } else if segue.identifier == "mailListSegue" { + if let contact = sender as? KeyRecord { + let DestinationViewController: ListViewController = segue.destination as! ListViewController + DestinationViewController.contact = contact + } + } else if segue.identifier == "contactSegue" { + if let contact = sender as? KeyRecord { + let DestinationViewController: ContactViewController = segue.destination as! ContactViewController + DestinationViewController.keyRecord = contact + } + } else if segue.identifier == "yourTraySegue" { + if let DestinationNavigationController = segue.destination as? UINavigationController { + if let DestinationViewController = DestinationNavigationController.topViewController as? ContactViewController { + //DestinationViewController.navigationItem.leftBarButtonItem = UIBarButtonItem(barButtonSystemItem: .done, target: self, action: #selector(dismissView)) + let records = folder.records.filter({ + $0.isUser + }) + let prefKeyID = UserManager.loadUserValue(Attribute.prefSecretKeyID) as? String + if let record = records.filter({ $0.isSecure && ($0.keyID == prefKeyID)}).first { + DestinationViewController.keyRecord = record + } else { + let keyID = UserManager.loadUserValue(Attribute.prefSecretKeyID) as! String + let addr = UserManager.loadUserValue(Attribute.userAddr) as! String + DestinationViewController.keyRecord = DataHandler.handler.getKeyRecord(addr: addr, keyID: keyID) + } + } + } + } + } + + @objc func dismissView() { + self.dismiss(animated: true, completion: nil) + } + + /// Is true if the text is empty or nil + var searchBarIsEmpty: Bool { + return searchController.searchBar.text?.isEmpty ?? true + } + + var isFiltering: Bool { + return searchController.isActive && !searchBarIsEmpty + } + + /** + searches a given string with a delay so that the entire client doesn't lag if the inbox is very big + + - parameters: + - searchText: srtring to look for + - scope: where to search (look at _filterContentForSearchText) + */ + func startSearch(searchText: String, scope: Int = 0) { + // check if a search has been scheduled already and stop it to prevent multiple searches + if let searchBarTimer: Timer = self.searchBarTimer { + searchBarTimer.invalidate() + } + + self.searchBarTimer = Timer.scheduledTimer(withTimeInterval: searchDelay, repeats: false, block: { _ in + self._filterContentForSearchText(searchText, scope: scope) + }) + } + + /** + Filters emails by a user input string and scope + + - parameters: + - scope: 0 = contact name; 1 = subject; 2 = body; 3 = all + - searchText: the string we are looking for + */ + private func _filterContentForSearchText(_ searchText: String, scope: Int = 0) { + let records = folder.records.filter({ (record: KeyRecord) -> Bool in + if scope == 0 + { + return containsSearchTerms(content: record.name, searchText: searchText) + } + let mails = record.inboxMails + return mails.filter({ (mail: PersistentMail) -> Bool in + // concatenate all strings that fall in our scope + var str = "" + if scope == 1 || scope == 3 + { + str.append(contentsOf: mail.subject ?? "") + } + if scope == 2 || scope == 3 + { + if let decryptedBody = mail.decryptedBody { + str.append(decryptedBody) + } else if !mail.isEncrypted { + str.append(contentsOf: mail.body ?? "") + } + } + if scope == 3 + { + str.append(contentsOf: record.name) + } + return containsSearchTerms(content: str, searchText: searchText) + }).count > 0 +<<<<<<< Updated upstream + }) + +======= + }) + } + +>>>>>>> Stashed changes + filteredRecords = records.unique.sorted() + tableView.reloadData() + } +} + +extension InboxViewController: UISearchResultsUpdating { + // https://www.raywenderlich.com/157864/uisearchcontroller-tutorial-getting-started + + func updateSearchResults(for searchController: UISearchController) { + startSearch(searchText: searchController.searchBar.text!, scope: searchController.searchBar.selectedScopeButtonIndex) + } +} + +extension InboxViewController: UISearchBarDelegate { + func searchBar(_ searchBar: UISearchBar, selectedScopeButtonIndexDidChange selectedScope: Int) { + startSearch(searchText: searchBar.text!, scope: selectedScope) + } +} + +extension InboxViewController { + override func scrollViewDidEndDragging(_ scrollView: UIScrollView, willDecelerate decelerate: Bool) { + let offset = scrollView.contentOffset + let bounds = scrollView.bounds + let size = scrollView.contentSize + let inset = scrollView.contentInset + let y = offset.y + bounds.size.height - inset.bottom + let h = size.height + + let reload_distance: CGFloat = 200 + if y > h + reload_distance && !loading { + loading = true + + AppDelegate.getAppDelegate().mailHandler.loadMailsForInbox(completionCallback: doneLoading) + } + } + + func doneLoading(_ error: Error?) { + if error != nil { + lastUpdateText = NSLocalizedString("NeverUpdated", comment: "Error while loading mailscomment") + } + loading = false + } +} + +extension Array where Element: Equatable { + var unique: [Element] { + var uniqueValues: [Element] = [] + forEach { item in + if !uniqueValues.contains(item) { + uniqueValues += [item] + } + } + return uniqueValues + } +} diff --git a/enzevalos_iphone/MailComparison.swift b/enzevalos_iphone/MailComparison.swift new file mode 100644 index 0000000000000000000000000000000000000000..b221bb319c57f101c8b932d50a8590b1c3b39816 --- /dev/null +++ b/enzevalos_iphone/MailComparison.swift @@ -0,0 +1,92 @@ +// +// MailComparison.swift +// enzevalos_iphone +// +// Created by Katharina Müller and Viktoria Sorgalla on 04.03.20. +// Copyright © 2020 fu-berlin. All rights reserved. +// + +import Foundation +import CoreData + +private let datahandler = DataHandler.handler + +public enum ResultCompareSenderToContacts { + case isContact, isSender, OnlyIdentity, Unknown + } + +extension String { + + /** + compares the given mail address to the persistant mails and returns the number of matches + ***/ + private func countMatches(_ mailAddr: String, _ inboxMails: [PersistentMail]) -> Int { + var senders: [String] = [] + for sender in inboxMails{ + let sender: String = sender.from.mailAddress + senders.append(sender) + } + var numberOfFoundMatches = 0 + for addr in senders{ + if addr == mailAddr{ + numberOfFoundMatches += 1 + } + } + return numberOfFoundMatches + } + + /** + returns a mail address, wich has the same identity as the given one but a different domain + ***/ + private func getIdentityWithDifferentDomain(_ mailAdd: String, inboxMails: [PersistentMail]) -> String{ + let senderIdentity = mailAdd.getLocalMailIdentity() + var senderDomain = mailAdd.splitAddress() + senderDomain.removeFirst() + + var senders: [String] = [] + for sender in inboxMails{ + let sender: String = sender.from.mailAddress + senders.append(sender) + } + var foundMatch = "" + for addr in senders{ + let foundIdentity = addr.getLocalMailIdentity() + var foundDomain = addr.splitAddress() + foundDomain.removeFirst() + if senderIdentity == foundIdentity && senderDomain != foundDomain{ + foundMatch = addr + return foundMatch + } + } + return foundMatch + } + + /** + looks if the mail address of the sender is already known + ***/ + public func compareSenderToContacts() -> ResultCompareSenderToContacts { + // Case 1: Is the address of the sender known through previous mails? + let inboxMails = datahandler.getAllPersistentMails() + if countMatches(self, inboxMails) >= 2{ + return ResultCompareSenderToContacts.isSender + } + // Case 2: Is the address of the sender in the address book? + let enzContacts = datahandler.getContacts() + for contact in enzContacts { + let contMailAddr = contact.cnContact?.getMailAddresses() + if contMailAddr != nil{ + for mAddr in contMailAddr!{ + if mAddr.mailAddress == self { + return ResultCompareSenderToContacts.isContact + } + } + } + } + // Case 3: The identity of an mail address is known, but not the (sub-)domain + let foundIdentity = getIdentityWithDifferentDomain(self, inboxMails: inboxMails) + if foundIdentity != ""{ + return ResultCompareSenderToContacts.OnlyIdentity + } + return ResultCompareSenderToContacts.Unknown + } +} diff --git a/enzevalos_iphone/SMIME.swift b/enzevalos_iphone/SMIME.swift new file mode 100644 index 0000000000000000000000000000000000000000..4d47ed147c888fa7dbc0c94f93dbad30393611c3 --- /dev/null +++ b/enzevalos_iphone/SMIME.swift @@ -0,0 +1,495 @@ +// +// SMIME.swift +// enzevalos_iphone +// +// Created by lazarog98 on 02.03.20. +// Copyright © 2020 fu-berlin. All rights reserved. +// + +import Foundation +import Security +import KeychainAccess + +/** + The class is a swift wrapper around the C implementation for SMIME. It implements S/MIME ver 3.2 (RFC5751). S/MIME 4 isn't supported yet because OpenSSL currently does not support GCM mode for S/MIME encryption + */ +class SMIME { + // patterns used for extraction of keys and certs from PEMs + private let privateKeyPattern = "[-]*BEGIN[a-zA-Z ]*PRIVATE KEY[-]*[a-zA-Z+/\n\r=0-9]*[-]*END[a-zA-Z ]*PRIVATE KEY[-]*" + private let certificatePattern = "[-]*BEGIN[a-zA-Z ]* CERTIFICATE[-]*[a-zA-Z+/\n\r=0-9]*[-]*END[a-zA-Z ]* CERTIFICATE[-]*" + + private var privateKeyKeychain: Keychain { + get { + return Keychain(service: "Enzevalos/SMIME/privateKeys") + } + } + + private var certsKeychain: Keychain { + get { + return Keychain(service: "Enzevalos/SMIME/certs") + } + } + + private var CAKeychain: Keychain { + get { + return Keychain(service: "Enzevalos/SMIME/CAs") + } + } + + func getOwnCert() -> String? { + if let fp = getOwnKeyFP() { + return certsKeychain[fp] + } + return nil + } + + func getOwnKey() -> String? { + if let fp = getOwnKeyFP() { + return privateKeyKeychain[fp] + } + return nil + } + + func getCAs() -> [String] { + var CAs : [String] = [] + for k in CAKeychain.allKeys() + { + CAs.append(CAKeychain[k]!) + } + + return CAs + } + + private func importInKeychain(certs: [String], keychain: Keychain) -> [String] { + var fingerprints: [String] = [] + + for cert in certs { + let (fp, _, _) = getFingerprintFromPem(pem: cert) + + if fp != nil { + keychain[fp!] = cert + fingerprints.append(fp!) + } + } + + return fingerprints + } + + func importCerts(certs: [String]) -> [String] { + return importInKeychain(certs: certs.map({ (cert: String) -> String in + return cert.extractPattern(pattern: certificatePattern).joined(separator: "\r\n") + }), keychain: certsKeychain) + } + + func importCertForAddress(cert: String, addr: String) -> String { + let fp = importCerts(certs: [cert])[0] + certsKeychain[addr] = fp + return fp + } + + func importCA(certs: [String]) -> [String] { + return importInKeychain(certs: certs.map({ (cert: String) -> String in + return cert.extractPattern(pattern: certificatePattern).joined(separator: "\r\n") + }), keychain: CAKeychain) + } + + func importKeys(certsAndKeys: [(String, String)]) -> [String] { + var fingerprints: [String] = [] + + for (cert, key) in certsAndKeys { + let (certFP, _, _) = getFingerprintFromPem(pem: cert) + if (certFP != nil) { + certsKeychain[certFP!] = cert + privateKeyKeychain[certFP!] = key + fingerprints.append(certFP!) + } + } + + return fingerprints + } + + func resetKeychain () { + do{ + try privateKeyKeychain.removeAll() + try certsKeychain.removeAll() + try CAKeychain.removeAll() + }catch { + print("Can not reset keychains.") + } + } + + func importKeys(certsAndKeys: [String]) -> [String] { + var certsAndKeysSplit: [(String, String)] = [] + + for str in certsAndKeys { + let keys = str.extractPattern(pattern: privateKeyPattern) + let certs = str.extractPattern(pattern: certificatePattern) + if keys.count != 1 { + print("Incorrect amount of keys: ", keys.count) + continue + // ToDo exception + } + if certs.count == 0 + { + print("No certs") + continue + // ToDo exception + } + certsAndKeysSplit.append((certs.joined(separator: "\r\n"), keys[0])) + } + + return importKeys(certsAndKeys: certsAndKeysSplit) + } + + + func addPrivateKey(keyPlusCertPEM: String) -> String + { + let fp = importKeys(certsAndKeys: [keyPlusCertPEM]) + privateKeyKeychain["ownkey"]=fp[0] + return fp[0] + } + + func addCertForContant(email: String, cert:String) -> String + { + let fp = importCerts(certs: [cert]) + certsKeychain[email]=fp[0] + return fp[0] + } + + func getOwnKeyFP() -> String? { + return privateKeyKeychain["ownkey"] + } + + /** + Decrypts a message and verifies its signature. + + - returns: a `CryptoObject`, the `decryptedData` attribute contains the decrypted message + + - throws: `SMIMEError` decryption fails for whatever reason, the `errorArray` field can be iterated to print out the errors. See `getErrorReasonString()` and `getErrorString()` + + - parameters: + - data: the message to decrypt and verify as `Data` + - fromAddr: address of the sender + - isMailNew: used for the verification, see `SMIME.verify()` + */ + func decrypt(data: Data, fromAddr: String, isMailNew: Bool) throws -> CryptoObject { + var outputData: Data = data + let text = String(data: data, encoding: .utf8)! + var fp = getOwnKeyFP() + let cert = certsKeychain[fp!]! + let key = privateKeyKeychain[fp!]! + + var (decStr, errArr) = decryptWithPem(message: text, certAsPem: cert, keyAsPem: key) + var encState = EncryptionState.UnableToDecrypt + if decStr != nil && (errArr == nil || errArr!.count == 0) { + encState = EncryptionState.ValidedEncryptedWithCurrentKey + } + else + { + let fps = privateKeyKeychain.allKeys() + for f in fps{ + if f != fp{ + (decStr, errArr) = decryptWithPem(message: text, certAsPem: certsKeychain[f]!, keyAsPem: privateKeyKeychain[f]!) + if decStr != nil{ + fp = f + encState = EncryptionState.ValidEncryptedWithOldKey + break + } + } + } + } + + if decStr != nil { + outputData = decStr!.data(using: .utf8)! + } + + /** + we have tried to decrypt with our current key and with our older keys and if all of that failed then: + * the email wasn't meant for us and we shouldn't be able to decrypt it anyway + * there is something wrong with the e-mail + */ + if (errArr != nil && errArr!.count > 0) { + throw SMIMEError(message: "Decryption failed!", errorArray: errArr, type: SMIMEError.ErrorType.decryption) + } + + let verifyCryptoObj = verify(data: outputData, email: fromAddr, isMailNew: isMailNew) + + let signedKeys = verifyCryptoObj.signedKeys + let signKey = verifyCryptoObj.signKey + let sigState = verifyCryptoObj.signatureState + let addresses = verifyCryptoObj.signedAdrs + let plainText = verifyCryptoObj.plaintext + let decryptedData = plainText!.data(using: .utf8)! + + return CryptoObject(chiphertext: data, plaintext: plainText, decryptedData: decryptedData, sigState: sigState, encState: encState, signKey: signKey, encType: CryptoScheme.SMIME, signedAdrs: addresses, signedKeys: signedKeys) + } + + /** + Signs a message. + + - returns: a `CryptoObject`, the `ciphertext` attribute contains the signed message + + - throws: `SMIMEError` signing fails for whatever reason, the `errorArray` field can be iterated to print out the errors. See `getErrorReasonString()` and `getErrorString()` + + - parameters: + - plainData: the message to sign as `Data` + - myEmail: the current user's e-mail + - detached: if true, the signature is detached (`multipart/signed`); else not (`application/pkcs7-mime`) + */ + func sign(plainData: Data, myEmail: String, detached: Bool = true) throws -> CryptoObject { + let fp = getOwnKeyFP() + let cert = certsKeychain[fp!]! + let key = privateKeyKeychain[fp!]! + + let text = String(data: plainData, encoding: .utf8) + + let (sigText, errArr) = signWithPem(message: text!, certAsPem: cert, keyAsPem: key, detached: detached) + + if (errArr != nil && errArr!.count > 0) { + throw SMIMEError(message: "Signing failed!", errorArray: errArr, type: SMIMEError.ErrorType.signing) + } + + return CryptoObject(chiphertext: sigText!.data(using: .utf8), plaintext: text, decryptedData: plainData, sigState: SignatureState.ValidSignature, encState: EncryptionState.NoEncryption, signKey: fp, encType: CryptoScheme.SMIME, signedAdrs: [myEmail]) + } + + /** + Verifies the signature of a signed message. If multiple signatures are present, ALL need to be valid AND have a matching mail address, else the signature is invalid. + Previously unknown (not present in the keychain) but valid certificates are stored in the keychain. + + - returns: a `CryptoObject` with all the information about the verification process + - parameters: + - data: the (signed) message to verify + - email: the e-mail of the sender + - isMailNew: if true and the certificate is unknown, the fingerprint of the certificate is mapped to the e-mail in the keychain so it can be used to encrypt future messages to the sender + */ + func verify(data: Data, email: String, isMailNew: Bool) -> CryptoObject { + var CAs : [String] = [] + CAKeychain.allKeys().forEach({ (key) in + CAs.append(CAKeychain[key]!) + }) + let text = String(data: data, encoding: .utf8)! + + let (verStr, certsFPArr, errArr) = verifyWithCApem(message: text, pemCAArr: CAs) + + if certsFPArr == nil || certsFPArr!.count == 0 { + let errors = errArr! + + for error in errors { + let reason = getErrorReasonString(errCode: error) + // check reasons to identify different error causes + // string comaprison necessary because doesn't have fixed error codes... + if reason == "no content type" { + return CryptoObject(chiphertext: data, plaintext: text, decryptedData: nil, sigState: .NoSignature, encState: EncryptionState.NoEncryption, signKey: nil, encType: .UNKNOWN, signedAdrs: []) + } + } + + return CryptoObject(chiphertext: data, plaintext: text, decryptedData: nil, sigState: .InvalidSignature, encState: EncryptionState.NoEncryption, signKey: nil, encType: .UNKNOWN, signedAdrs: []) + } + + var newCerts: [String] = [] // all certs that came from the email and weren't available before + var mailMatch = true + if certsFPArr?.count == 0 {mailMatch = false} + + for item in certsFPArr! { + var mailFound = false + let (fp, cert) = item + let certObj = Certificate(pem: cert) + // check if the email from the parameters matches with one of the emails in each of the certs used to sign the message + for addr in certObj.eMails ?? [] { + if addr == email { + mailFound = true + break + } + } + mailMatch = mailFound && mailMatch + // check if cert is already in the keychain + if let _ = try? certsKeychain.get(fp) { + continue + } + newCerts.append(cert) + } + + let fps = importCerts(certs: newCerts) + // check if the email has no certificate or the certificate is newer than the present one and update accordingly + for fp in fps{ + let cert = Certificate(pem: certsKeychain[fp]!) + for email in cert.eMails ?? [] + { + if isMailNew || certsKeychain[email] == nil + { + certsKeychain[email] = fp + } + } + } + + let sigState = mailMatch ? SignatureState.ValidSignature : SignatureState.InvalidSignature + + let signedAddresses = getAllEmailsFromPEMs(certs: certsFPArr!.map( { (arg) -> String in + let (_, pem) = arg + return pem + })) + + let signKeyFps = certsFPArr!.map( { (arg) -> String in + let (fp, _) = arg + return fp + }) + + return CryptoObject(chiphertext: data, plaintext: verStr!, decryptedData: nil, sigState: sigState, encState: EncryptionState.NoEncryption, signKey: nil, encType: .SMIME, signedAdrs: signedAddresses, signedKeys: signKeyFps) + } + + /** + Encrypts and signs a message. Signing isn't optional. + + - parameters: + - plainData: a `Data` object that contains the string to encrypt + - ids: an array with the e-mails of all users that need to be able to decrypt this. They need to have their certificates imported with `importCertForAddress(cert, addr)` beforehand + - ownAddr: the e-mail of the user of the app, only needed for the CryptoObject + - encryptForMyId: if true, message is also encrypted for the sender + + - returns: a `CryptoObject` with all needed information + + - throws: `SMIMEError` if: + * any of the e-mails in `ids` doesn't have a certificate registered in the keychain (see `importCertForAddress(cert, addr)`) + * can't sign because the user doesn't have a private key + * if encryption or signing failsfor any other reason + the `errorArray` field can be iterated to print out the errors. See `getErrorReasonString()` and `getErrorString()` + */ + func encrypt(plainData: Data, ids: [String], ownAddr: String, encryptForMyId: Bool = true) throws -> CryptoObject { + let plainText = String(data: plainData, encoding: .utf8) + var pems: [String] = [] + let ownFp: String? = getOwnKeyFP() + var sigText: String? = nil + + // retrieve the certs as pems for each ID (email), certsKeychain stores for each email a fingerprint of the cert of that user and under a fingerprint a cert is stored + for id in ids { + if let fp = certsKeychain[id] { + pems.append(certsKeychain[fp]!) + } + else{ + throw SMIMEError(message: "No cert for email " + id + "!", errorArray: nil, type: SMIMEError.ErrorType.other) + } + } + + // if we want to encrypt with the user's own key, retrieve the key and handle errors + if encryptForMyId { + if ownFp != nil { + pems.append(certsKeychain[ownFp!]!) + } + else { + throw SMIMEError(message: "Tried to encrypt email with the user's key but no cert for own key present!", errorArray: nil, type: SMIMEError.ErrorType.other) + } + } + + // check if the user has a certificate + if ownFp != nil { + var signObj: CryptoObject? = nil + do { + signObj = try sign(plainData: plainData, myEmail: ownAddr, detached: false) + } catch let error { + throw error + } + + // reminder: signObj can't be nil here b/c we always get it unless we get an exception (and exceptions get instantly re-thrown) + sigText = String(data: signObj!.chiphertext!, encoding: .utf8) + } else { + throw SMIMEError(message: "Tried to sign with user's certificate but none was present!", errorArray: nil, type: SMIMEError.ErrorType.other) + } + + // do the actual encryption + // NOTE: sigText can't be nil b/c we force signing so we either sign successfully or we throw an exception and never reach this code block + let (encStr, errArr) = encryptWithPem(message: sigText!, certPems: pems) + if errArr != nil && errArr!.count > 0 { + throw SMIMEError(message: "Encryption failed!", errorArray: errArr, type: SMIMEError.ErrorType.encryption) + } + + return CryptoObject(chiphertext: encStr!.data(using: .utf8), plaintext: plainText, decryptedData: plainData, sigState: SignatureState.ValidSignature, encState: EncryptionState.ValidedEncryptedWithCurrentKey, signKey: ownFp, encType: CryptoScheme.SMIME, signedAdrs: [ownAddr]) + } + + /** + A wrapper for the C function for encryption. Takes care of memory managment. Only meant tobe used as a helper in the SMIME class. + */ + private func encryptWithPem(message: String,certPems: [String]) -> (String?, [UInt]?) { + let cCertsArray = createCStrArr(sarr: certPems) + let enc = OpenSSL_encrypt(message, cCertsArray, Int32(certPems.count)) + defer { + deallocateResult(res: enc) + } + + let result = enc?.pointee; + + let encStr: String? = result?.extractField(field: ResultAttribute.output) + let errArr: [UInt]? = result?.extractField(field: ResultAttribute.errors) + + return (encStr, errArr) + } + + /** + A wrapper for the C function for decryption. Takes care of memory managment. Only meant tobe used as a helper in the SMIME class. + */ + private func decryptWithPem(message:String, certAsPem: String, keyAsPem:String) -> (String?, [UInt]?) { + let dec = OpenSSL_decrypt(message, certAsPem, keyAsPem) + defer { + deallocateResult(res: dec) + } + let result = dec?.pointee; + + let decStr: String? = result?.extractField(field: ResultAttribute.output) + let errArr: [UInt]? = result?.extractField(field: ResultAttribute.errors) + + return (decStr, errArr) + } + + /** + A wrapper for the C function for signing. Takes care of memory managment. Only meant tobe used as a helper in the SMIME class. + */ + private func signWithPem(message:String, certAsPem: String, keyAsPem:String, detached:Bool) -> (String?, [UInt]?) { + var detFlag : Int32 = 0 + if detached { + detFlag = 1 + } + + let sig = OpenSSL_sign(message, certAsPem, keyAsPem, detFlag) + defer { + deallocateResult(res: sig) + } + + let result = sig?.pointee + + let sigStr: String? = result?.extractField(field: ResultAttribute.output) + let errArr: [UInt]? = result?.extractField(field: ResultAttribute.errors) + + return (sigStr, errArr) + } + + /** + A wrapper for the C function for verification. Takes care of memory managment. Only meant to be used as a helper in the SMIME class. + */ + private func verifyWithCApem (message:String, pemCAArr: [String]) -> (String?, [(String, String)]?, [UInt]?) { + let pemCAArrC = createCStrArr(sarr: pemCAArr) + let ver = OpenSSL_verify(message, pemCAArrC, Int32(pemCAArr.count)) + + defer { + deallocateResult(res: ver) + } + + deallocateCStrArr(arr: pemCAArrC, len:pemCAArr.count) + + let result = ver?.pointee; + + let verStr: String? = result?.extractField(field: ResultAttribute.output) + let errArr: [UInt]? = result?.extractField(field: ResultAttribute.errors) + let certArr: [String]? = result?.extractField(field: ResultAttribute.certificates) + let fpArr: [String]? = result?.extractField(field: ResultAttribute.fingerprints) + + let numCerts = Int((result?.num_certs)!) + var certFPArr: [(String, String)] = [] + + if (numCerts > 0) { + for i in 0...(numCerts-1) { + certFPArr.append( ((fpArr?[i])!, (certArr?[i])!) ) + } + } + + return (verStr, certFPArr, errArr) + } +} diff --git a/enzevalos_iphone/SMIMEHelpers.swift b/enzevalos_iphone/SMIMEHelpers.swift new file mode 100644 index 0000000000000000000000000000000000000000..50aeccef3b3faa9b33edba3567712ab8b073587c --- /dev/null +++ b/enzevalos_iphone/SMIMEHelpers.swift @@ -0,0 +1,305 @@ +// +// SMIMEHelpers.swift +// enzevalos_iphone +// +// Created by lazarog98 on 19.03.20. +// Copyright © 2020 fu-berlin. All rights reserved. +// + +import Foundation + +class SMIMEError : Error { + enum ErrorType { + case fingerPrint + case encryption + case decryption + case verification + case signing + case other + } + + func errorArrayToString() -> [String] { + var strArr: [String] = [] + + for error in self.errorArray ?? [] { + strArr.append(getErrorString(errCode: error)) + } + + return strArr + } + + let message: String? + let errorArray: [UInt]? + let type: ErrorType + + init(message: String?, errorArray: [UInt]?, type: ErrorType) { + self.message = message + self.errorArray = errorArray + self.type = type + } +} + + +/** + Returns a fingerprint hash of a certificate given a PEM + + - parameters: + - pem: cerificate's PEM as a string + + - returns:a tuple of the form (fingerprint, nil, array of errors) + */ +func getFingerprintFromPem (pem: String) -> (String?, [String]?, [UInt]?) { + let res = get_fingerprint_from_pem(pem, 0); + defer { + deallocateResult(res: res) + } + + let result = res?.pointee; + + let fpStr: String? = result?.extractField(field: ResultAttribute.output) + let errArr: [UInt]? = result?.extractField(field: ResultAttribute.errors) + + return (fpStr, nil, errArr) +} + + /** + Exrtracts a private key from an ecnrypted PEM + + - parameters: + - pem: key's PEM as a string + - passwd: password to decrypt the PEM + - returns:(<decrypted PEM>, <array of errors>) + */ + func getPKeyFromEncryptedPem(pem: String, passwd: String) -> (String?, [UInt]?) { + let res = get_pkey_from_enc_pem(pem, passwd) + defer { + deallocateResult(res: res) + } + + let result = res?.pointee + + let pKey: String? = result?.extractField(field: ResultAttribute.output) + let errArr: [UInt]? = result?.extractField(field: ResultAttribute.errors) + + return (pKey, errArr) + } + +/** + Encrypts a private key's PEM with a password (encryption key) + + - parameters: + - pem: key's PEM as a string + - passwd: password for the encryption + - returns:(<encrypted PEM>, <array of errors>) + */ + func getEncryptedPemFromPKey(pem: String, passwd: String) -> (String?, [UInt]?) { + let res = get_enc_pem_from_pkey(pem, passwd) + defer { + deallocateResult(res: res) + } + + let result = res?.pointee + + let pKey: String? = result?.extractField(field: ResultAttribute.output) + let errArr: [UInt]? = result?.extractField(field: ResultAttribute.errors) + + return (pKey, errArr) + } + +/** + Returns the complete string of an OpenSSL error. Includes things such as reason, function that caused it and so on + + - parameters; + - errCode: the error code + */ +func getErrorString(errCode: UInt) -> String { + let cStr = get_err_string(errCode); + defer { + cStr?.deallocate() + } + + if (cStr != nil) { + let str = String( cString: cStr!) + return str; + } + return "Invalid error code!" +} + +/** + Returns the reason part of the string of an OpenSSL error. + + - parameters; + - errCode: the error code + */ +func getErrorReasonString(errCode: UInt) -> String { + let cStr = get_err_reason_string(errCode); + defer { + cStr?.deallocate() + } + + if (cStr != nil) { + let str = String( cString: cStr!) + return str; + } + return "Invalid error code!" +} + +/** + Returns the list of all e-mails from an array of certificates. Each email has only one instance in the array. + + - parameters: + - certs: an array of PEMs + + - returns:an array of emails + */ +func getAllEmailsFromPEMs(certs: [String]) -> [String] { + let certObjects = certs.map( { (arg) -> Certificate in + return Certificate(pem: arg) + }) + + var addrs : [String:Bool] = [:] + for c in certObjects + { + for e in c.eMails! + { + addrs[e] = true + } + } + + return Array(addrs.keys) +} + +func deallocateResult(res: UnsafeMutablePointer<result>?) { + deallocate_result(res) +} + +func deallocateCertInfo(certInfo: UnsafeMutablePointer<cert_info>?) { + deallocate_cert_info(certInfo) +} + +enum ResultAttribute { + case certificates + case errors + case output + case fingerprints +} + +/** + A structure returned by the C crypto functions + + This is not intended to be used outside of the SMIME library for letterbox. Look at the encryption/decryption functions for example usages + */ +extension result { + /** + Extracts an array of certs in PEM of the respective function from the result object + Deallocates the "errors" part of the result object + Only use in combination with_extractOutput and _extractErrors + */ + private func extractStringArray(attrType: ResultAttribute) -> [String]? { + let arr: UnsafeMutablePointer<UnsafeMutablePointer<Int8>?>? + switch (attrType) { + case .certificates: + arr = self.certs + case .fingerprints: + arr = self.fingerprints + default: + // TODO: Exceptions + return nil + } + var strArr: [String]? = nil + + if arr != nil { + strArr = [] + let size = self.num_certs + for i in 0..<size { + let str = String(cString: arr![Int(i)]!) + strArr?.append(str) + } + } + + return strArr + } + + /** + Extracts an array of errors of the respective function from the result object + Deallocates the "errors" part of the result object + Only use in combination with_extractOutput + */ + private func extractErrors() -> [UInt]? { + let arr = self.errors + var errArr: [UInt]? = nil + + if arr != nil { + errArr = [] + let size = self.num_errors + for i in 0..<size { + errArr?.append(arr![Int(i)]) + } + } + + return errArr + } + + /** + Extracts the output of the respective function from the result object + Deallocates the "res" part of the result object + Only use in combination with_extractErrors + */ + private func extractOutput() -> String? { + let cStr = self.res + + var swiftStr: String? = nil + + if cStr != nil { + swiftStr = String(cString: cStr!) + } + + return swiftStr + } + + /** + A generic function that reads a field and casts it to the type of the variable that stores the result. The variable must therefore have the correct type. Look at encrypWithPem() for example usage + + - parameters: + - field: enum, specifiying the field to extract + */ + func extractField<T>(field: ResultAttribute) -> T? { + switch field { + case .certificates: + fallthrough + case .fingerprints: + let res = self.extractStringArray(attrType: field) + if res is T? { + return res as! T? + } + break + case .errors: + let res = self.extractErrors() + if res is T? { + return res as! T? + } + case .output: + let res = self.extractOutput() + if res is T? { + return res as! T? + } + } + + // TODO: exception + return nil + } +} + +extension String { + func extractPattern(pattern: String) -> [String]{ + let range = NSRange(location: 0, length: self.utf16.count) + let regex = try! NSRegularExpression(pattern: pattern) + let check = regex.matches(in: self, options: [], range: range) + var foundLinks:[String] = [] + for match in check{ + guard let range = Range(match.range, in: self) else {continue} + foundLinks.append(String(self[range])) + } + return (foundLinks) + } +} diff --git a/enzevalos_iphone/SearchHelper.swift b/enzevalos_iphone/SearchHelper.swift index 33f5204ea9b24be2367b9e215fec560324016bd3..b6bffdc347dc16b1eb19dce08035fb3bdf18c4f4 100644 --- a/enzevalos_iphone/SearchHelper.swift +++ b/enzevalos_iphone/SearchHelper.swift @@ -28,7 +28,7 @@ func containsSearchTerms ( content : String?, searchText: String) -> Bool //Case Mail has no body/subject return false } - + var longterms : [String] = [] var terms : [String] = [] //Break String into substrings separated by quoatation marks diff --git a/enzevalos_iphone/Settings.bundle/Acknowledgements.plist b/enzevalos_iphone/Settings.bundle/Acknowledgements.plist index d355d4e85430fab7b5899d0fff297fec534a6ce7..41fc4f8b65bcafeade28b7a17e46dc5d359d9925 100644 --- a/enzevalos_iphone/Settings.bundle/Acknowledgements.plist +++ b/enzevalos_iphone/Settings.bundle/Acknowledgements.plist @@ -425,6 +425,37 @@ third-party archives. <key>Type</key> <string>PSGroupSpecifier</string> </dict> + <dict> + <key>FooterText</key> + <string>The MIT License (MIT) + +Copyright (c) 2016 Brightify.org + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. +</string> + <key>License</key> + <string>MIT</string> + <key>Title</key> + <string>Cuckoo</string> + <key>Type</key> + <string>PSGroupSpecifier</string> + </dict> <dict> <key>FooterText</key> <string>Copyright (c) 2012 Alexey Denisov @@ -941,6 +972,37 @@ THE SOFTWARE. <key>Type</key> <string>PSGroupSpecifier</string> </dict> + <dict> + <key>FooterText</key> + <string>MIT License + +Copyright (c) 2018 Gumob + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. +</string> + <key>License</key> + <string>MIT</string> + <key>Title</key> + <string>Punycode</string> + <key>Type</key> + <string>PSGroupSpecifier</string> + </dict> <dict> <key>FooterText</key> <string>The MIT License (MIT) @@ -971,6 +1033,37 @@ SOFTWARE.</string> <key>Type</key> <string>PSGroupSpecifier</string> </dict> + <dict> + <key>FooterText</key> + <string>MIT License + +Copyright (c) 2018 Gumob + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. +</string> + <key>License</key> + <string>MIT</string> + <key>Title</key> + <string>TLDExtract</string> + <key>Type</key> + <string>PSGroupSpecifier</string> + </dict> <dict> <key>FooterText</key> <string> GNU LESSER GENERAL PUBLIC LICENSE diff --git a/enzevalos_iphone/StringExtension.swift b/enzevalos_iphone/StringExtension.swift index a9656f4fd454fdb3c13cc00530b489bda328b586..c3806413ba900a87b3f4920570da7a17de9f65ac 100644 --- a/enzevalos_iphone/StringExtension.swift +++ b/enzevalos_iphone/StringExtension.swift @@ -19,8 +19,11 @@ // import Foundation +import TLDExtract + +let extractor = try! TLDExtract(useFrozenData: true) + extension String { - static func random(length: Int = 20) -> String { var randomBytes = Data(count: length) @@ -62,7 +65,45 @@ extension String { } extension String { - func splitAddress() -> [String]{ + /** + Returns true if a String contains upper case letters. + */ + func containsUpperCaseLetter() -> Bool { + let url = self + let regEx = "[A-Z]" + let range = NSRange(location: 0, length: url.utf16.count) + let regex = try! NSRegularExpression(pattern: regEx) + if regex.firstMatch(in: url, options:[], range: range) != nil { + return true + } + return false + } + + /** + Returns true if the string contains two or more consecutive dots + */ + func twoDotsOrMore() -> Bool { + let url = self + // Finds 2 or more consecutive dots + let regEx = "\\.{2,}" + let range = NSRange(location: 0, length: url.utf16.count) + let regex = try! NSRegularExpression(pattern: regEx) + if regex.firstMatch(in: url, options:[], range: range) != nil { + return true + } + return false + } +} + +/** +functions to split an emailadress into their domains +*/ +extension String { + /** + Returns the E-Mail address splitted by "." and "@": + Example: test@imp.fu-berlin.de -> ["test", "imp", "fu-berlin", "de"] + */ + func splitAddress() -> [String] { if self == ""{ return [] } @@ -73,13 +114,21 @@ extension String { return splittetMailArr } - func getLocalMailIdentity() -> String{ + /** + Returns the extracted local mail identity from an E-Mail address in + Example: test@imp.fu-berlin.de -> test + */ + func getLocalMailIdentity() -> String { guard let localIdentity = self.splitAddress().first else { return ""} return localIdentity } - func getSubdomains() -> [String]{ + /** + Returns the extracted sub domain from an E-Mail address in + Example: test@imp.fu-berlin.de -> ["imp", "fu-berlin"] + */ + func getSubdomains() -> [String] { if self == ""{ return [] } @@ -88,18 +137,41 @@ extension String { subDomains.removeLast() return subDomains } - - - func getDomain() -> String{ + + /** + Returns the extracted top level domain from an E-Mail address + Example: test@imp.fu-berlin.de -> de + */ + func getDomain() -> String { guard let domain = self.splitAddress().last else {return ""} return domain + } + + /** + Returns the extracted sub - and second evel domain from an E-Mail address in + Example: test@imp.fu-berlin.de -> imp.fu-berlin OR test@example.de -> example + */ + func getMailDomains() -> String { + var domain = "" + if var domains = self.components(separatedBy: "@").last?.components(separatedBy: ".") { + domains.removeLast() + for dom in domains { + domain += dom + "." + } + domain.removeLast() + return domain + } + return "" } } +/** +Functions to find E-mail adresses and URLs +*/ extension String { + func isValidEmail() -> Bool { - let emailRegEx = "(?!\\u10000-\\uEFFFF.*\\.\\.)([^@\\s]{2,64}+@[^@\\s]+\\.[^@\\s\\.]+$)" let emailTest = NSPredicate(format:"SELF MATCHES %@", emailRegEx) return emailTest.evaluate(with: self) @@ -136,16 +208,35 @@ extension String { } return nil } + + /** + Returns a list of E-Mail Addresses extracted from a given string + */ + func findMailAddress() -> [String] { + let splitString = self.split(separator: " ").map(String.init) + var results:[String] = [] + for val in splitString { + if val.contains("@") && val.isValidEmail(){ + results.append(val) + } + } + return(results) + } - //for text only, not for hyperlink detection - func findURL() -> [String]{ - var urls : [String] = [] + /** + For text only, not for hyperlink detection + Returns URLs from a given String + */ + func findURL() -> [String?] { + var urls : [String?] = [] do { let detector = try NSDataDetector(types: NSTextCheckingResult.CheckingType.link.rawValue) detector.enumerateMatches(in: self, options: [], range: NSMakeRange(0, self.count), using: { (result, _, _) in if let match = result{ if let match2 = match.url?.absoluteString, !match2.contains("@") { - urls.append(match2) + if !match2.twoDotsOrMore() { + urls.append(match2) + } } } }) @@ -155,7 +246,9 @@ extension String { return urls } - // to find HTML tags and hyperlinks + /** + To find HTML tags and hyperlinks + */ func findHtmlTags() -> [String]{ let htmlTagPattern = "<(.*?)a.*?href=.*?>(.*?)<\\/.*?a.*?>" let range = NSRange(location: 0, length: self.utf16.count) @@ -195,4 +288,196 @@ extension String { } return (foundLinks) } + +} + +/** +Functions for splitting a URL into their domains +*/ +extension String { + + /** + Returns a list of all second level domains taken out of all URLs from a String. + */ + func getSLD()-> [String] { + let urls = self.findURL() + var SLD: [String] = [] + for url in urls { + let urlString: String = url! + guard let result: TLDResult = extractor.parse(urlString) else { continue } + if let sld = result.secondLevelDomain { + SLD.append(sld) + } + } + return SLD + } + + /** + Returns a list of all top level domains taken out of all URLs from a String. + */ + func getTLD()-> [String] { + let urls = self.findURL() + var TLD: [String] = [] + for url in urls { + let urlString: String = url! + guard let result: TLDResult = extractor.parse(urlString) else { continue } + if let tld = result.topLevelDomain { + TLD.append(tld) + } + } + return TLD + } + + /** + Returns a list of all root domains taken out of all URLs from a String. + */ + func getRD() -> [String] { + let urls = self.findURL() + var RD: [String] = [] + for url in urls { + let urlString: String = url! + guard let result: TLDResult = extractor.parse(urlString) else { continue } + if let rd = result.rootDomain { + RD.append(rd) + } + } + return RD + } + + /** + Returns the root domain of a URL. + */ + func getRootDomain() -> String { + if let result: TLDResult = extractor.parse(self) { + if let rootDomain = result.rootDomain { + return rootDomain + } + } + return "" + } + + /** + Returns the second-level domain of a URL. + */ + func getSecondLevelDomain() -> String { + if let result: TLDResult = extractor.parse(self) { + if let secondLevelDomain = result.secondLevelDomain { + return secondLevelDomain + } + } + return "" + } +} + +/** +Levenshtein Algorithm to calculate the editdistance +Returns the editdistance betwenn two Strings +Weights for transpositiona and editdistance are 2, weights for the rest is 1 +*/ +extension String { + + /** + Returns the editdistance between two strings + */ + func getEditDistance(str: String) -> Int{ + return self.levenshtein(str) + } + + /** + Returns an dictionary of every editdistance between every string of a given list and a given string + Key: string, Value: editdistance + */ + func getEditDistances(list: [String]) -> [String : String]{ + var editDistance = 0 + var editDic : [String:String] = [:] + for elm in list { + editDistance = self.getEditDistance(str: elm) + editDic.updateValue(String(editDistance), forKey: elm) + } + return editDic + } + + /** + Compares two strings with each other. Return true if the edit distance is in the allowed range. + Not allowed distance: 0 < distance < allowedEditDistance. + */ + func isAllowedDistance(str: String, allowedEditDistance: Int) -> Bool { + let distance = self.levenshtein(str) + if distance < allowedEditDistance && distance != 0 { + return false + } + return true + } + + /** + Compares a String with a list of strings and checks whether the edit distance between them is in the allowed range. + Returns a boolean value and a list of strings that had an un-allowed edit distance with the original string + The Bool values is returned False: if the string has an un-allowed edit distance with any other element from the list. + */ + func compareWith(strings: [String], allowedEditDistance: Int) -> (Bool, [String]) { + var isAllowedEditDistance = true + var strList: [String] = [] + for str in strings { + if !self.isAllowedDistance(str: str, allowedEditDistance: allowedEditDistance) { + isAllowedEditDistance = false + strList.append(str) + } + } + return (isAllowedEditDistance, strList) + } + + /** + Levenshtein Algorithm + Resource: https://gist.github.com/RuiCarneiro/82bf91214e3e09222233b1fc04139c86 + edited the source code: added transposition, edited weights + */ + public func levenshtein(_ other: String) -> Int { + let sCount = self.count + let oCount = other.count + + let a = Array(self) + let b = Array(other) + + guard sCount != 0 else { + return oCount + } + + guard oCount != 0 else { + return sCount + } + + let line : [Int] = Array(repeating: 0, count: oCount + 1) + var mat : [[Int]] = Array(repeating: line, count: sCount + 1) + + for i in 0...sCount { + mat[i][0] = i + } + + for j in 0...oCount { + mat[0][j] = j + } + + for j in 1...oCount { + for i in 1...sCount { + + if a[i - 1] == b[j - 1] { + mat[i][j] = mat[i - 1][j - 1] // no operation + } + + else { + // weight for transposition and substitution are 2, the others have weight 1 + let del = mat[i - 1][j] + 1 // deletion + let ins = mat[i][j - 1] + 1 // insertion + let sub = mat[i - 1][j - 1] + 2 // substitution + mat[i][j] = min(min(del, ins), sub) + + if (i > 1) && (j > 1) && (i < sCount) && (j < oCount) && (a[i - 1] == b[j]) && (a[i] == b[j - 1]) { + mat[i][j] = min(mat[i][j], mat[i-2][j-2]+1) // transposition + } + } + } + } + return mat[sCount][oCount] + } + } diff --git a/enzevalos_iphone/SwiftPGP.swift b/enzevalos_iphone/SwiftPGP.swift index c240656c81588ab3c53557a52ff18c4c8f1e4368..fdb750554d55bd7dd5b1ca5860fa71a67b601a23 100644 --- a/enzevalos_iphone/SwiftPGP.swift +++ b/enzevalos_iphone/SwiftPGP.swift @@ -25,7 +25,6 @@ class SwiftPGP: Encryption { } - private func generatePW(size: Int, splitInBlocks: Bool) -> String{ let file = open("/dev/urandom", O_RDONLY) if file >= 0{ @@ -596,7 +595,10 @@ class SwiftPGP: Encryption { return CryptoObject(chiphertext: data, plaintext: plaintext, decryptedData: plaindata, sigState: sigState, encState: encState, signKey: sigKeyID, encType: CryptoScheme.PGP, signedAdrs: signedAdr) } - // A help function for findMailForSecrectKey and findNotSignedMailForPublicKey + /** + A help function for findMailForSecrectKey and findNotSignedMailForPublicKey + Receives a keyID as String and returns the corresponding key as a [Key] List. + */ func keyAsKeyList(keyID: String) -> [Key] { var keyList = [Key]() if let key: Key = loadKey(id: keyID) { @@ -605,7 +607,9 @@ class SwiftPGP: Encryption { return keyList } - // Finds undecrypted mails in persistent mails and and tries to decrypt with the incoming secret key + /** + Receives a keyID as String and searches for undecrypted mails in persistent mails and and tries to decrypt them with the incoming secret key. + */ func findMailForSecretKey(keyID: String) { var encState = EncryptionState.UnableToDecrypt var plaindata: Data? = nil @@ -655,7 +659,9 @@ class SwiftPGP: Encryption { return (nil, EncryptionState.NoEncryption) } - // Finds unsigned mails in persistent mails and and tries to verify them with the incoming public key + /** + Receives a keyID as String and searches for unsigned mails in persistent mails and and tries to verify them with the incoming public key. + */ func findNotSignedMailForPublicKey(keyID: String) { var sigState = SignatureState.NoPublicKey let key: [Key] = keyAsKeyList(keyID: keyID) diff --git a/enzevalos_iphone/SwiftUI/Inbox/Inbox.swift.orig b/enzevalos_iphone/SwiftUI/Inbox/Inbox.swift.orig new file mode 100644 index 0000000000000000000000000000000000000000..e735bbcc75bfecca40523976277a64de9340b638 --- /dev/null +++ b/enzevalos_iphone/SwiftUI/Inbox/Inbox.swift.orig @@ -0,0 +1,145 @@ +// +// Inbox.swift +// enzevalos_iphone +// +// Created by Oliver Wiese on 01.03.20. +// Copyright © 2020 fu-berlin. All rights reserved. +// + +import SwiftUI + +struct Inbox: View { + @Environment(\.managedObjectContext) var managedObjectContext + @FetchRequest(fetchRequest: KeyRecord.allRecordsFetchRequest(in: Folder.inbox)) var keyrecords: FetchedResults<KeyRecord> + + @ObservedObject var folder = Folder.inbox + + @State var updating = false + @State var showUser = false + @State var searchText = "" + @State var searchField = 0 + @State var searchNow = false + + let coord: InboxCoordinator + + var body: some View { + VStack{ + SearchView(searchText: $searchText, searchField: $searchField, searchNow: $searchNow) + .padding(6) + // Mails + mailList + // Toolbar + HStack { + self.idButton + Spacer() + self.lastUpdate + Spacer() + self.composeButton + } + .padding(6) + } + .navigationBarTitle(NSLocalizedString("Inbox", comment: "Inbox")) + .navigationBarItems(leading: self.folderButton) + } + + private var mailList: some View { + List (self.keyrecords.filter(filterKeyRecord), id: \.self){ + record in +<<<<<<< HEAD + KeyRecordRow(keyrecord: record, coord: self.coord) +======= + KeyRecordRow(keyrecord: record, coord: self.coord).environment(\.managedObjectContext, self.managedObjectContext) +>>>>>>> dev + } + .resignKeyboardOnDragGesture() // hide keyboard when dragging + } + + private var folderButton: some View { + Button(action: self.coord.pushFoldersView, label: { + Text(NSLocalizedString("Folders", comment: "Folder")) + }) + } + + private var idButton: some View { + Button(action: { + self.coord.pushRecordView(record: self.userRecord) + }, label: { + Text(NSLocalizedString("KeyID", comment: "id")) + }) + } + + private var composeButton: some View { + Button(action: self.coord.pushComposeView, label: { + Image(systemName: "message").imageScale(.large) + }) + } + + private var lastUpdate: some View { + var text = NSLocalizedString("Updating", comment: "updating...") + if !updating { + if let last = Folder.inbox.lastUpdate { + let dateFormatter = DateFormatter() + dateFormatter.locale = Locale.current + dateFormatter.timeStyle = .medium + let dateString = dateFormatter.string(from: last) + text = NSLocalizedString("LastUpdate", comment: "") + " " + dateString + } + else { + text = NSLocalizedString("NeverUpdated", comment: "no upates...") + } + } + return Button(action: updateMails, label: {Text(text) + .font(.callout) + + }) + } + + var userRecord: KeyRecord { + get { + let keyID = UserManager.loadUserValue(Attribute.prefSecretKeyID) as? String + let addr = UserManager.loadUserValue(Attribute.userAddr) as! String + return DataHandler.handler.getKeyRecord(addr: addr, keyID: keyID) + } + } + + func updateMails() { + guard !updating else { + return + } + AppDelegate.getAppDelegate().mailHandler.updateFolder(folder: Folder.inbox, completionCallback: {_ in + self.updating = false + }) + updating = true + } + + func filterKeyRecord(keyRecord: KeyRecord) -> Bool { + let searchType = SearchType.findType(i: searchField) + if self.searchText.isEmpty || self.searchText == NSLocalizedString("Searchbar.Title", comment: "Search") { + return true + } + let query = self.searchText.lowercased() + if (searchType == .All || searchType == .Sender) && containsSearchTerms(content: keyRecord.name, searchText: query){ + return true + } + else if (searchType == .All || searchType == .Sender) && keyRecord.addresses.filter({containsSearchTerms(content: $0.mailAddress, searchText: query)}).count > 0 { + return true + } + else if (searchType == .All || searchType == .Subject) && keyRecord.mails.filter({containsSearchTerms(content: $0.subject, searchText: query)}).count > 0 { + return true + } + else if (searchType == .All || searchType == .Body) && keyRecord.mails.filter({containsSearchTerms(content: $0.body, searchText: query)}).count > 0 { + return true + } + return false + } +} + + + +/* +struct Inbox_Previews: PreviewProvider { + static var previews: some View { + Inbox() + } +} + */ diff --git a/enzevalos_iphone/SwiftUI/Inbox/InboxCoordinator.swift.orig b/enzevalos_iphone/SwiftUI/Inbox/InboxCoordinator.swift.orig new file mode 100644 index 0000000000000000000000000000000000000000..74fd5b458e9625c67404053aa56bf616fc74a6a6 --- /dev/null +++ b/enzevalos_iphone/SwiftUI/Inbox/InboxCoordinator.swift.orig @@ -0,0 +1,94 @@ +// +// InboxCoordinator.swift +// enzevalos_iphone +// +// Created by Oliver Wiese on 04.03.20. +// Copyright © 2020 fu-berlin. All rights reserved. +// + +import Foundation +import SwiftUI + +class InboxCoordinator { + let root: UINavigationController + + private let mainStoryboardName = "Main" + private let mainStoryboard: UIStoryboard + private var inbox: UIViewController? + + + init(root: UINavigationController) { + self.root = root + mainStoryboard = UIStoryboard(name: self.mainStoryboardName, bundle: nil) + } + + func pushInbox(){ + try? AppDelegate.getAppDelegate().mailHandler.startIMAPIdleIfSupported() + AppDelegate.getAppDelegate().mailHandler.updateFolder(folder: Folder.inbox, completionCallback: {_ in + }) + + root.isToolbarHidden = true + + if let vc = inbox { + if root.viewControllers.contains(vc) { + while root.topViewController != vc { + root.popViewController(animated: true) + } + } else { + root.pushViewController(vc, animated: true) + } + } + else { + let context = DataHandler.handler.managedObjectContext +<<<<<<< HEAD + let vc = UIHostingController(rootView: Inbox(coord: self).environment(\.managedObjectContext,context)) +======= + let vc = UIHostingController(rootView: Inbox(coord: self).environment(\.managedObjectContext, context)) +>>>>>>> dev + inbox = vc + root.pushViewController(vc, animated: true) + } + } + + func pushFoldersView() { + let controller = mainStoryboard.instantiateViewController(withIdentifier: ViewID.FoldersView.rawValue) + root.isToolbarHidden = false + root.pushViewController(controller, animated: true) + } + + func pushReadView(mail: PersistentMail) { + let vc = mainStoryboard.instantiateViewController(withIdentifier: ViewID.ReadView.rawValue) + if let vc = vc as? ReadViewController { + vc.mail = mail + } + root.isToolbarHidden = false + root.pushViewController(vc, animated: true) + } + + func pushRecordView(record: KeyRecord){ + let vc = mainStoryboard.instantiateViewController(withIdentifier: ViewID.KeyRecordView.rawValue) + if let vc = vc as? ContactViewController { + vc.keyRecord = record + } + root.isToolbarHidden = false + root.pushViewController(vc, animated: true) + } + + func pushComposeView() { + let vc = mainStoryboard.instantiateViewController(identifier: ViewID.ComposeView.rawValue) + if let vc = vc as? SendViewController { + vc.wasPushed = true + } + root.isToolbarHidden = false + root.pushViewController(vc, animated: true) + } + + func pushMailListView(record: KeyRecord) { + let vc = mainStoryboard.instantiateViewController(identifier: ViewID.MailListView.rawValue) + if let vc = vc as? ListViewController { + vc.contact = record + } + root.isToolbarHidden = false + root.pushViewController(vc, animated: true) + } +} diff --git a/enzevalos_iphone/SwiftUI/Inbox/KeyRecordRow.swift.orig b/enzevalos_iphone/SwiftUI/Inbox/KeyRecordRow.swift.orig new file mode 100644 index 0000000000000000000000000000000000000000..2ddd602992c56f7b8d556d2a10bc670804ddec3c --- /dev/null +++ b/enzevalos_iphone/SwiftUI/Inbox/KeyRecordRow.swift.orig @@ -0,0 +1,150 @@ +// +// KeyRecordRow.swift +// enzevalos_iphone +// +// Created by Oliver Wiese on 02.03.20. +// Copyright © 2020 fu-berlin. All rights reserved. +// + +import SwiftUI + +struct KeyRecordRow: View { +<<<<<<< HEAD + @ObservedObject var keyrecord: KeyRecord + let coord: InboxCoordinator + +======= + @Environment(\.managedObjectContext) var managedObjectContext + + var keyrecord: KeyRecord + let coord: InboxCoordinator + + var fetchRequest: FetchRequest<PersistentMail> + var mails: FetchedResults<PersistentMail> { + fetchRequest.wrappedValue + } + + init(keyrecord: KeyRecord, coord: InboxCoordinator) { + self.keyrecord = keyrecord + self.coord = coord + let pred = NSPredicate(format: "record == %@", keyrecord) + let folderPredicate = NSPredicate(format: "folder == %@", Folder.inbox) + let predicates = NSCompoundPredicate(andPredicateWithSubpredicates: [pred, folderPredicate]) + let sortDescriptors = [NSSortDescriptor(key: "date", ascending: false)] + fetchRequest = FetchRequest<PersistentMail>(entity: PersistentMail.entity(), sortDescriptors: sortDescriptors, predicate: predicates, animation: nil) + } + + +>>>>>>> dev + var body: some View { + VStack { + HStack(alignment: .lastTextBaseline) { + icon + Spacer() + mailListView() + .offset(y: -10) + } + HStack { + name + Spacer() + moreMails + } + } + } + +<<<<<<< HEAD +======= + var secondMail: PersistentMail?{ + if mails.count > 1 { + return mails[2] + } + return nil + } + +>>>>>>> dev + /* + Displays the first (and second) mail + */ + private func mailListView() -> AnyView { + let spacing = CGFloat(10) + let offset = -(spacing / 2) + +<<<<<<< HEAD + if let first = self.keyrecord.firstMail { + if let second = self.keyrecord.secondMail { + return AnyView(VStack(alignment: .leading, spacing: spacing) { + MailView(mail: first, coord: coord) + MailView(mail: second, coord: coord) +======= + if let first = mails.first { + if mails.count > 1 { + return AnyView(VStack(alignment: .leading, spacing: spacing) { + MailView(mail: first, coord: coord) + MailView(mail: mails[1], coord: coord) +>>>>>>> dev + .background(Stroke(offsetY: offset)) + }) + } else { + return AnyView(VStack(alignment: .leading,spacing: spacing) { + MailView(mail: first, coord: coord) + Text(NSLocalizedString("NoFurtherMessages", comment: "No more Mails")) + .background(Stroke(offsetY: offset)) + }) + } + } else { + return AnyView(Text("NO MAILS...")) + } + } + + private var icon: some View{ + self.keyrecord.image.img + .resizable() + .frame(width: 60, height: 60) + .shadow(radius: 5) + .onTapGesture { + self.coord.pushRecordView(record: self.keyrecord) + } + } + + private var name: some View { + Text(self.keyrecord.myNick) + .frame(maxWidth: 300, alignment: .leading) + .lineLimit(1) + .onTapGesture { + self.coord.pushRecordView(record: self.keyrecord) + } + } + + private var moreMails: some View { + Button(action: { + self.coord.pushMailListView(record: self.keyrecord) + }, label: { + Text(NSLocalizedString("MailView.MoreMails", comment: "More mails")) + .foregroundColor(.gray) + }) + } +} + + +extension KeyRecord { +<<<<<<< HEAD +======= + +>>>>>>> dev + public var firstMail: PersistentMail? { + get { + return mails.first + } + } + + public var secondMail: PersistentMail? { + get { + if mails.count > 1 { + return mails[1] + } + return nil + } + } +} + + diff --git a/enzevalos_iphone/Typosquatting.swift b/enzevalos_iphone/Typosquatting.swift new file mode 100644 index 0000000000000000000000000000000000000000..580b709363e7afb198fcffb73df7ee60eed774e6 --- /dev/null +++ b/enzevalos_iphone/Typosquatting.swift @@ -0,0 +1,206 @@ +// +// Typosquatting.swift +// enzevalos_iphone +// +// Created by Lauren Elden on 29.03.20. +// Copyright © 2020 fu-berlin. All rights reserved. +// + +import Foundation +import TLDExtract + +class Typosquatting { + + /** + Compares a url's root domain with all root domain of all elements in a given url list. + false: if the URL's root domain has an unallowed edit distance with any other root domain. + */ + func compareURLs(myUrl: String, urls: [String]) -> (Bool, [String]) { + let rootDomain = myUrl.getRootDomain() + var isAllowedEditDistance = true + var closeStrings = [String]() + for url in urls { + let rd = url.getRootDomain() + if !rootDomain.isAllowedDistance(str: rd, allowedEditDistance: 4) { + // 2 domains contain less than 4 differences --> warning here needed + isAllowedEditDistance = false + closeStrings.append(url) + } + } + return (isAllowedEditDistance , closeStrings) + } + + /** + Compares a url's root domain with all root domain of all elements in a given url list. + Returns an dictionary with the urls as the keys and and a bollean if it fits the allowed editdistance as value + isAllowedDistance is false: if the URL's root domain has an unallowed edit distance with any other root domain. + */ + func compareURLsAsDic(url: String, urls: [String], allowedEditDistance: Int) -> [String:Bool] { + let rootDomain = url.getRootDomain() + var isAllowedEditDistance = true + var typoDic: [String:Bool] = [:] + for url in urls { + let rd = url.getRootDomain() + if !rootDomain.isAllowedDistance(str: rd, allowedEditDistance: allowedEditDistance) { + // 2 domains contain less than 4 differences --> warning here needed + isAllowedEditDistance = false + typoDic.updateValue(isAllowedEditDistance, forKey : url) + isAllowedEditDistance = true + } + else{ + typoDic.updateValue(isAllowedEditDistance, forKey : url) + } + } + return typoDic + } + + /** + Compares a url's root domain with all root domain of all elements in a givin url list. + Returns an dictionary with the URLs as keys and the Editdistance as value + */ + func getURLEditdistanceAsDic(url: String, urls: [String]) -> [String:Int] { + let rootDomain = url.getRootDomain() + var urlEditDic: [String:Int] = [:] + var editDistance = 0 + for url in urls { + let rd = url.getRootDomain() + editDistance = rootDomain.getEditDistance(str: rd) + urlEditDic.updateValue(editDistance, forKey : url) + } + return urlEditDic + } + + /** + Compares a URLs second-level domain with all elements of a givin domain list. + false: if the URL's second-level domain has an unallowed edit distance with any other domain. + */ + func compareURLWithSLDList(url: String, domains: [String]) -> Bool { + let secondLevelDomain = url.getSecondLevelDomain() + var isAllowedEditDistance = true + for domain in domains { + if !secondLevelDomain.isAllowedDistance(str: domain, allowedEditDistance: 4) { + // 2 domains contain less than 4 differences --> warning here needed + isAllowedEditDistance = false + } + } + return isAllowedEditDistance + } + + /** + Compares a url's second level domain with all domains of all elements in a givin second level domain list. + Returns an dictionary with the domains as the keys and and a boolean if it fits the allowed edit-distance as value + isAllowedDistance is false: if the URL's second level domain has an unallowed edit distance with any other domain. + */ + func compareURLWithSLDListAsDic(url: String, domains: [String], allowedEditDistance: Int) -> [String:Bool] { + let secondLevelDomain = url.getSecondLevelDomain() + var isAllowedEditDistance = true + var typoDic: [String:Bool] = [:] + for domain in domains { + if !secondLevelDomain.isAllowedDistance(str: domain, allowedEditDistance: allowedEditDistance) { + // 2 domains contain less than 4 differences --> warning here needed + isAllowedEditDistance = false + typoDic.updateValue(isAllowedEditDistance, forKey : domain) + isAllowedEditDistance = true + } + else{ + typoDic.updateValue(isAllowedEditDistance, forKey : domain) + } + } + return typoDic + } + + /** + Compares a url's second-level domain with all elements of a givin domain list. + Returns an dictionary with the second level domain as keys and the editdistance as value + */ + func getSLDEditdistanceAsDic(url: String, domains: [String]) -> [String:Int] { + let secondLevelDomain = url.getSecondLevelDomain() + var sldEditDic: [String:Int] = [:] + var editDistance = 0 + for domain in domains { + editDistance = secondLevelDomain.getEditDistance(str: domain) + sldEditDic.updateValue(editDistance, forKey : domain) + } + return sldEditDic + } + + /** + Compares a second-level domain with all elements of a givin second-level domain list. + false: if the second-level domain has an unallowed edit distance with any other domain. + */ + func compareDomainWithDomians(secondLvlDomain: String, domains: [String], allowedEditDistance: Int) -> Bool { + var isAllowedEditDistance = true + for domain in domains { + if !secondLvlDomain.isAllowedDistance(str: domain, allowedEditDistance: allowedEditDistance) { + // 2 domains contain less than 4 differences --> warning here needed + isAllowedEditDistance = false + } + } + return isAllowedEditDistance + } + + /** + Compares a second level domain with all elements of a givin second-level domain list. + Returns an dictionary with the domains as the keys and and a boolean if it fits the allowed editdistance as value + isAllowedDistance is false: if the second level domain has an unallowed edit distance with any other domain. + */ + func compareDomainWithDomiansAsDic(secondLvlDomain: String, domains: [String], allowedEditDistance: Int) -> [String:Bool] { + var isAllowedEditDistance = true + var typoDic: [String:Bool] = [:] + for domain in domains { + if !secondLvlDomain.isAllowedDistance(str: domain, allowedEditDistance: allowedEditDistance) { + // 2 domains contain less than 4 differences --> warning here needed + isAllowedEditDistance = false + typoDic.updateValue(isAllowedEditDistance, forKey : domain) + isAllowedEditDistance = true + } + else{ + typoDic.updateValue(isAllowedEditDistance, forKey : domain) + } + } + return typoDic + } + + /** + Compares a domain with all elements of a givin domain list. + Returns an dictionary with domains as keys and the editdistance as value + */ + func getDomainEditDistanceAsDic(domain: String, domains: [String]) -> [String:Int] { + var domainEditDic: [String:Int] = [:] + var editDistance = 0 + for dom in domains { + editDistance = domain.getEditDistance(str: dom) + domainEditDic.updateValue(editDistance, forKey : dom) + } + return domainEditDic + } + + /** + Receives a mail body and takes out the URLs and filters valid URLs by verifying their Root Domain + Return a list of valid URLs + */ + func isValidRD(mailBody: String) -> [String] { + let urls = mailBody.findURL() + var foundRDs: [String] = [] + for url in urls { + let urlString: String = url! + if !urlString.containsUpperCaseLetter() { + guard let result: TLDResult = extractor.parse(urlString) else { continue } + if let rd = result.rootDomain { + let rdPatternRegEx = "^([a-z0-9])*([a-z0-9-]+\\.)*[a-z0-9]*([a-z0-9-]+)*[a-z0-9]+\\.[a-z]{2,11}?$" // for hostname + let range = NSRange(location: 0, length: rd.utf16.count) + let regex = try! NSRegularExpression(pattern: rdPatternRegEx) + if regex.firstMatch(in: rd, options:[], range: range) != nil { + foundRDs.append(rd) + } else { + // domain did not pass the regex --> warning here needed + } + } + } else { + // domain contains capital letters --> warning here needed + } + } + // Returns non-Critical Root Domain list + return (foundRDs) + } +} diff --git a/enzevalos_iphone/c/certificate-helpers.c b/enzevalos_iphone/c/certificate-helpers.c new file mode 100644 index 0000000000000000000000000000000000000000..44057539bde02a0da88097f91320e5d84de14697 --- /dev/null +++ b/enzevalos_iphone/c/certificate-helpers.c @@ -0,0 +1,191 @@ +// +// certificate-helpers.c +// enzevalos_iphone +// +// Created by lazarog98 on 18.03.20. +// Copyright © 2020 fu-berlin. All rights reserved. +// + +#include "certificate-helpers.h" + +cert_info * get_cert_data(const char *pem) +{ + BIO *cert_bio = NULL; + // recipient certificate + X509 *cert = NULL; + cert_info *info = malloc(sizeof(cert_info)); + array_with_length *emails = NULL; + int size=0; + + cert_bio = BIO_new_mem_buf(pem, (int) strlen(pem)); + + if (!cert_bio) { + printf("Failed reading mykey.pem!\n"); + goto deinit; + } + + cert = PEM_read_bio_X509(cert_bio, NULL, 0, NULL); + if (!cert) { + printf("Failed reading pem\n"); + goto deinit; + } + + emails = get_emails(cert); + size = emails->size; + + //ELIMINATED MAIN MEMORY LEAK; STILL HAVE A SMALL ONE: after running a couple of minutes nonstop loading certs 70mb + + info->num_emails = size; + info->emails = malloc(size*sizeof(char*)); + char ** arr = (char**) emails->arr; + for (int i = 0; i<size; i++) { + unsigned long len = strlen(arr[i]); + info->emails[i] = malloc(len + 1); + info->emails[i][len] = 0; + memcpy(info->emails[i], arr[i], len); + free(arr[i]); + } + free(arr); + free(emails); + + info->date_end = get_end_date(cert); + info->date_start = get_start_date(cert); + info->subject = get_subject(cert); + info->issuer = get_issuer(cert); +deinit: + BIO_free(cert_bio); + X509_free(cert); + return info; +} + +char * get_issuer(X509 *cert) { + + char *res = NULL; + BIO *out = NULL; + out = BIO_new(BIO_s_mem()); + X509_NAME *name = NULL; + name = X509_get_issuer_name(cert); + X509_NAME_print_ex(out, name, 0, XN_FLAG_MULTILINE); + bio_to_str(out, &res); +deinit: + BIO_free(out); + return res; +} + +char * get_subject(X509 *cert) { + char *res = NULL; + BIO *out = NULL; + out = BIO_new(BIO_s_mem()); + X509_NAME *name = NULL; + name = X509_get_subject_name(cert); + X509_NAME_print_ex(out, name, 0, XN_FLAG_MULTILINE); + bio_to_str(out, &res); +deinit: + BIO_free(out); + return res; +} + +char * get_start_date(X509 *cert) { + char *res = NULL; + BIO *out = NULL; + out = BIO_new(BIO_s_mem()); + ASN1_TIME_print(out, X509_get0_notBefore(cert)); + bio_to_str(out, &res); +deinit: + BIO_free(out); + return res; +} + +char * get_end_date(X509 *cert) { + char *res = NULL; + BIO *out = NULL; + out = BIO_new(BIO_s_mem()); + ASN1_TIME_print(out, X509_get0_notAfter(cert)); + bio_to_str(out, &res); +deinit: + BIO_free(out); + return res; +} + +array_with_length *get_emails(X509 *cert) { + array_with_length *res = malloc(sizeof(array_with_length)); + int i = 0; + STACK_OF(OPENSSL_STRING) *list = NULL; + + if (cert == NULL) { + printf("Failed to get emails cause null cert!\n"); + goto deinit; + } + + list = X509_get1_email(cert); + + const int emails_num = sk_OPENSSL_STRING_num(list); + res->size = emails_num; + + if (emails_num == 0) + goto deinit; + + char ** arr = init_str_arr(emails_num); + + for (i = 0; i < emails_num; i++) { + char *temp = sk_OPENSSL_STRING_value(list, i); + unsigned long size = strlen(temp); + arr[i] = malloc(size+1); + + memcpy(arr[i], temp, size); + arr[i][size] = 0; + free(temp); + } + res->arr = arr; +deinit: + sk_OPENSSL_STRING_free(list); + return res; +} + +X509 *get_cert_from_pem(const char *pem) { + BIO *rec_cert_bio = NULL; + // recipient certificate + X509 *rec_cert = NULL; + + rec_cert_bio = BIO_new_mem_buf(pem, (int) strlen(pem)); + + if (!rec_cert_bio) { + printf("Failed reading mykey.pem!\n"); + goto deinit; + } + + rec_cert = PEM_read_bio_X509(rec_cert_bio, NULL, 0, NULL); + + if (!rec_cert) { + printf("Failed reading pem\n"); + goto deinit; + } +deinit: + BIO_free(rec_cert_bio); + return rec_cert; +} + +cert_info * new_cert_info() +{ + cert_info *i = malloc(sizeof(cert_info)); + i->date_end = NULL; + i->date_start = NULL; + i->emails = NULL; + i->issuer = NULL; + i->num_emails = 0; + i->subject = NULL; + return i; +} + +void deallocate_cert_info( cert_info *c) +{ + free(c->date_end); + free(c->date_start); + if (c->num_emails > 0) + { + deallocate_str_arr(c->emails, c->num_emails); + } + free(c->issuer); + free(c->subject); + free(c); +} diff --git a/enzevalos_iphone/c/certificate-helpers.h b/enzevalos_iphone/c/certificate-helpers.h new file mode 100644 index 0000000000000000000000000000000000000000..d96c2f67eec5835a14b364b2f6981e74c1b26d79 --- /dev/null +++ b/enzevalos_iphone/c/certificate-helpers.h @@ -0,0 +1,51 @@ +// +// certificate-helpers.h +// enzevalos_iphone +// +// Created by lazarog98 on 18.03.20. +// Copyright © 2020 fu-berlin. All rights reserved. +// + +#ifndef certificate_helpers_h +#define certificate_helpers_h +#undef OPENSSL_NO_SSL_INTERN +#undef OPENSSL_NO_CRYPTO_INTERN + +#include "generic-helpers.h" +#include <string.h> +#include <stdlib.h> +#include <openssl/opensslv.h> +#include <openssl/evp.h> // this header may not be needed +#include <openssl/err.h> // this header may not be needed +#include <openssl/bio.h> +#include <openssl/pem.h> +#include <openssl/pkcs7.h> +#include <openssl/cms.h> +#include <openssl/safestack.h> +#include <openssl/x509.h> +#include <openssl/opensslconf.h> +#include <openssl/crypto.h> +// subject +// issuer + +struct cert_info { + char *issuer; + char *subject; + char *date_start; + char *date_end; + char ** emails; + int num_emails; +} typedef cert_info; + + +char * get_issuer(X509 *cert); +char * get_subject(X509 *cert); +char * get_start_date(X509 *cert); +char * get_end_date(X509 *cert); +array_with_length *get_emails(X509 *cert); +cert_info * get_cert_data(const char *pem); + +cert_info * new_cert_info(void); +void deallocate_cert_info(cert_info *c); + +#endif /* certificate_helpers_h */ diff --git a/enzevalos_iphone/c/general-helpers.c b/enzevalos_iphone/c/general-helpers.c new file mode 100644 index 0000000000000000000000000000000000000000..8165cf452a4bb9763fc3d588d9a18c775e40968f --- /dev/null +++ b/enzevalos_iphone/c/general-helpers.c @@ -0,0 +1,105 @@ +// +// general-helpers.c +// enzevalos_iphone +// +// Created by lazarog98 on 18.03.20. +// Copyright © 2020 fu-berlin. All rights reserved. +// + + +#include "generic-helpers.h" + +void bio_to_str(BIO *bio_in, char **out) { + char * tmp = NULL, *tmp2 = NULL; + long size = BIO_get_mem_data(bio_in, &tmp); + tmp2 = malloc(size+1); + tmp2[size]=0; // To Nullterminate the string + memcpy(tmp2, tmp, size); + *out = tmp2; +} + +int get_array_size(array_with_length *arr) { + return arr->size; +} + +char *get_err_string(unsigned long err) { + char * error_permanent = malloc(256); + ERR_error_string_n(err, error_permanent, 256); + + return error_permanent; +} + +char *get_err_reason_string(unsigned long err) { + const char * reason_str = ERR_reason_error_string(err); + char * error_permanent = (char *) malloc(strlen(reason_str)+1); + error_permanent[strlen(reason_str)]=0; // To Nullterminate the string + memcpy(error_permanent,reason_str,strlen(reason_str)); + + return error_permanent; +} + +char ** init_str_arr(int num) +{ + char ** arr = malloc(num*sizeof(char*)); + return arr; +} + +char ** add_str_to_arr(const char *str, char **arr, int i) +{ + unsigned long len = strlen(str); + char *newstr = malloc(len+1); + memcpy(newstr, str, len); + newstr[len]=0; + arr[i]=newstr; + return arr; +} + +void deallocate_str_arr(char **arr, int len) +{ + for (int i=0; i < len; i++){ + free(arr[i]); + } + free(arr); +} + +char *bin_to_hex(unsigned char *bin, int len) +{ + unsigned char buf[3]; + char *res = malloc(2*len+1); + for (int i =0;i<len;i++) + { + sprintf((char*) buf, "%02x", bin[i]); + res[i*2]=buf[0]; + res[i*2+1]=buf[1]; + } + res[len*2]=0; + return res; +} + +result *new_result() +{ + result *res = malloc(sizeof(result)); + res->certs = NULL; + res->errors = NULL; + res->num_certs =0; + res->num_errors =0; + res->certs = NULL; + res->fingerprints = NULL; + return res; + +} + +void deallocate_result(result *res) { + if (res->num_certs > 0) { + if (res->certs != NULL) deallocate_str_arr(res->certs, res->num_certs); + if (res->fingerprints != NULL) deallocate_str_arr(res->fingerprints, res->num_certs); + } + if (res->num_errors > 0) { + free(res->errors); + } + if (res->res != NULL) { + free(res->res); + } + free(res); +} + diff --git a/enzevalos_iphone/c/generic-helpers.h b/enzevalos_iphone/c/generic-helpers.h new file mode 100644 index 0000000000000000000000000000000000000000..3288c0d8f0ba36412ec3b4b841832daac1d3d159 --- /dev/null +++ b/enzevalos_iphone/c/generic-helpers.h @@ -0,0 +1,64 @@ +// +// generic-helpers.h +// enzevalos_iphone +// +// Created by lazarog98 on 18.03.20. +// Copyright © 2020 fu-berlin. All rights reserved. +// + +#ifndef generic_helpers_h +#undef OPENSSL_NO_SSL_INTERN +#undef OPENSSL_NO_CRYPTO_INTERN + +#include <string.h> +#include <stdlib.h> +#include <openssl/opensslv.h> +#include <openssl/evp.h> // this header may not be needed +#include <openssl/err.h> // this header may not be needed +#include <openssl/bio.h> +#include <openssl/pem.h> +#include <openssl/pkcs7.h> +#include <openssl/cms.h> +#include <openssl/safestack.h> +#include <openssl/x509.h> +#include <openssl/opensslconf.h> + + +struct linked_list { + void *content; + struct linked_list *next; +} typedef linked_list; + +struct result { + char *res; + unsigned long *errors; + int num_errors; + char **certs; + int num_certs; + char **fingerprints; +} typedef result; + +struct array_with_length { + int size; + void *arr; +} typedef array_with_length; + +char * pop_error (result *res); +char *get_err_string(unsigned long err); +char *get_err_reason_string(unsigned long err); + +void bio_to_str(BIO *bio_in, char **out); +int get_array_size(array_with_length *arr); + +char ** init_str_arr(int num); +char ** add_str_to_arr(const char *str, char **arr, int i); +void deallocate_str_arr(char **arr, int len); +char *bin_to_hex ( unsigned char *bin, int len); + +result *new_result(void); +void deallocate_result(result *res); + +#define generic_helpers_h + + +#endif /* generic_helpers_h */ diff --git a/enzevalos_iphone/c/smime-helpers.c b/enzevalos_iphone/c/smime-helpers.c new file mode 100644 index 0000000000000000000000000000000000000000..020d6cdeeb5f43f6ffdf64058c25a06225c5360f --- /dev/null +++ b/enzevalos_iphone/c/smime-helpers.c @@ -0,0 +1,553 @@ +// +// openssl-helpers.c +// +// +// Created by lazarog98 on 02.03.20. +// + +#include "smime-helpers.h" +#include <glob.h> + +// This is a wrapper around the OpenSSL functions, where everz function is primarily inspired by the SMIME demos in the OpenSSL github +// https://github.com/openssl/openssl/tree/master/demos/smime + +pem_with_fp * cert_stack_to_array(STACK_OF(X509) *stack) { + pem_with_fp *arr = malloc(sizeof(pem_with_fp)*sk_X509_num(stack)); + + int i = 0; + while (sk_X509_num(stack) > 0) { + BIO *out = BIO_new(BIO_s_mem()); + char *tmp = NULL; + X509 *cert = sk_X509_pop(stack); + PEM_write_bio_X509(out, cert); + long size = BIO_get_mem_data(out, &tmp); + char *str_perm = (char *) malloc(size+1); + memcpy(str_perm, tmp, size); + str_perm[size]=0; // To Nullterminate the string + arr[i].pem = str_perm; + arr[i].fp = get_fingerprint_from_X509(cert, 0); + i++; + + X509_free(cert); + BIO_free(out); + } + + return arr; +} + +void OpenSSL_print_ver(void) { + printf("%s", OPENSSL_VERSION_TEXT); +} + +array_with_length *create_list_of_errors() { + unsigned long err = 0; + linked_list *head = NULL; + linked_list *cur = NULL; + int first = 1; + array_with_length *res = malloc(sizeof(array_with_length)); + int length = 0; + unsigned long * arr = NULL; + + while ((err = ERR_get_error()) != 0) { + linked_list * newerr = malloc(sizeof(linked_list)); + newerr->content = malloc(sizeof(unsigned long)); + memcpy(newerr->content, &err, sizeof(unsigned long)); + newerr->next = NULL; + if (first) + { + first=0; + head = newerr; + } + else + { + cur->next=newerr; + } + cur=newerr; + length++; + } + + if (length) { + arr = malloc(sizeof(unsigned long) * length); + linked_list *cur = head; + int i = 0; + while (cur != NULL) { + arr[i] = *((unsigned long*) cur->content); + linked_list *old = cur; + cur = cur->next; + free(old->content); + free(old); + i++; + } + } + + res->arr = arr; + res->size = length; + + return res; +} + +result * OpenSSL_encrypt(const char *text, char **pems, int num_certs) { + // https://github.com/openssl/openssl/blob/master/demos/cms/cms_enc.c + BIO *in = NULL, *out = NULL, *rec_cert_bio = NULL; + // recipient certificate + X509 *rec_cert = NULL; + STACK_OF(X509) *cert_stack = NULL; + CMS_ContentInfo *cms = NULL; + array_with_length *temp = NULL; + result *res =new_result(); + res->certs = NULL; + res->num_certs = 0; + + cert_stack = sk_X509_new_null(); + if (!cert_stack) { + printf("Couldn't initialize cert stack!\n"); + goto deinit; + } + + in = BIO_new_mem_buf(text, (int) strlen(text)); + + for (int i = 0; i<num_certs; i++) { + rec_cert_bio = BIO_new_mem_buf(pems[i], (int) strlen(pems[i])); + + if (!rec_cert_bio) { + printf("Failed reading mykey.pem!\n"); + goto deinit_loop; + } + + rec_cert = PEM_read_bio_X509(rec_cert_bio, NULL, 0, NULL); + + if (!rec_cert) { + printf("Failed reading pem\n"); + goto deinit_loop; + } + + // note that if the stack is initialized correctly, the recipient certificate is pushed as a test + if (!sk_X509_push(cert_stack, rec_cert)) { + printf("Failed at push_stack"); + X509_free(rec_cert); + goto deinit_loop; + } + deinit_loop: + BIO_free(rec_cert_bio); + } + + // TODO: change AES CBC to AES GCM for compliance with SMIME 4.0 + // as of OpenSSL version 1.1.1d GCM isn't supported for CMS + // https://github.com/openssl/openssl/pull/8024 + cms = CMS_encrypt(cert_stack, in, EVP_aes_256_cbc(), CMS_STREAM); + if (!cms) { + printf("Failed at P7enc"); + goto deinit; + } + + out = BIO_new(BIO_s_mem()); + + if (!SMIME_write_CMS(out,cms,in,CMS_STREAM)) { + printf("Failed at SMIME_WRITE"); + goto deinit; + } + + bio_to_str(out, &(res->res)); +deinit: + // TODO: Collect all errors in a list and return them with the result + temp = create_list_of_errors(); + res->errors = temp->arr; + res->num_errors = temp->size; + free(temp); + CMS_ContentInfo_free(cms); + BIO_free(in); + BIO_free(out); // also frees tmp + sk_X509_pop_free(cert_stack, X509_free); + return res; +} + +result * OpenSSL_decrypt(const char *str, const char *pem_cert, const char *pem_key) { + // https://github.com/openssl/openssl/blob/master/demos/cms/cms_dec.c + + BIO *in = NULL, *out = NULL, *rec_cert_bio = NULL, *rec_key_bio = NULL; + // recipient certificate + X509 *rec_cert = NULL; + CMS_ContentInfo *cms = NULL; + EVP_PKEY *rkey = NULL; + result *res = new_result(); + array_with_length *temp = NULL; + res->certs = NULL; + res->num_certs = 0; + + // this trick allows to hardcode a certificate as a string + rec_cert_bio = BIO_new_mem_buf(pem_cert, (int) strlen(pem_cert)); + rec_key_bio = BIO_new_mem_buf(pem_key, (int) strlen(pem_key)); + + in = BIO_new_mem_buf(str,(int) strlen(str)); // simpletest + + if (!rec_cert_bio) { + printf("Failed reading cert!\n"); + goto deinit; + } + if (!rec_key_bio) { + printf("Failed reading mykey.pem!\n"); + goto deinit; + } + + rec_cert = PEM_read_bio_X509(rec_cert_bio, NULL, 0, NULL); + if (!rec_cert ) { + printf("Failed reading pem cert\n"); + goto deinit; + } + + rkey = PEM_read_bio_PrivateKey(rec_key_bio, NULL, 0, NULL); + + if (!rkey) { + printf("Failed reading pem key\n"); + goto deinit; + } + + cms = SMIME_read_CMS(in, NULL); + if (!cms) { + printf("DEC Failed at SMIME_READ"); + goto deinit; + } + + out = BIO_new(BIO_s_mem()); + + if (!CMS_decrypt(cms, rkey, rec_cert, NULL, out, CMS_STREAM)) { + printf("Failed at Decrypt"); + goto deinit; + } + + bio_to_str(out, &(res->res)); +deinit: + temp = create_list_of_errors(); + res->errors = temp->arr; + res->num_errors = temp->size; + free(temp); + CMS_ContentInfo_free(cms); + BIO_free(in); + BIO_free(out); // also frees tmp + BIO_free(rec_cert_bio); + BIO_free(rec_key_bio); + EVP_PKEY_free(rkey); + X509_free(rec_cert); + // OpenSSL ver 1.0.2.f has a bug (seemingly) that causes a crash when freeing cms content info pointers + return res; +} + +result * OpenSSL_sign(const char *text, const char *pem_cert, const char *pem_key, const int detached) { + BIO *in = NULL, *out = NULL, *sig_cert_bio = NULL, *sig_key_bio = NULL; + // recipient certificate + X509 *sig_cert = NULL; + STACK_OF(X509) *cert_stack = NULL; + CMS_ContentInfo *cms = NULL; + EVP_PKEY *skey = NULL; + int flags = CMS_STREAM | CMS_PARTIAL; + + result *res = new_result(); + res->certs = NULL; + res->num_certs = 0; + array_with_length *temp = NULL; + + if (detached) flags |= CMS_DETACHED; + + in = BIO_new_mem_buf(text,(int) strlen(text)); // simpletest + + sig_cert_bio = BIO_new_mem_buf(pem_cert, (int) strlen(pem_cert)); + if (!sig_cert_bio) { + printf("Failed reading cert!\n"); + goto deinit; + } + + sig_key_bio = BIO_new_mem_buf(pem_key, (int) strlen(pem_key)); + if (!sig_key_bio) { + printf("Failed reading mykey.pem!\n"); + goto deinit; + } + + sig_cert = PEM_read_bio_X509(sig_cert_bio, NULL, 0, NULL); + if (!sig_cert ) { + printf("Failed reading pem cert\n"); + goto deinit; + } + + cert_stack = sk_X509_new_null(); + + // note that if the stack is initialized correctly, the recipient certificate is pushed as a test + if (!cert_stack || !sk_X509_push(cert_stack, sig_cert)) { + printf("Failed at push_stack"); + goto deinit; + } + + skey = PEM_read_bio_PrivateKey(sig_key_bio, NULL, 0, NULL); + + if (!skey) { + printf("Failed reading pem key\n"); + goto deinit; + } + + cms = CMS_sign(NULL, NULL, NULL, in, flags); + if (!cms) { + goto deinit; + } + + if (!CMS_add1_signer(cms, sig_cert, skey, EVP_sha256(), flags)) { + goto deinit; + } + + out = BIO_new(BIO_s_mem()); + + if (!SMIME_write_CMS(out,cms,in,flags)) { + printf("Failed at SMIME_WRITE"); + goto deinit; + } + + bio_to_str(out, &(res->res)); +deinit: + temp = create_list_of_errors(); + res->errors = temp->arr; + res->num_errors = temp->size; + free(temp); + CMS_ContentInfo_free(cms); + BIO_free(in); + BIO_free(out); // also frees tmp + BIO_free(sig_cert_bio); + BIO_free(sig_key_bio); + EVP_PKEY_free(skey); + X509_free(sig_cert); + sk_X509_pop_free(cert_stack, X509_free); + + return res; +} + +result * OpenSSL_verify(const char *text, char **pem_cert, const int num_certs) { + // https://github.com/openssl/openssl/blob/master/demos/cms/cms_dec.c + result *ver = new_result(); + BIO *in = NULL, *out = NULL; + // recipient certificate + X509 **sig_certs = malloc(num_certs*sizeof(void*)); + + STACK_OF(X509) *cert_stack= NULL; + X509_STORE *cert_store = NULL; + CMS_ContentInfo *cms = NULL; + BIO *detached = NULL; + + array_with_length *temp = NULL; + + cert_store = X509_STORE_new(); + + // this trick allows to hardcode a certificate as a string + for (int i = 0; i<num_certs; i++) { + BIO *sig_cert_bio = BIO_new_mem_buf(pem_cert[i], (int) strlen(pem_cert[i])); + sig_certs[i] = NULL; + + if (!sig_cert_bio) { + printf("VERT Failed reading mykey.pem!\n"); + goto loopend; + } + + sig_certs[i] = PEM_read_bio_X509(sig_cert_bio, NULL, 0, NULL); + if (!sig_certs[i] ) { + printf("VERT Failed reading pem cert %d\n |", i); + + goto loopend; + } + + if (!X509_STORE_add_cert(cert_store, sig_certs[i])) { + printf("VERT Failed at adding cert to store\n"); + goto loopend; + } + + loopend: + BIO_free(sig_cert_bio); + } + + in = BIO_new_mem_buf(text,(int) strlen(text)); // simpletest + + + cms = SMIME_read_CMS(in, &detached); + if (!cms) { + printf("\nVERT VER Failed at SMIME_READ"); + goto deinit; + } + + out = BIO_new(BIO_s_mem()); + ERR_clear_error(); + if (!CMS_verify(cms, NULL, cert_store, detached, out, 0)) { + printf("VERT Verification failed"); + goto deinit; + } + + bio_to_str(out, &(ver->res)); + + cert_stack = CMS_get0_signers(cms); + ver->num_certs = sk_X509_num(cert_stack); + pem_with_fp *certs_fps = cert_stack_to_array(cert_stack); + ver->certs = malloc(sizeof(char*) * ver->num_certs); + ver->fingerprints = malloc(sizeof(char*) * ver->num_certs); + for (int i = 0; i<ver->num_certs; i++) { + ver->certs[i] = certs_fps[i].pem; + ver->fingerprints[i] = certs_fps[i].fp; + } + free(certs_fps); +deinit: + temp = create_list_of_errors(); + ver->errors = temp->arr; + ver->num_errors = temp->size; + free(temp); + CMS_ContentInfo_free(cms); + if (detached != NULL) BIO_free(detached); + BIO_free(in); + BIO_free(out); // also frees tmp + X509_STORE_free(cert_store); + for (int i =0;i<num_certs;i++) X509_free(sig_certs[i]); //We need to free all certs + free(sig_certs); + sk_X509_pop_free(cert_stack, X509_free); + // OpenSSL ver 1.0.2.f has a bug (seemingly) that causes a crash when freeing cms content info pointers + return ver; +} + +char * get_fingerprint_from_X509(X509 *cert, int md_alg) { + // https://github.com/openssl/openssl/blob/master/demos/cms/cms_enc.c + unsigned int len; + unsigned char md[EVP_MAX_MD_SIZE]; + const EVP_MD *alg=NULL; + char *fp = NULL; + + switch(md_alg) + { + case 0: + alg = EVP_sha256(); + break; + case 1: + alg = EVP_sha1(); + break; + default: + alg= EVP_sha256(); + } + + if (!X509_digest(cert, alg, md, &len)) { + printf("Failed at digest!\n"); + goto deinit; + } + + fp = bin_to_hex(md, len); +deinit: + return fp; +} + +result * get_fingerprint_from_pem(const char *pem, int md_alg) { + // https://github.com/openssl/openssl/blob/master/demos/cms/cms_enc.c + BIO *rec_cert_bio = NULL; + // recipient certificate + X509 *rec_cert = NULL; + array_with_length *temp = NULL; + result *res = new_result(); + + // this trick allows to hardcode a certificate as a string + rec_cert_bio = BIO_new_mem_buf(pem, (int) strlen(pem)); + + if (!rec_cert_bio) { + printf("Failed reading mykey.pem!\n"); + goto deinit; + } + + rec_cert = PEM_read_bio_X509(rec_cert_bio, NULL, 0, NULL); + + if (!rec_cert) { + printf("Failed reading pem\n"); + goto deinit; + } + + res->res = get_fingerprint_from_X509(rec_cert, md_alg); +deinit: + temp = create_list_of_errors(); + res->errors = temp->arr; + res->num_errors = temp->size; + free(temp); + BIO_free(rec_cert_bio); + X509_free(rec_cert); + return res; +} + +result * get_pkey_from_enc_pem(const char *pem, const char *passwd) { + // https://github.com/openssl/openssl/blob/master/demos/cms/cms_enc.c + BIO *rec_cert_bio = NULL, *out = NULL; + // recipient certificate + array_with_length *temp = NULL; + result *res = new_result(); + EVP_PKEY *skey = NULL; + + // this trick allows to hardcode a certificate as a string + rec_cert_bio = BIO_new_mem_buf(pem, (int) strlen(pem)); + + if (!rec_cert_bio) { + printf("Failed reading mykey.pem!\n"); + goto deinit; + } + + skey = PEM_read_bio_PrivateKey(rec_cert_bio, NULL, NULL, (void*) passwd); + + if (!skey) { + printf("Failed reading pem key\n"); + goto deinit; + } + + out = BIO_new(BIO_s_mem()); + + if (!PEM_write_bio_PrivateKey(out, skey, NULL, NULL, 0, NULL, NULL)) { + printf("Failed writing pem key\n"); + goto deinit; + } + + bio_to_str(out, &(res->res)); +deinit: + temp = create_list_of_errors(); + res->errors = temp->arr; + res->num_errors = temp->size; + free(temp); + BIO_free(out); + BIO_free(rec_cert_bio); + EVP_PKEY_free(skey); + return res; +} + +result * get_enc_pem_from_pkey(const char *pem, const char *passwd) { + // https://github.com/openssl/openssl/blob/master/demos/cms/cms_enc.c + BIO *rec_cert_bio = NULL, *out = NULL; + // recipient certificate + array_with_length *temp = NULL; + result *res = new_result(); + EVP_PKEY *skey = NULL; + + // this trick allows to hardcode a certificate as a string + rec_cert_bio = BIO_new_mem_buf(pem, (int) strlen(pem)); + + if (!rec_cert_bio) { + printf("Failed reading mykey.pem!\n"); + goto deinit; + } + + skey = PEM_read_bio_PrivateKey(rec_cert_bio, NULL, NULL, NULL); + + if (!skey) { + printf("Failed reading pem key\n"); + goto deinit; + } + + out = BIO_new(BIO_s_mem()); + + // TODO: The current version (1.1.1) of OpenSSL doesn't support AES GCM, change the cypher to GCM from CBC as soon as there's support for it + if (!PEM_write_bio_PKCS8PrivateKey(out, skey, EVP_aes_256_cbc(), (char *) passwd, (int) strlen(passwd), NULL, NULL)) { + printf("Failed writing pem key\n"); + goto deinit; + } + + bio_to_str(out, &(res->res)); +deinit: + temp = create_list_of_errors(); + res->errors = temp->arr; + res->num_errors = temp->size; + free(temp); + BIO_free(out); + BIO_free(rec_cert_bio); + EVP_PKEY_free(skey); + return res; +} diff --git a/enzevalos_iphone/c/smime-helpers.h b/enzevalos_iphone/c/smime-helpers.h new file mode 100644 index 0000000000000000000000000000000000000000..9e57b91f64b3626653ac84dc3ca839109918920e --- /dev/null +++ b/enzevalos_iphone/c/smime-helpers.h @@ -0,0 +1,47 @@ +// +// openssl-helpers.h +// +// +// Created by lazarog98 on 02.03.20. +// + +#ifndef openssl_helpers_h +#define openssl_helpers_h +#undef OPENSSL_NO_SSL_INTERN +#undef OPENSSL_NO_CRYPTO_INTERN + +#include <stdio.h> +#include <string.h> +#include <stdlib.h> +#include <openssl/opensslv.h> +#include <openssl/evp.h> // this header may not be needed +#include <openssl/err.h> // this header may not be needed +#include <openssl/bio.h> +#include <openssl/pem.h> +#include <openssl/pkcs7.h> +#include <openssl/cms.h> +#include <openssl/safestack.h> +#include <openssl/x509.h> +#include <openssl/opensslconf.h> +#include "generic-helpers.h" +#include "certificate-helpers.h" + +STACK_OF(X509)* create_stack_x509(X509 *arr, int len); +struct pem_with_fp { + char *pem; + char *fp; +} typedef pem_with_fp; +pem_with_fp * cert_stack_to_array(STACK_OF(X509) *stack); + +void OpenSSL_print_ver(void); + +result * OpenSSL_encrypt(const char *text, char **pems, int num_certs); +result * OpenSSL_decrypt(const char *str, const char *pem_cert, const char *pem_key); +result * OpenSSL_sign(const char *text, const char *pem_cert, const char *pem_key, const int detached); +result * OpenSSL_verify(const char *text, char **pem_cert, const int num_certs); +char * get_fingerprint_from_X509(X509 *cert, int md_alg); +result * get_fingerprint_from_pem(const char *pem, int md_alg); // 0 for SHA-256, 1 for SHA-1 +result * get_pkey_from_enc_pem(const char *pem, const char *passwd); +result * get_enc_pem_from_pkey(const char *pem, const char *passwd); + +#endif /* openssl_helpers_h */ diff --git a/enzevalos_iphone/enzevalos_iphone-Bridging-Header.h b/enzevalos_iphone/enzevalos_iphone-Bridging-Header.h index 805779836c78c5503b2deb9ea952f240f6587b09..725eede1557938791617efb812802173c590330d 100644 --- a/enzevalos_iphone/enzevalos_iphone-Bridging-Header.h +++ b/enzevalos_iphone/enzevalos_iphone-Bridging-Header.h @@ -26,6 +26,10 @@ #import <GTMAppAuth/GTMAppAuth.h> #import <GTMSessionFetcher/GTMSessionFetcher.h> #import "OAuth/EmailHelper.h" +#import "c/smime-helpers.h" +#import <openssl/pem.h> +#import <openssl/cms.h> +#import <openssl/err.h> // Making this funcion accessible @interface OIDAuthState (Auth) diff --git a/enzevalos_iphone/evilCA.p12 b/enzevalos_iphone/evilCA.p12 new file mode 100644 index 0000000000000000000000000000000000000000..946d34fd12c923b666a1d1eb0c5f5a44c74336f2 Binary files /dev/null and b/enzevalos_iphone/evilCA.p12 differ diff --git a/enzevalos_iphone/evilCA.pem b/enzevalos_iphone/evilCA.pem new file mode 100644 index 0000000000000000000000000000000000000000..5938f840d6ccb53e516657da9447e9ea6f0933ae --- /dev/null +++ b/enzevalos_iphone/evilCA.pem @@ -0,0 +1,45 @@ +-----BEGIN CERTIFICATE----- +MIIC4TCCAckCCDWaS3dso6D3MA0GCSqGSIb3DQEBCwUAMDMxCzAJBgNVBAYTAkRF +MRMwEQYDVQQKDApBIE1BSUxURVNUMQ8wDQYDVQQDDAZldmlsQ0EwHhcNMTkwNzI5 +MTUzODA1WhcNMTkwODA1MTUzODA1WjAzMQswCQYDVQQGEwJERTETMBEGA1UECgwK +QSBNQUlMVEVTVDEPMA0GA1UEAwwGZXZpbENBMIIBIjANBgkqhkiG9w0BAQEFAAOC +AQ8AMIIBCgKCAQEAv0W8s3Dav5brYO+MZQ+DiNPSf0Mgd6g6zR1vdk+sPTuJbAZ2 +owxR376WKEayBp3jF3omitej4ltuAoepQ7xgsFLVJDijAxeLeoAzPc+J8qDcY1NF +4up9+DpN7L0L3rgfU0/I8Az4jpR8pHJTHmu0L074Er5+Vk2cBvxSY3srp2NnEga1 +Fudun9YUYfOp432Ac7xv/6KYz99ocbI+F/egnHQm49GnyFs1zxCuh9qfTeCFO644 +dUlkMXfQF7sdZmxdxwKIF4D8AroAecFXWei4PtNIJpPvr/UdCBIyEmZroL2fMnPg +zMtChlEG5Ryw7UuwKrQGs903n3nxvopr4mOumwIDAQABMA0GCSqGSIb3DQEBCwUA +A4IBAQCFnuNL7hhJjhvPpeMPFahMdadA1OWRLIe0XdAJI8Pvlx3f8XR5udcGS2Mi +r5znDhWHT5fFyYTj0JZQUf5GaYrucZDh2M2lXzuazhh5J+PSgvMez1fqfC0pp3Iy +IIqIxZCzGaZp9A7CkAO1qyDqM3fAtkJ0f6JoIrUN9Q4PphDpi6vlRDIoHROmK/Xr +QVzf2Y0lnKGQisw048XPLWqGagu8ZO0n6GMmyldnwVDEsQomndWDrW0EHEV2s/fq +bgvyhVRenp1O5IH3nOyXm8vR2FWOEHwR686l8Mxy24APzzn5K7nPeyBx0+ZpyqYh +aqQKdT1pty4gKWz3zSNTupVsyA/t +-----END CERTIFICATE----- +-----BEGIN RSA PRIVATE KEY----- +MIIEogIBAAKCAQEAv0W8s3Dav5brYO+MZQ+DiNPSf0Mgd6g6zR1vdk+sPTuJbAZ2 +owxR376WKEayBp3jF3omitej4ltuAoepQ7xgsFLVJDijAxeLeoAzPc+J8qDcY1NF +4up9+DpN7L0L3rgfU0/I8Az4jpR8pHJTHmu0L074Er5+Vk2cBvxSY3srp2NnEga1 +Fudun9YUYfOp432Ac7xv/6KYz99ocbI+F/egnHQm49GnyFs1zxCuh9qfTeCFO644 +dUlkMXfQF7sdZmxdxwKIF4D8AroAecFXWei4PtNIJpPvr/UdCBIyEmZroL2fMnPg +zMtChlEG5Ryw7UuwKrQGs903n3nxvopr4mOumwIDAQABAoIBAAmrItdC8KPJ7Gi5 +fpjLL1IpFvCmDF4rfghJRbIu0Yr7stBn4TwQRbgUu7esepf9vrqYAePAqpxyFEdM +CBfZO6bU7siGcKwr+3C8JYipQqcTmLKioMAZUIE7odSdoOUMJb5dSQa/ptEaP/lD +xeBCtsYxtcgR670YpRJdnK34zkgrzUiesTro0JMMGafRIywxwyEH6JNc33GLesQn +uty8lwH1GWsJ0p3QCq5j+Ez7vuRDpBAmwITz3rMnmk2JP+jMRgUMOVvVYJh08Kjy +v8UXgoxhryAoYFawKiTnYt5F8Ys5VHs8//I+J8Ki3fszu91lpHrMv7tfwUqroGJp +NRdTaukCgYEA3ryMRFwFK4l5smOenYIzk3YuGZzXYl42jlT3jk4Mugvb3WIc755V +WLcFs2xwjpobj42Tf1r2++eJEaPfMWD3/3GCzNkMEwsFApjSSsF30tuLEszOLEmd +7XH2VPSA5XIqVvUmPaOqW2nCi813zHmWykB+9ebjlymcQnm8p4ns+YMCgYEA29ZI +g83L6IqJs2NxN2W3EfYKbfTRJRGVWrTK9/NsmHwFIo3kN0BPeEf28i4EjOJyghRm +Qi+xHUSjStpcsjhuiYSGXMIVj+ARl8cR3g9PHY3VE73+iLm4tH2qQ1XnQqxyODoZ +BoZaxuoaEOMhFj2vM0Gji9knFICMJfkv8kimIwkCgYB35omfduW1lRC0zdmhsmgv +NkwEr6BmLI8zuVt1+F/zetTFbL5k4xfQZN2lw3cn3J9/fFftE7umyPHJVCyeuTNn +B+TAfwp36dOtnTR+13y4PkS0PxmxT4O7QUC4ZNJKMVXHb7pBLixTfzAh795QbReW +EngFyV+0jMq4Ii5DBgVSHwKBgEHtY1XTs+ELGvynR967LEnApaQQFWCug0HukigF +4n1gRBH2x4giSzLhMhey4T528qw7/ea/crg6S1Y5Yi84aT3odnr+4YSCSARieONF +aA6O6GXBRsIuIExQm20SKAaAvMhL9BFW3YZl0mdaFiQbX51Zg/h+qQ+m9WC1+EEK +tHgxAoGAFeDbm2pwpD61Z3pWE3MdRfLPOzbDfbMbrIau6HezRBJNzD+0UidIYDI6 +GP39EtcDLnf3K0eGm9/B46vjI+3fC9o7s5vvnnxIov7WOPyT0cbzc7WOD1792Ind +8I1WNf1OLkTkZ1FwqoIFcUtQd5s45m2xwnB8qYv5f2kBwiXAbvI= +-----END RSA PRIVATE KEY----- diff --git a/enzevalos_iphone/evilkey1.p12 b/enzevalos_iphone/evilkey1.p12 new file mode 100644 index 0000000000000000000000000000000000000000..bebbd3e324820947699cb4956e538bd6a1e0279a Binary files /dev/null and b/enzevalos_iphone/evilkey1.p12 differ diff --git a/enzevalos_iphone/evilkey1.pem b/enzevalos_iphone/evilkey1.pem new file mode 100644 index 0000000000000000000000000000000000000000..a854b06416de5cec42209620597a1a3275ba9cf8 --- /dev/null +++ b/enzevalos_iphone/evilkey1.pem @@ -0,0 +1,67 @@ +-----BEGIN CERTIFICATE----- +MIIDqTCCApGgAwIBAgII5frz+azVWtswDQYJKoZIhvcNAQELBQAwMzELMAkGA1UE +BhMCREUxEzARBgNVBAoMCkEgTUFJTFRFU1QxDzANBgNVBAMMBmV2aWxDQTAeFw0x +OTA3MzAxMjE4MjNaFw0xOTA4MDYxMjE4MjNaMDUxCzAJBgNVBAYTAkRFMRMwEQYD +VQQKDApBIE1BSUxURVNUMREwDwYDVQQDDAhldmlsa2V5MTCCASIwDQYJKoZIhvcN +AQEBBQADggEPADCCAQoCggEBAM7iVLw2PQOn+i2BFyCWJbwWESbbc25rDj5qPYGP +JjpU2FVmM469feUbLlmXCph6uyMFq9BScIvLw3oDdylU/2w5pIzUwX4xiAiH8rMk +lqSA3IMvplkEF7Y+1JB91fYXJfRaBU4KpJnYz1joJ4C/iLk404UEa42nrDp5ZkQj +LthbneVxcCPGSwuFOQap4Mn49RIJi0fM5qb33L6Sx2iT7dJaEh2RCybIJtEYTqWw +ZV5BzrkEcJpMKt6DE1PEnKP/+PpHAjkMTRQKLv+ABpk/6bDupgf5i+sbg9xrAHYC +SRd4SvzKNjnr2Y4nJmx/XxtFKn4YSlf1fR3PqGMp4aNXogkCAwEAAaOBvjCBuzAe +BgNVHREEFzAVgRN0ZXN0ZXJAZHJlbmdlbHMubmV0MCkGA1UdDgQiBCClAfbPDXhf +BeT7RN0SmGbfoEUCiB6sAabQsz8mvTfajDBuBgNVHSMEZzBlgCA9dagPmOgAE8hS +Tcy4y3/fWNLmeYJmzAs5hkmuEiLc3aE3pDUwMzELMAkGA1UEBhMCREUxEzARBgNV +BAoMCkEgTUFJTFRFU1QxDzANBgNVBAMMBmV2aWxDQYIINZpLd2yjoPcwDQYJKoZI +hvcNAQELBQADggEBAKxUcfIYHng1Lvrtpxw0WAgX5PcSZS3Yyu/dqQ4d+JUW5AJl +eJLXWsfZXtT9c5xm3TAgKae1xEFJQmf/8WvbWSx9GpTKlXuePGcGg4oCtO2ntYcJ +6++HzIRcpLzeRKu608j7yJEm038Mmj+/y/PJTU5jiQjfgumpT7QlccjVriSm9NiB +NOIw9SQe5MMH/HTdi5PHrGvomCAQJ8EHI5OmpgaUFgP6mNyEInZzgK8IiZaMHkuM +jfm/O6ThkxR3LDkEWSCUERhnQ0IwfZDOET9jeeJB05fpPXibMxqfhui8spFROnkN +JuslM6AptfcWeB2Wv85lOd40tCA7CZ6Wg63kdUo= +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIC4TCCAckCCDWaS3dso6D3MA0GCSqGSIb3DQEBCwUAMDMxCzAJBgNVBAYTAkRF +MRMwEQYDVQQKDApBIE1BSUxURVNUMQ8wDQYDVQQDDAZldmlsQ0EwHhcNMTkwNzI5 +MTUzODA1WhcNMTkwODA1MTUzODA1WjAzMQswCQYDVQQGEwJERTETMBEGA1UECgwK +QSBNQUlMVEVTVDEPMA0GA1UEAwwGZXZpbENBMIIBIjANBgkqhkiG9w0BAQEFAAOC +AQ8AMIIBCgKCAQEAv0W8s3Dav5brYO+MZQ+DiNPSf0Mgd6g6zR1vdk+sPTuJbAZ2 +owxR376WKEayBp3jF3omitej4ltuAoepQ7xgsFLVJDijAxeLeoAzPc+J8qDcY1NF +4up9+DpN7L0L3rgfU0/I8Az4jpR8pHJTHmu0L074Er5+Vk2cBvxSY3srp2NnEga1 +Fudun9YUYfOp432Ac7xv/6KYz99ocbI+F/egnHQm49GnyFs1zxCuh9qfTeCFO644 +dUlkMXfQF7sdZmxdxwKIF4D8AroAecFXWei4PtNIJpPvr/UdCBIyEmZroL2fMnPg +zMtChlEG5Ryw7UuwKrQGs903n3nxvopr4mOumwIDAQABMA0GCSqGSIb3DQEBCwUA +A4IBAQCFnuNL7hhJjhvPpeMPFahMdadA1OWRLIe0XdAJI8Pvlx3f8XR5udcGS2Mi +r5znDhWHT5fFyYTj0JZQUf5GaYrucZDh2M2lXzuazhh5J+PSgvMez1fqfC0pp3Iy +IIqIxZCzGaZp9A7CkAO1qyDqM3fAtkJ0f6JoIrUN9Q4PphDpi6vlRDIoHROmK/Xr +QVzf2Y0lnKGQisw048XPLWqGagu8ZO0n6GMmyldnwVDEsQomndWDrW0EHEV2s/fq +bgvyhVRenp1O5IH3nOyXm8vR2FWOEHwR686l8Mxy24APzzn5K7nPeyBx0+ZpyqYh +aqQKdT1pty4gKWz3zSNTupVsyA/t +-----END CERTIFICATE----- +-----BEGIN RSA PRIVATE KEY----- +MIIEogIBAAKCAQEAzuJUvDY9A6f6LYEXIJYlvBYRJttzbmsOPmo9gY8mOlTYVWYz +jr195RsuWZcKmHq7IwWr0FJwi8vDegN3KVT/bDmkjNTBfjGICIfysySWpIDcgy+m +WQQXtj7UkH3V9hcl9FoFTgqkmdjPWOgngL+IuTjThQRrjaesOnlmRCMu2Fud5XFw +I8ZLC4U5Bqngyfj1EgmLR8zmpvfcvpLHaJPt0loSHZELJsgm0RhOpbBlXkHOuQRw +mkwq3oMTU8Sco//4+kcCOQxNFAou/4AGmT/psO6mB/mL6xuD3GsAdgJJF3hK/Mo2 +OevZjicmbH9fG0UqfhhKV/V9Hc+oYynho1eiCQIDAQABAoIBAApwE9tdFy34iyBB +m5Oaz7OSH3Jo7wV6pEDU5l6DhOe7gSCp498HQ3NMMEX332J7CrcFIbqEdkYvVSDy +TNBKiAqDTACI+Wwu/pCDn2SXa3xIPhfmTwu9r56Tw/C4UJO2bkVKR2s9ETnr3OY8 +7EVMJI9HxTA4XV7Lv15B4r18UvA6c89S7UZeHZduVKm49OmE4sU2N5VmC64DzN1k +qsA5uYP6lgw0fgHm+1yXqzfQj8gT/AmkrQg5l3yApLoJRlNw05xOzeN+xKZyNRwx +HRQz0mm57qpO9jZ/UY+p5wOP60BjtOap60/xrJ347Euo21jfX8BnroGRHvwDijeO +cOOWcUECgYEA98pxbSvCewXoBbvzH8akFbpqtTZReRoNcQA0OPU9gSiFFAOMzLFH +KZbuEeu3Cnc7IugEDZ7MvCkHQUmtT/nq3rOGVZaS3ErcWGbnbKdBEfF13tGKgOVx +f4ziXu8wNGH+I544TdNxWJAGuQ3HEtmWl7qjEpq4rfkseAe12Db/jzECgYEA1bzz +gAX1pbTeHMvYu3qoCpNafMBo9NfJGXdoklR8f4AN5Ykxez6SqPI8hhYWCG+UgGkp +Dxob7V224G0dgQZIHt9mMKgnIN5TndBcu3Hx8V8NmBT6Id16oRgZ+riR/SX59QP/ +qDodtRZRfioZWO+sbz5LiD16tH/DQ1GH5mz5+lkCgYAqsrK66ih4BHuHyWxKlHMf +32CV20dMw+V/DFbzXab8g5vy5+2yM/YcP4rEgcanwgXprOtN4YhMABHk+SopNtp3 +B55lTy39UdUIUqscOPHogqAaBieEsITPQtqbG0JGNICTaKcxGfdVGHRgHPSp1d6y +RJHnGcwrBl3YTRPTrx54cQKBgDw2yia0BxtS1AwqxXkzuemYz7I7hpYLwKTDBhvL +X3OQANo8h0sgOrML408nI7fmr2Bpv954TYvWjfG168zwlxrTdveYN8XDvKzGCYnp +NO76B1tj9X/a5HRD1PXUT5SQwVVsdfbPwJTGn9i6RX/PrbV9SEwufcYiBEGP04hw +BRCpAoGAZum8xoGzenP3vyeyVHNglLnh8wR7eFYbWeYjJNOgzS7UW9AyYzHUXD4e +ShP9HtguST/Lu/k+8QUZtrNNml56e3IqrHRsZgxSREvGGIfW0QqfNRqXHsjSjs2M +c4PFxmXxn4/MkVxsswYS5rgv2vfjb47grVIK3JvHWpSzweC+p3A= +-----END RSA PRIVATE KEY----- diff --git a/enzevalos_iphone/myTestCA.p12 b/enzevalos_iphone/myTestCA.p12 new file mode 100644 index 0000000000000000000000000000000000000000..332c46bd7d0a41373ac384d3acec2fa50a0ae1c8 Binary files /dev/null and b/enzevalos_iphone/myTestCA.p12 differ diff --git a/enzevalos_iphone/myTestCA.pem b/enzevalos_iphone/myTestCA.pem new file mode 100644 index 0000000000000000000000000000000000000000..a4926a95839691753c1101b1f9be060f607d8c8a --- /dev/null +++ b/enzevalos_iphone/myTestCA.pem @@ -0,0 +1,45 @@ +-----BEGIN CERTIFICATE----- +MIIC5TCCAc0CCKtx6aDujfcTMA0GCSqGSIb3DQEBCwUAMDUxCzAJBgNVBAYTAkRF +MRMwEQYDVQQKDApBIE1BSUxURVNUMREwDwYDVQQDDAhteVRlc3RDQTAeFw0xOTA3 +MjkxNTM4MDRaFw0xOTA4MDUxNTM4MDRaMDUxCzAJBgNVBAYTAkRFMRMwEQYDVQQK +DApBIE1BSUxURVNUMREwDwYDVQQDDAhteVRlc3RDQTCCASIwDQYJKoZIhvcNAQEB +BQADggEPADCCAQoCggEBAKJOatbPDL3lw/7tqeugaRHxqMgx7/DOLdSnDnK66Eys +GrFcp43N3tQL+0rm77tz/jcyVkHAZF9Sv1c/tIZay/J975cbpHPMraJVbM+/mL6f +14wrwU4rAJLILDkZ3HqkKKnrGmfoKrB1RZ9LA+NLtQlfiuP4C8Et7bOZOkuGdq0T +aygotW0ELeQPbVWXV/GcP6Xd0FnKQF7m9ioRn9MKxu4VDm3hSKDtN1zyXQ1HXhQV +/UGODSaFyUgoCTnz7kFcF3hY9Dw7M55CCM3U0PnfxuxUdn8qMH1lym/G5K5xaVLV +fCjsly8GUUfHtls3Y0F7c6NE5CPkjub2HNNdCW+JD0ECAwEAATANBgkqhkiG9w0B +AQsFAAOCAQEAAAVXNPtXVaUP9k2wNZAw4hOKp5n0EdeOkmtMdedvuQF39d+cHJkL +HjyTp3zd22S1EbgFgNB6RPlRPXie4aivcDGSAGc88NF2xEOezbLZr30x/KAc94OG +ssKjin+X8aMoZSppUxVHI1j6gzydvEWhVBIRUjgd4F5uiV+TBOAOj39xGkpCXIBg +bLRdalYjzxWYb5cR5qniCVbKrRg2oQWghStEuuRTww9SQIeSerb0lqHF3gaL82pG +F4K1I0HbAXgq/D+xIj6lbqZlchI8a4qQq2Ic75yTP/3Nt/Ls6Dt17eT6O+tA9W4e +tag/vFWjhTwGBIjjvyrjTM3fwvUN3HIZeg== +-----END CERTIFICATE----- +-----BEGIN RSA PRIVATE KEY----- +MIIEogIBAAKCAQEAok5q1s8MveXD/u2p66BpEfGoyDHv8M4t1KcOcrroTKwasVyn +jc3e1Av7Subvu3P+NzJWQcBkX1K/Vz+0hlrL8n3vlxukc8ytolVsz7+Yvp/XjCvB +TisAksgsORnceqQoqesaZ+gqsHVFn0sD40u1CV+K4/gLwS3ts5k6S4Z2rRNrKCi1 +bQQt5A9tVZdX8Zw/pd3QWcpAXub2KhGf0wrG7hUObeFIoO03XPJdDUdeFBX9QY4N +JoXJSCgJOfPuQVwXeFj0PDsznkIIzdTQ+d/G7FR2fyowfWXKb8bkrnFpUtV8KOyX +LwZRR8e2WzdjQXtzo0TkI+SO5vYc010Jb4kPQQIDAQABAoH/N3mWCtW6BS4DT57r +9R1ezENM7SAkYqoWABkZVx2LSKmKdhS1MEKtZsyxl2hXiDqdKUCLOu4HYI1n2Opt +SX6/NqLUwVExZGMQ9es8xcU27/CyO7a4237XM1Q3yUyNj12MiIdS/zDbZnSu10NM +kOPPfOSrFEAzxFNua3Rz+Fx9M6pj/AazmGoVk2FvmHLgF/Zq8Oeixmozl3Or2COh +bDI5lvH/QgmhWpxIkrZ30leT7dQ/zEFMplT0U7d0XC7UQk1ybe0Jyn5iZiMG0iJt +q19duKO7I3Jt8VHO2yvKWv1LWuFXyPnEpgIdsuM31c5RgLmE1nMl9U1lbRWUY+o9 ++RchAoGBANTtuJuNizmrI4nX70rANi4BzE+ofMI8AcUhNuRfTFxBrnqjQvpqMBwB +FVZK2F0SuQjRd6l78OBIV1IjpwvA6A7il8RSuWjFQySojffBSxAMV7xgnyIo8FvM +8JeymEJBAI4KjrMwu1WGRQ1UDaU4aUdwWAlev+UHDMAYnaEG+7cpAoGBAMMjRpjJ +ML+WpaMx7OQb7hTZQBbXME3X10G486ykhmVy2eOnaIG7J35LyG0PDr/YrOP5lV+O +Z0HEzPc6eDeEdOTMQIzmfOQHvr48NgckrvEdaR4+NIx1YDf/Duxbk/XJpBOrVPUv +OKfEbPXoX2s2SykXOPbVYRERtK65TOruKZJZAoGBAKF8yY3wA69xBDr+8hUXQgAS +jQm9FyGYsR742dDKFffCOLn6KEoTTvluOOiBSycLlBoEA2UfAsiXFOLO91oKq/Te +FYxn0QaM1SdwTnugtXUuZzwPa6FUuzZkb/QdFyzob6tKhn+QbgOnGafKH6824WG0 +6o/wtEjW1+y4vpPp3+5BAoGAGMdn9YrGt+1nRxvV2vl4+AjGTKAysA/Sc7QKrUeP +EV7OMExXxvF/CFiTMNYSp2XaPnC4+RNaJU3aQSKZlWMqfMs6/yldfo9FN17p9WpB +FLkJWh/ICHX3K+Ulffn7BeD/Bshg12mRpiwZMfi59SFF1gfu4dkipEo9SVqaW9K2 +ULECgYEAjP0atGP49g/uaI1+YcVwtGa/NYZukKK/ocPBwA88/IqyWhBG3XiIDHfd +dYsZMyccBtupLSIQN11HLBn0MDMm7P8Y3on0/AHXRvkrfLU+k36BIvJw+QSoQ1O8 +k6si7AT83Tvcv8Z726AOYZU+7RE3x7xBbBojiHETgpgdx3Jikss= +-----END RSA PRIVATE KEY----- diff --git a/enzevalos_iphone/mykey.p12 b/enzevalos_iphone/mykey.p12 new file mode 100644 index 0000000000000000000000000000000000000000..9fe19637a2df4572446f6d4e299289230fcad3fb Binary files /dev/null and b/enzevalos_iphone/mykey.p12 differ diff --git a/enzevalos_iphone/mykey.pem b/enzevalos_iphone/mykey.pem new file mode 100644 index 0000000000000000000000000000000000000000..bf5b014354655a825076a4e2f971745ad8c0b302 --- /dev/null +++ b/enzevalos_iphone/mykey.pem @@ -0,0 +1,67 @@ +-----BEGIN CERTIFICATE----- +MIIDszCCApugAwIBAgIIrrDoToFHqvwwDQYJKoZIhvcNAQELBQAwNTELMAkGA1UE +BhMCREUxEzARBgNVBAoMCkEgTUFJTFRFU1QxETAPBgNVBAMMCG15VGVzdENBMB4X +DTE5MDcyOTE1MzgwOFoXDTE5MDgwNTE1MzgwOFowMjELMAkGA1UEBhMCREUxEzAR +BgNVBAoMCkEgTUFJTFRFU1QxDjAMBgNVBAMMBW15a2V5MIIBIjANBgkqhkiG9w0B +AQEFAAOCAQ8AMIIBCgKCAQEAqO18P2Qs4LIdPMkGMiT8C9Ik991WV8kB9E5YMGqk +RI8QH8ewFuX5PVR4IlBtB0HnM44WxXCSfc4Pez9BA2VUyHlGEBzJRcpZIYVoMmOg +NzfwS25IMznR+yiXne5vs5W3wGXT4C9GpIpn1YJWFh9Vbl1n+xD8RHPJVH1VHPPb +kZyE1WkDBWBtyAmpdQfpUj11zJBlmnNqmR/Lk11oJnM57QDHpeIFMsHcO5yehNBD +XR5ZprWrPszwrwcYDC9pcT8dT0SwInR2vqjxjrsjXs8cqtKkGzUXfw2GAxC46+md +rB9/Y8AxwHxC5pUh3c6KyQvkG9rOpYGt57rfSxHZmeQv1wIDAQABo4HJMIHGMCcG +A1UdEQQgMB6BHFNreWxlciA8cmV0c2V0QGRyZW5nZWxzLm5ldD4wKQYDVR0OBCIE +ILX9PcNFYmFQVHMCTvzTJkxVfFGrj0VMTIH+W6o2sjnhMHAGA1UdIwRpMGeAILLL +gvddqVj9AJE8CrP9PYeShvHigM+CczpLs9EYh+bkoTmkNzA1MQswCQYDVQQGEwJE +RTETMBEGA1UECgwKQSBNQUlMVEVTVDERMA8GA1UEAwwIbXlUZXN0Q0GCCKtx6aDu +jfcTMA0GCSqGSIb3DQEBCwUAA4IBAQBmociZ5gTiu7NtVPL/hybNoqMb4qZjgDlN +HW5ifOa5q19gK1zOuIyZt0ehB6UJNEj/JjeZJsk3/0iSvTnmtTAzL2HjYt3XQ9nY +2KFaOq8VcvMCMZRilqc0UdgYAXlA0b2qW4PKWhX0mLgMTC9XA/NoDiX1YMB/N+97 +wXE9JsJYjClaY4npi7TfeOV0AxSxGlumBi8KZd5R32QT53IdCjdeWtpHEAW/ecv+ +Y1xb0AAraqWHAXYTCxzNLnSe4h/Y+g0oFLWRGsPvYCmZLTamUsUQSzvAm1YVVy9w +gyjVbZRSXX3jIvrsISSp8SSJw7obLvVjgr4j+yhL1oCnJb4IY+/w +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIC5TCCAc0CCKtx6aDujfcTMA0GCSqGSIb3DQEBCwUAMDUxCzAJBgNVBAYTAkRF +MRMwEQYDVQQKDApBIE1BSUxURVNUMREwDwYDVQQDDAhteVRlc3RDQTAeFw0xOTA3 +MjkxNTM4MDRaFw0xOTA4MDUxNTM4MDRaMDUxCzAJBgNVBAYTAkRFMRMwEQYDVQQK +DApBIE1BSUxURVNUMREwDwYDVQQDDAhteVRlc3RDQTCCASIwDQYJKoZIhvcNAQEB +BQADggEPADCCAQoCggEBAKJOatbPDL3lw/7tqeugaRHxqMgx7/DOLdSnDnK66Eys +GrFcp43N3tQL+0rm77tz/jcyVkHAZF9Sv1c/tIZay/J975cbpHPMraJVbM+/mL6f +14wrwU4rAJLILDkZ3HqkKKnrGmfoKrB1RZ9LA+NLtQlfiuP4C8Et7bOZOkuGdq0T +aygotW0ELeQPbVWXV/GcP6Xd0FnKQF7m9ioRn9MKxu4VDm3hSKDtN1zyXQ1HXhQV +/UGODSaFyUgoCTnz7kFcF3hY9Dw7M55CCM3U0PnfxuxUdn8qMH1lym/G5K5xaVLV +fCjsly8GUUfHtls3Y0F7c6NE5CPkjub2HNNdCW+JD0ECAwEAATANBgkqhkiG9w0B +AQsFAAOCAQEAAAVXNPtXVaUP9k2wNZAw4hOKp5n0EdeOkmtMdedvuQF39d+cHJkL +HjyTp3zd22S1EbgFgNB6RPlRPXie4aivcDGSAGc88NF2xEOezbLZr30x/KAc94OG +ssKjin+X8aMoZSppUxVHI1j6gzydvEWhVBIRUjgd4F5uiV+TBOAOj39xGkpCXIBg +bLRdalYjzxWYb5cR5qniCVbKrRg2oQWghStEuuRTww9SQIeSerb0lqHF3gaL82pG +F4K1I0HbAXgq/D+xIj6lbqZlchI8a4qQq2Ic75yTP/3Nt/Ls6Dt17eT6O+tA9W4e +tag/vFWjhTwGBIjjvyrjTM3fwvUN3HIZeg== +-----END CERTIFICATE----- +-----BEGIN RSA PRIVATE KEY----- +MIIEpAIBAAKCAQEAqO18P2Qs4LIdPMkGMiT8C9Ik991WV8kB9E5YMGqkRI8QH8ew +FuX5PVR4IlBtB0HnM44WxXCSfc4Pez9BA2VUyHlGEBzJRcpZIYVoMmOgNzfwS25I +MznR+yiXne5vs5W3wGXT4C9GpIpn1YJWFh9Vbl1n+xD8RHPJVH1VHPPbkZyE1WkD +BWBtyAmpdQfpUj11zJBlmnNqmR/Lk11oJnM57QDHpeIFMsHcO5yehNBDXR5ZprWr +PszwrwcYDC9pcT8dT0SwInR2vqjxjrsjXs8cqtKkGzUXfw2GAxC46+mdrB9/Y8Ax +wHxC5pUh3c6KyQvkG9rOpYGt57rfSxHZmeQv1wIDAQABAoIBABdIN/Yir96+HbJ5 +gE2b9FMKwQaabmKF9St/Or9di0tZrl667mWRh6Lwx+fuzsAP0LY10KSgqcgGBPM3 +GhZGOoOw1zu0Q/dG9rbchKphOb0yi/9RcUkCIJMtmovtR17odR1iy2tcCK/31WzD +XGsLIYKnBARB6IrkrGxlI7xsTahJQWDZ+1GM4rWA2BwNvFa4WhJAEJYJOxYc65TJ +Gsb8yAdUtNprIZGAZ4Mxzv3ds1EDHQ52DKLgKsZVaw3m0eLaj9x0rysU/bghgs5z +g5VYZuiWBeXIFsR8q81BNhoWSrNZ5Njq7zpVyiiHs6Cwf6xCGSeLtcuWrRekw/at +mg+rvH0CgYEA0EdWoP3JHwrTRLwDgtiS7DdS/ZM/pD6LElEg+ppUNLjMaqALwMjU +FqApE3DLnYlYtJ04pWB1554Ee/YdB6KatwkRVb9wR0+5asnq8SMtBCH7wp5MgC/D +zo1PLSdDyeew4xCdoAlRqNb/ZhP6hK1fuSsrRfDPLUwLDfXmfg70t+MCgYEAz6IA +EbFs30I0zZdkx9iFkjIxzg6MTEKwOWM08Z5xU0iBR1LJRdO+qrxyVV1u04XY8ZZC +tM/vAGErnBdhDTN8Hoo0x+SiaSJnzEPDOo4qcUYjYGjM218BYSHObnfX/A0ynnSr +f/rYyuKfxr7mFOjY82K1s/KKYQanZaYDarKw4n0CgYEAzBsc6efKkIErSNB3IGLc +mGAfFCCY3XvtDaYzi2Jx4ri2mkb9PY+RSBrsJgEDiP5vz4/DU02UPca83j3xdOoE +dBqOwlk4zqlyKxR1CJpQIxyqe65liblFScVxMe6on9RNpDdEQPDg9XS8FGy/tAWz +KOMFJSU34kwDCUtQ9XfymcECgYEAxj7ZbgtH9ksSe5IniaC0uAfxAdtmHZI3DDQq +4t/zOB+sP9tNjbxE+mP/jn4tSQ0tPE3J1zYJ7wTYTKsN4TrdMZOoHYuxfkx5atDw +YMJIx+q98Flf77zgZkuO/G607FX1lNG0xfdOczi6cVrn9+Ly8j+3Wd8kPMvLnQRL +kt6WgUkCgYB+AnfU4WznrX7bV7wr34byedw3aZtNzwCfNlc1f5PBQ6vk+VLCN2uz +P/2pLfs+mwbdVooDtfcfDSHuAP1d50EUHabXG97eRh+brncBjVo1gbGmzdI72XHL +8gnwRYIz0mbuPxMnMFgYNtB9+yOPZvREwUma2FAKEC6woZxCqPsQhA== +-----END RSA PRIVATE KEY----- diff --git a/enzevalos_iphone/otherkey1.p12 b/enzevalos_iphone/otherkey1.p12 new file mode 100644 index 0000000000000000000000000000000000000000..ff511fa46dfbade8fef6bb9dac3ac066400cb7e4 Binary files /dev/null and b/enzevalos_iphone/otherkey1.p12 differ diff --git a/enzevalos_iphone/otherkey1.pem b/enzevalos_iphone/otherkey1.pem new file mode 100644 index 0000000000000000000000000000000000000000..8d70f06536108a4117ed1774289bc1158d22a7cb --- /dev/null +++ b/enzevalos_iphone/otherkey1.pem @@ -0,0 +1,67 @@ +-----BEGIN CERTIFICATE----- +MIIDsDCCApigAwIBAgIIAUuththJ3rkwDQYJKoZIhvcNAQELBQAwNTELMAkGA1UE +BhMCREUxEzARBgNVBAoMCkEgTUFJTFRFU1QxETAPBgNVBAMMCG15VGVzdENBMB4X +DTE5MDczMDE0MTM0MloXDTE5MDgwNjE0MTM0MlowNjELMAkGA1UEBhMCREUxEzAR +BgNVBAoMCkEgTUFJTFRFU1QxEjAQBgNVBAMMCW90aGVya2V5MTCCASIwDQYJKoZI +hvcNAQEBBQADggEPADCCAQoCggEBAOaXgg4cD8V2Fg/n6v/YuHsOTa7vlrSragOa +eVwcYzAATRIQAP6suakRkr5D2a3u2N+EBOawCvZPeQZwZMtKpnEdIKdkmUi/OYMS +y6D7xRL/MizwsNP/YvRfwByPmYRo30YCwLeJEEIlPDw5zwfIiqyl31mOrx+5eebv +t83TCJzU7ORZv/OqFEwGt4FcWk8FydmOJxW3My3A2GUWPOmnrvOGamRoKkN/O7xO +9qaQSkRWhuyb6R3EIDo0WfsM263aEhbVHOsCk7PAtzgW18+3qvK5ZrENk3B+F3+2 +fh1Qola266kX6/ZbB+/eOPJlWBh2NZHhBZ+Z/wr69tCSTJ80au0CAwEAAaOBwjCB +vzAgBgNVHREEGTAXgRVvdGhlcmFjY0BkcmVuZ2Vscy5uZXQwKQYDVR0OBCIEIGAb +47YtbmauxZ5hYka1/wYF9xh8+pJ+Zc0eRqkrgbeNMHAGA1UdIwRpMGeAILLLgvdd +qVj9AJE8CrP9PYeShvHigM+CczpLs9EYh+bkoTmkNzA1MQswCQYDVQQGEwJERTET +MBEGA1UECgwKQSBNQUlMVEVTVDERMA8GA1UEAwwIbXlUZXN0Q0GCCKtx6aDujfcT +MA0GCSqGSIb3DQEBCwUAA4IBAQCaaBwEyegcUwTsHFiZGq64tvhRBNdiaXIGZk64 ++Jw+FyfgcMp80VIhAdKuPtodtMWRQFl6F7xI3Gkvhosv73jWSwl05iGvxFWN0wNr +N2nZ8JPCHNqQQkuGaHEM3B591EifrswGLhIaoSihHIBFlBx6e0fgBmSTHYbx9usI +XyjDyGWkq0z72KGjifqow6zZKDFeX2Br3K1hP2V2ObnVkL+Arj+lBConkD+Ja9fa +vfbCKFRMmniHBSKcaTdHu/yzFaS8zGdWaMXIVzidPrIpqiv4KC2iVWqizZX3u6ej +nVDuRRggGA08TMPaJa3ziQo+zcjFkeHyd+7vw1w7ogSPlwx8 +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIC5TCCAc0CCKtx6aDujfcTMA0GCSqGSIb3DQEBCwUAMDUxCzAJBgNVBAYTAkRF +MRMwEQYDVQQKDApBIE1BSUxURVNUMREwDwYDVQQDDAhteVRlc3RDQTAeFw0xOTA3 +MjkxNTM4MDRaFw0xOTA4MDUxNTM4MDRaMDUxCzAJBgNVBAYTAkRFMRMwEQYDVQQK +DApBIE1BSUxURVNUMREwDwYDVQQDDAhteVRlc3RDQTCCASIwDQYJKoZIhvcNAQEB +BQADggEPADCCAQoCggEBAKJOatbPDL3lw/7tqeugaRHxqMgx7/DOLdSnDnK66Eys +GrFcp43N3tQL+0rm77tz/jcyVkHAZF9Sv1c/tIZay/J975cbpHPMraJVbM+/mL6f +14wrwU4rAJLILDkZ3HqkKKnrGmfoKrB1RZ9LA+NLtQlfiuP4C8Et7bOZOkuGdq0T +aygotW0ELeQPbVWXV/GcP6Xd0FnKQF7m9ioRn9MKxu4VDm3hSKDtN1zyXQ1HXhQV +/UGODSaFyUgoCTnz7kFcF3hY9Dw7M55CCM3U0PnfxuxUdn8qMH1lym/G5K5xaVLV +fCjsly8GUUfHtls3Y0F7c6NE5CPkjub2HNNdCW+JD0ECAwEAATANBgkqhkiG9w0B +AQsFAAOCAQEAAAVXNPtXVaUP9k2wNZAw4hOKp5n0EdeOkmtMdedvuQF39d+cHJkL +HjyTp3zd22S1EbgFgNB6RPlRPXie4aivcDGSAGc88NF2xEOezbLZr30x/KAc94OG +ssKjin+X8aMoZSppUxVHI1j6gzydvEWhVBIRUjgd4F5uiV+TBOAOj39xGkpCXIBg +bLRdalYjzxWYb5cR5qniCVbKrRg2oQWghStEuuRTww9SQIeSerb0lqHF3gaL82pG +F4K1I0HbAXgq/D+xIj6lbqZlchI8a4qQq2Ic75yTP/3Nt/Ls6Dt17eT6O+tA9W4e +tag/vFWjhTwGBIjjvyrjTM3fwvUN3HIZeg== +-----END CERTIFICATE----- +-----BEGIN RSA PRIVATE KEY----- +MIIEpAIBAAKCAQEA5peCDhwPxXYWD+fq/9i4ew5Nru+WtKtqA5p5XBxjMABNEhAA +/qy5qRGSvkPZre7Y34QE5rAK9k95BnBky0qmcR0gp2SZSL85gxLLoPvFEv8yLPCw +0/9i9F/AHI+ZhGjfRgLAt4kQQiU8PDnPB8iKrKXfWY6vH7l55u+3zdMInNTs5Fm/ +86oUTAa3gVxaTwXJ2Y4nFbczLcDYZRY86aeu84ZqZGgqQ387vE72ppBKRFaG7Jvp +HcQgOjRZ+wzbrdoSFtUc6wKTs8C3OBbXz7eq8rlmsQ2TcH4Xf7Z+HVCiVrbrqRfr +9lsH79448mVYGHY1keEFn5n/Cvr20JJMnzRq7QIDAQABAoIBADUXMwFuoo7zFjdJ +TUjkq+zhKS+ayBcG1FzKByEXBBs8JoJ/HsuEFyb+/ctCse6i7Fnh+oLmi0+UkqfR +3tMTd+jZLPh9Z/Fg3av4+tswvHoYOYQxUnUs+qqLFR8+TLk4sBddcOOQ8iZYjlrL +cIg5OvxvIFJtUJK8UH3EOYxxBy2cRHw44Fg54E0CpI3LDympYUnkT6YBB+MddqF5 +mvo85XO2WoN6m+JbVvS/jDBEI707ggAjKqHoomyzEQB0lrvksPtYfUuhGqfFRrdY +nHAfH4Nxrv4FB61GldyNBphQFpMYEtOwSGLSXEaMzHPrmaAegQminJBuQaODKCeh +IVht6d0CgYEA/6CyWfkHRRmAV/hm1fndZLcZ3oN2JIJjznZbB0R1IuaXTl7kbXvA +mdEeLD9OJayhbSIkpBSs7g8NsHPqcew4gR1lm6WhSvNg6qCg5ahLj3siyrsL3k/P +jHAb6qa68L2kc5HhI29nZ3Iqt4hL/IsWD9UoRS3zRu13A4V68MWRbMMCgYEA5u16 +OamANO1sXyeDTXPOX9HSVXXKZiBsQvkpT6x+tnSIHzsgBaZaDX+myk4B5IF19191 +X5YFzNeIw8PykNZ9+UfchIJvEp11l5z8cGcNYBXCTmW+j62y4llFqKGMS+aP1Q0r +E1QXhnvRE8SYRWHoDzQ4HLRQT2exuvPum1yCDo8CgYEAsveTxnAWCee3tl8/yBE+ +UjPrFaEeRqNPMw4j3uurwrqENiczb/9TMZ15rWrI0JGTFu/vjTy4cZbyc5ZEDmxe +hu7I43bLfMj2Em5RF1iDRjnkeuEHhyaDXYRj1x3SBZgQGaWJZSCq2X7Rr1rqMC5E +TONkZUKtbvvz9fAuyYDYtrcCgYEAsed4Bx4/SAc1OyVcsXmrHwStjusdD4qg/QOp +QNk6EWQ7ThwlslSTAd066JYqPRlDgV0INqiENWhC09aMc+rayAYFrAw0d9nYswHd +NNcfZcu9ktotcdE2g8yUrrIuPHcWjeMEMXLSYOfYjesiCCnCNpxbMjnzuQjA0q+E +PiqJg58CgYAFvkmTfr8Wp3SqmQmw5TuNaRLr1IVk/cMcFjXE3AOFcPuPnYIlJ+L6 +iwxRK85BnWBVkQIMvxrbb2Ro04buiizELRoKsDdkSdYXFSmSOvw1pvT8IpNJjNRU +AYIHvW6qRLTsSR6BZZS3pqGXYue7fE0vj4HJ2IEpj05qQ5RXrD57Wg== +-----END RSA PRIVATE KEY----- diff --git a/enzevalos_iphoneTests/CoreDataTests.swift b/enzevalos_iphoneTests/CoreDataTests.swift index 1386de55de99d70db3269cc90691135afb542dc4..9d041ae6345f5180efbaa42cd7883e68aaf7cdf2 100644 --- a/enzevalos_iphoneTests/CoreDataTests.swift +++ b/enzevalos_iphoneTests/CoreDataTests.swift @@ -104,52 +104,6 @@ class CoraDataTests: XCTestCase { } } - // Generate a test secret key - func testkey() -> (String){ - let testsender = createUser() - let testkeyID = pgp.generateKey(adr: testsender.mailbox, new: true) - return testkeyID - - } - - // Test decryption of all undecrypted mails with new secret key - func testfindMailForSecretKey() { - let testkeyID = testkey() - let swiftpgp = SwiftPGP() - - // E-Mail generieren - guard let from = MCOAddress(mailbox: "sender@example.com") else { - return - } - - // Create test Mail - guard let m1 = testMail(from: from, to: [user], cc: [], bcc: []) else { - XCTFail("No test mail") - return - } - - // Create Ciphertext - let body = "encrypted text" - let senderPGP = SwiftPGP() - let encryptedObject = senderPGP.encrypt(plaintext: body, ids: [testkeyID], myId: "") - XCTAssert(encryptedObject.encryptionState == .ValidedEncryptedWithCurrentKey && encryptedObject.signatureState == .NoSignature) - - guard let cipher = encryptedObject.chiperString else { - XCTFail("No chipher data") - return - } - - // Change Mail - m1.unableToDecrypt = true - m1.body = cipher - - datahandler.save(during: "") - - swiftpgp.findMailForSecretKey(keyID: testkeyID) - XCTAssertEqual(m1.body, "encrypted text") - XCTAssertFalse(m1.unableToDecrypt) - } - func createUser(adr: String = String.random().lowercased(), name: String = String.random()) -> MCOAddress { return MCOAddress.init(displayName: name, mailbox: adr.lowercased()) } diff --git a/enzevalos_iphoneTests/CryptoTests.swift b/enzevalos_iphoneTests/CryptoTests.swift index 06cbf1c028d152034c6a43823869733a5ea7082e..36805bf17cc7220add86308c03f96fe706b61ca8 100644 --- a/enzevalos_iphoneTests/CryptoTests.swift +++ b/enzevalos_iphoneTests/CryptoTests.swift @@ -610,7 +610,54 @@ class CryptoTests: XCTestCase { return mail } - // Not finished yet + /** + Generate a test secret key + */ + func testkey() -> (String){ + let testsender = createUser() + let testkeyID = pgp.generateKey(adr: testsender.mailbox, new: true) + return testkeyID + } + + func testfindMailForSecretKey() { + let testkeyID = testkey() + + // E-Mail generieren + guard let from = MCOAddress(mailbox: "sender@example.com") else { + return + } + + // Create test Mail + guard let m1 = testMail(from: from, to: [user], cc: [], bcc: []) else { + XCTFail("No test mail") + return + } + + // Create Ciphertext + let body = "encrypted text" + let senderPGP = SwiftPGP() + let encryptedObject = senderPGP.encrypt(plaintext: body, ids: [testkeyID], myId: "") + XCTAssert(encryptedObject.encryptionState == .ValidedEncryptedWithCurrentKey && encryptedObject.signatureState == .NoSignature) + + guard let cipher = encryptedObject.chiperString else { + XCTFail("No chipher data") + return + } + + // Change Mail + m1.unableToDecrypt = true + m1.body = cipher + + datahandler.save(during: "") + + pgp.findMailForSecretKey(keyID: testkeyID) + XCTAssertEqual(m1.body, "encrypted text") + XCTAssertFalse(m1.unableToDecrypt) + } + + /* + !!!!! Not finished yet !!!!! + */ func testfindNotSignedMailForPublicKey() { // E-Mail generieren guard let from = MCOAddress(mailbox: "alice@example.com") else { @@ -630,7 +677,7 @@ class CryptoTests: XCTestCase { XCTFail("No signed data") return } - guard let publickey = pgp.loadKey(id: mail.firstKey!.keyID)?.publicKey, keys.count > 0 else { + guard let _ = pgp.loadKey(id: mail.firstKey!.keyID)?.publicKey, keys.count > 0 else { XCTFail("Can not load key") return } diff --git a/enzevalos_iphoneTests/GeneratedMocks.swift b/enzevalos_iphoneTests/GeneratedMocks.swift index 9cfc4fa4db421e9f24f4f0bb26c389574a04d134..3bd98d151c146b68fd67fa6aef4f7e66adfcd6ce 100644 --- a/enzevalos_iphoneTests/GeneratedMocks.swift +++ b/enzevalos_iphoneTests/GeneratedMocks.swift @@ -1,4 +1,4 @@ -// MARK: - Mocks generated from file: enzevalos_iphone/AuthenticationModel.swift at 2020-03-24 10:15:44 +0000 +// MARK: - Mocks generated from file: enzevalos_iphone/AuthenticationModel.swift at 2020-04-03 07:21:06 +0000 // // AuthenticationModel.swift @@ -653,7 +653,7 @@ import Foundation } -// MARK: - Mocks generated from file: enzevalos_iphone/AuthenticationViewModel.swift at 2020-03-24 10:15:44 +0000 +// MARK: - Mocks generated from file: enzevalos_iphone/AuthenticationViewModel.swift at 2020-04-03 07:21:06 +0000 // // AuthenticationViewModel.swift diff --git a/enzevalos_iphoneTests/GeneratedMocks.swift.orig b/enzevalos_iphoneTests/GeneratedMocks.swift.orig new file mode 100644 index 0000000000000000000000000000000000000000..cf5117324baf4c1b1874e58c100e08795b5a9c59 --- /dev/null +++ b/enzevalos_iphoneTests/GeneratedMocks.swift.orig @@ -0,0 +1,1094 @@ +<<<<<<< HEAD +// MARK: - Mocks generated from file: enzevalos_iphone/AuthenticationModel.swift at 2020-03-31 15:54:34 +0000 +======= +// MARK: - Mocks generated from file: enzevalos_iphone/AuthenticationModel.swift at 2020-03-18 15:11:52 +0000 +>>>>>>> dev + +// +// AuthenticationModel.swift +// enzevalos_iphone +// +// Created by SWP Usable Security für Smartphones on 10.03.20. +// Copyright © 2020 fu-berlin. All rights reserved. +// +import Cuckoo +@testable import enzevalos_iphone + +import Combine +import Foundation + + + class MockAuthenticationModel: AuthenticationModel, Cuckoo.ClassMock { + + typealias MocksType = AuthenticationModel + + typealias Stubbing = __StubbingProxy_AuthenticationModel + typealias Verification = __VerificationProxy_AuthenticationModel + + let cuckoo_manager = Cuckoo.MockManager.preconfiguredManager ?? Cuckoo.MockManager(hasParent: true) + + + private var __defaultImplStub: AuthenticationModel? + + func enableDefaultImplementation(_ stub: AuthenticationModel) { + __defaultImplStub = stub + cuckoo_manager.enableDefaultStubImplementation() + } + + + + + + override var extendedValidation: Bool { + get { + return cuckoo_manager.getter("extendedValidation", + superclassCall: + + super.extendedValidation + , + defaultCall: __defaultImplStub!.extendedValidation) + } + + set { + cuckoo_manager.setter("extendedValidation", + value: newValue, + superclassCall: + + super.extendedValidation = newValue + , + defaultCall: __defaultImplStub!.extendedValidation = newValue) + } + + } + + + + override var imapCallback: AuthenticationCallback? { + get { + return cuckoo_manager.getter("imapCallback", + superclassCall: + + super.imapCallback + , + defaultCall: __defaultImplStub!.imapCallback) + } + + set { + cuckoo_manager.setter("imapCallback", + value: newValue, + superclassCall: + + super.imapCallback = newValue + , + defaultCall: __defaultImplStub!.imapCallback = newValue) + } + + } + + + + override var smtpCallback: AuthenticationCallback? { + get { + return cuckoo_manager.getter("smtpCallback", + superclassCall: + + super.smtpCallback + , + defaultCall: __defaultImplStub!.smtpCallback) + } + + set { + cuckoo_manager.setter("smtpCallback", + value: newValue, + superclassCall: + + super.smtpCallback = newValue + , + defaultCall: __defaultImplStub!.smtpCallback = newValue) + } + + } + + + + override var imapConfigurationSuccessful: Bool { + get { + return cuckoo_manager.getter("imapConfigurationSuccessful", + superclassCall: + + super.imapConfigurationSuccessful + , + defaultCall: __defaultImplStub!.imapConfigurationSuccessful) + } + + set { + cuckoo_manager.setter("imapConfigurationSuccessful", + value: newValue, + superclassCall: + + super.imapConfigurationSuccessful = newValue + , + defaultCall: __defaultImplStub!.imapConfigurationSuccessful = newValue) + } + + } + + + + override var smtpConfigurationSuccessful: Bool { + get { + return cuckoo_manager.getter("smtpConfigurationSuccessful", + superclassCall: + + super.smtpConfigurationSuccessful + , + defaultCall: __defaultImplStub!.smtpConfigurationSuccessful) + } + + set { + cuckoo_manager.setter("smtpConfigurationSuccessful", + value: newValue, + superclassCall: + + super.smtpConfigurationSuccessful = newValue + , + defaultCall: __defaultImplStub!.smtpConfigurationSuccessful = newValue) + } + + } + + + + override var dispatchGroup: DispatchGroup { + get { + return cuckoo_manager.getter("dispatchGroup", + superclassCall: + + super.dispatchGroup + , + defaultCall: __defaultImplStub!.dispatchGroup) + } + + set { + cuckoo_manager.setter("dispatchGroup", + value: newValue, + superclassCall: + + super.dispatchGroup = newValue + , + defaultCall: __defaultImplStub!.dispatchGroup = newValue) + } + + } + + + + + + + + override func checkConfig(mailAccount: MailAccount, extendedValidation: Bool) -> Future<AuthenticationResult, Never> { + + return cuckoo_manager.call("checkConfig(mailAccount: MailAccount, extendedValidation: Bool) -> Future<AuthenticationResult, Never>", + parameters: (mailAccount, extendedValidation), + escapingParameters: (mailAccount, extendedValidation), + superclassCall: + + super.checkConfig(mailAccount: mailAccount, extendedValidation: extendedValidation) + , + defaultCall: __defaultImplStub!.checkConfig(mailAccount: mailAccount, extendedValidation: extendedValidation)) + + } + + + + override func checkIMAPConfig(mailAccount: MailAccount, _ callback: AuthenticationCallback) { + + return cuckoo_manager.call("checkIMAPConfig(mailAccount: MailAccount, _: AuthenticationCallback)", + parameters: (mailAccount, callback), + escapingParameters: (mailAccount, callback), + superclassCall: + + super.checkIMAPConfig(mailAccount: mailAccount, callback) + , + defaultCall: __defaultImplStub!.checkIMAPConfig(mailAccount: mailAccount, callback)) + + } + + + + override func checkSMTPConfig(mailAccount: MailAccount, _ callback: AuthenticationCallback) { + + return cuckoo_manager.call("checkSMTPConfig(mailAccount: MailAccount, _: AuthenticationCallback)", + parameters: (mailAccount, callback), + escapingParameters: (mailAccount, callback), + superclassCall: + + super.checkSMTPConfig(mailAccount: mailAccount, callback) + , + defaultCall: __defaultImplStub!.checkSMTPConfig(mailAccount: mailAccount, callback)) + + } + + + + override func onTimeout(timeoutResult: DispatchTimeoutResult) -> AuthenticationResult { + + return cuckoo_manager.call("onTimeout(timeoutResult: DispatchTimeoutResult) -> AuthenticationResult", + parameters: (timeoutResult), + escapingParameters: (timeoutResult), + superclassCall: + + super.onTimeout(timeoutResult: timeoutResult) + , + defaultCall: __defaultImplStub!.onTimeout(timeoutResult: timeoutResult)) + + } + + + + override func onImapCompleted(imapWorks: Bool, _ login: String, _ password: String) { + + return cuckoo_manager.call("onImapCompleted(imapWorks: Bool, _: String, _: String)", + parameters: (imapWorks, login, password), + escapingParameters: (imapWorks, login, password), + superclassCall: + + super.onImapCompleted(imapWorks: imapWorks, login, password) + , + defaultCall: __defaultImplStub!.onImapCompleted(imapWorks: imapWorks, login, password)) + + } + + + + override func onSmtpCompleted(smtpWorks: Bool, _ login: String, _ password: String) { + + return cuckoo_manager.call("onSmtpCompleted(smtpWorks: Bool, _: String, _: String)", + parameters: (smtpWorks, login, password), + escapingParameters: (smtpWorks, login, password), + superclassCall: + + super.onSmtpCompleted(smtpWorks: smtpWorks, login, password) + , + defaultCall: __defaultImplStub!.onSmtpCompleted(smtpWorks: smtpWorks, login, password)) + + } + + + struct __StubbingProxy_AuthenticationModel: Cuckoo.StubbingProxy { + private let cuckoo_manager: Cuckoo.MockManager + + init(manager: Cuckoo.MockManager) { + self.cuckoo_manager = manager + } + + + var extendedValidation: Cuckoo.ClassToBeStubbedProperty<MockAuthenticationModel, Bool> { + return .init(manager: cuckoo_manager, name: "extendedValidation") + } + + + var imapCallback: Cuckoo.ClassToBeStubbedOptionalProperty<MockAuthenticationModel, AuthenticationCallback> { + return .init(manager: cuckoo_manager, name: "imapCallback") + } + + + var smtpCallback: Cuckoo.ClassToBeStubbedOptionalProperty<MockAuthenticationModel, AuthenticationCallback> { + return .init(manager: cuckoo_manager, name: "smtpCallback") + } + + + var imapConfigurationSuccessful: Cuckoo.ClassToBeStubbedProperty<MockAuthenticationModel, Bool> { + return .init(manager: cuckoo_manager, name: "imapConfigurationSuccessful") + } + + + var smtpConfigurationSuccessful: Cuckoo.ClassToBeStubbedProperty<MockAuthenticationModel, Bool> { + return .init(manager: cuckoo_manager, name: "smtpConfigurationSuccessful") + } + + + var dispatchGroup: Cuckoo.ClassToBeStubbedProperty<MockAuthenticationModel, DispatchGroup> { + return .init(manager: cuckoo_manager, name: "dispatchGroup") + } + + + func checkConfig<M1: Cuckoo.Matchable, M2: Cuckoo.Matchable>(mailAccount: M1, extendedValidation: M2) -> Cuckoo.ClassStubFunction<(MailAccount, Bool), Future<AuthenticationResult, Never>> where M1.MatchedType == MailAccount, M2.MatchedType == Bool { + let matchers: [Cuckoo.ParameterMatcher<(MailAccount, Bool)>] = [wrap(matchable: mailAccount) { $0.0 }, wrap(matchable: extendedValidation) { $0.1 }] + return .init(stub: cuckoo_manager.createStub(for: MockAuthenticationModel.self, method: "checkConfig(mailAccount: MailAccount, extendedValidation: Bool) -> Future<AuthenticationResult, Never>", parameterMatchers: matchers)) + } + + func checkIMAPConfig<M1: Cuckoo.Matchable, M2: Cuckoo.Matchable>(mailAccount: M1, _ callback: M2) -> Cuckoo.ClassStubNoReturnFunction<(MailAccount, AuthenticationCallback)> where M1.MatchedType == MailAccount, M2.MatchedType == AuthenticationCallback { + let matchers: [Cuckoo.ParameterMatcher<(MailAccount, AuthenticationCallback)>] = [wrap(matchable: mailAccount) { $0.0 }, wrap(matchable: callback) { $0.1 }] + return .init(stub: cuckoo_manager.createStub(for: MockAuthenticationModel.self, method: "checkIMAPConfig(mailAccount: MailAccount, _: AuthenticationCallback)", parameterMatchers: matchers)) + } + + func checkSMTPConfig<M1: Cuckoo.Matchable, M2: Cuckoo.Matchable>(mailAccount: M1, _ callback: M2) -> Cuckoo.ClassStubNoReturnFunction<(MailAccount, AuthenticationCallback)> where M1.MatchedType == MailAccount, M2.MatchedType == AuthenticationCallback { + let matchers: [Cuckoo.ParameterMatcher<(MailAccount, AuthenticationCallback)>] = [wrap(matchable: mailAccount) { $0.0 }, wrap(matchable: callback) { $0.1 }] + return .init(stub: cuckoo_manager.createStub(for: MockAuthenticationModel.self, method: "checkSMTPConfig(mailAccount: MailAccount, _: AuthenticationCallback)", parameterMatchers: matchers)) + } + + func onTimeout<M1: Cuckoo.Matchable>(timeoutResult: M1) -> Cuckoo.ClassStubFunction<(DispatchTimeoutResult), AuthenticationResult> where M1.MatchedType == DispatchTimeoutResult { + let matchers: [Cuckoo.ParameterMatcher<(DispatchTimeoutResult)>] = [wrap(matchable: timeoutResult) { $0 }] + return .init(stub: cuckoo_manager.createStub(for: MockAuthenticationModel.self, method: "onTimeout(timeoutResult: DispatchTimeoutResult) -> AuthenticationResult", parameterMatchers: matchers)) + } + + func onImapCompleted<M1: Cuckoo.Matchable, M2: Cuckoo.Matchable, M3: Cuckoo.Matchable>(imapWorks: M1, _ login: M2, _ password: M3) -> Cuckoo.ClassStubNoReturnFunction<(Bool, String, String)> where M1.MatchedType == Bool, M2.MatchedType == String, M3.MatchedType == String { + let matchers: [Cuckoo.ParameterMatcher<(Bool, String, String)>] = [wrap(matchable: imapWorks) { $0.0 }, wrap(matchable: login) { $0.1 }, wrap(matchable: password) { $0.2 }] + return .init(stub: cuckoo_manager.createStub(for: MockAuthenticationModel.self, method: "onImapCompleted(imapWorks: Bool, _: String, _: String)", parameterMatchers: matchers)) + } + + func onSmtpCompleted<M1: Cuckoo.Matchable, M2: Cuckoo.Matchable, M3: Cuckoo.Matchable>(smtpWorks: M1, _ login: M2, _ password: M3) -> Cuckoo.ClassStubNoReturnFunction<(Bool, String, String)> where M1.MatchedType == Bool, M2.MatchedType == String, M3.MatchedType == String { + let matchers: [Cuckoo.ParameterMatcher<(Bool, String, String)>] = [wrap(matchable: smtpWorks) { $0.0 }, wrap(matchable: login) { $0.1 }, wrap(matchable: password) { $0.2 }] + return .init(stub: cuckoo_manager.createStub(for: MockAuthenticationModel.self, method: "onSmtpCompleted(smtpWorks: Bool, _: String, _: String)", parameterMatchers: matchers)) + } + + } + + struct __VerificationProxy_AuthenticationModel: Cuckoo.VerificationProxy { + private let cuckoo_manager: Cuckoo.MockManager + private let callMatcher: Cuckoo.CallMatcher + private let sourceLocation: Cuckoo.SourceLocation + + init(manager: Cuckoo.MockManager, callMatcher: Cuckoo.CallMatcher, sourceLocation: Cuckoo.SourceLocation) { + self.cuckoo_manager = manager + self.callMatcher = callMatcher + self.sourceLocation = sourceLocation + } + + + + var extendedValidation: Cuckoo.VerifyProperty<Bool> { + return .init(manager: cuckoo_manager, name: "extendedValidation", callMatcher: callMatcher, sourceLocation: sourceLocation) + } + + + var imapCallback: Cuckoo.VerifyOptionalProperty<AuthenticationCallback> { + return .init(manager: cuckoo_manager, name: "imapCallback", callMatcher: callMatcher, sourceLocation: sourceLocation) + } + + + var smtpCallback: Cuckoo.VerifyOptionalProperty<AuthenticationCallback> { + return .init(manager: cuckoo_manager, name: "smtpCallback", callMatcher: callMatcher, sourceLocation: sourceLocation) + } + + + var imapConfigurationSuccessful: Cuckoo.VerifyProperty<Bool> { + return .init(manager: cuckoo_manager, name: "imapConfigurationSuccessful", callMatcher: callMatcher, sourceLocation: sourceLocation) + } + + + var smtpConfigurationSuccessful: Cuckoo.VerifyProperty<Bool> { + return .init(manager: cuckoo_manager, name: "smtpConfigurationSuccessful", callMatcher: callMatcher, sourceLocation: sourceLocation) + } + + + var dispatchGroup: Cuckoo.VerifyProperty<DispatchGroup> { + return .init(manager: cuckoo_manager, name: "dispatchGroup", callMatcher: callMatcher, sourceLocation: sourceLocation) + } + + + + @discardableResult + func checkConfig<M1: Cuckoo.Matchable, M2: Cuckoo.Matchable>(mailAccount: M1, extendedValidation: M2) -> Cuckoo.__DoNotUse<(MailAccount, Bool), Future<AuthenticationResult, Never>> where M1.MatchedType == MailAccount, M2.MatchedType == Bool { + let matchers: [Cuckoo.ParameterMatcher<(MailAccount, Bool)>] = [wrap(matchable: mailAccount) { $0.0 }, wrap(matchable: extendedValidation) { $0.1 }] + return cuckoo_manager.verify("checkConfig(mailAccount: MailAccount, extendedValidation: Bool) -> Future<AuthenticationResult, Never>", callMatcher: callMatcher, parameterMatchers: matchers, sourceLocation: sourceLocation) + } + + @discardableResult + func checkIMAPConfig<M1: Cuckoo.Matchable, M2: Cuckoo.Matchable>(mailAccount: M1, _ callback: M2) -> Cuckoo.__DoNotUse<(MailAccount, AuthenticationCallback), Void> where M1.MatchedType == MailAccount, M2.MatchedType == AuthenticationCallback { + let matchers: [Cuckoo.ParameterMatcher<(MailAccount, AuthenticationCallback)>] = [wrap(matchable: mailAccount) { $0.0 }, wrap(matchable: callback) { $0.1 }] + return cuckoo_manager.verify("checkIMAPConfig(mailAccount: MailAccount, _: AuthenticationCallback)", callMatcher: callMatcher, parameterMatchers: matchers, sourceLocation: sourceLocation) + } + + @discardableResult + func checkSMTPConfig<M1: Cuckoo.Matchable, M2: Cuckoo.Matchable>(mailAccount: M1, _ callback: M2) -> Cuckoo.__DoNotUse<(MailAccount, AuthenticationCallback), Void> where M1.MatchedType == MailAccount, M2.MatchedType == AuthenticationCallback { + let matchers: [Cuckoo.ParameterMatcher<(MailAccount, AuthenticationCallback)>] = [wrap(matchable: mailAccount) { $0.0 }, wrap(matchable: callback) { $0.1 }] + return cuckoo_manager.verify("checkSMTPConfig(mailAccount: MailAccount, _: AuthenticationCallback)", callMatcher: callMatcher, parameterMatchers: matchers, sourceLocation: sourceLocation) + } + + @discardableResult + func onTimeout<M1: Cuckoo.Matchable>(timeoutResult: M1) -> Cuckoo.__DoNotUse<(DispatchTimeoutResult), AuthenticationResult> where M1.MatchedType == DispatchTimeoutResult { + let matchers: [Cuckoo.ParameterMatcher<(DispatchTimeoutResult)>] = [wrap(matchable: timeoutResult) { $0 }] + return cuckoo_manager.verify("onTimeout(timeoutResult: DispatchTimeoutResult) -> AuthenticationResult", callMatcher: callMatcher, parameterMatchers: matchers, sourceLocation: sourceLocation) + } + + @discardableResult + func onImapCompleted<M1: Cuckoo.Matchable, M2: Cuckoo.Matchable, M3: Cuckoo.Matchable>(imapWorks: M1, _ login: M2, _ password: M3) -> Cuckoo.__DoNotUse<(Bool, String, String), Void> where M1.MatchedType == Bool, M2.MatchedType == String, M3.MatchedType == String { + let matchers: [Cuckoo.ParameterMatcher<(Bool, String, String)>] = [wrap(matchable: imapWorks) { $0.0 }, wrap(matchable: login) { $0.1 }, wrap(matchable: password) { $0.2 }] + return cuckoo_manager.verify("onImapCompleted(imapWorks: Bool, _: String, _: String)", callMatcher: callMatcher, parameterMatchers: matchers, sourceLocation: sourceLocation) + } + + @discardableResult + func onSmtpCompleted<M1: Cuckoo.Matchable, M2: Cuckoo.Matchable, M3: Cuckoo.Matchable>(smtpWorks: M1, _ login: M2, _ password: M3) -> Cuckoo.__DoNotUse<(Bool, String, String), Void> where M1.MatchedType == Bool, M2.MatchedType == String, M3.MatchedType == String { + let matchers: [Cuckoo.ParameterMatcher<(Bool, String, String)>] = [wrap(matchable: smtpWorks) { $0.0 }, wrap(matchable: login) { $0.1 }, wrap(matchable: password) { $0.2 }] + return cuckoo_manager.verify("onSmtpCompleted(smtpWorks: Bool, _: String, _: String)", callMatcher: callMatcher, parameterMatchers: matchers, sourceLocation: sourceLocation) + } + + } +} + + class AuthenticationModelStub: AuthenticationModel { + + + override var extendedValidation: Bool { + get { + return DefaultValueRegistry.defaultValue(for: (Bool).self) + } + + set { } + + } + + + override var imapCallback: AuthenticationCallback? { + get { + return DefaultValueRegistry.defaultValue(for: (AuthenticationCallback?).self) + } + + set { } + + } + + + override var smtpCallback: AuthenticationCallback? { + get { + return DefaultValueRegistry.defaultValue(for: (AuthenticationCallback?).self) + } + + set { } + + } + + + override var imapConfigurationSuccessful: Bool { + get { + return DefaultValueRegistry.defaultValue(for: (Bool).self) + } + + set { } + + } + + + override var smtpConfigurationSuccessful: Bool { + get { + return DefaultValueRegistry.defaultValue(for: (Bool).self) + } + + set { } + + } + + + override var dispatchGroup: DispatchGroup { + get { + return DefaultValueRegistry.defaultValue(for: (DispatchGroup).self) + } + + set { } + + } + + + + + + override func checkConfig(mailAccount: MailAccount, extendedValidation: Bool) -> Future<AuthenticationResult, Never> { + return DefaultValueRegistry.defaultValue(for: (Future<AuthenticationResult, Never>).self) + } + + override func checkIMAPConfig(mailAccount: MailAccount, _ callback: AuthenticationCallback) { + return DefaultValueRegistry.defaultValue(for: (Void).self) + } + + override func checkSMTPConfig(mailAccount: MailAccount, _ callback: AuthenticationCallback) { + return DefaultValueRegistry.defaultValue(for: (Void).self) + } + + override func onTimeout(timeoutResult: DispatchTimeoutResult) -> AuthenticationResult { + return DefaultValueRegistry.defaultValue(for: (AuthenticationResult).self) + } + + override func onImapCompleted(imapWorks: Bool, _ login: String, _ password: String) { + return DefaultValueRegistry.defaultValue(for: (Void).self) + } + + override func onSmtpCompleted(smtpWorks: Bool, _ login: String, _ password: String) { + return DefaultValueRegistry.defaultValue(for: (Void).self) + } + +} + + + + class MockAuthenticationCallback: AuthenticationCallback, Cuckoo.ClassMock { + + typealias MocksType = AuthenticationCallback + + typealias Stubbing = __StubbingProxy_AuthenticationCallback + typealias Verification = __VerificationProxy_AuthenticationCallback + + let cuckoo_manager = Cuckoo.MockManager.preconfiguredManager ?? Cuckoo.MockManager(hasParent: true) + + + private var __defaultImplStub: AuthenticationCallback? + + func enableDefaultImplementation(_ stub: AuthenticationCallback) { + __defaultImplStub = stub + cuckoo_manager.enableDefaultStubImplementation() + } + + + + + + override var callback: ((Bool, String, String) -> Void)? { + get { + return cuckoo_manager.getter("callback", + superclassCall: + + super.callback + , + defaultCall: __defaultImplStub!.callback) + } + + set { + cuckoo_manager.setter("callback", + value: newValue, + superclassCall: + + super.callback = newValue + , + defaultCall: __defaultImplStub!.callback = newValue) + } + + } + + + + + + + + override func onResult(worked: Bool, login: String, password: String) { + + return cuckoo_manager.call("onResult(worked: Bool, login: String, password: String)", + parameters: (worked, login, password), + escapingParameters: (worked, login, password), + superclassCall: + + super.onResult(worked: worked, login: login, password: password) + , + defaultCall: __defaultImplStub!.onResult(worked: worked, login: login, password: password)) + + } + + + struct __StubbingProxy_AuthenticationCallback: Cuckoo.StubbingProxy { + private let cuckoo_manager: Cuckoo.MockManager + + init(manager: Cuckoo.MockManager) { + self.cuckoo_manager = manager + } + + + var callback: Cuckoo.ClassToBeStubbedOptionalProperty<MockAuthenticationCallback, ((Bool, String, String) -> Void)> { + return .init(manager: cuckoo_manager, name: "callback") + } + + + func onResult<M1: Cuckoo.Matchable, M2: Cuckoo.Matchable, M3: Cuckoo.Matchable>(worked: M1, login: M2, password: M3) -> Cuckoo.ClassStubNoReturnFunction<(Bool, String, String)> where M1.MatchedType == Bool, M2.MatchedType == String, M3.MatchedType == String { + let matchers: [Cuckoo.ParameterMatcher<(Bool, String, String)>] = [wrap(matchable: worked) { $0.0 }, wrap(matchable: login) { $0.1 }, wrap(matchable: password) { $0.2 }] + return .init(stub: cuckoo_manager.createStub(for: MockAuthenticationCallback.self, method: "onResult(worked: Bool, login: String, password: String)", parameterMatchers: matchers)) + } + + } + + struct __VerificationProxy_AuthenticationCallback: Cuckoo.VerificationProxy { + private let cuckoo_manager: Cuckoo.MockManager + private let callMatcher: Cuckoo.CallMatcher + private let sourceLocation: Cuckoo.SourceLocation + + init(manager: Cuckoo.MockManager, callMatcher: Cuckoo.CallMatcher, sourceLocation: Cuckoo.SourceLocation) { + self.cuckoo_manager = manager + self.callMatcher = callMatcher + self.sourceLocation = sourceLocation + } + + + + var callback: Cuckoo.VerifyOptionalProperty<((Bool, String, String) -> Void)> { + return .init(manager: cuckoo_manager, name: "callback", callMatcher: callMatcher, sourceLocation: sourceLocation) + } + + + + @discardableResult + func onResult<M1: Cuckoo.Matchable, M2: Cuckoo.Matchable, M3: Cuckoo.Matchable>(worked: M1, login: M2, password: M3) -> Cuckoo.__DoNotUse<(Bool, String, String), Void> where M1.MatchedType == Bool, M2.MatchedType == String, M3.MatchedType == String { + let matchers: [Cuckoo.ParameterMatcher<(Bool, String, String)>] = [wrap(matchable: worked) { $0.0 }, wrap(matchable: login) { $0.1 }, wrap(matchable: password) { $0.2 }] + return cuckoo_manager.verify("onResult(worked: Bool, login: String, password: String)", callMatcher: callMatcher, parameterMatchers: matchers, sourceLocation: sourceLocation) + } + + } +} + + class AuthenticationCallbackStub: AuthenticationCallback { + + + override var callback: ((Bool, String, String) -> Void)? { + get { + return DefaultValueRegistry.defaultValue(for: (((Bool, String, String) -> Void)?).self) + } + + set { } + + } + + + + + + override func onResult(worked: Bool, login: String, password: String) { + return DefaultValueRegistry.defaultValue(for: (Void).self) + } + +} + + +<<<<<<< HEAD +// MARK: - Mocks generated from file: enzevalos_iphone/AuthenticationViewModel.swift at 2020-03-31 15:54:34 +0000 +======= +// MARK: - Mocks generated from file: enzevalos_iphone/AuthenticationViewModel.swift at 2020-03-18 15:11:52 +0000 +>>>>>>> dev + +// +// AuthenticationViewModel.swift +// enzevalos_iphone +// +// Created by SWP Usable Security für Smartphones on 02.03.20. +// Copyright © 2020 fu-berlin. All rights reserved. +// +import Cuckoo +@testable import enzevalos_iphone + +import Combine +import Foundation + + + class MockAuthenticationViewModel: AuthenticationViewModel, Cuckoo.ClassMock { + + typealias MocksType = AuthenticationViewModel + + typealias Stubbing = __StubbingProxy_AuthenticationViewModel + typealias Verification = __VerificationProxy_AuthenticationViewModel + + let cuckoo_manager = Cuckoo.MockManager.preconfiguredManager ?? Cuckoo.MockManager(hasParent: true) + + + private var __defaultImplStub: AuthenticationViewModel? + + func enableDefaultImplementation(_ stub: AuthenticationViewModel) { + __defaultImplStub = stub + cuckoo_manager.enableDefaultStubImplementation() + } + + + + + + override var errorMessage: String? { + get { + return cuckoo_manager.getter("errorMessage", + superclassCall: + + super.errorMessage + , + defaultCall: __defaultImplStub!.errorMessage) + } + + set { + cuckoo_manager.setter("errorMessage", + value: newValue, + superclassCall: + + super.errorMessage = newValue + , + defaultCall: __defaultImplStub!.errorMessage = newValue) + } + + } + + + + override var isDetailedAuthentication: Bool { + get { + return cuckoo_manager.getter("isDetailedAuthentication", + superclassCall: + + super.isDetailedAuthentication + , + defaultCall: __defaultImplStub!.isDetailedAuthentication) + } + + set { + cuckoo_manager.setter("isDetailedAuthentication", + value: newValue, + superclassCall: + + super.isDetailedAuthentication = newValue + , + defaultCall: __defaultImplStub!.isDetailedAuthentication = newValue) + } + + } + + + + override var showProgressSpinner: Bool { + get { + return cuckoo_manager.getter("showProgressSpinner", + superclassCall: + + super.showProgressSpinner + , + defaultCall: __defaultImplStub!.showProgressSpinner) + } + + set { + cuckoo_manager.setter("showProgressSpinner", + value: newValue, + superclassCall: + + super.showProgressSpinner = newValue + , + defaultCall: __defaultImplStub!.showProgressSpinner = newValue) + } + + } + + + + override var cancellable: AnyCancellable? { + get { + return cuckoo_manager.getter("cancellable", + superclassCall: + + super.cancellable + , + defaultCall: __defaultImplStub!.cancellable) + } + + set { + cuckoo_manager.setter("cancellable", + value: newValue, + superclassCall: + + super.cancellable = newValue + , + defaultCall: __defaultImplStub!.cancellable = newValue) + } + + } + + + + + + + + override func validate(_ login: String, _ password: String) { + + return cuckoo_manager.call("validate(_: String, _: String)", + parameters: (login, password), + escapingParameters: (login, password), + superclassCall: + + super.validate(login, password) + , + defaultCall: __defaultImplStub!.validate(login, password)) + + } + + + + override func detailValidation(_ login: String, _ password: String, _ username: String, _ imapServer: String, _ imapPort: String, _ imapEncryption: Int, _ smtpServer: String, _ smtpPort: String, _ smtpEncryption: Int) { + + return cuckoo_manager.call("detailValidation(_: String, _: String, _: String, _: String, _: String, _: Int, _: String, _: String, _: Int)", + parameters: (login, password, username, imapServer, imapPort, imapEncryption, smtpServer, smtpPort, smtpEncryption), + escapingParameters: (login, password, username, imapServer, imapPort, imapEncryption, smtpServer, smtpPort, smtpEncryption), + superclassCall: + + super.detailValidation(login, password, username, imapServer, imapPort, imapEncryption, smtpServer, smtpPort, smtpEncryption) + , + defaultCall: __defaultImplStub!.detailValidation(login, password, username, imapServer, imapPort, imapEncryption, smtpServer, smtpPort, smtpEncryption)) + + } + + + + override func startGoogleOauth() { + + return cuckoo_manager.call("startGoogleOauth()", + parameters: (), + escapingParameters: (), + superclassCall: + + super.startGoogleOauth() + , + defaultCall: __defaultImplStub!.startGoogleOauth()) + + } + + + + override func authenticationSucceed() { + + return cuckoo_manager.call("authenticationSucceed()", + parameters: (), + escapingParameters: (), + superclassCall: + + super.authenticationSucceed() + , + defaultCall: __defaultImplStub!.authenticationSucceed()) + + } + + + + override func authenticationFailed(error: MailServerConnectionError) { + + return cuckoo_manager.call("authenticationFailed(error: MailServerConnectionError)", + parameters: (error), + escapingParameters: (error), + superclassCall: + + super.authenticationFailed(error: error) + , + defaultCall: __defaultImplStub!.authenticationFailed(error: error)) + + } + + + + override func timeoutNotification() { + + return cuckoo_manager.call("timeoutNotification()", + parameters: (), + escapingParameters: (), + superclassCall: + + super.timeoutNotification() + , + defaultCall: __defaultImplStub!.timeoutNotification()) + + } + + + struct __StubbingProxy_AuthenticationViewModel: Cuckoo.StubbingProxy { + private let cuckoo_manager: Cuckoo.MockManager + + init(manager: Cuckoo.MockManager) { + self.cuckoo_manager = manager + } + + + var errorMessage: Cuckoo.ClassToBeStubbedOptionalProperty<MockAuthenticationViewModel, String> { + return .init(manager: cuckoo_manager, name: "errorMessage") + } + + + var isDetailedAuthentication: Cuckoo.ClassToBeStubbedProperty<MockAuthenticationViewModel, Bool> { + return .init(manager: cuckoo_manager, name: "isDetailedAuthentication") + } + + + var showProgressSpinner: Cuckoo.ClassToBeStubbedProperty<MockAuthenticationViewModel, Bool> { + return .init(manager: cuckoo_manager, name: "showProgressSpinner") + } + + + var cancellable: Cuckoo.ClassToBeStubbedOptionalProperty<MockAuthenticationViewModel, AnyCancellable> { + return .init(manager: cuckoo_manager, name: "cancellable") + } + + + func validate<M1: Cuckoo.Matchable, M2: Cuckoo.Matchable>(_ login: M1, _ password: M2) -> Cuckoo.ClassStubNoReturnFunction<(String, String)> where M1.MatchedType == String, M2.MatchedType == String { + let matchers: [Cuckoo.ParameterMatcher<(String, String)>] = [wrap(matchable: login) { $0.0 }, wrap(matchable: password) { $0.1 }] + return .init(stub: cuckoo_manager.createStub(for: MockAuthenticationViewModel.self, method: "validate(_: String, _: String)", parameterMatchers: matchers)) + } + + func detailValidation<M1: Cuckoo.Matchable, M2: Cuckoo.Matchable, M3: Cuckoo.Matchable, M4: Cuckoo.Matchable, M5: Cuckoo.Matchable, M6: Cuckoo.Matchable, M7: Cuckoo.Matchable, M8: Cuckoo.Matchable, M9: Cuckoo.Matchable>(_ login: M1, _ password: M2, _ username: M3, _ imapServer: M4, _ imapPort: M5, _ imapEncryption: M6, _ smtpServer: M7, _ smtpPort: M8, _ smtpEncryption: M9) -> Cuckoo.ClassStubNoReturnFunction<(String, String, String, String, String, Int, String, String, Int)> where M1.MatchedType == String, M2.MatchedType == String, M3.MatchedType == String, M4.MatchedType == String, M5.MatchedType == String, M6.MatchedType == Int, M7.MatchedType == String, M8.MatchedType == String, M9.MatchedType == Int { + let matchers: [Cuckoo.ParameterMatcher<(String, String, String, String, String, Int, String, String, Int)>] = [wrap(matchable: login) { $0.0 }, wrap(matchable: password) { $0.1 }, wrap(matchable: username) { $0.2 }, wrap(matchable: imapServer) { $0.3 }, wrap(matchable: imapPort) { $0.4 }, wrap(matchable: imapEncryption) { $0.5 }, wrap(matchable: smtpServer) { $0.6 }, wrap(matchable: smtpPort) { $0.7 }, wrap(matchable: smtpEncryption) { $0.8 }] + return .init(stub: cuckoo_manager.createStub(for: MockAuthenticationViewModel.self, method: "detailValidation(_: String, _: String, _: String, _: String, _: String, _: Int, _: String, _: String, _: Int)", parameterMatchers: matchers)) + } + + func startGoogleOauth() -> Cuckoo.ClassStubNoReturnFunction<()> { + let matchers: [Cuckoo.ParameterMatcher<Void>] = [] + return .init(stub: cuckoo_manager.createStub(for: MockAuthenticationViewModel.self, method: "startGoogleOauth()", parameterMatchers: matchers)) + } + + func authenticationSucceed() -> Cuckoo.ClassStubNoReturnFunction<()> { + let matchers: [Cuckoo.ParameterMatcher<Void>] = [] + return .init(stub: cuckoo_manager.createStub(for: MockAuthenticationViewModel.self, method: "authenticationSucceed()", parameterMatchers: matchers)) + } + + func authenticationFailed<M1: Cuckoo.Matchable>(error: M1) -> Cuckoo.ClassStubNoReturnFunction<(MailServerConnectionError)> where M1.MatchedType == MailServerConnectionError { + let matchers: [Cuckoo.ParameterMatcher<(MailServerConnectionError)>] = [wrap(matchable: error) { $0 }] + return .init(stub: cuckoo_manager.createStub(for: MockAuthenticationViewModel.self, method: "authenticationFailed(error: MailServerConnectionError)", parameterMatchers: matchers)) + } + + func timeoutNotification() -> Cuckoo.ClassStubNoReturnFunction<()> { + let matchers: [Cuckoo.ParameterMatcher<Void>] = [] + return .init(stub: cuckoo_manager.createStub(for: MockAuthenticationViewModel.self, method: "timeoutNotification()", parameterMatchers: matchers)) + } + + } + + struct __VerificationProxy_AuthenticationViewModel: Cuckoo.VerificationProxy { + private let cuckoo_manager: Cuckoo.MockManager + private let callMatcher: Cuckoo.CallMatcher + private let sourceLocation: Cuckoo.SourceLocation + + init(manager: Cuckoo.MockManager, callMatcher: Cuckoo.CallMatcher, sourceLocation: Cuckoo.SourceLocation) { + self.cuckoo_manager = manager + self.callMatcher = callMatcher + self.sourceLocation = sourceLocation + } + + + + var errorMessage: Cuckoo.VerifyOptionalProperty<String> { + return .init(manager: cuckoo_manager, name: "errorMessage", callMatcher: callMatcher, sourceLocation: sourceLocation) + } + + + var isDetailedAuthentication: Cuckoo.VerifyProperty<Bool> { + return .init(manager: cuckoo_manager, name: "isDetailedAuthentication", callMatcher: callMatcher, sourceLocation: sourceLocation) + } + + + var showProgressSpinner: Cuckoo.VerifyProperty<Bool> { + return .init(manager: cuckoo_manager, name: "showProgressSpinner", callMatcher: callMatcher, sourceLocation: sourceLocation) + } + + + var cancellable: Cuckoo.VerifyOptionalProperty<AnyCancellable> { + return .init(manager: cuckoo_manager, name: "cancellable", callMatcher: callMatcher, sourceLocation: sourceLocation) + } + + + + @discardableResult + func validate<M1: Cuckoo.Matchable, M2: Cuckoo.Matchable>(_ login: M1, _ password: M2) -> Cuckoo.__DoNotUse<(String, String), Void> where M1.MatchedType == String, M2.MatchedType == String { + let matchers: [Cuckoo.ParameterMatcher<(String, String)>] = [wrap(matchable: login) { $0.0 }, wrap(matchable: password) { $0.1 }] + return cuckoo_manager.verify("validate(_: String, _: String)", callMatcher: callMatcher, parameterMatchers: matchers, sourceLocation: sourceLocation) + } + + @discardableResult + func detailValidation<M1: Cuckoo.Matchable, M2: Cuckoo.Matchable, M3: Cuckoo.Matchable, M4: Cuckoo.Matchable, M5: Cuckoo.Matchable, M6: Cuckoo.Matchable, M7: Cuckoo.Matchable, M8: Cuckoo.Matchable, M9: Cuckoo.Matchable>(_ login: M1, _ password: M2, _ username: M3, _ imapServer: M4, _ imapPort: M5, _ imapEncryption: M6, _ smtpServer: M7, _ smtpPort: M8, _ smtpEncryption: M9) -> Cuckoo.__DoNotUse<(String, String, String, String, String, Int, String, String, Int), Void> where M1.MatchedType == String, M2.MatchedType == String, M3.MatchedType == String, M4.MatchedType == String, M5.MatchedType == String, M6.MatchedType == Int, M7.MatchedType == String, M8.MatchedType == String, M9.MatchedType == Int { + let matchers: [Cuckoo.ParameterMatcher<(String, String, String, String, String, Int, String, String, Int)>] = [wrap(matchable: login) { $0.0 }, wrap(matchable: password) { $0.1 }, wrap(matchable: username) { $0.2 }, wrap(matchable: imapServer) { $0.3 }, wrap(matchable: imapPort) { $0.4 }, wrap(matchable: imapEncryption) { $0.5 }, wrap(matchable: smtpServer) { $0.6 }, wrap(matchable: smtpPort) { $0.7 }, wrap(matchable: smtpEncryption) { $0.8 }] + return cuckoo_manager.verify("detailValidation(_: String, _: String, _: String, _: String, _: String, _: Int, _: String, _: String, _: Int)", callMatcher: callMatcher, parameterMatchers: matchers, sourceLocation: sourceLocation) + } + + @discardableResult + func startGoogleOauth() -> Cuckoo.__DoNotUse<(), Void> { + let matchers: [Cuckoo.ParameterMatcher<Void>] = [] + return cuckoo_manager.verify("startGoogleOauth()", callMatcher: callMatcher, parameterMatchers: matchers, sourceLocation: sourceLocation) + } + + @discardableResult + func authenticationSucceed() -> Cuckoo.__DoNotUse<(), Void> { + let matchers: [Cuckoo.ParameterMatcher<Void>] = [] + return cuckoo_manager.verify("authenticationSucceed()", callMatcher: callMatcher, parameterMatchers: matchers, sourceLocation: sourceLocation) + } + + @discardableResult + func authenticationFailed<M1: Cuckoo.Matchable>(error: M1) -> Cuckoo.__DoNotUse<(MailServerConnectionError), Void> where M1.MatchedType == MailServerConnectionError { + let matchers: [Cuckoo.ParameterMatcher<(MailServerConnectionError)>] = [wrap(matchable: error) { $0 }] + return cuckoo_manager.verify("authenticationFailed(error: MailServerConnectionError)", callMatcher: callMatcher, parameterMatchers: matchers, sourceLocation: sourceLocation) + } + + @discardableResult + func timeoutNotification() -> Cuckoo.__DoNotUse<(), Void> { + let matchers: [Cuckoo.ParameterMatcher<Void>] = [] + return cuckoo_manager.verify("timeoutNotification()", callMatcher: callMatcher, parameterMatchers: matchers, sourceLocation: sourceLocation) + } + + } +} + + class AuthenticationViewModelStub: AuthenticationViewModel { + + + override var errorMessage: String? { + get { + return DefaultValueRegistry.defaultValue(for: (String?).self) + } + + set { } + + } + + + override var isDetailedAuthentication: Bool { + get { + return DefaultValueRegistry.defaultValue(for: (Bool).self) + } + + set { } + + } + + + override var showProgressSpinner: Bool { + get { + return DefaultValueRegistry.defaultValue(for: (Bool).self) + } + + set { } + + } + + + override var cancellable: AnyCancellable? { + get { + return DefaultValueRegistry.defaultValue(for: (AnyCancellable?).self) + } + + set { } + + } + + + + + + override func validate(_ login: String, _ password: String) { + return DefaultValueRegistry.defaultValue(for: (Void).self) + } + + override func detailValidation(_ login: String, _ password: String, _ username: String, _ imapServer: String, _ imapPort: String, _ imapEncryption: Int, _ smtpServer: String, _ smtpPort: String, _ smtpEncryption: Int) { + return DefaultValueRegistry.defaultValue(for: (Void).self) + } + + override func startGoogleOauth() { + return DefaultValueRegistry.defaultValue(for: (Void).self) + } + + override func authenticationSucceed() { + return DefaultValueRegistry.defaultValue(for: (Void).self) + } + + override func authenticationFailed(error: MailServerConnectionError) { + return DefaultValueRegistry.defaultValue(for: (Void).self) + } + + override func timeoutNotification() { + return DefaultValueRegistry.defaultValue(for: (Void).self) + } + +} + diff --git a/enzevalos_iphoneTests/SMIMETests.swift b/enzevalos_iphoneTests/SMIMETests.swift new file mode 100644 index 0000000000000000000000000000000000000000..bda280b0d273139922ef084ca58ab5122bbfbea3 --- /dev/null +++ b/enzevalos_iphoneTests/SMIMETests.swift @@ -0,0 +1,452 @@ +// +// SMIMETests.swift +// enzevalos_iphoneTests +// +// Created by lazarog98 on 31.03.20. +// Copyright © 2020 fu-berlin. All rights reserved. +// + +import XCTest + +@testable import enzevalos_iphone +class SMIMETests: XCTestCase { + let test_key = """ +Bag Attributes + friendlyName: myKey + localKeyID: B9 C7 A6 B7 A0 03 91 C3 89 79 AA D7 A3 72 C9 E9 BE 00 45 30 +Key Attributes: <No Attributes> +-----BEGIN PRIVATE KEY----- +MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQCUFDosMJHlsuIb +ot/2FE4qXg388BqaEtkuJ8Ea18nzMXTT6dYH53wAfIt33OwqxEFpcrN3GndhRJTk +g68wmTvSFP23tVKWNk1SJOZAlEJJH8Q2wKTnt4Bh6y3XEXxZ3csgNM+BL3jItD+l +FZviSkqQyGreXZ+XnQPHRYH0IpzQ8cq7obJnzKMFsVsVltSJDLijUWR8K54lciCo +smz+3bKonCy1hYjuQB/3JEQlWb8Ij4ZiMtUn9Iju/8XnIuspkay83ktUyz7hYAld +K3yvn+tsrOepr98n+aU6bGJSYrbv76R+xpBp2ryRoFbbuzy7wdL8afQJDemKcMQI +87ra30mxAgMBAAECggEAAKj11iqggNixyS1KJcyIVBLOSZ0Cmlfoica7CwEF7SMr +RefxjeBsUSEnpZDu6Mp42eo9O76lhEcyvxwUOsweYWjPFXDjLt4Wt8MIN3FtuZ9A +5TH+6NU8nFBzeFVIrmAb+ASXku1krVIqg98Uo6RgqxQ9791/a594mTHBgwvTMqYf +1024bF9ImI/GhIbzPeX2lrbzHq+HZ6jXg/Jjx0QWfYhyTPqvvCUhyiY0WBvelsQH +orlh7IhnSyFQ6FqgPXzoYWOmHqXODUmmCS6nMct5hRq3Fagvr8aNp2wD6FoYuJGd +FSvIwX+ZMNgzObNA4flY7TfplOaTl6PV6H+KGJ14wQKBgQDEV1hRuKGPB27BH40x +pu0lRmgE/5pdz2Vbg6AuRelZEVCKju33tvXhNrzhPj85jRCPNMPFWQJPlJsQ7lB8 +wEANc1PnLffxfwBFs7ke1h3qs6WBkKVtVxXDed1SsMkZ3CmVotSIp3fLzbl9SMYv +Pih3arKI0wwTV8i4Ort5QNyOwQKBgQDBEr7x684we+rISodiDZATmX7fAw490M2u +KQHC3hmAB0Y6htx4E2ti7jNtzV95XkBoW3vShC75xDIZJwXM+yVxYZRQ3dcEMmE7 +yR+npAI6pFZGBTsAs9mXUP+JIQVwKbNpTH8x2klb6ylXGJvFFGAhwq4ni4lf1xls +s7x93Vxm8QKBgQCVgCSh5UIvVGuC5fFu8znzfg7Kb44tDDSTYEBhu54Y0dRQDNEq +I8hJepKLuAgQXFdVk8nVxRa7Xd5NIAltVD3xf/VNPHVlD103tcepsUQKaEwHwgoU +nZDWzT43LqGR7VBEvj2y6EGRj85DlVxCsMPDWh0jjf/N4rPVg/MoOrk2gQKBgQCS +HRquQLNJE+5pZ6WvOe5oNsjCAzD67RNLEzOHAsgvkNHAJyGgKaoiM3xuQ3dWhVKe +52T8uxZF5Qm46URFjWcXuC4jSM+ZGHtnYFz5ZHBfatDzqq+tZ25rSlworfnMmXJy +ZPb5hmXwDza4+CGiczoRMqDTwpDTHBjcn+UtJ6HvMQKBgACDZQgWdYXLrGl6qB6A +X0Xb6hoEuz7BeP+ZW3tspyjySLe8SXDf8QXQXvyfivo1N3VxbWuTSf/e4U2SqXXH ++/kFUS+KgKMKWefR+MJ3+Do8AGf4lrqf9AsSnrTtLskuS9aab9lZ1Mm/Q4P79K2J +eforhMXYki+DqiwhRf6Q3rxF +-----END PRIVATE KEY----- +Bag Attributes + friendlyName: myKey + localKeyID: B9 C7 A6 B7 A0 03 91 C3 89 79 AA D7 A3 72 C9 E9 BE 00 45 30 +subject=C = DE, O = A MAILTEST, CN = myKey + +issuer=C = DE, O = A MAILTEST, CN = myTestCA + +-----BEGIN CERTIFICATE----- +MIIDpzCCAo+gAwIBAgIIkMopuuUM9N4wDQYJKoZIhvcNAQELBQAwNTELMAkGA1UE +BhMCREUxEzARBgNVBAoMCkEgTUFJTFRFU1QxETAPBgNVBAMMCG15VGVzdENBMB4X +DTIwMDMwNTEzMzUxNVoXDTQwMDIyOTEzMzUxMVowMjELMAkGA1UEBhMCREUxEzAR +BgNVBAoMCkEgTUFJTFRFU1QxDjAMBgNVBAMMBW15S2V5MIIBIjANBgkqhkiG9w0B +AQEFAAOCAQ8AMIIBCgKCAQEAlBQ6LDCR5bLiG6Lf9hROKl4N/PAamhLZLifBGtfJ +8zF00+nWB+d8AHyLd9zsKsRBaXKzdxp3YUSU5IOvMJk70hT9t7VSljZNUiTmQJRC +SR/ENsCk57eAYest1xF8Wd3LIDTPgS94yLQ/pRWb4kpKkMhq3l2fl50Dx0WB9CKc +0PHKu6GyZ8yjBbFbFZbUiQy4o1FkfCueJXIgqLJs/t2yqJwstYWI7kAf9yREJVm/ +CI+GYjLVJ/SI7v/F5yLrKZGsvN5LVMs+4WAJXSt8r5/rbKznqa/fJ/mlOmxiUmK2 +7++kfsaQadq8kaBW27s8u8HS/Gn0CQ3pinDECPO62t9JsQIDAQABo4G9MIG6MBsG +A1UdEQQUMBKBEHVsbGltdWVsbEB3ZWIuZGUwKQYDVR0OBCIEIP0eILP4r0WN95za +SSmuP0yzs/Vdh33rAaa0B3tiGF7SMHAGA1UdIwRpMGeAIPaFmApv+CilhWeSrOpY +FZxKcDjfKwXv8OmoFbvkA8nooTmkNzA1MQswCQYDVQQGEwJERTETMBEGA1UECgwK +QSBNQUlMVEVTVDERMA8GA1UEAwwIbXlUZXN0Q0GCCH6WoapleQq4MA0GCSqGSIb3 +DQEBCwUAA4IBAQAvIknw5G8YV85/5LR90tCocane3jse5gE9AEoqSWDUemfnhmJd +MOOMjZvhQNVA7lV4X4jv1wbqLPKOpKAag5UHjXls3MfgTGyehhKvNYWpvoXdeEWU +5sIU7QYAUlzVgZ+KJZ4ImmnF2wEiiQU4GsitRlUzGYd5R/Zux+xZZcSbmHYZT5nn +xq9K9BRmWeM6eeJ99m/ZKiLH1Vmc5oC5gPQDXj0RNJTfBXiSp0HB2DMEUITvCkxh +cNFLTtHfTLPn1WsSS/EvUqc2BszXXI3df7Axftp3Dd2VtOC04Nb48AGJbxY6ryu7 +XFB7TFYvphnuQZKw5mG0FNyADnP0CgGPobTI +-----END CERTIFICATE----- +Bag Attributes: <Empty Attributes> +subject=C = DE, O = A MAILTEST, CN = myTestCA + +issuer=C = DE, O = A MAILTEST, CN = myTestCA + +-----BEGIN CERTIFICATE----- +MIIC5TCCAc0CCH6WoapleQq4MA0GCSqGSIb3DQEBCwUAMDUxCzAJBgNVBAYTAkRF +MRMwEQYDVQQKDApBIE1BSUxURVNUMREwDwYDVQQDDAhteVRlc3RDQTAeFw0yMDAz +MDUxMzM1MTFaFw00MDAyMjkxMzM0NTlaMDUxCzAJBgNVBAYTAkRFMRMwEQYDVQQK +DApBIE1BSUxURVNUMREwDwYDVQQDDAhteVRlc3RDQTCCASIwDQYJKoZIhvcNAQEB +BQADggEPADCCAQoCggEBAKI5WXFBwGEnvAaFCFf9LhTO+w9uD09bt40rG1x2vTdF +xIO6aHsLuHbXEAfFgXzcF5ifdKlFwkIs8YV3R1Eqe7Ehoi393js9idqx5zefgHw4 +Q/e6XbvAFWc0BwHNCL9EzwJzKZoQi2HxxWg/wMpu7urWQRxtYpxsp/Hr/oJaADBI +j/H/brx5Hybwy38T0IhD2FFRHFjmlJmnvawrzKk76/bMLg2TNBUIj/dNPdnfTMEk +RiMJJQ4tP4FPH0WoOoPrQNA2ijKN+nf/QyRzx8dEcOaTtsjhXDxsZmRooyuCL08x +GO/mXF9b6Mz5sCUjYetAfyhdytO2VzrMe5/oQYrjSJUCAwEAATANBgkqhkiG9w0B +AQsFAAOCAQEAmtn5vDCC3PCx9xBCA4R2YaQ34wjoCkVAwLzAmHDoXIo9kbEaARhu +/ikNDCtNd394HRjWZlVunWmyzKba7cZ53OY2q6lLwAyFFRC3+RF7MaA4OIiGF5Cx +t+NcrmzKm4cHJvi+DUxOqskl16fwycspIqokru3+dv3tqfZ8kxIOe3/hILLWYCbR +jRqChUmvLzwDtP8bFJ5COad91Cfx9DmHSnoPkhdg0f+2x+0eajjEx8fRCppHOSPK +5O2AvjjS4akSRqVwlqFUqgDvO1PRhLw31i14EbkO3q1OC/4t00HJnszqzbwGWTrf +n1O3czuVl7rPXrJn0A/MVI2ReKOQeIAYMg== +-----END CERTIFICATE----- +""" + + var testCA = """ +-----BEGIN CERTIFICATE----- +MIIC5TCCAc0CCH6WoapleQq4MA0GCSqGSIb3DQEBCwUAMDUxCzAJBgNVBAYTAkRF +MRMwEQYDVQQKDApBIE1BSUxURVNUMREwDwYDVQQDDAhteVRlc3RDQTAeFw0yMDAz +MDUxMzM1MTFaFw00MDAyMjkxMzM0NTlaMDUxCzAJBgNVBAYTAkRFMRMwEQYDVQQK +DApBIE1BSUxURVNUMREwDwYDVQQDDAhteVRlc3RDQTCCASIwDQYJKoZIhvcNAQEB +BQADggEPADCCAQoCggEBAKI5WXFBwGEnvAaFCFf9LhTO+w9uD09bt40rG1x2vTdF +xIO6aHsLuHbXEAfFgXzcF5ifdKlFwkIs8YV3R1Eqe7Ehoi393js9idqx5zefgHw4 +Q/e6XbvAFWc0BwHNCL9EzwJzKZoQi2HxxWg/wMpu7urWQRxtYpxsp/Hr/oJaADBI +j/H/brx5Hybwy38T0IhD2FFRHFjmlJmnvawrzKk76/bMLg2TNBUIj/dNPdnfTMEk +RiMJJQ4tP4FPH0WoOoPrQNA2ijKN+nf/QyRzx8dEcOaTtsjhXDxsZmRooyuCL08x +GO/mXF9b6Mz5sCUjYetAfyhdytO2VzrMe5/oQYrjSJUCAwEAATANBgkqhkiG9w0B +AQsFAAOCAQEAmtn5vDCC3PCx9xBCA4R2YaQ34wjoCkVAwLzAmHDoXIo9kbEaARhu +/ikNDCtNd394HRjWZlVunWmyzKba7cZ53OY2q6lLwAyFFRC3+RF7MaA4OIiGF5Cx +t+NcrmzKm4cHJvi+DUxOqskl16fwycspIqokru3+dv3tqfZ8kxIOe3/hILLWYCbR +jRqChUmvLzwDtP8bFJ5COad91Cfx9DmHSnoPkhdg0f+2x+0eajjEx8fRCppHOSPK +5O2AvjjS4akSRqVwlqFUqgDvO1PRhLw31i14EbkO3q1OC/4t00HJnszqzbwGWTrf +n1O3czuVl7rPXrJn0A/MVI2ReKOQeIAYMg== +-----END CERTIFICATE----- +""" + + var testEvilCA = """ +-----BEGIN CERTIFICATE----- +MIIC4TCCAckCCDWaS3dso6D3MA0GCSqGSIb3DQEBCwUAMDMxCzAJBgNVBAYTAkRF +MRMwEQYDVQQKDApBIE1BSUxURVNUMQ8wDQYDVQQDDAZldmlsQ0EwHhcNMTkwNzI5 +MTUzODA1WhcNMTkwODA1MTUzODA1WjAzMQswCQYDVQQGEwJERTETMBEGA1UECgwK +QSBNQUlMVEVTVDEPMA0GA1UEAwwGZXZpbENBMIIBIjANBgkqhkiG9w0BAQEFAAOC +AQ8AMIIBCgKCAQEAv0W8s3Dav5brYO+MZQ+DiNPSf0Mgd6g6zR1vdk+sPTuJbAZ2 +owxR376WKEayBp3jF3omitej4ltuAoepQ7xgsFLVJDijAxeLeoAzPc+J8qDcY1NF +4up9+DpN7L0L3rgfU0/I8Az4jpR8pHJTHmu0L074Er5+Vk2cBvxSY3srp2NnEga1 +Fudun9YUYfOp432Ac7xv/6KYz99ocbI+F/egnHQm49GnyFs1zxCuh9qfTeCFO644 +dUlkMXfQF7sdZmxdxwKIF4D8AroAecFXWei4PtNIJpPvr/UdCBIyEmZroL2fMnPg +zMtChlEG5Ryw7UuwKrQGs903n3nxvopr4mOumwIDAQABMA0GCSqGSIb3DQEBCwUA +A4IBAQCFnuNL7hhJjhvPpeMPFahMdadA1OWRLIe0XdAJI8Pvlx3f8XR5udcGS2Mi +r5znDhWHT5fFyYTj0JZQUf5GaYrucZDh2M2lXzuazhh5J+PSgvMez1fqfC0pp3Iy +IIqIxZCzGaZp9A7CkAO1qyDqM3fAtkJ0f6JoIrUN9Q4PphDpi6vlRDIoHROmK/Xr +QVzf2Y0lnKGQisw048XPLWqGagu8ZO0n6GMmyldnwVDEsQomndWDrW0EHEV2s/fq +bgvyhVRenp1O5IH3nOyXm8vR2FWOEHwR686l8Mxy24APzzn5K7nPeyBx0+ZpyqYh +aqQKdT1pty4gKWz3zSNTupVsyA/t +-----END CERTIFICATE----- +""" + + var test_key_other = """ +-----BEGIN CERTIFICATE----- +MIIDsDCCApigAwIBAgIIAUuththJ3rkwDQYJKoZIhvcNAQELBQAwNTELMAkGA1UE +BhMCREUxEzARBgNVBAoMCkEgTUFJTFRFU1QxETAPBgNVBAMMCG15VGVzdENBMB4X +DTE5MDczMDE0MTM0MloXDTE5MDgwNjE0MTM0MlowNjELMAkGA1UEBhMCREUxEzAR +BgNVBAoMCkEgTUFJTFRFU1QxEjAQBgNVBAMMCW90aGVya2V5MTCCASIwDQYJKoZI +hvcNAQEBBQADggEPADCCAQoCggEBAOaXgg4cD8V2Fg/n6v/YuHsOTa7vlrSragOa +eVwcYzAATRIQAP6suakRkr5D2a3u2N+EBOawCvZPeQZwZMtKpnEdIKdkmUi/OYMS +y6D7xRL/MizwsNP/YvRfwByPmYRo30YCwLeJEEIlPDw5zwfIiqyl31mOrx+5eebv +t83TCJzU7ORZv/OqFEwGt4FcWk8FydmOJxW3My3A2GUWPOmnrvOGamRoKkN/O7xO +9qaQSkRWhuyb6R3EIDo0WfsM263aEhbVHOsCk7PAtzgW18+3qvK5ZrENk3B+F3+2 +fh1Qola266kX6/ZbB+/eOPJlWBh2NZHhBZ+Z/wr69tCSTJ80au0CAwEAAaOBwjCB +vzAgBgNVHREEGTAXgRVvdGhlcmFjY0BkcmVuZ2Vscy5uZXQwKQYDVR0OBCIEIGAb +47YtbmauxZ5hYka1/wYF9xh8+pJ+Zc0eRqkrgbeNMHAGA1UdIwRpMGeAILLLgvdd +qVj9AJE8CrP9PYeShvHigM+CczpLs9EYh+bkoTmkNzA1MQswCQYDVQQGEwJERTET +MBEGA1UECgwKQSBNQUlMVEVTVDERMA8GA1UEAwwIbXlUZXN0Q0GCCKtx6aDujfcT +MA0GCSqGSIb3DQEBCwUAA4IBAQCaaBwEyegcUwTsHFiZGq64tvhRBNdiaXIGZk64 ++Jw+FyfgcMp80VIhAdKuPtodtMWRQFl6F7xI3Gkvhosv73jWSwl05iGvxFWN0wNr +N2nZ8JPCHNqQQkuGaHEM3B591EifrswGLhIaoSihHIBFlBx6e0fgBmSTHYbx9usI +XyjDyGWkq0z72KGjifqow6zZKDFeX2Br3K1hP2V2ObnVkL+Arj+lBConkD+Ja9fa +vfbCKFRMmniHBSKcaTdHu/yzFaS8zGdWaMXIVzidPrIpqiv4KC2iVWqizZX3u6ej +nVDuRRggGA08TMPaJa3ziQo+zcjFkeHyd+7vw1w7ogSPlwx8 +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIC5TCCAc0CCKtx6aDujfcTMA0GCSqGSIb3DQEBCwUAMDUxCzAJBgNVBAYTAkRF +MRMwEQYDVQQKDApBIE1BSUxURVNUMREwDwYDVQQDDAhteVRlc3RDQTAeFw0xOTA3 +MjkxNTM4MDRaFw0xOTA4MDUxNTM4MDRaMDUxCzAJBgNVBAYTAkRFMRMwEQYDVQQK +DApBIE1BSUxURVNUMREwDwYDVQQDDAhteVRlc3RDQTCCASIwDQYJKoZIhvcNAQEB +BQADggEPADCCAQoCggEBAKJOatbPDL3lw/7tqeugaRHxqMgx7/DOLdSnDnK66Eys +GrFcp43N3tQL+0rm77tz/jcyVkHAZF9Sv1c/tIZay/J975cbpHPMraJVbM+/mL6f +14wrwU4rAJLILDkZ3HqkKKnrGmfoKrB1RZ9LA+NLtQlfiuP4C8Et7bOZOkuGdq0T +aygotW0ELeQPbVWXV/GcP6Xd0FnKQF7m9ioRn9MKxu4VDm3hSKDtN1zyXQ1HXhQV +/UGODSaFyUgoCTnz7kFcF3hY9Dw7M55CCM3U0PnfxuxUdn8qMH1lym/G5K5xaVLV +fCjsly8GUUfHtls3Y0F7c6NE5CPkjub2HNNdCW+JD0ECAwEAATANBgkqhkiG9w0B +AQsFAAOCAQEAAAVXNPtXVaUP9k2wNZAw4hOKp5n0EdeOkmtMdedvuQF39d+cHJkL +HjyTp3zd22S1EbgFgNB6RPlRPXie4aivcDGSAGc88NF2xEOezbLZr30x/KAc94OG +ssKjin+X8aMoZSppUxVHI1j6gzydvEWhVBIRUjgd4F5uiV+TBOAOj39xGkpCXIBg +bLRdalYjzxWYb5cR5qniCVbKrRg2oQWghStEuuRTww9SQIeSerb0lqHF3gaL82pG +F4K1I0HbAXgq/D+xIj6lbqZlchI8a4qQq2Ic75yTP/3Nt/Ls6Dt17eT6O+tA9W4e +tag/vFWjhTwGBIjjvyrjTM3fwvUN3HIZeg== +-----END CERTIFICATE----- +-----BEGIN RSA PRIVATE KEY----- +MIIEpAIBAAKCAQEA5peCDhwPxXYWD+fq/9i4ew5Nru+WtKtqA5p5XBxjMABNEhAA +/qy5qRGSvkPZre7Y34QE5rAK9k95BnBky0qmcR0gp2SZSL85gxLLoPvFEv8yLPCw +0/9i9F/AHI+ZhGjfRgLAt4kQQiU8PDnPB8iKrKXfWY6vH7l55u+3zdMInNTs5Fm/ +86oUTAa3gVxaTwXJ2Y4nFbczLcDYZRY86aeu84ZqZGgqQ387vE72ppBKRFaG7Jvp +HcQgOjRZ+wzbrdoSFtUc6wKTs8C3OBbXz7eq8rlmsQ2TcH4Xf7Z+HVCiVrbrqRfr +9lsH79448mVYGHY1keEFn5n/Cvr20JJMnzRq7QIDAQABAoIBADUXMwFuoo7zFjdJ +TUjkq+zhKS+ayBcG1FzKByEXBBs8JoJ/HsuEFyb+/ctCse6i7Fnh+oLmi0+UkqfR +3tMTd+jZLPh9Z/Fg3av4+tswvHoYOYQxUnUs+qqLFR8+TLk4sBddcOOQ8iZYjlrL +cIg5OvxvIFJtUJK8UH3EOYxxBy2cRHw44Fg54E0CpI3LDympYUnkT6YBB+MddqF5 +mvo85XO2WoN6m+JbVvS/jDBEI707ggAjKqHoomyzEQB0lrvksPtYfUuhGqfFRrdY +nHAfH4Nxrv4FB61GldyNBphQFpMYEtOwSGLSXEaMzHPrmaAegQminJBuQaODKCeh +IVht6d0CgYEA/6CyWfkHRRmAV/hm1fndZLcZ3oN2JIJjznZbB0R1IuaXTl7kbXvA +mdEeLD9OJayhbSIkpBSs7g8NsHPqcew4gR1lm6WhSvNg6qCg5ahLj3siyrsL3k/P +jHAb6qa68L2kc5HhI29nZ3Iqt4hL/IsWD9UoRS3zRu13A4V68MWRbMMCgYEA5u16 +OamANO1sXyeDTXPOX9HSVXXKZiBsQvkpT6x+tnSIHzsgBaZaDX+myk4B5IF19191 +X5YFzNeIw8PykNZ9+UfchIJvEp11l5z8cGcNYBXCTmW+j62y4llFqKGMS+aP1Q0r +E1QXhnvRE8SYRWHoDzQ4HLRQT2exuvPum1yCDo8CgYEAsveTxnAWCee3tl8/yBE+ +UjPrFaEeRqNPMw4j3uurwrqENiczb/9TMZ15rWrI0JGTFu/vjTy4cZbyc5ZEDmxe +hu7I43bLfMj2Em5RF1iDRjnkeuEHhyaDXYRj1x3SBZgQGaWJZSCq2X7Rr1rqMC5E +TONkZUKtbvvz9fAuyYDYtrcCgYEAsed4Bx4/SAc1OyVcsXmrHwStjusdD4qg/QOp +QNk6EWQ7ThwlslSTAd066JYqPRlDgV0INqiENWhC09aMc+rayAYFrAw0d9nYswHd +NNcfZcu9ktotcdE2g8yUrrIuPHcWjeMEMXLSYOfYjesiCCnCNpxbMjnzuQjA0q+E +PiqJg58CgYAFvkmTfr8Wp3SqmQmw5TuNaRLr1IVk/cMcFjXE3AOFcPuPnYIlJ+L6 +iwxRK85BnWBVkQIMvxrbb2Ro04buiizELRoKsDdkSdYXFSmSOvw1pvT8IpNJjNRU +AYIHvW6qRLTsSR6BZZS3pqGXYue7fE0vj4HJ2IEpj05qQ5RXrD57Wg== +-----END RSA PRIVATE KEY----- +""" + + let att_sig_invalid = """ +MIME-Version: 1.0 +Content-Disposition: attachment; filename="smime.p7m" +Content-Type: application/pkcs7-mime; smime-type=signed-data; name="smime.p7m" +Content-Transfer-Encoding: base64 + +MIAGCSqGSIb3DQEHAqCAMIACAQExDTALBglghkgBZQMEAgEwgAYJKoZIhvcNAQcB +oIAkgAQdSGVsbG8gd29ybGQgd2hhdGV2ZXIgdGhlIGZ1Y2sAAAAAAACgggOrMIID +pzCCAo+gAwIBAgIIkMopuuUM9N4wDQYJKoZIhvcNAQELBQAwNTELMAkGA1UEBhMC +REUxEzARBgNVBAoMCkEgTUFJTFRFU1QxETAPBgNVBAMMCG15VGVzdENBMB4XDTIw +MDMwNTEzMzUxNVoXDTQwMDIyABCzMzUxMVowMjELMAkGA1UEBhMCREUxEzARBgNV +BAoMCkEgTUFJTFRFU1QxDjAMBgNVBAMMBW15S2V5MIIBIjANBgkqhkiG9w0BAQEF +AAOCAQ8AMIIBCgKCAQEAlBQ6LDCR5bLiG6Lf9hROKl4N/PAamhLZLifBGtfJ8zF0 +0+nWB+d8AHyLd9zsKsRBaXKzdxp3YUSU5IOvMJk70hT9t7VSljZNUiTmQJRCSR/E +NsCk57eAYest1xF8Wd3LIDTPgS94yLQ/pRWb4kpKkMhq3l2fl50Dx0WB9CKc0PHK +u6GyZ8yjBbFbFZbUiQy4o1FkfCueJXIgqLJs/t2yqJwstYWI7kAf9yREJVm/CI+G +YjLVJ/SI7v/F5yLrKZGsvN5LVMs+4WAJXSt8r5/rbKznqa/fJ/mlOmxiUmK27++k +fsaQadq8kaBW27s8u8HS/Gn0CQ3pinDECPO62t9JsQIDAQABo4G9MIG6MBsGA1Ud +EQQUMBKBEHVsbGltdWVsbEB3ZWIuZGUwKQYDVR0OBCIEIP0eILP4r0WN95zaSSmu +P0yzs/Vdh33rAaa0B3tiGF7SMHAGA1UdIwRpMGeAIPaFmApv+CilhWeSrOpYFZxK +cDjfKwXv8OmoFbvkA8nooTmkNzA1MQswCQYDVQQGEwJERTETMBEGA1UECgwKQSBN +QUlMVEVTVDERMA8GA1UEAwwIbXlUZXN0Q0GCCH6WoapleQq4MA0GCSqGSIb3DQEB +CwUAA4IBAQAvIknw5G8YV85/5LR90tCocainejse5gE9AEoqSWDUemfnhmJdMOOM +jZvhQNVA7lV4X4jv1wbqLPKOpKAag5UHjXls3MfgTGyehhKvNYWpvoXdeEWU5sIU +7QYAUlzVgZ+KJZ4ImmnF2wEiiQU4GsitRlUzGYd5R/Zux+xZZcSbmHYZT5nnxq9K +9BRmWeM6eeJ99m/ZKiLH1Vmc5oC5gPQDXj0RNJTfBXiSp0HB2DMEUITvCkxhcNFL +TtHfTLPn1WsSS/EvUqc2BszXXI3df7Axftp3Dd2VtOC04Nb48AGJbxY6ryu7XFB7 +TFYvphnuQZKw5mG0FNyADnP0CgGPobTIMYICUTCCAk0CAQEwQTA1MQswCQYDVQQG +EwJERTETMBEGA1UECgwKQSBNQUlMVEVTVDERMA8GA1UEAwwIbXlUZXN0Q0ECCJDK +KbrlDPTeMAsGCWCGSAFlAwQCAaCB5DAYBgkqhkiG9w0BCQMxCwYJKoZIhvcNAQcB +MBwGCSqGSIb3DQEJBTEPFw0yMDAzMzExMTI2MDlaMC8GCSqGSIb3DQEJBDEiBCCE +OK7BZ1gJUVMov9b6uJu/b4WfYqzmzgJ0a2czduMPvTB5BgkqhkiG9w0BCQ8xbDBq +MAsGCWCGSAFlAwQBKjALBglghkgBZQMEARYwCwYJYIZIAWUDBAECMAoGCCqGSIb3 +DQMHMA4GCCqGSIb3DQMCAgIAgDANBggqhkiG9w0DAgIBQDAHBgUrDgMCBzANBggq +hkiG9w0DAgIBKDANBgkqhkiG9w0BAQEFAASCAQApVxIN94BLteGD40M/GgT21C29 +7+rtEInq+dkB6XPEHC1GowgMZA9VPFrj0xenkj1qpZvqHcwNSjukz6Y8U4we9EzG +dZY6sEVhuoEct5TXznciLNarhikhqmqxmQvVy+G5w7AiQBrd7zePDI0PJ8AKoinR +klsTYRIi2JPBgcsoCRtxQqTLmFQNKtF5vJDTrv8Y42Gue+elTYTHhJi6bj4Yp9+T +qFj7X3hz0XayCj/CPiyGdJcaQvjIbDVI2cE0pY0jaIIJrIRVkPyLxieKBQYfUp/b +KzZCr1wZb2W1JA+vTk7/wHp33Jll0EZ4DV0BgmeSmnXknJM3wZVAa1z7e5o0AAAA +AAAA +""" + + let det_sig_invalid = """ +------56F3BC21B2CE83EB9E02E24139D860BC +Hello world whatever the fuckaaDadaDAd +------56F3BC21B2CE83EB9E02E24139D860BC +Content-Type: application/pkcs7-signature; name="smime.p7s" +Content-Transfer-Encoding: base64 +Content-Disposition: attachment; filename="smime.p7s" + +MIIGNgYJKoZIhvcNAQcCoIIGJzCCBiMCAQExDTALBglghkgBZQMEAgEwCwYJKoZI +hvcNAQcBoIIDqzCCA6cwggKPoAMCAQICCJDKKbrlDPTeMA0GCSqGSIb3DQEBCwUA +MDUxCzAJBgNVBAYTAkRFMRMwEQYDVQQKDApBIE1BSUxURVNUMREwDwYDVQQDDAht +eVRlc3RDQTAeFw0yMDAzMDUxMzM1MTVaFw00MDAyMjkxMzM1MTFaMDIxCzAJBgNV +BAYTAkRFMRMwEQYDVQQKDApBIE1BSUxURVNUMQ4wDAYDVQQDDAVteUtleTCCASIw +DQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAJQUOiwwkeWy4hui3/YUTipeDfzw +GpoS2S4nwRrXyfMxdNPp1gfnfAB8i3fc7CrEQWlys3cad2FElOSDrzCZO9IU/be1 +UpY2TVIk5kCUQkkfxDbApOe3gGHrLdcRfFndyyA0z4EveMi0P6UVm+JKSpDIat5d +n5edA8dFgfQinNDxyruhsmfMowWxWxWW1IkMuKNRZHwrniVyIKiybP7dsqicLLWF +iO5AH/ckRCVZvwiPhmIy1Sf0iO7/xeci6ymRrLzeS1TLPuFgCV0rfK+f62ys56mv +3yf5pTpsYlJitu/vpH7GkGnavJGgVtu7PLvB0vxp9AkN6YpwxAjzutrfSbECAwEA +AaOBvTCBujAbBgNVHREEFDASgRB1bGxpbXVlbGxAd2ViLmRlMCkGA1UdDgQiBCD9 +HiCz+K9Fjfec2kkprj9Ms7P1XYd96wGmtAd7Yhhe0jBwBgNVHSMEaTBngCD2hZgK +b/gopYVnkqzqWBWcSnA43ysF7/DpqBW75APJ6KE5pDcwNTELMAkGA1UEBhMCREUx +EzARBgNVBAoMCkEgTUFJTFRFU1QxETAPBgNVBAMMCG15VGVzdENBggh+lqGqZXkK +uDANBgkqhkiG9w0BAQsFAAOCAQEALyJJ8ORvGFfOf+S0fdLQqHGp3t47HuYBPQBK +Kklg1Hpn54ZiXTDjjI2b4UDVQO5VeF+I79cG6izyjqSgGoOVB415bNzH4ExsnoYS +rzWFqb6F3XhFlObCFO0GAFJc1YGfiiWeCJppxdsBIokFOBrIrUZVMxmHeUf2bsfs +WWXEm5h2GU+Z58avSvQUZlnjOnniffZv2Soix9VZnOaAuYD0A149ETSU3wV4kqdB +wdgzBFCE7wpMYXDRS07R30yz59VrEkvxL1KnNgbM11yN3X+wMX7adw3dlbTgtODW ++PABiW8WOq8ru1xQe0xWL6YZ7kGSsOZhtBTcgA5z9AoBj6G0yDGCAlEwggJNAgEB +MEEwNTELMAkGA1UEBhMCREUxEzARBgNVBAoMCkEgTUFJTFRFU1QxETAPBgNVBAMM +CG15VGVzdENBAgiQyim65Qz03jALBglghkgBZQMEAgGggeQwGAYJKoZIhvcNAQkD +MQsGCSqGSIb3DQEHATAcBgkqhkiG9w0BCQUxDxcNMjAwMzMxMTEyNjA5WjAvBgkq +hkiG9w0BCQQxIgQghDiuwWdYCVFTKL/W+ribv2+Fn2Ks5s4CdGtnM3bjD70weQYJ +KoZIhvcNAQkPMWwwajALBglghkgBZQMEASowCwYJYIZIAWUDBAEWMAsGCWCGSAFl +AwQBAjAKBggqhkiG9w0DBzAOBggqhkiG9w0DAgICAIAwDQYIKoZIhvcNAwICAUAw +BwYFKw4DAgcwDQYIKoZIhvcNAwICASgwDQYJKoZIhvcNAQEBBQAEggEAKVcSDfeA +S7Xhg+NDPxoE9tQtve/q7RCJ6vnZAelzxBwtRqMIDGQPVTxa49MXp5I9aqWb6h3M +DUo7pM+mPFOMHvRMxnWWOrBFYbqBHLeU1853IizWq4YpIapqsZkL1cvhucOwIkAa +3e83jwyNDyfACqIp0ZJbE2ESItiTwYHLKAkbcUKky5hUDSrRebyQ067/GONhrnvn +pU2Ex4SYum4+GKffk6hY+194c9F2sgo/wj4shnSXGkL4yGw1SNnBNKWNI2iCCayE +VZD8i8YnigUGH1Kf2ys2Qq9cGW9ltSQPr05O/8B6d9yZZdBGeA1dAYJnkpp15JyT +N8GVQGtc+3uaNA== + +------56F3BC21B2CE83EB9E02E24139D860BC-- +""" + + let enc_test_key_pwd = "testpwd" + let enc_test_key = +""" +-----BEGIN ENCRYPTED PRIVATE KEY----- +MIIFLTBXBgkqhkiG9w0BBQ0wSjApBgkqhkiG9w0BBQwwHAQIjRzqyJoIb6YCAggA +MAwGCCqGSIb3DQIJBQAwHQYJYIZIAWUDBAEqBBA0jxeh6SHCELOVVrAOw8wYBIIE +0NJtVjgMrMblxLPoF4N5Wn44qJb6v/DlISrXM0OiFL+E35BfUaQk7Tb/vWNuT7Ak +sfYer3XvL4DxvoEJNqUaxpKbyAWNmcROdfvZEu2gwX9rY6/5MNm+NJPn5ICpv06O +FrJn60RtHGG6TYtN7Yqy+8+2IHumQ8jBjt4nDoBcIriD7tyTZJarzrnlytMIfDP0 +kyiNQpJLEcBNazpn/3GLIdlJvjdup0hYoGoaMcKtTuc1JGQMwehu/P9KxaSvkyqN +4DStqB5Ua0IOzZdk+BJhodvwp3FTU0+bxbEVIy6NSgHCSfroyZ6fXZzazKTvqbg+ +gIB0dEGpELEjaksltbKsgaBIYahs9iT1RSEKyp6DcReIJM+bkQa6RHQvFBmqLKP2 +sZgyDzrrNUyYWXsxEGmcbJ6Irsa2WQf6G2HhzOTs3rWGpST0Nk6DwFWZTy0U3uBZ +OgVP9VEFc7yL0RQPV2Ppq54k9WBZgNYky/pteb1hq2RrZ/y/ez9zMHMlmkpRNwIQ +2EX/dcp9Y2QNZAumZt+Zh7DKLgm464n0srWn1mZOWsGy/7oajqPakay42EvVTCvB +iDjhm6OKFZChe6mietj30tNRbBC1LbpwGq21uhGihQjNp7CSWcf7osniN0UCJJ43 +BXy2g71EeVFLiBwl2qzoDNwrsRygUV0yomGvS6ic8jESm2D8J5fb1on0VKr/CBC8 +4vBHTHTW2JMOy8RyVZTBZiVeH7CiA54WwJBmARCxrzhvCLG14IE5gvfmbSm7+N+8 +ZNUcqEAt8vrdBkaLcU0knRv3r+B2/oM+9vHLqebijibHXt26fTJ4NLpjNutIbNxh +uDVUjMeH/A0zVg6jevbsANlB4H2TV/swVVk+qkRQfvDsgcCS89jr7rlU7kgmn0v8 +Ofs8JLmR7PEA3i/QLyOLNnu73qszI0o/Ag1Q2HWY2/uXxxFUTRXgiGl5Oi5wY2TZ +Rj8Ouitm0Jf9YQu4tL0zpvulgVM6jkbJKo9uYysGdS0jQVaHl3AlRnE8EYSyjJwW +QGkwcaLetcCp0kX2td/kOAXGGS5bvVHcn1vnYih1ic/Ibu1oeCOoypHouVD0jsex +gg5gNifL+63BElhpSTdKO6u5UZWzJDMlmeI62Bgp7vPlV936IgtGzCx9zkSarIZn +4u0kbWHjscVA+L3wC91IRG6Klaa27f4o2gdSGwiMo+rd37mo1Cs2u7y4/K1TvpKh +6jOlB65mIvPzzEJH1wTLkuhrfITnr2M0ddRW1am+BVOiBOjE8O+UQ1HLIeSHCmXh +6Gm+rJVvVV4UEb/gqRneAaIvS0X851aVgkyb4X3S76Tab1nNzwD/gJUb3ODPQ9Tc +ew4asU75zH6zg3frxHmdtw27Q+R0H0hxVOf0iF1znS2PBpHCg9jvtMMxRcHktpOC +dGuNDcuAtwqQN48XAgP9EkLHwRkJyN+KCSwzLzbhUKsTK3aUa9ON+YJhwyDbuNZT +tCS6rxHDe77j4fzb9jXyfM99GK9YN36/spUfl5UijDoou5rM4Tt92VBMn8iMNXx4 +OxeGuSvQoBUdP50ZspBBrf2+simuJLKMQ8kVXx8TuJqXe1FQPvFWDX5lBAf57BET +PkfA6mR7rtcyIbHi34tfkCv/qolV3QivMHov0IJpRyNO +-----END ENCRYPTED PRIVATE KEY----- +""" + var test_string = "Hello world whatever the fuck"; + + let smimeObj = SMIME() + + var certi: Certificate? + var othercerti: Certificate? + var ourAddr: String? + var otherAddr: String? + var ourPrivateKeyFP: String? + + override func setUp() { + super.setUp() + certi = Certificate(pem: test_key) + othercerti = Certificate(pem: test_key_other) + ourAddr = certi!.eMails![0] + otherAddr = othercerti!.eMails![0] + ourPrivateKeyFP = smimeObj.addPrivateKey(keyPlusCertPEM: test_key) + let _ = smimeObj.importCA(certs: [testCA]) + let _ = smimeObj.importCertForAddress(cert: test_key, addr: ourAddr!) + let _ = smimeObj.importCertForAddress(cert: test_key_other, addr: otherAddr!) + } + + override func tearDown() { + super.tearDown() + smimeObj.resetKeychain() + } + + func testEncMail() { + let testData = test_string.data(using: .utf8)! + + var encCryptObj: CryptoObject? = nil + do { + encCryptObj = try smimeObj.encrypt(plainData: testData, ids: [otherAddr!], ownAddr: ourAddr!) + } catch let error { + if error is SMIMEError { + let smimeError = error as! SMIMEError + print(smimeError.message ?? "No error message") + print("SWIFT encrypt errors") + for x in smimeError.errorArray ?? [] { + print("error code: ", x) + print("error string: ", getErrorString(errCode: x)) + print("error reason: ", getErrorReasonString(errCode: x)) + } + } + } + + assert(encCryptObj != nil) + assert(encCryptObj!.encryptionState == .ValidedEncryptedWithCurrentKey) + assert(encCryptObj!.encType == .SMIME) + + print("\n\nNew crypto object") + print("decrypted text: ", encCryptObj!.decryptedText ?? "") + print("sign key: ", encCryptObj!.signedKeys) + print("sign addr: ", encCryptObj!.signedAdrs) + print("enc type:", encCryptObj!.encType) + print("cipther string: ", encCryptObj!.chiperString ?? "") + var decObj : CryptoObject? = nil + do { + decObj = try smimeObj.decrypt(data: (encCryptObj?.chiphertext)!, fromAddr: ourAddr!, isMailNew: false) + }catch let error { + if error is SMIMEError { + let smimeError = error as! SMIMEError + print(smimeError.message ?? "No error message") + print("SWIFT decrypt errors") + for x in smimeError.errorArray ?? [] { + print("error code: ", x) + print("error string: ", getErrorString(errCode: x)) + print("error reason: ", getErrorReasonString(errCode: x)) + } + } + } + if let obj = decObj { + print("\n\nDEC crypto object") + print("decrypted text: ", obj.decryptedText ?? "") + print("signed key: ", obj.signedKeys ) + print("sign addr: ", obj.signedAdrs) + print("enc type:", obj.encType) + print ("sign: ", obj.signatureState) + print("cipther string: ", obj.chiperString ?? "") + } + + assert(decObj != nil) + assert(test_string == decObj!.decryptedText) + assert(decObj!.signatureState == .ValidSignature) + assert(decObj!.encType == .SMIME) + } + + func testKeyEnc() { + let (pKeyEnc, errArrEnc) = getEncryptedPemFromPKey(pem: test_key, passwd: "testpwd") + + print("Encrypted pkey: ", pKeyEnc ?? "") + + if errArrEnc != nil { + print("encrypt of key errors") + for x in errArrEnc ?? [] { + print("error code: ", x) + print("error string: ", getErrorString(errCode: x)) + } + } + + assert(pKeyEnc != nil) + + let (pKey, errArr) = getPKeyFromEncryptedPem(pem: pKeyEnc!, passwd: "testpwd") + + print("Decrypted pkey: ", pKey ?? "") + print("Matches with the original: ", test_key.contains((pKey ?? " asd "))) + + if errArr != nil { + print("decrypt of key errors") + for x in errArr ?? [] { + print("error code: ", x) + print("error string: ", getErrorString(errCode: x)) + } + } + assert(pKey != nil) + assert(test_key.contains((pKey ?? " asd "))) + } +} diff --git a/enzevalos_iphoneTests/phishing/EmailStringExtensionTests.swift b/enzevalos_iphoneTests/phishing/EmailStringExtensionTests.swift index bfe4779c689e28e83678bc8d4198f6ce9cc62158..e12f53778674ec1e14bdff10267b27cca5ce5661 100644 --- a/enzevalos_iphoneTests/phishing/EmailStringExtensionTests.swift +++ b/enzevalos_iphoneTests/phishing/EmailStringExtensionTests.swift @@ -1,141 +1,155 @@ - // - // EmailAdressTests.swift - // enzevalos_iphoneTests - // - // Created by Katharina Müller on 17.03.20. - // Copyright © 2020 fu-berlin. All rights reserved. - // - import XCTest - @testable import enzevalos_iphone +// +// EmailAdressTests.swift +// enzevalos_iphoneTests +// +// Created by Katharina Müller on 17.03.20. +// Copyright © 2020 fu-berlin. All rights reserved. +// +import XCTest +@testable import enzevalos_iphone - class EmailStringExtensionTests: XCTestCase { +class EmailStringExtensionTests: XCTestCase { - override func setUp() { - // Put setup code here. This method is called before the invocation of each test method in the class. - } + override func setUp() { + // Put setup code here. This method is called before the invocation of each test method in the class. + } - override func tearDown() { - // Put teardown code here. This method is called after the invocation of each test method in the class. - } - // General TestText for all (needs to simulate a body of text from which to extract specific Strings - var TestText = "blabla moep jkjlkj lkjkljknmbjks llhil k. jhkhkih. huhuhj! fsdf bob.alice@zedat.fu-berlin.de dfsf. jhjknjknjkh https://git.imp.fu-berlin.de/enzevalos/enzevalos_iphone/issues/240 hjkhjkhkhn www.google.de kljhl@hjkghgkhj.com nljbjkjk.de url tag html mail <a href='https://www.w3schools.com'>Visit W3Schools</a> hjhkhiuhziu kjhkl <a href=\"https://www.w2schools.com\">Visit W2Schools</a>. lknljnlk. kmm /n lmölmpöl < a href=\"https://www.w8schools.com\">Visit W8Schools</a> gfg fghfghnhg <a href=\"https://www.w33schools.com\">Visit W33Schools</a> nkjhjkhkjn,mn jnmnklmj j <a href=\"https://www.w22schools.com\">Visit W22Schools</ a> hghjcfgh hfgchnvhj vgjcgj cjghcj <a href=\"https://www.w99schools.com\">Visit W99Schools</a > 你好@yahoo.com eewfve test@莎士比亚.org 你好@莎士比亚.org Rδοκιμή@παράδειγμα.δοκιμή or 管理员@中国互联网络信息中心.中国 你好45@yahoo.com" + override func tearDown() { + // Put teardown code here. This method is called after the invocation of each test method in the class. + } + // General TestText for all (needs to simulate a body of text from which to extract specific Strings + var TestText = "blabla moep jkjlkj lkjkljknmbjks llhil k. jhkhkih. huhuhj! fsdf bob.alice@zedat.fu-berlin.de dfsf. jhjknjknjkh https://git.imp.fu-berlin.de/enzevalos/enzevalos_iphone/issues/240 hjkhjkhkhn www.google.de kljhl@hjkghgkhj.com nljbjkjk.de url tag html mail <a href='https://www.w3schools.com'>Visit W3Schools</a> hjhkhiuhziu kjhkl <a href=\"https://www.w2schools.com\">Visit W2Schools</a>. lknljnlk. kmm /n lmölmpöl < a href=\"https://www.w8schools.com\">Visit W8Schools</a> gfg fghfghnhg <a href=\"https://www.w33schools.com\">Visit W33Schools</a> nkjhjkhkjn,mn jnmnklmj j <a href=\"https://www.w22schools.com\">Visit W22Schools</ a> hghjcfgh hfgchnvhj vgjcgj cjghcj <a href=\"https://www.w99schools.com\">Visit W99Schools</a > 你好@yahoo.com eewfve test@莎士比亚.org 你好@莎士比亚.org Rδοκιμή@παράδειγμα.δοκιμή or 管理员@中国互联网络信息中心.中国 你好45@yahoo.com" - // setup for find mail address in text - var finalMailAddresses = ["bob.alice@zedat.fu-berlin.de", - "kljhl@hjkghgkhj.com", - "你好@yahoo.com", - "test@莎士比亚.org", - "你好@莎士比亚.org", - "Rδοκιμή@παράδειγμα.δοκιμή", - "管理员@中国互联网络信息中心.中国", - "你好45@yahoo.com"] + // setup for find mail address in text + var finalMailAddresses = ["bob.alice@zedat.fu-berlin.de", + "kljhl@hjkghgkhj.com", + "你好@yahoo.com", + "test@莎士比亚.org", + "你好@莎士比亚.org", + "Rδοκιμή@παράδειγμα.δοκιμή", + "管理员@中国互联网络信息中心.中国", + "你好45@yahoo.com"] - func testFindEmails(){ - let arr = TestText.findEmails() - XCTAssertNotNil(arr) - XCTAssertEqual(arr[0], finalMailAddresses[0]) - XCTAssertEqual(arr[1], finalMailAddresses[1]) - XCTAssertEqual(arr[2], finalMailAddresses[2]) - XCTAssertEqual(arr[3], finalMailAddresses[3]) - XCTAssertEqual(arr[4], finalMailAddresses[4]) - XCTAssertEqual(arr[5], finalMailAddresses[5]) - XCTAssertEqual(arr[6], finalMailAddresses[6]) - XCTAssertEqual(arr[7], finalMailAddresses[7]) - } - - // setup email validation - var validEmails = ["alice.bob@moep.blubb.de", - "test@google.com", - "test@google.co.uk", - "你好@yahoo.com", - "test@莎士比亚.org", - "你好@莎士比亚.org", - "Rδοκιμή@παράδειγμα.δοκιμή", - "管理员@中国互联网络信息中心.中国", - "你好45@yahoo.com"] + func testFindEmails(){ + let arr = TestText.findEmails() + XCTAssertNotNil(arr) + XCTAssertEqual(arr[0], finalMailAddresses[0]) + XCTAssertEqual(arr[1], finalMailAddresses[1]) + XCTAssertEqual(arr[2], finalMailAddresses[2]) + XCTAssertEqual(arr[3], finalMailAddresses[3]) + XCTAssertEqual(arr[4], finalMailAddresses[4]) + XCTAssertEqual(arr[5], finalMailAddresses[5]) + XCTAssertEqual(arr[6], finalMailAddresses[6]) + XCTAssertEqual(arr[7], finalMailAddresses[7]) + } + + // setup email validation + var validEmails = ["alice.bob@moep.blubb.de", + "test@google.com", + "test@google.co.uk", + "你好@yahoo.com", + "test@莎士比亚.org", + "你好@莎士比亚.org", + "Rδοκιμή@παράδειγμα.δοκιμή", + "管理员@中国互联网络信息中心.中国", + "你好45@yahoo.com"] - var notValidEmails = ["test@@google.com", - "test@google", - "Abc.example.com", - "A@b@c@example.com", - "this is\"not\\allowed@example.com", - "this\\ still\\\"not\\\\allowed@example.com", - "1234567890123456789012345678901234567890123456789012345678901234+x@example.com"] - ///Finding Email adresses etc. - func testIsValidEmail(){ - for v in validEmails { - XCTAssertTrue(v.isValidEmail()) - } - for n in notValidEmails{ - XCTAssertFalse(n.isValidEmail()) - } + var notValidEmails = ["test@@google.com", + "test@google", + "Abc.example.com", + "A@b@c@example.com", + "this is\"not\\allowed@example.com", + "this\\ still\\\"not\\\\allowed@example.com", + "1234567890123456789012345678901234567890123456789012345678901234+x@example.com"] + + //Finding Email adresses etc. + func testIsValidEmail(){ + for v in validEmails { + XCTAssertTrue(v.isValidEmail()) } - - // setup for mail address splitting - var correctSplit_0 = ["alice.bob", "moep", "blubb", "de"] - var correctSplit_1 = ["test", "google", "com"] - var correctSplit_2 = ["test", "google", "co", "uk"] - var correctSplit_3 = ["你好", "yahoo", "com"] - var correctSplit_4 = ["test", "莎士比亚", "org"] - var correctSplit_5 = ["你好", "莎士比亚", "org"] - var correctSplit_6 = ["Rδοκιμή", "παράδειγμα", "δοκιμή"] - var correctSplit_7 = ["管理员", "中国互联网络信息中心", "中国"] - var correctSplit_8 = ["你好45", "yahoo", "com"] - var spliEmails:[Any] { - return [correctSplit_0, correctSplit_1, correctSplit_2, correctSplit_3, correctSplit_4, correctSplit_5, correctSplit_6, correctSplit_7, correctSplit_8] + for n in notValidEmails{ + XCTAssertFalse(n.isValidEmail()) } + } + + // setup for mail address splitting + var correctSplit_0 = ["alice.bob", "moep", "blubb", "de"] + var correctSplit_1 = ["test", "google", "com"] + var correctSplit_2 = ["test", "google", "co", "uk"] + var correctSplit_3 = ["你好", "yahoo", "com"] + var correctSplit_4 = ["test", "莎士比亚", "org"] + var correctSplit_5 = ["你好", "莎士比亚", "org"] + var correctSplit_6 = ["Rδοκιμή", "παράδειγμα", "δοκιμή"] + var correctSplit_7 = ["管理员", "中国互联网络信息中心", "中国"] + var correctSplit_8 = ["你好45", "yahoo", "com"] + var spliEmails:[Any] { + return [correctSplit_0, correctSplit_1, correctSplit_2, correctSplit_3, correctSplit_4, correctSplit_5, correctSplit_6, correctSplit_7, correctSplit_8] + } - func testSplitMailAddress(){ - for (i, email) in validEmails.enumerated(){ - let arr = (email.splitAddress()) - XCTAssertNotNil(arr) - for (j, _) in arr.enumerated() - { - let array = spliEmails[i] as? [String] - XCTAssertEqual(arr[j], array?[j]) - } + func testSplitMailAddress(){ + for (i, email) in validEmails.enumerated(){ + let arr = (email.splitAddress()) + XCTAssertNotNil(arr) + for (j, _) in arr.enumerated() + { + let array = spliEmails[i] as? [String] + XCTAssertEqual(arr[j], array?[j]) } } + } - var finalTestEMailIdentity = ["alice.bob", "test", "test", "你好", "test", "你好", "Rδοκιμή", "管理员", "你好45"] - func testGetMailIdentity(){ - for (i, email) in validEmails.enumerated(){ - let arr = (email.getLocalMailIdentity()) - XCTAssertNotNil(arr) - XCTAssertEqual(arr, finalTestEMailIdentity[i]) - } + var finalTestEMailIdentity = ["alice.bob", "test", "test", "你好", "test", "你好", "Rδοκιμή", "管理员", "你好45"] + func testGetMailIdentity(){ + for (i, email) in validEmails.enumerated(){ + let arr = (email.getLocalMailIdentity()) + XCTAssertNotNil(arr) + XCTAssertEqual(arr, finalTestEMailIdentity[i]) } + } - var eMailSubDomain_0 = ["moep", "blubb"] - var eMailSubDomain_1 = ["παράδειγμα"] - var eMailSubDomain_2 = ["中国互联网络信息中心"] - var eMailSubDomain_3 = ["google", "co"] - func testGetSubdomains(){ - let arr_0 = validEmails[0].getSubdomains() - XCTAssertNotNil(arr_0) - XCTAssertEqual(arr_0[0], eMailSubDomain_0[0]) - XCTAssertEqual(arr_0[1], eMailSubDomain_0[1]) - - let arr_1 = validEmails[6].getSubdomains() - XCTAssertNotNil(arr_1) - XCTAssertEqual(arr_1[0], eMailSubDomain_1[0]) - - let arr_2 = validEmails[7].getSubdomains() - XCTAssertNotNil(arr_2) - XCTAssertEqual(arr_2[0], eMailSubDomain_2[0]) + var eMailSubDomain_0 = ["moep", "blubb"] + var eMailSubDomain_1 = ["παράδειγμα"] + var eMailSubDomain_2 = ["中国互联网络信息中心"] + var eMailSubDomain_3 = ["google", "co"] + func testGetSubdomains(){ + let arr_0 = validEmails[0].getSubdomains() + XCTAssertNotNil(arr_0) + XCTAssertEqual(arr_0[0], eMailSubDomain_0[0]) + XCTAssertEqual(arr_0[1], eMailSubDomain_0[1]) + + let arr_1 = validEmails[6].getSubdomains() + XCTAssertNotNil(arr_1) + XCTAssertEqual(arr_1[0], eMailSubDomain_1[0]) - let arr_3 = validEmails[2].getSubdomains() - XCTAssertNotNil(arr_3) - XCTAssertEqual(arr_3[0], eMailSubDomain_3[0]) - XCTAssertEqual(arr_3[1], eMailSubDomain_3[1]) - } + let arr_2 = validEmails[7].getSubdomains() + XCTAssertNotNil(arr_2) + XCTAssertEqual(arr_2[0], eMailSubDomain_2[0]) - var finalTestEMailDomain = ["de", "com", "uk", "com", "org", "org", "δοκιμή", "中国", "com"] - func testGetDomain(){ - for (i, email) in validEmails.enumerated(){ - let arr = (email.getDomain()) - XCTAssertNotNil(arr) - XCTAssertEqual(arr, finalTestEMailDomain[i]) - } + let arr_3 = validEmails[2].getSubdomains() + XCTAssertNotNil(arr_3) + XCTAssertEqual(arr_3[0], eMailSubDomain_3[0]) + XCTAssertEqual(arr_3[1], eMailSubDomain_3[1]) + } + + var finalTestEMailDomain = ["de", "com", "uk", "com", "org", "org", "δοκιμή", "中国", "com"] + func testGetDomain(){ + for (i, email) in validEmails.enumerated(){ + let arr = (email.getDomain()) + XCTAssertNotNil(arr) + XCTAssertEqual(arr, finalTestEMailDomain[i]) } } + + func testTextFindMailAddress() { + let arr = TestText.findMailAddress() + XCTAssertNotNil(arr) + XCTAssertEqual(arr[0], finalMailAddresses[0]) + XCTAssertEqual(arr[1], finalMailAddresses[1]) + } + + func testGetMailDomain() { + XCTAssertEqual("test@google.com".getMailDomains(), "google") + XCTAssertEqual("test@google.co.uk".getMailDomains(), "google.co") + } +} + diff --git a/enzevalos_iphoneTests/phishing/MailComparisonTests.swift b/enzevalos_iphoneTests/phishing/MailComparisonTests.swift new file mode 100644 index 0000000000000000000000000000000000000000..910b3334651ca0f53c233047fa07846a48c47451 --- /dev/null +++ b/enzevalos_iphoneTests/phishing/MailComparisonTests.swift @@ -0,0 +1,114 @@ +// +// MailComparisonTests.swift +// enzevalos_iphoneTests +// +// Created by Viktoria Sorgalla on 29.03.20. +// Copyright © 2020 fu-berlin. All rights reserved. +// +import XCTest +import Contacts + +@testable import enzevalos_iphone +class MailComparisonTests: XCTestCase { + let datahandler = DataHandler.handler + let userAdr = "alice@example.com" + let userName = "alice" + var user: MCOAddress = MCOAddress.init(displayName: "alice", mailbox: "alice@example.com") + let userAdr_1 = "bob@enzevalos.de" + let userName_1 = "bob" + var user_1: MCOAddress = MCOAddress.init(displayName: "bob", mailbox: "bob@enzevalos.de") + let userAdr_2 = "carl@test.com" + let userName_2 = "carl" + var user_2: MCOAddress = MCOAddress.init(displayName: "Carl", mailbox: "carl@test.com") + let userAddr_3_1 = "david@123.com" + let userAddr_3_2 = "david@1234.com" + let userName_3 = "david" + var user_3_1: MCOAddress = MCOAddress.init(displayName: "david", mailbox: "david@123.com") + var user_3_2: MCOAddress = MCOAddress.init(displayName: "david", mailbox: "david@1234.com") + + override func setUp() { + super.setUp() + datahandler.reset() + XCTAssertEqual(datahandler.getContacts().count, 0) + XCTAssertEqual(datahandler.getAddresses().count, 0) + } + + override func tearDown() { + datahandler.reset() + super.tearDown() + } + + func testMail(from: MCOAddress, to: [MCOAddress], cc: [MCOAddress], bcc: [MCOAddress], flags: MCOMessageFlag = MCOMessageFlag.init(rawValue: 0), folder: String = "INBOX", date: Date = Date(timeIntervalSince1970: TimeInterval(arc4random())), cryptoObject: CryptoObject? = nil, body: String = String.random(length: 20)) -> PersistentMail? { + + let subject = String.random(length: 20) + let id = UInt64(arc4random()) + var body = body + + if let decryptedBody = cryptoObject?.decryptedText { + body = decryptedBody + } + var mail: PersistentMail? + mail = datahandler.createMail(id, sender: from, receivers: to, cc: cc, time: date, received: true, subject: subject, body: body, flags: flags, record: nil, autocrypt: nil, decryptedData: cryptoObject, folderPath: folder, secretKey: nil, encryptedBody: cryptoObject?.chiperString) + + return mail + } + + private func createAddressBook(_ senders: [MCOAddress]) { + for sender in senders { + let con = CNMutableContact() + let value = sender.mailbox! as AnyObject + + let name = sender.displayName + let nameArray = name!.split(separator: " ").map(String.init) + con.givenName = nameArray.first! + con.emailAddresses.append(CNLabeledValue(label: CNLabelOther, value: value as! NSString)) + // Saving the newly created contact + let store = CNContactStore() + let saveRequest = CNSaveRequest() + saveRequest.add(con, toContainerWithIdentifier:nil) + try! store.execute(saveRequest) + } + + } + private func resetAddressBook(_ senders: [MCOAddress]) { + for sender in senders { + do { + let name = sender.displayName! + let predicate = CNContact.predicateForContacts(matchingName: name) + let store = CNContactStore() + let contacts = try store.unifiedContacts(matching: predicate,keysToFetch: [CNContactGivenNameKey as CNKeyDescriptor, CNContactFamilyNameKey as CNKeyDescriptor, CNContactImageDataKey as CNKeyDescriptor]) + guard contacts.count > 0, let selectedContact = contacts.first else { throw Error.self as! Error } + + let request = CNSaveRequest() + let mutableContact = selectedContact.mutableCopy() as! CNMutableContact + request.delete(mutableContact) + try store.execute(request) + } catch { } + } + } + + func testCompareSenderToContacts () { + let mail_1 = testMail(from: user, to: [], cc: [], bcc: []) + let mail_2 = testMail(from: user_1, to: [], cc: [], bcc: []) + let mail_3 = testMail(from: user_2, to: [], cc: [], bcc: []) + let mail_4 = testMail(from: user_2, to: [], cc: [], bcc: []) + let mail_5 = testMail(from: user_3_1, to: [], cc: [], bcc: []) + let mail_6 = testMail(from: user_3_2, to: [], cc: [], bcc: []) + + let mailsInInbox: [PersistentMail] = [mail_1!, mail_2!, mail_3!, mail_4!, mail_5!, mail_6!] + + + createAddressBook([user]) + + XCTAssertEqual(ResultCompareSenderToContacts.isContact, mailsInInbox[0].from.mailAddress.compareSenderToContacts()) + XCTAssertEqual(ResultCompareSenderToContacts.Unknown, mailsInInbox[1].from.mailAddress.compareSenderToContacts()) + XCTAssertEqual(ResultCompareSenderToContacts.isSender, mailsInInbox[2].from.mailAddress.compareSenderToContacts()) + + XCTAssertEqual(ResultCompareSenderToContacts.OnlyIdentity, mailsInInbox[4].from.mailAddress.compareSenderToContacts()) // userAddr_3_2 + + // The created user has to be deleted after the test + resetAddressBook([user]) + + } +} + diff --git a/enzevalos_iphoneTests/phishing/TyposquattingTests.swift b/enzevalos_iphoneTests/phishing/TyposquattingTests.swift new file mode 100644 index 0000000000000000000000000000000000000000..7f280ebce9a211b1f8cb01dacde05825cda2be98 --- /dev/null +++ b/enzevalos_iphoneTests/phishing/TyposquattingTests.swift @@ -0,0 +1,88 @@ +// +// TyposquattingTests.swift +// enzevalos_iphoneTests +// +// Created by Lauren Elden on 30.03.20. +// Copyright © 2020 fu-berlin. All rights reserved. +// + +import XCTest + +@testable import enzevalos_iphone + +class TyposquattingTests: XCTestCase { + + let typosquatting = Typosquatting() + + // Setup for testcases + let validRD = ["fu-berlin.de", "google.de", "nljbjkjk.de", "w3schools.com", "w2schools.com", "w8schools.com", "w33schools.com", "w22schools.com", "w99schools.eu.com", "3schools.com"] + + let validSLD = ["fu-berlin", "google", "nljbjkjk", "w3schools", "w2schools", "w8schools", "w33schools", "w22schools", "w99schools.eu", "3schools"] + + let validURLs = ["www.fu-berlin.de", "www.google.de", "nljbjkjk.com", "www.w3schools.com", "www.w2schools.com", "www.w8schools.de", "www.w33schools.com", "www.w22schools.com", "www.w99schools.eu.com", "www.3schools.com"] + + let testMailText = "https://git.imp.fu-berlin.de/enzevalos/enzevalos_iphone/issues/240http:// www.google.de http://nljbjkjk.de https://www.w3schools.com https://www.w2schools.com https://www.w8schools.com https://www.w33schools.com https://www.w22schools.com https://www.w99schools.eu.com https://git.imp.fu-ber_lin.de/enzevalos/enzevalos_iphone/issues/240 http://www.google-.de http://nljbj#kjk.de https://www.3schools.com https://www.w2sc..hools.com https://www.w8sch?ools.com https://www.w33sc_hools.com https://www.w22schooIs.com https://www.W99schools$.com" + + + func testIsValidRD() { + let pattern = typosquatting.isValidRD(mailBody: testMailText) + XCTAssertNotNil(pattern) + XCTAssertEqual(pattern[0], validRD[0]) + XCTAssertEqual(pattern[1], validRD[1]) + XCTAssertEqual(pattern[2], validRD[2]) + XCTAssertEqual(pattern[3], validRD[3]) + XCTAssertEqual(pattern[4], validRD[4]) + XCTAssertEqual(pattern[5], validRD[5]) + XCTAssertEqual(pattern[6], validRD[6]) + XCTAssertEqual(pattern[7], validRD[7]) + XCTAssertEqual(pattern[8], validRD[8]) + XCTAssertEqual(pattern[9], validRD[9]) + } + + func testCompareDomainWithDomians() { + let domain = "w2schools" + XCTAssertFalse(typosquatting.compareDomainWithDomians(secondLvlDomain: domain, domains: validSLD, allowedEditDistance: 4)) + } + + func testGetDomainEditDistance() { + let domain = "w2schools" + print(typosquatting.getDomainEditDistanceAsDic(domain: domain, domains: validSLD)) + } + + func testCompareDomainWithDomiansDic() { + let domain = "w2schools" + print(typosquatting.compareDomainWithDomiansAsDic(secondLvlDomain: domain, domains: validSLD, allowedEditDistance: 4)) + } + + func testGetSLDEditdistance() { + let url = "www.w2schools.com" + print(typosquatting.getSLDEditdistanceAsDic(url: url, domains: validSLD)) + } + + func testGetURLEditdistanceAsDic() { + let url = "www.w2schools.com" + print(typosquatting.getURLEditdistanceAsDic(url: url, urls: validURLs)) + } + + func testCompareURLWithSLDListAsDic() { + let url = "www.w2schools.com" + print(typosquatting.compareURLWithSLDListAsDic(url: url, domains: validSLD, allowedEditDistance: 4)) + } + + func testCompareURLWithSLDList() { + let url = "www.google.com" + let domains = ["googIe", "google", "gogle", "gooGle", "gle", "glllll"] + XCTAssertFalse(typosquatting.compareURLWithSLDList(url: url, domains: domains)) + } + + func testCompareURLsAsDic() { + let url = "www.google.com" + print(typosquatting.compareURLsAsDic(url: url, urls: validURLs, allowedEditDistance: 4)) + } + + func testCompareURLs() { + let url = "www.w2schools.com" + let (bool, _) = typosquatting.compareURLs(myUrl: url, urls: validURLs) + XCTAssertFalse(bool) + } +} diff --git a/enzevalos_iphoneTests/phishing/UrlStringExtensionTests.swift b/enzevalos_iphoneTests/phishing/UrlStringExtensionTests.swift index 8bcabf7dc73b30376b1c1a47ae5734baebccb684..d1f26673af1290824c667325f1e86ebd959a53ea 100644 --- a/enzevalos_iphoneTests/phishing/UrlStringExtensionTests.swift +++ b/enzevalos_iphoneTests/phishing/UrlStringExtensionTests.swift @@ -10,13 +10,26 @@ import XCTest class UrlStringExtensionTests: XCTestCase { + // Setup for Critical Pattern of a Root Domain + var testMailText = "https://git.imp.fu-berlin.de/enzevalos/enzevalos_iphone/issues/240http:// www.google.de http://nljbjkjk.de https://www.w3schools.com https://www.w2schools.com https://www.w8schools.com https://www.w33schools.com https://www.w22schools.com https://www.w99schools.eu.com https://git.imp.fu-ber_lin.de/enzevalos/enzevalos_iphone/issues/240 http://www.google-.de http://nljbj#kjk.de https://www.3schools.com https://www.w2sc..hools.com https://www.w8sch?ools.com https://www.w33sc_hools.com https://www.w22schooIs.com https://www.W99schools$.com" + var vaildRD = ["fu-berlin.de", "google.de", "nljbjkjk.de", "w3schools.com", "w2schools.com", "w8schools.com", "w33schools.com", "w22schools.com", "w99schools.eu.com", "3schools.com"] + // Setup for get second level doamin of URL + var finalSLD = ["fu-berlin", "google", "nljbjkjk", "w3schools", "w2schools", "w8schools", "w33schools", "w22schools", "w99schools"] + // Setup for get root domein of URL + var testmailURL = "https://git.imp.fu-ber_lin.de/enzevalos/enzevalos_iphone/issues/240 http://www.google-.de http://nljbj#kjk.de https://www.3schools.com https://www.w2sc..hools.com https://www.w8sch?ools.com https://www.w33sc_hools.com https://www.w22schooIs.com https://www.W99schools$.com https://git.imp.fu-berlin.de/enzevalos/enzevalos_iphone/issues/240 http://www.google.de http://nljbjkjk.de https://www.w3schools.com https://www.w2schools.com https://www.w8schools.com https://www.w33schools.com https://www.w22schools.com https://www.w99schools.eu.com bob.alice@zedat.fu-berlin.de https://git.imp.fu-berlin.de/enzevalos/enzevalos_iphone/issues/240 www.google.de kljhl@hjkghgkhj.com nljbjkjk.de https://www.w3#schools.com/ https://www.w2schools.com/ https://www.w8schools.com/ https://www.w33schools.com/ https://www.w22schools.com/ https://www.w99schools.com/ 你好@yahoo.com test@莎士比亚.org 你好@莎士比亚.org Rδοκιμή@παράδειγμα.δοκιμή 管理员@中国互联网络信息中心.中国 你好@yahoo.com test@莎士比亚.org 你好@莎士比亚.org" + var finalRD = ["fu-berlin.de", "google.de", "nljbjkjk.de", "w3schools.com", "w2schools.com", "w8schools.com", "w33schools.com", "w22schools.com", "w99schools.com"] + + // Setup for critical pattern of a root domain + var testmail = "fu-ber_lin.de google-.de nljbj#kjk.de 3schools.com w2sc..hools.com w8sch?ools.com w33sc_hools.com w22schooIs.com W99schools$.com fu-berlin.de google.de nljbjkjk.de w3schools.com w2schools.com w8schools.com w33schools.com w22schools.com w99schools.eu.com bob.alice@zedat.fu-berlin.de git.imp.fu-berlin.de google.de kljhl@hjkghgkhj.com nljbjkjk.de w3#schools.com w2schools.com w8schools.com w33schools.com w22schools.com w99schools.com 你好@yahoo.com test@莎士比亚.org 你好@莎士比亚.org Rδοκιμή@παράδειγμα.δοκιμή 管理员@中国互联网络信息中心.中国 你好@yahoo.com test@莎士比亚.org 你好@莎士比亚.org" + var finalunciticalrd = ["3schools.com", "fu-berlin.de", "google.de", "nljbjkjk.de", "w3schools.com", "w2schools.com", "w8schools.com", "w33schools.com", "w22schools.com", "w99schools.eu.com", "git.imp.fu-berlin.de", "google.de", "w2schools.com", "w8schools.com", "w33schools.com", "w22schools.com", "w99schools.com"] + // General TestText for all (needs to simulate a body of text from which to extract specific Strings var TestText = "blabla moep jkjlkj lkjkljknmbjks llhil k. jhkhkih. huhuhj! fsdf bob.alice@zedat.fu-berlin.de dfsf. jhjknjknjkh https://git.imp.fu-berlin.de/enzevalos/enzevalos_iphone/issues/240 hjkhjkhkhn www.google.de kljhl@hjkghgkhj.com nljbjkjk.de url tag html mail <a href='https://www.w3schools.com'>Visit W3Schools</a> hjhkhiuhziu kjhkl <a href=\"https://www.w2schools.com\">Visit W2Schools</a>. lknljnlk. kmm /n lmölmpöl < a href=\"https://www.w8schools.com\">Visit W8Schools</a> gfg fghfghnhg <a href=\"https://www.w33schools.com\">Visit W33Schools</a> nkjhjkhkjn,mn jnmnklmj j <a href=\"https://www.w22schools.com\">Visit W22Schools</ a> hghjcfgh hfgchnvhj vgjcgj cjghcj <a href=\"https://www.w99schools.com\">Visit W99Schools</a > 你好@yahoo.com eewfve test@莎士比亚.org 你好@莎士比亚.org Rδοκιμή@παράδειγμα.δοκιμή or 管理员@中国互联网络信息中心.中国 你好45@yahoo.com" - // setup for find URLs in text + // Setup for find URLs in text var finalURLs = ["https://git.imp.fu-berlin.de/enzevalos/enzevalos_iphone/issues/240", "http://www.google.de", "http://nljbjkjk.de", "https://www.w3schools.com", "https://www.w2schools.com", "https://www.w8schools.com", "https://www.w33schools.com", "https://www.w22schools.com", "https://www.w99schools.com"] - // setup for tag tests + // Setup for tag tests var finalTestTextFindHtmlTags = ["<a href=\'https://www.w3schools.com\'>Visit W3Schools</a>", "<a href=\"https://www.w2schools.com\">Visit W2Schools</a>", "< a href=\"https://www.w8schools.com\">Visit W8Schools</a>", "<a href=\"https://www.w33schools.com\">Visit W33Schools</a>", "<a href=\"https://www.w22schools.com\">Visit W22Schools</ a>", "<a href=\"https://www.w99schools.com\">Visit W99Schools</a >"] var finalTestTextHtmlTagURL = ["https://www.w3schools.com", "https://www.w2schools.com", "https://www.w8schools.com", "https://www.w33schools.com", "https://www.w22schools.com", "https://www.w99schools.com"] @@ -24,6 +37,7 @@ class UrlStringExtensionTests: XCTestCase { var finalTestTexthttpTagLinkName = ["Visit W3Schools", "Visit W2Schools", "Visit W8Schools", "Visit W33Schools", "Visit W22Schools", "Visit W99Schools"] var testUrl = "www.google.de" + var testURL2 = "https://www.mycampus.imp.fu-berlin.de/portal" override func setUp() { super.setUp() @@ -79,4 +93,53 @@ class UrlStringExtensionTests: XCTestCase { XCTAssertNotNil(testUrl.url2ip()) //It changes often therefore a direct comparisson is not useful } + + // Test get Root Domain + func testGetRD() { + let rd = testMailText.getRD() + print(rd) + } + + // Test get Second Level Domain + func testGetSLD(){ + let sld = TestText.getSLD() + XCTAssertNotNil(sld) + XCTAssertEqual(sld[0], finalSLD[0]) + XCTAssertEqual(sld[1], finalSLD[1]) + XCTAssertEqual(sld[2], finalSLD[2]) + XCTAssertEqual(sld[3], finalSLD[3]) + } + + func testIsAllowedDistance() { + let str = "google" + // #distance: 0 1 2 3 4 < + let strArray = ["google", "googIe", "gogIe", "gooogIIe", "go", "amazon"] + XCTAssertTrue(str.isAllowedDistance(str: strArray[0], allowedEditDistance: 4)) + XCTAssertFalse(str.isAllowedDistance(str: strArray[1], allowedEditDistance: 4)) + XCTAssertFalse(str.isAllowedDistance(str: strArray[2], allowedEditDistance: 4)) + XCTAssertFalse(str.isAllowedDistance(str: strArray[3], allowedEditDistance: 6)) + XCTAssertTrue(str.isAllowedDistance(str: strArray[4], allowedEditDistance: 4)) + XCTAssertTrue(str.isAllowedDistance(str: strArray[5], allowedEditDistance: 4)) + } + + func testLevenshtein(){ + let str1 = "hallo" + let str2 = "hlalo" + let str3 = "haloo" + let str4 = "halo" + let str5 = "halllo" + let str6 = "halol" + let edd1 = str1.levenshtein(str2) + let edd2 = str1.levenshtein(str3) + let edd3 = str1.levenshtein(str4) + let edd4 = str1.levenshtein(str5) + let edd5 = str1.levenshtein(str6) + XCTAssertEqual(edd1, 2, "Wrong distance \(str1) vs \(str2)") + XCTAssertEqual(edd2, 2, "Wrong distance \(str1) vs \(str3)") + XCTAssertEqual(edd3, 1, "Wrong distance \(str1) vs \(str4)") + XCTAssertEqual(edd4, 1, "Wrong distance \(str1) vs \(str5)") + XCTAssertEqual(edd5, 2, "Wrong distance \(str1) vs \(str6)") + } + } + diff --git a/enzevalos_iphoneTests/testMails/SMIME Test 1 S.eml b/enzevalos_iphoneTests/testMails/SMIME Test 1 S.eml new file mode 100644 index 0000000000000000000000000000000000000000..2c8d85d2994dde0170d8b157d22df558902469ad --- /dev/null +++ b/enzevalos_iphoneTests/testMails/SMIME Test 1 S.eml @@ -0,0 +1,65 @@ +Date: Tue, 30 Jul 2019 18:57:01 +0200 (CEST) +From: Amari <tester@drengels.net> +To: Skyler <retset@drengels.net> +Message-ID: <777748410.398.1564505821347@HIKARU> +Subject: SMIME Test 1 S +MIME-Version: 1.0 +Content-Type: multipart/signed; protocol="application/pkcs7-signature"; micalg=sha-256; + boundary="----=_Part_397_1624510452.1564505821347" + +------=_Part_397_1624510452.1564505821347 +Content-Type: text/plain; charset=us-ascii +Content-Transfer-Encoding: 7bit + +Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod +tempor incididunt ut labore et dolore magna aliqua. Dolor sed viverra +ipsum nunc aliquet bibendum enim. +------=_Part_397_1624510452.1564505821347 +Content-Type: application/pkcs7-signature; name=smime.p7s; smime-type=signed-data +Content-Transfer-Encoding: base64 +Content-Disposition: attachment; filename="smime.p7s" +Content-Description: S/MIME Cryptographic Signature + +MIAGCSqGSIb3DQEHAqCAMIACAQExDzANBglghkgBZQMEAgEFADCABgkqhkiG9w0BBwEAAKCAMIID +rzCCApegAwIBAgIIqqF0KZ7dPfEwDQYJKoZIhvcNAQELBQAwNTELMAkGA1UEBhMCREUxEzARBgNV +BAoMCkEgTUFJTFRFU1QxETAPBgNVBAMMCG15VGVzdENBMB4XDTE5MDcyOTE2MzAxN1oXDTE5MDgw +NTE2MzAxN1owNzELMAkGA1UEBhMCREUxEzARBgNVBAoMCkEgTUFJTFRFU1QxEzARBgNVBAMMCnNl +bmRlcmtleTEwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCpF4M77d+ZRnYWyz2GzxVn +Ni4TpM6MuFcbuy0iOqqVAzON0SXfQoursZhgW4tILDuiUh0kvq7p/QjCkxUpYCuhLxUKGbJh1bhF +4t2UcTqvRszk7KBPKlhMgffyvXp9yyz2FmMT7nVUejEo7zuDJun0plMia1A7FftQKukcUvobeR+G +VR9lvH/WZy6l/bDJt+zL3bapZlW/IC5jp3csNf5PwqYsWBqh9teWlcB6BHb7k52ztpHx8VG72mAh +Ti7GQXYStTzY9uOfFIYC6DkdHN1o2e0D3mF5scU1a//U9NachpYV8cTpLZVHxGuh+q7bUIlZV50C +SQeQPfslWrTAQ7OxAgMBAAGjgcAwgb0wHgYDVR0RBBcwFYETdGVzdGVyQGRyZW5nZWxzLm5ldDAp +BgNVHQ4EIgQglM8SvneCtV3jEiwx8mBOsKNEIg0civ4D6Ovzn0OFwQswcAYDVR0jBGkwZ4AgssuC +912pWP0AkTwKs/09h5KG8eKAz4JzOkuz0RiH5uShOaQ3MDUxCzAJBgNVBAYTAkRFMRMwEQYDVQQK +DApBIE1BSUxURVNUMREwDwYDVQQDDAhteVRlc3RDQYIIq3HpoO6N9xMwDQYJKoZIhvcNAQELBQAD +ggEBADsOWapNKiylC1btmknLku+OylAOO9Sg/9xn0G6w/+pfF2Qw6acqKkltC+Miju31K8deKI1p +Un6WPgcCbVrlN5ISzF3CCRZV4527W0mTQ9GXpoTQ+dN0mMqcasGVm7jGIfnr4FQZc1XcdG10Bf+W +pN0SDNSlSfq54vT8dU2Q+R1Gl62TurZHW3XVmiofR8DfgmDH8B16BlgOz86PD9L6aB7Yb92f/qmt +AdMlPgtmiFO84+JMw4jdtqEiS5zs7u0b+VHHUN3y7qVbBoGdL2YEQNT+51q577hjcz+cS5XOMJee +kRbMu+E0bZLArgeOeqVm/QludFOsqHqazAIjMvlvYfIwggLlMIIBzQIIq3HpoO6N9xMwDQYJKoZI +hvcNAQELBQAwNTELMAkGA1UEBhMCREUxEzARBgNVBAoMCkEgTUFJTFRFU1QxETAPBgNVBAMMCG15 +VGVzdENBMB4XDTE5MDcyOTE1MzgwNFoXDTE5MDgwNTE1MzgwNFowNTELMAkGA1UEBhMCREUxEzAR +BgNVBAoMCkEgTUFJTFRFU1QxETAPBgNVBAMMCG15VGVzdENBMIIBIjANBgkqhkiG9w0BAQEFAAOC +AQ8AMIIBCgKCAQEAok5q1s8MveXD/u2p66BpEfGoyDHv8M4t1KcOcrroTKwasVynjc3e1Av7Subv +u3P+NzJWQcBkX1K/Vz+0hlrL8n3vlxukc8ytolVsz7+Yvp/XjCvBTisAksgsORnceqQoqesaZ+gq +sHVFn0sD40u1CV+K4/gLwS3ts5k6S4Z2rRNrKCi1bQQt5A9tVZdX8Zw/pd3QWcpAXub2KhGf0wrG +7hUObeFIoO03XPJdDUdeFBX9QY4NJoXJSCgJOfPuQVwXeFj0PDsznkIIzdTQ+d/G7FR2fyowfWXK +b8bkrnFpUtV8KOyXLwZRR8e2WzdjQXtzo0TkI+SO5vYc010Jb4kPQQIDAQABMA0GCSqGSIb3DQEB +CwUAA4IBAQAABVc0+1dVpQ/2TbA1kDDiE4qnmfQR146Sa0x152+5AXf135wcmQsePJOnfN3bZLUR +uAWA0HpE+VE9eJ7hqK9wMZIAZzzw0XbEQ57NstmvfTH8oBz3g4aywqOKf5fxoyhlKmlTFUcjWPqD +PJ28RaFUEhFSOB3gXm6JX5ME4A6Pf3EaSkJcgGBstF1qViPPFZhvlxHmqeIJVsqtGDahBaCFK0S6 +5FPDD1JAh5J6tvSWocXeBovzakYXgrUjQdsBeCr8P7EiPqVupmVyEjxripCrYhzvnJM//c238uzo +O3Xt5Po760D1bh61qD+8VaOFPAYEiOO/KuNMzd/C9Q3cchl6AAAxggJNMIICSQIBATBBMDUxCzAJ +BgNVBAYTAkRFMRMwEQYDVQQKDApBIE1BSUxURVNUMREwDwYDVQQDDAhteVRlc3RDQQIIqqF0KZ7d +PfEwDQYJYIZIAWUDBAIBBQCggd4wGAYJKoZIhvcNAQkDMQsGCSqGSIb3DQEHATAcBgkqhkiG9w0B +CQUxDxcNMTkwNzMwMTY1NzAxWjAtBgkqhkiG9w0BCTQxIDAeMA0GCWCGSAFlAwQCAQUAoQ0GCSqG +SIb3DQEBCwUAMC8GCSqGSIb3DQEJBDEiBCCMp2gMEAzej8ns+rB8sE2jqmSOS9iFX0yQ/2HJg1hS +XDBEBgkqhkiG9w0BCQ8xNzA1MAsGCWCGSAFlAwQBAjALBglghkgBZQMEARYwCwYJYIZIAWUDBAEq +MAwGCiqGSIb3DQEJDwEwDQYJKoZIhvcNAQELBQAEggEAM+dja90MWcbLsF/zzsLYWesWVVr5P2UE +EXOosl+We9DTqIsT+KwpklwVpY0yFXMx2FSTjFf3x4kfjtIQTQe0pHRefd1bfV3AXIPS34BCqZtO +ybnS1mVE7SJh5PEjimmtMCX7AB1ziYURI1B8FJrT0ECUSCKCaw04SbUUc7EurMEZ/A3LaZLD0zEt +jBKzhxvvUvUuz6AKGKZ9x1mIbb5N74KYgMJXioAwKzwwoZIf0AThflPPZGHNT3v3y/LP/HeB3bIJ +4kwwcSgwkMn1S888oc2TgykWDa5lcJSxXTef81exm0fhDyZI1em6PdkHscMmD4xWFgpEHZdrPYE3 +6MjJowAAAAAAAA== +------=_Part_397_1624510452.1564505821347-- diff --git a/enzevalos_iphoneTests/testMails/johnny C1.json.eml b/enzevalos_iphoneTests/testMails/johnny C1.json.eml new file mode 100644 index 0000000000000000000000000000000000000000..f35c7b2e692d1b9dc363c4b0f41e45b3ea2090ce --- /dev/null +++ b/enzevalos_iphoneTests/testMails/johnny C1.json.eml @@ -0,0 +1,67 @@ +Date: Tue, 30 Jul 2019 18:54:41 +0200 (CEST) +From: Amari <tester@drengels.net> +To: Skyler <retset@drengels.net> +Message-ID: <1939970407.2.1564505681456@HIKARU> +Subject: johnny C1.json +MIME-Version: 1.0 +Content-Type: multipart/mixed; + boundary="----=_Part_0_576261694.1564505681384" + +------=_Part_0_576261694.1564505681384 +Content-Type: text/plain; charset=us-ascii +Content-Transfer-Encoding: 7bit + +Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod +tempor incididunt ut labore et dolore magna aliqua. Dolor sed viverra +ipsum nunc aliquet bibendum enim. +------=_Part_0_576261694.1564505681384 +Content-Type: application/pkcs7-mime; name=smime.p7m; smime-type=signed-data +Content-Transfer-Encoding: base64 +Content-Disposition: attachment; filename="smime.p7m" +Content-Description: S/MIME Cryptographic Signed Data + +MIAGCSqGSIb3DQEHAqCAMIACAQExDzANBglghkgBZQMEAgEFADCABgkqhkiG9w0BBwGggCSABG1D +b250ZW50LVR5cGU6IHRleHQvcGxhaW47IGNoYXJzZXQ9dXMtYXNjaWkNCkNvbnRlbnQtVHJhbnNm +ZXItRW5jb2Rpbmc6IDdiaXQNCg0KVGV4dCBlbWJlZGRlZCBpbiB0aGUgc2lnbmF0dXJlAAAAAAAA +oIAwggOvMIICl6ADAgECAgiqoXQpnt098TANBgkqhkiG9w0BAQsFADA1MQswCQYDVQQGEwJERTET +MBEGA1UECgwKQSBNQUlMVEVTVDERMA8GA1UEAwwIbXlUZXN0Q0EwHhcNMTkwNzI5MTYzMDE3WhcN +MTkwODA1MTYzMDE3WjA3MQswCQYDVQQGEwJERTETMBEGA1UECgwKQSBNQUlMVEVTVDETMBEGA1UE +AwwKc2VuZGVya2V5MTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAKkXgzvt35lGdhbL +PYbPFWc2LhOkzoy4Vxu7LSI6qpUDM43RJd9Ci6uxmGBbi0gsO6JSHSS+run9CMKTFSlgK6EvFQoZ +smHVuEXi3ZRxOq9GzOTsoE8qWEyB9/K9en3LLPYWYxPudVR6MSjvO4Mm6fSmUyJrUDsV+1Aq6RxS ++ht5H4ZVH2W8f9ZnLqX9sMm37MvdtqlmVb8gLmOndyw1/k/CpixYGqH215aVwHoEdvuTnbO2kfHx +UbvaYCFOLsZBdhK1PNj2458UhgLoOR0c3WjZ7QPeYXmxxTVr/9T01pyGlhXxxOktlUfEa6H6rttQ +iVlXnQJJB5A9+yVatMBDs7ECAwEAAaOBwDCBvTAeBgNVHREEFzAVgRN0ZXN0ZXJAZHJlbmdlbHMu +bmV0MCkGA1UdDgQiBCCUzxK+d4K1XeMSLDHyYE6wo0QiDRyK/gPo6/OfQ4XBCzBwBgNVHSMEaTBn +gCCyy4L3XalY/QCRPAqz/T2Hkobx4oDPgnM6S7PRGIfm5KE5pDcwNTELMAkGA1UEBhMCREUxEzAR +BgNVBAoMCkEgTUFJTFRFU1QxETAPBgNVBAMMCG15VGVzdENBggircemg7o33EzANBgkqhkiG9w0B +AQsFAAOCAQEAOw5Zqk0qLKULVu2aScuS747KUA471KD/3GfQbrD/6l8XZDDppyoqSW0L4yKO7fUr +x14ojWlSfpY+BwJtWuU3khLMXcIJFlXjnbtbSZND0ZemhND503SYypxqwZWbuMYh+evgVBlzVdx0 +bXQF/5ak3RIM1KVJ+rni9Px1TZD5HUaXrZO6tkdbddWaKh9HwN+CYMfwHXoGWA7Pzo8P0vpoHthv +3Z/+qa0B0yU+C2aIU7zj4kzDiN22oSJLnOzu7Rv5UcdQ3fLupVsGgZ0vZgRA1P7nWrnvuGNzP5xL +lc4wl56RFsy74TRtksCuB456pWb9CW50U6yoeprMAiMy+W9h8jCCAuUwggHNAgircemg7o33EzAN +BgkqhkiG9w0BAQsFADA1MQswCQYDVQQGEwJERTETMBEGA1UECgwKQSBNQUlMVEVTVDERMA8GA1UE +AwwIbXlUZXN0Q0EwHhcNMTkwNzI5MTUzODA0WhcNMTkwODA1MTUzODA0WjA1MQswCQYDVQQGEwJE +RTETMBEGA1UECgwKQSBNQUlMVEVTVDERMA8GA1UEAwwIbXlUZXN0Q0EwggEiMA0GCSqGSIb3DQEB +AQUAA4IBDwAwggEKAoIBAQCiTmrWzwy95cP+7anroGkR8ajIMe/wzi3Upw5yuuhMrBqxXKeNzd7U +C/tK5u+7c/43MlZBwGRfUr9XP7SGWsvyfe+XG6RzzK2iVWzPv5i+n9eMK8FOKwCSyCw5Gdx6pCip +6xpn6CqwdUWfSwPjS7UJX4rj+AvBLe2zmTpLhnatE2soKLVtBC3kD21Vl1fxnD+l3dBZykBe5vYq +EZ/TCsbuFQ5t4Uig7Tdc8l0NR14UFf1Bjg0mhclIKAk58+5BXBd4WPQ8OzOeQgjN1ND538bsVHZ/ +KjB9ZcpvxuSucWlS1Xwo7JcvBlFHx7ZbN2NBe3OjROQj5I7m9hzTXQlviQ9BAgMBAAEwDQYJKoZI +hvcNAQELBQADggEBAAAFVzT7V1WlD/ZNsDWQMOITiqeZ9BHXjpJrTHXnb7kBd/XfnByZCx48k6d8 +3dtktRG4BYDQekT5UT14nuGor3AxkgBnPPDRdsRDns2y2a99MfygHPeDhrLCo4p/l/GjKGUqaVMV +RyNY+oM8nbxFoVQSEVI4HeBebolfkwTgDo9/cRpKQlyAYGy0XWpWI88VmG+XEeap4glWyq0YNqEF +oIUrRLrkU8MPUkCHknq29Jahxd4Gi/NqRheCtSNB2wF4Kvw/sSI+pW6mZXISPGuKkKtiHO+ckz/9 +zbfy7Og7de3k+jvrQPVuHrWoP7xVo4U8BgSI478q40zN38L1DdxyGXoAADGCAk0wggJJAgEBMEEw +NTELMAkGA1UEBhMCREUxEzARBgNVBAoMCkEgTUFJTFRFU1QxETAPBgNVBAMMCG15VGVzdENBAgiq +oXQpnt098TANBglghkgBZQMEAgEFAKCB3jAYBgkqhkiG9w0BCQMxCwYJKoZIhvcNAQcBMBwGCSqG +SIb3DQEJBTEPFw0xOTA3MzAxNjU0NDFaMC0GCSqGSIb3DQEJNDEgMB4wDQYJYIZIAWUDBAIBBQCh +DQYJKoZIhvcNAQELBQAwLwYJKoZIhvcNAQkEMSIEIOMEtF0dzihCk0ovkZlOjrTLkTvzn6li1O5H +kGIgC6AmMEQGCSqGSIb3DQEJDzE3MDUwCwYJYIZIAWUDBAECMAsGCWCGSAFlAwQBFjALBglghkgB +ZQMEASowDAYKKoZIhvcNAQkPATANBgkqhkiG9w0BAQsFAASCAQAsn6HQfhnSiH+hjlmk2lh62+Cl +/81yTg2uyavLEH3vfpdcuAWTPjVNw9LctZdTjblrcW/RMEHL+HadOrI8h0l5/QmxmVyqujZ4Ih7F +LOtqeMVQ9jYFNgED++VJcdHBmg5RJRJ3bji0iM/D+XnAFeyfTyNFPiXV3HUtFT0GtRbJX0pIEWms +WfjgLLuaMtnpG2kexkijqW+S1dAbr2j6eWZZxzofTajK0vKADn/os1h5riWOGoLLtd9elzs19jxg +YYMNNILI9YLjgRTUMepZCduKKfBvNOh61sHHsrZ9CE2H5tHGda83YIeUZqJfDUsqa4LDnJvE+w9j +34xD7G4TIytqAAAAAAAA +------=_Part_0_576261694.1564505681384-- diff --git a/myKey.pem b/myKey.pem new file mode 100644 index 0000000000000000000000000000000000000000..68e28d6f471157958e18e57f56b6c5a3f9701b4f --- /dev/null +++ b/myKey.pem @@ -0,0 +1,40 @@ +-----BEGIN CERTIFICATE----- +MIIDpzCCAo+gAwIBAgIIkMopuuUM9N4wDQYJKoZIhvcNAQELBQAwNTELMAkGA1UE +BhMCREUxEzARBgNVBAoMCkEgTUFJTFRFU1QxETAPBgNVBAMMCG15VGVzdENBMB4X +DTIwMDMwNTEzMzUxNVoXDTQwMDIyOTEzMzUxMVowMjELMAkGA1UEBhMCREUxEzAR +BgNVBAoMCkEgTUFJTFRFU1QxDjAMBgNVBAMMBW15S2V5MIIBIjANBgkqhkiG9w0B +AQEFAAOCAQ8AMIIBCgKCAQEAlBQ6LDCR5bLiG6Lf9hROKl4N/PAamhLZLifBGtfJ +8zF00+nWB+d8AHyLd9zsKsRBaXKzdxp3YUSU5IOvMJk70hT9t7VSljZNUiTmQJRC +SR/ENsCk57eAYest1xF8Wd3LIDTPgS94yLQ/pRWb4kpKkMhq3l2fl50Dx0WB9CKc +0PHKu6GyZ8yjBbFbFZbUiQy4o1FkfCueJXIgqLJs/t2yqJwstYWI7kAf9yREJVm/ +CI+GYjLVJ/SI7v/F5yLrKZGsvN5LVMs+4WAJXSt8r5/rbKznqa/fJ/mlOmxiUmK2 +7++kfsaQadq8kaBW27s8u8HS/Gn0CQ3pinDECPO62t9JsQIDAQABo4G9MIG6MBsG +A1UdEQQUMBKBEHVsbGltdWVsbEB3ZWIuZGUwKQYDVR0OBCIEIP0eILP4r0WN95za +SSmuP0yzs/Vdh33rAaa0B3tiGF7SMHAGA1UdIwRpMGeAIPaFmApv+CilhWeSrOpY +FZxKcDjfKwXv8OmoFbvkA8nooTmkNzA1MQswCQYDVQQGEwJERTETMBEGA1UECgwK +QSBNQUlMVEVTVDERMA8GA1UEAwwIbXlUZXN0Q0GCCH6WoapleQq4MA0GCSqGSIb3 +DQEBCwUAA4IBAQAvIknw5G8YV85/5LR90tCocane3jse5gE9AEoqSWDUemfnhmJd +MOOMjZvhQNVA7lV4X4jv1wbqLPKOpKAag5UHjXls3MfgTGyehhKvNYWpvoXdeEWU +5sIU7QYAUlzVgZ+KJZ4ImmnF2wEiiQU4GsitRlUzGYd5R/Zux+xZZcSbmHYZT5nn +xq9K9BRmWeM6eeJ99m/ZKiLH1Vmc5oC5gPQDXj0RNJTfBXiSp0HB2DMEUITvCkxh +cNFLTtHfTLPn1WsSS/EvUqc2BszXXI3df7Axftp3Dd2VtOC04Nb48AGJbxY6ryu7 +XFB7TFYvphnuQZKw5mG0FNyADnP0CgGPobTI +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIC5TCCAc0CCH6WoapleQq4MA0GCSqGSIb3DQEBCwUAMDUxCzAJBgNVBAYTAkRF +MRMwEQYDVQQKDApBIE1BSUxURVNUMREwDwYDVQQDDAhteVRlc3RDQTAeFw0yMDAz +MDUxMzM1MTFaFw00MDAyMjkxMzM0NTlaMDUxCzAJBgNVBAYTAkRFMRMwEQYDVQQK +DApBIE1BSUxURVNUMREwDwYDVQQDDAhteVRlc3RDQTCCASIwDQYJKoZIhvcNAQEB +BQADggEPADCCAQoCggEBAKI5WXFBwGEnvAaFCFf9LhTO+w9uD09bt40rG1x2vTdF +xIO6aHsLuHbXEAfFgXzcF5ifdKlFwkIs8YV3R1Eqe7Ehoi393js9idqx5zefgHw4 +Q/e6XbvAFWc0BwHNCL9EzwJzKZoQi2HxxWg/wMpu7urWQRxtYpxsp/Hr/oJaADBI +j/H/brx5Hybwy38T0IhD2FFRHFjmlJmnvawrzKk76/bMLg2TNBUIj/dNPdnfTMEk +RiMJJQ4tP4FPH0WoOoPrQNA2ijKN+nf/QyRzx8dEcOaTtsjhXDxsZmRooyuCL08x +GO/mXF9b6Mz5sCUjYetAfyhdytO2VzrMe5/oQYrjSJUCAwEAATANBgkqhkiG9w0B +AQsFAAOCAQEAmtn5vDCC3PCx9xBCA4R2YaQ34wjoCkVAwLzAmHDoXIo9kbEaARhu +/ikNDCtNd394HRjWZlVunWmyzKba7cZ53OY2q6lLwAyFFRC3+RF7MaA4OIiGF5Cx +t+NcrmzKm4cHJvi+DUxOqskl16fwycspIqokru3+dv3tqfZ8kxIOe3/hILLWYCbR +jRqChUmvLzwDtP8bFJ5COad91Cfx9DmHSnoPkhdg0f+2x+0eajjEx8fRCppHOSPK +5O2AvjjS4akSRqVwlqFUqgDvO1PRhLw31i14EbkO3q1OC/4t00HJnszqzbwGWTrf +n1O3czuVl7rPXrJn0A/MVI2ReKOQeIAYMg== +-----END CERTIFICATE----- diff --git a/myTestCA.pem b/myTestCA.pem new file mode 100644 index 0000000000000000000000000000000000000000..16201daedb63dbb2a9ed7d1ff20ee7549853cf5e --- /dev/null +++ b/myTestCA.pem @@ -0,0 +1,18 @@ +-----BEGIN CERTIFICATE----- +MIIC5TCCAc0CCH6WoapleQq4MA0GCSqGSIb3DQEBCwUAMDUxCzAJBgNVBAYTAkRF +MRMwEQYDVQQKDApBIE1BSUxURVNUMREwDwYDVQQDDAhteVRlc3RDQTAeFw0yMDAz +MDUxMzM1MTFaFw00MDAyMjkxMzM0NTlaMDUxCzAJBgNVBAYTAkRFMRMwEQYDVQQK +DApBIE1BSUxURVNUMREwDwYDVQQDDAhteVRlc3RDQTCCASIwDQYJKoZIhvcNAQEB +BQADggEPADCCAQoCggEBAKI5WXFBwGEnvAaFCFf9LhTO+w9uD09bt40rG1x2vTdF +xIO6aHsLuHbXEAfFgXzcF5ifdKlFwkIs8YV3R1Eqe7Ehoi393js9idqx5zefgHw4 +Q/e6XbvAFWc0BwHNCL9EzwJzKZoQi2HxxWg/wMpu7urWQRxtYpxsp/Hr/oJaADBI +j/H/brx5Hybwy38T0IhD2FFRHFjmlJmnvawrzKk76/bMLg2TNBUIj/dNPdnfTMEk +RiMJJQ4tP4FPH0WoOoPrQNA2ijKN+nf/QyRzx8dEcOaTtsjhXDxsZmRooyuCL08x +GO/mXF9b6Mz5sCUjYetAfyhdytO2VzrMe5/oQYrjSJUCAwEAATANBgkqhkiG9w0B +AQsFAAOCAQEAmtn5vDCC3PCx9xBCA4R2YaQ34wjoCkVAwLzAmHDoXIo9kbEaARhu +/ikNDCtNd394HRjWZlVunWmyzKba7cZ53OY2q6lLwAyFFRC3+RF7MaA4OIiGF5Cx +t+NcrmzKm4cHJvi+DUxOqskl16fwycspIqokru3+dv3tqfZ8kxIOe3/hILLWYCbR +jRqChUmvLzwDtP8bFJ5COad91Cfx9DmHSnoPkhdg0f+2x+0eajjEx8fRCppHOSPK +5O2AvjjS4akSRqVwlqFUqgDvO1PRhLw31i14EbkO3q1OC/4t00HJnszqzbwGWTrf +n1O3czuVl7rPXrJn0A/MVI2ReKOQeIAYMg== +-----END CERTIFICATE----- diff --git a/mykey2.pem b/mykey2.pem new file mode 100644 index 0000000000000000000000000000000000000000..9b93006ff6d0a880b200079a2c1d1a8fa903e61b --- /dev/null +++ b/mykey2.pem @@ -0,0 +1,84 @@ +Bag Attributes + friendlyName: myKey + localKeyID: B9 C7 A6 B7 A0 03 91 C3 89 79 AA D7 A3 72 C9 E9 BE 00 45 30 +Key Attributes: <No Attributes> +-----BEGIN PRIVATE KEY----- +MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQCUFDosMJHlsuIb +ot/2FE4qXg388BqaEtkuJ8Ea18nzMXTT6dYH53wAfIt33OwqxEFpcrN3GndhRJTk +g68wmTvSFP23tVKWNk1SJOZAlEJJH8Q2wKTnt4Bh6y3XEXxZ3csgNM+BL3jItD+l +FZviSkqQyGreXZ+XnQPHRYH0IpzQ8cq7obJnzKMFsVsVltSJDLijUWR8K54lciCo +smz+3bKonCy1hYjuQB/3JEQlWb8Ij4ZiMtUn9Iju/8XnIuspkay83ktUyz7hYAld +K3yvn+tsrOepr98n+aU6bGJSYrbv76R+xpBp2ryRoFbbuzy7wdL8afQJDemKcMQI +87ra30mxAgMBAAECggEAAKj11iqggNixyS1KJcyIVBLOSZ0Cmlfoica7CwEF7SMr +RefxjeBsUSEnpZDu6Mp42eo9O76lhEcyvxwUOsweYWjPFXDjLt4Wt8MIN3FtuZ9A +5TH+6NU8nFBzeFVIrmAb+ASXku1krVIqg98Uo6RgqxQ9791/a594mTHBgwvTMqYf +1024bF9ImI/GhIbzPeX2lrbzHq+HZ6jXg/Jjx0QWfYhyTPqvvCUhyiY0WBvelsQH +orlh7IhnSyFQ6FqgPXzoYWOmHqXODUmmCS6nMct5hRq3Fagvr8aNp2wD6FoYuJGd +FSvIwX+ZMNgzObNA4flY7TfplOaTl6PV6H+KGJ14wQKBgQDEV1hRuKGPB27BH40x +pu0lRmgE/5pdz2Vbg6AuRelZEVCKju33tvXhNrzhPj85jRCPNMPFWQJPlJsQ7lB8 +wEANc1PnLffxfwBFs7ke1h3qs6WBkKVtVxXDed1SsMkZ3CmVotSIp3fLzbl9SMYv +Pih3arKI0wwTV8i4Ort5QNyOwQKBgQDBEr7x684we+rISodiDZATmX7fAw490M2u +KQHC3hmAB0Y6htx4E2ti7jNtzV95XkBoW3vShC75xDIZJwXM+yVxYZRQ3dcEMmE7 +yR+npAI6pFZGBTsAs9mXUP+JIQVwKbNpTH8x2klb6ylXGJvFFGAhwq4ni4lf1xls +s7x93Vxm8QKBgQCVgCSh5UIvVGuC5fFu8znzfg7Kb44tDDSTYEBhu54Y0dRQDNEq +I8hJepKLuAgQXFdVk8nVxRa7Xd5NIAltVD3xf/VNPHVlD103tcepsUQKaEwHwgoU +nZDWzT43LqGR7VBEvj2y6EGRj85DlVxCsMPDWh0jjf/N4rPVg/MoOrk2gQKBgQCS +HRquQLNJE+5pZ6WvOe5oNsjCAzD67RNLEzOHAsgvkNHAJyGgKaoiM3xuQ3dWhVKe +52T8uxZF5Qm46URFjWcXuC4jSM+ZGHtnYFz5ZHBfatDzqq+tZ25rSlworfnMmXJy +ZPb5hmXwDza4+CGiczoRMqDTwpDTHBjcn+UtJ6HvMQKBgACDZQgWdYXLrGl6qB6A +X0Xb6hoEuz7BeP+ZW3tspyjySLe8SXDf8QXQXvyfivo1N3VxbWuTSf/e4U2SqXXH ++/kFUS+KgKMKWefR+MJ3+Do8AGf4lrqf9AsSnrTtLskuS9aab9lZ1Mm/Q4P79K2J +eforhMXYki+DqiwhRf6Q3rxF +-----END PRIVATE KEY----- +Bag Attributes + friendlyName: myKey + localKeyID: B9 C7 A6 B7 A0 03 91 C3 89 79 AA D7 A3 72 C9 E9 BE 00 45 30 +subject=C = DE, O = A MAILTEST, CN = myKey + +issuer=C = DE, O = A MAILTEST, CN = myTestCA + +-----BEGIN CERTIFICATE----- +MIIDpzCCAo+gAwIBAgIIkMopuuUM9N4wDQYJKoZIhvcNAQELBQAwNTELMAkGA1UE +BhMCREUxEzARBgNVBAoMCkEgTUFJTFRFU1QxETAPBgNVBAMMCG15VGVzdENBMB4X +DTIwMDMwNTEzMzUxNVoXDTQwMDIyOTEzMzUxMVowMjELMAkGA1UEBhMCREUxEzAR +BgNVBAoMCkEgTUFJTFRFU1QxDjAMBgNVBAMMBW15S2V5MIIBIjANBgkqhkiG9w0B +AQEFAAOCAQ8AMIIBCgKCAQEAlBQ6LDCR5bLiG6Lf9hROKl4N/PAamhLZLifBGtfJ +8zF00+nWB+d8AHyLd9zsKsRBaXKzdxp3YUSU5IOvMJk70hT9t7VSljZNUiTmQJRC +SR/ENsCk57eAYest1xF8Wd3LIDTPgS94yLQ/pRWb4kpKkMhq3l2fl50Dx0WB9CKc +0PHKu6GyZ8yjBbFbFZbUiQy4o1FkfCueJXIgqLJs/t2yqJwstYWI7kAf9yREJVm/ +CI+GYjLVJ/SI7v/F5yLrKZGsvN5LVMs+4WAJXSt8r5/rbKznqa/fJ/mlOmxiUmK2 +7++kfsaQadq8kaBW27s8u8HS/Gn0CQ3pinDECPO62t9JsQIDAQABo4G9MIG6MBsG +A1UdEQQUMBKBEHVsbGltdWVsbEB3ZWIuZGUwKQYDVR0OBCIEIP0eILP4r0WN95za +SSmuP0yzs/Vdh33rAaa0B3tiGF7SMHAGA1UdIwRpMGeAIPaFmApv+CilhWeSrOpY +FZxKcDjfKwXv8OmoFbvkA8nooTmkNzA1MQswCQYDVQQGEwJERTETMBEGA1UECgwK +QSBNQUlMVEVTVDERMA8GA1UEAwwIbXlUZXN0Q0GCCH6WoapleQq4MA0GCSqGSIb3 +DQEBCwUAA4IBAQAvIknw5G8YV85/5LR90tCocane3jse5gE9AEoqSWDUemfnhmJd +MOOMjZvhQNVA7lV4X4jv1wbqLPKOpKAag5UHjXls3MfgTGyehhKvNYWpvoXdeEWU +5sIU7QYAUlzVgZ+KJZ4ImmnF2wEiiQU4GsitRlUzGYd5R/Zux+xZZcSbmHYZT5nn +xq9K9BRmWeM6eeJ99m/ZKiLH1Vmc5oC5gPQDXj0RNJTfBXiSp0HB2DMEUITvCkxh +cNFLTtHfTLPn1WsSS/EvUqc2BszXXI3df7Axftp3Dd2VtOC04Nb48AGJbxY6ryu7 +XFB7TFYvphnuQZKw5mG0FNyADnP0CgGPobTI +-----END CERTIFICATE----- +Bag Attributes: <Empty Attributes> +subject=C = DE, O = A MAILTEST, CN = myTestCA + +issuer=C = DE, O = A MAILTEST, CN = myTestCA + +-----BEGIN CERTIFICATE----- +MIIC5TCCAc0CCH6WoapleQq4MA0GCSqGSIb3DQEBCwUAMDUxCzAJBgNVBAYTAkRF +MRMwEQYDVQQKDApBIE1BSUxURVNUMREwDwYDVQQDDAhteVRlc3RDQTAeFw0yMDAz +MDUxMzM1MTFaFw00MDAyMjkxMzM0NTlaMDUxCzAJBgNVBAYTAkRFMRMwEQYDVQQK +DApBIE1BSUxURVNUMREwDwYDVQQDDAhteVRlc3RDQTCCASIwDQYJKoZIhvcNAQEB +BQADggEPADCCAQoCggEBAKI5WXFBwGEnvAaFCFf9LhTO+w9uD09bt40rG1x2vTdF +xIO6aHsLuHbXEAfFgXzcF5ifdKlFwkIs8YV3R1Eqe7Ehoi393js9idqx5zefgHw4 +Q/e6XbvAFWc0BwHNCL9EzwJzKZoQi2HxxWg/wMpu7urWQRxtYpxsp/Hr/oJaADBI +j/H/brx5Hybwy38T0IhD2FFRHFjmlJmnvawrzKk76/bMLg2TNBUIj/dNPdnfTMEk +RiMJJQ4tP4FPH0WoOoPrQNA2ijKN+nf/QyRzx8dEcOaTtsjhXDxsZmRooyuCL08x +GO/mXF9b6Mz5sCUjYetAfyhdytO2VzrMe5/oQYrjSJUCAwEAATANBgkqhkiG9w0B +AQsFAAOCAQEAmtn5vDCC3PCx9xBCA4R2YaQ34wjoCkVAwLzAmHDoXIo9kbEaARhu +/ikNDCtNd394HRjWZlVunWmyzKba7cZ53OY2q6lLwAyFFRC3+RF7MaA4OIiGF5Cx +t+NcrmzKm4cHJvi+DUxOqskl16fwycspIqokru3+dv3tqfZ8kxIOe3/hILLWYCbR +jRqChUmvLzwDtP8bFJ5COad91Cfx9DmHSnoPkhdg0f+2x+0eajjEx8fRCppHOSPK +5O2AvjjS4akSRqVwlqFUqgDvO1PRhLw31i14EbkO3q1OC/4t00HJnszqzbwGWTrf +n1O3czuVl7rPXrJn0A/MVI2ReKOQeIAYMg== +-----END CERTIFICATE-----