diff --git a/OpenVPN Adapter.xcodeproj/project.pbxproj b/OpenVPN Adapter.xcodeproj/project.pbxproj index 1dffb4a..d9e593d 100644 --- a/OpenVPN Adapter.xcodeproj/project.pbxproj +++ b/OpenVPN Adapter.xcodeproj/project.pbxproj @@ -154,10 +154,6 @@ C9E350C2200F6EC0000820D9 /* NSError+OpenVPNError.h in Headers */ = {isa = PBXBuildFile; fileRef = C9E350BF200F6EC0000820D9 /* NSError+OpenVPNError.h */; }; C9E350C3200F6EC0000820D9 /* NSError+OpenVPNError.m in Sources */ = {isa = PBXBuildFile; fileRef = C9E350C0200F6EC0000820D9 /* NSError+OpenVPNError.m */; }; C9E350C4200F6EC0000820D9 /* NSError+OpenVPNError.m in Sources */ = {isa = PBXBuildFile; fileRef = C9E350C0200F6EC0000820D9 /* NSError+OpenVPNError.m */; }; - C9E4401D1F6086A1001D7C41 /* NSError+Message.h in Headers */ = {isa = PBXBuildFile; fileRef = C9E4401B1F6086A1001D7C41 /* NSError+Message.h */; }; - C9E4401E1F6086A1001D7C41 /* NSError+Message.h in Headers */ = {isa = PBXBuildFile; fileRef = C9E4401B1F6086A1001D7C41 /* NSError+Message.h */; }; - C9E4401F1F6086A1001D7C41 /* NSError+Message.m in Sources */ = {isa = PBXBuildFile; fileRef = C9E4401C1F6086A1001D7C41 /* NSError+Message.m */; }; - C9E440201F6086A1001D7C41 /* NSError+Message.m in Sources */ = {isa = PBXBuildFile; fileRef = C9E4401C1F6086A1001D7C41 /* NSError+Message.m */; }; C9FD921A1E9A667600374FC4 /* ovpncli.hpp in Headers */ = {isa = PBXBuildFile; fileRef = C9FD92181E9A667600374FC4 /* ovpncli.hpp */; }; C9FD921B1E9A667600374FC4 /* ovpncli.cpp in Sources */ = {isa = PBXBuildFile; fileRef = C9FD92191E9A667600374FC4 /* ovpncli.cpp */; }; /* End PBXBuildFile section */ @@ -263,8 +259,6 @@ C9D2ABFF1EA212A3007EDF9D /* OpenVPNAdapterTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = OpenVPNAdapterTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; C9E350BF200F6EC0000820D9 /* NSError+OpenVPNError.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "NSError+OpenVPNError.h"; sourceTree = ""; }; C9E350C0200F6EC0000820D9 /* NSError+OpenVPNError.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = "NSError+OpenVPNError.m"; sourceTree = ""; }; - C9E4401B1F6086A1001D7C41 /* NSError+Message.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSError+Message.h"; sourceTree = ""; }; - C9E4401C1F6086A1001D7C41 /* NSError+Message.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = "NSError+Message.m"; sourceTree = ""; }; C9FD92181E9A667600374FC4 /* ovpncli.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = ovpncli.hpp; path = Vendors/openvpn/client/ovpncli.hpp; sourceTree = ""; }; C9FD92191E9A667600374FC4 /* ovpncli.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = ovpncli.cpp; path = Vendors/openvpn/client/ovpncli.cpp; sourceTree = ""; }; /* End PBXFileReference section */ @@ -447,8 +441,6 @@ C93A4F611EE18009004DC561 /* OpenVPNError.m */, C9CDFDD9200781AF00323B73 /* OpenVPNClient.h */, C9CDFDDA200781AF00323B73 /* OpenVPNClient.mm */, - ABD6EF151F8F9C37007D3D90 /* OpenVPNAdapter.h */, - ABD6EF161F8F9C38007D3D90 /* OpenVPNAdapter.mm */, ABD6EF071F8F8CCD007D3D90 /* OpenVPNNetworkSettingsBuilder.h */, ABD6EF081F8F8CCD007D3D90 /* OpenVPNNetworkSettingsBuilder.m */, C9C2B2B6200CB42F00CA0FF3 /* OpenVPNAdapterPacketFlow.h */, @@ -456,6 +448,8 @@ C9C2B2BA200CC42A00CA0FF3 /* OpenVPNPacket.mm */, ABD6EF0E1F8F93AB007D3D90 /* OpenVPNPacketFlowBridge.h */, ABD6EF0F1F8F93AB007D3D90 /* OpenVPNPacketFlowBridge.mm */, + ABD6EF151F8F9C37007D3D90 /* OpenVPNAdapter.h */, + ABD6EF161F8F9C38007D3D90 /* OpenVPNAdapter.mm */, ); name = Adapter; sourceTree = ""; @@ -574,20 +568,10 @@ name = Extensions; sourceTree = ""; }; - C9E4401A1F6081FF001D7C41 /* Utils */ = { - isa = PBXGroup; - children = ( - C9E4401B1F6086A1001D7C41 /* NSError+Message.h */, - C9E4401C1F6086A1001D7C41 /* NSError+Message.m */, - ); - name = Utils; - sourceTree = ""; - }; C9FF73B71EB7421600E995AC /* Helpers */ = { isa = PBXGroup; children = ( C9E350C5200F70CA000820D9 /* Extensions */, - C9E4401A1F6081FF001D7C41 /* Utils */, ); name = Helpers; sourceTree = ""; @@ -625,7 +609,6 @@ C9657A171EB0A7F800EFF210 /* OpenVPNConnectionInfo.h in Headers */, C9BB47711E7171A100F3F98C /* OpenVPNError.h in Headers */, C9B795641F1D182500CF35FE /* OpenVPNReachabilityTracker.h in Headers */, - C9E4401D1F6086A1001D7C41 /* NSError+Message.h in Headers */, ABD6EF091F8F8CCD007D3D90 /* OpenVPNNetworkSettingsBuilder.h in Headers */, C9657A611EB0D64E00EFF210 /* OpenVPNIPv6Preference.h in Headers */, C9657A671EB0D73200EFF210 /* OpenVPNMinTLSVersion.h in Headers */, @@ -672,7 +655,6 @@ C9657A181EB0A7F800EFF210 /* OpenVPNConnectionInfo.h in Headers */, C9D2ABE81EA20F99007EDF9D /* OpenVPNError.h in Headers */, C9B795651F1D182500CF35FE /* OpenVPNReachabilityTracker.h in Headers */, - C9E4401E1F6086A1001D7C41 /* NSError+Message.h in Headers */, ABD6EF0A1F8F8CCD007D3D90 /* OpenVPNNetworkSettingsBuilder.h in Headers */, C9657A621EB0D64E00EFF210 /* OpenVPNIPv6Preference.h in Headers */, C9657A681EB0D73200EFF210 /* OpenVPNMinTLSVersion.h in Headers */, @@ -900,7 +882,6 @@ ABD6EF0B1F8F8CCD007D3D90 /* OpenVPNNetworkSettingsBuilder.m in Sources */, C98467A81EAA5B7700272A9A /* OpenVPNConfiguration.mm in Sources */, ABD6EF121F8F93AB007D3D90 /* OpenVPNPacketFlowBridge.mm in Sources */, - C9E4401F1F6086A1001D7C41 /* NSError+Message.m in Sources */, C9657A311EB0B7A900EFF210 /* OpenVPNTransportStats.mm in Sources */, C9B795661F1D182500CF35FE /* OpenVPNReachabilityTracker.mm in Sources */, C9657A581EB0CE1300EFF210 /* OpenVPNProperties.mm in Sources */, @@ -942,7 +923,6 @@ ABD6EF0C1F8F8CCD007D3D90 /* OpenVPNNetworkSettingsBuilder.m in Sources */, C98467A91EAA5B7700272A9A /* OpenVPNConfiguration.mm in Sources */, ABD6EF131F8F93AB007D3D90 /* OpenVPNPacketFlowBridge.mm in Sources */, - C9E440201F6086A1001D7C41 /* NSError+Message.m in Sources */, C9657A301EB0B7A600EFF210 /* OpenVPNTransportStats.mm in Sources */, C9B795671F1D182500CF35FE /* OpenVPNReachabilityTracker.mm in Sources */, C9657A591EB0CE1400EFF210 /* OpenVPNProperties.mm in Sources */, diff --git a/OpenVPN Adapter/NSError+Message.h b/OpenVPN Adapter/NSError+Message.h deleted file mode 100644 index 6497c74..0000000 --- a/OpenVPN Adapter/NSError+Message.h +++ /dev/null @@ -1,15 +0,0 @@ -// -// NSError+Message.h -// OpenVPN Adapter -// -// Created by Sergey Abramchuk on 06.09.17. -// -// - -#import - -@interface NSError (Message) - -+ (NSString *)reasonFromResult:(NSInteger)result; - -@end diff --git a/OpenVPN Adapter/NSError+Message.m b/OpenVPN Adapter/NSError+Message.m deleted file mode 100644 index 47e3a66..0000000 --- a/OpenVPN Adapter/NSError+Message.m +++ /dev/null @@ -1,28 +0,0 @@ -// -// NSError+Message.m -// OpenVPN Adapter -// -// Created by Sergey Abramchuk on 06.09.17. -// -// - -#import - -#import "NSError+Message.h" - -@implementation NSError (Message) - -+ (NSString *)reasonFromResult:(NSInteger)result { - size_t length = 1024; - char *buffer = malloc(length); - - mbedtls_strerror(result, buffer, length); - - NSString *reason = [NSString stringWithUTF8String:buffer]; - - free(buffer); - - return reason; -} - -@end diff --git a/OpenVPN Adapter/NSError+OpenVPNError.h b/OpenVPN Adapter/NSError+OpenVPNError.h index d10acd7..c137a26 100644 --- a/OpenVPN Adapter/NSError+OpenVPNError.h +++ b/OpenVPN Adapter/NSError+OpenVPNError.h @@ -24,4 +24,10 @@ typedef NS_ERROR_ENUM(OpenVPNAdapterErrorDomain, OpenVPNAdapterError); @end +@interface NSError (OpenVPNMbedTLSErrorGeneration) + ++ (NSError *)ovpn_errorObjectForMbedTLSError:(NSInteger)errorCode description:(NSString *)description; + +@end + NS_ASSUME_NONNULL_END diff --git a/OpenVPN Adapter/NSError+OpenVPNError.m b/OpenVPN Adapter/NSError+OpenVPNError.m index 7281c36..3a607d4 100644 --- a/OpenVPN Adapter/NSError+OpenVPNError.m +++ b/OpenVPN Adapter/NSError+OpenVPNError.m @@ -7,6 +7,8 @@ #import "NSError+OpenVPNError.h" +#import + #import "OpenVPNError.h" @implementation NSError (OpenVPNAdapterErrorGeneration) @@ -179,3 +181,23 @@ } @end + +@implementation NSError (OpenVPNMbedTLSErrorGeneration) + ++ (NSError *)ovpn_errorObjectForMbedTLSError:(NSInteger)errorCode description:(NSString *)description { + size_t length = 1024; + char *buffer = malloc(length); + + mbedtls_strerror(errorCode, buffer, length); + + NSString *reason = [NSString stringWithUTF8String:buffer]; + + free(buffer); + + return [NSError errorWithDomain:OpenVPNIdentityErrorDomain code:errorCode userInfo:@{ + NSLocalizedDescriptionKey: description, + NSLocalizedFailureReasonErrorKey: reason + }]; +} + +@end diff --git a/OpenVPN Adapter/OpenVPNCertificate.m b/OpenVPN Adapter/OpenVPNCertificate.m index d7412b2..f0c70f7 100644 --- a/OpenVPN Adapter/OpenVPNCertificate.m +++ b/OpenVPN Adapter/OpenVPNCertificate.m @@ -5,13 +5,12 @@ // Created by Sergey Abramchuk on 06.09.17. // // +#import "OpenVPNCertificate.h" #import #import -#import "NSError+Message.h" -#import "OpenVPNError.h" -#import "OpenVPNCertificate.h" +#import "NSError+OpenVPNError.h" @interface OpenVPNCertificate () @@ -39,11 +38,7 @@ int result = mbedtls_x509_crt_parse(certificate.crt, (const unsigned char *)pemString.UTF8String, pemData.length + 1); if (result < 0) { if (error) { - NSString *reason = [NSError reasonFromResult:result]; - *error = [NSError errorWithDomain:OpenVPNIdentityErrorDomain code:result userInfo:@{ - NSLocalizedDescriptionKey: @"Failed to read PEM data.", - NSLocalizedFailureReasonErrorKey: reason - }]; + *error = [NSError ovpn_errorObjectForMbedTLSError:result description:@"Failed to read PEM data"]; } return nil; @@ -58,11 +53,7 @@ int result = mbedtls_x509_crt_parse_der(certificate.crt, derData.bytes, derData.length); if (result < 0) { if (error) { - NSString *reason = [NSError reasonFromResult:result]; - *error = [NSError errorWithDomain:OpenVPNIdentityErrorDomain code:result userInfo:@{ - NSLocalizedDescriptionKey: @"Failed to read DER data.", - NSLocalizedFailureReasonErrorKey: reason - }]; + *error = [NSError ovpn_errorObjectForMbedTLSError:result description:@"Failed to read DER data"]; } return nil; @@ -80,14 +71,11 @@ size_t output_length = 0; - int result = mbedtls_pem_write_buffer(header.UTF8String, footer.UTF8String, self.crt->raw.p, self.crt->raw.len, pem_buffer, buffer_length, &output_length); + int result = mbedtls_pem_write_buffer(header.UTF8String, footer.UTF8String, self.crt->raw.p, + self.crt->raw.len, pem_buffer, buffer_length, &output_length); if (result < 0) { if (error) { - NSString *reason = [NSError reasonFromResult:result]; - *error = [NSError errorWithDomain:OpenVPNIdentityErrorDomain code:result userInfo:@{ - NSLocalizedDescriptionKey: @"Failed to write PEM data.", - NSLocalizedFailureReasonErrorKey: reason - }]; + *error = [NSError ovpn_errorObjectForMbedTLSError:result description: @"Failed to write PEM data"]; } free(pem_buffer); @@ -103,11 +91,8 @@ - (NSData *)derData:(out NSError **)error { if (self.crt->raw.p == NULL || self.crt->raw.len == 0) { if (error) { - NSString *reason = [NSError reasonFromResult:MBEDTLS_ERR_X509_BAD_INPUT_DATA]; - *error = [NSError errorWithDomain:OpenVPNIdentityErrorDomain code:MBEDTLS_ERR_X509_BAD_INPUT_DATA userInfo:@{ - NSLocalizedDescriptionKey: @"Failed to write DER data.", - NSLocalizedFailureReasonErrorKey:reason - }]; + *error = [NSError ovpn_errorObjectForMbedTLSError:MBEDTLS_ERR_X509_BAD_INPUT_DATA + description: @"Failed to write DER data"]; } return nil; diff --git a/OpenVPN Adapter/OpenVPNPrivateKey.m b/OpenVPN Adapter/OpenVPNPrivateKey.m index 96100d8..deb4a6a 100644 --- a/OpenVPN Adapter/OpenVPNPrivateKey.m +++ b/OpenVPN Adapter/OpenVPNPrivateKey.m @@ -6,11 +6,11 @@ // // +#import "OpenVPNPrivateKey.h" + #import -#import "NSError+Message.h" -#import "OpenVPNError.h" -#import "OpenVPNPrivateKey.h" +#import "NSError+OpenVPNError.h" @interface OpenVPNPrivateKey () @@ -45,14 +45,12 @@ size_t pem_length = strlen(pemString.UTF8String) + 1; size_t password_length = password != nil ? strlen(password.UTF8String) : 0; - int result = mbedtls_pk_parse_key(key.ctx, (const unsigned char *)pemString.UTF8String, pem_length, (const unsigned char *)password.UTF8String, password_length); + int result = mbedtls_pk_parse_key(key.ctx, (const unsigned char *)pemString.UTF8String, + pem_length, (const unsigned char *)password.UTF8String, password_length); + if (result < 0) { if (error) { - NSString *reason = [NSError reasonFromResult:result]; - *error = [NSError errorWithDomain:OpenVPNIdentityErrorDomain code:result userInfo:@{ - NSLocalizedDescriptionKey: @"Failed to read PEM data.", - NSLocalizedFailureReasonErrorKey: reason - }]; + *error = [NSError ovpn_errorObjectForMbedTLSError:result description:@"Failed to read PEM data"]; } return nil; @@ -66,14 +64,12 @@ size_t password_length = password != nil ? strlen(password.UTF8String) : 0; - int result = mbedtls_pk_parse_key(key.ctx, derData.bytes, derData.length, (const unsigned char *)password.UTF8String, password_length); + int result = mbedtls_pk_parse_key(key.ctx, derData.bytes, + derData.length, (const unsigned char *)password.UTF8String, password_length); + if (result < 0) { if (error) { - NSString *reason = [NSError reasonFromResult:result]; - *error = [NSError errorWithDomain:OpenVPNIdentityErrorDomain code:result userInfo:@{ - NSLocalizedDescriptionKey: @"Failed to read DER data.", - NSLocalizedFailureReasonErrorKey: reason - }]; + *error = [NSError ovpn_errorObjectForMbedTLSError:result description:@"Failed to read DER data"]; } return nil; @@ -89,18 +85,15 @@ int result = mbedtls_pk_write_key_pem(self.ctx, pem_buffer, buffer_length); if (result < 0) { if (error) { - NSString *reason = [NSError reasonFromResult:result]; - *error = [NSError errorWithDomain:OpenVPNIdentityErrorDomain code:result userInfo:@{ - NSLocalizedDescriptionKey: @"Failed to write PEM data.", - NSLocalizedFailureReasonErrorKey: reason - }]; + *error = [NSError ovpn_errorObjectForMbedTLSError:result description:@"Failed to write PEM data"]; } free(pem_buffer); return nil; } - NSData *pemData = [[NSString stringWithCString:(const char *)pem_buffer encoding:NSUTF8StringEncoding] dataUsingEncoding:NSUTF8StringEncoding]; + NSData *pemData = [[NSString stringWithCString:(const char *)pem_buffer + encoding:NSUTF8StringEncoding] dataUsingEncoding:NSUTF8StringEncoding]; free(pem_buffer); return pemData; @@ -113,11 +106,7 @@ int result = mbedtls_pk_write_key_der(self.ctx, der_buffer, buffer_length); if (result < 0) { if (error) { - NSString *reason = [NSError reasonFromResult:result]; - *error = [NSError errorWithDomain:OpenVPNIdentityErrorDomain code:result userInfo:@{ - NSLocalizedDescriptionKey: @"Failed to write DER data.", - NSLocalizedFailureReasonErrorKey: reason - }]; + *error = [NSError ovpn_errorObjectForMbedTLSError:result description:@"Failed to write DER data"]; } free(der_buffer);