/ KeychainCircle / NSError+KCCreationHelpers.m
NSError+KCCreationHelpers.m
1 // 2 // NSError+KCCreationHelpers.m 3 // KechainCircle 4 // 5 // 6 7 #import <Foundation/Foundation.h> 8 9 #import <NSError+KCCreationHelpers.h> 10 11 static NSString* coreCryptoDomain = @"kSecCoreCryptoDomain"; 12 static NSString* srpDomain = @"com.apple.security.srp"; 13 14 static NSDictionary* UserInfoFromVA(NSString*description, va_list va) 15 NS_FORMAT_FUNCTION(1, 0); 16 17 static NSDictionary* UserInfoFromVA(NSString*description, va_list va) { 18 return @{NSLocalizedDescriptionKey:[[NSString alloc] initWithFormat:description 19 arguments:va]}; 20 } 21 22 // We should get this from SecCFError.h and Security.framework.. 23 bool CoreCryptoError(int cc_result, NSError** error, NSString* description, ...) 24 { 25 bool failed = cc_result != 0; 26 27 if (failed && error && !*error) { 28 va_list va; 29 va_start(va, description); 30 *error = [NSError errorWithCoreCryptoStatus:cc_result 31 description:description 32 args:va]; 33 va_end(va); 34 } 35 36 return !failed; 37 } 38 39 bool OSStatusError(OSStatus status, NSError** error, NSString*description, ...) { 40 bool failed = status != 0; 41 42 if (failed && error && !*error) { 43 va_list va; 44 va_start(va, description); 45 *error = [NSError errorWithOSStatus:status 46 description:description 47 args:va]; 48 va_end(va); 49 } 50 51 return !failed; 52 } 53 54 bool RequirementError(bool requirement, NSError** error, NSString*description, ...) { 55 bool failed = !requirement; 56 57 if (failed && error && !*error) { 58 va_list va; 59 va_start(va, description); 60 *error = [NSError errorWithOSStatus:-50 61 description:description 62 args:va]; 63 va_end(va); 64 } 65 66 return !failed; 67 } 68 69 70 @implementation NSError(KCCreationHelpers) 71 72 + (instancetype) errorWithOSStatus:(OSStatus) status 73 userInfo:(NSDictionary *)dict { 74 return [[NSError alloc] initWithOSStatus:status userInfo:dict]; 75 } 76 77 - (instancetype) initWithOSStatus:(OSStatus) status 78 userInfo:(NSDictionary *)dict { 79 return [self initWithDomain:NSOSStatusErrorDomain code:status userInfo:dict]; 80 } 81 82 + (instancetype) errorWithOSStatus:(OSStatus) status 83 description:(NSString*)description 84 args:(va_list)va { 85 return [[NSError alloc] initWithOSStatus:status description:description args:va]; 86 } 87 88 - (instancetype) initWithOSStatus:(OSStatus) status 89 description:(NSString*)description 90 args:(va_list)va { 91 return [self initWithOSStatus:status 92 userInfo:UserInfoFromVA(description, va)]; 93 } 94 95 + (instancetype) errorWithCoreCryptoStatus:(int) status 96 userInfo:(NSDictionary *)dict { 97 return [[NSError alloc] initWithCoreCryptoStatus:status userInfo:dict]; 98 } 99 100 101 - (instancetype) initWithCoreCryptoStatus:(int) status 102 userInfo:(NSDictionary *)dict { 103 return [self initWithDomain:coreCryptoDomain code:status userInfo:dict]; 104 } 105 106 + (instancetype) errorWithCoreCryptoStatus:(int) status 107 description:(NSString*)description 108 args:(va_list)va { 109 return [[NSError alloc] initWithCoreCryptoStatus:status description:description args:va]; 110 } 111 112 - (instancetype) initWithCoreCryptoStatus:(int) status 113 description:(NSString*)description 114 args:(va_list)va { 115 return [self initWithCoreCryptoStatus:status 116 userInfo:UserInfoFromVA(description, va)]; 117 } 118 119 @end