]> git.saurik.com Git - apple/security.git/blob - sec/SOSCircle/SecureObjectSync/SOSCircle.h
Security-55471.14.18.tar.gz
[apple/security.git] / sec / SOSCircle / SecureObjectSync / SOSCircle.h
1 /*
2 * Created by Michael Brouwer on 6/22/12.
3 * Copyright 2012 Apple Inc. All Rights Reserved.
4 */
5
6 /*!
7 @header SOSCircle.h
8 The functions provided in SOSCircle.h provide an interface to a
9 secure object syncing circle for a single class
10 */
11
12 #ifndef _SOSCIRCLE_H_
13 #define _SOSCIRCLE_H_
14
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>
20
21 __BEGIN_DECLS
22
23 typedef struct __OpaqueSOSCircle *SOSCircleRef;
24
25 /* SOSDataSourceFactory protocol (non opaque). */
26 typedef struct SOSDataSourceFactory *SOSDataSourceFactoryRef;
27
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);
32 };
33
34
35 CFTypeID SOSCircleGetTypeID();
36
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);
42
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);
46
47 bool SOSCircleVerifyPeerSigned(SOSCircleRef circle, SOSPeerInfoRef peer, CFErrorRef *error);
48
49 bool SOSCircleGenerationSign(SOSCircleRef circle, SecKeyRef user_approver, SOSFullPeerInfoRef peerinfo, CFErrorRef *error);
50
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);
54
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));
59
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);
64
65 CFStringRef SOSCircleGetName(SOSCircleRef circle);
66 const char *SOSCircleGetNameC(SOSCircleRef circle);
67
68 CFNumberRef SOSCircleGetGeneration(SOSCircleRef circle);
69 int64_t SOSCircleGetGenerationSint(SOSCircleRef circle);
70 void SOSCircleGenerationIncrement(SOSCircleRef circle);
71
72 CFMutableArrayRef SOSCircleCopyPeers(SOSCircleRef circle, CFAllocatorRef allocator);
73 CFMutableArrayRef SOSCircleCopyConcurringPeers(SOSCircleRef circle, CFErrorRef* error);
74
75 int SOSCircleCountPeers(SOSCircleRef circle);
76 int SOSCircleCountActivePeers(SOSCircleRef circle);
77 int SOSCircleCountActiveValidPeers(SOSCircleRef circle, SecKeyRef pubkey);
78 int SOSCircleCountRetiredPeers(SOSCircleRef circle);
79
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));
84
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);
89
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);
94
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,
100 CFErrorRef *error);
101 //
102 // Update a peer's meta information.
103 // No resigning of the circle is done, only updates to their own self signed description.
104 //
105 bool SOSCircleUpdatePeerInfo(SOSCircleRef circle, SOSPeerInfoRef replacement_peer_info);
106
107 bool SOSCircleRemovePeer(SOSCircleRef circle, SecKeyRef user_privkey, SOSFullPeerInfoRef device_approver, SOSPeerInfoRef peerInfo, CFErrorRef *error);
108
109 CFIndex SOSCircleRemoveRetired(SOSCircleRef circle, CFErrorRef *error);
110
111 bool SOSCircleAcceptRequests(SOSCircleRef circle, SecKeyRef user_privkey, SOSFullPeerInfoRef device_approver, CFErrorRef *error);
112
113 SOSPeerInfoRef SOSCircleCopyPeerInfo(SOSCircleRef circle, CFStringRef peer_id, CFErrorRef *error);
114
115 // Stuff above this line is really SOSCircleInfo below the line is the active SOSCircle functionality
116
117 bool SOSCircleSyncWithPeer(SOSFullPeerInfoRef myRef, SOSCircleRef circle,
118 SOSDataSourceFactoryRef factory,
119 SOSPeerSendBlock sendBlock, CFStringRef peer_id,
120 CFErrorRef *error);
121
122 bool SOSCircleHandlePeerMessage(SOSCircleRef circle, SOSFullPeerInfoRef myRef, SOSDataSourceFactoryRef factory,
123 SOSPeerSendBlock sendBlock, CFStringRef peer_id,
124 CFDataRef message, CFErrorRef *error);
125
126 SOSFullPeerInfoRef SOSCircleGetiCloudFullPeerInfoRef(SOSCircleRef circle);
127
128 bool SOSCircleConcordanceSign(SOSCircleRef circle, SOSFullPeerInfoRef peerinfo, CFErrorRef *error);
129
130 enum {
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,
140 };
141 typedef uint32_t SOSConcordanceStatus;
142
143 bool SOSCircleSharedTrustedPeers(SOSCircleRef current, SOSCircleRef proposed, SOSPeerInfoRef me);
144
145 SOSConcordanceStatus SOSCircleConcordanceTrust(SOSCircleRef known_circle, SOSCircleRef proposed_circle,
146 SecKeyRef known_pubkey, SecKeyRef user_pubkey,
147 SOSPeerInfoRef exclude, CFErrorRef *error);
148 //
149 // Testing routines:
150 //
151
152 CFDataRef SOSCircleCreateIncompatibleCircleDER(CFErrorRef* error);
153
154 __END_DECLS
155
156 #endif /* !_SOSCIRCLE_H_ */