Skip to content

Commit f7ccc60

Browse files
author
Chris Thompson
committed
iOS: Implement SHA functions with UTF8 and Base64 inputs
1 parent 7378b0b commit f7ccc60

3 files changed

Lines changed: 53 additions & 19 deletions

File tree

ios/RCTCrypto.xcodeproj/project.pbxproj

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -158,7 +158,7 @@
158158
32D980D51BE9F11C00FA27E5 /* Project object */ = {
159159
isa = PBXProject;
160160
attributes = {
161-
LastUpgradeCheck = 0820;
161+
LastUpgradeCheck = 1140;
162162
ORGANIZATIONNAME = pedrouid;
163163
TargetAttributes = {
164164
32D980DC1BE9F11C00FA27E5 = {
@@ -171,6 +171,7 @@
171171
developmentRegion = English;
172172
hasScannedForEncodings = 0;
173173
knownRegions = (
174+
English,
174175
en,
175176
);
176177
mainGroup = 32D980D41BE9F11C00FA27E5;
@@ -215,20 +216,29 @@
215216
CLANG_CXX_LIBRARY = "libc++";
216217
CLANG_ENABLE_MODULES = YES;
217218
CLANG_ENABLE_OBJC_ARC = YES;
219+
CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
218220
CLANG_WARN_BOOL_CONVERSION = YES;
221+
CLANG_WARN_COMMA = YES;
219222
CLANG_WARN_CONSTANT_CONVERSION = YES;
223+
CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
220224
CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
221225
CLANG_WARN_EMPTY_BODY = YES;
222226
CLANG_WARN_ENUM_CONVERSION = YES;
223227
CLANG_WARN_INFINITE_RECURSION = YES;
224228
CLANG_WARN_INT_CONVERSION = YES;
229+
CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
230+
CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
231+
CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
225232
CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
233+
CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
234+
CLANG_WARN_STRICT_PROTOTYPES = YES;
226235
CLANG_WARN_SUSPICIOUS_MOVE = YES;
227236
CLANG_WARN_UNREACHABLE_CODE = YES;
228237
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
229238
COPY_PHASE_STRIP = NO;
230239
DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
231240
ENABLE_STRICT_OBJC_MSGSEND = YES;
241+
ENABLE_TESTABILITY = YES;
232242
GCC_C_LANGUAGE_STANDARD = gnu99;
233243
GCC_DYNAMIC_NO_PIC = NO;
234244
GCC_NO_COMMON_BLOCKS = YES;
@@ -259,14 +269,22 @@
259269
CLANG_CXX_LIBRARY = "libc++";
260270
CLANG_ENABLE_MODULES = YES;
261271
CLANG_ENABLE_OBJC_ARC = YES;
272+
CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
262273
CLANG_WARN_BOOL_CONVERSION = YES;
274+
CLANG_WARN_COMMA = YES;
263275
CLANG_WARN_CONSTANT_CONVERSION = YES;
276+
CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
264277
CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
265278
CLANG_WARN_EMPTY_BODY = YES;
266279
CLANG_WARN_ENUM_CONVERSION = YES;
267280
CLANG_WARN_INFINITE_RECURSION = YES;
268281
CLANG_WARN_INT_CONVERSION = YES;
282+
CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
283+
CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
284+
CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
269285
CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
286+
CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
287+
CLANG_WARN_STRICT_PROTOTYPES = YES;
270288
CLANG_WARN_SUSPICIOUS_MOVE = YES;
271289
CLANG_WARN_UNREACHABLE_CODE = YES;
272290
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;

ios/RCTCrypto/lib/Sha.h

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
#import <Foundation/Foundation.h>
22

33
@interface Sha : NSObject
4-
+ (NSString *) sha1: (NSString *)input;
5-
+ (NSString *) sha256: (NSString *)input;
6-
+ (NSString *) sha512: (NSString *)input;
4+
+ (NSData *) sha: (NSData *)input :(NSString *)type;
5+
+ (NSString *) shaUtf8: (NSString *)input :(NSString *)type;;
6+
+ (NSString *) shaBase64: (NSString *)input :(NSString *)type;;
77
@end

ios/RCTCrypto/lib/Sha.m

Lines changed: 31 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -5,27 +5,43 @@
55

66
@implementation Sha
77

8-
+ (NSString *) sha1: (NSString *)input {
9-
NSData* inputData = [input dataUsingEncoding:NSUTF8StringEncoding];
10-
NSMutableData *result = [[NSMutableData alloc] initWithLength:CC_SHA1_DIGEST_LENGTH];
11-
CC_SHA1([inputData bytes], (CC_LONG)[inputData length], result.mutableBytes);
12-
return [Shared toHex:result];
8+
+ (NSData *) sha: (NSData *)input :(NSString *)type {
9+
NSDictionary *algMap = @{
10+
@"SHA-1" : [NSNumber numberWithInt:CC_SHA1_DIGEST_LENGTH],
11+
@"SHA-256" : [NSNumber numberWithInt:CC_SHA256_DIGEST_LENGTH],
12+
@"SHA-512" : [NSNumber numberWithInt:CC_SHA512_DIGEST_LENGTH],
13+
};
14+
15+
int digestLength = [[algMap valueForKey:type] intValue];
16+
if (digestLength == 0) {
17+
[NSException raise:@"Invalid hash algorithm" format:@"%@ is not a valid hash algorithm", type];
18+
}
19+
20+
if (digestLength == CC_SHA1_DIGEST_LENGTH) {
21+
NSMutableData *result = [[NSMutableData alloc] initWithLength:CC_SHA1_DIGEST_LENGTH];
22+
CC_SHA1([input bytes], (CC_LONG)[input length], result.mutableBytes);
23+
return result;
24+
} else {
25+
unsigned char* buffer = malloc(digestLength);
26+
if (digestLength == CC_SHA256_DIGEST_LENGTH) {
27+
CC_SHA256([input bytes], (CC_LONG)[input length], buffer);
28+
} else {
29+
CC_SHA512([input bytes], (CC_LONG)[input length], buffer);
30+
}
31+
return [NSData dataWithBytesNoCopy:buffer length:digestLength freeWhenDone:YES];
32+
}
1333
}
1434

15-
+ (NSString *) sha256: (NSString *)input {
35+
+ (NSString *) shaUtf8: (NSString *)input :(NSString *)type {
1636
NSData* inputData = [input dataUsingEncoding:NSUTF8StringEncoding];
17-
unsigned char* buffer = malloc(CC_SHA256_DIGEST_LENGTH);
18-
CC_SHA256([inputData bytes], (CC_LONG)[inputData length], buffer);
19-
NSData *result = [NSData dataWithBytesNoCopy:buffer length:CC_SHA256_DIGEST_LENGTH freeWhenDone:YES];
37+
NSData* result = [self sha:inputData :type];
2038
return [Shared toHex:result];
2139
}
2240

23-
+ (NSString *) sha512: (NSString *)input {
24-
NSData* inputData = [input dataUsingEncoding:NSUTF8StringEncoding];
25-
unsigned char* buffer = malloc(CC_SHA512_DIGEST_LENGTH);
26-
CC_SHA512([inputData bytes], (CC_LONG)[inputData length], buffer);
27-
NSData *result = [NSData dataWithBytesNoCopy:buffer length:CC_SHA512_DIGEST_LENGTH freeWhenDone:YES];
28-
return [Shared toHex:result];
41+
+ (NSString *) shaBase64: (NSString *)input :(NSString *)type {
42+
NSData* inputData = [[NSData alloc] initWithBase64EncodedString:input options:0];
43+
NSData* result = [self sha:inputData :type];
44+
return [result base64EncodedStringWithOptions:0];
2945
}
3046

3147
@end

0 commit comments

Comments
 (0)