2222NSString *const AWSIoTKeychainStartCertKeyTag = @" -----BEGIN CERTIFICATE-----\n " ;
2323NSString *const AWSIoTKeychainEndCertKeyTag = @" \n -----END CERTIFICATE-----" ;
2424
25+ static AWSIoTKeyChainAccessibility _accessibility = AWSIoTKeyChainAccessibilityAfterFirstUnlockThisDeviceOnly;
26+
2527@implementation AWSIoTKeychain
2628
2729+ (NSString *)publicKeyTag {
@@ -205,6 +207,7 @@ + (BOOL)addCertificateRef:(SecCertificateRef)certRef {
205207 [queryCertificate setObject: (id )kSecClassCertificate forKey: (id )kSecClass ];
206208 [queryCertificate setObject: [AWSIoTKeychain certTag ] forKey: (id )kSecAttrLabel ];
207209 [queryCertificate setObject: (__bridge id )certRef forKey: (id )kSecValueRef ];
210+ [queryCertificate setObject: (__bridge id )[AWSIoTKeychain accessibilityType ] forKey: (id )kSecAttrAccessible ];
208211
209212 OSStatus sanityCheck = SecItemAdd ((CFDictionaryRef)queryCertificate, nil );
210213 if ((sanityCheck != noErr) && (sanityCheck != errSecDuplicateItem)) {
@@ -226,7 +229,8 @@ + (BOOL)addCertificate:(NSData*)cert withTag:(NSString*)tag {
226229 [queryCertificate setObject: (id )kSecClassCertificate forKey: (id )kSecClass ];
227230 [queryCertificate setObject: tag forKey: (id )kSecAttrLabel ];
228231 [queryCertificate setObject: (__bridge id )certRef forKey: (id )kSecValueRef ];
229-
232+ [queryCertificate setObject: (__bridge id )[AWSIoTKeychain accessibilityType ] forKey: (id )kSecAttrAccessible ];
233+
230234 OSStatus sanityCheck = SecItemAdd ((CFDictionaryRef)queryCertificate, nil );
231235 if ((sanityCheck != noErr) && (sanityCheck != errSecDuplicateItem)) {
232236 AWSDDLogError (@" add certificate to keychain with error: %d " , (int )sanityCheck);
@@ -394,7 +398,8 @@ + (BOOL)addPublicKeyRef:(SecKeyRef)pubkeyRef tag:(NSString*)tag {
394398 [publicKeyAttr setObject: (__bridge id _Nonnull)(pubkeyRef) forKey: (id )kSecValueRef ];
395399 [publicKeyAttr setObject: (id )kSecAttrKeyClassPublic forKey: (id )kSecAttrKeyClass ];
396400 [publicKeyAttr setObject: [NSNumber numberWithBool: YES ] forKey: (id )kSecReturnPersistentRef ];
397-
401+ [publicKeyAttr setObject: (__bridge id )[AWSIoTKeychain accessibilityType ] forKey: (id )kSecAttrAccessible ];
402+
398403 sanityCheck = SecItemAdd ((CFDictionaryRef) publicKeyAttr, (CFTypeRef *)&persistPeer);
399404 if ((sanityCheck != noErr) && (sanityCheck != errSecDuplicateItem)){
400405 AWSDDLogError (@" addPublicKeyRef error: %d " ,(int )sanityCheck);
@@ -417,7 +422,8 @@ + (BOOL)addPublicKey:(NSData*)pubkey tag:(NSString*)tag {
417422 [publicKeyAttr setObject: pubkey forKey: (id )kSecValueData ];
418423 [publicKeyAttr setObject: (id )kSecAttrKeyClassPublic forKey: (id )kSecAttrKeyClass ];
419424 [publicKeyAttr setObject: [NSNumber numberWithBool: YES ] forKey: (id )kSecReturnPersistentRef ];
420-
425+ [publicKeyAttr setObject: (__bridge id )[AWSIoTKeychain accessibilityType ] forKey: (id )kSecAttrAccessible ];
426+
421427 sanityCheck = SecItemAdd ((CFDictionaryRef) publicKeyAttr, (CFTypeRef *)&persistPeer);
422428 if ((sanityCheck != noErr) && (sanityCheck != errSecDuplicateItem)){
423429 AWSDDLogError (@" addPublicKey error: %d " ,(int )sanityCheck);
@@ -440,7 +446,8 @@ + (BOOL)addPrivateKeyRef:(SecKeyRef)privkeyRef tag:(NSString*)tag {
440446 [privateKeyAttr setObject: (__bridge id _Nonnull)(privkeyRef) forKey: (id )kSecValueRef ];
441447 [privateKeyAttr setObject: (id )kSecAttrKeyClassPrivate forKey: (id )kSecAttrKeyClass ];
442448 [privateKeyAttr setObject: [NSNumber numberWithBool: YES ] forKey: (id )kSecReturnPersistentRef ];
443-
449+ [privateKeyAttr setObject: (__bridge id )[AWSIoTKeychain accessibilityType ] forKey: (id )kSecAttrAccessible ];
450+
444451 sanityCheck = SecItemAdd ((CFDictionaryRef) privateKeyAttr, (CFTypeRef *)&persistPeer);
445452 if ((sanityCheck != noErr) && (sanityCheck != errSecDuplicateItem)){
446453 AWSDDLogError (@" addPrivateKeyRef error: %d " ,(int )sanityCheck);
@@ -463,7 +470,8 @@ + (BOOL)addPrivateKey:(NSData*)privkey tag:(NSString*)tag {
463470 [privateKeyAttr setObject: privkey forKey: (id )kSecValueData ];
464471 [privateKeyAttr setObject: (id )kSecAttrKeyClassPrivate forKey: (id )kSecAttrKeyClass ];
465472 [privateKeyAttr setObject: [NSNumber numberWithBool: YES ] forKey: (id )kSecReturnPersistentRef ];
466-
473+ [privateKeyAttr setObject: (__bridge id )[AWSIoTKeychain accessibilityType ] forKey: (id )kSecAttrAccessible ];
474+
467475 sanityCheck = SecItemAdd ((CFDictionaryRef) privateKeyAttr, (CFTypeRef *)&persistPeer);
468476 if ((sanityCheck != noErr) && (sanityCheck != errSecDuplicateItem)){
469477 AWSDDLogError (@" addPrivateKey error: %d " ,(int )sanityCheck);
@@ -524,4 +532,29 @@ + (BOOL)deletePrivateKeyWithTag:(NSString*)tag {
524532 return YES ;
525533}
526534
535+ + (void )setKeyChainAccessibility : (AWSIoTKeyChainAccessibility)accessibility {
536+ _accessibility = accessibility;
537+ }
538+
539+ + (CFTypeRef)accessibilityType {
540+ switch (_accessibility) {
541+ case AWSIoTKeyChainAccessibilityWhenUnlocked:
542+ return kSecAttrAccessibleWhenUnlocked ;
543+ case AWSIoTKeyChainAccessibilityAfterFirstUnlock:
544+ return kSecAttrAccessibleAfterFirstUnlock ;
545+ case AWSIoTKeyChainAccessibilityAlways:
546+ return kSecAttrAccessibleAlways ;
547+ case AWSIoTKeyChainAccessibilityWhenPasscodeSetThisDeviceOnly:
548+ return kSecAttrAccessibleWhenPasscodeSetThisDeviceOnly ;
549+ case AWSIoTKeyChainAccessibilityWhenUnlockedThisDeviceOnly:
550+ return kSecAttrAccessibleWhenUnlockedThisDeviceOnly ;
551+ case AWSIoTKeyChainAccessibilityAfterFirstUnlockThisDeviceOnly:
552+ return kSecAttrAccessibleAfterFirstUnlockThisDeviceOnly ;
553+ case AWSIoTKeyChainAccessibilityAlwaysThisDeviceOnly:
554+ return kSecAttrAccessibleAlwaysThisDeviceOnly ;
555+ default :
556+ return nil ;
557+ }
558+ }
559+
527560@end
0 commit comments