#ifndef _SOFTKEYSTORE_H
#define _SOFTKEYSTORE_H
#ifdef __cplusplus
extern "C" {
#endif
#include <sys/types.h>
#include <security/pkcs11t.h>
#define PBKD2_SALT_SIZE 16
#define PBKD2_ITERATIONS (1000)
#define PWD_BUFFER_SIZE 1024
typedef struct ks_obj_hdr {
uint64_t class;
uint64_t key_type;
uint64_t cert_type;
uint64_t bool_attr_mask;
uint64_t mechanism;
uchar_t object_type;
int num_attrs;
} ks_obj_hdr_t;
typedef struct ks_attr_hdr {
uint64_t type;
uint64_t ulValueLen;
} ks_attr_hdr_t;
#define ROUNDUP(x, y) roundup(x, y)
#ifdef _LITTLE_ENDIAN
#define SWAP16(value) \
((((value) & 0xff) << 8) | ((value) >> 8))
#define SWAP32(value) \
(((uint32_t)SWAP16((uint16_t)((value) & 0xffff)) << 16) | \
(uint32_t)SWAP16((uint16_t)((value) >> 16)))
#define SWAP64(value) \
(((uint64_t)SWAP32((uint32_t)((value) & 0xffffffff)) \
<< 32) | \
(uint64_t)SWAP32((uint32_t)((value) >> 32)))
#else
#define SWAP16(value) (value)
#define SWAP32(value) (value)
#define SWAP64(value) (value)
#endif
int soft_gen_hashed_pin(CK_UTF8CHAR_PTR pPin, char **result, char **salt);
CK_RV soft_verify_pin(CK_UTF8CHAR_PTR pPin, CK_ULONG ulPinLen);
CK_RV soft_gen_crypt_key(uchar_t *pPIN, soft_object_t **key,
CK_BYTE **saltdata);
CK_RV soft_gen_hmac_key(uchar_t *pPIN, soft_object_t **key, CK_BYTE **saltdata);
CK_RV soft_keystore_pack_obj(struct object *obj, uchar_t **ks_buf, size_t *len);
CK_RV soft_keystore_unpack_obj(struct object *obj, ks_obj_t *ks_obj);
CK_RV soft_unpack_obj_attribute(uchar_t *buf, biginteger_t *key_dest,
cert_attr_t **cert_dest, ulong_t *offset, boolean_t cert);
ulong_t soft_pack_object_size(struct object *objp);
CK_RV soft_pack_object(struct object *objp, uchar_t *buf);
CK_RV soft_unpack_object(struct object *objp, uchar_t *buf);
CK_RV soft_setpin(CK_UTF8CHAR_PTR pOldPin, CK_ULONG ulOldPinLen,
CK_UTF8CHAR_PTR pNewPin, CK_ULONG ulNewPinLen);
CK_RV soft_put_object_to_keystore(struct object *objp);
CK_RV soft_modify_object_to_keystore(struct object *objp);
CK_RV soft_get_token_objects_from_keystore(ks_search_type_t type);
CK_RV soft_init_token_session(void);
void soft_destroy_token_session(void);
CK_RV soft_keystore_crypt(soft_object_t *key_p, uchar_t *ivec,
boolean_t encrypt, CK_BYTE_PTR in, CK_ULONG in_len, CK_BYTE_PTR out,
CK_ULONG_PTR out_len);
CK_RV soft_keystore_hmac(soft_object_t *key_p, boolean_t sign,
CK_BYTE_PTR in, CK_ULONG in_len, CK_BYTE_PTR out, CK_ULONG_PTR out_len);
#ifdef __cplusplus
}
#endif
#endif