#ifndef _H_TDCLIENT
#define _H_TDCLIENT
#include <securityd_client/sscommon.h>
#include <SecurityTokend/SecTokend.h>
#include <security_cdsa_utilities/cssmkey.h>
#include <security_utilities/unix++.h>
#define __MigTypeCheck 1
namespace Security {
namespace Tokend {
using namespace SecurityServer;
#define TDPROTOVERSION 5
class ClientSession : public ClientCommon {
public:
ClientSession(Allocator &standard, Allocator &returning);
virtual ~ClientSession();
Port servicePort() const { return mServicePort; }
public:
typedef uint32 Score;
void probe(Score &score, std::string &tokenUid);
void establish(Guid &guid, uint32 subserviceID,
uint32 flags, const char *cacheDirectory, const char *workDirectory,
char mdsDirectory[PATH_MAX], char printName[PATH_MAX]);
void terminate(uint32 reason, uint32 options);
RecordHandle findFirst(const CssmQuery &query,
CssmDbRecordAttributeData *inAttributes, size_t inAttributesLength,
SearchHandle &hSearch, CssmData *outData, KeyHandle &hKey,
CssmDbRecordAttributeData *&outAttributes, mach_msg_type_number_t &outAttributesLength);
RecordHandle findNext(SearchHandle hSearch,
CssmDbRecordAttributeData *inAttributes, size_t inAttributesLength,
CssmData *outData, KeyHandle &hKey,
CssmDbRecordAttributeData *&outAttributes, mach_msg_type_number_t &outAttributesLength);
void findRecordHandle(RecordHandle record,
CssmDbRecordAttributeData *inAttributes, size_t inAttributesLength,
CssmData *inOutData, KeyHandle &hKey,
CssmDbRecordAttributeData *&outAttributes, mach_msg_type_number_t &outAttributesLength);
void insertRecord(CSSM_DB_RECORDTYPE recordType,
const CssmDbRecordAttributeData *attributes, size_t attributesLength,
const CssmData &data, RecordHandle &hRecord);
void modifyRecord(CSSM_DB_RECORDTYPE recordType, RecordHandle &hRecord,
const CssmDbRecordAttributeData *attributes, size_t attributesLength,
const CssmData *data, CSSM_DB_MODIFY_MODE modifyMode);
void deleteRecord(RecordHandle hRecord);
void releaseSearch(SearchHandle hSeearch);
void releaseRecord(RecordHandle hRecord);
public:
void releaseKey(KeyHandle key);
void queryKeySizeInBits(KeyHandle key, CssmKeySize &result);
void getOutputSize(const Security::Context &context, KeyHandle key,
uint32 inputSize, bool encrypt, uint32 &result);
void encrypt(const Security::Context &context, KeyHandle key,
const CssmData &in, CssmData &out);
void decrypt(const Security::Context &context, KeyHandle key,
const CssmData &in, CssmData &out);
void generateSignature(const Security::Context &context, KeyHandle key,
const CssmData &data, CssmData &signature,
CSSM_ALGORITHMS signOnlyAlgorithm = CSSM_ALGID_NONE);
void verifySignature(const Security::Context &context, KeyHandle key,
const CssmData &data, const CssmData &signature,
CSSM_ALGORITHMS verifyOnlyAlgorithm = CSSM_ALGID_NONE);
void generateMac(const Security::Context &context, KeyHandle key,
const CssmData &data, CssmData &mac);
void verifyMac(const Security::Context &context, KeyHandle key,
const CssmData &data, const CssmData &mac);
public:
void generateKey(const Security::Context &context,
const AccessCredentials *cred, const AclEntryPrototype *owner,
uint32 keyUsage, uint32 keyAttr,
KeyHandle &hKey, CssmKey *&key);
void generateKey(const Security::Context &context,
const AccessCredentials *cred, const AclEntryPrototype *owner,
CSSM_KEYUSE pubKeyUsage, CSSM_KEYATTR_FLAGS pubKeyAttr,
CSSM_KEYUSE privKeyUsage, CSSM_KEYATTR_FLAGS privKeyAttr,
KeyHandle &hPublic, CssmKey *&publicKey,
KeyHandle &hPrivate, CssmKey *&privateKey);
public:
void wrapKey(const Security::Context &context, const AccessCredentials *cred,
KeyHandle hWrappingKey, const CssmKey *wrappingKey,
KeyHandle hSubjectKey, const CssmKey *subjectKey,
const CssmData &descriptiveData, CssmWrappedKey *&wrappedKey);
void unwrapKey(const Security::Context &context,
const AccessCredentials *cred, const AclEntryPrototype *owner,
KeyHandle hSourceKey, const CssmKey *sourceKey,
KeyHandle hPublicKey, const CssmKey *publicKey,
const CssmWrappedKey &wrappedKey, uint32 keyUsage, uint32 keyAttr,
CssmData &data, KeyHandle &hUnwrappedKey, CssmKey *&unwrappedKey);
void deriveKey(DbHandle db, const Security::Context &context,
KeyHandle hBaseKey, const CssmKey *baseKey,
uint32 keyUsage, uint32 keyAttr, CssmData ¶m,
const AccessCredentials *cred, const AclEntryPrototype *owner,
KeyHandle &hDerivedKey, CssmKey *&derivedKey);
void generateRandom(CssmData &data);
public:
void authenticate(CSSM_DB_ACCESS_TYPE mode, const AccessCredentials *cred);
void getAcl(AclKind kind, GenericHandle key, const char *tag,
uint32 &count, AclEntryInfo * &info);
void changeAcl(AclKind kind, GenericHandle key,
const AccessCredentials &cred, const AclEdit &edit);
void getOwner(AclKind kind, GenericHandle key, AclOwnerPrototype *&owner);
void changeOwner(AclKind kind, GenericHandle key, const AccessCredentials &cred,
const AclOwnerPrototype &edit);
bool isLocked();
public:
virtual void fault();
protected:
void servicePort(Port p);
private:
void check(kern_return_t rc);
private:
Port mServicePort; ReceivePort mReplyPort; };
} }
#endif //_H_TDCLIENT