diff --git a/.gitmodules b/.gitmodules index 5643bf6..03f51c3 100644 --- a/.gitmodules +++ b/.gitmodules @@ -2,3 +2,6 @@ path = xctool url = https://github.com/facebook/xctool.git ignore = dirty +[submodule "submodules/Base64"] + path = submodules/Base64 + url = https://github.com/nicklockwood/Base64.git diff --git a/CocoaSecurity.xcodeproj/project.pbxproj b/CocoaSecurity.xcodeproj/project.pbxproj index f822cd3..936f7e4 100644 --- a/CocoaSecurity.xcodeproj/project.pbxproj +++ b/CocoaSecurity.xcodeproj/project.pbxproj @@ -18,6 +18,8 @@ 21540A04183DD7F000E4C15B /* CocoaSecurityEncoder_Tests.m in Sources */ = {isa = PBXBuildFile; fileRef = 21540A00183DD7F000E4C15B /* CocoaSecurityEncoder_Tests.m */; }; 21540A05183DD7F000E4C15B /* CocoaSecurityResult_Test.m in Sources */ = {isa = PBXBuildFile; fileRef = 21540A01183DD7F000E4C15B /* CocoaSecurityResult_Test.m */; }; 21540A06183DD81A00E4C15B /* CocoaSecurity.m in Sources */ = {isa = PBXBuildFile; fileRef = 2113924116EAD6AF00AFDF87 /* CocoaSecurity.m */; }; + 21FB346C189601A6002F38DE /* Base64.m in Sources */ = {isa = PBXBuildFile; fileRef = 21FB346B189601A6002F38DE /* Base64.m */; }; + 21FB346D18960347002F38DE /* Base64.m in Sources */ = {isa = PBXBuildFile; fileRef = 21FB346B189601A6002F38DE /* Base64.m */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -59,6 +61,8 @@ 21540A00183DD7F000E4C15B /* CocoaSecurityEncoder_Tests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CocoaSecurityEncoder_Tests.m; sourceTree = ""; }; 21540A01183DD7F000E4C15B /* CocoaSecurityResult_Test.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CocoaSecurityResult_Test.m; sourceTree = ""; }; 21BB8A2E17FEA0EC0032C38C /* XCTest.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = XCTest.framework; path = Library/Frameworks/XCTest.framework; sourceTree = DEVELOPER_DIR; }; + 21FB346A189601A6002F38DE /* Base64.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = Base64.h; path = submodules/Base64/Base64/Base64.h; sourceTree = SOURCE_ROOT; }; + 21FB346B189601A6002F38DE /* Base64.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = Base64.m; path = submodules/Base64/Base64/Base64.m; sourceTree = SOURCE_ROOT; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -115,6 +119,7 @@ 2113923C16EAD6AF00AFDF87 /* CocoaSecurity */ = { isa = PBXGroup; children = ( + 21FB34691896019A002F38DE /* Submodules */, 2113923F16EAD6AF00AFDF87 /* CocoaSecurity.h */, 2113924116EAD6AF00AFDF87 /* CocoaSecurity.m */, ); @@ -143,6 +148,15 @@ name = "Supporting Files"; sourceTree = ""; }; + 21FB34691896019A002F38DE /* Submodules */ = { + isa = PBXGroup; + children = ( + 21FB346A189601A6002F38DE /* Base64.h */, + 21FB346B189601A6002F38DE /* Base64.m */, + ); + name = Submodules; + sourceTree = ""; + }; /* End PBXGroup section */ /* Begin PBXNativeTarget section */ @@ -228,6 +242,7 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( + 21FB346C189601A6002F38DE /* Base64.m in Sources */, 2113924216EAD6AF00AFDF87 /* CocoaSecurity.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; @@ -236,6 +251,7 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( + 21FB346D18960347002F38DE /* Base64.m in Sources */, 21540A06183DD81A00E4C15B /* CocoaSecurity.m in Sources */, 21540A05183DD7F000E4C15B /* CocoaSecurityResult_Test.m in Sources */, 21540A03183DD7F000E4C15B /* CocoaSecurityDecoder_Tests.m in Sources */, diff --git a/CocoaSecurity/CocoaSecurity.m b/CocoaSecurity/CocoaSecurity.m index 038d20d..b519285 100644 --- a/CocoaSecurity/CocoaSecurity.m +++ b/CocoaSecurity/CocoaSecurity.m @@ -9,6 +9,7 @@ #import "CocoaSecurity.h" #import #import +#import "Base64.h" #pragma mark - CocoaSecurity @implementation CocoaSecurity @@ -419,51 +420,7 @@ // convert NSData to Base64 - (NSString *)base64:(NSData *)data { - static const char lookup[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; - - long long inputLength = [data length]; - const unsigned char *inputBytes = [data bytes]; - - long long maxOutputLength = (inputLength / 3 + 1) * 4; - unsigned char *outputBytes = (unsigned char *)malloc((unsigned long)maxOutputLength); - - long long index; - long long outputLength = 0; - for (index = 0; index < inputLength - 2; index += 3) - { - outputBytes[outputLength++] = lookup[(inputBytes[index] & 0xFC) >> 2]; - outputBytes[outputLength++] = lookup[((inputBytes[index] & 0x03) << 4) | ((inputBytes[index + 1] & 0xF0) >> 4)]; - outputBytes[outputLength++] = lookup[((inputBytes[index + 1] & 0x0F) << 2) | ((inputBytes[index + 2] & 0xC0) >> 6)]; - outputBytes[outputLength++] = lookup[inputBytes[index + 2] & 0x3F]; - } - - //handle left-over data - if (index == inputLength - 2) - { - // = terminator - outputBytes[outputLength++] = lookup[(inputBytes[index] & 0xFC) >> 2]; - outputBytes[outputLength++] = lookup[((inputBytes[index] & 0x03) << 4) | ((inputBytes[index + 1] & 0xF0) >> 4)]; - outputBytes[outputLength++] = lookup[(inputBytes[index + 1] & 0x0F) << 2]; - outputBytes[outputLength++] = '='; - } - else if (index == inputLength - 1) - { - // == terminator - outputBytes[outputLength++] = lookup[(inputBytes[index] & 0xFC) >> 2]; - outputBytes[outputLength++] = lookup[(inputBytes[index] & 0x03) << 4]; - outputBytes[outputLength++] = '='; - outputBytes[outputLength++] = '='; - } - - NSString *result; - if (outputLength >= 4) - { - //truncate data to match actual output length - outputBytes = realloc(outputBytes, (unsigned long)outputLength); - result = [[NSString alloc] initWithBytes:outputBytes length:(unsigned long)outputLength encoding:NSASCIIStringEncoding]; - } - free(outputBytes); - return result; + return [data base64EncodedString]; } // convert NSData to hex string @@ -510,52 +467,7 @@ @implementation CocoaSecurityDecoder - (NSData *)base64:(NSString *)string { - static const char lookup[] = - { - 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, - 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, - 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 62, 99, 99, 99, 63, - 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 99, 99, 99, 99, 99, 99, - 99, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, - 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 99, 99, 99, 99, 99, - 99, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, - 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 99, 99, 99, 99, 99 - }; - - NSData *inputData = [string dataUsingEncoding:NSASCIIStringEncoding allowLossyConversion:YES]; - NSUInteger inputLength = [inputData length]; - const unsigned char *inputBytes = [inputData bytes]; - - NSMutableData *outputData = [NSMutableData dataWithLength:(inputLength / 4 + 1) * 3]; - unsigned char *outputBytes = (unsigned char *)[outputData mutableBytes]; - - int accumulator = 0; - long long outputLength = 0; - unsigned char accumulated[] = {0, 0, 0, 0}; - for (NSUInteger index = 0; index < inputLength; index++) - { - unsigned char decoded = lookup[inputBytes[index] & 0x7F]; - if (decoded != 99) - { - accumulated[accumulator] = decoded; - if (accumulator == 3) - { - outputBytes[outputLength++] = (accumulated[0] << 2) | (accumulated[1] >> 4); - outputBytes[outputLength++] = (accumulated[1] << 4) | (accumulated[2] >> 2); - outputBytes[outputLength++] = (accumulated[2] << 6) | accumulated[3]; - } - accumulator = (accumulator + 1) % 4; - } - } - - //handle left-over data - if (accumulator > 0) outputBytes[outputLength] = (accumulated[0] << 2) | (accumulated[1] >> 4); - if (accumulator > 1) outputBytes[++outputLength] = (accumulated[1] << 4) | (accumulated[2] >> 2); - if (accumulator > 2) outputLength++; - - //truncate data to match actual output length - outputData.length = outputLength; - return outputLength? outputData: nil; + return [NSData dataWithBase64EncodedString:string]; } - (NSData *)hex:(NSString *)data { diff --git a/submodules/Base64 b/submodules/Base64 new file mode 160000 index 0000000..613d17c --- /dev/null +++ b/submodules/Base64 @@ -0,0 +1 @@ +Subproject commit 613d17caeb02928df50e77cc438439cccf95c4cd