#ifndef _SECURITYTOKEND_SECTOKEND_H_
#define _SECURITYTOKEND_SECTOKEND_H_ 1
#include <stdint.h>
#include <Security/cssm.h>
#include <PCSC/winscard.h>
#include <sys/param.h>
#ifdef __cplusplus
extern "C" {
#endif
enum {
kSecTokendCallbackVersion = 11 };
enum {
TOKEND_MAX_UID = 128 };
typedef uint32 SecTokendCallbackFlags;
typedef uint32 SecTokendProbeFlags;
typedef uint32 SecTokendEstablishFlags;
enum {
kSecTokendCallbacksDefault = 0,
kSecTokendProbeDefault = 0, kSecTokendProbeKeepToken = 0x0001,
kSecTokendEstablishNewCache = 0x0001, kSecTokendEstablishMakeMDS = 0x0002,
kSecTokendCallbacksTestNoServer = 0x0001, };
typedef struct {
CSSM_DB_RECORD_ATTRIBUTE_DATA *attributes; CSSM_DATA *data; CSSM_HANDLE record; CSSM_HANDLE keyhandle; } TOKEND_RETURN_DATA;
typedef struct
{
uint32_t version;
SecTokendCallbackFlags flags;
CSSM_RETURN (*initial)();
CSSM_RETURN (*probe)(SecTokendProbeFlags flags, uint32 *score, char tokenUid[TOKEND_MAX_UID]);
CSSM_RETURN (*establish)(const CSSM_GUID *guid, uint32 subserviceId,
SecTokendEstablishFlags flags, const char *cacheDirectory, const char *workDirectory,
char mdsDirectory[PATH_MAX], char printName[PATH_MAX]);
CSSM_RETURN (*terminate)(uint32 reason, uint32 options);
CSSM_RETURN (*findFirst)(const CSSM_QUERY *query, TOKEND_RETURN_DATA *data,
CSSM_HANDLE *hSearch);
CSSM_RETURN (*findNext)(CSSM_HANDLE hSearch, TOKEND_RETURN_DATA *data);
CSSM_RETURN (*findRecordHandle)(CSSM_HANDLE hRecord, TOKEND_RETURN_DATA *data);
CSSM_RETURN (*insertRecord)(CSSM_DB_RECORDTYPE recordType,
const CSSM_DB_RECORD_ATTRIBUTE_DATA *attributes, const CSSM_DATA *data,
CSSM_HANDLE *hRecord);
CSSM_RETURN (*modifyRecord)(CSSM_DB_RECORDTYPE recordType, CSSM_HANDLE *hRecord,
const CSSM_DB_RECORD_ATTRIBUTE_DATA *attributes, const CSSM_DATA *data,
CSSM_DB_MODIFY_MODE modifyMode);
CSSM_RETURN (*deleteRecord)(CSSM_HANDLE hRecord);
CSSM_RETURN (*releaseSearch)(CSSM_HANDLE hSearch);
CSSM_RETURN (*releaseRecord)(CSSM_HANDLE hRecord);
CSSM_RETURN (*freeRetrievedData)(TOKEND_RETURN_DATA *data);
CSSM_RETURN (*releaseKey)(CSSM_HANDLE hKey);
CSSM_RETURN (*getKeySize)(CSSM_HANDLE hKey, CSSM_KEY_SIZE *size);
CSSM_RETURN (*getOutputSize)(const CSSM_CONTEXT *context, CSSM_HANDLE hKey,
uint32 inputSize, CSSM_BOOL encrypting, uint32 *outputSize);
CSSM_RETURN (*generateSignature)(const CSSM_CONTEXT *context, CSSM_HANDLE hKey,
CSSM_ALGORITHMS signOnly, const CSSM_DATA *input, CSSM_DATA *signature);
CSSM_RETURN (*verifySignature)(const CSSM_CONTEXT *context, CSSM_HANDLE hKey,
CSSM_ALGORITHMS signOnly, const CSSM_DATA *input, const CSSM_DATA *signature);
CSSM_RETURN (*generateMac)(const CSSM_CONTEXT *context, CSSM_HANDLE hKey,
const CSSM_DATA *input, CSSM_DATA *mac);
CSSM_RETURN (*verifyMac)(const CSSM_CONTEXT *context, CSSM_HANDLE hKey,
const CSSM_DATA *input, const CSSM_DATA *mac);
CSSM_RETURN (*encrypt)(const CSSM_CONTEXT *context, CSSM_HANDLE hKey,
const CSSM_DATA *clear, CSSM_DATA *cipher);
CSSM_RETURN (*decrypt)(const CSSM_CONTEXT *context, CSSM_HANDLE hKey,
const CSSM_DATA *cipher, CSSM_DATA *clear);
CSSM_RETURN (*generateKey)(const CSSM_CONTEXT *context,
const CSSM_ACCESS_CREDENTIALS *creds, const CSSM_ACL_ENTRY_PROTOTYPE *owner,
CSSM_KEYUSE usage, CSSM_KEYATTR_FLAGS attrs,
CSSM_HANDLE *hKey, CSSM_KEY *header);
CSSM_RETURN (*generateKeyPair)(const CSSM_CONTEXT *context,
const CSSM_ACCESS_CREDENTIALS *creds, const CSSM_ACL_ENTRY_PROTOTYPE *owner,
CSSM_KEYUSE pubUsage, CSSM_KEYATTR_FLAGS pubAttrs,
CSSM_KEYUSE privUsage, CSSM_KEYATTR_FLAGS privAttrs,
CSSM_HANDLE *hPubKey, CSSM_KEY *pubHeader,
CSSM_HANDLE *hPrivKey, CSSM_KEY *privHeader);
CSSM_RETURN (*wrapKey)(const CSSM_CONTEXT *context,
CSSM_HANDLE hWrappingKey, const CSSM_KEY *wrappingKey, const CSSM_ACCESS_CREDENTIALS *cred,
CSSM_HANDLE hKeyToBeWrapped, const CSSM_KEY *keyToBeWrapped, const CSSM_DATA *descriptiveData,
CSSM_KEY *wrappedKey);
CSSM_RETURN (*unwrapKey)(const CSSM_CONTEXT *context,
CSSM_HANDLE hWrappingKey, const CSSM_KEY *wrappingKey, const CSSM_ACCESS_CREDENTIALS *cred,
const CSSM_ACL_ENTRY_PROTOTYPE *access,
CSSM_HANDLE hPublicKey, const CSSM_KEY *publicKey, const CSSM_KEY *wrappedKey,
CSSM_KEYUSE usage, CSSM_KEYATTR_FLAGS attributes,
CSSM_DATA *descriptiveData,
CSSM_HANDLE *hUnwrappedKey, CSSM_KEY *unwrappedKey);
CSSM_RETURN (*deriveKey)(const CSSM_CONTEXT *context,
CSSM_HANDLE hSourceKey, const CSSM_KEY *sourceKey, const CSSM_ACCESS_CREDENTIALS *cred,
const CSSM_ACL_ENTRY_PROTOTYPE *access, CSSM_DATA *parameters,
CSSM_KEYUSE usage, CSSM_KEYATTR_FLAGS attributes,
CSSM_HANDLE *hKey, CSSM_KEY *key);
CSSM_RETURN (*getDatabaseOwner)(CSSM_ACL_OWNER_PROTOTYPE *owner);
CSSM_RETURN (*getDatabaseAcl)(const char *tag, uint32 *count, CSSM_ACL_ENTRY_INFO **entries);
CSSM_RETURN (*getObjectOwner)(CSSM_HANDLE hRecord, CSSM_ACL_OWNER_PROTOTYPE *owner);
CSSM_RETURN (*getObjectAcl)(CSSM_HANDLE hRecord, const char *tag,
uint32 *count, CSSM_ACL_ENTRY_INFO **entries);
CSSM_RETURN (*getKeyOwner)(CSSM_HANDLE hKey, CSSM_ACL_OWNER_PROTOTYPE *owner);
CSSM_RETURN (*getKeyAcl)(CSSM_HANDLE hKey,
const char *tag, uint32 *count, CSSM_ACL_ENTRY_INFO **entries);
CSSM_RETURN (*freeOwnerData)(CSSM_ACL_OWNER_PROTOTYPE *owner);
CSSM_RETURN (*freeAclData)(uint32 count, CSSM_ACL_ENTRY_INFO *entries);
CSSM_RETURN (*authenticateDatabase)(CSSM_DB_ACCESS_TYPE mode,
const CSSM_ACCESS_CREDENTIALS *cred);
CSSM_RETURN (*changeDatabaseOwner)(const CSSM_ACL_OWNER_PROTOTYPE *owner);
CSSM_RETURN (*changeDatabaseAcl)(const CSSM_ACCESS_CREDENTIALS *cred, const CSSM_ACL_EDIT *edit);
CSSM_RETURN (*changeObjectOwner)(CSSM_HANDLE hRecord, const CSSM_ACL_OWNER_PROTOTYPE *owner);
CSSM_RETURN (*changeObjectAcl)(CSSM_HANDLE hRecord, const CSSM_ACCESS_CREDENTIALS *cred, const CSSM_ACL_EDIT *edit);
CSSM_RETURN (*changeKeyOwner)(CSSM_HANDLE key, const CSSM_ACL_OWNER_PROTOTYPE *owner);
CSSM_RETURN (*changeKeyAcl)(CSSM_HANDLE key, const CSSM_ACCESS_CREDENTIALS *cred, const CSSM_ACL_EDIT *edit);
CSSM_RETURN (*generateRandom)(const CSSM_CONTEXT *context, CSSM_DATA *result);
CSSM_RETURN (*getStatistics)(CSSM_CSP_OPERATIONAL_STATISTICS *result);
CSSM_RETURN (*getTime)(CSSM_ALGORITHMS algorithm, CSSM_DATA *result);
CSSM_RETURN (*getCounter)(CSSM_DATA *result);
CSSM_RETURN (*selfVerify)();
CSSM_RETURN (*cspPassThrough)(uint32 id, const CSSM_CONTEXT *context,
CSSM_HANDLE hKey, const CSSM_KEY *key, const CSSM_DATA *input, CSSM_DATA *output);
CSSM_RETURN (*dlPassThrough)(uint32 id, const CSSM_DATA *input, CSSM_DATA *output);
CSSM_RETURN (*isLocked)(uint32 *locked);
} SecTokendCallbacks;
typedef struct {
const SCARD_READERSTATE *(*startupReaderInfo)(); const char *(*tokenUid)(); void *(*malloc)(uint32 size); void (*free)(void *data); void *(*mallocSensitive)(uint32 size); void (*freeSensitive)(void *data); } SecTokendSupport;
int SecTokendMain(int argc, const char * argv[], const SecTokendCallbacks *callbacks, SecTokendSupport *support);
#ifdef __cplusplus
}
#endif
#endif