@@ -119,7 +119,7 @@ BOOL FIRInstanceIDHasMigratedKeyPair(NSString *legacyPublicKeyTag, NSString *new
119
119
@interface FIRInstanceIDKeyPairStore ()
120
120
121
121
@property (nonatomic , readwrite , strong ) FIRInstanceIDBackupExcludedPlist *plist;
122
- @property (nonatomic , readwrite , strong ) FIRInstanceIDKeyPair *keyPair;
122
+ @property (atomic , readwrite , strong ) FIRInstanceIDKeyPair *keyPair;
123
123
@property (nonatomic , readwrite , assign ) NSInteger keychainEntitlementsErrorCount;
124
124
125
125
@end
@@ -365,30 +365,31 @@ - (void)migrateKeyPairCacheIfNeededWithHandler:(void (^)(NSError *error))handler
365
365
self.keyPair = keyPair;
366
366
367
367
// Either new key pair doesn't exist or it's different than legacy key pair, start the migration.
368
+ __block NSError *updateKeyRefError;
369
+
368
370
NSString *privateKeyTag = FIRInstanceIDPrivateTagWithSubtype (kFIRInstanceIDKeyPairSubType );
369
371
[self updateKeyRef: keyPair.publicKey
370
372
withTag: publicKeyTag
371
373
handler: ^(NSError *error) {
372
374
if (error) {
373
375
FIRInstanceIDLoggerError (kFIRInstanceIDMessageCodeKeyPairMigrationError ,
374
376
@" Unable to migrate key pair from legacy ones." );
377
+ updateKeyRefError = error;
378
+ }
379
+ }];
380
+
381
+ [self updateKeyRef: keyPair.privateKey
382
+ withTag: privateKeyTag
383
+ handler: ^(NSError *error) {
384
+ if (error) {
385
+ FIRInstanceIDLoggerError (kFIRInstanceIDMessageCodeKeyPairMigrationError ,
386
+ @" Unable to migrate key pair from legacy ones." );
387
+ updateKeyRefError = error;
388
+ }
389
+
390
+ if (handler) {
391
+ handler (updateKeyRefError);
375
392
}
376
- [self updateKeyRef: keyPair.privateKey
377
- withTag: privateKeyTag
378
- handler: ^(NSError *error) {
379
- if (error) {
380
- FIRInstanceIDLoggerError (
381
- kFIRInstanceIDMessageCodeKeyPairMigrationError ,
382
- @" Unable to migrate key pair from legacy ones." );
383
- return ;
384
- }
385
- FIRInstanceIDLoggerDebug (
386
- kFIRInstanceIDMessageCodeKeyPairMigrationSuccess ,
387
- @" Successfully migrated the key pair from legacy ones." );
388
- if (handler) {
389
- handler (error);
390
- }
391
- }];
392
393
}];
393
394
}
394
395
@@ -400,37 +401,38 @@ - (void)updateKeyRef:(SecKeyRef)keyRef
400
401
handler : (void (^)(NSError *error))handler {
401
402
NSData *updatedTagData = [tag dataUsingEncoding: NSUTF8StringEncoding];
402
403
404
+ __block NSError *keychainError;
405
+
403
406
// Always delete the old keychain before adding a new one to avoid conflicts.
404
407
NSDictionary *deleteQuery = @{
405
408
(__bridge id )kSecAttrApplicationTag : updatedTagData,
406
409
(__bridge id )kSecClass : (__bridge id )kSecClassKey ,
407
410
(__bridge id )kSecAttrKeyType : (__bridge id )kSecAttrKeyTypeRSA ,
408
411
(__bridge id )kSecReturnRef : @(YES ),
409
412
};
413
+ [[FIRInstanceIDKeychain sharedInstance ] removeItemWithQuery: deleteQuery
414
+ handler: ^(NSError *error) {
415
+ if (error) {
416
+ keychainError = error;
417
+ }
418
+ }];
410
419
411
- [[FIRInstanceIDKeychain sharedInstance ]
412
- removeItemWithQuery: deleteQuery
413
- handler: ^(NSError *error) {
414
- if (error) {
415
- if (handler) {
416
- handler (error);
417
- }
418
- return ;
419
- }
420
- NSDictionary *addQuery = @{
421
- (__bridge id )kSecAttrApplicationTag : updatedTagData,
422
- (__bridge id )kSecClass : (__bridge id )kSecClassKey ,
423
- (__bridge id )kSecValueRef : (__bridge id )keyRef,
424
- (__bridge id )
425
- kSecAttrAccessible : (__bridge id )kSecAttrAccessibleAlwaysThisDeviceOnly ,
426
- };
427
- [[FIRInstanceIDKeychain sharedInstance ] addItemWithQuery: addQuery
428
- handler: ^(NSError *addError) {
429
- if (handler) {
430
- handler (addError);
431
- }
432
- }];
433
- }];
420
+ NSDictionary *addQuery = @{
421
+ (__bridge id )kSecAttrApplicationTag : updatedTagData,
422
+ (__bridge id )kSecClass : (__bridge id )kSecClassKey ,
423
+ (__bridge id )kSecValueRef : (__bridge id )keyRef,
424
+ (__bridge id )kSecAttrAccessible : (__bridge id )kSecAttrAccessibleAlwaysThisDeviceOnly ,
425
+ };
426
+ [[FIRInstanceIDKeychain sharedInstance ] addItemWithQuery: addQuery
427
+ handler: ^(NSError *addError) {
428
+ if (addError) {
429
+ keychainError = addError;
430
+ }
431
+
432
+ if (handler) {
433
+ handler (keychainError);
434
+ }
435
+ }];
434
436
}
435
437
436
438
- (void )deleteSavedKeyPairWithSubtype : (NSString *)subtype
@@ -453,6 +455,8 @@ - (void)deleteSavedKeyPairWithSubtype:(NSString *)subtype
453
455
}
454
456
}
455
457
458
+ self.keyPair = nil ;
459
+
456
460
[FIRInstanceIDKeyPairStore
457
461
deleteKeyPairWithPrivateTag: privateKeyTag
458
462
publicTag: publicKeyTag
@@ -475,7 +479,6 @@ - (void)deleteSavedKeyPairWithSubtype:(NSString *)subtype
475
479
handler (error);
476
480
}
477
481
} else {
478
- self.keyPair = nil ;
479
482
if (handler) {
480
483
handler (nil );
481
484
}
@@ -489,28 +492,25 @@ + (void)deleteKeyPairWithPrivateTag:(NSString *)privateTag
489
492
NSDictionary *queryPublicKey = FIRInstanceIDKeyPairQuery (publicTag, NO , NO );
490
493
NSDictionary *queryPrivateKey = FIRInstanceIDKeyPairQuery (privateTag, NO , NO );
491
494
495
+ __block NSError *keychainError;
496
+
492
497
// Always remove public key first because it is the key we generate IID.
493
498
[[FIRInstanceIDKeychain sharedInstance ] removeItemWithQuery: queryPublicKey
494
499
handler: ^(NSError *error) {
495
500
if (error) {
496
- if (handler) {
497
- handler (error);
498
- }
499
- return ;
501
+ keychainError = error;
502
+ }
503
+ }];
504
+
505
+ [[FIRInstanceIDKeychain sharedInstance ] removeItemWithQuery: queryPrivateKey
506
+ handler: ^(NSError *error) {
507
+ if (error) {
508
+ keychainError = error;
509
+ }
510
+
511
+ if (handler) {
512
+ handler (keychainError);
500
513
}
501
- [[FIRInstanceIDKeychain sharedInstance ]
502
- removeItemWithQuery: queryPrivateKey
503
- handler: ^(NSError *error) {
504
- if (error) {
505
- if (handler) {
506
- handler (error);
507
- }
508
- return ;
509
- }
510
- if (handler) {
511
- handler (nil );
512
- }
513
- }];
514
514
}];
515
515
}
516
516
0 commit comments