+ + 3 + \
+ + checkNTests + makeCustomDuplicateItemTests \
+ + checkNTests + makeCustomDuplicateItemTests \
+ + checkNTests \
+ + checkNTests \
+ + checkNTests \
+ + 1)\
+
+// Test opening and upgrading a v256 keychain at a -db filename.
+static void testKeychainWrongFile256() {
+ char name[100];
+ sprintf(name, "testKeychainWrongFile256");
+ secnotice("integrity", "************************************* %s", name);
+ UInt32 version;
+
+ unlink(keychainFile);
+ writeOldKeychain(name, keychainDbFile);
+
+ // Only keychainDb file should exist
+ struct stat filebuf;
+ isnt(stat(keychainFile, &filebuf), 0, "%s: %s exists and shouldn't", name, keychainFile);
+ is(stat(keychainDbFile, &filebuf), 0, "%s: %s does not exist", name, keychainDbFile);
+
+ SecKeychainRef kc = openCustomKeychain(name, keychainName, "password");
+
+ SecKeychainItemRef item;
+
+ // Iterate over the keychain to trigger upgrade
+ item = checkNCopyFirst(name, createQueryItemDictionary(kc, kSecClassGenericPassword), 1);
+ makeCustomDuplicateItem(name, kc, kSecClassGenericPassword, CFSTR("test_generic"));
+
+ // We should have created keychainFile, check for it
+ is(stat(keychainFile, &filebuf), 0, "%s: %s does not exist", name, keychainFile);
+ is(stat(keychainDbFile, &filebuf), 0, "%s: %s does not exist", name, keychainDbFile);
+
+ // Check the keychain's version and path
+ char path[400];
+ UInt32 len = sizeof(path);
+
+ ok_status(SecKeychainGetKeychainVersion(kc, &version), "%s: SecKeychainGetKeychainVersion", name);
+ is(version, version_partition, "%s: version of re-upgraded keychain is incorrect", name);
+ ok_status(SecKeychainGetPath(kc, &len, path), "%s: SecKeychainGetPath", name);
+ eq_stringn(path, len, keychainDbFile, strlen(keychainDbFile), "%s: paths do not match", name);
+
+ item = checkNCopyFirst(name, createQueryItemDictionary(kc, kSecClassGenericPassword), 1);
+ makeCustomDuplicateItem(name, kc, kSecClassGenericPassword, CFSTR("test_generic"));
+
+ item = checkNCopyFirst(name, createQueryItemDictionary(kc, kSecClassInternetPassword), 1);
+ makeCustomDuplicateItem(name, kc, kSecClassInternetPassword, CFSTR("test_internet"));
+
+ item = checkNCopyFirst(name, createQueryKeyDictionary(kc, kSecAttrKeyClassSymmetric), 1);
+ item = checkNCopyFirst(name, createQueryKeyDictionary(kc, kSecAttrKeyClassPublic), 1);
+ item = checkNCopyFirst(name, createQueryKeyDictionary(kc, kSecAttrKeyClassPrivate), 1);
+
+ ok_status(SecKeychainDelete(kc), "%s: SecKeychainDelete", name);
+ CFReleaseNull(kc);
+
+ // make sure we clean up any files left over
+ unlink(keychainDbFile);
+ unlink(keychainFile);
+}
+#define testKeychainWrongFile256Tests (2 + openCustomKeychainTests \
+ + checkNTests + makeCustomDuplicateItemTests \
+ + 2 + 4 \
+ + checkNTests + makeCustomDuplicateItemTests \
+ + checkNTests + makeCustomDuplicateItemTests \
+ + checkNTests \
+ + checkNTests \
+ + checkNTests \
+ + 1)
+
+// Test opening and upgrading a v512 keychain at a .keychain filename.
+static void testKeychainWrongFile512() {
+ char name[100];
+ sprintf(name, "testKeychainWrongFile512");
+ secnotice("integrity", "************************************* %s", name);
+ UInt32 version;
+
+ writeFullV512Keychain(name, keychainFile);
+ unlink(keychainDbFile);
+
+ // Only keychain file should exist
+ struct stat filebuf;
+ isnt(stat(keychainDbFile, &filebuf), 0, "%s: %s exists and shouldn't", name, keychainFile);
+ is(stat(keychainFile, &filebuf), 0, "%s: %s does not exist", name, keychainDbFile);
+
+ SecKeychainRef kc = openCustomKeychain(name, keychainName, "password");
+
+ SecKeychainItemRef item;
+
+ // Iterate over the keychain to trigger upgrade
+ item = checkNCopyFirst(name, createQueryItemDictionary(kc, kSecClassGenericPassword), 1);
+ makeCustomDuplicateItem(name, kc, kSecClassGenericPassword, CFSTR("test_generic"));
+
+ // We should have move the keychain to keychainDbFile, check for it
+ isnt(stat(keychainFile, &filebuf), 0, "%s: %s still exists", name, keychainFile);
+ is(stat(keychainDbFile, &filebuf), 0, "%s: %s does not exist", name, keychainDbFile);
+
+ // Check the keychain's version and path
+ char path[400];
+ UInt32 len = sizeof(path);
+
+ ok_status(SecKeychainGetKeychainVersion(kc, &version), "%s: SecKeychainGetKeychainVersion", name);
+ is(version, version_partition, "%s: version of moved keychain is incorrect", name);
+ ok_status(SecKeychainGetPath(kc, &len, path), "%s: SecKeychainGetPath", name);
+ eq_stringn(path, len, keychainDbFile, strlen(keychainDbFile), "%s: paths do not match", name);
+
+ item = checkNCopyFirst(name, createQueryItemDictionary(kc, kSecClassGenericPassword), 1);
+ makeCustomDuplicateItem(name, kc, kSecClassGenericPassword, CFSTR("test_generic"));
+
+ item = checkNCopyFirst(name, createQueryItemDictionary(kc, kSecClassInternetPassword), 1);
+ makeCustomDuplicateItem(name, kc, kSecClassInternetPassword, CFSTR("test_internet"));
+
+ item = checkNCopyFirst(name, createQueryKeyDictionary(kc, kSecAttrKeyClassSymmetric), 1);
+ item = checkNCopyFirst(name, createQueryKeyDictionary(kc, kSecAttrKeyClassPublic), 1);
+ item = checkNCopyFirst(name, createQueryKeyDictionary(kc, kSecAttrKeyClassPrivate), 1);
+
+ ok_status(SecKeychainDelete(kc), "%s: SecKeychainDelete", name);
+ CFReleaseNull(kc);
+
+ // make sure we clean up any files left over
+ unlink(keychainDbFile);
+ unlink(keychainFile);
+}
+#define testKeychainWrongFile512Tests (2 + openCustomKeychainTests \
++ checkNTests + makeCustomDuplicateItemTests \
++ 2 + 4 \
++ checkNTests + makeCustomDuplicateItemTests \
++ checkNTests + makeCustomDuplicateItemTests \
++ checkNTests \
++ checkNTests \
++ checkNTests \
++ 1)
+
+
+#undef version_partition
+#undef version_MacOS_10_0