Skip to content

Commit

Permalink
Removed unused label argument from key extraction. Ported keyFromAcco…
Browse files Browse the repository at this point in the history
…untName() from android implementation. Fixed unit tests. Removed deprecated methods.
  • Loading branch information
jensutbult committed Dec 20, 2023
1 parent eab2778 commit 7be88de
Show file tree
Hide file tree
Showing 7 changed files with 26 additions and 122 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -103,7 +103,7 @@ - (instancetype)initWithKeyResponseData:(NSData *)responseData requestTimetamp:(
NSString *account = nil;
NSString *label = nil;

[credentialKey ykf_OATHKeyExtractForType:credential.type period:&period issuer:&issuer account:&account label:&label];
[credentialKey ykf_OATHKeyExtractForType:credential.type period:&period issuer:&issuer account:&account];

credential.issuer = issuer;
credential.accountName = account;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -100,7 +100,7 @@ - (BOOL)readCredentialsFromData:(NSData *)data {
NSString *account = nil;
NSString *label = nil;

[keyString ykf_OATHKeyExtractForType:credential.type period:&period issuer:&issuer account:&account label:&label];
[keyString ykf_OATHKeyExtractForType:credential.type period:&period issuer:&issuer account:&account];
credential.period = period;
credential.issuer = issuer;
credential.accountName = account;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -52,12 +52,6 @@ NS_ASSUME_NONNULL_BEGIN

+ (NSString *)keyFromAccountName:(NSString *)name issuer:(NSString *_Nullable)issuer period:(NSUInteger)period type:(YKFOATHCredentialType)type;

+ (NSString *)labelFromCredentialIdentifier:(id<YKFOATHCredentialIdentifier>)credentialIdentifier __deprecated;
+ (NSString *)keyFromCredentialIdentifier:(id<YKFOATHCredentialIdentifier>)credentialIdentifier __deprecated;

+ (nullable YKFSessionError *)validateCredentialTemplate:(YKFOATHCredentialTemplate *)credentialTemplate __deprecated;
+ (nullable YKFSessionError *)validateCredential:(YKFOATHCredential *)credential __deprecated;

@end

NS_ASSUME_NONNULL_END
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -28,81 +28,16 @@

@implementation YKFOATHCredentialUtils

+ (NSString *)labelFromCredentialIdentifier:(id<YKFOATHCredentialIdentifier>)credentialIdentifier __deprecated {
YKFAssertReturnValue(credentialIdentifier.accountName, @"Missing OATH credential account. Cannot build the credential label.", nil);

if (credentialIdentifier.issuer) {
return [NSString stringWithFormat:@"%@:%@", credentialIdentifier.issuer, credentialIdentifier.accountName];
} else {
return credentialIdentifier.accountName;
}
}

+ (NSString *)keyFromAccountName:(NSString *)name issuer:(NSString *)issuer period:(NSUInteger)period type:(YKFOATHCredentialType)type {
NSString *label;
if (issuer) {
label = [NSString stringWithFormat:@"%@:%@", issuer, name];
} else {
label = name;
}
NSMutableString *accountId = [NSMutableString new];
if (type == YKFOATHCredentialTypeTOTP && period != YKFOATHCredentialDefaultPeriod) {
return [NSString stringWithFormat:@"%ld/%@", (unsigned long)period, label];
} else {
return label;
}
}

+ (NSString *)keyFromCredentialIdentifier:(id<YKFOATHCredentialIdentifier>)credentialIdentifier {
NSString *keyLabel = [YKFOATHCredentialUtils keyFromAccountName:credentialIdentifier.accountName issuer:credentialIdentifier.issuer period:credentialIdentifier.period type:credentialIdentifier.type];

if (credentialIdentifier.type == YKFOATHCredentialTypeTOTP) {
if (credentialIdentifier.period != YKFOATHCredentialDefaultPeriod) {
return [NSString stringWithFormat:@"%ld/%@", (unsigned long)credentialIdentifier.period, keyLabel];
}
else {
return keyLabel;
}
} else {
return keyLabel;
}
}


+ (YKFSessionError *)validateCredentialTemplate:(YKFOATHCredentialTemplate *)credentialTemplate {
YKFParameterAssertReturnValue(credentialTemplate, nil);

if ([YKFOATHCredentialUtils keyFromCredentialIdentifier:credentialTemplate].length > YKFOATHCredentialValidatorMaxNameSize) {
return [YKFOATHError errorWithCode:YKFOATHErrorCodeNameTooLong];
}
NSData *credentialSecret = credentialTemplate.secret;
int shaAlgorithmBlockSize = 0;
switch (credentialTemplate.algorithm) {
case YKFOATHCredentialAlgorithmSHA1:
shaAlgorithmBlockSize = CC_SHA1_BLOCK_BYTES;
break;
case YKFOATHCredentialAlgorithmSHA256:
shaAlgorithmBlockSize = CC_SHA256_BLOCK_BYTES;
break;
case YKFOATHCredentialAlgorithmSHA512:
shaAlgorithmBlockSize = CC_SHA512_BLOCK_BYTES;
break;
default:
YKFAssertReturnValue(NO, @"Invalid OATH algorithm.", nil);
[accountId appendFormat:@"%ld/", (unsigned long)period];
}
if (credentialSecret.length > shaAlgorithmBlockSize) {
return [YKFOATHError errorWithCode:YKFOATHErrorCodeSecretTooLong];
if (issuer != nil) {
[accountId appendFormat:@"%@:", issuer];
}
return nil;
[accountId appendString:name];
return accountId ;
}

+ (YKFSessionError *)validateCredential:(YKFOATHCredential *)credential {
YKFParameterAssertReturnValue(credential, nil);

if ([YKFOATHCredentialUtils keyFromCredentialIdentifier:credential].length > YKFOATHCredentialValidatorMaxNameSize) {
return [YKFOATHError errorWithCode:YKFOATHErrorCodeNameTooLong];
}
return nil;
}


@end
2 changes: 1 addition & 1 deletion YubiKit/YubiKit/Helpers/Additions/YKFNSStringAdditions.h
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,6 @@

@interface NSString(NSString_OATH)

- (void)ykf_OATHKeyExtractForType:(YKFOATHCredentialType)type period:(NSUInteger *)period issuer:(NSString **)issuer account:(NSString **)account label:(NSString **)label;
- (void)ykf_OATHKeyExtractForType:(YKFOATHCredentialType)type period:(NSUInteger *)period issuer:(NSString **)issuer account:(NSString **)account;

@end
3 changes: 2 additions & 1 deletion YubiKit/YubiKit/Helpers/Additions/YKFNSStringAdditions.m
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@

@implementation NSString(NSString_OATH)

- (void)ykf_OATHKeyExtractForType:(YKFOATHCredentialType)type period:(NSUInteger *)period issuer:(NSString **)issuer account:(NSString **)account label:(NSString **)label {
- (void)ykf_OATHKeyExtractForType:(YKFOATHCredentialType)type period:(NSUInteger *)period issuer:(NSString **)issuer account:(NSString **)account {

if (type == YKFOATHCredentialTypeTOTP) {
NSError *error = NULL;
Expand All @@ -42,6 +42,7 @@ - (void)ykf_OATHKeyExtractForType:(YKFOATHCredentialType)type period:(NSUInteger
*account = [self substringWithRange:accountRange];
}
} else {
//Invalid id, use it directly as name.
*account = self;
}
} else {
Expand Down
56 changes: 15 additions & 41 deletions YubiKit/YubiKitTests/Tests/YKNSStringAdditionTests.m
Original file line number Diff line number Diff line change
Expand Up @@ -21,11 +21,9 @@ - (void)test_WhenKeyContainsSlashAndPeriodExists_PeriodIsParsed {
NSUInteger period = 0;
NSString *issuer = nil;
NSString *account = nil;
NSString *label = nil;

[credentialKey ykf_OATHKeyExtractPeriod: &period issuer: &issuer account: &account label: &label];
[credentialKey ykf_OATHKeyExtractForType:YKFOATHCredentialTypeTOTP period:&period issuer:&issuer account:&account];
XCTAssertEqual(period, 60, @"");
XCTAssertTrue([label isEqualToString:@"Yubico:[email protected]"], @"");
}

- (void)test_WhenKeyContainsSlashAndPeriodNotExists_PeriodIsZero {
Expand All @@ -34,11 +32,9 @@ - (void)test_WhenKeyContainsSlashAndPeriodNotExists_PeriodIsZero {
NSUInteger period = 0;
NSString *issuer = nil;
NSString *account = nil;
NSString *label = nil;

[credentialKey ykf_OATHKeyExtractPeriod: &period issuer: &issuer account: &account label: &label];
[credentialKey ykf_OATHKeyExtractForType:YKFOATHCredentialTypeTOTP period:&period issuer:&issuer account:&account];
XCTAssertEqual(period, 0, @"");
XCTAssertTrue([label isEqualToString:@"/Yubico:[email protected]"], @"");
}

- (void)test_WhenKeyContainsSlashInTheMiddleOfText_PeriodIsZero {
Expand All @@ -47,11 +43,9 @@ - (void)test_WhenKeyContainsSlashInTheMiddleOfText_PeriodIsZero {
NSUInteger period = 0;
NSString *issuer = nil;
NSString *account = nil;
NSString *label = nil;

[credentialKey ykf_OATHKeyExtractPeriod: &period issuer: &issuer account: &account label: &label];
[credentialKey ykf_OATHKeyExtractForType:YKFOATHCredentialTypeTOTP period:&period issuer:&issuer account:&account];
XCTAssertEqual(period, 0, @"");
XCTAssertTrue([label isEqualToString:@"Yubico/demo:[email protected]"], @"");
}

- (void)test_WhenKeyContainsSlashAndPeriodExistsAndIssuerNotExists_PeriodIsParsedAndIssuerIsNilAndAccountIsParsed {
Expand All @@ -62,10 +56,9 @@ - (void)test_WhenKeyContainsSlashAndPeriodExistsAndIssuerNotExists_PeriodIsParse
NSString *account = nil;
NSString *label = nil;

[credentialKey ykf_OATHKeyExtractPeriod: &period issuer: &issuer account: &account label: &label];
[credentialKey ykf_OATHKeyExtractForType:YKFOATHCredentialTypeTOTP period:&period issuer:&issuer account:&account];
XCTAssertNil(issuer, @"Issuer parsed as nil");
XCTAssertNotNil(account, @"Account is parsed");
XCTAssertTrue([label isEqualToString:@"[email protected]"], @"");
XCTAssertTrue([account isEqualToString:@"[email protected]"], @"");
XCTAssertEqual(period, 60, @"");
}
Expand All @@ -76,12 +69,10 @@ - (void)test_WhenKeyPeriodNotExistsAndIssuerNotExists_PeriodIsZeroAndIssuerIsNil
NSUInteger period = 0;
NSString *issuer = nil;
NSString *account = nil;
NSString *label = nil;

[credentialKey ykf_OATHKeyExtractPeriod: &period issuer: &issuer account: &account label: &label];
[credentialKey ykf_OATHKeyExtractForType:YKFOATHCredentialTypeTOTP period:&period issuer:&issuer account:&account];
XCTAssertNil(issuer, @"Issuer parsed as nil");
XCTAssertNotNil(account, @"Account is parsed");
XCTAssertTrue([label isEqualToString:@"[email protected]"], @"");
XCTAssertTrue([account isEqualToString:@"[email protected]"], @"");
XCTAssertEqual(period, 0, @"");
}
Expand All @@ -92,14 +83,11 @@ - (void)test_WhenKeyAccountContainsColonAndPeriodNotExistsAndIssuerNotExists_Per
NSUInteger period = 0;
NSString *issuer = nil;
NSString *account = nil;
NSString *label = nil;

[credentialKey ykf_OATHKeyExtractPeriod: &period issuer: &issuer account: &account label: &label];
XCTAssertNotNil(issuer, @"Issuer is parsed");
[credentialKey ykf_OATHKeyExtractForType:YKFOATHCredentialTypeTOTP period:&period issuer:&issuer account:&account];
XCTAssertNil(issuer, @"Issuer is not nil");
XCTAssertNotNil(account, @"Account is parsed");
XCTAssertTrue([label isEqualToString:@":[email protected]"], @"");
XCTAssertTrue([issuer isEqualToString:@""], @"");
XCTAssertTrue([account isEqualToString:@"[email protected]"], @"");
XCTAssertTrue([account isEqualToString:@":[email protected]"], @"");
XCTAssertEqual(period, 0, @"");
}

Expand All @@ -109,12 +97,10 @@ - (void)test_WhenKeyPeriodNotExistsAndIssuerContainsColon_PeriodIsZeroAndLableIs
NSUInteger period = 0;
NSString *issuer = nil;
NSString *account = nil;
NSString *label = nil;

[credentialKey ykf_OATHKeyExtractPeriod: &period issuer: &issuer account: &account label: &label];
[credentialKey ykf_OATHKeyExtractForType:YKFOATHCredentialTypeTOTP period:&period issuer:&issuer account:&account];
XCTAssertNotNil(issuer, @"Issuer is parsed");
XCTAssertNotNil(account, @"Account is parsed");
XCTAssertTrue([label isEqualToString:@"Yubico:demo:[email protected]"], @"");
XCTAssertTrue([issuer isEqualToString:@"Yubico"], @"");
XCTAssertTrue([account isEqualToString:@"demo:[email protected]"], @"");
XCTAssertEqual(period, 0, @"");
Expand All @@ -126,12 +112,10 @@ - (void)test_WhenKeyPeriodExistsAndIssuerContainsColon_PeriodIsParsedAndLableIsP
NSUInteger period = 0;
NSString *issuer = nil;
NSString *account = nil;
NSString *label = nil;

[credentialKey ykf_OATHKeyExtractPeriod: &period issuer: &issuer account: &account label: &label];
[credentialKey ykf_OATHKeyExtractForType:YKFOATHCredentialTypeTOTP period:&period issuer:&issuer account:&account];
XCTAssertNotNil(issuer, @"Issuer is parsed");
XCTAssertNotNil(account, @"Account is parsed");
XCTAssertTrue([label isEqualToString:@"Yubico:demo:[email protected]"], @"");
XCTAssertTrue([issuer isEqualToString:@"Yubico"], @"");
XCTAssertTrue([account isEqualToString:@"demo:[email protected]"], @"");
XCTAssertEqual(period, 15, @"");
Expand All @@ -143,12 +127,10 @@ - (void)test_WhenKeyPeriodNotExistsAndAccountContainsSlash_PeriodIsZeroAndLableI
NSUInteger period = 0;
NSString *issuer = nil;
NSString *account = nil;
NSString *label = nil;

[credentialKey ykf_OATHKeyExtractPeriod: &period issuer: &issuer account: &account label: &label];
[credentialKey ykf_OATHKeyExtractForType:YKFOATHCredentialTypeTOTP period:&period issuer:&issuer account:&account];
XCTAssertNotNil(issuer, @"Issuer is parsed");
XCTAssertNotNil(account, @"Account is parsed");
XCTAssertTrue([label isEqualToString:@"YubicoDemo:account/test"], @"");
XCTAssertTrue([issuer isEqualToString:@"YubicoDemo"], @"");
XCTAssertTrue([account isEqualToString:@"account/test"], @"");
XCTAssertEqual(period, 0, @"");
Expand All @@ -160,12 +142,10 @@ - (void)test_WhenKeyPeriodNotExistsAndIssuerContainsSlashAndAccountContainsSlash
NSUInteger period = 0;
NSString *issuer = nil;
NSString *account = nil;
NSString *label = nil;

[credentialKey ykf_OATHKeyExtractPeriod: &period issuer: &issuer account: &account label: &label];
[credentialKey ykf_OATHKeyExtractForType:YKFOATHCredentialTypeTOTP period:&period issuer:&issuer account:&account];
XCTAssertNotNil(issuer, @"Issuer is parsed");
XCTAssertNotNil(account, @"Account is parsed");
XCTAssertTrue([label isEqualToString:@"Yubico/demo:account/test"], @"");
XCTAssertTrue([issuer isEqualToString:@"Yubico/demo"], @"");
XCTAssertTrue([account isEqualToString:@"account/test"], @"");
XCTAssertEqual(period, 0, @"");
Expand All @@ -177,12 +157,10 @@ - (void)test_WhenKeyPeriodExistsAndAccountContainsSlash_PeriodIsParsedAndLableIs
NSUInteger period = 0;
NSString *issuer = nil;
NSString *account = nil;
NSString *label = nil;

[credentialKey ykf_OATHKeyExtractPeriod: &period issuer: &issuer account: &account label: &label];
[credentialKey ykf_OATHKeyExtractForType:YKFOATHCredentialTypeTOTP period:&period issuer:&issuer account:&account];
XCTAssertNotNil(issuer, @"Issuer is parsed");
XCTAssertNotNil(account, @"Account is parsed");
XCTAssertTrue([label isEqualToString:@"YubicoDemo:account/test"], @"");
XCTAssertTrue([issuer isEqualToString:@"YubicoDemo"], @"");
XCTAssertTrue([account isEqualToString:@"account/test"], @"");
XCTAssertEqual(period, 15, @"");
Expand All @@ -194,12 +172,10 @@ - (void)test_WhenKeyPeriodExistsAndIssuerContainsSlashAndAccountContainsSlash_Pe
NSUInteger period = 0;
NSString *issuer = nil;
NSString *account = nil;
NSString *label = nil;

[credentialKey ykf_OATHKeyExtractPeriod: &period issuer: &issuer account: &account label: &label];
[credentialKey ykf_OATHKeyExtractForType:YKFOATHCredentialTypeTOTP period:&period issuer:&issuer account:&account];
XCTAssertNotNil(issuer, @"Issuer is parsed");
XCTAssertNotNil(account, @"Account is parsed");
XCTAssertTrue([label isEqualToString:@"Yubico/demo:account/test"], @"");
XCTAssertTrue([issuer isEqualToString:@"Yubico/demo"], @"");
XCTAssertTrue([account isEqualToString:@"account/test"], @"");
XCTAssertEqual(period, 15, @"");
Expand All @@ -211,12 +187,10 @@ - (void)test_WhenKeyPeriodNotExistsAccountContainsColon_PeriodIsZeroAndLableIsPa
NSUInteger period = 0;
NSString *issuer = nil;
NSString *account = nil;
NSString *label = nil;

[credentialKey ykf_OATHKeyExtractPeriod: &period issuer: &issuer account: &account label: &label];
[credentialKey ykf_OATHKeyExtractForType:YKFOATHCredentialTypeTOTP period:&period issuer:&issuer account:&account];
XCTAssertNotNil(issuer, @"Issuer is parsed");
XCTAssertNotNil(account, @"Account is parsed");
XCTAssertTrue([label isEqualToString:@"Yubico Demo:account:test"], @"");
XCTAssertTrue([issuer isEqualToString:@"Yubico Demo"], @"");
XCTAssertTrue([account isEqualToString:@"account:test"], @"");
XCTAssertEqual(period, 0, @"");
Expand Down

0 comments on commit 7be88de

Please sign in to comment.