root/crypto/cryptodev.h

/* [<][>][^][v][top][bottom][index][help] */

INCLUDED FROM


    1 /*      $OpenBSD: cryptodev.h,v 1.45 2007/05/27 05:33:47 tedu Exp $     */
    2 
    3 /*
    4  * The author of this code is Angelos D. Keromytis (angelos@cis.upenn.edu)
    5  *
    6  * This code was written by Angelos D. Keromytis in Athens, Greece, in
    7  * February 2000. Network Security Technologies Inc. (NSTI) kindly
    8  * supported the development of this code.
    9  *
   10  * Copyright (c) 2000 Angelos D. Keromytis
   11  *
   12  * Permission to use, copy, and modify this software with or without fee
   13  * is hereby granted, provided that this entire notice is included in
   14  * all source code copies of any software which is or includes a copy or
   15  * modification of this software.
   16  *
   17  * THIS SOFTWARE IS BEING PROVIDED "AS IS", WITHOUT ANY EXPRESS OR
   18  * IMPLIED WARRANTY. IN PARTICULAR, NONE OF THE AUTHORS MAKES ANY
   19  * REPRESENTATION OR WARRANTY OF ANY KIND CONCERNING THE
   20  * MERCHANTABILITY OF THIS SOFTWARE OR ITS FITNESS FOR ANY PARTICULAR
   21  * PURPOSE.
   22  *
   23  * Copyright (c) 2001 Theo de Raadt
   24  *
   25  * Redistribution and use in source and binary forms, with or without
   26  * modification, are permitted provided that the following conditions
   27  * are met:
   28  *
   29  * 1. Redistributions of source code must retain the above copyright
   30  *    notice, this list of conditions and the following disclaimer.
   31  * 2. Redistributions in binary form must reproduce the above copyright
   32  *    notice, this list of conditions and the following disclaimer in the
   33  *    documentation and/or other materials provided with the distribution.
   34  *
   35  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
   36  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
   37  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
   38  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
   39  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
   40  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
   41  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
   42  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
   43  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
   44  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
   45  *
   46  * Effort sponsored in part by the Defense Advanced Research Projects
   47  * Agency (DARPA) and Air Force Research Laboratory, Air Force
   48  * Materiel Command, USAF, under agreement number F30602-01-2-0537.
   49  *
   50  */
   51 
   52 #ifndef _CRYPTO_CRYPTO_H_
   53 #define _CRYPTO_CRYPTO_H_
   54 
   55 #include <sys/ioccom.h>
   56 
   57 /* Some initial values */
   58 #define CRYPTO_DRIVERS_INITIAL  4
   59 #define CRYPTO_SW_SESSIONS      32
   60 
   61 /* HMAC values */
   62 #define HMAC_BLOCK_LEN          64
   63 #define HMAC_IPAD_VAL           0x36
   64 #define HMAC_OPAD_VAL           0x5C
   65 
   66 /* Encryption algorithm block sizes */
   67 #define DES_BLOCK_LEN           8
   68 #define DES3_BLOCK_LEN          8
   69 #define BLOWFISH_BLOCK_LEN      8
   70 #define SKIPJACK_BLOCK_LEN      8
   71 #define CAST128_BLOCK_LEN       8
   72 #define RIJNDAEL128_BLOCK_LEN   16
   73 #define EALG_MAX_BLOCK_LEN      16 /* Keep this updated */
   74 
   75 /* Maximum hash algorithm result length */
   76 #define AALG_MAX_RESULT_LEN     64 /* Keep this updated */
   77 
   78 #define CRYPTO_DES_CBC          1
   79 #define CRYPTO_3DES_CBC         2
   80 #define CRYPTO_BLF_CBC          3
   81 #define CRYPTO_CAST_CBC         4
   82 #define CRYPTO_SKIPJACK_CBC     5
   83 #define CRYPTO_MD5_HMAC         6
   84 #define CRYPTO_SHA1_HMAC        7
   85 #define CRYPTO_RIPEMD160_HMAC   8
   86 #define CRYPTO_MD5_KPDK         9
   87 #define CRYPTO_SHA1_KPDK        10
   88 #define CRYPTO_RIJNDAEL128_CBC  11 /* 128 bit blocksize */
   89 #define CRYPTO_AES_CBC          11 /* 128 bit blocksize -- the same as above */
   90 #define CRYPTO_ARC4             12
   91 #define CRYPTO_MD5              13
   92 #define CRYPTO_SHA1             14
   93 #define CRYPTO_DEFLATE_COMP     15 /* Deflate compression algorithm */
   94 #define CRYPTO_NULL             16
   95 #define CRYPTO_LZS_COMP         17 /* LZS compression algorithm */
   96 #define CRYPTO_SHA2_256_HMAC    18
   97 #define CRYPTO_SHA2_384_HMAC    19
   98 #define CRYPTO_SHA2_512_HMAC    20
   99 #define CRYPTO_AES_CTR          21
  100 #define CRYPTO_ALGORITHM_MAX    21 /* Keep updated - see below */
  101 
  102 #define CRYPTO_ALGORITHM_ALL    (CRYPTO_ALGORITHM_MAX + 1)
  103 
  104 /* Algorithm flags */
  105 #define CRYPTO_ALG_FLAG_SUPPORTED       0x01 /* Algorithm is supported */
  106 #define CRYPTO_ALG_FLAG_RNG_ENABLE      0x02 /* Has HW RNG for DH/DSA */
  107 #define CRYPTO_ALG_FLAG_DSA_SHA         0x04 /* Can do SHA on msg */
  108 
  109 /* Standard initialization structure beginning */
  110 struct cryptoini {
  111         int             cri_alg;        /* Algorithm to use */
  112         int             cri_klen;       /* Key length, in bits */
  113         int             cri_rnd;        /* Algorithm rounds, where relevant */
  114         caddr_t         cri_key;        /* key to use */
  115         u_int8_t        cri_iv[EALG_MAX_BLOCK_LEN];     /* IV to use */
  116         struct cryptoini *cri_next;
  117 };
  118 
  119 /* Describe boundaries of a single crypto operation */
  120 struct cryptodesc {
  121         int             crd_skip;       /* How many bytes to ignore from start */
  122         int             crd_len;        /* How many bytes to process */
  123         int             crd_inject;     /* Where to inject results, if applicable */
  124         int             crd_flags;
  125 
  126 #define CRD_F_ENCRYPT           0x01    /* Set when doing encryption */
  127 #define CRD_F_IV_PRESENT        0x02    /* When encrypting, IV is already in
  128                                            place, so don't copy. */
  129 #define CRD_F_IV_EXPLICIT       0x04    /* IV explicitly provided */
  130 #define CRD_F_DSA_SHA_NEEDED    0x08    /* Compute SHA-1 of buffer for DSA */
  131 #define CRD_F_COMP              0x10    /* Set when doing compression */
  132 
  133         struct cryptoini        CRD_INI; /* Initialization/context data */
  134 #define crd_iv          CRD_INI.cri_iv
  135 #define crd_key         CRD_INI.cri_key
  136 #define crd_rnd         CRD_INI.cri_rnd
  137 #define crd_alg         CRD_INI.cri_alg
  138 #define crd_klen        CRD_INI.cri_klen
  139 
  140         struct cryptodesc *crd_next;
  141 };
  142 
  143 /* Structure describing complete operation */
  144 struct cryptop {
  145         u_int64_t       crp_sid;        /* Session ID */
  146         int             crp_ilen;       /* Input data total length */
  147         int             crp_olen;       /* Result total length */
  148         int             crp_alloctype;  /* Type of buf to allocate if needed */
  149 
  150         int             crp_etype;      /*
  151                                          * Error type (zero means no error).
  152                                          * All error codes except EAGAIN
  153                                          * indicate possible data corruption (as in,
  154                                          * the data have been touched). On all
  155                                          * errors, the crp_sid may have changed
  156                                          * (reset to a new one), so the caller
  157                                          * should always check and use the new
  158                                          * value on future requests.
  159                                          */
  160         int             crp_flags;
  161 
  162 #define CRYPTO_F_IMBUF  0x0001  /* Input/output are mbuf chains, otherwise contig */
  163 #define CRYPTO_F_IOV    0x0002  /* Input/output are uio */
  164 #define CRYPTO_F_REL    0x0004  /* Must return data in same place */
  165 #define CRYPTO_F_NOQUEUE        0x0008  /* Don't use crypto queue/thread */
  166 #define CRYPTO_F_DONE   0x0010  /* request completed */
  167 
  168         void            *crp_buf;       /* Data to be processed */
  169         void            *crp_opaque;    /* Opaque pointer, passed along */
  170         struct cryptodesc *crp_desc;    /* Linked list of processing descriptors */
  171 
  172         int (*crp_callback)(struct cryptop *); /* Callback function */
  173 
  174         struct cryptop  *crp_next;
  175         caddr_t         crp_mac;
  176 };
  177 
  178 #define CRYPTO_BUF_IOV          0x1
  179 #define CRYPTO_BUF_MBUF         0x2
  180 
  181 #define CRYPTO_OP_DECRYPT       0x0
  182 #define CRYPTO_OP_ENCRYPT       0x1
  183 
  184 /* bignum parameter, in packed bytes, ... */
  185 struct crparam {
  186         caddr_t         crp_p;
  187         u_int           crp_nbits;
  188 };
  189 
  190 #define CRK_MAXPARAM    8
  191 
  192 struct crypt_kop {
  193         u_int           crk_op;         /* ie. CRK_MOD_EXP or other */
  194         u_int           crk_status;     /* return status */
  195         u_short         crk_iparams;    /* # of input parameters */
  196         u_short         crk_oparams;    /* # of output parameters */
  197         u_int           crk_pad1;
  198         struct crparam  crk_param[CRK_MAXPARAM];
  199 };
  200 #define CRK_MOD_EXP             0
  201 #define CRK_MOD_EXP_CRT         1
  202 #define CRK_DSA_SIGN            2
  203 #define CRK_DSA_VERIFY          3
  204 #define CRK_DH_COMPUTE_KEY      4
  205 #define CRK_ALGORITHM_MAX       4 /* Keep updated - see below */
  206 
  207 #define CRF_MOD_EXP             (1 << CRK_MOD_EXP)
  208 #define CRF_MOD_EXP_CRT         (1 << CRK_MOD_EXP_CRT)
  209 #define CRF_DSA_SIGN            (1 << CRK_DSA_SIGN)
  210 #define CRF_DSA_VERIFY          (1 << CRK_DSA_VERIFY)
  211 #define CRF_DH_COMPUTE_KEY      (1 << CRK_DH_COMPUTE_KEY)
  212 
  213 struct cryptkop {
  214         u_int           krp_op;         /* ie. CRK_MOD_EXP or other */
  215         u_int           krp_status;     /* return status */
  216         u_short         krp_iparams;    /* # of input parameters */
  217         u_short         krp_oparams;    /* # of output parameters */
  218         u_int32_t       krp_hid;
  219         struct crparam  krp_param[CRK_MAXPARAM];        /* kvm */
  220         int             (*krp_callback)(struct cryptkop *);
  221         struct cryptkop *krp_next;
  222 };
  223 
  224 /* Crypto capabilities structure */
  225 struct cryptocap {
  226         u_int64_t       cc_operations;  /* Counter of how many ops done */
  227         u_int64_t       cc_bytes;       /* Counter of how many bytes done */
  228         u_int64_t       cc_koperations; /* How many PK ops done */
  229 
  230         u_int32_t       cc_sessions;    /* How many sessions allocated */
  231 
  232         /* Symmetric/hash algorithms supported */
  233         int             cc_alg[CRYPTO_ALGORITHM_MAX + 1];
  234 
  235         /* Asymmetric algorithms supported */
  236         int             cc_kalg[CRK_ALGORITHM_MAX + 1];
  237 
  238         int             cc_queued;      /* Operations queued */
  239 
  240         u_int8_t        cc_flags;
  241 #define CRYPTOCAP_F_CLEANUP     0x01
  242 #define CRYPTOCAP_F_SOFTWARE    0x02
  243 #define CRYPTOCAP_F_ENCRYPT_MAC 0x04 /* Can do encrypt-then-MAC (IPsec) */
  244 #define CRYPTOCAP_F_MAC_ENCRYPT 0x08 /* Can do MAC-then-encrypt (TLS) */
  245 
  246         int             (*cc_newsession) (u_int32_t *, struct cryptoini *);
  247         int             (*cc_process) (struct cryptop *);
  248         int             (*cc_freesession) (u_int64_t);
  249         int             (*cc_kprocess) (struct cryptkop *);
  250 };
  251 
  252 /*
  253  * ioctl parameter to request creation of a session.
  254  */
  255 struct session_op {
  256         u_int32_t       cipher;         /* ie. CRYPTO_DES_CBC */
  257         u_int32_t       mac;            /* ie. CRYPTO_MD5_HMAC */
  258 
  259         u_int32_t       keylen;         /* cipher key */
  260         caddr_t         key;
  261         int             mackeylen;      /* mac key */
  262         caddr_t         mackey;
  263 
  264         u_int32_t       ses;            /* returns: session # */
  265 };
  266 
  267 /*
  268  * ioctl parameter to request a crypt/decrypt operation against a session.
  269  */
  270 struct crypt_op {
  271         u_int32_t       ses;
  272         u_int16_t       op;             /* ie. COP_ENCRYPT */
  273 #define COP_ENCRYPT     1
  274 #define COP_DECRYPT     2
  275         u_int16_t       flags;          /* always 0 */
  276 
  277         u_int           len;
  278         caddr_t         src, dst;       /* become iov[] inside kernel */
  279         caddr_t         mac;            /* must be big enough for chosen MAC */
  280         caddr_t         iv;
  281 };
  282 
  283 #define CRYPTO_MAX_MAC_LEN      20
  284 
  285 /*
  286  * done against open of /dev/crypto, to get a cloned descriptor.
  287  * Please use F_SETFD against the cloned descriptor.
  288  */
  289 #define CRIOGET         _IOWR('c', 100, u_int32_t)
  290 
  291 /* the following are done against the cloned descriptor */
  292 #define CIOCGSESSION    _IOWR('c', 101, struct session_op)
  293 #define CIOCFSESSION    _IOW('c', 102, u_int32_t)
  294 #define CIOCCRYPT       _IOWR('c', 103, struct crypt_op)
  295 #define CIOCKEY         _IOWR('c', 104, struct crypt_kop)
  296 
  297 #define CIOCASYMFEAT    _IOR('c', 105, u_int32_t)
  298 
  299 #ifdef _KERNEL
  300 int     crypto_newsession(u_int64_t *, struct cryptoini *, int);
  301 int     crypto_freesession(u_int64_t);
  302 int     crypto_dispatch(struct cryptop *);
  303 int     crypto_kdispatch(struct cryptkop *);
  304 int     crypto_register(u_int32_t, int *,
  305             int (*)(u_int32_t *, struct cryptoini *), int (*)(u_int64_t),
  306             int (*)(struct cryptop *));
  307 int     crypto_kregister(u_int32_t, int *, int (*)(struct cryptkop *));
  308 int     crypto_unregister(u_int32_t, int);
  309 int32_t crypto_get_driverid(u_int8_t);
  310 void    crypto_thread(void);
  311 int     crypto_invoke(struct cryptop *);
  312 int     crypto_kinvoke(struct cryptkop *);
  313 void    crypto_done(struct cryptop *);
  314 void    crypto_kdone(struct cryptkop *);
  315 int     crypto_getfeat(int *);
  316 
  317 void    cuio_copydata(struct uio *, int, int, caddr_t);
  318 void    cuio_copyback(struct uio *, int, int, const void *);
  319 int     cuio_getptr(struct uio *, int, int *);
  320 int     cuio_apply(struct uio *, int, int,
  321             int (*f)(caddr_t, caddr_t, unsigned int), caddr_t);
  322 
  323 struct  cryptop *crypto_getreq(int);
  324 void    crypto_freereq(struct cryptop *);
  325 #endif /* _KERNEL */
  326 #endif /* _CRYPTO_CRYPTO_H_ */

/* [<][>][^][v][top][bottom][index][help] */