[BACK]Return to cryptodev.h CVS log [TXT][DIR] Up to [local] / sys / crypto

Annotation of sys/crypto/cryptodev.h, Revision 1.1.1.1

1.1       nbrk        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_ */

CVSweb