22
22
NSString *const AWSIoTKeychainStartCertKeyTag = @" -----BEGIN CERTIFICATE-----\n " ;
23
23
NSString *const AWSIoTKeychainEndCertKeyTag = @" \n -----END CERTIFICATE-----" ;
24
24
25
+ static AWSIoTKeyChainAccessibility _accessibility = AWSIoTKeyChainAccessibilityAfterFirstUnlockThisDeviceOnly;
26
+
25
27
@implementation AWSIoTKeychain
26
28
27
29
+ (NSString *)publicKeyTag {
@@ -205,6 +207,7 @@ + (BOOL)addCertificateRef:(SecCertificateRef)certRef {
205
207
[queryCertificate setObject: (id )kSecClassCertificate forKey: (id )kSecClass ];
206
208
[queryCertificate setObject: [AWSIoTKeychain certTag ] forKey: (id )kSecAttrLabel ];
207
209
[queryCertificate setObject: (__bridge id )certRef forKey: (id )kSecValueRef ];
210
+ [queryCertificate setObject: (__bridge id )[AWSIoTKeychain accessibilityType ] forKey: (id )kSecAttrAccessible ];
208
211
209
212
OSStatus sanityCheck = SecItemAdd ((CFDictionaryRef)queryCertificate, nil );
210
213
if ((sanityCheck != noErr) && (sanityCheck != errSecDuplicateItem)) {
@@ -226,7 +229,8 @@ + (BOOL)addCertificate:(NSData*)cert withTag:(NSString*)tag {
226
229
[queryCertificate setObject: (id )kSecClassCertificate forKey: (id )kSecClass ];
227
230
[queryCertificate setObject: tag forKey: (id )kSecAttrLabel ];
228
231
[queryCertificate setObject: (__bridge id )certRef forKey: (id )kSecValueRef ];
229
-
232
+ [queryCertificate setObject: (__bridge id )[AWSIoTKeychain accessibilityType ] forKey: (id )kSecAttrAccessible ];
233
+
230
234
OSStatus sanityCheck = SecItemAdd ((CFDictionaryRef)queryCertificate, nil );
231
235
if ((sanityCheck != noErr) && (sanityCheck != errSecDuplicateItem)) {
232
236
AWSDDLogError (@" add certificate to keychain with error: %d " , (int )sanityCheck);
@@ -394,7 +398,8 @@ + (BOOL)addPublicKeyRef:(SecKeyRef)pubkeyRef tag:(NSString*)tag {
394
398
[publicKeyAttr setObject: (__bridge id _Nonnull)(pubkeyRef) forKey: (id )kSecValueRef ];
395
399
[publicKeyAttr setObject: (id )kSecAttrKeyClassPublic forKey: (id )kSecAttrKeyClass ];
396
400
[publicKeyAttr setObject: [NSNumber numberWithBool: YES ] forKey: (id )kSecReturnPersistentRef ];
397
-
401
+ [publicKeyAttr setObject: (__bridge id )[AWSIoTKeychain accessibilityType ] forKey: (id )kSecAttrAccessible ];
402
+
398
403
sanityCheck = SecItemAdd ((CFDictionaryRef) publicKeyAttr, (CFTypeRef *)&persistPeer);
399
404
if ((sanityCheck != noErr) && (sanityCheck != errSecDuplicateItem)){
400
405
AWSDDLogError (@" addPublicKeyRef error: %d " ,(int )sanityCheck);
@@ -417,7 +422,8 @@ + (BOOL)addPublicKey:(NSData*)pubkey tag:(NSString*)tag {
417
422
[publicKeyAttr setObject: pubkey forKey: (id )kSecValueData ];
418
423
[publicKeyAttr setObject: (id )kSecAttrKeyClassPublic forKey: (id )kSecAttrKeyClass ];
419
424
[publicKeyAttr setObject: [NSNumber numberWithBool: YES ] forKey: (id )kSecReturnPersistentRef ];
420
-
425
+ [publicKeyAttr setObject: (__bridge id )[AWSIoTKeychain accessibilityType ] forKey: (id )kSecAttrAccessible ];
426
+
421
427
sanityCheck = SecItemAdd ((CFDictionaryRef) publicKeyAttr, (CFTypeRef *)&persistPeer);
422
428
if ((sanityCheck != noErr) && (sanityCheck != errSecDuplicateItem)){
423
429
AWSDDLogError (@" addPublicKey error: %d " ,(int )sanityCheck);
@@ -440,7 +446,8 @@ + (BOOL)addPrivateKeyRef:(SecKeyRef)privkeyRef tag:(NSString*)tag {
440
446
[privateKeyAttr setObject: (__bridge id _Nonnull)(privkeyRef) forKey: (id )kSecValueRef ];
441
447
[privateKeyAttr setObject: (id )kSecAttrKeyClassPrivate forKey: (id )kSecAttrKeyClass ];
442
448
[privateKeyAttr setObject: [NSNumber numberWithBool: YES ] forKey: (id )kSecReturnPersistentRef ];
443
-
449
+ [privateKeyAttr setObject: (__bridge id )[AWSIoTKeychain accessibilityType ] forKey: (id )kSecAttrAccessible ];
450
+
444
451
sanityCheck = SecItemAdd ((CFDictionaryRef) privateKeyAttr, (CFTypeRef *)&persistPeer);
445
452
if ((sanityCheck != noErr) && (sanityCheck != errSecDuplicateItem)){
446
453
AWSDDLogError (@" addPrivateKeyRef error: %d " ,(int )sanityCheck);
@@ -463,7 +470,8 @@ + (BOOL)addPrivateKey:(NSData*)privkey tag:(NSString*)tag {
463
470
[privateKeyAttr setObject: privkey forKey: (id )kSecValueData ];
464
471
[privateKeyAttr setObject: (id )kSecAttrKeyClassPrivate forKey: (id )kSecAttrKeyClass ];
465
472
[privateKeyAttr setObject: [NSNumber numberWithBool: YES ] forKey: (id )kSecReturnPersistentRef ];
466
-
473
+ [privateKeyAttr setObject: (__bridge id )[AWSIoTKeychain accessibilityType ] forKey: (id )kSecAttrAccessible ];
474
+
467
475
sanityCheck = SecItemAdd ((CFDictionaryRef) privateKeyAttr, (CFTypeRef *)&persistPeer);
468
476
if ((sanityCheck != noErr) && (sanityCheck != errSecDuplicateItem)){
469
477
AWSDDLogError (@" addPrivateKey error: %d " ,(int )sanityCheck);
@@ -524,4 +532,29 @@ + (BOOL)deletePrivateKeyWithTag:(NSString*)tag {
524
532
return YES ;
525
533
}
526
534
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
+
527
560
@end
0 commit comments