1 /* $OpenBSD: cryptodev.h,v 1.81 2021/10/24 14:50:42 tobhe 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/task.h> 56 57 /* Some initial values */ 58 #define CRYPTO_DRIVERS_INITIAL 4 59 #define CRYPTO_DRIVERS_MAX 128 60 #define CRYPTO_SW_SESSIONS 32 61 62 /* HMAC values */ 63 #define HMAC_MD5_BLOCK_LEN 64 64 #define HMAC_SHA1_BLOCK_LEN 64 65 #define HMAC_RIPEMD160_BLOCK_LEN 64 66 #define HMAC_SHA2_256_BLOCK_LEN 64 67 #define HMAC_SHA2_384_BLOCK_LEN 128 68 #define HMAC_SHA2_512_BLOCK_LEN 128 69 #define HMAC_MAX_BLOCK_LEN HMAC_SHA2_512_BLOCK_LEN /* keep in sync */ 70 #define HMAC_IPAD_VAL 0x36 71 #define HMAC_OPAD_VAL 0x5C 72 73 /* Encryption algorithm block sizes */ 74 #define DES3_BLOCK_LEN 8 75 #define BLOWFISH_BLOCK_LEN 8 76 #define CAST128_BLOCK_LEN 8 77 #define RIJNDAEL128_BLOCK_LEN 16 78 #define CHACHA20_BLOCK_LEN 64 79 #define EALG_MAX_BLOCK_LEN 64 /* Keep this updated */ 80 81 /* Maximum hash algorithm result length */ 82 #define AALG_MAX_RESULT_LEN 64 /* Keep this updated */ 83 84 #define CRYPTO_3DES_CBC 1 85 #define CRYPTO_BLF_CBC 2 86 #define CRYPTO_CAST_CBC 3 87 #define CRYPTO_MD5_HMAC 4 88 #define CRYPTO_SHA1_HMAC 5 89 #define CRYPTO_RIPEMD160_HMAC 6 90 #define CRYPTO_RIJNDAEL128_CBC 7 /* 128 bit blocksize */ 91 #define CRYPTO_AES_CBC 7 /* 128 bit blocksize -- the same as above */ 92 #define CRYPTO_DEFLATE_COMP 8 /* Deflate compression algorithm */ 93 #define CRYPTO_NULL 9 94 #define CRYPTO_SHA2_256_HMAC 11 95 #define CRYPTO_SHA2_384_HMAC 12 96 #define CRYPTO_SHA2_512_HMAC 13 97 #define CRYPTO_AES_CTR 14 98 #define CRYPTO_AES_XTS 15 99 #define CRYPTO_AES_GCM_16 16 100 #define CRYPTO_AES_128_GMAC 17 101 #define CRYPTO_AES_192_GMAC 18 102 #define CRYPTO_AES_256_GMAC 19 103 #define CRYPTO_AES_GMAC 20 104 #define CRYPTO_CHACHA20_POLY1305 21 105 #define CRYPTO_CHACHA20_POLY1305_MAC 22 106 #define CRYPTO_ESN 23 /* Support for Extended Sequence Numbers */ 107 #define CRYPTO_ALGORITHM_MAX 23 /* Keep updated */ 108 109 /* Algorithm flags */ 110 #define CRYPTO_ALG_FLAG_SUPPORTED 0x01 /* Algorithm is supported */ 111 112 /* Standard initialization structure beginning */ 113 struct cryptoini { 114 int cri_alg; /* Algorithm to use */ 115 int cri_klen; /* Key length, in bits */ 116 int cri_rnd; /* Algorithm rounds, where relevant */ 117 caddr_t cri_key; /* key to use */ 118 union { 119 u_int8_t iv[EALG_MAX_BLOCK_LEN]; /* IV to use */ 120 u_int8_t esn[4]; /* high-order ESN */ 121 } u; 122 #define cri_iv u.iv 123 #define cri_esn u.esn 124 struct cryptoini *cri_next; 125 }; 126 127 /* Describe boundaries of a single crypto operation */ 128 struct cryptodesc { 129 int crd_skip; /* How many bytes to ignore from start */ 130 int crd_len; /* How many bytes to process */ 131 int crd_inject; /* Where to inject results, if applicable */ 132 int crd_flags; 133 134 #define CRD_F_ENCRYPT 0x01 /* Set when doing encryption */ 135 #define CRD_F_IV_PRESENT 0x02 /* When encrypting, IV is already in 136 place, so don't copy. */ 137 #define CRD_F_IV_EXPLICIT 0x04 /* IV explicitly provided */ 138 #define CRD_F_COMP 0x10 /* Set when doing compression */ 139 #define CRD_F_ESN 0x20 /* Set when ESN field is provided */ 140 141 struct cryptoini CRD_INI; /* Initialization/context data */ 142 #define crd_esn CRD_INI.cri_esn 143 #define crd_iv CRD_INI.cri_iv 144 #define crd_key CRD_INI.cri_key 145 #define crd_rnd CRD_INI.cri_rnd 146 #define crd_alg CRD_INI.cri_alg 147 #define crd_klen CRD_INI.cri_klen 148 }; 149 150 /* Structure describing complete operation */ 151 struct cryptop { 152 u_int64_t crp_sid; /* Session ID */ 153 int crp_ilen; /* Input data total length */ 154 int crp_olen; /* Result total length */ 155 int crp_alloctype; /* Type of buf to allocate if needed */ 156 157 int crp_flags; 158 159 #define CRYPTO_F_IMBUF 0x0001 /* Input/output are mbuf chains, otherwise contig */ 160 #define CRYPTO_F_IOV 0x0002 /* Input/output are uio */ 161 #define CRYPTO_F_MPSAFE 0x0004 /* Do not use kernel lock for callback */ 162 163 void *crp_buf; /* Data to be processed */ 164 165 struct cryptodesc *crp_desc; /* List of processing descriptors */ 166 struct cryptodesc crp_sdesc[2]; /* Static array for small ops */ 167 int crp_ndesc; /* Amount of descriptors to use */ 168 int crp_ndescalloc;/* Amount of descriptors allocated */ 169 170 caddr_t crp_mac; 171 }; 172 173 #define CRYPTO_BUF_IOV 0x1 174 #define CRYPTO_BUF_MBUF 0x2 175 176 #define CRYPTO_OP_DECRYPT 0x0 177 #define CRYPTO_OP_ENCRYPT 0x1 178 179 /* Crypto capabilities structure */ 180 struct cryptocap { 181 u_int64_t cc_operations; /* Counter of how many ops done */ 182 u_int64_t cc_bytes; /* Counter of how many bytes done */ 183 184 u_int32_t cc_sessions; /* How many sessions allocated */ 185 186 /* Symmetric/hash algorithms supported */ 187 int cc_alg[CRYPTO_ALGORITHM_MAX + 1]; 188 189 u_int8_t cc_flags; 190 #define CRYPTOCAP_F_CLEANUP 0x01 191 #define CRYPTOCAP_F_SOFTWARE 0x02 192 #define CRYPTOCAP_F_MPSAFE 0x04 193 194 int (*cc_newsession) (u_int32_t *, struct cryptoini *); 195 int (*cc_process) (struct cryptop *); 196 int (*cc_freesession) (u_int64_t); 197 }; 198 199 void crypto_init(void); 200 201 int crypto_newsession(u_int64_t *, struct cryptoini *, int); 202 int crypto_freesession(u_int64_t); 203 int crypto_register(u_int32_t, int *, 204 int (*)(u_int32_t *, struct cryptoini *), int (*)(u_int64_t), 205 int (*)(struct cryptop *)); 206 int crypto_unregister(u_int32_t, int); 207 int32_t crypto_get_driverid(u_int8_t); 208 int crypto_invoke(struct cryptop *); 209 210 void cuio_copydata(struct uio *, int, int, caddr_t); 211 void cuio_copyback(struct uio *, int, int, const void *); 212 int cuio_getptr(struct uio *, int, int *); 213 int cuio_apply(struct uio *, int, int, 214 int (*f)(caddr_t, caddr_t, unsigned int), caddr_t); 215 216 struct cryptop *crypto_getreq(int); 217 void crypto_freereq(struct cryptop *); 218 #endif /* _CRYPTO_CRYPTO_H_ */ 219