2 * Created by Michael Brouwer on 6/22/12.
3 * Copyright 2012 Apple Inc. All Rights Reserved.
8 The functions provided in SOSCircle.h provide an interface to a
9 secure object syncing circle for a single class
15 #include <Security/Security.h>
16 #include <SecureObjectSync/SOSFullPeerInfo.h>
17 #include <SecureObjectSync/SOSPeerInfo.h>
18 #include <SecureObjectSync/SOSEngine.h>
19 #include <SecureObjectSync/SOSPeer.h>
23 typedef struct __OpaqueSOSCircle
*SOSCircleRef
;
25 /* SOSDataSourceFactory protocol (non opaque). */
26 typedef struct SOSDataSourceFactory
*SOSDataSourceFactoryRef
;
28 struct SOSDataSourceFactory
{
29 CFArrayRef (*copy_names
)(SOSDataSourceFactoryRef factory
);
30 SOSDataSourceRef (*create_datasource
)(SOSDataSourceFactoryRef factory
, CFStringRef dataSourceName
, bool readOnly
, CFErrorRef
*error
);
31 void (*release
)(SOSDataSourceFactoryRef factory
);
35 CFTypeID
SOSCircleGetTypeID();
37 SOSCircleRef
SOSCircleCreate(CFAllocatorRef allocator
, CFStringRef circleName
, CFErrorRef
*error
);
38 SOSCircleRef
SOSCircleCreateFromDER(CFAllocatorRef allocator
, CFErrorRef
* error
,
39 const uint8_t** der_p
, const uint8_t *der_end
);
40 SOSCircleRef
SOSCircleCreateFromData(CFAllocatorRef allocator
, CFDataRef circleData
, CFErrorRef
*error
);
41 SOSCircleRef
SOSCircleCopyCircle(CFAllocatorRef allocator
, SOSCircleRef otherCircle
, CFErrorRef
*error
);
43 bool SOSCircleSign(SOSCircleRef circle
, SecKeyRef privkey
, CFErrorRef
*error
);
44 bool SOSCircleVerifySignatureExists(SOSCircleRef circle
, SecKeyRef pubKey
, CFErrorRef
*error
);
45 bool SOSCircleVerify(SOSCircleRef circle
, SecKeyRef pubkey
, CFErrorRef
*error
);
47 bool SOSCircleVerifyPeerSigned(SOSCircleRef circle
, SOSPeerInfoRef peer
, CFErrorRef
*error
);
49 bool SOSCircleGenerationSign(SOSCircleRef circle
, SecKeyRef user_approver
, SOSFullPeerInfoRef peerinfo
, CFErrorRef
*error
);
51 size_t SOSCircleGetDEREncodedSize(SOSCircleRef cir
, CFErrorRef
*error
);
52 uint8_t* SOSCircleEncodeToDER(SOSCircleRef cir
, CFErrorRef
* error
, const uint8_t* der
, uint8_t* der_end
);
53 CFDataRef
SOSCircleCopyEncodedData(SOSCircleRef circle
, CFAllocatorRef allocator
, CFErrorRef
*error
);
55 int SOSCircleCountApplicants(SOSCircleRef circle
);
56 bool SOSCircleHasApplicant(SOSCircleRef circle
, SOSPeerInfoRef peerInfo
, CFErrorRef
*error
);
57 CFMutableArrayRef
SOSCircleCopyApplicants(SOSCircleRef c
, CFAllocatorRef allocator
);
58 void SOSCircleForEachApplicant(SOSCircleRef circle
, void (^action
)(SOSPeerInfoRef peer
));
60 int SOSCircleCountRejectedApplicants(SOSCircleRef circle
);
61 bool SOSCircleHasRejectedApplicant(SOSCircleRef circle
, SOSPeerInfoRef peerInfo
, CFErrorRef
*error
);
62 SOSPeerInfoRef
SOSCircleCopyRejectedApplicant(SOSCircleRef circle
, SOSPeerInfoRef peerInfo
, CFErrorRef
*error
);
63 CFMutableArrayRef
SOSCircleCopyRejectedApplicants(SOSCircleRef c
, CFAllocatorRef allocator
);
65 CFStringRef
SOSCircleGetName(SOSCircleRef circle
);
66 const char *SOSCircleGetNameC(SOSCircleRef circle
);
68 CFNumberRef
SOSCircleGetGeneration(SOSCircleRef circle
);
69 int64_t SOSCircleGetGenerationSint(SOSCircleRef circle
);
70 void SOSCircleGenerationIncrement(SOSCircleRef circle
);
72 CFMutableArrayRef
SOSCircleCopyPeers(SOSCircleRef circle
, CFAllocatorRef allocator
);
73 CFMutableArrayRef
SOSCircleCopyConcurringPeers(SOSCircleRef circle
, CFErrorRef
* error
);
75 int SOSCircleCountPeers(SOSCircleRef circle
);
76 int SOSCircleCountActivePeers(SOSCircleRef circle
);
77 int SOSCircleCountActiveValidPeers(SOSCircleRef circle
, SecKeyRef pubkey
);
78 int SOSCircleCountRetiredPeers(SOSCircleRef circle
);
80 void SOSCircleForEachPeer(SOSCircleRef circle
, void (^action
)(SOSPeerInfoRef peer
));
81 void SOSCircleForEachRetiredPeer(SOSCircleRef circle
, void (^action
)(SOSPeerInfoRef peer
));
82 void SOSCircleForEachActivePeer(SOSCircleRef circle
, void (^action
)(SOSPeerInfoRef peer
));
83 void SOSCircleForEachActiveValidPeer(SOSCircleRef circle
, SecKeyRef user_public_key
, void (^action
)(SOSPeerInfoRef peer
));
85 bool SOSCircleHasPeerWithID(SOSCircleRef circle
, CFStringRef peerid
, CFErrorRef
*error
);
86 bool SOSCircleHasPeer(SOSCircleRef circle
, SOSPeerInfoRef peerInfo
, CFErrorRef
*error
);
87 bool SOSCircleHasActivePeerWithID(SOSCircleRef circle
, CFStringRef peerid
, CFErrorRef
*error
);
88 bool SOSCircleHasActivePeer(SOSCircleRef circle
, SOSPeerInfoRef peerInfo
, CFErrorRef
*error
);
90 bool SOSCircleResetToOffering(SOSCircleRef circle
, SecKeyRef user_privkey
, SOSFullPeerInfoRef requestor
, CFErrorRef
*error
);
91 bool SOSCircleResetToEmpty(SOSCircleRef circle
, CFErrorRef
*error
);
92 bool SOSCircleRequestAdmission(SOSCircleRef circle
, SecKeyRef user_privkey
, SOSFullPeerInfoRef requestor
, CFErrorRef
*error
);
93 bool SOSCircleRequestReadmission(SOSCircleRef circle
, SecKeyRef user_pubkey
, SOSFullPeerInfoRef requestor
, CFErrorRef
*error
);
95 bool SOSCircleAcceptRequest(SOSCircleRef circle
, SecKeyRef user_privkey
, SOSFullPeerInfoRef device_approver
, SOSPeerInfoRef peerInfo
, CFErrorRef
*error
);
96 bool SOSCircleRejectRequest(SOSCircleRef circle
, SOSFullPeerInfoRef device_approver
, SOSPeerInfoRef peerInfo
, CFErrorRef
*error
);
97 bool SOSCircleWithdrawRequest(SOSCircleRef circle
, SOSPeerInfoRef peerInfo
, CFErrorRef
*error
);
98 bool SOSCircleRemoveRejectedPeer(SOSCircleRef circle
, SOSPeerInfoRef peerInfo
, CFErrorRef
*error
);
99 bool SOSCirclePeerSigUpdate(SOSCircleRef circle
, SecKeyRef userPrivKey
, SOSFullPeerInfoRef fpi
,
102 // Update a peer's meta information.
103 // No resigning of the circle is done, only updates to their own self signed description.
105 bool SOSCircleUpdatePeerInfo(SOSCircleRef circle
, SOSPeerInfoRef replacement_peer_info
);
107 bool SOSCircleRemovePeer(SOSCircleRef circle
, SecKeyRef user_privkey
, SOSFullPeerInfoRef device_approver
, SOSPeerInfoRef peerInfo
, CFErrorRef
*error
);
109 CFIndex
SOSCircleRemoveRetired(SOSCircleRef circle
, CFErrorRef
*error
);
111 bool SOSCircleAcceptRequests(SOSCircleRef circle
, SecKeyRef user_privkey
, SOSFullPeerInfoRef device_approver
, CFErrorRef
*error
);
113 SOSPeerInfoRef
SOSCircleCopyPeerInfo(SOSCircleRef circle
, CFStringRef peer_id
, CFErrorRef
*error
);
115 // Stuff above this line is really SOSCircleInfo below the line is the active SOSCircle functionality
117 bool SOSCircleSyncWithPeer(SOSFullPeerInfoRef myRef
, SOSCircleRef circle
,
118 SOSDataSourceFactoryRef factory
,
119 SOSPeerSendBlock sendBlock
, CFStringRef peer_id
,
122 bool SOSCircleHandlePeerMessage(SOSCircleRef circle
, SOSFullPeerInfoRef myRef
, SOSDataSourceFactoryRef factory
,
123 SOSPeerSendBlock sendBlock
, CFStringRef peer_id
,
124 CFDataRef message
, CFErrorRef
*error
);
126 SOSFullPeerInfoRef
SOSCircleGetiCloudFullPeerInfoRef(SOSCircleRef circle
);
128 bool SOSCircleConcordanceSign(SOSCircleRef circle
, SOSFullPeerInfoRef peerinfo
, CFErrorRef
*error
);
131 kSOSConcordanceTrusted
= 0,
132 kSOSConcordanceGenOld
= 1, // kSOSErrorReplay
133 kSOSConcordanceNoUserSig
= 2, // kSOSErrorBadSignature
134 kSOSConcordanceNoUserKey
= 3, // kSOSErrorNoKey
135 kSOSConcordanceNoPeer
= 4, // kSOSErrorPeerNotFound
136 kSOSConcordanceBadUserSig
= 5, // kSOSErrorBadSignature
137 kSOSConcordanceBadPeerSig
= 6, // kSOSErrorBadSignature
138 kSOSConcordanceNoPeerSig
= 7,
139 kSOSConcordanceWeSigned
= 8,
141 typedef uint32_t SOSConcordanceStatus
;
143 bool SOSCircleSharedTrustedPeers(SOSCircleRef current
, SOSCircleRef proposed
, SOSPeerInfoRef me
);
145 SOSConcordanceStatus
SOSCircleConcordanceTrust(SOSCircleRef known_circle
, SOSCircleRef proposed_circle
,
146 SecKeyRef known_pubkey
, SecKeyRef user_pubkey
,
147 SOSPeerInfoRef exclude
, CFErrorRef
*error
);
152 CFDataRef
SOSCircleCreateIncompatibleCircleDER(CFErrorRef
* error
);
156 #endif /* !_SOSCIRCLE_H_ */