1 /* 2 * CDDL HEADER START 3 * 4 * The contents of this file are subject to the terms of the 5 * Common Development and Distribution License, Version 1.0 only 6 * (the "License"). You may not use this file except in compliance 7 * with the License. 8 * 9 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 10 * or http://www.opensolaris.org/os/licensing. 11 * See the License for the specific language governing permissions 12 * and limitations under the License. 13 * 14 * When distributing Covered Code, include this CDDL HEADER in each 15 * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 16 * If applicable, add the following below this CDDL HEADER, with the 17 * fields enclosed by brackets "[]" replaced with your own identifying 18 * information: Portions Copyright [yyyy] [name of copyright owner] 19 * 20 * CDDL HEADER END 21 */ 22 /* 23 * Copyright 2006 Sun Microsystems, Inc. All rights reserved. 24 * Use is subject to license terms. 25 */ 26 27 #ifndef _SOFTKEYSTORE_H 28 #define _SOFTKEYSTORE_H 29 30 #pragma ident "%Z%%M% %I% %E% SMI" 31 32 #ifdef __cplusplus 33 extern "C" { 34 #endif 35 36 #include <sys/types.h> 37 #include <security/pkcs11t.h> 38 39 #define PBKD2_SALT_SIZE 16 40 #define PBKD2_ITERATIONS (1000) 41 #define PWD_BUFFER_SIZE 1024 42 43 extern boolean_t soft_token_present; 44 45 /* 46 * The following structure is the object header 47 * in the keystore. 48 */ 49 typedef struct ks_obj_hdr { 50 uint64_t class; 51 uint64_t key_type; 52 uint64_t cert_type; 53 uint64_t bool_attr_mask; 54 uint64_t mechanism; 55 uchar_t object_type; 56 57 /* Extra non-boolean attribute list */ 58 int num_attrs; 59 } ks_obj_hdr_t; 60 61 /* 62 * This structure contains the individual attribute 63 * (from extra_attrlistp) in the keystore. 64 */ 65 typedef struct ks_attr_hdr { 66 uint64_t type; 67 uint64_t ulValueLen; 68 } ks_attr_hdr_t; 69 70 #define ROUNDUP(x, y) roundup(x, y) /* defined in sys/sysmacros.h */ 71 72 #ifdef _LITTLE_ENDIAN 73 #define SWAP16(value) \ 74 ((((value) & 0xff) << 8) | ((value) >> 8)) 75 76 #define SWAP32(value) \ 77 (((uint32_t)SWAP16((uint16_t)((value) & 0xffff)) << 16) | \ 78 (uint32_t)SWAP16((uint16_t)((value) >> 16))) 79 80 #define SWAP64(value) \ 81 (((uint64_t)SWAP32((uint32_t)((value) & 0xffffffff)) \ 82 << 32) | \ 83 (uint64_t)SWAP32((uint32_t)((value) >> 32))) 84 #else /* !_LITTLE_ENDIAN */ 85 #define SWAP16(value) (value) 86 #define SWAP32(value) (value) 87 #define SWAP64(value) (value) 88 #endif 89 90 /* 91 * Function Prototypes 92 */ 93 CK_RV soft_gen_iv(CK_BYTE *iv); 94 95 int soft_gen_hashed_pin(CK_UTF8CHAR_PTR pPin, char **result, char **salt); 96 97 CK_RV soft_verify_pin(CK_UTF8CHAR_PTR pPin, CK_ULONG ulPinLen); 98 99 CK_RV soft_gen_crypt_key(uchar_t *pPIN, soft_object_t **key, 100 CK_BYTE **saltdata); 101 102 CK_RV soft_gen_hmac_key(uchar_t *pPIN, soft_object_t **key, CK_BYTE **saltdata); 103 104 CK_RV soft_keystore_pack_obj(struct object *obj, uchar_t **ks_buf, size_t *len); 105 106 CK_RV soft_keystore_unpack_obj(struct object *obj, ks_obj_t *ks_obj); 107 108 CK_RV soft_unpack_obj_attribute(uchar_t *buf, biginteger_t *key_dest, 109 cert_attr_t **cert_dest, ulong_t *offset, boolean_t cert); 110 111 ulong_t soft_pack_object_size(struct object *objp); 112 113 CK_RV soft_pack_object(struct object *objp, uchar_t *buf); 114 115 CK_RV soft_unpack_object(struct object *objp, uchar_t *buf); 116 117 CK_RV soft_setpin(CK_UTF8CHAR_PTR pOldPin, CK_ULONG ulOldPinLen, 118 CK_UTF8CHAR_PTR pNewPin, CK_ULONG ulNewPinLen); 119 120 CK_RV soft_put_object_to_keystore(struct object *objp); 121 122 CK_RV soft_modify_object_to_keystore(struct object *objp); 123 124 CK_RV soft_get_token_objects_from_keystore(ks_search_type_t type); 125 126 CK_RV soft_init_token_session(void); 127 128 void soft_destroy_token_session(void); 129 130 CK_RV soft_keystore_crypt(soft_object_t *key_p, uchar_t *ivec, 131 boolean_t encrypt, CK_BYTE_PTR in, CK_ULONG in_len, CK_BYTE_PTR out, 132 CK_ULONG_PTR out_len); 133 134 CK_RV soft_keystore_hmac(soft_object_t *key_p, boolean_t sign, 135 CK_BYTE_PTR in, CK_ULONG in_len, CK_BYTE_PTR out, CK_ULONG_PTR out_len); 136 137 138 #ifdef __cplusplus 139 } 140 #endif 141 142 #endif /* _SOFTKEYSTORE_H */ 143