linux/include/asm-cris/arch-v32/cryptocop.h
<<
>>
Prefs
   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
lxr.linux.no kindly hosted by Redpill Linpro AS, provider of Linux consulting and operations services since 1995.