]> git.saurik.com Git - apple/security.git/blob - sec/SOSCircle/Regressions/sc-75-circle-engine.c
Security-55471.14.8.tar.gz
[apple/security.git] / sec / SOSCircle / Regressions / sc-75-circle-engine.c
1 //
2 // sc-75-circle-engine.c
3 // sec
4 //
5 // Created by Michael Brouwer on 9/24/12.
6 // Copyright 2012 Apple Inc. All rights reserved.
7 //
8
9 #include <SecureObjectSync/SOSEngine.h>
10 #include <SecureObjectSync/SOSPeer.h>
11
12 #include "SOSCircle_regressions.h"
13
14 #include <corecrypto/ccsha2.h>
15
16 #include <utilities/SecCFWrappers.h>
17
18 #include <stdint.h>
19
20 #include <AssertMacros.h>
21
22 #include <stdio.h>
23 #include <stdlib.h>
24 #include <unistd.h>
25 #include <CoreFoundation/CFDate.h>
26
27 #include <utilities/SecCFWrappers.h>
28
29 #include <Security/SecKey.h>
30
31 #include <SecureObjectSync/SOSPeerInfo.h>
32 #include <SecureObjectSync/SOSCircle.h>
33 #include <SecureObjectSync/SOSCloudCircle.h>
34 #include <SecureObjectSync/SOSInternal.h>
35 #include <SecureObjectSync/SOSUserKeygen.h>
36
37 #include "SOSCircle_regressions.h"
38 #include "SOSRegressionUtilities.h"
39 #include "SOSTestDataSource.h"
40
41 #ifndef SEC_CONST_DECL
42 #define SEC_CONST_DECL(k,v) CFTypeRef k = (CFTypeRef)(CFSTR(v));
43 #endif
44
45 #include <securityd/SOSCloudCircleServer.h>
46
47
48 // MARK: ----- Constants -----
49
50 static CFStringRef circleKey = CFSTR("Circle");
51
52 static int kTestTestCount = 22;
53
54 static void tests()
55 {
56 CFErrorRef error = NULL;
57
58 CFStringRef aliceID = CFSTR("Alice");
59 CFStringRef bobID = CFSTR("Bob"); // not really remote, just another client on same machine
60
61 SecKeyRef alice_key = NULL;
62 SecKeyRef bob_key = NULL;
63
64 CFDataRef cfpassword = CFDataCreate(NULL, (uint8_t *) "FooFooFoo", 10);
65
66 CFDataRef parameters = SOSUserKeyCreateGenerateParameters(&error);
67 ok(parameters, "No parameters!");
68 ok(error == NULL, "Error: (%@)", error);
69 CFReleaseNull(error);
70
71 SecKeyRef user_privkey = SOSUserKeygen(cfpassword, parameters, &error);
72 CFReleaseNull(parameters);
73 CFReleaseSafe(cfpassword);
74
75 CFStringRef circleName = CFSTR("Woot Circle");
76
77 SOSFullPeerInfoRef alice_full_peer_info = SOSCreateFullPeerInfoFromName(aliceID, &alice_key, &error);
78 SOSPeerInfoRef alice_peer_info = SOSFullPeerInfoGetPeerInfo(alice_full_peer_info);
79
80 SOSFullPeerInfoRef bob_full_peer_info = SOSCreateFullPeerInfoFromName(bobID, &bob_key, &error);
81 SOSPeerInfoRef bob_peer_info = SOSFullPeerInfoGetPeerInfo(bob_full_peer_info);
82
83 SOSCircleRef aliceCircle = SOSCircleCreate(kCFAllocatorDefault, circleName, &error);
84
85 ok(SOSCircleRequestAdmission(aliceCircle, user_privkey, alice_full_peer_info, &error));
86 ok(SOSCircleAcceptRequests(aliceCircle, user_privkey, alice_full_peer_info, NULL));
87 ok(SOSCircleRequestAdmission(aliceCircle, user_privkey, bob_full_peer_info, &error), "requested admission");
88 ok(SOSCircleAcceptRequests(aliceCircle, user_privkey, bob_full_peer_info, &error), "accepted them all!");
89
90 alice_peer_info = SOSFullPeerInfoGetPeerInfo(alice_full_peer_info);
91 bob_peer_info = SOSFullPeerInfoGetPeerInfo(bob_full_peer_info);
92
93 CFDataRef aliceCircleEncoded;
94 ok(aliceCircleEncoded = SOSCircleCopyEncodedData(aliceCircle, kCFAllocatorDefault, &error), "encode alice circle: %@", error);
95 CFReleaseNull(error);
96 SOSCircleRef bobCircle;
97 ok(bobCircle = SOSCircleCreateFromData(0, aliceCircleEncoded, &error), "decode bobCircle: %@", error);
98 CFReleaseNull(aliceCircleEncoded);
99 CFReleaseNull(error);
100
101 /* Transport. */
102 __block CFDataRef queued_message = NULL;
103
104 SOSPeerSendBlock enqueueMessage = ^bool (CFDataRef message, CFErrorRef *error) {
105 if (queued_message)
106 fail("We already had an unproccessed message");
107
108 queued_message = (CFDataRef) CFRetain(message);
109 return true;
110 };
111
112 CFDataRef (^dequeueMessage)() = ^CFDataRef () {
113 CFDataRef result = queued_message;
114 queued_message = NULL;
115
116 return result;
117 };
118
119 /* DataSource */
120 SOSDataSourceRef aliceDs = SOSTestDataSourceCreate();
121 SOSDataSourceRef bobDs = SOSTestDataSourceCreate();
122
123 SOSDataSourceFactoryRef aliceDsf = SOSTestDataSourceFactoryCreate();
124 SOSTestDataSourceFactoryAddDataSource(aliceDsf, circleName, aliceDs);
125
126 SOSDataSourceFactoryRef bobDsf = SOSTestDataSourceFactoryCreate();
127 SOSTestDataSourceFactoryAddDataSource(bobDsf, circleName, bobDs);
128
129 /* Test passing peer messages to the engine. */
130 CFDataRef message;
131
132 CFStringRef bob_peer_id = SOSPeerInfoGetPeerID(bob_peer_info);
133
134 /* Hand an empty message to the engine for handeling. */
135 message = CFDataCreate(NULL, NULL, 0);
136 is(SOSCircleHandlePeerMessage(aliceCircle, alice_full_peer_info, aliceDsf, enqueueMessage, bob_peer_id, message, &error), false,
137 "empty message rejected, %@", error);
138
139 CFReleaseNull(error);
140 CFReleaseNull(message);
141
142 ok(SOSCircleSyncWithPeer(alice_full_peer_info, aliceCircle, aliceDsf, enqueueMessage, bob_peer_id, &error), "Start sync [error %@]", error);
143 CFReleaseNull(error);
144
145 ok(message = dequeueMessage(), "Alice sent message");
146 CFStringRef alice_peer_id = SOSPeerInfoGetPeerID(alice_peer_info);
147 is(SOSCircleHandlePeerMessage(bobCircle, bob_full_peer_info, bobDsf, enqueueMessage, alice_peer_id, message, &error), true,
148 "Bob accepted message: %@", error);
149 CFReleaseNull(message);
150
151 #if 1
152 CFStringRef desc = NULL;
153 ok(message = dequeueMessage(), "we got a message from Bob %@", desc = SOSMessageCopyDescription(message));
154 ok(SOSCircleHandlePeerMessage(aliceCircle, alice_full_peer_info, aliceDsf, enqueueMessage, bob_peer_id, message, &error),
155 "Alice accepted message: %@", error);
156 CFReleaseNull(message);
157 CFReleaseNull(desc);
158
159 ok(message = dequeueMessage(), "we got a reply from Alice %@", desc = SOSMessageCopyDescription(message));
160 ok(SOSCircleHandlePeerMessage(bobCircle, bob_full_peer_info, bobDsf, enqueueMessage, alice_peer_id, message, &error),
161 "Bob accepted message: %@", error);
162 CFReleaseNull(message);
163 CFReleaseNull(desc);
164 #endif
165
166 #if 0
167 message = dequeueMessage();
168 ok(NULL == message, "we got no message from Bob %@", desc = SOSMessageCopyDescription(message));
169
170 SOSObjectRef object = SOSDataSourceCreateGenericItem(aliceDs, CFSTR("75_circle_engine_account"), CFSTR("test service"));
171 ok(SOSTestDataSourceAddObject(aliceDs, object, &error), "add empty object to datasource: %@", error);
172 CFReleaseNull(error);
173 CFReleaseNull(object);
174
175 ok(SOSCircleSyncWithPeer(alice_full_peer_info, aliceCircle, aliceDsf, enqueueMessage, bob_peer_id, &error), "Restart sync [error %@]", error);
176 CFReleaseNull(error);
177
178 ok(message = dequeueMessage(), "Alice started again %@", desc = SOSMessageCopyDescription(message));
179 is(SOSCircleHandlePeerMessage(bobCircle, bob_full_peer_info, bobDsf, enqueueMessage, alice_peer_id, message, &error), true,
180 "bob accepted %@: %@", SOSMessageCopyDescription(message), error);
181 CFReleaseNull(error);
182 CFReleaseNull(message);
183 #endif
184
185 #if 1
186 bool alice = true;
187 int max_loops = 50;
188 while (max_loops-- && NULL != (message = dequeueMessage())) {
189 if (alice) {
190 ok(SOSCircleHandlePeerMessage(aliceCircle, alice_full_peer_info, aliceDsf, enqueueMessage, bob_peer_id, message, &error),
191 "alice accepted %@: %@", desc = SOSMessageCopyDescription(message), error);
192 } else {
193 ok(SOSCircleHandlePeerMessage(bobCircle, bob_full_peer_info, bobDsf, enqueueMessage, alice_peer_id, message, &error),
194 "bob accepted %@: %@", desc = SOSMessageCopyDescription(message), error);
195 }
196 alice = !alice;
197 CFRelease(message);
198 CFReleaseNull(desc);
199 }
200 #endif
201
202 CFReleaseNull(aliceCircle);
203 CFReleaseNull(bobCircle);
204
205 CFReleaseNull(alice_peer_info);
206 CFReleaseNull(bob_peer_info);
207
208 CFReleaseNull(alice_key);
209 CFReleaseNull(bob_key);
210 aliceDsf->release(aliceDsf);
211 bobDsf->release(bobDsf);
212 }
213
214 // MARK: ----- start of all tests -----
215
216 int sc_75_circle_engine(int argc, char *const *argv)
217 {
218 plan_tests(kTestTestCount);
219
220 tests();
221
222 return 0;
223 }