Skip to content

Commit

Permalink
Merge pull request #188 from lolgear/master
Browse files Browse the repository at this point in the history
Crypto key raw generator added.
  • Loading branch information
lolgear authored Mar 14, 2018
2 parents e612160 + 033878d commit 2ec2e3b
Show file tree
Hide file tree
Showing 4 changed files with 104 additions and 9 deletions.
8 changes: 6 additions & 2 deletions Core/Algorithms/RSFamily/RSKeys/JWTCryptoKey.h
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,10 @@
- (instancetype)initWithPemAtURL:(NSURL *)url parameters:(NSDictionary *)parameters error:(NSError *__autoreleasing*)error;
@end

@protocol JWTCryptoKey__Raw__Generator__Protocol
- (instancetype)initWithSecKeyRef:(SecKeyRef)key;
@end

@interface JWTCryptoKeyBuilder : NSObject
@property (assign, nonatomic, readonly) NSString *keyType;
- (instancetype)keyTypeRSA;
Expand All @@ -43,12 +47,12 @@
+ (NSString *)parametersKeyBuilder;
@end

@interface JWTCryptoKeyPublic : JWTCryptoKey <JWTCryptoKey__Generator__Protocol>
@interface JWTCryptoKeyPublic : JWTCryptoKey <JWTCryptoKey__Generator__Protocol, JWTCryptoKey__Raw__Generator__Protocol>
- (instancetype)initWithCertificateData:(NSData *)certificateData parameters:(NSDictionary *)parameters error:(NSError *__autoreleasing*)error; //NS_DESIGNATED_INITIALIZER;
- (instancetype)initWithCertificateBase64String:(NSString *)certificateString parameters:(NSDictionary *)parameters error:(NSError *__autoreleasing*)error;
@end

@interface JWTCryptoKeyPrivate : JWTCryptoKey <JWTCryptoKey__Generator__Protocol>
@interface JWTCryptoKeyPrivate : JWTCryptoKey <JWTCryptoKey__Generator__Protocol, JWTCryptoKey__Raw__Generator__Protocol>
- (instancetype)initWithP12Data:(NSData *)p12Data withPassphrase:(NSString *)passphrase parameters:(NSDictionary *)parameters error:(NSError *__autoreleasing*)error; //NS_DESIGNATED_INITIALIZER;
- (instancetype)initWithP12AtURL:(NSURL *)url withPassphrase:(NSString *)passphrase parameters:(NSDictionary *)parameters error:(NSError *__autoreleasing*)error;
@end
75 changes: 70 additions & 5 deletions Core/Algorithms/RSFamily/RSKeys/JWTCryptoKey.m
Original file line number Diff line number Diff line change
Expand Up @@ -77,10 +77,20 @@ - (NSString *)extractedSecKeyTypeWithParameters:(NSDictionary *)parameters {
return result ?: [JWTCryptoSecurity keyTypeRSA];
}
@end
@interface JWTCryptoKey (Generator) <JWTCryptoKey__Generator__Protocol>
@interface JWTCryptoKey (Generator) <JWTCryptoKey__Generator__Protocol, JWTCryptoKey__Raw__Generator__Protocol>
@end

@implementation JWTCryptoKey (Generator)
- (instancetype)initWithSecKeyRef:(SecKeyRef)key {
self = [super init];
if (key != NULL) {
self.key = key;
}
else {
return nil;
}
return self;
}
- (instancetype)initWithData:(NSData *)data parameters:(NSDictionary *)parameters error:(NSError *__autoreleasing*)error {
// add check that everything is fine.
return [super init];
Expand Down Expand Up @@ -144,7 +154,7 @@ - (instancetype)initWithData:(NSData *)data parameters:(NSDictionary *)parameter
JWTCryptoKeyBuilder *builder = [self extractedBuilderWithParameters:parameters];
NSData *keyData = data;
if (builder.withKeyTypeRSA) {
keyData = [JWTCryptoSecurity dataByRemovingPublicKeyHeader:data error:&removingHeaderError];
keyData = [JWTCryptoSecurity dataByRemovingPublicKeyHeader:data error:&removingHeaderError];
if (!keyData || removingHeaderError) {
if (error && removingHeaderError != nil) {
*error = removingHeaderError;
Expand All @@ -154,16 +164,47 @@ - (instancetype)initWithData:(NSData *)data parameters:(NSDictionary *)parameter
}

if (builder.withKeyTypeEC) {
NSError *theError = nil;
keyData = [JWTCryptoSecurity dataByExtractingKeyFromANS1:data error:&theError];
if (!keyData || theError) {
if (error && theError != nil) {
*error = theError;
}
return nil;
}
// unknown here.
// process keyData before passing it to JWTCryptoSecurity+addKey... method.
// process keyData before passing it to JWTCryptoSecurity+addKey... method.
// keyData = [JWTCryptoSecurity dataByRemovingPublicKeyHeader:data error:&removingHeaderError];
// if (!keyData || removingHeaderError) {
// if (error && removingHeaderError != nil) {
// *error = removingHeaderError;
// }
// return nil;
// }
// NSData *theData = [data copy];
// while (theData != nil && theData.length > 0) {
// NSError *theError = nil;
// self.key = [JWTCryptoSecurity addKeyWithData:theData asPublic:YES tag:self.tag type:[self extractedSecKeyTypeWithParameters:parameters] error:&theError];
// NSLog(@"theData: %@", theData);
// NSLog(@"theError: %@", theError);
// if (!theError && self.key) {
// NSLog(@"Found!");
// NSLog(@"theData: %@", theData);
// NSLog(@"theKey: %@", self.key);
// break;
// }
// NSUInteger length = theData.length - 1;
// NSRange range = NSMakeRange(1, length);
// theData = [NSData dataWithBytes:((char *)theData.bytes) + range.location length:range.length];
// }
}

NSError *addKeyError = nil;

self.key = [JWTCryptoSecurity addKeyWithData:keyData asPublic:YES tag:self.tag type:[self extractedSecKeyTypeWithParameters:parameters] error:&addKeyError];
if (!self.key || addKeyError) {
if (error && addKeyError != nil) {
*error = removingHeaderError;
*error = addKeyError;
}
[self cleanup];
return nil;
Expand Down Expand Up @@ -203,7 +244,31 @@ - (instancetype)initWithData:(NSData *)data parameters:(NSDictionary *)parameter
// or put it in superclass?
return nil;
}
self.key = [JWTCryptoSecurity addKeyWithData:data asPublic:NO tag:self.tag type:[self extractedSecKeyTypeWithParameters:parameters] error:&addKeyError];

NSData *theData = [data copy];
JWTCryptoKeyBuilder *builder = [self extractedBuilderWithParameters:parameters];
if (builder.withKeyTypeEC) {
// cheat and shit!
// ahaha. try to find correct key here.
// possible soultion - dataByExtracting in cryptoKeySecurity.
while (/* DISABLES CODE */ (0) && theData != nil && theData.length > 0) {
NSError *theError = nil;
self.key = [JWTCryptoSecurity addKeyWithData:theData asPublic:NO tag:self.tag type:[self extractedSecKeyTypeWithParameters:parameters] error:&theError];
NSLog(@"theData: %@", theData);
NSLog(@"theError: %@", theError);
if (!theError && self.key) {
NSLog(@"Found!");
NSLog(@"theData: %@", theData);
NSLog(@"theKey: %@", self.key);
break;
}
NSUInteger length = theData.length - 1;
NSRange range = NSMakeRange(1, length);
theData = [NSData dataWithBytes:((char *)theData.bytes) + range.location length:range.length];
}
}

self.key = [JWTCryptoSecurity addKeyWithData:theData asPublic:NO tag:self.tag type:[self extractedSecKeyTypeWithParameters:parameters] error:&addKeyError];
if (!self.key || addKeyError) {
if (error && addKeyError) {
*error = addKeyError;
Expand Down
1 change: 1 addition & 0 deletions Core/Algorithms/RSFamily/RSKeys/JWTCryptoSecurity.h
Original file line number Diff line number Diff line change
Expand Up @@ -35,4 +35,5 @@

@interface JWTCryptoSecurity (PublicKey)
+ (NSData *)dataByRemovingPublicKeyHeader:(NSData *)data error:(NSError *__autoreleasing*)error;
+ (NSData *)dataByExtractingKeyFromANS1:(NSData *)data error:(NSError *__autoreleasing*)error;
@end
29 changes: 27 additions & 2 deletions Core/Algorithms/RSFamily/RSKeys/JWTCryptoSecurity.m
Original file line number Diff line number Diff line change
Expand Up @@ -60,8 +60,8 @@ + (NSString *)keyTypeEC {
// __OSX_AVAILABLE_STARTING(__MAC_10_12, __IPHONE_10_0);
return (__bridge NSString *)kSecAttrKeyTypeEC;
}
+ (SecKeyRef)addKeyWithData:(NSData *)data asPublic:(BOOL)public tag:(NSString *)tag type:(NSString *)type error:(NSError *__autoreleasing*)error; {
NSString *keyClass = (__bridge NSString *)(public ? kSecAttrKeyClassPublic : kSecAttrKeyClassPrivate);
+ (SecKeyRef)addKeyWithData:(NSData *)data asPublic:(BOOL)thePublic tag:(NSString *)tag type:(NSString *)type error:(NSError *__autoreleasing*)error; {
NSString *keyClass = (__bridge NSString *)(thePublic ? kSecAttrKeyClassPublic : kSecAttrKeyClassPrivate);
NSInteger sizeInBits = data.length * [JWTMemoryLayout createWithType:[JWTMemoryLayout typeUInt8]].size;
NSDictionary *attributes = @{
(__bridge NSString*)kSecAttrKeyType : type,
Expand Down Expand Up @@ -506,4 +506,29 @@ + (NSData *)dataByRemovingPublicKeyHeader:(NSData *)data error:(NSError *__autor
// return data
return resultData;
}
+ (NSData *)dataByExtractingKeyFromANS1:(NSData *)data error:(NSError *__autoreleasing *)error {
if (data == nil) {
return nil;
}
// look for 03 42 00 04

int8_t bytesToSearchFor[] = {0x03, 0x42, 0x00, 0x04};
int count = sizeof(bytesToSearchFor) / sizeof(bytesToSearchFor[0]);
NSData *dataToSearchFor = [NSData dataWithBytes:bytesToSearchFor length:count];
NSRange fullRange = NSMakeRange(0, data.length);
NSRange foundRange = [data rangeOfData:dataToSearchFor options:0 range:fullRange];

NSData *foundData = nil;
if (foundRange.location != NSNotFound && foundRange.length != 0) {
// try to extract tail of data.
// but we should also preserve 0x04.
// so, one byte less.
NSInteger tailPosition = foundRange.location + foundRange.length - 1;
NSInteger length = data.length - tailPosition;
if (tailPosition >= 0 && length >= 0) {
foundData = [NSData dataWithBytes:((char *)data.bytes) + tailPosition length:length];
}
}
return foundData;
}
@end

0 comments on commit 2ec2e3b

Please sign in to comment.