#ifndef _sec_SOSRing_
#define _sec_SOSRing_
#include <CoreFoundation/CoreFoundation.h>
#include <Security/SecureObjectSync/SOSCloudCircle.h>
#include <Security/SecureObjectSync/SOSGenCount.h>
#include <Security/SecureObjectSync/SOSFullPeerInfo.h>
#include <Security/SecureObjectSync/SOSConcordanceTrust.h>
#include <Security/SecureObjectSync/SOSBackupSliceKeyBag.h>
#include <Security/SecKey.h>
typedef struct __OpaqueSOSRing *SOSRingRef;
enum {
kSOSRingMember = 0,
kSOSRingNotInRing = 1,
kSOSRingApplicant = 2,
kSOSRingReject = 3,
kSOSRingRetired = 4,
kSOSRingError = 99,
};
typedef int SOSRingStatus;
enum {
kSOSRingBase = 0,
kSOSRingBackup = 1,
kSOSRingPeerKeyed = 2,
kSOSRingEntropyKeyed = 3,
kSOSRingPKKeyed = 4,
kSOSRingTypeCount = 5,
kSOSRingTypeError = 0xfbad,
};
typedef uint32_t SOSRingType;
CFTypeID SOSRingGetTypeID(void);
SOSRingRef SOSRingCreate(CFStringRef name, CFStringRef myPeerID, SOSRingType type, CFErrorRef *error);
bool SOSRingResetToEmpty(SOSRingRef ring, CFStringRef myPeerID, CFErrorRef *error);
bool SOSRingResetToOffering(SOSRingRef ring, __unused SecKeyRef user_privkey, SOSFullPeerInfoRef requestor, CFErrorRef *error);
SOSRingStatus SOSRingDeviceIsInRing(SOSRingRef ring, CFStringRef peerID);
bool SOSRingApply(SOSRingRef ring, SecKeyRef user_pubkey, SOSFullPeerInfoRef requestor, CFErrorRef *error);
bool SOSRingWithdraw(SOSRingRef ring, SecKeyRef user_privkey, SOSFullPeerInfoRef requestor, CFErrorRef *error);
bool SOSRingGenerationSign(SOSRingRef ring, SecKeyRef user_privkey, SOSFullPeerInfoRef requestor, CFErrorRef *error);
bool SOSRingConcordanceSign(SOSRingRef ring, SOSFullPeerInfoRef requestor, CFErrorRef *error);
SOSConcordanceStatus SOSRingConcordanceTrust(SOSFullPeerInfoRef me, CFSetRef peers,
SOSRingRef knownRing, SOSRingRef proposedRing,
SecKeyRef knownPubkey, SecKeyRef userPubkey,
CFStringRef excludePeerID, CFErrorRef *error);
bool SOSRingAccept(SOSRingRef ring, SecKeyRef user_privkey, SOSFullPeerInfoRef requestor, CFErrorRef *error);
bool SOSRingReject(SOSRingRef ring, SecKeyRef user_privkey, SOSFullPeerInfoRef requestor, CFErrorRef *error);
bool SOSRingSetPayload(SOSRingRef ring, SecKeyRef user_privkey, CFDataRef payload, SOSFullPeerInfoRef requestor, CFErrorRef *error);
CFDataRef SOSRingGetPayload(SOSRingRef ring, CFErrorRef *error);
CFSetRef SOSRingGetBackupViewset(SOSRingRef ring, CFErrorRef *error);
bool SOSRingSetBackupKeyBag(SOSRingRef ring, SOSFullPeerInfoRef fpi, CFSetRef viewSet, SOSBackupSliceKeyBagRef bskb, CFErrorRef *error);
SOSBackupSliceKeyBagRef SOSRingCopyBackupSliceKeyBag(SOSRingRef ring, CFErrorRef *error);
bool SOSRingPeerTrusted(SOSRingRef ring, SOSFullPeerInfoRef requestor, CFErrorRef *error);
bool SOSRingPKTrusted(SOSRingRef ring, SecKeyRef pubkey, CFErrorRef *error);
CFDataRef SOSRingCopyEncodedData(SOSRingRef ring, CFErrorRef *error);
SOSRingRef SOSRingCreateFromData(CFErrorRef* error, CFDataRef ring_data);
CFStringRef SOSRingGetName(SOSRingRef ring);
uint32_t SOSRingGetType(SOSRingRef ring);
SOSGenCountRef SOSRingGetGeneration(SOSRingRef ring);
uint32_t SOSRingGetVersion(SOSRingRef ring);
CFStringRef SOSRingGetIdentifier(SOSRingRef ring);
CFStringRef SOSRingGetLastModifier(SOSRingRef ring);
CFMutableSetRef SOSRingGetApplicants(SOSRingRef ring);
static inline bool isSOSRing(CFTypeRef object) {
return object && (CFGetTypeID(object) == SOSRingGetTypeID());
}
bool SOSBackupRingSetViews(SOSRingRef ring, SOSFullPeerInfoRef requestor, CFSetRef viewSet, CFErrorRef *error);
CFSetRef SOSBackupRingGetViews(SOSRingRef ring, CFErrorRef *error);
#endif