#include "SOSRingRecovery.h"
#include "SOSRingBackup.h"
#include <AssertMacros.h>
#include <Security/SecureObjectSync/SOSInternal.h>
#include <Security/SecureObjectSync/SOSPeerInfoInternal.h>
#include <Security/SecureObjectSync/SOSPeerInfoCollections.h>
#include <Security/SecureObjectSync/SOSCircle.h>
#include <Security/SecureObjectSync/SOSViews.h>
#include <Security/SecureObjectSync/SOSRecoveryKeyBag.h>
#include <Security/SecFramework.h>
#include <Security/SecKey.h>
#include <Security/SecKeyPriv.h>
#include <CoreFoundation/CoreFoundation.h>
#include <utilities/SecCFWrappers.h>
#include <stdlib.h>
#include <assert.h>
#include "SOSRingUtils.h"
#include "SOSRingTypes.h"
#include "SOSRingBasic.h"
static SOSRingRef SOSRingCreate_Recovery(CFStringRef name, CFStringRef myPeerID, CFErrorRef *error) {
return SOSRingCreate_ForType(name, kSOSRingRecovery, myPeerID, error);
}
ringFuncStruct recovery = {
"Recovery",
1,
SOSRingCreate_Recovery,
SOSRingResetToEmpty_Basic,
SOSRingResetToOffering_Basic,
SOSRingDeviceIsInRing_Basic,
SOSRingApply_Basic,
SOSRingWithdraw_Basic,
SOSRingGenerationSign_Basic,
SOSRingConcordanceSign_Basic,
SOSRingPeerKeyConcordanceTrust,
NULL,
NULL,
SOSRingSetPayload_Basic,
SOSRingGetPayload_Basic,
};
static bool isRecoveryRing(SOSRingRef ring, CFErrorRef *error) {
SOSRingType type = SOSRingGetType(ring);
require_quiet(kSOSRingRecovery == type, errOut);
return true;
errOut:
SOSCreateError(kSOSErrorUnexpectedType, CFSTR("Not recovery ring type"), NULL, error);
return false;
}
bool SOSRingSetRecoveryKeyBag(SOSRingRef ring, SOSFullPeerInfoRef fpi, SOSRecoveryKeyBagRef rkbg, CFErrorRef *error) {
SOSRingAssertStable(ring);
CFDataRef rkbg_as_data = NULL;
bool result = false;
require_quiet(isRecoveryRing(ring, error), errOut);
rkbg_as_data = SOSRecoveryKeyBagCopyEncoded(rkbg, error);
result = rkbg_as_data &&
SOSRingSetPayload(ring, NULL, rkbg_as_data, fpi, error);
errOut:
CFReleaseNull(rkbg_as_data);
return result;
}
SOSRecoveryKeyBagRef SOSRingCopyRecoveryKeyBag(SOSRingRef ring, CFErrorRef *error) {
SOSRingAssertStable(ring);
CFDataRef rkbg_as_data = NULL;
SOSRecoveryKeyBagRef result = NULL;
require_quiet(isRecoveryRing(ring, error), errOut);
rkbg_as_data = SOSRingGetPayload(ring, error);
require_quiet(rkbg_as_data, errOut);
result = SOSRecoveryKeyBagCreateFromData(kCFAllocatorDefault, rkbg_as_data, error);
errOut:
return result;
}