FIRInstanceIDKeyPairMigrationTest.m 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137
  1. /*
  2. * Copyright 2019 Google
  3. *
  4. * Licensed under the Apache License, Version 2.0 (the "License");
  5. * you may not use this file except in compliance with the License.
  6. * You may obtain a copy of the License at
  7. *
  8. * http://www.apache.org/licenses/LICENSE-2.0
  9. *
  10. * Unless required by applicable law or agreed to in writing, software
  11. * distributed under the License is distributed on an "AS IS" BASIS,
  12. * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  13. * See the License for the specific language governing permissions and
  14. * limitations under the License.
  15. */
  16. #import <XCTest/XCTest.h>
  17. #import "Firebase/InstanceID/FIRInstanceIDBackupExcludedPlist.h"
  18. #import "Firebase/InstanceID/FIRInstanceIDConstants.h"
  19. #import "Firebase/InstanceID/FIRInstanceIDKeyPair.h"
  20. #import "Firebase/InstanceID/FIRInstanceIDKeychain.h"
  21. #import <OCMock/OCMock.h>
  22. #import "Firebase/InstanceID/FIRInstanceIDKeyPair.h"
  23. #import "Firebase/InstanceID/FIRInstanceIDKeyPairStore.h"
  24. #import "Firebase/InstanceID/FIRInstanceIDKeyPairUtilities.h"
  25. #import "Firebase/InstanceID/FIRInstanceIDUtilities.h"
  26. @interface FIRInstanceIDKeyPairStore (ExposedForTest)
  27. @property(nonatomic, readwrite, strong) FIRInstanceIDBackupExcludedPlist *plist;
  28. @property(nonatomic, readwrite, strong) FIRInstanceIDKeyPair *keyPair;
  29. BOOL FIRInstanceIDHasMigratedKeyPair(NSString *legacyPublicKeyTag, NSString *newPublicKeyTag);
  30. NSString *FIRInstanceIDLegacyPublicTagWithSubtype(NSString *subtype);
  31. NSString *FIRInstanceIDLegacyPrivateTagWithSubtype(NSString *subtype);
  32. NSString *FIRInstanceIDPublicTagWithSubtype(NSString *subtype);
  33. NSString *FIRInstanceIDPrivateTagWithSubtype(NSString *subtype);
  34. + (FIRInstanceIDKeyPair *)keyPairForPrivateKeyTag:(NSString *)privateKeyTag
  35. publicKeyTag:(NSString *)publicKeyTag
  36. error:(NSError *__autoreleasing *)error;
  37. + (void)deleteKeyPairWithPrivateTag:(NSString *)privateTag
  38. publicTag:(NSString *)publicTag
  39. handler:(void (^)(NSError *))handler;
  40. - (void)migrateKeyPairCacheIfNeededWithHandler:(void (^)(NSError *error))handler;
  41. + (NSString *)keyStoreFileName;
  42. @end
  43. // Need to separate the tests from FIRInstanceIDKeyPairStoreTest for separate keychain operations
  44. @interface FIRInstanceIDKeyPairMigrationTest : XCTestCase
  45. @property(nonatomic, readwrite, strong) FIRInstanceIDKeyPairStore *keyPairStore;
  46. @end
  47. @implementation FIRInstanceIDKeyPairMigrationTest
  48. - (void)setUp {
  49. [super setUp];
  50. id mockStoreClass = OCMClassMock([FIRInstanceIDKeyPairStore class]);
  51. [[[mockStoreClass stub] andReturn:@"com.google.iid-keypairmanager-test"] keyStoreFileName];
  52. _keyPairStore = [[FIRInstanceIDKeyPairStore alloc] init];
  53. }
  54. - (void)tearDown {
  55. [super tearDown];
  56. NSError *error = nil;
  57. [self.keyPairStore removeKeyPairCreationTimePlistWithError:&error];
  58. }
  59. - (void)testMigrationDataIfLegtacyKeyPairsNotExist {
  60. NSString *legacyPublicKeyTag =
  61. FIRInstanceIDLegacyPublicTagWithSubtype(kFIRInstanceIDKeyPairSubType);
  62. NSString *publicKeyTag = FIRInstanceIDPublicTagWithSubtype(kFIRInstanceIDKeyPairSubType);
  63. XCTAssertFalse(FIRInstanceIDHasMigratedKeyPair(legacyPublicKeyTag, publicKeyTag));
  64. NSString *legacyPrivateKeyTag =
  65. FIRInstanceIDLegacyPrivateTagWithSubtype(kFIRInstanceIDKeyPairSubType);
  66. NSError *error;
  67. FIRInstanceIDKeyPair *keyPair =
  68. [FIRInstanceIDKeyPairStore keyPairForPrivateKeyTag:legacyPrivateKeyTag
  69. publicKeyTag:legacyPublicKeyTag
  70. error:&error];
  71. XCTAssertFalse([keyPair isValid]);
  72. }
  73. - (void)testMigrationIfLegacyKeyPairsExist {
  74. XCTestExpectation *migrationCompleteExpectation =
  75. [self expectationWithDescription:@"migration should be done"];
  76. // create legacy key pairs
  77. NSString *legacyPublicKeyTag =
  78. FIRInstanceIDLegacyPublicTagWithSubtype(kFIRInstanceIDKeyPairSubType);
  79. NSString *legacyPrivateKeyTag =
  80. FIRInstanceIDLegacyPrivateTagWithSubtype(kFIRInstanceIDKeyPairSubType);
  81. FIRInstanceIDKeyPair *keyPair =
  82. [[FIRInstanceIDKeychain sharedInstance] generateKeyPairWithPrivateTag:legacyPrivateKeyTag
  83. publicTag:legacyPublicKeyTag];
  84. XCTAssertTrue([keyPair isValid]);
  85. NSError *error;
  86. NSString *publicKeyTag = FIRInstanceIDPublicTagWithSubtype(kFIRInstanceIDKeyPairSubType);
  87. NSString *privateKeyTag = FIRInstanceIDPrivateTagWithSubtype(kFIRInstanceIDKeyPairSubType);
  88. XCTAssertFalse(FIRInstanceIDHasMigratedKeyPair(legacyPublicKeyTag, publicKeyTag));
  89. FIRInstanceIDKeyPair *keyPair1 =
  90. [FIRInstanceIDKeyPairStore keyPairForPrivateKeyTag:legacyPrivateKeyTag
  91. publicKeyTag:legacyPublicKeyTag
  92. error:&error];
  93. XCTAssertTrue([keyPair1 isValid]);
  94. [self.keyPairStore migrateKeyPairCacheIfNeededWithHandler:^(NSError *error) {
  95. XCTAssertNil(error);
  96. XCTAssertTrue(FIRInstanceIDHasMigratedKeyPair(legacyPublicKeyTag, publicKeyTag));
  97. FIRInstanceIDKeyPair *keyPair2 =
  98. [FIRInstanceIDKeyPairStore keyPairForPrivateKeyTag:privateKeyTag
  99. publicKeyTag:publicKeyTag
  100. error:&error];
  101. XCTAssertTrue([keyPair2 isValid]);
  102. XCTAssertEqualObjects(keyPair.publicKeyData, keyPair2.publicKeyData);
  103. XCTAssertEqualObjects(keyPair.privateKeyData, keyPair2.privateKeyData);
  104. // Clear the legacy data after tests
  105. [FIRInstanceIDKeyPairStore deleteKeyPairWithPrivateTag:legacyPrivateKeyTag
  106. publicTag:legacyPublicKeyTag
  107. handler:^(NSError *error) {
  108. XCTAssertNil(error);
  109. [migrationCompleteExpectation fulfill];
  110. }];
  111. }];
  112. [self waitForExpectationsWithTimeout:1000 handler:nil];
  113. }
  114. @end