2 * Copyright (c) 2000-2008 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@
26 // transition - SecurityServer client library transition code.
28 // These are the functions that implement CssmClient methods in terms of
29 // MIG IPC client calls, plus their supporting machinery.
31 // WARNING! HERE BE DRAGONS!
32 // This code involves moderately arcane magic including (but not limited to)
33 // dancing macros paired off with self-maintaining stack objects. Don't take
34 // anything for granted! Be very afraid of ALL-CAPS names. Your best bet is
35 // probably to stick with the existing patterns.
37 // Dragons, the sequel. You just don't go killing of that kind of prose, so
38 // we'll continue the saga here with a bit of an update. In transitioning
39 // into securityd there are a couple of steps. The current setup is there
40 // to allow Security.framework to have 32 and 64 bit clients and either
41 // big or little endian. Data is packaged up as hand-generated XDR, which
42 // means it's also in network byte-order.
44 // CSSM_HANDLEs have remained longs in the 64 bit transition to keep the
45 // optimization option open to allow cssm modules to hand back pointers as
46 // handles. Since we don't identify the client, handles across ipc will
47 // remain 32 bit. Handles you see here are passed out by securityd, and
48 // are clipped and expanded in this layer (high bits always zero).
50 #include "sstransit.h"
51 #include <security_cdsa_client/cspclient.h>
52 #include <CoreServices/../Frameworks/CarbonCore.framework/Headers/MacErrors.h>
54 #include <securityd_client/xdr_auth.h>
55 #include <securityd_client/xdr_cssm.h>
56 #include <securityd_client/xdr_dldb.h>
59 namespace SecurityServer
{
61 using MachPlusPlus::check
;
62 using MachPlusPlus::VMGuard
;
65 // Common database interface
67 void ClientSession::authenticateDb(DbHandle db
, CSSM_DB_ACCESS_TYPE type
,
68 const AccessCredentials
*cred
)
70 // XXX/cs Leave it up to DatabaseAccessCredentials to rewrite it for now
71 DatabaseAccessCredentials
creds(cred
, internalAllocator
);
72 CopyIn
copy(creds
.value(), reinterpret_cast<xdrproc_t
>(xdr_CSSM_ACCESS_CREDENTIALS
));
73 IPC(ucsp_client_authenticateDb(UCSP_ARGS
, db
, type
, copy
.data(), copy
.length()));
77 void ClientSession::releaseDb(DbHandle db
)
79 IPC(ucsp_client_releaseDb(UCSP_ARGS
, db
));
84 // External database interface
86 DbHandle
ClientSession::openToken(uint32 ssid
, const AccessCredentials
*cred
,
90 DatabaseAccessCredentials
creds(cred
, internalAllocator
);
91 CopyIn
copycreds(creds
.value(), reinterpret_cast<xdrproc_t
>(xdr_CSSM_ACCESS_CREDENTIALS
));
93 IPC(ucsp_client_openToken(UCSP_ARGS
, ssid
, name
? name
: "", copycreds
.data(), copycreds
.length(), &db
));
99 RecordHandle
ClientSession::insertRecord(DbHandle db
,
100 CSSM_DB_RECORDTYPE recordType
,
101 const CssmDbRecordAttributeData
*attributes
,
102 const CssmData
*data
)
105 CopyIn
db_record_attr_data(attributes
, reinterpret_cast<xdrproc_t
>(xdr_CSSM_DB_RECORD_ATTRIBUTE_DATA
));
107 IPC(ucsp_client_insertRecord(UCSP_ARGS
, db
, recordType
, db_record_attr_data
.data(), db_record_attr_data
.length(), OPTIONALDATA(data
), &record
));
113 void ClientSession::deleteRecord(DbHandle db
, RecordHandle record
)
115 IPC(ucsp_client_deleteRecord(UCSP_ARGS
, db
, record
));
119 void ClientSession::modifyRecord(DbHandle db
, RecordHandle
&record
,
120 CSSM_DB_RECORDTYPE recordType
,
121 const CssmDbRecordAttributeData
*attributes
,
122 const CssmData
*data
,
123 CSSM_DB_MODIFY_MODE modifyMode
)
125 CopyIn
db_record_attr_data(attributes
, reinterpret_cast<xdrproc_t
>(xdr_CSSM_DB_RECORD_ATTRIBUTE_DATA
));
127 IPC(ucsp_client_modifyRecord(UCSP_ARGS
, db
, &record
, recordType
, db_record_attr_data
.data(), db_record_attr_data
.length(),
128 data
!= NULL
, OPTIONALDATA(data
), modifyMode
));
131 void copy_back_attribute_return_data(CssmDbRecordAttributeData
*dest_attrs
, CssmDbRecordAttributeData
*source_attrs
, Allocator
&returnAllocator
)
133 assert(dest_attrs
->size() == source_attrs
->size());
134 // global (per-record) fields
135 dest_attrs
->recordType(source_attrs
->recordType());
136 dest_attrs
->semanticInformation(source_attrs
->semanticInformation());
138 // transfer data values (but not infos, which we keep in the original vector)
139 for (uint32 n
= 0; n
< dest_attrs
->size(); n
++)
140 dest_attrs
->at(n
).copyValues(source_attrs
->at(n
), returnAllocator
);
143 RecordHandle
ClientSession::findFirst(DbHandle db
,
144 const CssmQuery
&inQuery
,
145 SearchHandle
&hSearch
,
146 CssmDbRecordAttributeData
*attributes
,
147 CssmData
*data
, KeyHandle
&hKey
)
149 CopyIn
query(&inQuery
, reinterpret_cast<xdrproc_t
>(xdr_CSSM_QUERY
));
150 CopyIn
in_attr(attributes
, reinterpret_cast<xdrproc_t
>(xdr_CSSM_DB_RECORD_ATTRIBUTE_DATA
));
151 void *out_attr_data
= NULL
, *out_data
= NULL
;
152 mach_msg_size_t out_attr_length
= 0, out_data_length
= 0;
153 RecordHandle ipcHRecord
= 0;
155 IPC(ucsp_client_findFirst(UCSP_ARGS
, db
,
156 query
.data(), query
.length(), in_attr
.data(), in_attr
.length(),
157 &out_attr_data
, &out_attr_length
, (data
!= NULL
), &out_data
, &out_data_length
,
158 &hKey
, &hSearch
, &ipcHRecord
));
162 CopyOut
out_attrs(out_attr_data
, out_attr_length
, reinterpret_cast<xdrproc_t
>(xdr_CSSM_DB_RECORD_ATTRIBUTE_DATA_PTR
), true);
163 copy_back_attribute_return_data(attributes
, reinterpret_cast<CssmDbRecordAttributeData
*>(out_attrs
.data()), returnAllocator
);
166 // decode data from server as cssm_data or cssm_key (get data on keys returns cssm_key in data)
167 CopyOut
possible_key_in_data(out_data
, out_data_length
, reinterpret_cast<xdrproc_t
>(xdr_CSSM_POSSIBLY_KEY_IN_DATA_PTR
), true, data
);
173 RecordHandle
ClientSession::findNext(SearchHandle hSearch
,
174 CssmDbRecordAttributeData
*attributes
,
175 CssmData
*data
, KeyHandle
&hKey
)
177 CopyIn
in_attr(attributes
, reinterpret_cast<xdrproc_t
>(xdr_CSSM_DB_RECORD_ATTRIBUTE_DATA
));
178 void *out_attr_data
= NULL
, *out_data
= NULL
;
179 mach_msg_size_t out_attr_length
= 0, out_data_length
= 0;
180 //DataOutput out_data(data, returnAllocator);
181 RecordHandle ipcHRecord
= 0;
183 IPC(ucsp_client_findNext(UCSP_ARGS
, hSearch
,
184 in_attr
.data(), in_attr
.length(), &out_attr_data
, &out_attr_length
,
185 (data
!= NULL
), &out_data
, &out_data_length
, &hKey
, &ipcHRecord
));
189 CopyOut
out_attrs(out_attr_data
, out_attr_length
, reinterpret_cast<xdrproc_t
>(xdr_CSSM_DB_RECORD_ATTRIBUTE_DATA_PTR
), true);
190 copy_back_attribute_return_data(attributes
, reinterpret_cast<CssmDbRecordAttributeData
*>(out_attrs
.data()), returnAllocator
);
193 // decode data from server as cssm_data or cssm_key (get data on keys returns cssm_key in data)
194 CopyOut
possible_key_in_data(out_data
, out_data_length
, reinterpret_cast<xdrproc_t
>(xdr_CSSM_POSSIBLY_KEY_IN_DATA_PTR
), true, data
);
200 void ClientSession::findRecordHandle(RecordHandle hRecord
,
201 CssmDbRecordAttributeData
*attributes
,
202 CssmData
*data
, KeyHandle
&hKey
)
204 CopyIn
in_attr(attributes
, reinterpret_cast<xdrproc_t
>(xdr_CSSM_DB_RECORD_ATTRIBUTE_DATA
));
205 void *out_attr_data
= NULL
, *out_data
= NULL
;
206 mach_msg_size_t out_attr_length
= 0, out_data_length
= 0;
207 IPC(ucsp_client_findRecordHandle(UCSP_ARGS
, hRecord
,
208 in_attr
.data(), in_attr
.length(), &out_attr_data
, &out_attr_length
,
209 data
!= NULL
, &out_data
, &out_data_length
, &hKey
));
213 CopyOut
out_attrs(out_attr_data
, out_attr_length
, reinterpret_cast<xdrproc_t
>(xdr_CSSM_DB_RECORD_ATTRIBUTE_DATA_PTR
), true);
214 copy_back_attribute_return_data(attributes
, reinterpret_cast<CssmDbRecordAttributeData
*>(out_attrs
.data()), returnAllocator
);
217 // decode data from server as cssm_data or cssm_key (get data on keys returns cssm_key in data)
218 CopyOut
possible_key_in_data(out_data
, out_data_length
, reinterpret_cast<xdrproc_t
>(xdr_CSSM_POSSIBLY_KEY_IN_DATA_PTR
), true, data
);
222 void ClientSession::releaseSearch(SearchHandle searchHandle
)
224 IPC(ucsp_client_releaseSearch(UCSP_ARGS
, searchHandle
));
228 void ClientSession::releaseRecord(RecordHandle record
)
230 IPC(ucsp_client_releaseRecord(UCSP_ARGS
, record
));
233 void ClientSession::getDbName(DbHandle db
, string
&name
)
235 char result
[PATH_MAX
];
237 IPC(ucsp_client_getDbName(UCSP_ARGS
, db
, result
));
242 void ClientSession::setDbName(DbHandle db
, const string
&name
)
244 IPC(ucsp_client_setDbName(UCSP_ARGS
, db
, name
.c_str()));
249 // Internal database management
251 DbHandle
ClientSession::createDb(const DLDbIdentifier
&dbId
,
252 const AccessCredentials
*cred
, const AclEntryInput
*owner
,
253 const DBParameters
¶ms
)
255 DatabaseAccessCredentials
creds(cred
, internalAllocator
);
256 CopyIn
copycreds(creds
.value(), reinterpret_cast<xdrproc_t
>(xdr_CSSM_ACCESS_CREDENTIALS
));
257 CopyIn
proto(owner
? &owner
->proto() : NULL
, reinterpret_cast<xdrproc_t
>(xdr_CSSM_ACL_ENTRY_PROTOTYPE
));
258 // XXX/64 make xdr routines translate directly between dldbident and flat rep
259 DataWalkers::DLDbFlatIdentifier
ident(dbId
);
260 CopyIn
id(&ident
, reinterpret_cast<xdrproc_t
>(xdr_DLDbFlatIdentifier
));
263 IPC(ucsp_client_createDb(UCSP_ARGS
, &db
, id
.data(), id
.length(), copycreds
.data(), copycreds
.length(), proto
.data(), proto
.length(), params
));
268 DbHandle
ClientSession::recodeDbForSync(DbHandle dbToClone
,
273 IPC(ucsp_client_recodeDbForSync(UCSP_ARGS
, dbToClone
, srcDb
, &newDb
));
278 DbHandle
ClientSession::authenticateDbsForSync(const CssmData
&dbHandleArray
,
279 const CssmData
&agentData
)
283 IPC(ucsp_client_authenticateDbsForSync(UCSP_ARGS
, DATA(dbHandleArray
), DATA(agentData
), &newDb
));
288 void ClientSession::commitDbForSync(DbHandle srcDb
, DbHandle cloneDb
,
289 CssmData
&blob
, Allocator
&alloc
)
291 DataOutput
outBlob(blob
, alloc
);
292 IPC(ucsp_client_commitDbForSync(UCSP_ARGS
, srcDb
, cloneDb
, DATA(outBlob
)));
295 DbHandle
ClientSession::decodeDb(const DLDbIdentifier
&dbId
,
296 const AccessCredentials
*cred
, const CssmData
&blob
)
298 // XXX/64 fold into one translation
299 DatabaseAccessCredentials
credentials(cred
, internalAllocator
);
300 CopyIn
creds(credentials
.value(), reinterpret_cast<xdrproc_t
>(xdr_CSSM_ACCESS_CREDENTIALS
));
301 // XXX/64 fold into one translation
302 DataWalkers::DLDbFlatIdentifier
ident(dbId
);
303 CopyIn
id(&ident
, reinterpret_cast<xdrproc_t
>(xdr_DLDbFlatIdentifier
));
306 IPC(ucsp_client_decodeDb(UCSP_ARGS
, &db
, id
.data(), id
.length(), creds
.data(), creds
.length(), DATA(blob
)));
311 void ClientSession::encodeDb(DbHandle db
, CssmData
&blob
, Allocator
&alloc
)
313 DataOutput
outBlob(blob
, alloc
);
314 IPC(ucsp_client_encodeDb(UCSP_ARGS
, db
, DATA(outBlob
)));
317 void ClientSession::setDbParameters(DbHandle db
, const DBParameters
¶ms
)
319 IPC(ucsp_client_setDbParameters(UCSP_ARGS
, db
, params
));
322 void ClientSession::getDbParameters(DbHandle db
, DBParameters
¶ms
)
324 IPC(ucsp_client_getDbParameters(UCSP_ARGS
, db
, ¶ms
));
327 void ClientSession::changePassphrase(DbHandle db
, const AccessCredentials
*cred
)
329 CopyIn
creds(cred
, reinterpret_cast<xdrproc_t
>(xdr_CSSM_ACCESS_CREDENTIALS
));
330 IPC(ucsp_client_changePassphrase(UCSP_ARGS
, db
, creds
.data(), creds
.length()));
334 void ClientSession::lock(DbHandle db
)
336 IPC(ucsp_client_authenticateDb(UCSP_ARGS
, db
, CSSM_DB_ACCESS_RESET
, NULL
, 0));
337 //@@@VIRTUAL IPC(ucsp_client_lockDb(UCSP_ARGS, db));
340 void ClientSession::lockAll (bool forSleep
)
342 IPC(ucsp_client_lockAll (UCSP_ARGS
, forSleep
));
345 void ClientSession::unlock(DbHandle db
)
347 IPC(ucsp_client_unlockDb(UCSP_ARGS
, db
));
350 void ClientSession::unlock(DbHandle db
, const CssmData
&passphrase
)
352 IPC(ucsp_client_unlockDbWithPassphrase(UCSP_ARGS
, db
, DATA(passphrase
)));
355 bool ClientSession::isLocked(DbHandle db
)
358 IPC(ucsp_client_isLocked(UCSP_ARGS
, db
, &locked
));
366 void ClientSession::encodeKey(KeyHandle key
, CssmData
&blob
,
367 KeyUID
*uid
, Allocator
&alloc
)
369 // Not really used as output
370 DataOutput
oBlob(blob
, alloc
);
372 mach_msg_type_number_t uidLength
;
374 IPC(ucsp_client_encodeKey(UCSP_ARGS
, key
, oBlob
.data(), oBlob
.length(),
375 (uid
!= NULL
), &uidp
, &uidLength
));
377 // return key uid if requested
379 assert(uidLength
== sizeof(KeyUID
));
380 memcpy(uid
, uidp
, sizeof(KeyUID
));
384 KeyHandle
ClientSession::decodeKey(DbHandle db
, const CssmData
&blob
, CssmKey::Header
&header
)
388 mach_msg_type_number_t keyHeaderDataLength
;
390 IPC(ucsp_client_decodeKey(UCSP_ARGS
, &key
, &keyHeaderData
, &keyHeaderDataLength
, db
, blob
.data(), blob
.length()));
392 CopyOut
wrappedKeyHeaderXDR(keyHeaderData
, keyHeaderDataLength
+ sizeof(CSSM_KEYHEADER
), reinterpret_cast<xdrproc_t
>(xdr_CSSM_KEYHEADER_PTR
), true);
393 header
= *static_cast<CssmKey::Header
*>(reinterpret_cast<CSSM_KEYHEADER
*>(wrappedKeyHeaderXDR
.data()));
398 // keychain synchronization
399 void ClientSession::recodeKey(DbHandle oldDb
, KeyHandle key
, DbHandle newDb
,
402 DataOutput
outBlob(blob
, returnAllocator
);
403 IPC(ucsp_client_recodeKey(UCSP_ARGS
, oldDb
, key
, newDb
, DATA(outBlob
)));
406 void ClientSession::releaseKey(KeyHandle key
)
408 IPC(ucsp_client_releaseKey(UCSP_ARGS
, key
));
412 CssmKeySize
ClientSession::queryKeySizeInBits(KeyHandle key
)
415 IPC(ucsp_client_queryKeySizeInBits(UCSP_ARGS
, key
, &length
));
420 uint32
ClientSession::getOutputSize(const Context
&context
, KeyHandle key
,
421 uint32 inputSize
, bool encrypt
)
423 CopyIn
ctxcopy(&context
, reinterpret_cast<xdrproc_t
>(xdr_CSSM_CONTEXT
));
426 IPC(ucsp_client_getOutputSize(UCSP_ARGS
, ctxcopy
.data(), ctxcopy
.length(), key
, inputSize
, encrypt
, &outputSize
));
432 // Random number generation.
433 // This interfaces to the secure RNG inside the SecurityServer; it does not access
434 // a PRNG in its CSP. If you need a reproducible PRNG, attach a local CSP and use it.
435 // Note that this function does not allocate a buffer; it always fills the buffer provided.
437 void ClientSession::generateRandom(const Security::Context
&context
, CssmData
&data
, Allocator
&alloc
)
439 CopyIn
ctxcopy(&context
, reinterpret_cast<xdrproc_t
>(xdr_CSSM_CONTEXT
));
440 DataOutput
result(data
, alloc
);
442 IPC(ucsp_client_generateRandom(UCSP_ARGS
, 0, ctxcopy
.data(), ctxcopy
.length(), DATA(result
)));
447 // Signatures and MACs
449 void ClientSession::generateSignature(const Context
&context
, KeyHandle key
,
450 const CssmData
&data
, CssmData
&signature
, Allocator
&alloc
, CSSM_ALGORITHMS signOnlyAlgorithm
)
452 CopyIn
ctxcopy(&context
, reinterpret_cast<xdrproc_t
>(xdr_CSSM_CONTEXT
));
453 DataOutput
sig(signature
, alloc
);
455 IPCKEY(ucsp_client_generateSignature(UCSP_ARGS
, ctxcopy
.data(), ctxcopy
.length(), key
, signOnlyAlgorithm
,
456 DATA(data
), DATA(sig
)),
457 key
, CSSM_ACL_AUTHORIZATION_SIGN
);
460 void ClientSession::verifySignature(const Context
&context
, KeyHandle key
,
461 const CssmData
&data
, const CssmData
&signature
, CSSM_ALGORITHMS verifyOnlyAlgorithm
)
463 CopyIn
ctxcopy(&context
, reinterpret_cast<xdrproc_t
>(xdr_CSSM_CONTEXT
));
465 IPC(ucsp_client_verifySignature(UCSP_ARGS
, ctxcopy
.data(), ctxcopy
.length(), key
, verifyOnlyAlgorithm
, DATA(data
), DATA(signature
)));
469 void ClientSession::generateMac(const Context
&context
, KeyHandle key
,
470 const CssmData
&data
, CssmData
&signature
, Allocator
&alloc
)
472 CopyIn
ctxcopy(&context
, reinterpret_cast<xdrproc_t
>(xdr_CSSM_CONTEXT
));
473 DataOutput
sig(signature
, alloc
);
475 IPCKEY(ucsp_client_generateMac(UCSP_ARGS
, ctxcopy
.data(), ctxcopy
.length(), key
, DATA(data
), DATA(sig
)),
476 key
, CSSM_ACL_AUTHORIZATION_MAC
);
479 void ClientSession::verifyMac(const Context
&context
, KeyHandle key
,
480 const CssmData
&data
, const CssmData
&signature
)
482 CopyIn
ctxcopy(&context
, reinterpret_cast<xdrproc_t
>(xdr_CSSM_CONTEXT
));
484 IPCKEY(ucsp_client_verifyMac(UCSP_ARGS
, ctxcopy
.data(), ctxcopy
.length(), key
,
485 DATA(data
), DATA(signature
)),
486 key
, CSSM_ACL_AUTHORIZATION_MAC
);
491 // Encryption/Decryption
494 void ClientSession::encrypt(const Context
&context
, KeyHandle key
,
495 const CssmData
&clear
, CssmData
&cipher
, Allocator
&alloc
)
497 CopyIn
ctxcopy(&context
, reinterpret_cast<xdrproc_t
>(xdr_CSSM_CONTEXT
));
498 DataOutput
cipherOut(cipher
, alloc
);
499 IPCKEY(ucsp_client_encrypt(UCSP_ARGS
, ctxcopy
.data(), ctxcopy
.length(), key
, DATA(clear
), DATA(cipherOut
)),
500 key
, CSSM_ACL_AUTHORIZATION_ENCRYPT
);
503 void ClientSession::decrypt(const Context
&context
, KeyHandle key
,
504 const CssmData
&cipher
, CssmData
&clear
, Allocator
&alloc
)
506 CopyIn
ctxcopy(&context
, reinterpret_cast<xdrproc_t
>(xdr_CSSM_CONTEXT
));
507 DataOutput
clearOut(clear
, alloc
);
509 IPCKEY(ucsp_client_decrypt(UCSP_ARGS
, ctxcopy
.data(), ctxcopy
.length(), key
, DATA(cipher
), DATA(clearOut
)),
510 key
, CSSM_ACL_AUTHORIZATION_DECRYPT
);
517 void ClientSession::generateKey(DbHandle db
, const Context
&context
, uint32 keyUsage
, uint32 keyAttr
,
518 const AccessCredentials
*cred
, const AclEntryInput
*owner
,
519 KeyHandle
&newKey
, CssmKey::Header
&newHeader
)
521 CopyIn
ctxcopy(&context
, reinterpret_cast<xdrproc_t
>(xdr_CSSM_CONTEXT
));
522 CopyIn
creds(cred
, reinterpret_cast<xdrproc_t
>(xdr_CSSM_ACCESS_CREDENTIALS
));
523 CopyIn
proto(owner
? &owner
->proto() : NULL
, reinterpret_cast<xdrproc_t
>(xdr_CSSM_ACL_ENTRY_PROTOTYPE
));
525 mach_msg_type_number_t keyHeaderDataLength
;
527 IPC(ucsp_client_generateKey(UCSP_ARGS
, db
, ctxcopy
.data(), ctxcopy
.length(),
528 creds
.data(), creds
.length(), proto
.data(), proto
.length(),
529 keyUsage
, keyAttr
, &newKey
, &keyHeaderData
, &keyHeaderDataLength
));
531 CopyOut
wrappedKeyHeaderXDR(keyHeaderData
, keyHeaderDataLength
+ sizeof(CSSM_KEYHEADER
), reinterpret_cast<xdrproc_t
>(xdr_CSSM_KEYHEADER_PTR
), true);
532 newHeader
= *static_cast<CssmKey::Header
*>(reinterpret_cast<CSSM_KEYHEADER
*>(wrappedKeyHeaderXDR
.data()));
535 void ClientSession::generateKey(DbHandle db
, const Context
&context
,
536 uint32 pubKeyUsage
, uint32 pubKeyAttr
,
537 uint32 privKeyUsage
, uint32 privKeyAttr
,
538 const AccessCredentials
*cred
, const AclEntryInput
*owner
,
539 KeyHandle
&pubKey
, CssmKey::Header
&pubHeader
,
540 KeyHandle
&privKey
, CssmKey::Header
&privHeader
)
542 CopyIn
ctxcopy(&context
, reinterpret_cast<xdrproc_t
>(xdr_CSSM_CONTEXT
));
543 CopyIn
creds(cred
, reinterpret_cast<xdrproc_t
>(xdr_CSSM_ACCESS_CREDENTIALS
));
544 CopyIn
proto(owner
? &owner
->proto() : NULL
, reinterpret_cast<xdrproc_t
>(xdr_CSSM_ACL_ENTRY_PROTOTYPE
));
545 void *pubKeyHeaderData
, *privKeyHeaderData
;
546 mach_msg_type_number_t pubKeyHeaderDataLength
, privKeyHeaderDataLength
;
548 IPC(ucsp_client_generateKeyPair(UCSP_ARGS
, db
, ctxcopy
.data(), ctxcopy
.length(),
549 creds
.data(), creds
.length(), proto
.data(), proto
.length(),
550 pubKeyUsage
, pubKeyAttr
, privKeyUsage
, privKeyAttr
,
551 &pubKey
, &pubKeyHeaderData
, &pubKeyHeaderDataLength
,
552 &privKey
, &privKeyHeaderData
, &privKeyHeaderDataLength
));
554 CopyOut
wrappedPubKeyHeaderXDR(pubKeyHeaderData
, pubKeyHeaderDataLength
+ sizeof(CSSM_KEYHEADER
), reinterpret_cast<xdrproc_t
>(xdr_CSSM_KEYHEADER_PTR
), true);
555 pubHeader
= *static_cast<CssmKey::Header
*>(reinterpret_cast<CSSM_KEYHEADER
*>(wrappedPubKeyHeaderXDR
.data()));
556 CopyOut
wrappedPrivKeyHeaderXDR(privKeyHeaderData
, privKeyHeaderDataLength
+ sizeof(CSSM_KEYHEADER
), reinterpret_cast<xdrproc_t
>(xdr_CSSM_KEYHEADER_PTR
), true);
557 privHeader
= *static_cast<CssmKey::Header
*>(reinterpret_cast<CSSM_KEYHEADER
*>(wrappedPrivKeyHeaderXDR
.data()));
564 // This is a bit strained; the incoming 'param' value may have structure,
565 // and we use a synthetic CssmDeriveData structure (with ad-hoc walker) to
566 // handle that. Param also is input/output, which is always a pain (not to mention
567 // ill-defined by the CDSA standard).
569 // If you're here because an algorithm of yours requires structured parameter
570 // input, go to security_cdsa_utilities/cssmwalkers.h and add a case to the
571 // CssmDeriveData walker.
573 void ClientSession::deriveKey(DbHandle db
, const Context
&context
, KeyHandle baseKey
,
574 CSSM_KEYUSE usage
, CSSM_KEYATTR_FLAGS attrs
, CssmData
¶m
,
575 const AccessCredentials
*cred
, const AclEntryInput
*owner
,
576 KeyHandle
&newKey
, CssmKey::Header
&newHeader
, Allocator
&allocator
)
578 CopyIn
ctxcopy(&context
, reinterpret_cast<xdrproc_t
>(xdr_CSSM_CONTEXT
));
579 CopyIn
creds(cred
, reinterpret_cast<xdrproc_t
>(xdr_CSSM_ACCESS_CREDENTIALS
));
580 CopyIn
proto(owner
? &owner
->proto() : NULL
, reinterpret_cast<xdrproc_t
>(xdr_CSSM_ACL_ENTRY_PROTOTYPE
));
581 CSSM_DERIVE_DATA inParamForm
= { context
.algorithm(), param
};
582 CopyIn
inParam(&inParamForm
, reinterpret_cast<xdrproc_t
>(xdr_CSSM_DERIVE_DATA
));
586 DataOutput
paramOutput(param
, allocator
);
588 mach_msg_type_number_t keyHeaderDataLength
;
590 IPCKEY(ucsp_client_deriveKey(UCSP_ARGS
, db
, ctxcopy
.data(), ctxcopy
.length(), baseKey
,
591 creds
.data(), creds
.length(), proto
.data(), proto
.length(),
592 inParam
.data(), inParam
.length(), DATA(paramOutput
),
593 usage
, attrs
, &newKey
, &keyHeaderData
, &keyHeaderDataLength
),
594 baseKey
, CSSM_ACL_AUTHORIZATION_DERIVE
);
596 CopyOut
wrappedKeyHeaderXDR(keyHeaderData
, keyHeaderDataLength
+ sizeof(CSSM_KEYHEADER
), reinterpret_cast<xdrproc_t
>(xdr_CSSM_KEYHEADER_PTR
), true);
597 newHeader
= *static_cast<CssmKey::Header
*>(reinterpret_cast<CSSM_KEYHEADER
*>(wrappedKeyHeaderXDR
.data()));
601 // filter out errors for CSSM_ALGID_PKCS5_PBKDF2
602 if (context
.algorithm() != CSSM_ALGID_PKCS5_PBKDF2
&& e
.error
!= CSSMERR_CSP_OUTPUT_LENGTH_ERROR
)
613 void ClientSession::getKeyDigest(KeyHandle key
, CssmData
&digest
, Allocator
&allocator
)
615 DataOutput
dig(digest
, allocator
);
616 IPC(ucsp_client_getKeyDigest(UCSP_ARGS
, key
, DATA(dig
)));
621 // Key wrapping and unwrapping
623 void ClientSession::wrapKey(const Context
&context
, KeyHandle wrappingKey
,
624 KeyHandle keyToBeWrapped
, const AccessCredentials
*cred
,
625 const CssmData
*descriptiveData
, CssmWrappedKey
&wrappedKey
, Allocator
&alloc
)
627 CopyIn
ctxcopy(&context
, reinterpret_cast<xdrproc_t
>(xdr_CSSM_CONTEXT
));
628 CopyIn
creds(cred
, reinterpret_cast<xdrproc_t
>(xdr_CSSM_ACCESS_CREDENTIALS
));
630 mach_msg_type_number_t keyDataLength
;
632 IPCKEY(ucsp_client_wrapKey(UCSP_ARGS
, ctxcopy
.data(), ctxcopy
.length(), wrappingKey
,
633 creds
.data(), creds
.length(),
634 keyToBeWrapped
, OPTIONALDATA(descriptiveData
),
635 &keyData
, &keyDataLength
),
637 context
.algorithm() == CSSM_ALGID_NONE
638 ? CSSM_ACL_AUTHORIZATION_EXPORT_CLEAR
: CSSM_ACL_AUTHORIZATION_EXPORT_WRAPPED
);
640 CopyOut
wrappedKeyXDR(keyData
, keyDataLength
+ sizeof(CSSM_KEY
), reinterpret_cast<xdrproc_t
>(xdr_CSSM_KEY_PTR
), true);
641 CssmWrappedKey
*wrappedKeyIPC
= reinterpret_cast<CssmWrappedKey
*>(wrappedKeyXDR
.data());
642 wrappedKey
.header() = wrappedKeyIPC
->header();
643 wrappedKey
.keyData() = CssmData(alloc
.malloc(wrappedKeyIPC
->keyData().length()), wrappedKeyIPC
->keyData().length());
644 memcpy(wrappedKey
.keyData().data(), wrappedKeyIPC
->keyData(), wrappedKeyIPC
->keyData().length());
647 void ClientSession::unwrapKey(DbHandle db
, const Context
&context
, KeyHandle key
,
648 KeyHandle publicKey
, const CssmWrappedKey
&wrappedKey
,
649 uint32 usage
, uint32 attr
,
650 const AccessCredentials
*cred
, const AclEntryInput
*acl
,
651 CssmData
&descriptiveData
,
652 KeyHandle
&newKey
, CssmKey::Header
&newHeader
, Allocator
&alloc
)
654 CopyIn
ctxcopy(&context
, reinterpret_cast<xdrproc_t
>(xdr_CSSM_CONTEXT
));
655 DataOutput
descriptor(descriptiveData
, alloc
);
656 CopyIn
creds(cred
, reinterpret_cast<xdrproc_t
>(xdr_CSSM_ACCESS_CREDENTIALS
));
657 CopyIn
proto(acl
? &acl
->proto() : NULL
, reinterpret_cast<xdrproc_t
>(xdr_CSSM_ACL_ENTRY_PROTOTYPE
));
658 CopyIn
wrappedKeyXDR(&wrappedKey
, reinterpret_cast<xdrproc_t
>(xdr_CSSM_KEY
));
660 mach_msg_type_number_t keyHeaderDataLength
;
662 IPCKEY(ucsp_client_unwrapKey(UCSP_ARGS
, db
, ctxcopy
.data(), ctxcopy
.length(), key
,
663 creds
.data(), creds
.length(), proto
.data(), proto
.length(),
664 publicKey
, wrappedKeyXDR
.data(), wrappedKeyXDR
.length(), usage
, attr
, DATA(descriptor
),
665 &newKey
, &keyHeaderData
, &keyHeaderDataLength
),
666 key
, CSSM_ACL_AUTHORIZATION_DECRYPT
);
668 CopyOut
wrappedKeyHeaderXDR(keyHeaderData
, keyHeaderDataLength
+ sizeof(CSSM_KEYHEADER
), reinterpret_cast<xdrproc_t
>(xdr_CSSM_KEYHEADER_PTR
), true);
669 newHeader
= *static_cast<CssmKey::Header
*>(reinterpret_cast<CSSM_KEYHEADER
*>(wrappedKeyHeaderXDR
.data()));
676 void ClientSession::getAcl(AclKind kind
, GenericHandle key
, const char *tag
,
677 uint32
&infoCount
, AclEntryInfo
* &infoArray
, Allocator
&alloc
)
680 void* info
; mach_msg_type_number_t infoLength
;
681 IPC(ucsp_client_getAcl(UCSP_ARGS
, kind
, key
,
682 (tag
!= NULL
), tag
? tag
: "",
683 &count
, &info
, &infoLength
));
685 CSSM_ACL_ENTRY_INFO_ARRAY_PTR aclsArray
;
686 if (!::copyout_chunked(info
, infoLength
, reinterpret_cast<xdrproc_t
>(xdr_CSSM_ACL_ENTRY_INFO_ARRAY_PTR
), reinterpret_cast<void**>(&aclsArray
)))
687 CssmError::throwMe(CSSM_ERRCODE_MEMORY_ERROR
);
689 infoCount
= aclsArray
->count
;
690 infoArray
= reinterpret_cast<AclEntryInfo
*>(aclsArray
->acls
);
694 void ClientSession::changeAcl(AclKind kind
, GenericHandle key
, const AccessCredentials
&cred
,
697 CopyIn
creds(&cred
, reinterpret_cast<xdrproc_t
>(xdr_CSSM_ACCESS_CREDENTIALS
));
698 //@@@ ignoring callback
699 CopyIn
newEntry(edit
.newEntry(), reinterpret_cast<xdrproc_t
>(xdr_CSSM_ACL_ENTRY_INPUT
));
701 IPCKEY(ucsp_client_changeAcl(UCSP_ARGS
, kind
, key
, creds
.data(), creds
.length(),
702 edit
.mode(), toIPCHandle(edit
.handle()), newEntry
.data(), newEntry
.length()),
703 key
, CSSM_ACL_AUTHORIZATION_CHANGE_ACL
);
706 void ClientSession::getOwner(AclKind kind
, GenericHandle key
, AclOwnerPrototype
&owner
,
709 void* proto
; mach_msg_type_number_t protoLength
;
710 IPC(ucsp_client_getOwner(UCSP_ARGS
, kind
, key
, &proto
, &protoLength
));
712 CSSM_ACL_OWNER_PROTOTYPE_PTR tmpOwner
;
713 if (!::copyout_chunked(proto
, protoLength
, reinterpret_cast<xdrproc_t
>(xdr_CSSM_ACL_OWNER_PROTOTYPE_PTR
), reinterpret_cast<void **>(&tmpOwner
)))
714 CssmError::throwMe(CSSM_ERRCODE_MEMORY_ERROR
);
715 owner
= *static_cast<AclOwnerPrototypePtr
>(tmpOwner
);
719 void ClientSession::changeOwner(AclKind kind
, GenericHandle key
,
720 const AccessCredentials
&cred
, const AclOwnerPrototype
&proto
)
722 CopyIn
creds(&cred
, reinterpret_cast<xdrproc_t
>(xdr_CSSM_ACCESS_CREDENTIALS
));
723 CopyIn
protos(&proto
, reinterpret_cast<xdrproc_t
>(xdr_CSSM_ACL_OWNER_PROTOTYPE
));
724 IPCKEY(ucsp_client_setOwner(UCSP_ARGS
, kind
, key
, creds
.data(), creds
.length(), protos
.data(), protos
.length()),
725 key
, CSSM_ACL_AUTHORIZATION_CHANGE_OWNER
);
729 void ClientSession::getKeyAcl(DbHandle db
, const char *tag
,
730 uint32
&count
, AclEntryInfo
* &info
, Allocator
&alloc
)
731 { getAcl(keyAcl
, db
, tag
, count
, info
, alloc
); }
733 void ClientSession::changeKeyAcl(DbHandle db
, const AccessCredentials
&cred
,
735 { changeAcl(keyAcl
, db
, cred
, edit
); }
737 void ClientSession::getKeyOwner(DbHandle db
, AclOwnerPrototype
&owner
, Allocator
&alloc
)
738 { getOwner(keyAcl
, db
, owner
, alloc
); }
740 void ClientSession::changeKeyOwner(DbHandle db
, const AccessCredentials
&cred
,
741 const AclOwnerPrototype
&edit
)
742 { changeOwner(keyAcl
, db
, cred
, edit
); }
744 void ClientSession::getDbAcl(DbHandle db
, const char *tag
,
745 uint32
&count
, AclEntryInfo
* &info
, Allocator
&alloc
)
746 { getAcl(dbAcl
, db
, tag
, count
, info
, alloc
); }
748 void ClientSession::changeDbAcl(DbHandle db
, const AccessCredentials
&cred
,
750 { changeAcl(dbAcl
, db
, cred
, edit
); }
752 void ClientSession::getDbOwner(DbHandle db
, AclOwnerPrototype
&owner
, Allocator
&alloc
)
753 { getOwner(dbAcl
, db
, owner
, alloc
); }
755 void ClientSession::changeDbOwner(DbHandle db
, const AccessCredentials
&cred
,
756 const AclOwnerPrototype
&edit
)
757 { changeOwner(dbAcl
, db
, cred
, edit
); }
761 // Database key management
763 void ClientSession::extractMasterKey(DbHandle db
, const Context
&context
, DbHandle sourceDb
,
764 uint32 keyUsage
, uint32 keyAttr
,
765 const AccessCredentials
*cred
, const AclEntryInput
*owner
,
766 KeyHandle
&newKey
, CssmKey::Header
&newHeader
, Allocator
&alloc
)
768 CopyIn
ctxcopy(&context
, reinterpret_cast<xdrproc_t
>(xdr_CSSM_CONTEXT
));
769 CopyIn
creds(cred
, reinterpret_cast<xdrproc_t
>(xdr_CSSM_ACCESS_CREDENTIALS
));
770 CopyIn
proto(owner
? &owner
->proto() : NULL
, reinterpret_cast<xdrproc_t
>(xdr_CSSM_ACL_ENTRY_PROTOTYPE
));
772 mach_msg_type_number_t keyHeaderDataLength
;
774 IPC(ucsp_client_extractMasterKey(UCSP_ARGS
, db
, ctxcopy
.data(), ctxcopy
.length(), sourceDb
,
775 creds
.data(), creds
.length(), proto
.data(), proto
.length(),
776 keyUsage
, keyAttr
, &newKey
, &keyHeaderData
, &keyHeaderDataLength
));
778 CopyOut
wrappedKeyHeaderXDR(keyHeaderData
, keyHeaderDataLength
+ sizeof(CSSM_KEYHEADER
), reinterpret_cast<xdrproc_t
>(xdr_CSSM_KEYHEADER_PTR
), true);
779 newHeader
= *static_cast<CssmKey::Header
*>(reinterpret_cast<CSSM_KEYHEADER
*>(wrappedKeyHeaderXDR
.data()));
784 // Authorization subsystem entry
786 void ClientSession::authCreate(const AuthorizationItemSet
*rights
,
787 const AuthorizationItemSet
*environment
, AuthorizationFlags flags
,
788 AuthorizationBlob
&result
)
790 void *rightSet
= NULL
; mach_msg_size_t rightSet_size
= 0;
791 void *environ
= NULL
; mach_msg_size_t environ_size
= 0;
794 !copyin_AuthorizationItemSet(rights
, &rightSet
, &rightSet_size
)) ||
796 !copyin_AuthorizationItemSet(environment
, &environ
, &environ_size
)))
797 CssmError::throwMe(errAuthorizationInternal
);
800 IPCSTART(ucsp_client_authorizationCreate(UCSP_ARGS
,
801 rightSet
, rightSet_size
,
803 environ
, environ_size
,
809 if (rcode
== CSSMERR_CSSM_NO_USER_INTERACTION
)
810 CssmError::throwMe(errAuthorizationInteractionNotAllowed
);
814 void ClientSession::authRelease(const AuthorizationBlob
&auth
,
815 AuthorizationFlags flags
)
818 IPCSTART(ucsp_client_authorizationRelease(UCSP_ARGS
, auth
, flags
));
819 if (rcode
== CSSMERR_CSSM_NO_USER_INTERACTION
)
820 CssmError::throwMe(errAuthorizationInteractionNotAllowed
);
824 void ClientSession::authCopyRights(const AuthorizationBlob
&auth
,
825 const AuthorizationItemSet
*rights
, const AuthorizationItemSet
*environment
,
826 AuthorizationFlags flags
,
827 AuthorizationItemSet
**grantedRights
)
829 void *rightSet
= NULL
; mach_msg_size_t rightSet_size
= 0;
830 void *environ
= NULL
; mach_msg_size_t environ_size
= 0;
831 void *result
= NULL
; mach_msg_type_number_t resultLength
= 0;
833 if ((rights
&& !copyin_AuthorizationItemSet(rights
, &rightSet
, &rightSet_size
)) ||
834 (environment
&& !copyin_AuthorizationItemSet(environment
, &environ
, &environ_size
)))
835 CssmError::throwMe(errAuthorizationInternal
); // allocation error probably
838 IPCSTART(ucsp_client_authorizationCopyRights(UCSP_ARGS
,
840 rightSet
, rightSet_size
,
841 flags
| (grantedRights
? 0 : kAuthorizationFlagNoData
),
842 environ
, environ_size
,
843 &result
, &resultLength
));
848 // XXX/cs return error when copyout returns false
849 if (rcode
== CSSM_OK
&& grantedRights
)
850 copyout_AuthorizationItemSet(result
, resultLength
, grantedRights
);
853 mig_deallocate(reinterpret_cast<vm_address_t
>(result
), resultLength
);
854 if (rcode
== CSSMERR_CSSM_NO_USER_INTERACTION
)
855 CssmError::throwMe(errAuthorizationInteractionNotAllowed
);
859 void ClientSession::authCopyInfo(const AuthorizationBlob
&auth
,
861 AuthorizationItemSet
* &info
)
865 else if (tag
[0] == '\0')
866 MacOSError::throwMe(errAuthorizationInvalidTag
);
869 void *result
; mach_msg_type_number_t resultLength
;
870 IPCSTART(ucsp_client_authorizationCopyInfo(UCSP_ARGS
, auth
, tag
, &result
, &resultLength
));
872 // XXX/cs return error when copyout returns false
873 if (rcode
== CSSM_OK
)
874 copyout_AuthorizationItemSet(result
, resultLength
, &info
);
877 mig_deallocate(reinterpret_cast<vm_address_t
>(result
), resultLength
);
879 if (rcode
== CSSMERR_CSSM_NO_USER_INTERACTION
)
880 CssmError::throwMe(errAuthorizationInteractionNotAllowed
);
884 void ClientSession::authExternalize(const AuthorizationBlob
&auth
,
885 AuthorizationExternalForm
&extForm
)
888 IPCSTART(ucsp_client_authorizationExternalize(UCSP_ARGS
, auth
, &extForm
));
889 if (rcode
== CSSMERR_CSSM_NO_USER_INTERACTION
)
890 CssmError::throwMe(errAuthorizationInteractionNotAllowed
);
894 void ClientSession::authInternalize(const AuthorizationExternalForm
&extForm
,
895 AuthorizationBlob
&auth
)
898 IPCSTART(ucsp_client_authorizationInternalize(UCSP_ARGS
, extForm
, &auth
));
899 if (rcode
== CSSMERR_CSSM_NO_USER_INTERACTION
)
900 CssmError::throwMe(errAuthorizationInteractionNotAllowed
);
906 // Push user preferences from an app in user space to securityd
908 void ClientSession::setSessionUserPrefs(SecuritySessionId sessionId
, uint32_t userPreferencesLength
, const void *userPreferences
)
910 IPC(ucsp_client_setSessionUserPrefs(UCSP_ARGS
, sessionId
, const_cast<void *>(userPreferences
), userPreferencesLength
));
914 void ClientSession::postNotification(NotificationDomain domain
, NotificationEvent event
, const CssmData
&data
)
916 uint32 seq
= ++mGlobal().thread().notifySeq
;
918 if (getenv("NOTIFYJITTER")) {
919 // artificially reverse odd/even sequences to test securityd's jitter buffer
920 seq
+= 2 * (seq
% 2) - 1;
921 secdebug("notify", "POSTING FAKE SEQUENCE %d NOTIFICATION", seq
);
924 secdebug("notify", "posting domain 0x%x event %d sequence %d",
926 IPC(ucsp_client_postNotification(UCSP_ARGS
, domain
, event
, DATA(data
), seq
));
930 // authorizationdbGet/Set/Remove
932 void ClientSession::authorizationdbGet(const AuthorizationString rightname
, CssmData
&rightDefinition
, Allocator
&alloc
)
934 DataOutput
definition(rightDefinition
, alloc
);
936 IPCSTART(ucsp_client_authorizationdbGet(UCSP_ARGS
, rightname
, DATA(definition
)));
937 if (rcode
== CSSMERR_CSSM_NO_USER_INTERACTION
)
938 CssmError::throwMe(errAuthorizationInteractionNotAllowed
);
942 void ClientSession::authorizationdbSet(const AuthorizationBlob
&auth
, const AuthorizationString rightname
, uint32_t rightDefinitionLength
, const void *rightDefinition
)
944 // @@@ DATA_IN in transition.cpp is not const void *
946 IPCSTART(ucsp_client_authorizationdbSet(UCSP_ARGS
, auth
, rightname
, const_cast<void *>(rightDefinition
), rightDefinitionLength
));
947 if (rcode
== CSSMERR_CSSM_NO_USER_INTERACTION
)
948 CssmError::throwMe(errAuthorizationInteractionNotAllowed
);
952 void ClientSession::authorizationdbRemove(const AuthorizationBlob
&auth
, const AuthorizationString rightname
)
955 IPCSTART(ucsp_client_authorizationdbRemove(UCSP_ARGS
, auth
, rightname
));
956 if (rcode
== CSSMERR_CSSM_NO_USER_INTERACTION
)
957 CssmError::throwMe(errAuthorizationInteractionNotAllowed
);
963 // Miscellaneous administrative calls
965 void ClientSession::addCodeEquivalence(const CssmData
&oldHash
, const CssmData
&newHash
,
966 const char *name
, bool forSystem
/* = false */)
968 IPC(ucsp_client_addCodeEquivalence(UCSP_ARGS
, DATA(oldHash
), DATA(newHash
),
972 void ClientSession::removeCodeEquivalence(const CssmData
&hash
, const char *name
, bool forSystem
/* = false */)
974 IPC(ucsp_client_removeCodeEquivalence(UCSP_ARGS
, DATA(hash
), name
, forSystem
));
977 void ClientSession::setAlternateSystemRoot(const char *path
)
979 IPC(ucsp_client_setAlternateSystemRoot(UCSP_ARGS
, path
));
984 // Code Signing related
986 void ClientSession::registerHosting(mach_port_t hostingPort
, SecCSFlags flags
)
988 IPC(ucsp_client_registerHosting(UCSP_ARGS
, hostingPort
, flags
));
991 mach_port_t
ClientSession::hostingPort(pid_t pid
)
994 IPC(ucsp_client_hostingPort(UCSP_ARGS
, pid
, &result
));
998 SecGuestRef
ClientSession::createGuest(SecGuestRef host
,
999 uint32_t status
, const char *path
, const CssmData
&cdhash
, const CssmData
&attributes
, SecCSFlags flags
)
1001 SecGuestRef newGuest
;
1002 IPC(ucsp_client_createGuest(UCSP_ARGS
, host
, status
, path
, DATA(cdhash
), DATA(attributes
), flags
, &newGuest
));
1003 if (flags
& kSecCSDedicatedHost
) {
1004 secdebug("ssclient", "setting dedicated guest to 0x%x (was 0x%x)",
1005 mDedicatedGuest
, newGuest
);
1006 mDedicatedGuest
= newGuest
;
1011 void ClientSession::setGuestStatus(SecGuestRef guest
, uint32 status
, const CssmData
&attributes
)
1013 IPC(ucsp_client_setGuestStatus(UCSP_ARGS
, guest
, status
, DATA(attributes
)));
1016 void ClientSession::removeGuest(SecGuestRef host
, SecGuestRef guest
)
1018 IPC(ucsp_client_removeGuest(UCSP_ARGS
, host
, guest
));
1021 void ClientSession::selectGuest(SecGuestRef newGuest
)
1023 if (mDedicatedGuest
) {
1024 secdebug("ssclient", "ignoring selectGuest(0x%x) because dedicated guest=0x%x",
1025 newGuest
, mDedicatedGuest
);
1027 secdebug("ssclient", "switching to guest 0x%x", newGuest
);
1028 mGlobal().thread().currentGuest
= newGuest
;
1032 SecGuestRef
ClientSession::selectedGuest() const
1034 if (mDedicatedGuest
)
1035 return mDedicatedGuest
;
1037 return mGlobal().thread().currentGuest
;
1041 } // end namespace SecurityServer
1042 } // end namespace Security