secd-71-engine-save.c [plain text]
#include <SOSCircle/Regressions/SOSTestDevice.h>
#include <SOSCircle/Regressions/SOSTestDataSource.h>
#include "secd_regressions.h"
#include "SecdTestKeychainUtilities.h"
#include <Security/SecureObjectSync/SOSEngine.h>
#include <Security/SecureObjectSync/SOSPeer.h>
#include <Security/SecBase64.h>
#include <Security/SecItem.h>
#include <Security/SecItemPriv.h>
#include <corecrypto/ccsha2.h>
#include <securityd/SecItemServer.h>
#include <securityd/SecItemDataSource.h>
#include <utilities/SecCFWrappers.h>
#include <utilities/SecIOFormat.h>
#include <utilities/SecFileLocations.h>
#include <AssertMacros.h>
#include <stdint.h>
static int kTestTestCount = 28 + 1;
#include "secd-71-engine-save-sample1.h"
static bool addEngineStateWithData(CFDataRef engineStateData) {
CFMutableDictionaryRef item = CFDictionaryCreateMutable(kCFAllocatorDefault, 0, &kCFTypeDictionaryKeyCallBacks, &kCFTypeDictionaryValueCallBacks);
CFDictionarySetValue(item, kSecClass, kSecClassGenericPassword);
CFDictionarySetValue(item, kSecAttrAccount, CFSTR("engine-state"));
CFDictionarySetValue(item, kSecAttrAccessGroup, CFSTR("com.apple.security.sos"));
CFDictionarySetValue(item, kSecAttrAccessible, kSecAttrAccessibleAlwaysPrivate);
CFDictionarySetValue(item, kSecAttrService, CFSTR("SOSDataSource-ak"));
CFDictionarySetValue(item, kSecAttrSynchronizable, kCFBooleanFalse);
CFDictionarySetValue(item, kSecValueData, engineStateData);
CFErrorRef localError = NULL;
OSStatus status = noErr;
is_status(status = SecItemAdd(item, (CFTypeRef *)&localError), errSecSuccess, "add v0 engine-state");
CFReleaseSafe(item);
CFReleaseSafe(localError);
return status == noErr;
}
#if 0
static void testsync2(const char *name, const char *test_directive, const char *test_reason, void (^aliceInit)(SOSDataSourceRef ds), void (^bobInit)(SOSDataSourceRef ds), CFStringRef msg, ...) {
__block int iteration=0;
SOSTestDeviceListTestSync(name, test_directive, test_reason, kSOSPeerVersion, false, ^bool(SOSTestDeviceRef source, SOSTestDeviceRef dest) {
if (iteration == 96) {
pass("%@ before message", source);
}
return false;
}, ^bool(SOSTestDeviceRef source, SOSTestDeviceRef dest, SOSMessageRef message) {
iteration++;
if (iteration == 60) {
pass("%@ before addition", source);
SOSTestDeviceAddRemoteGenericItem(source, CFSTR("test_account"), CFSTR("test service"));
pass("%@ after addition", source);
return true;
}
return false;
}, CFSTR("alice"), CFSTR("bob"), CFSTR("claire"), CFSTR("dave"),CFSTR("edward"), CFSTR("frank"), CFSTR("gary"), NULL);
}
#endif
static void testsync2p(void) {
__block int iteration = 0;
SOSTestDeviceListTestSync("testsync2p", test_directive, test_reason, 0, false, ^bool(SOSTestDeviceRef source, SOSTestDeviceRef dest) {
iteration++;
if (iteration <= 10) {
CFStringRef account = CFStringCreateWithFormat(kCFAllocatorDefault, NULL, CFSTR("item%d"), iteration);
SOSTestDeviceAddGenericItem(source, account, CFSTR("testsync2p"));
CFReleaseSafe(account);
return true;
}
return false;
}, ^bool(SOSTestDeviceRef source, SOSTestDeviceRef dest, SOSMessageRef message) {
return false;
}, CFSTR("Atestsync2p"), CFSTR("Btestsync2p"), NULL);
}
static void savetests(void) {
ok(true,"message");
testsync2p();
}
int secd_71_engine_save(int argc, char *const *argv)
{
plan_tests(kTestTestCount);
secd_test_setup_temp_keychain(__FUNCTION__, ^{
CFStringRef keychain_path_cf = __SecKeychainCopyPath();
CFDataRef engineStateData = CFDataCreateWithBytesNoCopy(kCFAllocatorDefault, es_mango_bin, es_mango_bin_len, kCFAllocatorNull);
ok(addEngineStateWithData(engineStateData),"failed to add v0 engine state");
CFReleaseSafe(engineStateData);
CFReleaseSafe(keychain_path_cf);
});
ok(sizeof(es_mango_bin)== es_mango_bin_len,"bad mango");
savetests();
return 0;
}