1 1.31 riastrad /* $NetBSD: xform.c,v 1.31 2020/06/30 04:14:56 riastradh Exp $ */ 2 1.1 jonathan /* $FreeBSD: src/sys/opencrypto/xform.c,v 1.1.2.1 2002/11/21 23:34:23 sam Exp $ */ 3 1.1 jonathan /* $OpenBSD: xform.c,v 1.19 2002/08/16 22:47:25 dhartmei Exp $ */ 4 1.1 jonathan 5 1.1 jonathan /* 6 1.1 jonathan * The authors of this code are John Ioannidis (ji (at) tla.org), 7 1.1 jonathan * Angelos D. Keromytis (kermit (at) csd.uch.gr) and 8 1.1 jonathan * Niels Provos (provos (at) physnet.uni-hamburg.de). 9 1.1 jonathan * 10 1.1 jonathan * This code was written by John Ioannidis for BSD/OS in Athens, Greece, 11 1.1 jonathan * in November 1995. 12 1.1 jonathan * 13 1.1 jonathan * Ported to OpenBSD and NetBSD, with additional transforms, in December 1996, 14 1.1 jonathan * by Angelos D. Keromytis. 15 1.1 jonathan * 16 1.1 jonathan * Additional transforms and features in 1997 and 1998 by Angelos D. Keromytis 17 1.1 jonathan * and Niels Provos. 18 1.1 jonathan * 19 1.1 jonathan * Additional features in 1999 by Angelos D. Keromytis. 20 1.1 jonathan * 21 1.1 jonathan * Copyright (C) 1995, 1996, 1997, 1998, 1999 by John Ioannidis, 22 1.1 jonathan * Angelos D. Keromytis and Niels Provos. 23 1.1 jonathan * 24 1.1 jonathan * Copyright (C) 2001, Angelos D. Keromytis. 25 1.1 jonathan * 26 1.1 jonathan * Permission to use, copy, and modify this software with or without fee 27 1.1 jonathan * is hereby granted, provided that this entire notice is included in 28 1.1 jonathan * all copies of any software which is or includes a copy or 29 1.1 jonathan * modification of this software. 30 1.1 jonathan * You may use this code under the GNU public license if you so wish. Please 31 1.1 jonathan * contribute changes back to the authors under this freer than GPL license 32 1.1 jonathan * so that we may further the use of strong encryption without limitations to 33 1.1 jonathan * all. 34 1.1 jonathan * 35 1.1 jonathan * THIS SOFTWARE IS BEING PROVIDED "AS IS", WITHOUT ANY EXPRESS OR 36 1.1 jonathan * IMPLIED WARRANTY. IN PARTICULAR, NONE OF THE AUTHORS MAKES ANY 37 1.1 jonathan * REPRESENTATION OR WARRANTY OF ANY KIND CONCERNING THE 38 1.1 jonathan * MERCHANTABILITY OF THIS SOFTWARE OR ITS FITNESS FOR ANY PARTICULAR 39 1.1 jonathan * PURPOSE. 40 1.1 jonathan */ 41 1.1 jonathan 42 1.1 jonathan #include <sys/cdefs.h> 43 1.31 riastrad __KERNEL_RCSID(0, "$NetBSD: xform.c,v 1.31 2020/06/30 04:14:56 riastradh Exp $"); 44 1.1 jonathan 45 1.1 jonathan #include <sys/param.h> 46 1.1 jonathan #include <sys/malloc.h> 47 1.1 jonathan 48 1.1 jonathan #include <opencrypto/cryptodev.h> 49 1.1 jonathan #include <opencrypto/xform.h> 50 1.1 jonathan 51 1.15 thorpej MALLOC_DEFINE(M_XDATA, "xform", "xform data buffers"); 52 1.1 jonathan 53 1.20 drochner const u_int8_t hmac_ipad_buffer[128] = { 54 1.20 drochner 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 55 1.20 drochner 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 56 1.20 drochner 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 57 1.20 drochner 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 58 1.20 drochner 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 59 1.20 drochner 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 60 1.20 drochner 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 61 1.20 drochner 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 62 1.15 thorpej 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 63 1.15 thorpej 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 64 1.15 thorpej 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 65 1.15 thorpej 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 66 1.15 thorpej 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 67 1.15 thorpej 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 68 1.15 thorpej 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 69 1.15 thorpej 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36, 0x36 70 1.15 thorpej }; 71 1.15 thorpej 72 1.20 drochner const u_int8_t hmac_opad_buffer[128] = { 73 1.20 drochner 0x5C, 0x5C, 0x5C, 0x5C, 0x5C, 0x5C, 0x5C, 0x5C, 74 1.20 drochner 0x5C, 0x5C, 0x5C, 0x5C, 0x5C, 0x5C, 0x5C, 0x5C, 75 1.20 drochner 0x5C, 0x5C, 0x5C, 0x5C, 0x5C, 0x5C, 0x5C, 0x5C, 76 1.20 drochner 0x5C, 0x5C, 0x5C, 0x5C, 0x5C, 0x5C, 0x5C, 0x5C, 77 1.20 drochner 0x5C, 0x5C, 0x5C, 0x5C, 0x5C, 0x5C, 0x5C, 0x5C, 78 1.20 drochner 0x5C, 0x5C, 0x5C, 0x5C, 0x5C, 0x5C, 0x5C, 0x5C, 79 1.20 drochner 0x5C, 0x5C, 0x5C, 0x5C, 0x5C, 0x5C, 0x5C, 0x5C, 80 1.20 drochner 0x5C, 0x5C, 0x5C, 0x5C, 0x5C, 0x5C, 0x5C, 0x5C, 81 1.15 thorpej 0x5C, 0x5C, 0x5C, 0x5C, 0x5C, 0x5C, 0x5C, 0x5C, 82 1.15 thorpej 0x5C, 0x5C, 0x5C, 0x5C, 0x5C, 0x5C, 0x5C, 0x5C, 83 1.15 thorpej 0x5C, 0x5C, 0x5C, 0x5C, 0x5C, 0x5C, 0x5C, 0x5C, 84 1.15 thorpej 0x5C, 0x5C, 0x5C, 0x5C, 0x5C, 0x5C, 0x5C, 0x5C, 85 1.15 thorpej 0x5C, 0x5C, 0x5C, 0x5C, 0x5C, 0x5C, 0x5C, 0x5C, 86 1.15 thorpej 0x5C, 0x5C, 0x5C, 0x5C, 0x5C, 0x5C, 0x5C, 0x5C, 87 1.15 thorpej 0x5C, 0x5C, 0x5C, 0x5C, 0x5C, 0x5C, 0x5C, 0x5C, 88 1.15 thorpej 0x5C, 0x5C, 0x5C, 0x5C, 0x5C, 0x5C, 0x5C, 0x5C 89 1.15 thorpej }; 90 1.1 jonathan 91 1.1 jonathan /* Encryption instances */ 92 1.21 drochner const struct enc_xform enc_xform_null = { 93 1.29 ozaki .type = CRYPTO_NULL_CBC, 94 1.29 ozaki .name = "NULL", 95 1.1 jonathan /* NB: blocksize of 4 is to generate a properly aligned ESP header */ 96 1.29 ozaki .blocksize = 4, 97 1.29 ozaki .ivsize = 0, 98 1.29 ozaki .minkey = 0, 99 1.29 ozaki .maxkey = 256, /* 2048 bits, max key */ 100 1.1 jonathan }; 101 1.1 jonathan 102 1.21 drochner const struct enc_xform enc_xform_des = { 103 1.29 ozaki .type = CRYPTO_DES_CBC, 104 1.29 ozaki .name = "DES", 105 1.29 ozaki .blocksize = 8, 106 1.29 ozaki .ivsize = 8, 107 1.29 ozaki .minkey = 8, 108 1.29 ozaki .maxkey = 8, 109 1.1 jonathan }; 110 1.1 jonathan 111 1.21 drochner const struct enc_xform enc_xform_3des = { 112 1.29 ozaki .type = CRYPTO_3DES_CBC, 113 1.29 ozaki .name = "3DES", 114 1.29 ozaki .blocksize = 8, 115 1.29 ozaki .ivsize = 8, 116 1.29 ozaki .minkey = 24, 117 1.29 ozaki .maxkey = 24, 118 1.1 jonathan }; 119 1.1 jonathan 120 1.21 drochner const struct enc_xform enc_xform_blf = { 121 1.29 ozaki .type = CRYPTO_BLF_CBC, 122 1.29 ozaki .name = "Blowfish", 123 1.29 ozaki .blocksize = 8, 124 1.29 ozaki .ivsize = 8, 125 1.29 ozaki .minkey = 5, 126 1.29 ozaki .maxkey = 56, /* 448 bits, max key */ 127 1.1 jonathan }; 128 1.1 jonathan 129 1.21 drochner const struct enc_xform enc_xform_cast5 = { 130 1.29 ozaki .type = CRYPTO_CAST_CBC, 131 1.29 ozaki .name = "CAST-128", 132 1.29 ozaki .blocksize = 8, 133 1.29 ozaki .ivsize = 8, 134 1.29 ozaki .minkey = 5, 135 1.29 ozaki .maxkey = 16, 136 1.1 jonathan }; 137 1.1 jonathan 138 1.21 drochner const struct enc_xform enc_xform_skipjack = { 139 1.29 ozaki .type = CRYPTO_SKIPJACK_CBC, 140 1.29 ozaki .name = "Skipjack", 141 1.29 ozaki .blocksize = 8, 142 1.29 ozaki .ivsize = 8, 143 1.29 ozaki .minkey = 10, 144 1.29 ozaki .maxkey = 10, 145 1.1 jonathan }; 146 1.1 jonathan 147 1.31 riastrad const struct enc_xform enc_xform_aes = { 148 1.30 riastrad .type = CRYPTO_AES_CBC, 149 1.30 riastrad .name = "AES", 150 1.29 ozaki .blocksize = 16, 151 1.29 ozaki .ivsize = 16, 152 1.29 ozaki .minkey = 16, 153 1.29 ozaki .maxkey = 32, 154 1.1 jonathan }; 155 1.1 jonathan 156 1.21 drochner const struct enc_xform enc_xform_arc4 = { 157 1.29 ozaki .type = CRYPTO_ARC4, 158 1.29 ozaki .name = "ARC4", 159 1.29 ozaki .blocksize = 1, 160 1.29 ozaki .ivsize = 0, 161 1.29 ozaki .minkey = 1, 162 1.29 ozaki .maxkey = 32, 163 1.1 jonathan }; 164 1.1 jonathan 165 1.22 drochner const struct enc_xform enc_xform_camellia = { 166 1.29 ozaki .type = CRYPTO_CAMELLIA_CBC, 167 1.29 ozaki .name = "Camellia", 168 1.29 ozaki .blocksize = 16, 169 1.29 ozaki .ivsize = 16, 170 1.29 ozaki .minkey = 8, 171 1.29 ozaki .maxkey = 32, 172 1.22 drochner }; 173 1.22 drochner 174 1.25 drochner const struct enc_xform enc_xform_aes_ctr = { 175 1.29 ozaki .type = CRYPTO_AES_CTR, 176 1.29 ozaki .name = "AES-CTR", 177 1.29 ozaki .blocksize = 16, 178 1.29 ozaki .ivsize = 8, 179 1.29 ozaki .minkey = 16 + 4, 180 1.29 ozaki .maxkey = 32 + 4, 181 1.25 drochner }; 182 1.25 drochner 183 1.28 drochner const struct enc_xform enc_xform_aes_gcm = { 184 1.29 ozaki .type = CRYPTO_AES_GCM_16, 185 1.29 ozaki .name = "AES-GCM", 186 1.29 ozaki .blocksize = 4, /* ??? */ 187 1.29 ozaki .ivsize = 8, 188 1.29 ozaki .minkey = 16 + 4, 189 1.29 ozaki .maxkey = 32 + 4, 190 1.28 drochner }; 191 1.28 drochner 192 1.28 drochner const struct enc_xform enc_xform_aes_gmac = { 193 1.29 ozaki .type = CRYPTO_AES_GMAC, 194 1.29 ozaki .name = "AES-GMAC", 195 1.29 ozaki .blocksize = 4, /* ??? */ 196 1.29 ozaki .ivsize = 8, 197 1.29 ozaki .minkey = 16 + 4, 198 1.29 ozaki .maxkey = 32 + 4, 199 1.28 drochner }; 200 1.28 drochner 201 1.1 jonathan /* Authentication instances */ 202 1.21 drochner const struct auth_hash auth_hash_null = { 203 1.29 ozaki .type = CRYPTO_NULL_HMAC, 204 1.29 ozaki .name = "NULL-HMAC", 205 1.29 ozaki .keysize = 0, 206 1.29 ozaki .hashsize = 0, 207 1.29 ozaki .authsize = 12, 208 1.29 ozaki .blocksize = 64, 209 1.1 jonathan }; 210 1.1 jonathan 211 1.21 drochner const struct auth_hash auth_hash_hmac_md5 = { 212 1.29 ozaki .type = CRYPTO_MD5_HMAC, 213 1.29 ozaki .name = "HMAC-MD5", 214 1.29 ozaki .keysize = 16, 215 1.29 ozaki .hashsize = 16, 216 1.29 ozaki .authsize = 16, 217 1.29 ozaki .blocksize = 64, 218 1.16 tls }; 219 1.16 tls 220 1.21 drochner const struct auth_hash auth_hash_hmac_sha1 = { 221 1.29 ozaki .type = CRYPTO_SHA1_HMAC, 222 1.29 ozaki .name = "HMAC-SHA1", 223 1.29 ozaki .keysize = 20, 224 1.29 ozaki .hashsize = 20, 225 1.29 ozaki .authsize = 20, 226 1.29 ozaki .blocksize = 64, 227 1.16 tls }; 228 1.16 tls 229 1.21 drochner const struct auth_hash auth_hash_hmac_ripemd_160 = { 230 1.29 ozaki .type = CRYPTO_RIPEMD160_HMAC, 231 1.29 ozaki .name = "HMAC-RIPEMD-160", 232 1.29 ozaki .keysize = 20, 233 1.29 ozaki .hashsize = 20, 234 1.29 ozaki .authsize = 20, 235 1.29 ozaki .blocksize = 64, 236 1.16 tls }; 237 1.16 tls 238 1.21 drochner const struct auth_hash auth_hash_hmac_md5_96 = { 239 1.29 ozaki .type = CRYPTO_MD5_HMAC_96, 240 1.29 ozaki .name = "HMAC-MD5-96", 241 1.29 ozaki .keysize = 16, 242 1.29 ozaki .hashsize = 16, 243 1.29 ozaki .authsize = 12, 244 1.29 ozaki .blocksize = 64, 245 1.1 jonathan }; 246 1.1 jonathan 247 1.21 drochner const struct auth_hash auth_hash_hmac_sha1_96 = { 248 1.29 ozaki .type = CRYPTO_SHA1_HMAC_96, 249 1.29 ozaki .name = "HMAC-SHA1-96", 250 1.29 ozaki .keysize = 20, 251 1.29 ozaki .hashsize = 20, 252 1.29 ozaki .authsize = 12, 253 1.29 ozaki .blocksize = 64, 254 1.1 jonathan }; 255 1.1 jonathan 256 1.21 drochner const struct auth_hash auth_hash_hmac_ripemd_160_96 = { 257 1.29 ozaki .type = CRYPTO_RIPEMD160_HMAC_96, 258 1.29 ozaki .name = "HMAC-RIPEMD-160", 259 1.29 ozaki .keysize = 20, 260 1.29 ozaki .hashsize = 20, 261 1.29 ozaki .authsize = 12, 262 1.29 ozaki .blocksize = 64, 263 1.1 jonathan }; 264 1.1 jonathan 265 1.21 drochner const struct auth_hash auth_hash_key_md5 = { 266 1.29 ozaki .type = CRYPTO_MD5_KPDK, 267 1.29 ozaki .name = "Keyed MD5", 268 1.29 ozaki .keysize = 0, 269 1.29 ozaki .hashsize = 16, 270 1.29 ozaki .authsize = 16, 271 1.29 ozaki .blocksize = 0, 272 1.1 jonathan }; 273 1.1 jonathan 274 1.21 drochner const struct auth_hash auth_hash_key_sha1 = { 275 1.29 ozaki .type = CRYPTO_SHA1_KPDK, 276 1.29 ozaki .name = "Keyed SHA1", 277 1.29 ozaki .keysize = 0, 278 1.29 ozaki .hashsize = 20, 279 1.29 ozaki .authsize = 20, 280 1.29 ozaki .blocksize = 0, 281 1.1 jonathan }; 282 1.1 jonathan 283 1.21 drochner const struct auth_hash auth_hash_md5 = { 284 1.29 ozaki .type = CRYPTO_MD5, 285 1.29 ozaki .name = "MD5", 286 1.29 ozaki .keysize = 0, 287 1.29 ozaki .hashsize = 16, 288 1.29 ozaki .authsize = 16, 289 1.29 ozaki .blocksize = 0, 290 1.1 jonathan }; 291 1.1 jonathan 292 1.21 drochner const struct auth_hash auth_hash_sha1 = { 293 1.29 ozaki .type = CRYPTO_SHA1, 294 1.29 ozaki .name = "SHA1", 295 1.29 ozaki .keysize = 0, 296 1.29 ozaki .hashsize = 20, 297 1.29 ozaki .authsize = 20, 298 1.29 ozaki .blocksize = 0, 299 1.1 jonathan }; 300 1.1 jonathan 301 1.21 drochner const struct auth_hash auth_hash_hmac_sha2_256 = { 302 1.29 ozaki .type = CRYPTO_SHA2_256_HMAC, 303 1.29 ozaki .name = "HMAC-SHA2", 304 1.29 ozaki .keysize = 32, 305 1.29 ozaki .hashsize = 32, 306 1.29 ozaki .authsize = 16, 307 1.29 ozaki .blocksize = 64, 308 1.1 jonathan }; 309 1.1 jonathan 310 1.21 drochner const struct auth_hash auth_hash_hmac_sha2_384 = { 311 1.29 ozaki .type = CRYPTO_SHA2_384_HMAC, 312 1.29 ozaki .name = "HMAC-SHA2-384", 313 1.29 ozaki .keysize = 48, 314 1.29 ozaki .hashsize = 48, 315 1.29 ozaki .authsize = 24, 316 1.29 ozaki .blocksize = 128, 317 1.1 jonathan }; 318 1.1 jonathan 319 1.21 drochner const struct auth_hash auth_hash_hmac_sha2_512 = { 320 1.29 ozaki .type = CRYPTO_SHA2_512_HMAC, 321 1.29 ozaki .name = "HMAC-SHA2-512", 322 1.29 ozaki .keysize = 64, 323 1.29 ozaki .hashsize = 64, 324 1.29 ozaki .authsize = 32, 325 1.29 ozaki .blocksize = 128, 326 1.1 jonathan }; 327 1.1 jonathan 328 1.27 drochner const struct auth_hash auth_hash_aes_xcbc_mac_96 = { 329 1.29 ozaki .type = CRYPTO_AES_XCBC_MAC_96, 330 1.29 ozaki .name = "AES-XCBC-MAC-96", 331 1.29 ozaki .keysize = 16, 332 1.29 ozaki .hashsize = 16, 333 1.29 ozaki .authsize = 12, 334 1.29 ozaki .blocksize = 0, 335 1.27 drochner }; 336 1.27 drochner 337 1.28 drochner const struct auth_hash auth_hash_gmac_aes_128 = { 338 1.29 ozaki .type = CRYPTO_AES_128_GMAC, 339 1.29 ozaki .name = "GMAC-AES-128", 340 1.29 ozaki .keysize = 16 + 4, 341 1.29 ozaki .hashsize = 16, 342 1.29 ozaki .authsize = 16, 343 1.29 ozaki .blocksize = 16, /* ??? */ 344 1.28 drochner }; 345 1.28 drochner 346 1.28 drochner const struct auth_hash auth_hash_gmac_aes_192 = { 347 1.29 ozaki .type = CRYPTO_AES_192_GMAC, 348 1.29 ozaki .name = "GMAC-AES-192", 349 1.29 ozaki .keysize = 24 + 4, 350 1.29 ozaki .hashsize = 16, 351 1.29 ozaki .authsize = 16, 352 1.29 ozaki .blocksize = 16, /* ??? */ 353 1.28 drochner }; 354 1.28 drochner 355 1.28 drochner const struct auth_hash auth_hash_gmac_aes_256 = { 356 1.29 ozaki .type = CRYPTO_AES_256_GMAC, 357 1.29 ozaki .name = "GMAC-AES-256", 358 1.29 ozaki .keysize = 32 + 4, 359 1.29 ozaki .hashsize = 16, 360 1.29 ozaki .authsize = 16, 361 1.29 ozaki .blocksize = 16, /* ??? */ 362 1.28 drochner }; 363 1.28 drochner 364 1.1 jonathan /* Compression instance */ 365 1.21 drochner const struct comp_algo comp_algo_deflate = { 366 1.29 ozaki .type = CRYPTO_DEFLATE_COMP, 367 1.29 ozaki .name = "Deflate", 368 1.29 ozaki .minlen = 90, 369 1.1 jonathan }; 370 1.18 darran 371 1.21 drochner const struct comp_algo comp_algo_deflate_nogrow = { 372 1.29 ozaki .type = CRYPTO_DEFLATE_COMP_NOGROW, 373 1.29 ozaki .name = "Deflate", 374 1.29 ozaki .minlen = 90, 375 1.19 drochner }; 376 1.19 drochner 377 1.21 drochner const struct comp_algo comp_algo_gzip = { 378 1.29 ozaki .type = CRYPTO_GZIP_COMP, 379 1.29 ozaki .name = "GZIP", 380 1.29 ozaki .minlen = 90, 381 1.18 darran }; 382