1/* 2 * The device /dev/cryptocop is accessible using this driver using 3 * CRYPTOCOP_MAJOR (254) and minor number 0. 4 */ 5 6#ifndef CRYPTOCOP_H 7#define CRYPTOCOP_H 8 9#include <linux/uio.h> 10 11 12#define CRYPTOCOP_SESSION_ID_NONE (0) 13 14typedef unsigned long long int cryptocop_session_id; 15 16/* cryptocop ioctls */ 17#define ETRAXCRYPTOCOP_IOCTYPE (250) 18 19#define CRYPTOCOP_IO_CREATE_SESSION _IOWR(ETRAXCRYPTOCOP_IOCTYPE, 1, struct strcop_session_op) 20#define CRYPTOCOP_IO_CLOSE_SESSION _IOW(ETRAXCRYPTOCOP_IOCTYPE, 2, struct strcop_session_op) 21#define CRYPTOCOP_IO_PROCESS_OP _IOWR(ETRAXCRYPTOCOP_IOCTYPE, 3, struct strcop_crypto_op) 22#define CRYPTOCOP_IO_MAXNR (3) 23 24typedef enum { 25 cryptocop_cipher_des = 0, 26 cryptocop_cipher_3des = 1, 27 cryptocop_cipher_aes = 2, 28 cryptocop_cipher_m2m = 3, /* mem2mem is essentially a NULL cipher with blocklength=1 */ 29 cryptocop_cipher_none 30} cryptocop_cipher_type; 31 32typedef enum { 33 cryptocop_digest_sha1 = 0, 34 cryptocop_digest_md5 = 1, 35 cryptocop_digest_none 36} cryptocop_digest_type; 37 38typedef enum { 39 cryptocop_csum_le = 0, 40 cryptocop_csum_be = 1, 41 cryptocop_csum_none 42} cryptocop_csum_type; 43 44typedef enum { 45 cryptocop_cipher_mode_ecb = 0, 46 cryptocop_cipher_mode_cbc, 47 cryptocop_cipher_mode_none 48} cryptocop_cipher_mode; 49 50typedef enum { 51 cryptocop_3des_eee = 0, 52 cryptocop_3des_eed = 1, 53 cryptocop_3des_ede = 2, 54 cryptocop_3des_edd = 3, 55 cryptocop_3des_dee = 4, 56 cryptocop_3des_ded = 5, 57 cryptocop_3des_dde = 6, 58 cryptocop_3des_ddd = 7 59} cryptocop_3des_mode; 60 61/* Usermode accessible (ioctl) operations. */ 62struct strcop_session_op{ 63 cryptocop_session_id ses_id; 64 65 cryptocop_cipher_type cipher; /* AES, DES, 3DES, m2m, none */ 66 67 cryptocop_cipher_mode cmode; /* ECB, CBC, none */ 68 cryptocop_3des_mode des3_mode; 69 70 cryptocop_digest_type digest; /* MD5, SHA1, none */ 71 72 cryptocop_csum_type csum; /* BE, LE, none */ 73 74 unsigned char *key; 75 size_t keylen; 76}; 77 78#define CRYPTOCOP_CSUM_LENGTH (2) 79#define CRYPTOCOP_MAX_DIGEST_LENGTH (20) /* SHA-1 20, MD5 16 */ 80#define CRYPTOCOP_MAX_IV_LENGTH (16) /* (3)DES==8, AES == 16 */ 81#define CRYPTOCOP_MAX_KEY_LENGTH (32) 82 83struct strcop_crypto_op{ 84 cryptocop_session_id ses_id; 85 86 /* Indata. */ 87 unsigned char *indata; 88 size_t inlen; /* Total indata length. */ 89 90 /* Cipher configuration. */ 91 unsigned char do_cipher:1; 92 unsigned char decrypt:1; /* 1 == decrypt, 0 == encrypt */ 93 unsigned char cipher_explicit:1; 94 size_t cipher_start; 95 size_t cipher_len; 96 /* cipher_iv is used if do_cipher and cipher_explicit and the cipher 97 mode is CBC. The length is controlled by the type of cipher, 98 e.g. DES/3DES 8 octets and AES 16 octets. */ 99 unsigned char cipher_iv[CRYPTOCOP_MAX_IV_LENGTH]; 100 /* Outdata. */ 101 unsigned char *cipher_outdata; 102 size_t cipher_outlen; 103 104 /* digest configuration. */ 105 unsigned char do_digest:1; 106 size_t digest_start; 107 size_t digest_len; 108 /* Outdata. The actual length is determined by the type of the digest. */ 109 unsigned char digest[CRYPTOCOP_MAX_DIGEST_LENGTH]; 110 111 /* Checksum configuration. */ 112 unsigned char do_csum:1; 113 size_t csum_start; 114 size_t csum_len; 115 /* Outdata. */ 116 unsigned char csum[CRYPTOCOP_CSUM_LENGTH]; 117}; 118 119 120 121#ifdef __KERNEL__ 122 123/********** The API to use from inside the kernel. ************/ 124 125#include <asm/arch/hwregs/dma.h> 126 127typedef enum { 128 cryptocop_alg_csum = 0, 129 cryptocop_alg_mem2mem, 130 cryptocop_alg_md5, 131 cryptocop_alg_sha1, 132 cryptocop_alg_des, 133 cryptocop_alg_3des, 134 cryptocop_alg_aes, 135 cryptocop_no_alg, 136} cryptocop_algorithm; 137 138typedef u8 cryptocop_tfrm_id; 139 140 141struct cryptocop_operation; 142 143typedef void (cryptocop_callback)(struct cryptocop_operation*, void*); 144 145struct cryptocop_transform_init { 146 cryptocop_algorithm alg; 147 /* Keydata for ciphers. */ 148 unsigned char key[CRYPTOCOP_MAX_KEY_LENGTH]; 149 unsigned int keylen; 150 cryptocop_cipher_mode cipher_mode; 151 cryptocop_3des_mode tdes_mode; 152 cryptocop_csum_type csum_mode; /* cryptocop_csum_none is not allowed when alg==cryptocop_alg_csum */ 153 154 cryptocop_tfrm_id tid; /* Locally unique in session; assigned by user, checked by driver. */ 155 struct cryptocop_transform_init *next; 156}; 157 158 159typedef enum { 160 cryptocop_source_dma = 0, 161 cryptocop_source_des, 162 cryptocop_source_3des, 163 cryptocop_source_aes, 164 cryptocop_source_md5, 165 cryptocop_source_sha1, 166 cryptocop_source_csum, 167 cryptocop_source_none, 168} cryptocop_source; 169 170 171struct cryptocop_desc_cfg { 172 cryptocop_tfrm_id tid; 173 cryptocop_source src; 174 unsigned int last:1; /* Last use of this transform in the operation. Will push outdata when encountered. */ 175 struct cryptocop_desc_cfg *next; 176}; 177 178struct cryptocop_desc { 179 size_t length; 180 struct cryptocop_desc_cfg *cfg; 181 struct cryptocop_desc *next; 182}; 183 184 185/* Flags for cryptocop_tfrm_cfg */ 186#define CRYPTOCOP_NO_FLAG (0x00) 187#define CRYPTOCOP_ENCRYPT (0x01) 188#define CRYPTOCOP_DECRYPT (0x02) 189#define CRYPTOCOP_EXPLICIT_IV (0x04) 190 191struct cryptocop_tfrm_cfg { 192 cryptocop_tfrm_id tid; 193 194 unsigned int flags; /* DECRYPT, ENCRYPT, EXPLICIT_IV */ 195 196 /* CBC initialisation vector for cihers. */ 197 u8 iv[CRYPTOCOP_MAX_IV_LENGTH]; 198 199 /* The position in output where to write the transform output. The order 200 in which the driver writes the output is unspecified, hence if several 201 transforms write on the same positions in the output the result is 202 unspecified. */ 203 size_t inject_ix; 204 205 struct cryptocop_tfrm_cfg *next; 206}; 207 208 209 210struct cryptocop_dma_list_operation{ 211 /* The consumer can provide DMA lists to send to the co-processor. 'use_dmalists' in 212 struct cryptocop_operation must be set for the driver to use them. outlist, 213 out_data_buf, inlist and in_data_buf must all be physical addresses since they will 214 be loaded to DMA . */ 215 dma_descr_data *outlist; /* Out from memory to the co-processor. */ 216 char *out_data_buf; 217 dma_descr_data *inlist; /* In from the co-processor to memory. */ 218 char *in_data_buf; 219 220 cryptocop_3des_mode tdes_mode; 221 cryptocop_csum_type csum_mode; 222}; 223 224 225struct cryptocop_tfrm_operation{ 226 /* Operation configuration, if not 'use_dmalists' is set. */ 227 struct cryptocop_tfrm_cfg *tfrm_cfg; 228 struct cryptocop_desc *desc; 229 230 struct iovec *indata; 231 size_t incount; 232 size_t inlen; /* Total inlength. */ 233 234 struct iovec *outdata; 235 size_t outcount; 236 size_t outlen; /* Total outlength. */ 237}; 238 239 240struct cryptocop_operation { 241 cryptocop_callback *cb; 242 void *cb_data; 243 244 cryptocop_session_id sid; 245 246 /* The status of the operation when returned to consumer. */ 247 int operation_status; /* 0, -EAGAIN */ 248 249 /* Flags */ 250 unsigned int use_dmalists:1; /* Use outlist and inlist instead of the desc/tfrm_cfg configuration. */ 251 unsigned int in_interrupt:1; /* Set if inserting job from interrupt context. */ 252 unsigned int fast_callback:1; /* Set if fast callback wanted, i.e. from interrupt context. */ 253 254 union{ 255 struct cryptocop_dma_list_operation list_op; 256 struct cryptocop_tfrm_operation tfrm_op; 257 }; 258}; 259 260 261int cryptocop_new_session(cryptocop_session_id *sid, struct cryptocop_transform_init *tinit, int alloc_flag); 262int cryptocop_free_session(cryptocop_session_id sid); 263 264int cryptocop_job_queue_insert_csum(struct cryptocop_operation *operation); 265 266int cryptocop_job_queue_insert_crypto(struct cryptocop_operation *operation); 267 268int cryptocop_job_queue_insert_user_job(struct cryptocop_operation *operation); 269 270#endif /* __KERNEL__ */ 271 272#endif /* CRYPTOCOP_H */ 273