2 * Copyright (c) 2007-2015 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@
24 #include <Security/SecureObjectSync/SOSPeerInfoDER.h>
25 #include <Security/SecureObjectSync/SOSCloudCircle.h>
26 #include <Security/SecureObjectSync/SOSCloudCircleInternal.h>
27 #include <Security/SecureObjectSync/SOSInternal.h>
28 #include <Security/SecureObjectSync/SOSPeerInfoCollections.h>
29 #include <Security/SecBasePriv.h>
30 #include <Security/SecCertificatePriv.h>
31 #include <Security/SecEntitlements.h>
32 #include <Security/SecInternal.h>
33 #include <Security/SecItemPriv.h> /* For SecItemDeleteAll */
34 #include <Security/SecPolicyInternal.h>
35 #include <Security/SecTask.h>
36 #include <Security/SecTrustInternal.h>
37 #include <Security/SecuritydXPC.h>
38 #include <securityd/OTATrustUtilities.h>
39 #include <securityd/SOSCloudCircleServer.h>
40 #include <securityd/SecItemBackupServer.h>
41 #include <securityd/SecItemServer.h>
42 #include <securityd/SecLogSettingsServer.h>
43 #include <securityd/SecOTRRemote.h>
44 #include <securityd/SecTrustServer.h>
45 #include <securityd/SecTrustStoreServer.h>
46 #include <securityd/iCloudTrace.h>
47 #include <securityd/spi.h>
48 #include <utilities/SecCFError.h>
49 #include <utilities/SecCFWrappers.h>
50 #include <utilities/SecDb.h>
51 #include <utilities/SecIOFormat.h>
52 #include <utilities/SecXPCError.h>
53 #include <utilities/debugging.h>
54 #include <utilities/SecInternalReleasePriv.h>
56 #include <AssertMacros.h>
57 #include <CoreFoundation/CFXPCBridge.h>
58 #include <CoreFoundation/CoreFoundation.h>
59 // <rdar://problem/22425706> 13B104+Roots:Device never moved past spinner after using approval to ENABLE icdp
60 #if TARGET_OS_EMBEDDED
61 #include <MobileKeyBag/MobileKeyBag.h>
64 #include <Security/SecTaskPriv.h>
65 #include <login/SessionAgentStatusCom.h>
68 #include <bsm/libbsm.h>
69 #include <ipc/securityd_client.h>
70 #include <libkern/OSAtomic.h>
71 #include <mach/mach.h>
72 #include <mach/message.h>
75 #include <sys/queue.h>
76 #include <sys/sysctl.h>
78 #include <xpc/private.h>
82 static int inMultiUser
= 0;
86 static CFStringRef
SecTaskCopyStringForEntitlement(SecTaskRef task
,
87 CFStringRef entitlement
)
89 CFStringRef value
= (CFStringRef
)SecTaskCopyValueForEntitlement(task
,
91 if (value
&& CFGetTypeID(value
) != CFStringGetTypeID()) {
99 static CFArrayRef
SecTaskCopyArrayOfStringsForEntitlement(SecTaskRef task
,
100 CFStringRef entitlement
)
102 CFArrayRef value
= (CFArrayRef
)SecTaskCopyValueForEntitlement(task
,
105 if (CFGetTypeID(value
) == CFArrayGetTypeID()) {
106 CFIndex ix
, count
= CFArrayGetCount(value
);
107 for (ix
= 0; ix
< count
; ++ix
) {
108 CFStringRef string
= (CFStringRef
)CFArrayGetValueAtIndex(value
, ix
);
109 if (CFGetTypeID(string
) != CFStringGetTypeID()) {
124 static CFStringRef
SecTaskCopyApplicationIdentifier(SecTaskRef task
) {
125 return SecTaskCopyStringForEntitlement(task
,
126 kSecEntitlementApplicationIdentifier
);
129 static CFArrayRef
SecTaskCopySharedWebCredentialDomains(SecTaskRef task
) {
130 return SecTaskCopyArrayOfStringsForEntitlement(task
,
131 kSecEntitlementAssociatedDomains
);
134 static CFArrayRef
SecTaskCopyAccessGroups(SecTaskRef task
) {
135 CFMutableArrayRef groups
= NULL
;
136 CFArrayRef keychainAccessGroups
= SecTaskCopyArrayOfStringsForEntitlement(task
,
137 kSecEntitlementKeychainAccessGroups
);
138 CFArrayRef appleSecurityApplicationGroups
= SecTaskCopyArrayOfStringsForEntitlement(task
,
139 kSecEntitlementAppleSecurityApplicationGroups
);
140 CFStringRef appID
= SecTaskCopyApplicationIdentifier(task
);
141 CFIndex kagLen
= keychainAccessGroups
? CFArrayGetCount(keychainAccessGroups
) : 0;
142 CFIndex asagLen
= appleSecurityApplicationGroups
? CFArrayGetCount(appleSecurityApplicationGroups
) : 0;
143 bool entitlementsValidated
= true;
144 bool hasEntitlements
= (kagLen
+ asagLen
+ (appID
? 1 : 0)) > 0;
145 #if (TARGET_OS_MAC && !(TARGET_OS_EMBEDDED || TARGET_OS_IPHONE))
146 entitlementsValidated
= SecTaskEntitlementsValidated(task
);
147 if ((appID
|| asagLen
) && !entitlementsValidated
) {
148 CFReleaseNull(appID
);
152 CFIndex len
= kagLen
+ asagLen
+ (appID
? 1 : 0);
153 // Always allow access to com.apple.token access group, unless entitlement validation explicitly failed.
154 CFIndex tokenLen
= (!hasEntitlements
|| entitlementsValidated
) ? 1 : 0;
159 groups
= CFArrayCreateMutable(kCFAllocatorDefault
, len
+ tokenLen
, &kCFTypeArrayCallBacks
);
161 CFArrayAppendArray(groups
, keychainAccessGroups
, CFRangeMake(0, kagLen
));
163 CFArrayAppendValue(groups
, appID
);
165 CFArrayAppendArray(groups
, appleSecurityApplicationGroups
, CFRangeMake(0, asagLen
));
167 CFArrayAppendValue(groups
, kSecAttrAccessGroupToken
);
168 #if TARGET_IPHONE_SIMULATOR
170 secwarning("No keychain access group specified while running in simulator, falling back to default set");
171 groups
= (CFMutableArrayRef
)CFRetainSafe(SecAccessGroupsGetCurrent());
175 CFReleaseSafe(appID
);
176 CFReleaseSafe(keychainAccessGroups
);
177 CFReleaseSafe(appleSecurityApplicationGroups
);
182 static pthread_key_t taskThreadKey
;
183 static void secTaskDiagnoseEntitlements(CFArrayRef accessGroups
) {
184 SecTaskRef taskRef
= pthread_getspecific(taskThreadKey
);
188 CFErrorRef error
= NULL
;
189 CFArrayRef entitlementNames
= CFArrayCreateForCFTypes(NULL
,
190 kSecEntitlementApplicationIdentifier
,
191 kSecEntitlementKeychainAccessGroups
,
192 kSecEntitlementAppleSecurityApplicationGroups
,
194 CFDictionaryRef rawEntitlements
= SecTaskCopyValuesForEntitlements(taskRef
, entitlementNames
, &error
);
195 CFReleaseNull(entitlementNames
);
197 // exclude some error types because they're accounted-for and not the reason we're here
198 if (rawEntitlements
== NULL
&& error
) {
199 CFErrorDomain domain
= CFErrorGetDomain(error
);
200 if (domain
&& CFEqual(domain
, kCFErrorDomainPOSIX
)) {
201 CFNumberRef code
= CFErrorGetCode(error
);
203 if (code
&& CFNumberGetValue(code
, kCFNumberIntType
, &errno
))
205 case ESRCH
: // no such process (bad pid or process died)
213 uint32_t cs_flags
= SecTaskGetCodeSignStatus(taskRef
);
214 CFStringRef identifier
= SecTaskCopySigningIdentifier(taskRef
, NULL
);
215 CFStringRef message
= NULL
;
217 if (rawEntitlements
== NULL
) { // NULL indicates failure-to-fetch (SecTask entitlements not initialized)
218 message
= CFStringCreateWithFormat(NULL
, NULL
, CFSTR("failed to fetch keychain client entitlements. task=%@ procid=%@ cs_flags=0x%08.8x error=%@"),
219 taskRef
, identifier
, cs_flags
, error
);
220 secerror("MISSING keychain entitlements: retrieve-entitlements error %@", error
);
222 // non-NULL entitlement return => SecTaskCopyEntitlements succeeeded, no error
223 // but note that kernel EINVAL => no entitlements, no error to deal with unsigned code
224 message
= CFStringCreateWithFormat(NULL
, NULL
, CFSTR("found no keychain client entitlements. task=%@ procid=%@ cs_flags=0x%08.8x"),
225 taskRef
, identifier
, cs_flags
);
226 secerror("MISSING keychain entitlements: raw entitlement values: %@", rawEntitlements
);
227 secerror("MISSING keychain entitlements: original ag: %@", accessGroups
);
228 CFArrayRef newAccessGroups
= SecTaskCopyAccessGroups(taskRef
);
229 secerror("MISSING keychain entitlements: newly parsed ag: %@", newAccessGroups
);
230 CFReleaseNull(newAccessGroups
);
232 char buffer
[1000] = "?";
233 CFStringGetCString(message
, buffer
, sizeof(buffer
), kCFStringEncodingUTF8
);
234 syslog(LOG_NOTICE
, "%s", buffer
);
235 __security_simulatecrash(message
, __sec_exception_code_MissingEntitlements
);
237 CFReleaseNull(rawEntitlements
);
238 CFReleaseNull(message
);
239 CFReleaseNull(identifier
);
240 CFReleaseNull(error
);
244 static bool SecTaskGetBooleanValueForEntitlement(SecTaskRef task
,
245 CFStringRef entitlement
) {
246 CFStringRef canModify
= (CFStringRef
)SecTaskCopyValueForEntitlement(task
,
250 CFTypeID canModifyType
= CFGetTypeID(canModify
);
251 bool ok
= (CFBooleanGetTypeID() == canModifyType
) && CFBooleanGetValue((CFBooleanRef
)canModify
);
252 CFRelease(canModify
);
256 static void with_label_and_password(xpc_object_t message
, void (^action
)(CFStringRef label
, CFDataRef password
)) {
257 const char *label_utf8
= xpc_dictionary_get_string(message
, kSecXPCKeyUserLabel
);
259 if (label_utf8
) { // Anything we would do here requires a user label
260 size_t password_length
= 0;
261 const void *password_data
= xpc_dictionary_get_data(message
, kSecXPCKeyUserPassword
, &password_length
);
263 CFDataRef user_password
= CFDataCreateWithBytesNoCopy(kCFAllocatorDefault
, password_data
, password_length
, kCFAllocatorNull
);
264 CFStringRef user_label
= CFStringCreateWithCString(kCFAllocatorDefault
, label_utf8
, kCFStringEncodingUTF8
);
266 action(user_label
, user_password
);
268 CFReleaseNull(user_password
);
269 CFReleaseNull(user_label
);
273 static void with_label_and_password_and_dsid(xpc_object_t message
, void (^action
)(CFStringRef label
, CFDataRef password
, CFStringRef dsid
)) {
274 const char *label_utf8
= xpc_dictionary_get_string(message
, kSecXPCKeyUserLabel
);
276 if (label_utf8
) { // Anything we would do here requires a user label
277 size_t password_length
= 0;
278 const void *password_data
= xpc_dictionary_get_data(message
, kSecXPCKeyUserPassword
, &password_length
);
279 const char *xdsid
= xpc_dictionary_get_string(message
, kSecXPCKeyDSID
);
281 CFDataRef user_password
= CFDataCreateWithBytesNoCopy(kCFAllocatorDefault
, password_data
, password_length
, kCFAllocatorNull
);
282 CFStringRef user_label
= CFStringCreateWithCString(kCFAllocatorDefault
, label_utf8
, kCFStringEncodingUTF8
);
283 CFStringRef dsid
= CFStringCreateWithCString(kCFAllocatorDefault
, xdsid
, kCFStringEncodingUTF8
);
285 action(user_label
, user_password
, dsid
);
288 CFReleaseNull(user_password
);
289 CFReleaseNull(user_label
);
293 static void with_label_and_number(xpc_object_t message
, void (^action
)(CFStringRef label
, uint64_t number
)) {
294 const char *label_utf8
= xpc_dictionary_get_string(message
, kSecXPCKeyViewName
);
295 const int64_t number
= xpc_dictionary_get_int64(message
, kSecXPCKeyViewActionCode
);
296 CFStringRef user_label
= CFStringCreateWithCString(kCFAllocatorDefault
, label_utf8
, kCFStringEncodingUTF8
);
298 action(user_label
, number
);
299 CFReleaseNull(user_label
);
302 static bool SecXPCDictionarySetChainOptional(xpc_object_t message
, const char *key
, SecCertificatePathRef path
, CFErrorRef
*error
) {
305 xpc_object_t xpc_chain
= SecCertificatePathCopyXPCArray(path
, error
);
309 xpc_dictionary_set_value(message
, key
, xpc_chain
);
310 xpc_release(xpc_chain
);
314 static SecCertificateRef
SecXPCDictionaryCopyCertificate(xpc_object_t message
, const char *key
, CFErrorRef
*error
) {
316 const void *bytes
= xpc_dictionary_get_data(message
, key
, &length
);
318 SecCertificateRef certificate
= SecCertificateCreateWithBytes(kCFAllocatorDefault
, bytes
, length
);
321 SecError(errSecDecode
, error
, CFSTR("object for key %s failed to create certificate from data"), key
);
323 SecError(errSecParam
, error
, CFSTR("object for key %s missing"), key
);
328 static bool SecXPCDictionaryCopyCertificates(xpc_object_t message
, const char *key
, CFArrayRef
*certificates
, CFErrorRef
*error
) {
329 xpc_object_t xpc_certificates
= xpc_dictionary_get_value(message
, key
);
330 if (!xpc_certificates
)
331 return SecError(errSecAllocate
, error
, CFSTR("no certs for key %s"), key
);
332 *certificates
= SecCertificateXPCArrayCopyArray(xpc_certificates
, error
);
333 return *certificates
;
336 static bool SecXPCDictionaryCopyCertificatesOptional(xpc_object_t message
, const char *key
, CFArrayRef
*certificates
, CFErrorRef
*error
) {
337 xpc_object_t xpc_certificates
= xpc_dictionary_get_value(message
, key
);
338 if (!xpc_certificates
) {
339 *certificates
= NULL
;
342 *certificates
= SecCertificateXPCArrayCopyArray(xpc_certificates
, error
);
343 return *certificates
;
346 static bool SecXPCDictionaryCopyPoliciesOptional(xpc_object_t message
, const char *key
, CFArrayRef
*policies
, CFErrorRef
*error
) {
347 xpc_object_t xpc_policies
= xpc_dictionary_get_value(message
, key
);
353 *policies
= SecPolicyXPCArrayCopyArray(xpc_policies
, error
);
354 return *policies
!= NULL
;
357 static SecTrustStoreRef
SecXPCDictionaryGetTrustStore(xpc_object_t message
, const char *key
, CFErrorRef
*error
) {
358 SecTrustStoreRef ts
= NULL
;
359 CFStringRef domain
= SecXPCDictionaryCopyString(message
, key
, error
);
361 ts
= SecTrustStoreForDomainName(domain
, error
);
367 static bool SecXPCDictionaryGetDouble(xpc_object_t message
, const char *key
, double *pvalue
, CFErrorRef
*error
) {
368 *pvalue
= xpc_dictionary_get_double(message
, key
);
369 if (*pvalue
== NAN
) {
370 return SecError(errSecParam
, error
, CFSTR("object for key %s bad double"), key
);
375 static CFArrayRef
SecXPCDictionaryCopyPeerInfoArray(xpc_object_t dictionary
, const char *key
, CFErrorRef
*error
) {
376 return CreateArrayOfPeerInfoWithXPCObject(xpc_dictionary_get_value(dictionary
, key
), error
);
379 static CFDataRef
CFDataCreateWithXPCArrayAtIndex(xpc_object_t xpc_data_array
, size_t index
, CFErrorRef
*error
) {
380 CFDataRef data
= NULL
;
382 const uint8_t *bytes
= xpc_array_get_data(xpc_data_array
, index
, &length
);
384 data
= CFDataCreate(kCFAllocatorDefault
, bytes
, length
);
387 SecError(errSecParam
, error
, CFSTR("data_array[%zu] failed to decode"), index
);
392 static CFArrayRef
CFDataXPCArrayCopyArray(xpc_object_t xpc_data_array
, CFErrorRef
*error
) {
393 CFMutableArrayRef data_array
= NULL
;
394 require_action_quiet(xpc_get_type(xpc_data_array
) == XPC_TYPE_ARRAY
, exit
,
395 SecError(errSecParam
, error
, CFSTR("data_array xpc value is not an array")));
396 size_t count
= xpc_array_get_count(xpc_data_array
);
397 require_action_quiet(data_array
= CFArrayCreateMutable(kCFAllocatorDefault
, count
, &kCFTypeArrayCallBacks
), exit
,
398 SecError(errSecAllocate
, error
, CFSTR("failed to create CFArray of capacity %zu"), count
));
401 for (ix
= 0; ix
< count
; ++ix
) {
402 CFDataRef data
= CFDataCreateWithXPCArrayAtIndex(xpc_data_array
, ix
, error
);
404 CFRelease(data_array
);
407 CFArraySetValueAtIndex(data_array
, ix
, data
);
416 static CFDataRef
SecXPCDictionaryCopyCFDataRef(xpc_object_t message
, const char *key
, CFErrorRef
*error
) {
417 CFDataRef retval
= NULL
;
418 const uint8_t *bytes
= NULL
;
421 bytes
= xpc_dictionary_get_data(message
, key
, &len
);
422 require_action_quiet(bytes
, errOut
, SOSCreateError(kSOSErrorBadKey
, CFSTR("missing CFDataRef info"), NULL
, error
));
423 retval
= CFDataCreate(NULL
, bytes
, len
);
424 require_action_quiet(retval
, errOut
, SOSCreateError(kSOSErrorBadKey
, CFSTR("could not allocate CFDataRef info"), NULL
, error
));
429 static bool SecXPCDictionaryCopyCFDataArrayOptional(xpc_object_t message
, const char *key
, CFArrayRef
*data_array
, CFErrorRef
*error
) {
430 xpc_object_t xpc_data_array
= xpc_dictionary_get_value(message
, key
);
431 if (!xpc_data_array
) {
436 *data_array
= CFDataXPCArrayCopyArray(xpc_data_array
, error
);
437 return *data_array
!= NULL
;
440 static CFSetRef
SecXPCSetCreateFromXPCDictionaryElement(xpc_object_t event
, const char *key
) {
441 CFErrorRef error
= NULL
;
442 xpc_object_t object
= xpc_dictionary_get_value(event
, key
);
443 CFSetRef retval
= NULL
;
444 if(object
) retval
= CreateCFSetRefFromXPCObject(object
, &error
);
445 CFReleaseNull(error
);
450 void xpc_dictionary_set_and_consume_CFArray(xpc_object_t xdict
, const char *key
, CF_CONSUMED CFArrayRef cf_array
) {
452 xpc_object_t xpc_array
= _CFXPCCreateXPCObjectFromCFObject(cf_array
);
453 xpc_dictionary_set_value(xdict
, key
, xpc_array
);
454 xpc_release(xpc_array
);
456 CFReleaseNull(cf_array
);
460 bool xpc_dictionary_set_and_consume_PeerInfoArray(xpc_object_t xdict
, const char *key
, CF_CONSUMED CFArrayRef cf_array
, CFErrorRef
*error
) {
463 xpc_object_t xpc_array
= CreateXPCObjectWithArrayOfPeerInfo(cf_array
, error
);
465 xpc_dictionary_set_value(xdict
, key
, xpc_array
);
466 xpc_release(xpc_array
);
471 CFReleaseNull(cf_array
);
476 SecDataCopyMmapFileDescriptor(int fd
, void **mem
, size_t *size
, CFErrorRef
*error
)
479 if (fstat(fd
, &sb
) < 0) {
483 *size
= (size_t)sb
.st_size
;
484 if ((off_t
)*size
!= sb
.st_size
) {
488 *mem
= mmap(NULL
, *size
, PROT_READ
, MAP_SHARED
, fd
, 0);
489 if (*mem
== MAP_FAILED
) {
493 return CFDataCreateWithBytesNoCopy(NULL
, *mem
, *size
, kCFAllocatorNull
);
497 SecDataWriteFileDescriptor(int fd
, CFDataRef data
)
499 CFIndex count
= CFDataGetLength(data
);
500 const uint8_t *ptr
= CFDataGetBytePtr(data
);
501 bool writeResult
= false;
504 ssize_t ret
= write(fd
, ptr
, count
);
517 // Returns error if entitlement isn't present.
519 EntitlementPresentAndTrue(uint64_t op
, SecTaskRef clientTask
, CFStringRef entitlement
, CFErrorRef
*error
)
521 if (!SecTaskGetBooleanValueForEntitlement(clientTask
, entitlement
)) {
522 SecError(errSecMissingEntitlement
, error
, CFSTR("%@: %@ lacks entitlement %@"), SOSCCGetOperationDescription((enum SecXPCOperation
)op
), clientTask
, entitlement
);
528 // Per <rdar://problem/13315020> Disable the entitlement check for "keychain-cloud-circle"
529 // we disable entitlement enforcement. However, we still log so we know who needs the entitlement
531 EntitlementPresentOrWhine(uint64_t op
, SecTaskRef clientTask
, CFStringRef entitlement
, CFErrorRef
*error
)
533 if (!SecTaskGetBooleanValueForEntitlement(clientTask
, entitlement
))
534 secnotice("serverxpc", "%@: %@ lacks entitlement %@", SOSCCGetOperationDescription((enum SecXPCOperation
)op
), clientTask
, entitlement
);
541 EntitlementAbsentOrFalse(uint64_t op
, SecTaskRef clientTask
, CFStringRef entitlement
, CFErrorRef
*error
)
543 if (SecTaskGetBooleanValueForEntitlement(clientTask
, entitlement
)) {
544 SecError(errSecNotAvailable
, error
, CFSTR("%@: %@ has entitlement %@"), SOSCCGetOperationDescription((enum SecXPCOperation
) op
), clientTask
, entitlement
);
550 static void securityd_xpc_dictionary_handler(const xpc_connection_t connection
, xpc_object_t event
) {
551 xpc_type_t type
= xpc_get_type(event
);
552 __block CFErrorRef error
= NULL
;
553 xpc_object_t xpcError
= NULL
;
554 xpc_object_t replyMessage
= NULL
;
555 CFDataRef clientAuditToken
= NULL
;
556 CFArrayRef domains
= NULL
;
557 SecurityClient client
= {
559 .accessGroups
= NULL
,
561 .uid
= xpc_connection_get_euid(connection
),
562 .allowSystemKeychain
= false,
563 .allowSyncBubbleKeychain
= false,
564 .isNetworkExtension
= false,
566 .inMultiUser
= inMultiUser
,
570 secdebug("serverxpc", "entering");
571 if (type
== XPC_TYPE_DICTIONARY
) {
572 // TODO: Find out what we're dispatching.
573 replyMessage
= xpc_dictionary_create_reply(event
);
575 #if TARGET_OS_IOS && !TARGET_OS_SIMULATOR
577 client
.activeUser
= MKBForegroundUserSessionID(&error
);
578 if (client
.activeUser
== -1 || client
.activeUser
== 0) {
580 client
.activeUser
= 0;
584 * If we are a edu mode user, and its not the active user,
585 * then the request is coming from inside the syncbubble.
587 * otherwise we are going to execute the request as the
591 if (client
.uid
> 501 && (uid_t
)client
.activeUser
!= client
.uid
) {
592 secinfo("serverxpc", "securityd client: sync bubble user");
593 client
.musr
= SecMUSRCreateSyncBubbleUserUUID(client
.uid
);
594 client
.keybag
= KEYBAG_DEVICE
;
596 secinfo("serverxpc", "securityd client: active user");
597 client
.musr
= SecMUSRCreateActiveUserUUID(client
.activeUser
);
598 client
.uid
= (uid_t
)client
.activeUser
;
599 client
.keybag
= KEYBAG_DEVICE
;
604 uint64_t operation
= xpc_dictionary_get_uint64(event
, kSecXPCKeyOperation
);
606 audit_token_t auditToken
= {};
607 xpc_connection_get_audit_token(connection
, &auditToken
);
609 client
.task
= SecTaskCreateWithAuditToken(kCFAllocatorDefault
, auditToken
);
610 clientAuditToken
= CFDataCreate(kCFAllocatorDefault
, (const UInt8
*)&auditToken
, sizeof(auditToken
));
612 pthread_setspecific(taskThreadKey
, client
.task
);
614 client
.accessGroups
= SecTaskCopyAccessGroups(client
.task
);
617 if (operation
== sec_add_shared_web_credential_id
|| operation
== sec_copy_shared_web_credential_id
) {
618 domains
= SecTaskCopySharedWebCredentialDomains(client
.task
);
623 client
.allowSystemKeychain
= SecTaskGetBooleanValueForEntitlement(client
.task
, kSecEntitlementPrivateSystemKeychain
);
624 client
.isNetworkExtension
= SecTaskGetBooleanValueForEntitlement(client
.task
, kSecEntitlementPrivateNetworkExtension
);
626 #if TARGET_OS_IPHONE && !TARGET_OS_SIMULATOR
627 if (client
.inMultiUser
) {
628 client
.allowSyncBubbleKeychain
= SecTaskGetBooleanValueForEntitlement(client
.task
, kSecEntitlementPrivateKeychainSyncBubble
);
631 secinfo("serverxpc", "XPC [%@] operation: %@ (%" PRIu64
")", client
.task
, SOSCCGetOperationDescription((enum SecXPCOperation
)operation
), operation
);
637 case sec_item_add_id
:
639 if (EntitlementAbsentOrFalse(sec_item_add_id
, client
.task
, kSecEntitlementKeychainDeny
, &error
)) {
640 CFDictionaryRef query
= SecXPCDictionaryCopyDictionary(event
, kSecXPCKeyQuery
, &error
);
642 CFTypeRef result
= NULL
;
643 if (_SecItemAdd(query
, &client
, &result
, &error
) && result
) {
644 SecXPCDictionarySetPList(replyMessage
, kSecXPCKeyResult
, result
, &error
);
645 CFReleaseNull(result
);
647 CFReleaseNull(query
);
652 case sec_item_copy_matching_id
:
654 if (EntitlementAbsentOrFalse(sec_item_add_id
, client
.task
, kSecEntitlementKeychainDeny
, &error
)) {
655 CFDictionaryRef query
= SecXPCDictionaryCopyDictionary(event
, kSecXPCKeyQuery
, &error
);
657 CFTypeRef result
= NULL
;
658 if (_SecItemCopyMatching(query
, &client
, &result
, &error
) && result
) {
659 SecXPCDictionarySetPList(replyMessage
, kSecXPCKeyResult
, result
, &error
);
660 CFReleaseNull(result
);
662 CFReleaseNull(query
);
667 case sec_item_update_id
:
669 if (EntitlementAbsentOrFalse(sec_item_add_id
, client
.task
, kSecEntitlementKeychainDeny
, &error
)) {
670 CFDictionaryRef query
= SecXPCDictionaryCopyDictionary(event
, kSecXPCKeyQuery
, &error
);
672 CFDictionaryRef attributesToUpdate
= SecXPCDictionaryCopyDictionary(event
, kSecXPCKeyAttributesToUpdate
, &error
);
673 if (attributesToUpdate
) {
674 bool result
= _SecItemUpdate(query
, attributesToUpdate
, &client
, &error
);
675 xpc_dictionary_set_bool(replyMessage
, kSecXPCKeyResult
, result
);
676 CFReleaseNull(attributesToUpdate
);
678 CFReleaseNull(query
);
683 case sec_item_delete_id
:
685 if (EntitlementAbsentOrFalse(sec_item_add_id
, client
.task
, kSecEntitlementKeychainDeny
, &error
)) {
686 CFDictionaryRef query
= SecXPCDictionaryCopyDictionary(event
, kSecXPCKeyQuery
, &error
);
688 bool result
= _SecItemDelete(query
, &client
, &error
);
689 xpc_dictionary_set_bool(replyMessage
, kSecXPCKeyResult
, result
);
690 CFReleaseNull(query
);
695 case sec_item_update_token_items_id
:
697 if (EntitlementAbsentOrFalse(sec_item_add_id
, client
.task
, kSecEntitlementKeychainDeny
, &error
)) {
698 CFStringRef tokenID
= SecXPCDictionaryCopyString(event
, kSecXPCKeyString
, &error
);
699 CFArrayRef attributes
= SecXPCDictionaryCopyArray(event
, kSecXPCKeyQuery
, &error
);
701 bool result
= _SecItemUpdateTokenItems(tokenID
, attributes
, &client
, &error
);
702 xpc_dictionary_set_bool(replyMessage
, kSecXPCKeyResult
, result
);
704 CFReleaseNull(tokenID
);
705 CFReleaseNull(attributes
);
709 case sec_trust_store_contains_id
:
711 SecTrustStoreRef ts
= SecXPCDictionaryGetTrustStore(event
, kSecXPCKeyDomain
, &error
);
713 CFDataRef digest
= SecXPCDictionaryCopyData(event
, kSecXPCKeyDigest
, &error
);
716 if (SecTrustStoreContainsCertificateWithDigest(ts
, digest
, &contains
, &error
))
717 xpc_dictionary_set_bool(replyMessage
, kSecXPCKeyResult
, contains
);
718 CFReleaseNull(digest
);
723 case sec_trust_store_set_trust_settings_id
:
725 if (EntitlementPresentAndTrue(operation
, client
.task
, kSecEntitlementModifyAnchorCertificates
, &error
)) {
726 SecTrustStoreRef ts
= SecXPCDictionaryGetTrustStore(event
, kSecXPCKeyDomain
, &error
);
728 SecCertificateRef certificate
= SecXPCDictionaryCopyCertificate(event
, kSecXPCKeyCertificate
, &error
);
730 CFTypeRef trustSettingsDictOrArray
= NULL
;
731 if (SecXPCDictionaryCopyPListOptional(event
, kSecXPCKeySettings
, &trustSettingsDictOrArray
, &error
)) {
732 bool result
= _SecTrustStoreSetTrustSettings(ts
, certificate
, trustSettingsDictOrArray
, &error
);
733 xpc_dictionary_set_bool(replyMessage
, kSecXPCKeyResult
, result
);
734 CFReleaseSafe(trustSettingsDictOrArray
);
736 CFReleaseNull(certificate
);
742 case sec_trust_store_remove_certificate_id
:
744 if (EntitlementPresentAndTrue(operation
, client
.task
, kSecEntitlementModifyAnchorCertificates
, &error
)) {
745 SecTrustStoreRef ts
= SecXPCDictionaryGetTrustStore(event
, kSecXPCKeyDomain
, &error
);
747 CFDataRef digest
= SecXPCDictionaryCopyData(event
, kSecXPCKeyDigest
, &error
);
749 bool result
= SecTrustStoreRemoveCertificateWithDigest(ts
, digest
, &error
);
750 xpc_dictionary_set_bool(replyMessage
, kSecXPCKeyResult
, result
);
751 CFReleaseNull(digest
);
757 case sec_trust_store_copy_all_id
:
759 if (EntitlementPresentAndTrue(operation
, client
.task
, kSecEntitlementModifyAnchorCertificates
, &error
)) {
760 SecTrustStoreRef ts
= SecXPCDictionaryGetTrustStore(event
, kSecXPCKeyDomain
, &error
);
762 CFArrayRef trustStoreContents
= NULL
;
763 if(_SecTrustStoreCopyAll(ts
, &trustStoreContents
, &error
) && trustStoreContents
) {
764 SecXPCDictionarySetPList(replyMessage
, kSecXPCKeyResult
, trustStoreContents
, &error
);
765 CFReleaseNull(trustStoreContents
);
771 case sec_trust_store_copy_usage_constraints_id
:
773 if (EntitlementPresentAndTrue(operation
, client
.task
, kSecEntitlementModifyAnchorCertificates
, &error
)) {
774 SecTrustStoreRef ts
= SecXPCDictionaryGetTrustStore(event
, kSecXPCKeyDomain
, &error
);
776 CFDataRef digest
= SecXPCDictionaryCopyData(event
, kSecXPCKeyDigest
, &error
);
778 CFArrayRef usageConstraints
= NULL
;
779 if(_SecTrustStoreCopyUsageConstraints(ts
, digest
, &usageConstraints
, &error
) && usageConstraints
) {
780 SecXPCDictionarySetPList(replyMessage
, kSecXPCKeyResult
, usageConstraints
, &error
);
781 CFReleaseNull(usageConstraints
);
783 CFReleaseNull(digest
);
789 case sec_delete_all_id
:
790 xpc_dictionary_set_bool(replyMessage
, kSecXPCKeyResult
, _SecItemDeleteAll(&error
));
792 #endif /* !TRUSTD_SERVER */
793 case sec_trust_evaluate_id
:
795 CFArrayRef certificates
= NULL
, anchors
= NULL
, policies
= NULL
, responses
= NULL
, scts
= NULL
, trustedLogs
= NULL
;
796 bool anchorsOnly
= xpc_dictionary_get_bool(event
, kSecTrustAnchorsOnlyKey
);
797 bool keychainsAllowed
= xpc_dictionary_get_bool(event
, kSecTrustKeychainsAllowedKey
);
799 if (SecXPCDictionaryCopyCertificates(event
, kSecTrustCertificatesKey
, &certificates
, &error
) &&
800 SecXPCDictionaryCopyCertificatesOptional(event
, kSecTrustAnchorsKey
, &anchors
, &error
) &&
801 SecXPCDictionaryCopyPoliciesOptional(event
, kSecTrustPoliciesKey
, &policies
, &error
) &&
802 SecXPCDictionaryCopyCFDataArrayOptional(event
, kSecTrustResponsesKey
, &responses
, &error
) &&
803 SecXPCDictionaryCopyCFDataArrayOptional(event
, kSecTrustSCTsKey
, &scts
, &error
) &&
804 SecXPCDictionaryCopyArrayOptional(event
, kSecTrustTrustedLogsKey
, &trustedLogs
, &error
) &&
805 SecXPCDictionaryGetDouble(event
, kSecTrustVerifyDateKey
, &verifyTime
, &error
)) {
806 // If we have no error yet, capture connection and reply in block and properly retain them.
807 xpc_retain(connection
);
808 CFRetainSafe(client
.task
);
809 CFRetainSafe(clientAuditToken
);
811 // Clear replyMessage so we don't send a synchronous reply.
812 xpc_object_t asyncReply
= replyMessage
;
815 SecTrustServerEvaluateBlock(clientAuditToken
,
816 certificates
, anchors
, anchorsOnly
, keychainsAllowed
, policies
, responses
, scts
, trustedLogs
, verifyTime
, client
.accessGroups
,
817 ^(SecTrustResultType tr
, CFArrayRef details
, CFDictionaryRef info
, SecCertificatePathRef chain
, CFErrorRef replyError
) {
818 // Send back reply now
820 CFRetain(replyError
);
822 xpc_dictionary_set_int64(asyncReply
, kSecTrustResultKey
, tr
);
823 SecXPCDictionarySetPListOptional(asyncReply
, kSecTrustDetailsKey
, details
, &replyError
) &&
824 SecXPCDictionarySetPListOptional(asyncReply
, kSecTrustInfoKey
, info
, &replyError
) &&
825 SecXPCDictionarySetChainOptional(asyncReply
, kSecTrustChainKey
, chain
, &replyError
);
828 secdebug("ipc", "%@ %@ %@", client
.task
, SOSCCGetOperationDescription((enum SecXPCOperation
)operation
), replyError
);
829 xpc_object_t xpcReplyError
= SecCreateXPCObjectWithCFError(replyError
);
831 xpc_dictionary_set_value(asyncReply
, kSecXPCKeyError
, xpcReplyError
);
832 xpc_release(xpcReplyError
);
834 CFReleaseNull(replyError
);
836 secdebug("ipc", "%@ %@ responding %@", client
.task
, SOSCCGetOperationDescription((enum SecXPCOperation
)operation
), asyncReply
);
839 xpc_connection_send_message(connection
, asyncReply
);
840 xpc_release(asyncReply
);
841 xpc_release(connection
);
842 CFReleaseSafe(client
.task
);
843 CFReleaseSafe(clientAuditToken
);
846 CFReleaseSafe(policies
);
847 CFReleaseSafe(anchors
);
848 CFReleaseSafe(certificates
);
849 CFReleaseSafe(responses
);
851 CFReleaseSafe(trustedLogs
);
855 case sec_keychain_backup_id
:
857 if (EntitlementPresentAndTrue(operation
, client
.task
, kSecEntitlementRestoreKeychain
, &error
)) {
858 CFDataRef keybag
= NULL
, passcode
= NULL
;
859 if (SecXPCDictionaryCopyDataOptional(event
, kSecXPCKeyKeybag
, &keybag
, &error
)) {
860 if (SecXPCDictionaryCopyDataOptional(event
, kSecXPCKeyUserPassword
, &passcode
, &error
)) {
861 CFDataRef backup
= _SecServerKeychainCreateBackup(&client
, keybag
, passcode
, &error
);
863 int fd
= SecXPCDictionaryDupFileDescriptor(event
, kSecXPCKeyFileDescriptor
, NULL
);
865 SecXPCDictionarySetData(replyMessage
, kSecXPCKeyResult
, backup
, &error
);
867 bool writeResult
= SecDataWriteFileDescriptor(fd
, backup
);
871 SecError(errSecIO
, &error
, CFSTR("Failed to write backup file: %d"), errno
);
872 SecXPCDictionarySetBool(replyMessage
, kSecXPCKeyResult
, writeResult
, NULL
);
876 CFReleaseSafe(passcode
);
878 CFReleaseSafe(keybag
);
883 case sec_keychain_restore_id
:
885 if (EntitlementPresentAndTrue(operation
, client
.task
, kSecEntitlementRestoreKeychain
, &error
)) {
886 CFDataRef backup
= NULL
;
890 int fd
= SecXPCDictionaryDupFileDescriptor(event
, kSecXPCKeyFileDescriptor
, NULL
);
892 backup
= SecDataCopyMmapFileDescriptor(fd
, &mem
, &size
, &error
);
894 backup
= SecXPCDictionaryCopyData(event
, kSecXPCKeyBackup
, &error
);
897 CFDataRef keybag
= SecXPCDictionaryCopyData(event
, kSecXPCKeyKeybag
, &error
);
899 CFDataRef passcode
= NULL
;
900 if (SecXPCDictionaryCopyDataOptional(event
, kSecXPCKeyUserPassword
, &passcode
, &error
)) {
901 bool result
= _SecServerKeychainRestore(backup
, &client
, keybag
, passcode
, &error
);
902 xpc_dictionary_set_bool(replyMessage
, kSecXPCKeyResult
, result
);
903 CFReleaseSafe(passcode
);
906 CFReleaseNull(keybag
);
908 CFReleaseNull(backup
);
917 case sec_keychain_backup_keybag_uuid_id
:
919 if (EntitlementPresentAndTrue(operation
, client
.task
, kSecEntitlementRestoreKeychain
, &error
)) {
920 CFDataRef backup
= NULL
;
921 CFStringRef uuid
= NULL
;
925 int fd
= SecXPCDictionaryDupFileDescriptor(event
, kSecXPCKeyFileDescriptor
, NULL
);
927 backup
= SecDataCopyMmapFileDescriptor(fd
, &mem
, &size
, &error
);
929 uuid
= _SecServerBackupCopyUUID(backup
, &error
);
932 SecXPCDictionarySetString(replyMessage
, kSecXPCKeyResult
, uuid
, &error
);
934 CFReleaseNull(backup
);
944 case sec_keychain_sync_update_message_id
:
946 CFDictionaryRef updates
= SecXPCDictionaryCopyDictionary(event
, kSecXPCKeyQuery
, &error
);
948 CFArrayRef result
= _SecServerKeychainSyncUpdateMessage(updates
, &error
);
949 SecXPCDictionarySetPList(replyMessage
, kSecXPCKeyResult
, result
, &error
);
950 CFReleaseNull(result
);
952 CFReleaseNull(updates
);
955 case sec_keychain_backup_syncable_id
:
957 if (EntitlementPresentAndTrue(operation
, client
.task
, kSecEntitlementRestoreKeychain
, &error
)) {
958 CFDictionaryRef oldbackup
= NULL
;
959 if (SecXPCDictionaryCopyDictionaryOptional(event
, kSecXPCKeyBackup
, &oldbackup
, &error
)) {
960 CFDataRef keybag
= SecXPCDictionaryCopyData(event
, kSecXPCKeyKeybag
, &error
);
962 CFDataRef passcode
= NULL
;
963 if (SecXPCDictionaryCopyDataOptional(event
, kSecXPCKeyUserPassword
, &passcode
, &error
)) {
964 CFDictionaryRef newbackup
= _SecServerBackupSyncable(oldbackup
, keybag
, passcode
, &error
);
966 SecXPCDictionarySetPList(replyMessage
, kSecXPCKeyResult
, newbackup
, &error
);
967 CFRelease(newbackup
);
969 CFReleaseSafe(passcode
);
971 CFReleaseNull(keybag
);
973 CFReleaseSafe(oldbackup
);
978 case sec_keychain_restore_syncable_id
:
980 if (EntitlementPresentAndTrue(operation
, client
.task
, kSecEntitlementRestoreKeychain
, &error
)) {
981 CFDictionaryRef backup
= SecXPCDictionaryCopyDictionary(event
, kSecXPCKeyBackup
, &error
);
983 CFDataRef keybag
= SecXPCDictionaryCopyData(event
, kSecXPCKeyKeybag
, &error
);
985 CFDataRef passcode
= NULL
;
986 if (SecXPCDictionaryCopyDataOptional(event
, kSecXPCKeyUserPassword
, &passcode
, &error
)) {
987 bool result
= _SecServerRestoreSyncable(backup
, keybag
, passcode
, &error
);
988 xpc_dictionary_set_bool(replyMessage
, kSecXPCKeyResult
, result
);
989 CFReleaseSafe(passcode
);
991 CFReleaseNull(keybag
);
993 CFReleaseNull(backup
);
998 case sec_item_backup_copy_names_id
:
1000 if (EntitlementPresentAndTrue(operation
, client
.task
, kSecEntitlementRestoreKeychain
, &error
)) {
1001 CFArrayRef names
= SecServerItemBackupCopyNames(&error
);
1002 SecXPCDictionarySetPListOptional(replyMessage
, kSecXPCKeyResult
, names
, &error
);
1003 CFReleaseSafe(names
);
1007 case sec_item_backup_handoff_fd_id
:
1009 if (EntitlementPresentAndTrue(operation
, client
.task
, kSecEntitlementRestoreKeychain
, &error
)) {
1010 CFStringRef backupName
= SecXPCDictionaryCopyString(event
, kSecXPCKeyBackup
, &error
);
1013 fd
= SecServerItemBackupHandoffFD(backupName
, &error
);
1014 CFRelease(backupName
);
1016 SecXPCDictionarySetFileDescriptor(replyMessage
, kSecXPCKeyResult
, fd
, &error
);
1022 case sec_item_backup_set_confirmed_manifest_id
:
1024 if (EntitlementPresentAndTrue(operation
, client
.task
, kSecEntitlementRestoreKeychain
, &error
)) {
1025 CFDataRef keybagDigest
= NULL
;
1026 if (SecXPCDictionaryCopyDataOptional(event
, kSecXPCKeyKeybag
, &keybagDigest
, &error
)) {
1027 CFDataRef manifest
= NULL
;
1028 if (SecXPCDictionaryCopyDataOptional(event
, kSecXPCData
, &manifest
, &error
)) {
1029 CFStringRef backupName
= SecXPCDictionaryCopyString(event
, kSecXPCKeyBackup
, &error
);
1031 bool result
= SecServerItemBackupSetConfirmedManifest(backupName
, keybagDigest
, manifest
, &error
);
1032 CFRelease(backupName
);
1033 xpc_dictionary_set_bool(replyMessage
, kSecXPCKeyResult
, result
);
1035 CFReleaseSafe(manifest
);
1038 CFReleaseNull(keybagDigest
);
1042 case sec_item_backup_restore_id
:
1044 if (EntitlementPresentAndTrue(operation
, client
.task
, kSecEntitlementRestoreKeychain
, &error
)) {
1045 bool result
= false;
1046 CFStringRef backupName
= SecXPCDictionaryCopyString(event
, kSecXPCKeyBackup
, &error
);
1048 CFStringRef peerID
= NULL
;
1049 if (SecXPCDictionaryCopyStringOptional(event
, kSecXPCKeyDigest
, &peerID
, &error
)) {
1050 CFDataRef keybag
= SecXPCDictionaryCopyData(event
, kSecXPCKeyKeybag
, &error
);
1052 CFDataRef secret
= SecXPCDictionaryCopyData(event
, kSecXPCKeyUserPassword
, &error
);
1054 CFDataRef backup
= SecXPCDictionaryCopyData(event
, kSecXPCData
, &error
);
1056 result
= SecServerItemBackupRestore(backupName
, peerID
, keybag
, secret
, backup
, &error
);
1063 CFReleaseSafe(peerID
);
1065 CFRelease(backupName
);
1067 xpc_dictionary_set_bool(replyMessage
, kSecXPCKeyResult
, result
);
1071 case sec_ota_pki_asset_version_id
:
1073 xpc_dictionary_set_int64(replyMessage
, kSecXPCKeyResult
,
1074 SecOTAPKIGetCurrentAssetVersion(&error
));
1077 case sec_add_shared_web_credential_id
:
1080 CFDictionaryRef query
= SecXPCDictionaryCopyDictionary(event
, kSecXPCKeyQuery
, &error
);
1082 CFTypeRef result
= NULL
;
1084 CFStringRef appID
= (client
.task
) ? SecTaskCopyApplicationIdentifier(client
.task
) : NULL
;
1085 if (_SecAddSharedWebCredential(query
, &client
, &auditToken
, appID
, domains
, &result
, &error
) && result
) {
1086 SecXPCDictionarySetPList(replyMessage
, kSecXPCKeyResult
, result
, &error
);
1087 CFReleaseNull(result
);
1089 CFReleaseSafe(appID
);
1090 CFReleaseNull(query
);
1093 SecXPCDictionarySetPList(replyMessage
, kSecXPCKeyResult
, kCFBooleanFalse
, &error
);
1097 case sec_copy_shared_web_credential_id
:
1100 CFDictionaryRef query
= SecXPCDictionaryCopyDictionary(event
, kSecXPCKeyQuery
, &error
);
1102 CFTypeRef result
= NULL
;
1103 CFStringRef appID
= (client
.task
) ? SecTaskCopyApplicationIdentifier(client
.task
) : NULL
;
1104 if (_SecCopySharedWebCredential(query
, &client
, &auditToken
, appID
, domains
, &result
, &error
) && result
) {
1105 SecXPCDictionarySetPList(replyMessage
, kSecXPCKeyResult
, result
, &error
);
1106 CFReleaseNull(result
);
1108 CFReleaseSafe(appID
);
1109 CFReleaseNull(query
);
1112 SecXPCDictionarySetPList(replyMessage
, kSecXPCKeyResult
, kCFBooleanFalse
, &error
);
1116 case sec_get_log_settings_id
:
1118 CFPropertyListRef currentList
= SecCopyLogSettings_Server(&error
);
1120 SecXPCDictionarySetPList(replyMessage
, kSecXPCKeyResult
, currentList
, &error
);
1122 CFReleaseSafe(currentList
);
1125 case sec_set_xpc_log_settings_id
:
1127 CFPropertyListRef newSettings
= SecXPCDictionaryCopyPList(event
, kSecXPCKeyQuery
, &error
);
1129 SecSetXPCLogSettings_Server(newSettings
, &error
);
1131 xpc_dictionary_set_bool(replyMessage
, kSecXPCKeyResult
, true);
1132 CFReleaseNull(newSettings
);
1135 case sec_set_circle_log_settings_id
:
1137 CFPropertyListRef newSettings
= SecXPCDictionaryCopyPList(event
, kSecXPCKeyQuery
, &error
);
1139 SecSetCircleLogSettings_Server(newSettings
, &error
);
1141 xpc_dictionary_set_bool(replyMessage
, kSecXPCKeyResult
, true);
1142 CFReleaseNull(newSettings
);
1145 case sec_otr_session_create_remote_id
:
1147 CFDataRef publicPeerId
= NULL
;
1148 if (SecXPCDictionaryCopyDataOptional(event
, kSecXPCPublicPeerId
, &publicPeerId
, &error
)) {
1149 CFDataRef otrSession
= _SecOTRSessionCreateRemote(publicPeerId
, &error
);
1151 SecXPCDictionarySetData(replyMessage
, kSecXPCKeyResult
, otrSession
, &error
);
1152 CFReleaseNull(otrSession
);
1154 CFReleaseSafe(publicPeerId
);
1158 case sec_otr_session_process_packet_remote_id
:
1160 CFDataRef sessionData
= NULL
, inputPacket
= NULL
, outputSessionData
= NULL
, outputPacket
= NULL
;
1161 bool readyForMessages
= false;
1162 if (SecXPCDictionaryCopyDataOptional(event
, kSecXPCOTRSession
, &sessionData
, &error
)) {
1163 if (SecXPCDictionaryCopyDataOptional(event
, kSecXPCData
, &inputPacket
, &error
)) {
1164 bool result
= _SecOTRSessionProcessPacketRemote(sessionData
, inputPacket
, &outputSessionData
, &outputPacket
, &readyForMessages
, &error
);
1166 SecXPCDictionarySetData(replyMessage
, kSecXPCOTRSession
, outputSessionData
, &error
);
1167 SecXPCDictionarySetData(replyMessage
, kSecXPCData
, outputPacket
, &error
);
1168 xpc_dictionary_set_bool(replyMessage
, kSecXPCOTRReady
, readyForMessages
);
1169 CFReleaseNull(outputSessionData
);
1170 CFReleaseNull(outputPacket
);
1172 xpc_dictionary_set_bool(replyMessage
, kSecXPCKeyResult
, result
);
1174 CFReleaseSafe(inputPacket
);
1176 CFReleaseSafe(sessionData
);
1180 case kSecXPCOpTryUserCredentials
:
1181 if (EntitlementPresentOrWhine(operation
, client
.task
, kSecEntitlementKeychainCloudCircle
, &error
)) {
1182 with_label_and_password(event
, ^(CFStringRef label
, CFDataRef password
) {
1183 xpc_dictionary_set_bool(replyMessage
, kSecXPCKeyResult
,
1184 SOSCCTryUserCredentials_Server(label
, password
, &error
));
1188 case kSecXPCOpSetUserCredentials
:
1189 if (EntitlementPresentOrWhine(operation
, client
.task
, kSecEntitlementKeychainCloudCircle
, &error
)) {
1190 with_label_and_password(event
, ^(CFStringRef label
, CFDataRef password
) {
1191 xpc_dictionary_set_bool(replyMessage
, kSecXPCKeyResult
,
1192 SOSCCSetUserCredentials_Server(label
, password
, &error
));
1196 case kSecXPCOpSetUserCredentialsAndDSID
:
1197 if (EntitlementPresentOrWhine(operation
, client
.task
, kSecEntitlementKeychainCloudCircle
, &error
)) {
1198 with_label_and_password_and_dsid(event
, ^(CFStringRef label
, CFDataRef password
, CFStringRef dsid
) {
1199 xpc_dictionary_set_bool(replyMessage
, kSecXPCKeyResult
,
1200 SOSCCSetUserCredentialsAndDSID_Server(label
, password
, dsid
, &error
));
1205 if (EntitlementPresentOrWhine(operation
, client
.task
, kSecEntitlementKeychainCloudCircle
, &error
)) {
1206 with_label_and_number(event
, ^(CFStringRef view
, uint64_t actionCode
) {
1207 xpc_dictionary_set_int64(replyMessage
, kSecXPCKeyResult
,
1208 SOSCCView_Server(view
, (SOSViewActionCode
)actionCode
, &error
));
1212 case kSecXPCOpViewSet
:
1213 if (EntitlementPresentOrWhine(operation
, client
.task
, kSecEntitlementKeychainCloudCircle
, &error
)) {
1214 CFSetRef enabledViews
= SecXPCSetCreateFromXPCDictionaryElement(event
, kSecXPCKeyEnabledViewsKey
);
1215 CFSetRef disabledViews
= SecXPCSetCreateFromXPCDictionaryElement(event
, kSecXPCKeyDisabledViewsKey
);
1216 xpc_dictionary_set_bool(replyMessage
, kSecXPCKeyResult
, SOSCCViewSet_Server(enabledViews
, disabledViews
));
1217 CFReleaseNull(enabledViews
);
1218 CFReleaseNull(disabledViews
);
1221 case kSecXPCOpSecurityProperty
:
1222 if (EntitlementPresentOrWhine(operation
, client
.task
, kSecEntitlementKeychainCloudCircle
, &error
)) {
1223 with_label_and_number(event
, ^(CFStringRef property
, uint64_t actionCode
) {
1224 xpc_dictionary_set_int64(replyMessage
, kSecXPCKeyResult
,
1225 SOSCCSecurityProperty_Server(property
, (SOSSecurityPropertyActionCode
)actionCode
, &error
));
1229 case kSecXPCOpCanAuthenticate
:
1230 if (EntitlementPresentOrWhine(operation
, client
.task
, kSecEntitlementKeychainCloudCircle
, &error
)) {
1231 xpc_dictionary_set_bool(replyMessage
, kSecXPCKeyResult
,
1232 SOSCCCanAuthenticate_Server(&error
));
1235 case kSecXPCOpPurgeUserCredentials
:
1236 if (EntitlementPresentOrWhine(operation
, client
.task
, kSecEntitlementKeychainCloudCircle
, &error
)) {
1237 xpc_dictionary_set_bool(replyMessage
, kSecXPCKeyResult
,
1238 SOSCCPurgeUserCredentials_Server(&error
));
1241 case kSecXPCOpDeviceInCircle
:
1242 if (EntitlementPresentOrWhine(operation
, client
.task
, kSecEntitlementKeychainCloudCircle
, &error
)) {
1243 xpc_dictionary_set_int64(replyMessage
, kSecXPCKeyResult
,
1244 SOSCCThisDeviceIsInCircle_Server(&error
));
1247 case kSecXPCOpRequestToJoin
:
1248 if (EntitlementPresentOrWhine(operation
, client
.task
, kSecEntitlementKeychainCloudCircle
, &error
)) {
1249 xpc_dictionary_set_bool(replyMessage
, kSecXPCKeyResult
,
1250 SOSCCRequestToJoinCircle_Server(&error
));
1253 case kSecXPCOpAccountHasPublicKey
:
1254 if (EntitlementPresentOrWhine(operation
, client
.task
, kSecEntitlementKeychainCloudCircle
, &error
)) {
1255 xpc_dictionary_set_bool(replyMessage
, kSecXPCKeyResult
,
1256 SOSCCAccountHasPublicKey_Server(&error
));
1259 case kSecXPCOpAccountIsNew
:
1260 if (EntitlementPresentOrWhine(operation
, client
.task
, kSecEntitlementKeychainCloudCircle
, &error
)) {
1261 xpc_dictionary_set_bool(replyMessage
, kSecXPCKeyResult
,
1262 SOSCCAccountIsNew_Server(&error
));
1265 case kSecXPCOpRequestToJoinAfterRestore
:
1266 if (EntitlementPresentOrWhine(operation
, client
.task
, kSecEntitlementKeychainCloudCircle
, &error
)) {
1267 xpc_dictionary_set_bool(replyMessage
, kSecXPCKeyResult
,
1268 SOSCCRequestToJoinCircleAfterRestore_Server(&error
));
1271 case kSecXPCOpRequestEnsureFreshParameters
:
1272 if (EntitlementPresentOrWhine(operation
, client
.task
, kSecEntitlementKeychainCloudCircle
, &error
)) {
1273 xpc_dictionary_set_bool(replyMessage
, kSecXPCKeyResult
,
1274 SOSCCRequestEnsureFreshParameters_Server(&error
));
1277 case kSecXPCOpGetAllTheRings
:
1278 if (EntitlementPresentOrWhine(operation
, client
.task
, kSecEntitlementKeychainCloudCircle
, &error
)) {
1279 CFStringRef ringDescriptions
= SOSCCGetAllTheRings_Server(&error
);
1280 xpc_object_t xpc_dictionary
= _CFXPCCreateXPCObjectFromCFObject(ringDescriptions
);
1281 xpc_dictionary_set_value(replyMessage
, kSecXPCKeyResult
, xpc_dictionary
);
1282 xpc_release(xpc_dictionary
);
1285 case kSecXPCOpApplyToARing
:
1286 if (EntitlementPresentOrWhine(operation
, client
.task
, kSecEntitlementKeychainCloudCircle
, &error
)) {
1287 CFStringRef ringName
= SecXPCDictionaryCopyString(event
, kSecXPCKeyString
, &error
);
1288 xpc_dictionary_set_bool(replyMessage
, kSecXPCKeyResult
, SOSCCApplyToARing_Server(ringName
, &error
));
1289 CFReleaseNull(ringName
);
1292 case kSecXPCOpWithdrawlFromARing
:
1293 if (EntitlementPresentOrWhine(operation
, client
.task
, kSecEntitlementKeychainCloudCircle
, &error
)) {
1294 CFStringRef ringName
= SecXPCDictionaryCopyString(event
, kSecXPCKeyString
, &error
);
1295 xpc_dictionary_set_bool(replyMessage
, kSecXPCKeyResult
, SOSCCWithdrawlFromARing_Server(ringName
, &error
));
1296 CFReleaseNull(ringName
);
1299 case kSecXPCOpRingStatus
:
1300 if (EntitlementPresentOrWhine(operation
, client
.task
, kSecEntitlementKeychainCloudCircle
, &error
)) {
1301 CFStringRef ringName
= SecXPCDictionaryCopyString(event
, kSecXPCKeyString
, &error
);
1302 xpc_dictionary_set_bool(replyMessage
, kSecXPCKeyResult
, SOSCCRingStatus_Server(ringName
, &error
));
1303 CFReleaseNull(ringName
);
1306 case kSecXPCOpEnableRing
:
1307 if (EntitlementPresentOrWhine(operation
, client
.task
, kSecEntitlementKeychainCloudCircle
, &error
)) {
1308 CFStringRef ringName
= SecXPCDictionaryCopyString(event
, kSecXPCKeyString
, &error
);
1309 xpc_dictionary_set_bool(replyMessage
, kSecXPCKeyResult
, SOSCCEnableRing_Server(ringName
, &error
));
1310 CFReleaseNull(ringName
);
1313 case kSecXPCOpRequestDeviceID
:
1314 if (EntitlementPresentOrWhine(operation
, client
.task
, kSecEntitlementKeychainCloudCircle
, &error
)) {
1315 CFStringRef deviceID
= SOSCCCopyDeviceID_Server(&error
);
1317 SecXPCDictionarySetString(replyMessage
, kSecXPCKeyResult
, deviceID
, &error
);
1319 CFReleaseNull(deviceID
);
1322 case kSecXPCOpSetDeviceID
:
1323 if (EntitlementPresentOrWhine(operation
, client
.task
, kSecEntitlementKeychainCloudCircle
, &error
)) {
1324 CFStringRef IDS
= SecXPCDictionaryCopyString(event
, kSecXPCKeyDeviceID
, &error
);
1325 xpc_dictionary_set_bool(replyMessage
, kSecXPCKeyResult
, SOSCCSetDeviceID_Server(IDS
, &error
));
1329 case kSecXPCOpHandleIDSMessage
:
1330 if (EntitlementPresentOrWhine(operation
, client
.task
, kSecEntitlementKeychainCloudCircle
, &error
)) {
1331 CFDictionaryRef IDS
= SecXPCDictionaryCopyDictionary(event
, kSecXPCKeyIDSMessage
, &error
);
1332 xpc_dictionary_set_int64(replyMessage
, kSecXPCKeyResult
, SOSCCHandleIDSMessage_Server(IDS
, &error
));
1337 case kSecXPCOpSendIDSMessage
:
1338 if (EntitlementPresentOrWhine(operation
, client
.task
, kSecEntitlementKeychainCloudCircle
, &error
)) {
1339 CFStringRef message
= SecXPCDictionaryCopyString(event
, kSecXPCKeySendIDSMessage
, &error
);
1340 xpc_dictionary_set_bool(replyMessage
, kSecXPCKeyResult
, SOSCCIDSServiceRegistrationTest_Server(message
, &error
));
1341 CFReleaseNull(message
);
1344 case kSecXPCOpSyncWithKVSPeer
:
1345 if (EntitlementPresentOrWhine(operation
, client
.task
, kSecEntitlementKeychainCloudCircle
, &error
)) {
1346 CFStringRef peerID
= SecXPCDictionaryCopyString(event
, kSecXPCKeyDeviceID
, &error
);
1347 xpc_dictionary_set_bool(replyMessage
, kSecXPCKeyResult
, SOSCCRequestSyncWithPeerOverKVS(peerID
, &error
));
1348 CFReleaseNull(peerID
);
1351 case kSecXPCOpSyncWithIDSPeer
:
1352 if (EntitlementPresentOrWhine(operation
, client
.task
, kSecEntitlementKeychainCloudCircle
, &error
)) {
1353 CFStringRef deviceID
= SecXPCDictionaryCopyString(event
, kSecXPCKeyDeviceID
, &error
);
1354 xpc_dictionary_set_bool(replyMessage
, kSecXPCKeyResult
, SOSCCRequestSyncWithPeerOverIDS(deviceID
, &error
));
1355 CFReleaseNull(deviceID
);
1358 case kSecXPCOpPingTest
:
1359 if (EntitlementPresentOrWhine(operation
, client
.task
, kSecEntitlementKeychainCloudCircle
, &error
)) {
1360 CFStringRef message
= SecXPCDictionaryCopyString(event
, kSecXPCKeySendIDSMessage
, &error
);
1361 xpc_dictionary_set_bool(replyMessage
, kSecXPCKeyResult
, SOSCCIDSPingTest_Server(message
, &error
));
1362 CFReleaseNull(message
);
1365 case kSecXPCOpIDSDeviceID
:
1366 if (EntitlementPresentOrWhine(operation
, client
.task
, kSecEntitlementKeychainCloudCircle
, &error
)) {
1367 xpc_dictionary_set_bool(replyMessage
, kSecXPCKeyResult
, SOSCCIDSDeviceIDIsAvailableTest_Server(&error
));
1370 case kSecXPCOpAccountSetToNew
:
1371 if (EntitlementPresentOrWhine(operation
, client
.task
, kSecEntitlementKeychainCloudCircle
, &error
)) {
1372 xpc_dictionary_set_bool(replyMessage
, kSecXPCKeyResult
, SOSCCAccountSetToNew_Server(&error
));
1375 case kSecXPCOpResetToOffering
:
1376 if (EntitlementPresentOrWhine(operation
, client
.task
, kSecEntitlementKeychainCloudCircle
, &error
)) {
1377 xpc_dictionary_set_bool(replyMessage
, kSecXPCKeyResult
,
1378 SOSCCResetToOffering_Server(&error
));
1381 case kSecXPCOpResetToEmpty
:
1382 if (EntitlementPresentOrWhine(operation
, client
.task
, kSecEntitlementKeychainCloudCircle
, &error
)) {
1383 xpc_dictionary_set_bool(replyMessage
, kSecXPCKeyResult
,
1384 SOSCCResetToEmpty_Server(&error
));
1387 case kSecXPCOpRemoveThisDeviceFromCircle
:
1388 if (EntitlementPresentOrWhine(operation
, client
.task
, kSecEntitlementKeychainCloudCircle
, &error
)) {
1389 xpc_dictionary_set_bool(replyMessage
, kSecXPCKeyResult
,
1390 SOSCCRemoveThisDeviceFromCircle_Server(&error
));
1393 case kSecXPCOpRemovePeersFromCircle
:
1394 if (EntitlementPresentOrWhine(operation
, client
.task
, kSecEntitlementKeychainCloudCircle
, &error
)) {
1395 CFArrayRef applicants
= SecXPCDictionaryCopyPeerInfoArray(event
, kSecXPCKeyPeerInfos
, &error
);
1396 xpc_dictionary_set_bool(replyMessage
, kSecXPCKeyResult
,
1397 SOSCCRemovePeersFromCircle_Server(applicants
, &error
));
1398 CFReleaseNull(applicants
);
1401 case kSecXPCOpLoggedOutOfAccount
:
1402 if (EntitlementPresentOrWhine(operation
, client
.task
, kSecEntitlementKeychainCloudCircle
, &error
)) {
1403 xpc_dictionary_set_bool(replyMessage
, kSecXPCKeyResult
,
1404 SOSCCLoggedOutOfAccount_Server(&error
));
1407 case kSecXPCOpBailFromCircle
:
1408 if (EntitlementPresentOrWhine(operation
, client
.task
, kSecEntitlementKeychainCloudCircle
, &error
)) {
1409 uint64_t limit_in_seconds
= xpc_dictionary_get_uint64(event
, kSecXPCLimitInMinutes
);
1410 xpc_dictionary_set_bool(replyMessage
, kSecXPCKeyResult
,
1411 SOSCCBailFromCircle_Server(limit_in_seconds
, &error
));
1414 case kSecXPCOpAcceptApplicants
:
1415 if (EntitlementPresentOrWhine(operation
, client
.task
, kSecEntitlementKeychainCloudCircle
, &error
)) {
1416 xpc_object_t xapplicants
= xpc_dictionary_get_value(event
, kSecXPCKeyPeerInfos
);
1417 CFArrayRef applicants
= CreateArrayOfPeerInfoWithXPCObject(xapplicants
, &error
); //(CFArrayRef)(_CFXPCCreateCFObjectFromXPCObject(xapplicants));
1418 xpc_dictionary_set_bool(replyMessage
, kSecXPCKeyResult
,
1419 (applicants
&& SOSCCAcceptApplicants_Server(applicants
, &error
)));
1420 CFReleaseSafe(applicants
);
1423 case kSecXPCOpRejectApplicants
:
1424 if (EntitlementPresentOrWhine(operation
, client
.task
, kSecEntitlementKeychainCloudCircle
, &error
)) {
1425 xpc_object_t xapplicants
= xpc_dictionary_get_value(event
, kSecXPCKeyPeerInfos
);
1426 CFArrayRef applicants
= CreateArrayOfPeerInfoWithXPCObject(xapplicants
, &error
); //(CFArrayRef)(_CFXPCCreateCFObjectFromXPCObject(xapplicants));
1427 xpc_dictionary_set_bool(replyMessage
, kSecXPCKeyResult
,
1428 (applicants
&& SOSCCRejectApplicants_Server(applicants
, &error
)));
1429 CFReleaseSafe(applicants
);
1432 case kSecXPCOpSetNewPublicBackupKey
:
1434 if (EntitlementPresentAndTrue(operation
, client
.task
, kSecEntitlementRestoreKeychain
, &error
)) {
1435 CFDataRef publicBackupKey
= SecXPCDictionaryCopyData(event
, kSecXPCKeyNewPublicBackupKey
, &error
);
1436 SOSPeerInfoRef peerInfo
= SOSCCSetNewPublicBackupKey_Server(publicBackupKey
, &error
);
1437 CFDataRef peerInfoData
= peerInfo
? SOSPeerInfoCopyEncodedData(peerInfo
, kCFAllocatorDefault
, &error
) : NULL
;
1438 CFReleaseNull(peerInfo
);
1440 xpc_object_t xpc_object
= _CFXPCCreateXPCObjectFromCFObject(peerInfoData
);
1441 xpc_dictionary_set_value(replyMessage
, kSecXPCKeyResult
, xpc_object
);
1442 xpc_release(xpc_object
);
1444 CFReleaseNull(peerInfoData
);
1445 CFReleaseSafe(publicBackupKey
);
1450 case kSecXPCOpSetBagForAllSlices
:
1452 if (EntitlementPresentAndTrue(operation
, client
.task
, kSecEntitlementRestoreKeychain
, &error
)) {
1453 CFDataRef backupSlice
= SecXPCDictionaryCopyData(event
, kSecXPCKeyKeybag
, &error
);
1454 bool includeV0
= xpc_dictionary_get_bool(event
, kSecXPCKeyIncludeV0
);
1455 xpc_dictionary_set_bool(replyMessage
, kSecXPCKeyResult
, backupSlice
&& SOSCCRegisterSingleRecoverySecret_Server(backupSlice
, includeV0
, &error
));
1456 CFReleaseSafe(backupSlice
);
1460 case kSecXPCOpCopyApplicantPeerInfo
:
1461 if (EntitlementPresentOrWhine(operation
, client
.task
, kSecEntitlementKeychainCloudCircle
, &error
)) {
1462 xpc_dictionary_set_and_consume_PeerInfoArray(replyMessage
, kSecXPCKeyResult
,
1463 SOSCCCopyApplicantPeerInfo_Server(&error
),
1467 case kSecXPCOpCopyValidPeerPeerInfo
:
1468 if (EntitlementPresentOrWhine(operation
, client
.task
, kSecEntitlementKeychainCloudCircle
, &error
)) {
1469 xpc_dictionary_set_and_consume_PeerInfoArray(replyMessage
, kSecXPCKeyResult
,
1470 SOSCCCopyValidPeerPeerInfo_Server(&error
),
1474 case kSecXPCOpValidateUserPublic
:
1475 if (EntitlementPresentOrWhine(operation
, client
.task
, kSecEntitlementKeychainCloudCircle
, &error
)) {
1476 bool trusted
= SOSCCValidateUserPublic_Server(&error
);
1477 xpc_dictionary_set_bool(replyMessage
, kSecXPCKeyResult
, trusted
);
1480 case kSecXPCOpCopyNotValidPeerPeerInfo
:
1481 if (EntitlementPresentOrWhine(operation
, client
.task
, kSecEntitlementKeychainCloudCircle
, &error
)) {
1482 xpc_dictionary_set_and_consume_PeerInfoArray(replyMessage
, kSecXPCKeyResult
,
1483 SOSCCCopyNotValidPeerPeerInfo_Server(&error
),
1487 case kSecXPCOpCopyGenerationPeerInfo
:
1488 if (EntitlementPresentOrWhine(operation
, client
.task
, kSecEntitlementKeychainCloudCircle
, &error
)) {
1489 xpc_dictionary_set_and_consume_CFArray(replyMessage
, kSecXPCKeyResult
,
1490 SOSCCCopyGenerationPeerInfo_Server(&error
));
1493 case kSecXPCOpCopyRetirementPeerInfo
:
1494 if (EntitlementPresentOrWhine(operation
, client
.task
, kSecEntitlementKeychainCloudCircle
, &error
)) {
1495 xpc_dictionary_set_and_consume_PeerInfoArray(replyMessage
, kSecXPCKeyResult
,
1496 SOSCCCopyRetirementPeerInfo_Server(&error
),
1500 case kSecXPCOpCopyViewUnawarePeerInfo
:
1501 if (EntitlementPresentOrWhine(operation
, client
.task
, kSecEntitlementKeychainCloudCircle
, &error
)) {
1502 xpc_dictionary_set_and_consume_PeerInfoArray(replyMessage
, kSecXPCKeyResult
,
1503 SOSCCCopyViewUnawarePeerInfo_Server(&error
),
1507 case kSecXPCOpCopyAccountData
:
1509 if (EntitlementPresentAndTrue(operation
, client
.task
, kSecEntitlementKeychainCloudCircle
, &error
)) {
1510 xpc_object_t xpc_account_object
= NULL
;
1511 CFDataRef accountData
= SOSCCCopyAccountState_Server(&error
);
1513 xpc_account_object
= _CFXPCCreateXPCObjectFromCFObject(accountData
);
1515 xpc_dictionary_set_value(replyMessage
, kSecXPCKeyResult
, xpc_account_object
);
1516 CFReleaseNull(accountData
);
1520 case kSecXPCOpDeleteAccountData
:
1522 if (EntitlementPresentAndTrue(operation
, client
.task
, kSecEntitlementKeychainCloudCircle
, &error
)) {
1523 bool status
= SOSCCDeleteAccountState_Server(&error
);
1524 xpc_dictionary_set_bool(replyMessage
, kSecXPCKeyResult
, status
);
1528 case kSecXPCOpCopyEngineData
:
1530 if (EntitlementPresentAndTrue(operation
, client
.task
, kSecEntitlementKeychainCloudCircle
, &error
)) {
1532 xpc_object_t xpc_engine_object
= NULL
;
1533 CFDataRef engineData
= SOSCCCopyEngineData_Server(&error
);
1535 xpc_engine_object
= _CFXPCCreateXPCObjectFromCFObject(engineData
);
1537 xpc_dictionary_set_value(replyMessage
, kSecXPCKeyResult
, xpc_engine_object
);
1538 CFReleaseNull(engineData
);
1543 case kSecXPCOpDeleteEngineData
:
1545 if (EntitlementPresentAndTrue(operation
, client
.task
, kSecEntitlementKeychainCloudCircle
, &error
)) {
1546 bool status
= SOSCCDeleteEngineState_Server(&error
);
1547 xpc_dictionary_set_bool(replyMessage
, kSecXPCKeyResult
, status
);
1551 case kSecXPCOpCopyEngineState
:
1553 if (EntitlementPresentAndTrue(operation
, client
.task
, kSecEntitlementKeychainCloudCircle
, &error
)) {
1554 CFArrayRef array
= SOSCCCopyEngineState_Server(&error
);
1556 xpc_object_t xpc_array
= _CFXPCCreateXPCObjectFromCFObject(array
);
1557 xpc_dictionary_set_value(replyMessage
, kSecXPCKeyResult
, xpc_array
);
1558 xpc_release(xpc_array
);
1560 CFReleaseNull(array
);
1564 case kSecXPCOpCopyPeerPeerInfo
:
1565 if (EntitlementPresentOrWhine(operation
, client
.task
, kSecEntitlementKeychainCloudCircle
, &error
)) {
1566 xpc_dictionary_set_and_consume_PeerInfoArray(replyMessage
, kSecXPCKeyResult
,
1567 SOSCCCopyPeerPeerInfo_Server(&error
),
1571 case kSecXPCOpCopyConcurringPeerPeerInfo
:
1572 if (EntitlementPresentOrWhine(operation
, client
.task
, kSecEntitlementKeychainCloudCircle
, &error
)) {
1573 xpc_dictionary_set_and_consume_PeerInfoArray(replyMessage
, kSecXPCKeyResult
,
1574 SOSCCCopyConcurringPeerPeerInfo_Server(&error
),
1578 case kSecXPCOpCopyMyPeerInfo
:
1579 if (EntitlementPresentOrWhine(operation
, client
.task
, kSecEntitlementKeychainCloudCircle
, &error
)) {
1580 SOSPeerInfoRef peerInfo
= SOSCCCopyMyPeerInfo_Server(&error
);
1581 CFDataRef peerInfoData
= peerInfo
? SOSPeerInfoCopyEncodedData(peerInfo
, kCFAllocatorDefault
, &error
) : NULL
;
1582 CFReleaseNull(peerInfo
);
1584 xpc_object_t xpc_object
= _CFXPCCreateXPCObjectFromCFObject(peerInfoData
);
1585 xpc_dictionary_set_value(replyMessage
, kSecXPCKeyResult
, xpc_object
);
1586 xpc_release(xpc_object
);
1588 CFReleaseNull(peerInfoData
);
1591 case kSecXPCOpGetLastDepartureReason
:
1592 if (EntitlementPresentOrWhine(operation
, client
.task
, kSecEntitlementKeychainCloudCircle
, &error
)) {
1593 xpc_dictionary_set_int64(replyMessage
, kSecXPCKeyResult
,
1594 SOSCCGetLastDepartureReason_Server(&error
));
1597 case kSecXPCOpSetLastDepartureReason
:
1598 if (EntitlementPresentOrWhine(operation
, client
.task
, kSecEntitlementKeychainCloudCircle
, &error
)) {
1599 int32_t reason
= (int32_t) xpc_dictionary_get_int64(event
, kSecXPCKeyReason
);
1600 xpc_dictionary_set_int64(replyMessage
, kSecXPCKeyResult
,
1601 SOSCCSetLastDepartureReason_Server(reason
, &error
));
1604 case kSecXPCOpProcessSyncWithAllPeers
:
1605 if (EntitlementPresentOrWhine(operation
, client
.task
, kSecEntitlementKeychainCloudCircle
, &error
)) {
1606 xpc_dictionary_set_int64(replyMessage
, kSecXPCKeyResult
,
1607 SOSCCProcessSyncWithAllPeers_Server(&error
));
1610 case soscc_EnsurePeerRegistration_id
:
1611 if (EntitlementPresentOrWhine(operation
, client
.task
, kSecEntitlementKeychainCloudCircle
, &error
)) {
1612 xpc_dictionary_set_bool(replyMessage
, kSecXPCKeyResult
,
1613 SOSCCProcessEnsurePeerRegistration_Server(&error
));
1616 case kSecXPCOpCopyIncompatibilityInfo
:
1617 if (EntitlementPresentOrWhine(operation
, client
.task
, kSecEntitlementKeychainCloudCircle
, &error
)) {
1618 CFStringRef iis
= SOSCCCopyIncompatibilityInfo_Server(&error
);
1619 SecXPCDictionarySetString(replyMessage
, kSecXPCKeyResult
, iis
, &error
);
1623 case kSecXPCOpOTAGetEscrowCertificates
:
1625 uint32_t escrowRootType
= (uint32_t)xpc_dictionary_get_uint64(event
, "escrowType");
1626 CFArrayRef array
= SecOTAPKICopyCurrentEscrowCertificates(escrowRootType
, &error
);
1628 xpc_object_t xpc_array
= _CFXPCCreateXPCObjectFromCFObject(array
);
1629 xpc_dictionary_set_value(replyMessage
, kSecXPCKeyResult
, xpc_array
);
1630 xpc_release(xpc_array
);
1632 CFReleaseNull(array
);
1635 case kSecXPCOpOTAPKIGetNewAsset
:
1636 xpc_dictionary_set_int64(replyMessage
, kSecXPCKeyResult
,
1637 SecOTAPKISignalNewAsset(&error
));
1639 case kSecXPCOpRollKeys
:
1641 bool force
= xpc_dictionary_get_bool(event
, "force");
1642 xpc_dictionary_set_bool(replyMessage
, kSecXPCKeyResult
,
1643 _SecServerRollKeys(force
, &client
, &error
));
1646 case kSecXPCOpSetHSA2AutoAcceptInfo
:
1647 if (EntitlementPresentOrWhine(operation
, client
.task
, kSecEntitlementKeychainCloudCircle
, &error
)) {
1648 CFDataRef cfbytes
= NULL
;
1649 const uint8_t *bytes
= NULL
;
1652 bytes
= xpc_dictionary_get_data(event
,
1653 kSecXPCKeyHSA2AutoAcceptInfo
, &len
);
1655 SOSCreateError(kSOSErrorBadKey
,
1656 CFSTR("missing autoaccept info"), NULL
, &error
);
1660 cfbytes
= CFDataCreate(NULL
, bytes
, len
);
1662 SOSCreateError(kSOSErrorAllocationFailure
,
1663 CFSTR("could not allocate autoaccept info"),
1668 xpc_dictionary_set_bool(replyMessage
,
1670 SOSCCSetHSA2AutoAcceptInfo_Server(cfbytes
, &error
));
1671 CFReleaseNull(cfbytes
);
1674 case kSecXPCOpWaitForInitialSync
:
1675 if (EntitlementPresentOrWhine(operation
, client
.task
, kSecEntitlementKeychainCloudCircle
, &error
)) {
1676 xpc_dictionary_set_bool(replyMessage
, kSecXPCKeyResult
,
1677 SOSCCWaitForInitialSync_Server(&error
));
1681 case kSecXPCOpCopyYetToSyncViews
:
1682 if (EntitlementPresentOrWhine(operation
, client
.task
, kSecEntitlementKeychainCloudCircle
, &error
)) {
1683 CFArrayRef array
= SOSCCCopyYetToSyncViewsList_Server(&error
);
1685 xpc_object_t xpc_array
= _CFXPCCreateXPCObjectFromCFObject(array
);
1686 xpc_dictionary_set_value(replyMessage
, kSecXPCKeyResult
, xpc_array
);
1687 xpc_release(xpc_array
);
1689 CFReleaseNull(array
);
1692 case kSecXPCOpSetEscrowRecord
:
1693 if (EntitlementPresentOrWhine(operation
, client
.task
, kSecEntitlementKeychainCloudCircle
, &error
)) {
1694 CFStringRef escrow_label
= SecXPCDictionaryCopyString(event
, kSecXPCKeyEscrowLabel
, &error
);
1695 uint64_t tries
= xpc_dictionary_get_int64(event
, kSecXPCKeyTriesLabel
);
1697 bool result
= SOSCCSetEscrowRecord_Server(escrow_label
, tries
, &error
);
1699 xpc_dictionary_set_bool(replyMessage
, kSecXPCKeyResult
, result
);
1701 CFReleaseNull(escrow_label
);
1704 case kSecXPCOpGetEscrowRecord
:
1705 if (EntitlementPresentOrWhine(operation
, client
.task
, kSecEntitlementKeychainCloudCircle
, &error
)) {
1706 CFDictionaryRef record
= SOSCCCopyEscrowRecord_Server(&error
);
1708 xpc_object_t xpc_dictionary
= _CFXPCCreateXPCObjectFromCFObject(record
);
1709 xpc_dictionary_set_value(replyMessage
, kSecXPCKeyResult
, xpc_dictionary
);
1710 xpc_release(xpc_dictionary
);
1712 CFReleaseNull(record
);
1715 case kSecXPCOpCheckPeerAvailability
:
1716 if (EntitlementPresentOrWhine(operation
, client
.task
, kSecEntitlementKeychainCloudCircle
, &error
)) {
1717 xpc_dictionary_set_bool(replyMessage
, kSecXPCKeyResult
, SOSCCCheckPeerAvailability_Server(&error
));
1722 case kSecXPCOpIsThisDeviceLastBackup
:
1723 if (EntitlementPresentOrWhine(operation
, client
.task
, kSecEntitlementKeychainCloudCircle
, &error
)) {
1724 xpc_dictionary_set_bool(replyMessage
, kSecXPCKeyResult
, SOSCCkSecXPCOpIsThisDeviceLastBackup_Server(&error
));
1727 case kSecXPCOpPeersHaveViewsEnabled
:
1729 CFArrayRef viewSet
= SecXPCDictionaryCopyArray(event
, kSecXPCKeyArray
, &error
);
1731 CFBooleanRef result
= SOSCCPeersHaveViewsEnabled_Server(viewSet
, &error
);
1733 xpc_dictionary_set_bool(replyMessage
, kSecXPCKeyResult
, result
!= kCFBooleanFalse
);
1736 CFReleaseNull(viewSet
);
1740 case kSecXPCOpWhoAmI
:
1743 xpc_dictionary_set_data(replyMessage
, "musr", CFDataGetBytePtr(client
.musr
), CFDataGetLength(client
.musr
));
1744 xpc_dictionary_set_bool(replyMessage
, "system-keychain", client
.allowSystemKeychain
);
1745 xpc_dictionary_set_bool(replyMessage
, "syncbubble-keychain", client
.allowSyncBubbleKeychain
);
1746 xpc_dictionary_set_bool(replyMessage
, "network-extension", client
.isNetworkExtension
);
1747 xpc_dictionary_set_bool(replyMessage
, kSecXPCKeyResult
, true);
1750 case kSecXPCOpTransmogrifyToSyncBubble
:
1752 if (EntitlementPresentAndTrue(operation
, client
.task
, kSecEntitlementPrivateKeychainSyncBubble
, &error
)) {
1754 uid_t uid
= (uid_t
)xpc_dictionary_get_int64(event
, "uid");
1755 CFArrayRef services
= SecXPCDictionaryCopyArray(event
, "services", &error
);
1757 if (uid
&& services
) {
1758 res
= _SecServerTransmogrifyToSyncBubble(services
, uid
, &client
, &error
);
1760 xpc_dictionary_set_bool(replyMessage
, kSecXPCKeyResult
, res
);
1761 CFReleaseNull(services
);
1763 xpc_dictionary_set_bool(replyMessage
, kSecXPCKeyResult
, false);
1768 case kSecXPCOpTransmogrifyToSystemKeychain
:
1770 if (EntitlementPresentAndTrue(operation
, client
.task
, kSecEntitlementPrivateKeychainMigrateSystemKeychain
, &error
)) {
1772 bool res
= _SecServerTransmogrifyToSystemKeychain(&client
, &error
);
1773 xpc_dictionary_set_bool(replyMessage
, kSecXPCKeyResult
, res
);
1775 xpc_dictionary_set_bool(replyMessage
, kSecXPCKeyResult
, false);
1781 case kSecXPCOpDeleteUserView
:
1783 if (EntitlementPresentAndTrue(operation
, client
.task
, kSecEntitlementPrivateKeychainMigrateSystemKeychain
, &error
)) {
1786 uid_t uid
= (uid_t
)xpc_dictionary_get_int64(event
, "uid");
1788 res
= _SecServerDeleteMUSERViews(&client
, uid
, &error
);
1791 xpc_dictionary_set_bool(replyMessage
, kSecXPCKeyResult
, res
);
1796 case kSecXPCOpWrapToBackupSliceKeyBagForView
:
1798 CFStringRef viewname
= SecXPCDictionaryCopyString(event
, kSecXPCKeyViewName
, &error
);
1800 CFDataRef plaintext
= SecXPCDictionaryCopyData(event
, kSecXPCData
, &error
);
1802 CFDataRef ciphertext
= NULL
;
1803 CFDataRef bskbEncoded
= NULL
;
1805 bool result
= SOSWrapToBackupSliceKeyBagForView_Server(viewname
, plaintext
, &ciphertext
, &bskbEncoded
, &error
);
1806 xpc_dictionary_set_bool(replyMessage
, kSecXPCKeyResult
, result
);
1808 if(!error
&& result
) {
1810 xpc_dictionary_set_data(replyMessage
, kSecXPCData
, CFDataGetBytePtr(ciphertext
), CFDataGetLength(ciphertext
));
1813 xpc_dictionary_set_data(replyMessage
, kSecXPCKeyKeybag
, CFDataGetBytePtr(bskbEncoded
), CFDataGetLength(bskbEncoded
));
1816 CFReleaseSafe(ciphertext
);
1817 CFReleaseSafe(bskbEncoded
);
1819 CFReleaseSafe(plaintext
);
1821 CFReleaseNull(viewname
);
1824 case kSecXPCOpCopyApplication
:
1825 if (EntitlementPresentAndTrue(operation
, client
.task
, kSecEntitlementCircleJoin
, &error
)) {
1826 SOSPeerInfoRef peerInfo
= SOSCCCopyApplication_Server(&error
);
1827 CFDataRef peerInfoData
= peerInfo
? SOSPeerInfoCopyEncodedData(peerInfo
, kCFAllocatorDefault
, &error
) : NULL
;
1828 CFReleaseNull(peerInfo
);
1830 xpc_object_t xpc_object
= _CFXPCCreateXPCObjectFromCFObject(peerInfoData
);
1831 xpc_dictionary_set_value(replyMessage
, kSecXPCKeyResult
, xpc_object
);
1832 xpc_release(xpc_object
);
1834 CFReleaseNull(peerInfoData
);
1837 case kSecXPCOpCopyCircleJoiningBlob
:
1838 if (EntitlementPresentAndTrue(operation
, client
.task
, kSecEntitlementCircleJoin
, &error
)) {
1839 CFDataRef appBlob
= SecXPCDictionaryCopyCFDataRef(event
, kSecXPCData
, &error
);
1840 SOSPeerInfoRef applicant
= SOSPeerInfoCreateFromData(kCFAllocatorDefault
, &error
, appBlob
);
1841 CFDataRef pbblob
= SOSCCCopyCircleJoiningBlob_Server(applicant
, &error
);
1843 xpc_object_t xpc_object
= _CFXPCCreateXPCObjectFromCFObject(pbblob
);
1844 xpc_dictionary_set_value(replyMessage
, kSecXPCKeyResult
, xpc_object
);
1845 xpc_release(xpc_object
);
1847 CFReleaseNull(pbblob
);
1848 CFReleaseNull(applicant
);
1849 CFReleaseNull(appBlob
);
1852 case kSecXPCOpJoinWithCircleJoiningBlob
:
1853 if (EntitlementPresentAndTrue(operation
, client
.task
, kSecEntitlementCircleJoin
, &error
)) {
1854 CFDataRef joiningBlob
= SecXPCDictionaryCopyCFDataRef(event
, kSecXPCData
, &error
);
1856 bool retval
= SOSCCJoinWithCircleJoiningBlob_Server(joiningBlob
, &error
);
1857 xpc_dictionary_set_bool(replyMessage
, kSecXPCKeyResult
, retval
);
1858 CFReleaseNull(joiningBlob
);
1861 case sec_delete_items_with_access_groups_id
:
1863 bool retval
= false;
1864 #if TARGET_OS_IPHONE
1865 if (EntitlementPresentAndTrue(operation
, client
.task
, kSecEntitlementPrivateUninstallDeletion
, &error
)) {
1866 CFArrayRef accessGroups
= SecXPCDictionaryCopyArray(event
, kSecXPCKeyAccessGroups
, &error
);
1869 retval
= _SecItemServerDeleteAllWithAccessGroups(accessGroups
, &client
, &error
);
1871 xpc_dictionary_set_bool(replyMessage
, kSecXPCKeyResult
, retval
);
1872 CFReleaseNull(accessGroups
);
1875 xpc_dictionary_set_bool(replyMessage
, kSecXPCKeyResult
, retval
);
1878 #endif /* !TRUSTD_SERVER */
1887 if(SecErrorGetOSStatus(error
) == errSecItemNotFound
|| isSOSErrorCoded(error
, kSOSErrorPublicKeyAbsent
))
1888 secdebug("ipc", "%@ %@ %@", client
.task
, SOSCCGetOperationDescription((enum SecXPCOperation
)operation
), error
);
1889 else if (SecErrorGetOSStatus(error
) == errSecAuthNeeded
)
1890 secwarning("Authentication is needed %@ %@ %@", client
.task
, SOSCCGetOperationDescription((enum SecXPCOperation
)operation
), error
);
1892 secerror("%@ %@ %@", client
.task
, SOSCCGetOperationDescription((enum SecXPCOperation
)operation
), error
);
1894 xpcError
= SecCreateXPCObjectWithCFError(error
);
1896 xpc_dictionary_set_value(replyMessage
, kSecXPCKeyError
, xpcError
);
1898 } else if (replyMessage
) {
1899 secdebug("ipc", "%@ %@ responding %@", client
.task
, SOSCCGetOperationDescription((enum SecXPCOperation
)operation
), replyMessage
);
1902 SecCFCreateErrorWithFormat(kSecXPCErrorUnexpectedType
, sSecXPCErrorDomain
, NULL
, &error
, 0, CFSTR("Messages expect to be xpc dictionary, got: %@"), event
);
1903 secerror("%@: returning error: %@", client
.task
, error
);
1904 xpcError
= SecCreateXPCObjectWithCFError(error
);
1905 replyMessage
= xpc_create_reply_with_format(event
, "{%string: %value}", kSecXPCKeyError
, xpcError
);
1909 xpc_connection_send_message(connection
, replyMessage
);
1910 xpc_release(replyMessage
);
1913 xpc_release(xpcError
);
1914 #if TARGET_OS_IPHONE
1915 pthread_setspecific(taskThreadKey
, NULL
);
1917 CFReleaseSafe(error
);
1918 CFReleaseSafe(client
.accessGroups
);
1919 CFReleaseSafe(client
.musr
);
1920 CFReleaseSafe(client
.task
);
1921 CFReleaseSafe(domains
);
1922 CFReleaseSafe(clientAuditToken
);
1925 static void securityd_xpc_init(const char *service_name
)
1927 #if TARGET_OS_IPHONE
1928 pthread_key_create(&taskThreadKey
, NULL
);
1929 SecTaskDiagnoseEntitlements
= secTaskDiagnoseEntitlements
;
1932 secdebug("serverxpc", "start");
1933 xpc_connection_t listener
= xpc_connection_create_mach_service(service_name
, NULL
, XPC_CONNECTION_MACH_SERVICE_LISTENER
);
1935 seccritical("security failed to register xpc listener for %s, exiting", service_name
);
1939 xpc_connection_set_event_handler(listener
, ^(xpc_object_t connection
) {
1940 if (xpc_get_type(connection
) == XPC_TYPE_CONNECTION
) {
1941 xpc_connection_set_event_handler(connection
, ^(xpc_object_t event
) {
1942 if (xpc_get_type(event
) == XPC_TYPE_DICTIONARY
) {
1943 xpc_retain(connection
);
1945 dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT
, 0), ^{
1946 securityd_xpc_dictionary_handler(connection
, event
);
1948 xpc_release(connection
);
1952 xpc_connection_resume(connection
);
1955 xpc_connection_resume(listener
);
1959 // <rdar://problem/22425706> 13B104+Roots:Device never moved past spinner after using approval to ENABLE icdp
1961 #if TARGET_OS_EMBEDDED
1962 static void securityd_soscc_lock_hack() {
1963 dispatch_queue_t soscc_lock_queue
= dispatch_queue_create("soscc_lock_queue", DISPATCH_QUEUE_PRIORITY_DEFAULT
);
1966 // <rdar://problem/22500239> Prevent securityd from quitting while holding a keychain assertion
1967 // FIXME: securityd isn't currently registering for any other notifyd events. If/when it does,
1968 // this code will need to be generalized / migrated away from just this specific purpose.
1969 xpc_set_event_stream_handler("com.apple.notifyd.matching", dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH
, 0), ^(xpc_object_t object
) {
1970 char *event_description
= xpc_copy_description(object
);
1971 secnotice("events", "%s", event_description
);
1972 free(event_description
);
1975 secnotice("lockassertion", "notify_register_dispatch(kSOSCCHoldLockForInitialSync)");
1976 notify_register_dispatch(kSOSCCHoldLockForInitialSync
, &soscc_tok
, soscc_lock_queue
, ^(int token __unused
) {
1977 secnotice("lockassertion", "kSOSCCHoldLockForInitialSync: grabbing the lock");
1978 CFErrorRef error
= NULL
;
1980 uint64_t one_minute
= 60ull;
1981 if(SecAKSLockUserKeybag(one_minute
, &error
)){
1982 // <rdar://problem/22500239> Prevent securityd from quitting while holding a keychain assertion
1983 xpc_transaction_begin();
1985 dispatch_after(dispatch_time(DISPATCH_TIME_NOW
, one_minute
*NSEC_PER_SEC
), soscc_lock_queue
, ^{
1986 CFErrorRef localError
= NULL
;
1987 if(!SecAKSUnLockUserKeybag(&localError
))
1988 secerror("failed to unlock: %@", localError
);
1989 CFReleaseNull(localError
);
1990 xpc_transaction_end();
1993 secerror("Failed to take device lock assertion: %@", error
);
1995 CFReleaseNull(error
);
1996 secnotice("lockassertion", "kSOSCCHoldLockForInitialSync => done");
2002 #include <trustd/SecTrustOSXEntryPoints.h>
2003 static void trustd_init_server(void) {
2004 SecTrustLegacySourcesEventRunloopCreate();
2008 int main(int argc
, char *argv
[])
2010 char *wait4debugger
= getenv("WAIT4DEBUGGER");
2011 if (wait4debugger
&& !strcasecmp("YES", wait4debugger
)) {
2012 seccritical("SIGSTOPing self, awaiting debugger");
2013 kill(getpid(), SIGSTOP
);
2014 seccritical("Again, for good luck (or bad debuggers)");
2015 kill(getpid(), SIGSTOP
);
2018 #if TARGET_OS_IOS && !TARGET_OS_SIMULATOR
2020 CFDictionaryRef deviceMode
= MKBUserTypeDeviceMode(NULL
, NULL
);
2021 CFTypeRef value
= NULL
;
2023 if (deviceMode
&& CFDictionaryGetValueIfPresent(deviceMode
, kMKBDeviceModeKey
, &value
) && CFEqual(value
, kMKBDeviceModeMultiUser
)) {
2026 CFReleaseNull(deviceMode
);
2030 /* <rdar://problem/15792007> Users with network home folders are unable to use/save password for Mail/Cal/Contacts/websites
2031 Secd doesn't realize DB connections get invalidated when network home directory users logout
2032 and their home gets unmounted. Exit secd, start fresh when user logs back in.
2034 #if !TARGET_OS_IPHONE
2035 int sessionstatechanged_tok
;
2036 notify_register_dispatch(kSA_SessionStateChangedNotification
, &sessionstatechanged_tok
, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT
, 0), ^(int token __unused
) {
2037 // we could be a process running as root.
2038 // However, since root never logs out this isn't an issue.
2039 if (SASSessionStateForUser(getuid()) == kSA_state_loggingout_pointofnoreturn
) {
2040 dispatch_after(dispatch_time(DISPATCH_TIME_NOW
, 3ull*NSEC_PER_SEC
), dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT
, 0), ^{
2041 xpc_transaction_exit_clean();
2047 const char *serviceName
= kSecuritydXPCServiceName
;
2049 serviceName
= kTrustdXPCServiceName
;
2050 if (argc
> 1 && (!strcmp(argv
[1], "--agent"))) {
2051 serviceName
= kTrustdAgentXPCServiceName
;
2054 /* setup SQDLite before some other component have a chance to create a database connection */
2055 _SecServerDatabaseSetup();
2057 securityd_init_server();
2059 trustd_init_server();
2061 securityd_xpc_init(serviceName
);
2063 // <rdar://problem/22425706> 13B104+Roots:Device never moved past spinner after using approval to ENABLE icdp
2064 #if TARGET_OS_EMBEDDED
2065 securityd_soscc_lock_hack();
2073 /* vi:set ts=4 sw=4 et: */