2 * Copyright (c) 2012-2014 Apple Inc. All Rights Reserved.
4 * @APPLE_LICENSE_HEADER_START@
6 * This file contains Original Code and/or Modifications of Original Code
7 * as defined in and that are subject to the Apple Public Source License
8 * Version 2.0 (the 'License'). You may not use this file except in
9 * compliance with the License. Please obtain a copy of the License at
10 * http://www.opensource.apple.com/apsl/ and read it before using this
13 * The Original Code and all software distributed under the License are
14 * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
15 * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
16 * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
17 * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.
18 * Please see the License for the specific language governing rights and
19 * limitations under the License.
21 * @APPLE_LICENSE_HEADER_END@
29 #include <AssertMacros.h>
30 #include <Security/SecureObjectSync/SOSCloudCircle.h>
31 #include <Security/SecureObjectSync/SOSCloudCircleInternal.h>
32 #include <Security/SecureObjectSync/SOSCircle.h>
33 #include <Security/SecureObjectSync/SOSAccount.h>
34 #include <Security/SecureObjectSync/SOSAccountPriv.h>
35 #include <Security/SecureObjectSync/SOSFullPeerInfo.h>
36 #include <Security/SecureObjectSync/SOSPeerInfoCollections.h>
37 #include <Security/SecureObjectSync/SOSInternal.h>
38 #include <Security/SecureObjectSync/SOSRing.h>
39 #include <Security/SecureObjectSync/SOSBackupSliceKeyBag.h>
41 #include <Security/SecKeyPriv.h>
42 #include <Security/SecFramework.h>
43 #include <CoreFoundation/CFXPCBridge.h>
45 #include <securityd/SecItemServer.h>
47 #include <utilities/SecDispatchRelease.h>
48 #include <utilities/SecCFRelease.h>
49 #include <utilities/SecCFWrappers.h>
50 #include <utilities/SecXPCError.h>
52 #include <utilities/debugging.h>
54 #include <CoreFoundation/CoreFoundation.h>
57 #define MINIMIZE_INCLUDES MINIMIZE_INCLUDES
58 #include <ipc/securityd_client.h>
59 #include <securityd/spi.h>
61 #include <Security/SecuritydXPC.h>
62 #include "SOSPeerInfoDER.h"
64 const char * kSOSCCCircleChangedNotification
= "com.apple.security.secureobjectsync.circlechanged";
65 const char * kSOSCCViewMembershipChangedNotification
= "com.apple.security.secureobjectsync.viewschanged";
66 const char * kSOSCCInitialSyncChangedNotification
= "com.apple.security.secureobjectsync.initialsyncchanged";
67 const char * kSOSCCHoldLockForInitialSync
= "com.apple.security.secureobjectsync.holdlock";
68 const char * kSOSCCPeerAvailable
= "com.apple.security.secureobjectsync.peeravailable";
69 const char * kSOSCCRecoveryKeyChanged
= "com.apple.security.secureobjectsync.recoverykeychanged";
70 const CFStringRef kSOSErrorDomain
= CFSTR("com.apple.security.sos.error");
72 #define do_if_registered(sdp, ...) if (gSecurityd && gSecurityd->sdp) { return gSecurityd->sdp(__VA_ARGS__); }
74 static bool xpc_dictionary_entry_is_type(xpc_object_t dictionary
, const char *key
, xpc_type_t type
)
76 xpc_object_t value
= xpc_dictionary_get_value(dictionary
, key
);
78 return value
&& (xpc_get_type(value
) == type
);
81 SOSCCStatus
SOSCCThisDeviceIsInCircle(CFErrorRef
*error
)
83 sec_trace_enter_api(NULL
);
84 sec_trace_return_api(SOSCCStatus
, ^{
85 SOSCCStatus result
= kSOSCCError
;
87 do_if_registered(soscc_ThisDeviceIsInCircle
, error
);
89 xpc_object_t message
= securityd_create_message(kSecXPCOpDeviceInCircle
, error
);
91 xpc_object_t response
= securityd_message_with_reply_sync(message
, error
);
93 if (response
&& xpc_dictionary_entry_is_type(response
, kSecXPCKeyResult
, XPC_TYPE_INT64
)) {
94 result
= (SOSCCStatus
) xpc_dictionary_get_int64(response
, kSecXPCKeyResult
);
100 if (response
&& securityd_message_no_error(response
, error
))
102 char *desc
= xpc_copy_description(response
);
103 SecCFCreateErrorWithFormat(0, sSecXPCErrorDomain
, NULL
, error
, NULL
, CFSTR("Remote error occurred/no info: %s"), desc
);
108 xpc_release(response
);
110 xpc_release(message
);
115 }, CFSTR("SOSCCStatus=%d"))
118 static bool cfstring_to_error_request(enum SecXPCOperation op
, CFStringRef string
, CFErrorRef
* error
)
120 __block
bool result
= false;
122 secdebug("sosops","enter - operation: %d", op
);
123 securityd_send_sync_and_do(op
, error
, ^bool(xpc_object_t message
, CFErrorRef
*error
) {
124 xpc_object_t xString
= _CFXPCCreateXPCObjectFromCFObject(string
);
125 bool success
= false;
127 xpc_dictionary_set_value(message
, kSecXPCKeyString
, xString
);
129 xpc_release(xString
);
132 }, ^bool(xpc_object_t response
, __unused CFErrorRef
*error
) {
133 result
= xpc_dictionary_get_bool(response
, kSecXPCKeyResult
);
139 static bool deviceid_to_bool_error_request(enum SecXPCOperation op
,
143 __block
bool result
= false;
145 securityd_send_sync_and_do(op
, error
, ^bool(xpc_object_t message
, CFErrorRef
*error
) {
146 CFStringPerformWithCString(IDS
, ^(const char *utf8Str
) {
147 xpc_dictionary_set_string(message
, kSecXPCKeyDeviceID
, utf8Str
);
150 }, ^bool(xpc_object_t response
, CFErrorRef
*error
) {
151 result
= xpc_dictionary_get_bool(response
, kSecXPCKeyResult
);
158 static SOSRingStatus
cfstring_to_uint64_request(enum SecXPCOperation op
, CFStringRef string
, CFErrorRef
* error
)
160 __block
bool result
= false;
162 secdebug("sosops","enter - operation: %d", op
);
163 securityd_send_sync_and_do(op
, error
, ^bool(xpc_object_t message
, CFErrorRef
*error
) {
164 xpc_object_t xString
= _CFXPCCreateXPCObjectFromCFObject(string
);
165 bool success
= false;
167 xpc_dictionary_set_value(message
, kSecXPCKeyString
, xString
);
169 xpc_release(xString
);
172 }, ^bool(xpc_object_t response
, __unused CFErrorRef
*error
) {
173 result
= xpc_dictionary_get_int64(response
, kSecXPCKeyResult
);
179 static CFStringRef
simple_cfstring_error_request(enum SecXPCOperation op
, CFErrorRef
* error
)
181 __block CFStringRef result
= NULL
;
183 secdebug("sosops","enter - operation: %d", op
);
184 securityd_send_sync_and_do(op
, error
, NULL
, ^bool(xpc_object_t response
, __unused CFErrorRef
*error
) {
185 const char *c_string
= xpc_dictionary_get_string(response
, kSecXPCKeyResult
);
188 result
= CFStringCreateWithBytes(kCFAllocatorDefault
, (const UInt8
*)c_string
, strlen(c_string
), kCFStringEncodingUTF8
, false);
191 return c_string
!= NULL
;
196 static bool simple_bool_error_request(enum SecXPCOperation op
, CFErrorRef
* error
)
198 __block
bool result
= false;
200 secdebug("sosops","enter - operation: %d", op
);
201 securityd_send_sync_and_do(op
, error
, NULL
, ^bool(xpc_object_t response
, __unused CFErrorRef
*error
) {
202 result
= xpc_dictionary_get_bool(response
, kSecXPCKeyResult
);
208 static bool SecXPCDictionarySetPeerInfoData(xpc_object_t message
, const char *key
, SOSPeerInfoRef peerInfo
, CFErrorRef
*error
) {
209 bool success
= false;
210 CFDataRef peerData
= SOSPeerInfoCopyEncodedData(peerInfo
, kCFAllocatorDefault
, error
);
212 success
= SecXPCDictionarySetData(message
, key
, peerData
, error
);
214 CFReleaseNull(peerData
);
218 static bool peer_info_to_bool_error_request(enum SecXPCOperation op
, SOSPeerInfoRef peerInfo
, CFErrorRef
* error
)
220 __block
bool result
= false;
222 secdebug("sosops","enter - operation: %d", op
);
223 securityd_send_sync_and_do(op
, error
, ^bool(xpc_object_t message
, CFErrorRef
*error
) {
224 return SecXPCDictionarySetPeerInfoData(message
, kSecXPCKeyPeerInfo
, peerInfo
, error
);
225 }, ^bool(xpc_object_t response
, __unused CFErrorRef
*error
) {
226 result
= xpc_dictionary_get_bool(response
, kSecXPCKeyResult
);
232 static CFBooleanRef
cfarray_to_cfboolean_error_request(enum SecXPCOperation op
, CFArrayRef views
, CFErrorRef
* error
)
234 __block
bool result
= false;
236 secdebug("sosops","enter - operation: %d", op
);
237 bool noError
= securityd_send_sync_and_do(op
, error
, ^bool(xpc_object_t message
, CFErrorRef
*error
) {
238 return SecXPCDictionarySetPList(message
, kSecXPCKeyArray
, views
, error
);
239 }, ^bool(xpc_object_t response
, __unused CFErrorRef
*error
) {
240 result
= xpc_dictionary_get_bool(response
, kSecXPCKeyResult
);
243 return noError
? (result
? kCFBooleanTrue
: kCFBooleanFalse
) : NULL
;
247 static CFSetRef
cfset_cfset_to_cfset_error_request(enum SecXPCOperation op
, CFSetRef set1
, CFSetRef set2
, CFErrorRef
* error
)
249 __block CFSetRef result
= NULL
;
251 secdebug("sosops","enter - operation: %d", op
);
252 bool noError
= securityd_send_sync_and_do(op
, error
, ^bool(xpc_object_t message
, CFErrorRef
*error
) {
253 return SecXPCDictionarySetPList(message
, kSecXPCKeySet
, set1
, error
) && SecXPCDictionarySetPList(message
, kSecXPCKeySet2
, set2
, error
);
254 }, ^bool(xpc_object_t response
, __unused CFErrorRef
*error
) {
255 result
= SecXPCDictionaryCopySet(response
, kSecXPCKeyResult
, error
);
260 CFReleaseNull(result
);
266 static bool escrow_to_bool_error_request(enum SecXPCOperation op
, CFStringRef escrow_label
, uint64_t tries
, CFErrorRef
* error
)
268 __block
bool result
= false;
270 securityd_send_sync_and_do(op
, error
, ^bool(xpc_object_t message
, CFErrorRef
*error
) {
272 bool success
= false;
273 xpc_object_t xEscrowLabel
= _CFXPCCreateXPCObjectFromCFObject(escrow_label
);
275 xpc_dictionary_set_value(message
, kSecXPCKeyEscrowLabel
, xEscrowLabel
);
277 xpc_release(xEscrowLabel
);
280 xpc_dictionary_set_int64(message
, kSecXPCKeyTriesLabel
, tries
);
285 }, ^bool(xpc_object_t response
, __unused CFErrorRef
*error
) {
286 result
= xpc_dictionary_get_bool(response
, kSecXPCKeyResult
);
292 static CF_RETURNS_RETAINED CFArrayRef
simple_array_error_request(enum SecXPCOperation op
, CFErrorRef
* error
)
294 __block CFArrayRef result
= NULL
;
296 secdebug("sosops","enter - operation: %d", op
);
297 if (securityd_send_sync_and_do(op
, error
, NULL
, ^bool(xpc_object_t response
, CFErrorRef
*error
) {
298 xpc_object_t temp_result
= xpc_dictionary_get_value(response
, kSecXPCKeyResult
);
299 result
= _CFXPCCreateCFObjectFromXPCObject(temp_result
);
300 return result
!= NULL
;
302 if (!isArray(result
)) {
303 SOSErrorCreate(kSOSErrorUnexpectedType
, error
, NULL
, CFSTR("Expected array, got: %@"), result
);
304 CFReleaseNull(result
);
310 static CF_RETURNS_RETAINED CFArrayRef
der_array_error_request(enum SecXPCOperation op
, CFErrorRef
* error
)
312 __block CFArrayRef result
= NULL
;
314 secdebug("sosops","enter - operation: %d", op
);
315 if (securityd_send_sync_and_do(op
, error
, NULL
, ^bool(xpc_object_t response
, CFErrorRef
*error
) {
317 const uint8_t* bytes
= xpc_dictionary_get_data(response
, kSecXPCKeyResult
, &length
);
318 der_decode_plist(kCFAllocatorDefault
, 0, (CFPropertyListRef
*) &result
, error
, bytes
, bytes
+ length
);
320 return result
!= NULL
;
322 if (!isArray(result
)) {
323 SOSErrorCreate(kSOSErrorUnexpectedType
, error
, NULL
, CFSTR("Expected array, got: %@"), result
);
324 CFReleaseNull(result
);
330 static CFDictionaryRef
strings_to_dictionary_error_request(enum SecXPCOperation op
, CFErrorRef
* error
)
332 __block CFDictionaryRef result
= NULL
;
334 secdebug("sosops","enter - operation: %d", op
);
336 if (securityd_send_sync_and_do(op
, error
, NULL
, ^bool(xpc_object_t response
, CFErrorRef
*error
) {
337 xpc_object_t temp_result
= xpc_dictionary_get_value(response
, kSecXPCKeyResult
);
339 result
= _CFXPCCreateCFObjectFromXPCObject(temp_result
);
340 return result
!= NULL
;
343 if (!isDictionary(result
)) {
344 SOSErrorCreate(kSOSErrorUnexpectedType
, error
, NULL
, CFSTR("Expected dictionary, got: %@"), result
);
345 CFReleaseNull(result
);
352 static int simple_int_error_request(enum SecXPCOperation op
, CFErrorRef
* error
)
354 __block
int result
= 0;
356 secdebug("sosops","enter - operation: %d", op
);
357 securityd_send_sync_and_do(op
, error
, NULL
, ^bool(xpc_object_t response
, __unused CFErrorRef
*error
) {
358 int64_t temp_result
= xpc_dictionary_get_int64(response
, kSecXPCKeyResult
);
359 if ((temp_result
>= INT32_MIN
) && (temp_result
<= INT32_MAX
)) {
360 result
= (int)temp_result
;
367 static SOSPeerInfoRef
peer_info_error_request(enum SecXPCOperation op
, CFErrorRef
* error
)
369 SOSPeerInfoRef result
= NULL
;
370 __block CFDataRef data
= NULL
;
372 secdebug("sosops","enter - operation: %d", op
);
373 securityd_send_sync_and_do(op
, error
, NULL
, ^bool(xpc_object_t response
, CFErrorRef
*error
) {
374 xpc_object_t temp_result
= xpc_dictionary_get_value(response
, kSecXPCKeyResult
);
375 if (response
&& (NULL
!= temp_result
)) {
376 data
= _CFXPCCreateCFObjectFromXPCObject(temp_result
);
382 SOSErrorCreate(kSOSErrorUnexpectedType
, error
, NULL
, CFSTR("Expected CFData, got: %@"), result
);
386 result
= SOSPeerInfoCreateFromData(kCFAllocatorDefault
, error
, data
);
392 static CFDataRef
data_to_error_request(enum SecXPCOperation op
, CFErrorRef
*error
)
394 __block CFDataRef result
= NULL
;
396 secdebug("sosops", "enter -- operation: %d", op
);
397 securityd_send_sync_and_do(op
, error
, NULL
, ^bool(xpc_object_t response
, CFErrorRef
*error
) {
398 xpc_object_t temp_result
= xpc_dictionary_get_value(response
, kSecXPCKeyResult
);
399 if (response
&& (NULL
!= temp_result
)) {
400 result
= _CFXPCCreateCFObjectFromXPCObject(temp_result
);
402 return result
!= NULL
;
405 if (!isData(result
)) {
406 SOSErrorCreate(kSOSErrorUnexpectedType
, error
, NULL
, CFSTR("Expected CFData, got: %@"), result
);
413 static CFArrayRef
array_of_info_error_request(enum SecXPCOperation op
, CFErrorRef
* error
)
415 __block CFArrayRef result
= NULL
;
417 secdebug("sosops","enter - operation: %d", op
);
418 securityd_send_sync_and_do(op
, error
, NULL
, ^bool(xpc_object_t response
, CFErrorRef
*error
) {
419 xpc_object_t encoded_array
= xpc_dictionary_get_value(response
, kSecXPCKeyResult
);
420 if (response
&& (NULL
!= encoded_array
)) {
421 result
= CreateArrayOfPeerInfoWithXPCObject(encoded_array
, error
);
423 return result
!= NULL
;
426 if (!isArray(result
)) {
427 SOSErrorCreate(kSOSErrorUnexpectedType
, error
, NULL
, CFSTR("Expected array, got: %@"), result
);
428 CFReleaseNull(result
);
433 static CF_RETURNS_RETAINED SOSPeerInfoRef
data_to_peer_info_error_request(enum SecXPCOperation op
, CFDataRef secret
, CFErrorRef
* error
)
435 __block SOSPeerInfoRef result
= false;
436 __block CFDataRef data
= NULL
;
438 secdebug("sosops", "enter - operation: %d", op
);
439 securityd_send_sync_and_do(op
, error
, ^bool(xpc_object_t message
, CFErrorRef
*error
) {
440 xpc_object_t xsecretData
= _CFXPCCreateXPCObjectFromCFObject(secret
);
441 bool success
= false;
443 xpc_dictionary_set_value(message
, kSecXPCKeyNewPublicBackupKey
, xsecretData
);
445 xpc_release(xsecretData
);
448 }, ^bool(xpc_object_t response
, __unused CFErrorRef
*error
) {
449 xpc_object_t temp_result
= xpc_dictionary_get_value(response
, kSecXPCKeyResult
);
450 if (response
&& (NULL
!= temp_result
)) {
451 data
= _CFXPCCreateCFObjectFromXPCObject(temp_result
);
453 return result
!= NULL
;
457 SOSErrorCreate(kSOSErrorUnexpectedType
, error
, NULL
, CFSTR("Expected CFData, got: %@"), result
);
461 result
= SOSPeerInfoCreateFromData(kCFAllocatorDefault
, error
, data
);
467 static bool keybag_and_bool_to_bool_error_request(enum SecXPCOperation op
, CFDataRef data
, bool include
, CFErrorRef
* error
)
469 secdebug("sosops", "enter - operation: %d", op
);
470 return securityd_send_sync_and_do(op
, error
, ^bool(xpc_object_t message
, CFErrorRef
*error
) {
471 xpc_object_t xData
= _CFXPCCreateXPCObjectFromCFObject(data
);
472 bool success
= false;
474 xpc_dictionary_set_value(message
, kSecXPCKeyKeybag
, xData
);
478 xpc_dictionary_set_bool(message
, kSecXPCKeyIncludeV0
, include
);
480 }, ^bool(xpc_object_t response
, __unused CFErrorRef
*error
) {
481 return xpc_dictionary_get_bool(response
, kSecXPCKeyResult
);
485 static bool recovery_and_bool_to_bool_error_request(enum SecXPCOperation op
, CFDataRef data
, CFErrorRef
* error
)
487 secdebug("sosops", "enter - operation: %d", op
);
488 return securityd_send_sync_and_do(op
, error
, ^bool(xpc_object_t message
, CFErrorRef
*error
) {
489 xpc_object_t xData
= _CFXPCCreateXPCObjectFromCFObject(data
);
490 bool success
= false;
492 xpc_dictionary_set_value(message
, kSecXPCKeyRecoveryPublicKey
, xData
);
497 }, ^bool(xpc_object_t response
, __unused CFErrorRef
*error
) {
498 return xpc_dictionary_get_bool(response
, kSecXPCKeyResult
);
502 static bool info_array_to_bool_error_request(enum SecXPCOperation op
, CFArrayRef peer_infos
, CFErrorRef
* error
)
504 __block
bool result
= false;
506 secdebug("sosops", "enter - operation: %d", op
);
507 securityd_send_sync_and_do(op
, error
, ^bool(xpc_object_t message
, CFErrorRef
*error
) {
508 xpc_object_t encoded_peers
= CreateXPCObjectWithArrayOfPeerInfo(peer_infos
, error
);
510 xpc_dictionary_set_value(message
, kSecXPCKeyPeerInfoArray
, encoded_peers
);
511 return encoded_peers
!= NULL
;
512 }, ^bool(xpc_object_t response
, __unused CFErrorRef
*error
) {
513 result
= xpc_dictionary_get_bool(response
, kSecXPCKeyResult
);
519 static bool uint64_t_to_bool_error_request(enum SecXPCOperation op
,
523 __block
bool result
= false;
525 securityd_send_sync_and_do(op
, error
, ^bool(xpc_object_t message
, CFErrorRef
*error
) {
526 xpc_dictionary_set_uint64(message
, kSecXPCLimitInMinutes
, number
);
528 }, ^bool(xpc_object_t response
, __unused CFErrorRef
*error
) {
529 result
= xpc_dictionary_get_bool(response
, kSecXPCKeyResult
);
536 static bool cfstring_and_cfdata_to_cfdata_cfdata_error_request(enum SecXPCOperation op
, CFStringRef viewName
, CFDataRef input
, CFDataRef
* data
, CFDataRef
* data2
, CFErrorRef
* error
) {
537 secdebug("sosops", "enter - operation: %d", op
);
538 __block
bool result
= false;
539 securityd_send_sync_and_do(op
, error
, ^bool(xpc_object_t message
, CFErrorRef
*error
) {
540 xpc_object_t xviewname
= _CFXPCCreateXPCObjectFromCFObject(viewName
);
541 xpc_object_t xinput
= _CFXPCCreateXPCObjectFromCFObject(input
);
542 bool success
= false;
543 if (xviewname
&& xinput
){
544 xpc_dictionary_set_value(message
, kSecXPCKeyViewName
, xviewname
);
545 xpc_dictionary_set_value(message
, kSecXPCData
, xinput
);
547 xpc_release(xviewname
);
551 }, ^bool(xpc_object_t response
, __unused CFErrorRef
*error
) {
552 result
= xpc_dictionary_get_bool(response
, kSecXPCKeyResult
);
554 xpc_object_t temp_result
= xpc_dictionary_get_value(response
, kSecXPCData
);
555 if (response
&& (NULL
!= temp_result
) && data
) {
556 *data
= _CFXPCCreateCFObjectFromXPCObject(temp_result
);
558 temp_result
= xpc_dictionary_get_value(response
, kSecXPCKeyKeybag
);
559 if (response
&& (NULL
!= temp_result
) && data2
) {
560 *data2
= _CFXPCCreateCFObjectFromXPCObject(temp_result
);
566 if (data
&&!isData(*data
)) {
567 SOSErrorCreate(kSOSErrorUnexpectedType
, error
, NULL
, CFSTR("Expected CFData, got: %@"), *data
);
569 if (data2
&&!isData(*data2
)) {
570 SOSErrorCreate(kSOSErrorUnexpectedType
, error
, NULL
, CFSTR("Expected CFData, got: %@"), *data2
);
576 static bool set_hsa2_autoaccept_error_request(enum SecXPCOperation op
, CFDataRef pubKey
, CFErrorRef
*error
)
578 __block
bool result
= false;
580 sec_trace_enter_api(NULL
);
581 securityd_send_sync_and_do(op
, error
, ^(xpc_object_t message
,
583 xpc_object_t xpubkey
= _CFXPCCreateXPCObjectFromCFObject(pubKey
);
584 bool success
= false;
586 xpc_dictionary_set_value(message
,
587 kSecXPCKeyHSA2AutoAcceptInfo
, xpubkey
);
589 xpc_release(xpubkey
);
593 }, ^(xpc_object_t response
, __unused CFErrorRef
*error
) {
594 result
= xpc_dictionary_get_bool(response
, kSecXPCKeyResult
);
603 static bool cfdata_error_request_returns_bool(enum SecXPCOperation op
, CFDataRef thedata
, CFErrorRef
*error
) {
604 __block
bool result
= false;
606 sec_trace_enter_api(NULL
);
607 securityd_send_sync_and_do(op
, error
, ^(xpc_object_t message
, CFErrorRef
*error
) {
608 xpc_object_t xdata
= _CFXPCCreateXPCObjectFromCFObject(thedata
);
609 bool success
= false;
611 xpc_dictionary_set_value(message
, kSecXPCData
, xdata
);
617 }, ^(xpc_object_t response
, __unused CFErrorRef
*error
) {
618 result
= xpc_dictionary_get_bool(response
, kSecXPCKeyResult
);
626 static CFDataRef
cfdata_error_request_returns_cfdata(enum SecXPCOperation op
, CFDataRef thedata
, CFErrorRef
*error
) {
627 __block CFDataRef result
= NULL
;
629 sec_trace_enter_api(NULL
);
630 securityd_send_sync_and_do(op
, error
, ^(xpc_object_t message
, CFErrorRef
*error
) {
631 xpc_object_t xdata
= _CFXPCCreateXPCObjectFromCFObject(thedata
);
632 bool success
= false;
634 xpc_dictionary_set_value(message
, kSecXPCData
, xdata
);
639 }, ^(xpc_object_t response
, __unused CFErrorRef
*error
) {
640 xpc_object_t temp_result
= xpc_dictionary_get_value(response
, kSecXPCKeyResult
);
641 if (response
&& (NULL
!= temp_result
)) {
642 CFTypeRef object
= _CFXPCCreateCFObjectFromXPCObject(temp_result
);
643 result
= copyIfData(object
, error
);
644 CFReleaseNull(object
);
646 return (bool) (result
!= NULL
);
652 bool SOSCCRequestToJoinCircle(CFErrorRef
* error
)
654 sec_trace_enter_api(NULL
);
655 sec_trace_return_bool_api(^{
656 do_if_registered(soscc_RequestToJoinCircle
, error
);
658 return simple_bool_error_request(kSecXPCOpRequestToJoin
, error
);
662 bool SOSCCRequestToJoinCircleAfterRestore(CFErrorRef
* error
)
664 sec_trace_enter_api(NULL
);
665 sec_trace_return_bool_api(^{
666 do_if_registered(soscc_RequestToJoinCircleAfterRestore
, error
);
668 return simple_bool_error_request(kSecXPCOpRequestToJoinAfterRestore
, error
);
672 bool SOSCCAccountHasPublicKey(CFErrorRef
*error
)
675 sec_trace_enter_api(NULL
);
676 sec_trace_return_bool_api(^{
677 do_if_registered(soscc_AccountHasPublicKey
, error
);
679 return simple_bool_error_request(kSecXPCOpAccountHasPublicKey
, error
);
684 bool SOSCCAccountIsNew(CFErrorRef
*error
)
686 sec_trace_enter_api(NULL
);
687 sec_trace_return_bool_api(^{
688 do_if_registered(soscc_AccountIsNew
, error
);
690 return simple_bool_error_request(kSecXPCOpAccountIsNew
, error
);
694 bool SOSCCWaitForInitialSync(CFErrorRef
* error
)
696 sec_trace_enter_api(NULL
);
697 sec_trace_return_bool_api(^{
698 do_if_registered(soscc_WaitForInitialSync
, error
);
700 return simple_bool_error_request(kSecXPCOpWaitForInitialSync
, error
);
704 CFArrayRef
SOSCCCopyYetToSyncViewsList(CFErrorRef
* error
)
706 sec_trace_enter_api(NULL
);
707 sec_trace_return_api(CFArrayRef
, ^{
708 do_if_registered(soscc_CopyYetToSyncViewsList
, error
);
710 return simple_array_error_request(kSecXPCOpCopyYetToSyncViews
, error
);
714 bool SOSCCRequestEnsureFreshParameters(CFErrorRef
* error
)
716 sec_trace_enter_api(NULL
);
717 sec_trace_return_bool_api(^{
718 do_if_registered(soscc_RequestEnsureFreshParameters
, error
);
720 return simple_bool_error_request(kSecXPCOpRequestEnsureFreshParameters
, error
);
724 CFStringRef
SOSCCGetAllTheRings(CFErrorRef
*error
){
725 sec_trace_enter_api(NULL
);
726 sec_trace_return_api(CFStringRef
, ^{
727 do_if_registered(soscc_GetAllTheRings
, error
);
730 return simple_cfstring_error_request(kSecXPCOpGetAllTheRings
, error
);
733 bool SOSCCApplyToARing(CFStringRef ringName
, CFErrorRef
* error
)
735 sec_trace_enter_api(NULL
);
736 sec_trace_return_bool_api(^{
737 do_if_registered(soscc_ApplyToARing
, ringName
, error
);
739 return cfstring_to_error_request(kSecXPCOpApplyToARing
, ringName
, error
);
743 bool SOSCCWithdrawlFromARing(CFStringRef ringName
, CFErrorRef
* error
)
745 sec_trace_enter_api(NULL
);
746 sec_trace_return_bool_api(^{
747 do_if_registered(soscc_WithdrawlFromARing
, ringName
, error
);
749 return cfstring_to_error_request(kSecXPCOpWithdrawlFromARing
, ringName
, error
);
753 SOSRingStatus
SOSCCRingStatus(CFStringRef ringName
, CFErrorRef
* error
)
755 sec_trace_enter_api(NULL
);
756 sec_trace_return_api(SOSRingStatus
, ^{
757 do_if_registered(soscc_RingStatus
, ringName
, error
);
759 return cfstring_to_uint64_request(kSecXPCOpRingStatus
, ringName
, error
);
760 }, CFSTR("SOSCCStatus=%d"))
763 bool SOSCCEnableRing(CFStringRef ringName
, CFErrorRef
* error
)
765 sec_trace_enter_api(NULL
);
766 sec_trace_return_bool_api(^{
767 do_if_registered(soscc_EnableRing
, ringName
, error
);
769 return cfstring_to_error_request(kSecXPCOpEnableRing
, ringName
, error
);
773 bool SOSCCAccountSetToNew(CFErrorRef
*error
)
775 secwarning("SOSCCAccountSetToNew called");
776 sec_trace_enter_api(NULL
);
777 sec_trace_return_bool_api(^{
778 do_if_registered(soscc_SetToNew
, error
);
779 return simple_bool_error_request(kSecXPCOpAccountSetToNew
, error
);
783 bool SOSCCResetToOffering(CFErrorRef
* error
)
785 secwarning("SOSCCResetToOffering called");
786 sec_trace_enter_api(NULL
);
787 sec_trace_return_bool_api(^{
788 do_if_registered(soscc_ResetToOffering
, error
);
790 return simple_bool_error_request(kSecXPCOpResetToOffering
, error
);
794 bool SOSCCResetToEmpty(CFErrorRef
* error
)
796 secwarning("SOSCCResetToEmpty called");
797 sec_trace_enter_api(NULL
);
798 sec_trace_return_bool_api(^{
799 do_if_registered(soscc_ResetToEmpty
, error
);
801 return simple_bool_error_request(kSecXPCOpResetToEmpty
, error
);
805 bool SOSCCRemovePeersFromCircle(CFArrayRef peers
, CFErrorRef
* error
)
807 sec_trace_enter_api(NULL
);
808 sec_trace_return_bool_api(^{
809 do_if_registered(soscc_RemovePeersFromCircle
, peers
, error
);
811 return info_array_to_bool_error_request(kSecXPCOpRemovePeersFromCircle
, peers
, error
);
815 bool SOSCCRemoveThisDeviceFromCircle(CFErrorRef
* error
)
817 sec_trace_enter_api(NULL
);
818 sec_trace_return_bool_api(^{
819 do_if_registered(soscc_RemoveThisDeviceFromCircle
, error
);
821 return simple_bool_error_request(kSecXPCOpRemoveThisDeviceFromCircle
, error
);
825 bool SOSCCLoggedOutOfAccount(CFErrorRef
* error
)
827 sec_trace_enter_api(NULL
);
828 sec_trace_return_bool_api(^{
829 do_if_registered(soscc_LoggedOutOfAccount
, error
);
831 return simple_bool_error_request(kSecXPCOpLoggedOutOfAccount
, error
);
835 bool SOSCCBailFromCircle_BestEffort(uint64_t limit_in_seconds
, CFErrorRef
* error
)
837 sec_trace_enter_api(NULL
);
838 sec_trace_return_bool_api(^{
839 do_if_registered(soscc_BailFromCircle
, limit_in_seconds
, error
);
841 return uint64_t_to_bool_error_request(kSecXPCOpBailFromCircle
, limit_in_seconds
, error
);
845 bool SOSCCSignedOut(bool immediate
, CFErrorRef
* error
)
847 uint64_t limit
= strtoul(optarg
, NULL
, 10);
850 return SOSCCRemoveThisDeviceFromCircle(error
);
852 return SOSCCBailFromCircle_BestEffort(limit
, error
);
856 CFArrayRef
SOSCCCopyPeerPeerInfo(CFErrorRef
* error
)
858 sec_trace_enter_api(NULL
);
859 sec_trace_return_api(CFArrayRef
, ^{
860 do_if_registered(soscc_CopyPeerInfo
, error
);
862 return array_of_info_error_request(kSecXPCOpCopyPeerPeerInfo
, error
);
863 }, CFSTR("return=%@"));
866 bool SOSCCSetAutoAcceptInfo(CFDataRef autoaccept
, CFErrorRef
*error
)
868 sec_trace_return_bool_api(^{
869 do_if_registered(soscc_SetHSA2AutoAcceptInfo
, autoaccept
, error
);
871 return set_hsa2_autoaccept_error_request(kSecXPCOpSetHSA2AutoAcceptInfo
, autoaccept
, error
);
875 CFArrayRef
SOSCCCopyConcurringPeerPeerInfo(CFErrorRef
* error
)
877 sec_trace_enter_api(NULL
);
878 sec_trace_return_api(CFArrayRef
, ^{
879 do_if_registered(soscc_CopyConcurringPeerInfo
, error
);
881 return array_of_info_error_request(kSecXPCOpCopyConcurringPeerPeerInfo
, error
);
882 }, CFSTR("return=%@"));
885 CFArrayRef
SOSCCCopyGenerationPeerInfo(CFErrorRef
* error
)
887 sec_trace_enter_api(NULL
);
888 sec_trace_return_api(CFArrayRef
, ^{
889 do_if_registered(soscc_CopyGenerationPeerInfo
, error
);
891 return simple_array_error_request(kSecXPCOpCopyGenerationPeerInfo
, error
);
892 }, CFSTR("return=%@"));
895 CFArrayRef
SOSCCCopyApplicantPeerInfo(CFErrorRef
* error
)
897 sec_trace_enter_api(NULL
);
898 sec_trace_return_api(CFArrayRef
, ^{
899 do_if_registered(soscc_CopyApplicantPeerInfo
, error
);
901 return array_of_info_error_request(kSecXPCOpCopyApplicantPeerInfo
, error
);
902 }, CFSTR("return=%@"));
905 bool SOSCCValidateUserPublic(CFErrorRef
* error
){
906 sec_trace_enter_api(NULL
);
907 sec_trace_return_api(bool, ^{
908 do_if_registered(soscc_ValidateUserPublic
, error
);
910 return simple_bool_error_request(kSecXPCOpValidateUserPublic
, error
);
914 CFArrayRef
SOSCCCopyValidPeerPeerInfo(CFErrorRef
* error
)
916 sec_trace_enter_api(NULL
);
917 sec_trace_return_api(CFArrayRef
, ^{
918 do_if_registered(soscc_CopyValidPeerPeerInfo
, error
);
920 return array_of_info_error_request(kSecXPCOpCopyValidPeerPeerInfo
, error
);
921 }, CFSTR("return=%@"));
924 CFArrayRef
SOSCCCopyNotValidPeerPeerInfo(CFErrorRef
* error
)
926 sec_trace_enter_api(NULL
);
927 sec_trace_return_api(CFArrayRef
, ^{
928 do_if_registered(soscc_CopyNotValidPeerPeerInfo
, error
);
930 return array_of_info_error_request(kSecXPCOpCopyNotValidPeerPeerInfo
, error
);
931 }, CFSTR("return=%@"));
934 CFArrayRef
SOSCCCopyRetirementPeerInfo(CFErrorRef
* error
)
936 sec_trace_enter_api(NULL
);
937 sec_trace_return_api(CFArrayRef
, ^{
938 do_if_registered(soscc_CopyRetirementPeerInfo
, error
);
940 return array_of_info_error_request(kSecXPCOpCopyRetirementPeerInfo
, error
);
941 }, CFSTR("return=%@"));
944 CFArrayRef
SOSCCCopyViewUnawarePeerInfo(CFErrorRef
* error
)
946 sec_trace_enter_api(NULL
);
947 sec_trace_return_api(CFArrayRef
, ^{
948 do_if_registered(soscc_CopyViewUnawarePeerInfo
, error
);
950 return array_of_info_error_request(kSecXPCOpCopyViewUnawarePeerInfo
, error
);
951 }, CFSTR("return=%@"));
954 CFDataRef
SOSCCCopyAccountState(CFErrorRef
* error
)
956 sec_trace_enter_api(NULL
);
957 sec_trace_return_api(CFDataRef
, ^{
958 do_if_registered(soscc_CopyAccountState
, error
);
960 return data_to_error_request(kSecXPCOpCopyAccountData
, error
);
961 }, CFSTR("return=%@"));
964 bool SOSCCDeleteAccountState(CFErrorRef
*error
)
966 sec_trace_enter_api(NULL
);
967 sec_trace_return_api(bool, ^{
968 do_if_registered(soscc_DeleteAccountState
, error
);
969 return simple_bool_error_request(kSecXPCOpDeleteAccountData
, error
);
972 CFDataRef
SOSCCCopyEngineData(CFErrorRef
* error
)
974 sec_trace_enter_api(NULL
);
975 sec_trace_return_api(CFDataRef
, ^{
976 do_if_registered(soscc_CopyEngineData
, error
);
978 return data_to_error_request(kSecXPCOpCopyEngineData
, error
);
979 }, CFSTR("return=%@"));
982 bool SOSCCDeleteEngineState(CFErrorRef
*error
)
984 sec_trace_enter_api(NULL
);
985 sec_trace_return_api(bool, ^{
986 do_if_registered(soscc_DeleteEngineState
, error
);
987 return simple_bool_error_request(kSecXPCOpDeleteEngineData
, error
);
991 SOSPeerInfoRef
SOSCCCopyMyPeerInfo(CFErrorRef
*error
)
993 sec_trace_enter_api(NULL
);
994 sec_trace_return_api(SOSPeerInfoRef
, ^{
995 do_if_registered(soscc_CopyMyPeerInfo
, error
);
997 return peer_info_error_request(kSecXPCOpCopyMyPeerInfo
, error
);
998 }, CFSTR("return=%@"));
1001 static CFArrayRef
SOSCCCopyEngineState(CFErrorRef
* error
)
1003 sec_trace_enter_api(NULL
);
1004 sec_trace_return_api(CFArrayRef
, ^{
1005 do_if_registered(soscc_CopyEngineState
, error
);
1007 return der_array_error_request(kSecXPCOpCopyEngineState
, error
);
1008 }, CFSTR("return=%@"));
1011 CFStringRef kSOSCCEngineStatePeerIDKey
= CFSTR("PeerID");
1012 CFStringRef kSOSCCEngineStateManifestCountKey
= CFSTR("ManifestCount");
1013 CFStringRef kSOSCCEngineStateSyncSetKey
= CFSTR("SyncSet");
1014 CFStringRef kSOSCCEngineStateCoderKey
= CFSTR("CoderDump");
1015 CFStringRef kSOSCCEngineStateManifestHashKey
= CFSTR("ManifestHash");
1017 void SOSCCForEachEngineStateAsStringFromArray(CFArrayRef states
, void (^block
)(CFStringRef oneStateString
)) {
1019 CFArrayForEach(states
, ^(const void *value
) {
1020 CFDictionaryRef dict
= asDictionary(value
, NULL
);
1022 CFMutableStringRef description
= CFStringCreateMutable(kCFAllocatorDefault
, 0);
1024 CFStringRef id
= asString(CFDictionaryGetValue(dict
, kSOSCCEngineStatePeerIDKey
), NULL
);
1027 CFStringAppendFormat(description
, NULL
, CFSTR("remote %@ "), id
);
1029 CFStringAppendFormat(description
, NULL
, CFSTR("local "));
1032 CFSetRef viewSet
= asSet(CFDictionaryGetValue(dict
, kSOSCCEngineStateSyncSetKey
), NULL
);
1034 CFStringSetPerformWithDescription(viewSet
, ^(CFStringRef setDescription
) {
1035 CFStringAppend(description
, setDescription
);
1038 CFStringAppendFormat(description
, NULL
, CFSTR("<Missing view set!>"));
1041 CFStringAppendFormat(description
, NULL
, CFSTR(" [%@]"),
1042 CFDictionaryGetValue(dict
, kSOSCCEngineStateManifestCountKey
));
1044 CFDataRef mainfestHash
= asData(CFDictionaryGetValue(dict
, kSOSCCEngineStateManifestHashKey
), NULL
);
1047 CFDataPerformWithHexString(mainfestHash
, ^(CFStringRef dataString
) {
1048 CFStringAppendFormat(description
, NULL
, CFSTR(" %@"), dataString
);
1052 CFStringRef coderDescription
= asString(CFDictionaryGetValue(dict
, kSOSCCEngineStateCoderKey
), NULL
);
1053 if (coderDescription
) {
1054 CFStringAppendFormat(description
, NULL
, CFSTR(" %@"), coderDescription
);
1059 CFReleaseNull(description
);
1064 bool SOSCCForEachEngineStateAsString(CFErrorRef
* error
, void (^block
)(CFStringRef oneStateString
)) {
1065 CFArrayRef states
= SOSCCCopyEngineState(error
);
1069 SOSCCForEachEngineStateAsStringFromArray(states
, block
);
1075 bool SOSCCAcceptApplicants(CFArrayRef applicants
, CFErrorRef
* error
)
1077 sec_trace_enter_api(NULL
);
1078 sec_trace_return_bool_api(^{
1079 do_if_registered(soscc_AcceptApplicants
, applicants
, error
);
1081 return info_array_to_bool_error_request(kSecXPCOpAcceptApplicants
, applicants
, error
);
1085 bool SOSCCRejectApplicants(CFArrayRef applicants
, CFErrorRef
*error
)
1087 sec_trace_enter_api(CFSTR("applicants=%@"), applicants
);
1088 sec_trace_return_bool_api(^{
1089 do_if_registered(soscc_RejectApplicants
, applicants
, error
);
1091 return info_array_to_bool_error_request(kSecXPCOpRejectApplicants
, applicants
, error
);
1095 static CF_RETURNS_RETAINED SOSPeerInfoRef
SOSSetNewPublicBackupKey(CFDataRef pubKey
, CFErrorRef
*error
)
1097 sec_trace_enter_api(NULL
);
1098 sec_trace_return_api(SOSPeerInfoRef
, ^{
1099 do_if_registered(soscc_SetNewPublicBackupKey
, pubKey
, error
);
1101 return data_to_peer_info_error_request(kSecXPCOpSetNewPublicBackupKey
, pubKey
, error
);
1102 }, CFSTR("return=%@"));
1105 SOSPeerInfoRef
SOSCCCopyMyPeerWithNewDeviceRecoverySecret(CFDataRef secret
, CFErrorRef
*error
){
1106 CFDataRef publicKeyData
= SOSCopyDeviceBackupPublicKey(secret
, error
);
1108 SOSPeerInfoRef copiedPeer
= publicKeyData
? SOSSetNewPublicBackupKey(publicKeyData
, error
) : NULL
;
1110 CFReleaseNull(publicKeyData
);
1115 bool SOSCCRegisterSingleRecoverySecret(CFDataRef aks_bag
, bool forV0Only
, CFErrorRef
*error
){
1116 sec_trace_enter_api(NULL
);
1117 sec_trace_return_bool_api(^{
1118 do_if_registered(soscc_RegisterSingleRecoverySecret
, aks_bag
, forV0Only
, error
);
1119 return keybag_and_bool_to_bool_error_request(kSecXPCOpSetBagForAllSlices
, aks_bag
, forV0Only
, error
);
1124 bool SOSCCRegisterRecoveryPublicKey(CFDataRef recovery_key
, CFErrorRef
*error
){
1125 sec_trace_enter_api(NULL
);
1126 sec_trace_return_bool_api(^{
1127 do_if_registered(soscc_RegisterRecoveryPublicKey
, recovery_key
, error
);
1128 return recovery_and_bool_to_bool_error_request(kSecXPCOpRegisterRecoveryPublicKey
, recovery_key
, error
);
1132 CFDataRef
SOSCCCopyRecoveryPublicKey(CFErrorRef
*error
){
1133 sec_trace_enter_api(NULL
);
1134 sec_trace_return_api(CFDataRef
, ^{
1135 do_if_registered(soscc_CopyRecoveryPublicKey
, error
);
1136 return data_to_error_request(kSecXPCOpGetRecoveryPublicKey
, error
);
1137 }, CFSTR("return=%@"));
1139 static bool label_and_password_to_bool_error_request(enum SecXPCOperation op
,
1140 CFStringRef user_label
, CFDataRef user_password
,
1143 __block
bool result
= false;
1145 securityd_send_sync_and_do(op
, error
, ^bool(xpc_object_t message
, CFErrorRef
*error
) {
1146 CFStringPerformWithCString(user_label
, ^(const char *utf8Str
) {
1147 xpc_dictionary_set_string(message
, kSecXPCKeyUserLabel
, utf8Str
);
1149 xpc_dictionary_set_data(message
, kSecXPCKeyUserPassword
, CFDataGetBytePtr(user_password
), CFDataGetLength(user_password
));
1151 }, ^bool(xpc_object_t response
, __unused CFErrorRef
*error
) {
1152 result
= xpc_dictionary_get_bool(response
, kSecXPCKeyResult
);
1159 static bool label_and_password_and_dsid_to_bool_error_request(enum SecXPCOperation op
,
1160 CFStringRef user_label
, CFDataRef user_password
,
1161 CFStringRef dsid
, CFErrorRef
* error
)
1163 __block
bool result
= false;
1165 securityd_send_sync_and_do(op
, error
, ^bool(xpc_object_t message
, CFErrorRef
*error
) {
1166 CFStringPerformWithCString(user_label
, ^(const char *utf8Str
) {
1167 xpc_dictionary_set_string(message
, kSecXPCKeyUserLabel
, utf8Str
);
1169 CFStringPerformWithCString(dsid
, ^(const char *utr8StrDSID
) {
1170 xpc_dictionary_set_string(message
, kSecXPCKeyDSID
, utr8StrDSID
);
1172 xpc_dictionary_set_data(message
, kSecXPCKeyUserPassword
, CFDataGetBytePtr(user_password
), CFDataGetLength(user_password
));
1174 }, ^bool(xpc_object_t response
, __unused CFErrorRef
*error
) {
1175 result
= xpc_dictionary_get_bool(response
, kSecXPCKeyResult
);
1182 static bool cfstring_to_bool_error_request(enum SecXPCOperation op
,
1186 __block
bool result
= false;
1188 securityd_send_sync_and_do(op
, error
, ^bool(xpc_object_t message
, CFErrorRef
*error
) {
1189 CFStringPerformWithCString(string
, ^(const char *utf8Str
) {
1190 xpc_dictionary_set_string(message
, kSecXPCKeyDeviceID
, utf8Str
);
1193 }, ^bool(xpc_object_t response
, CFErrorRef
*error
) {
1194 result
= xpc_dictionary_get_bool(response
, kSecXPCKeyResult
);
1201 static int idsDict_to_int_error_request(enum SecXPCOperation op
,
1202 CFDictionaryRef IDS
,
1205 __block
int result
= 0;
1207 securityd_send_sync_and_do(op
, error
, ^bool(xpc_object_t message
, CFErrorRef
*error
) {
1208 SecXPCDictionarySetPListOptional(message
, kSecXPCKeyIDSMessage
, IDS
, error
);
1210 }, ^bool(xpc_object_t response
, __unused CFErrorRef
*error
) {
1211 int64_t temp_result
= xpc_dictionary_get_int64(response
, kSecXPCKeyResult
);
1212 if ((temp_result
>= INT32_MIN
) && (temp_result
<= INT32_MAX
)) {
1213 result
= (int)temp_result
;
1221 static bool idsData_peerID_to_bool_error_request(enum SecXPCOperation op
, CFStringRef peerID
,
1222 CFDataRef IDSMessage
,
1225 __block
bool result
= 0;
1227 securityd_send_sync_and_do(op
, error
, ^bool(xpc_object_t message
, CFErrorRef
*error
) {
1228 SecXPCDictionarySetData(message
, kSecXPCKeyIDSMessage
, IDSMessage
, error
);
1229 SecXPCDictionarySetString(message
, kSecXPCKeyDeviceID
, peerID
, error
);
1231 }, ^bool(xpc_object_t response
, CFErrorRef
*error
) {
1232 result
= xpc_dictionary_get_bool(response
, kSecXPCKeyResult
);
1238 static bool idscommand_to_bool_error_request(enum SecXPCOperation op
,
1239 CFStringRef idsMessage
,
1242 __block
bool result
= false;
1244 securityd_send_sync_and_do(op
, error
, ^bool(xpc_object_t message
, CFErrorRef
*error
) {
1245 CFStringPerformWithCString(idsMessage
, ^(const char *utf8Str
) {
1246 xpc_dictionary_set_string(message
, kSecXPCKeySendIDSMessage
, utf8Str
);
1249 }, ^bool(xpc_object_t response
, __unused CFErrorRef
*error
) {
1250 result
= xpc_dictionary_get_bool(response
, kSecXPCKeyResult
);
1257 bool SOSCCRegisterUserCredentials(CFStringRef user_label
, CFDataRef user_password
, CFErrorRef
* error
)
1259 secnotice("sosops", "SOSCCRegisterUserCredentials - calling SOSCCSetUserCredentials!! %@\n", user_label
);
1260 return SOSCCSetUserCredentials(user_label
, user_password
, error
);
1263 bool SOSCCSetUserCredentials(CFStringRef user_label
, CFDataRef user_password
, CFErrorRef
* error
)
1265 secnotice("sosops", "SOSCCSetUserCredentials!! %@\n", user_label
);
1266 sec_trace_enter_api(CFSTR("user_label=%@"), user_label
);
1267 sec_trace_return_bool_api(^{
1268 do_if_registered(soscc_SetUserCredentials
, user_label
, user_password
, error
);
1270 return label_and_password_to_bool_error_request(kSecXPCOpSetUserCredentials
, user_label
, user_password
, error
);
1274 bool SOSCCSetUserCredentialsAndDSID(CFStringRef user_label
, CFDataRef user_password
, CFStringRef dsid
, CFErrorRef
*error
)
1276 secnotice("sosops", "SOSCCSetUserCredentialsAndDSID!! %@\n", user_label
);
1277 sec_trace_enter_api(CFSTR("user_label=%@"), user_label
);
1278 sec_trace_return_bool_api(^{
1279 do_if_registered(soscc_SetUserCredentialsAndDSID
, user_label
, user_password
, dsid
, error
);
1281 bool result
= false;
1282 __block CFStringRef account_dsid
= dsid
;
1284 require_action_quiet(user_label
, out
, SOSErrorCreate(kSOSErrorParam
, error
, NULL
, CFSTR("user_label is nil")));
1285 require_action_quiet(user_password
, out
, SOSErrorCreate(kSOSErrorParam
, error
, NULL
, CFSTR("user_password is nil")));
1287 if(account_dsid
== NULL
){
1288 account_dsid
= CFSTR("");
1290 return label_and_password_and_dsid_to_bool_error_request(kSecXPCOpSetUserCredentialsAndDSID
, user_label
, user_password
, account_dsid
, error
);
1296 bool SOSCCSetDeviceID(CFStringRef IDS
, CFErrorRef
* error
)
1298 secnotice("sosops", "SOSCCSetDeviceID!! %@\n", IDS
);
1299 sec_trace_enter_api(NULL
);
1300 sec_trace_return_bool_api(^{
1301 do_if_registered(soscc_SetDeviceID
, IDS
, error
);
1302 bool result
= cfstring_to_bool_error_request(kSecXPCOpSetDeviceID
, IDS
, error
);
1307 bool SOSCCIDSServiceRegistrationTest(CFStringRef message
, CFErrorRef
*error
)
1309 secnotice("sosops", "SOSCCSendIDSTestMessage!! %@\n", message
);
1310 sec_trace_enter_api(NULL
);
1311 sec_trace_return_bool_api(^{
1312 do_if_registered(soscc_CheckIDSRegistration
, message
, error
);
1313 return idscommand_to_bool_error_request(kSecXPCOpSendIDSMessage
, message
, error
);
1317 bool SOSCCIDSPingTest(CFStringRef message
, CFErrorRef
*error
)
1319 secnotice("sosops", "SOSCCSendIDSTestMessage!! %@\n", message
);
1320 sec_trace_enter_api(NULL
);
1321 sec_trace_return_bool_api(^{
1322 do_if_registered(soscc_PingTest
, message
, error
);
1323 return idscommand_to_bool_error_request(kSecXPCOpPingTest
, message
, error
);
1327 bool SOSCCIDSDeviceIDIsAvailableTest(CFErrorRef
*error
)
1329 secnotice("sosops", "SOSCCIDSDeviceIDIsAvailableTest!!\n");
1330 sec_trace_enter_api(NULL
);
1331 sec_trace_return_bool_api(^{
1332 do_if_registered(soscc_GetIDSIDFromIDS
, error
);
1333 return simple_bool_error_request(kSecXPCOpIDSDeviceID
, error
);
1337 HandleIDSMessageReason
SOSCCHandleIDSMessage(CFDictionaryRef IDS
, CFErrorRef
* error
)
1339 secnotice("sosops", "SOSCCHandleIDSMessage!! %@\n", IDS
);
1340 sec_trace_enter_api(NULL
);
1341 sec_trace_return_api(HandleIDSMessageReason
, ^{
1342 do_if_registered(soscc_HandleIDSMessage
, IDS
, error
);
1343 return (HandleIDSMessageReason
) idsDict_to_int_error_request(kSecXPCOpHandleIDSMessage
, IDS
, error
);
1347 bool SOSCCClearPeerMessageKeyInKVS(CFStringRef peerID
, CFErrorRef
*error
)
1349 secnotice("sosops", "SOSCCClearPeerMessageKeyInKVS!! %@\n", peerID
);
1350 sec_trace_enter_api(NULL
);
1351 sec_trace_return_bool_api(^{
1352 do_if_registered(socc_clearPeerMessageKeyInKVS
, peerID
, error
);
1353 return cfstring_to_bool_error_request(kSecXPCOpClearKVSPeerMessage
, peerID
, error
);
1358 bool SOSCCRequestSyncWithPeerOverKVSUsingIDOnly(CFStringRef peerID
, CFErrorRef
*error
)
1360 secnotice("sosops", "SOSCCRequestSyncWithPeerOverKVSUsingIDOnly!! %@\n", peerID
);
1361 sec_trace_enter_api(NULL
);
1362 sec_trace_return_bool_api(^{
1363 do_if_registered(soscc_requestSyncWithPeerOverKVSIDOnly
, peerID
, error
);
1364 return deviceid_to_bool_error_request(kSecXPCOpSyncWithKVSPeerIDOnly
, peerID
, error
);
1368 bool SOSCCRequestSyncWithPeerOverKVS(CFStringRef peerID
, CFDataRef message
, CFErrorRef
*error
)
1370 secnotice("sosops", "SOSCCRequestSyncWithPeerOverKVS!! %@\n", peerID
);
1371 sec_trace_enter_api(NULL
);
1372 sec_trace_return_bool_api(^{
1373 do_if_registered(soscc_requestSyncWithPeerOverKVS
, peerID
, message
, error
);
1374 return idsData_peerID_to_bool_error_request(kSecXPCOpSyncWithKVSPeer
, peerID
, message
, error
);
1378 bool SOSCCTryUserCredentials(CFStringRef user_label
, CFDataRef user_password
, CFErrorRef
* error
)
1380 sec_trace_enter_api(CFSTR("user_label=%@"), user_label
);
1381 sec_trace_return_bool_api(^{
1382 do_if_registered(soscc_TryUserCredentials
, user_label
, user_password
, error
);
1384 return label_and_password_to_bool_error_request(kSecXPCOpTryUserCredentials
, user_label
, user_password
, error
);
1389 bool SOSCCCanAuthenticate(CFErrorRef
* error
) {
1390 sec_trace_enter_api(NULL
);
1391 sec_trace_return_bool_api(^{
1392 do_if_registered(soscc_CanAuthenticate
, error
);
1394 return simple_bool_error_request(kSecXPCOpCanAuthenticate
, error
);
1398 bool SOSCCPurgeUserCredentials(CFErrorRef
* error
) {
1399 sec_trace_enter_api(NULL
);
1400 sec_trace_return_bool_api(^{
1401 do_if_registered(soscc_PurgeUserCredentials
, error
);
1403 return simple_bool_error_request(kSecXPCOpPurgeUserCredentials
, error
);
1407 enum DepartureReason
SOSCCGetLastDepartureReason(CFErrorRef
*error
) {
1408 sec_trace_enter_api(NULL
);
1409 sec_trace_return_api(enum DepartureReason
, ^{
1410 do_if_registered(soscc_GetLastDepartureReason
, error
);
1412 return (enum DepartureReason
) simple_int_error_request(kSecXPCOpGetLastDepartureReason
, error
);
1416 bool SOSCCSetLastDepartureReason(enum DepartureReason reason
, CFErrorRef
*error
) {
1417 sec_trace_enter_api(NULL
);
1418 sec_trace_return_api(bool, ^{
1419 do_if_registered(soscc_SetLastDepartureReason
, reason
, error
);
1420 return securityd_send_sync_and_do(kSecXPCOpSetLastDepartureReason
, error
,
1421 ^bool(xpc_object_t message
, CFErrorRef
*error
) {
1422 xpc_dictionary_set_int64(message
, kSecXPCKeyReason
, reason
);
1425 ^bool(xpc_object_t response
, __unused CFErrorRef
*error
) {
1426 return xpc_dictionary_get_bool(response
, kSecXPCKeyResult
);
1432 CFStringRef
SOSCCCopyIncompatibilityInfo(CFErrorRef
* error
) {
1433 sec_trace_enter_api(NULL
);
1434 sec_trace_return_api(CFStringRef
, ^{
1435 do_if_registered(soscc_CopyIncompatibilityInfo
, error
);
1437 return simple_cfstring_error_request(kSecXPCOpCopyIncompatibilityInfo
, error
);
1441 CFStringRef
SOSCCCopyDeviceID(CFErrorRef
* error
)
1443 sec_trace_enter_api(NULL
);
1444 sec_trace_return_api(CFStringRef
, ^{
1445 do_if_registered(soscc_CopyDeviceID
, error
);
1446 CFStringRef deviceID
= simple_cfstring_error_request(kSecXPCOpRequestDeviceID
, error
);
1451 bool SOSCCProcessEnsurePeerRegistration(CFErrorRef
* error
){
1452 secnotice("updates", "enter SOSCCProcessEnsurePeerRegistration");
1453 sec_trace_enter_api(NULL
);
1454 sec_trace_return_bool_api(^{
1455 do_if_registered(soscc_EnsurePeerRegistration
, error
);
1457 return simple_bool_error_request(soscc_EnsurePeerRegistration_id
, error
);
1462 CFSetRef
/* CFString */ SOSCCProcessSyncWithPeers(CFSetRef peers
, CFSetRef backupPeers
, CFErrorRef
* error
)
1464 sec_trace_enter_api(NULL
);
1465 sec_trace_return_api(CFSetRef
, ^{
1466 do_if_registered(soscc_ProcessSyncWithPeers
, peers
, backupPeers
, error
);
1468 return cfset_cfset_to_cfset_error_request(kSecXPCOpProcessSyncWithPeers
, peers
, backupPeers
, error
);
1473 SyncWithAllPeersReason
SOSCCProcessSyncWithAllPeers(CFErrorRef
* error
)
1475 sec_trace_enter_api(NULL
);
1476 sec_trace_return_api(SyncWithAllPeersReason
, ^{
1477 do_if_registered(soscc_ProcessSyncWithAllPeers
, error
);
1479 return (SyncWithAllPeersReason
) simple_int_error_request(kSecXPCOpProcessSyncWithAllPeers
, error
);
1483 CFStringRef
SOSCCGetStatusDescription(SOSCCStatus status
)
1486 case kSOSCCInCircle
:
1487 return CFSTR("InCircle");
1488 case kSOSCCNotInCircle
:
1489 return CFSTR("NotInCircle");
1490 case kSOSCCRequestPending
:
1491 return CFSTR("RequestPending");
1492 case kSOSCCCircleAbsent
:
1493 return CFSTR("CircleAbsent");
1495 return CFSTR("InternalError");
1497 return CFSTR("Unknown Status (%d)");
1502 kSOSCCGeneralViewError
= -1,
1503 kSOSCCViewMember
= 0,
1504 kSOSCCViewNotMember
= 1,
1505 kSOSCCViewNotQualified
= 2,
1506 kSOSCCNoSuchView
= 3,
1509 static int64_t name_action_to_code_request(enum SecXPCOperation op
, uint16_t error_result
,
1510 CFStringRef name
, uint64_t action
, CFErrorRef
*error
) {
1511 __block
int64_t result
= error_result
;
1513 securityd_send_sync_and_do(op
, error
, ^bool(xpc_object_t message
, CFErrorRef
*error
) {
1514 CFStringPerformWithCString(name
, ^(const char *utf8Str
) {
1515 xpc_dictionary_set_string(message
, kSecXPCKeyViewName
, utf8Str
);
1517 xpc_dictionary_set_int64(message
, kSecXPCKeyViewActionCode
, action
);
1519 }, ^bool(xpc_object_t response
, __unused CFErrorRef
*error
) {
1520 if (response
&& xpc_dictionary_entry_is_type(response
, kSecXPCKeyResult
, XPC_TYPE_INT64
)) {
1521 result
= xpc_dictionary_get_int64(response
, kSecXPCKeyResult
);
1523 return result
!= error_result
;
1529 SOSViewResultCode
SOSCCView(CFStringRef view
, SOSViewActionCode actionCode
, CFErrorRef
*error
) {
1530 sec_trace_enter_api(NULL
);
1531 sec_trace_return_api(SOSViewResultCode
, ^{
1532 do_if_registered(soscc_View
, view
, actionCode
, error
);
1534 return (SOSViewResultCode
) name_action_to_code_request(kSecXPCOpView
, kSOSCCGeneralViewError
, view
, actionCode
, error
);
1535 }, CFSTR("SOSViewResultCode=%d"))
1539 bool SOSCCViewSet(CFSetRef enabledViews
, CFSetRef disabledViews
) {
1540 CFErrorRef
*error
= NULL
;
1541 __block
bool result
= false;
1543 sec_trace_enter_api(NULL
);
1544 sec_trace_return_bool_api(^{
1545 do_if_registered(soscc_ViewSet
, enabledViews
, disabledViews
);
1546 return securityd_send_sync_and_do(kSecXPCOpViewSet
, error
, ^bool(xpc_object_t message
, CFErrorRef
*error
) {
1547 xpc_object_t enabledSetXpc
= CreateXPCObjectWithCFSetRef(enabledViews
, error
);
1548 xpc_object_t disabledSetXpc
= CreateXPCObjectWithCFSetRef(disabledViews
, error
);
1549 if (enabledSetXpc
) xpc_dictionary_set_value(message
, kSecXPCKeyEnabledViewsKey
, enabledSetXpc
);
1550 if (disabledSetXpc
) xpc_dictionary_set_value(message
, kSecXPCKeyDisabledViewsKey
, disabledSetXpc
);
1551 return (enabledSetXpc
!= NULL
) || (disabledSetXpc
!= NULL
) ;
1552 }, ^bool(xpc_object_t response
, __unused CFErrorRef
*error
) {
1553 result
= xpc_dictionary_get_bool(response
, kSecXPCKeyResult
);
1559 SOSSecurityPropertyResultCode
SOSCCSecurityProperty(CFStringRef property
, SOSSecurityPropertyActionCode actionCode
, CFErrorRef
*error
) {
1560 sec_trace_enter_api(NULL
);
1561 sec_trace_return_api(SOSSecurityPropertyResultCode
, ^{
1562 SOSSecurityPropertyResultCode result
= kSOSCCGeneralSecurityPropertyError
;
1563 do_if_registered(soscc_SecurityProperty
, property
, actionCode
, error
);
1564 xpc_object_t message
= securityd_create_message(kSecXPCOpSecurityProperty
, error
);
1566 int64_t bigac
= actionCode
;
1567 xpc_dictionary_set_string(message
, kSecXPCKeyViewName
, CFStringGetCStringPtr(property
, kCFStringEncodingUTF8
));
1568 xpc_dictionary_set_int64(message
, kSecXPCKeyViewActionCode
, bigac
);
1570 xpc_object_t response
= securityd_message_with_reply_sync(message
, error
);
1572 if (response
&& xpc_dictionary_entry_is_type(response
, kSecXPCKeyResult
, XPC_TYPE_INT64
)) {
1573 result
= (SOSSecurityPropertyResultCode
) xpc_dictionary_get_int64(response
, kSecXPCKeyResult
);
1576 if (result
== kSOSCCGeneralSecurityPropertyError
) {
1577 if (response
&& securityd_message_no_error(response
, error
)) {
1578 char *desc
= xpc_copy_description(response
);
1579 SecCFCreateErrorWithFormat(0, sSecXPCErrorDomain
, NULL
, error
, NULL
, CFSTR("Remote error occurred/no info: %s"), desc
);
1584 xpc_release(response
);
1586 xpc_release(message
);
1590 }, CFSTR("SOSSecurityPropertyResultCode=%d"))
1594 static bool sosIsViewSetSyncing(size_t n
, CFStringRef
*views
) {
1595 __block
bool retval
= true;
1597 SOSCCStatus cstatus
= SOSCCThisDeviceIsInCircle(NULL
);
1598 if(cstatus
== kSOSCCInCircle
) {
1599 for(size_t i
= 0; i
< n
; i
++) {
1600 SOSViewResultCode vstatus
= SOSCCView(views
[i
], kSOSCCViewQuery
, NULL
);
1601 if(vstatus
!= kSOSCCViewMember
) retval
= false;
1609 bool SOSCCIsIcloudKeychainSyncing(void) {
1610 CFStringRef views
[] = { kSOSViewWiFi
, kSOSViewAutofillPasswords
, kSOSViewSafariCreditCards
, kSOSViewOtherSyncable
};
1611 return sosIsViewSetSyncing(sizeof(views
)/sizeof(views
[0]), views
);
1614 bool SOSCCIsSafariSyncing(void) {
1615 CFStringRef views
[] = { kSOSViewAutofillPasswords
, kSOSViewSafariCreditCards
};
1616 return sosIsViewSetSyncing(sizeof(views
)/sizeof(views
[0]), views
);
1619 bool SOSCCIsAppleTVSyncing(void) {
1620 CFStringRef views
[] = { kSOSViewAppleTV
};
1621 return sosIsViewSetSyncing(sizeof(views
)/sizeof(views
[0]), views
);
1624 bool SOSCCIsHomeKitSyncing(void) {
1625 CFStringRef views
[] = { kSOSViewHomeKit
};
1626 return sosIsViewSetSyncing(sizeof(views
)/sizeof(views
[0]), views
);
1629 bool SOSCCIsWiFiSyncing(void) {
1630 CFStringRef views
[] = { kSOSViewWiFi
};
1631 return sosIsViewSetSyncing(sizeof(views
)/sizeof(views
[0]), views
);
1634 bool SOSCCIsContinuityUnlockSyncing(void) {
1635 CFStringRef views
[] = { kSOSViewContinuityUnlock
};
1636 return sosIsViewSetSyncing(sizeof(views
)/sizeof(views
[0]), views
);
1640 bool SOSCCSetEscrowRecord(CFStringRef escrow_label
, uint64_t tries
, CFErrorRef
*error
){
1641 secnotice("escrow", "enter SOSCCSetEscrowRecord");
1642 sec_trace_enter_api(NULL
);
1643 sec_trace_return_bool_api(^{
1644 do_if_registered(soscc_SetEscrowRecords
, escrow_label
, tries
, error
);
1646 return escrow_to_bool_error_request(kSecXPCOpSetEscrowRecord
, escrow_label
, tries
, error
);
1650 CFDictionaryRef
SOSCCCopyEscrowRecord(CFErrorRef
*error
){
1651 secnotice("escrow", "enter SOSCCCopyEscrowRecord");
1652 sec_trace_enter_api(NULL
);
1653 sec_trace_return_api(CFDictionaryRef
, ^{
1654 do_if_registered(soscc_CopyEscrowRecords
, error
);
1656 return strings_to_dictionary_error_request(kSecXPCOpGetEscrowRecord
, error
);
1657 }, CFSTR("return=%@"))
1661 CFDictionaryRef
SOSCCCopyBackupInformation(CFErrorRef
*error
) {
1662 secnotice("escrow", "enter SOSCCCopyBackupInformation");
1663 sec_trace_enter_api(NULL
);
1664 sec_trace_return_api(CFDictionaryRef
, ^{
1665 do_if_registered(soscc_CopyBackupInformation
, error
);
1666 return strings_to_dictionary_error_request(kSecXPCOpCopyBackupInformation
, error
);
1667 }, CFSTR("return=%@"))
1670 bool SOSCCCheckPeerAvailability(CFErrorRef
*error
){
1671 secnotice("peer", "enter SOSCCCheckPeerAvailability");
1672 sec_trace_enter_api(NULL
);
1673 sec_trace_return_bool_api(^{
1674 do_if_registered(soscc_PeerAvailability
, error
);
1676 return simple_bool_error_request(kSecXPCOpCheckPeerAvailability
, error
);
1682 bool SOSWrapToBackupSliceKeyBagForView(CFStringRef viewName
, CFDataRef input
, CFDataRef
* output
, CFDataRef
* bskbEncoded
, CFErrorRef
* error
) {
1683 sec_trace_enter_api(NULL
);
1684 sec_trace_return_bool_api(^{
1685 do_if_registered(sosbskb_WrapToBackupSliceKeyBagForView
, viewName
, input
, output
, bskbEncoded
, error
);
1687 return cfstring_and_cfdata_to_cfdata_cfdata_error_request(kSecXPCOpWrapToBackupSliceKeyBagForView
, viewName
, input
, output
, bskbEncoded
, error
);
1692 SOSPeerInfoRef
SOSCCCopyApplication(CFErrorRef
*error
) {
1693 secnotice("hsa2PB", "enter SOSCCCopyApplication applicant");
1694 sec_trace_enter_api(NULL
);
1696 sec_trace_return_api(SOSPeerInfoRef
, ^{
1697 do_if_registered(soscc_CopyApplicant
, error
);
1698 return peer_info_error_request(kSecXPCOpCopyApplication
, error
);
1699 }, CFSTR("return=%@"));
1702 CFDataRef
SOSCCCopyCircleJoiningBlob(SOSPeerInfoRef applicant
, CFErrorRef
*error
) {
1703 secnotice("hsa2PB", "enter SOSCCCopyCircleJoiningBlob approver");
1704 sec_trace_enter_api(NULL
);
1706 sec_trace_return_api(CFDataRef
, ^{
1707 CFDataRef result
= NULL
;
1708 do_if_registered(soscc_CopyCircleJoiningBlob
, applicant
, error
);
1709 CFDataRef piData
= SOSPeerInfoCopyEncodedData(applicant
, kCFAllocatorDefault
, error
);
1710 result
= cfdata_error_request_returns_cfdata(kSecXPCOpCopyCircleJoiningBlob
, piData
, error
);
1711 CFReleaseNull(piData
);
1713 }, CFSTR("return=%@"));
1716 bool SOSCCJoinWithCircleJoiningBlob(CFDataRef joiningBlob
, CFErrorRef
*error
) {
1717 secnotice("hsa2PB", "enter SOSCCJoinWithCircleJoiningBlob applicant");
1718 sec_trace_enter_api(NULL
);
1719 sec_trace_return_bool_api(^{
1720 do_if_registered(soscc_JoinWithCircleJoiningBlob
, joiningBlob
, error
);
1722 return cfdata_error_request_returns_bool(kSecXPCOpJoinWithCircleJoiningBlob
, joiningBlob
, error
);
1728 bool SOSCCIsThisDeviceLastBackup(CFErrorRef
*error
) {
1729 secnotice("peer", "enter SOSCCIsThisDeviceLastBackup");
1730 sec_trace_enter_api(NULL
);
1731 sec_trace_return_bool_api(^{
1732 do_if_registered(soscc_IsThisDeviceLastBackup
, error
);
1734 return simple_bool_error_request(kSecXPCOpIsThisDeviceLastBackup
, error
);
1738 CFBooleanRef
SOSCCPeersHaveViewsEnabled(CFArrayRef viewNames
, CFErrorRef
*error
) {
1739 secnotice("view-enabled", "enter SOSCCPeersHaveViewsEnabled");
1740 sec_trace_enter_api(NULL
);
1741 sec_trace_return_api(CFBooleanRef
, ^{
1742 do_if_registered(soscc_SOSCCPeersHaveViewsEnabled
, viewNames
, error
);
1744 return cfarray_to_cfboolean_error_request(kSecXPCOpPeersHaveViewsEnabled
, viewNames
, error
);
1745 }, CFSTR("return=%@"))
1748 bool SOSCCMessageFromPeerIsPending(SOSPeerInfoRef peer
, CFErrorRef
*error
) {
1749 secnotice("pending-check", "enter SOSCCMessageFromPeerIsPending");
1751 sec_trace_return_bool_api(^{
1752 do_if_registered(soscc_SOSCCMessageFromPeerIsPending
, peer
, error
);
1754 return peer_info_to_bool_error_request(kSecXPCOpMessageFromPeerIsPending
, peer
, error
);
1759 bool SOSCCSendToPeerIsPending(SOSPeerInfoRef peer
, CFErrorRef
*error
) {
1760 sec_trace_return_bool_api(^{
1761 do_if_registered(soscc_SOSCCSendToPeerIsPending
, peer
, error
);
1763 return peer_info_to_bool_error_request(kSecXPCOpSendToPeerIsPending
, peer
, error
);