xform_gmac.c revision 285336
1250003Sadrian/* $OpenBSD: xform.c,v 1.16 2001/08/28 12:20:43 ben Exp $ */ 2250003Sadrian/*- 3250003Sadrian * The authors of this code are John Ioannidis (ji@tla.org), 4250003Sadrian * Angelos D. Keromytis (kermit@csd.uch.gr), 5250003Sadrian * Niels Provos (provos@physnet.uni-hamburg.de) and 6250003Sadrian * Damien Miller (djm@mindrot.org). 7250003Sadrian * 8250003Sadrian * This code was written by John Ioannidis for BSD/OS in Athens, Greece, 9250003Sadrian * in November 1995. 10250003Sadrian * 11250003Sadrian * Ported to OpenBSD and NetBSD, with additional transforms, in December 1996, 12250003Sadrian * by Angelos D. Keromytis. 13250003Sadrian * 14250003Sadrian * Additional transforms and features in 1997 and 1998 by Angelos D. Keromytis 15250003Sadrian * and Niels Provos. 16250003Sadrian * 17250003Sadrian * Additional features in 1999 by Angelos D. Keromytis. 18250003Sadrian * 19250003Sadrian * AES XTS implementation in 2008 by Damien Miller 20250003Sadrian * 21250003Sadrian * Copyright (C) 1995, 1996, 1997, 1998, 1999 by John Ioannidis, 22250003Sadrian * Angelos D. Keromytis and Niels Provos. 23250003Sadrian * 24250003Sadrian * Copyright (C) 2001, Angelos D. Keromytis. 25250003Sadrian * 26250003Sadrian * Copyright (C) 2008, Damien Miller 27250003Sadrian * Copyright (c) 2014 The FreeBSD Foundation 28250003Sadrian * All rights reserved. 29250003Sadrian * 30250003Sadrian * Portions of this software were developed by John-Mark Gurney 31250003Sadrian * under sponsorship of the FreeBSD Foundation and 32250003Sadrian * Rubicon Communications, LLC (Netgate). 33250003Sadrian * 34250003Sadrian * Permission to use, copy, and modify this software with or without fee 35250003Sadrian * is hereby granted, provided that this entire notice is included in 36250003Sadrian * all copies of any software which is or includes a copy or 37250003Sadrian * modification of this software. 38250003Sadrian * You may use this code under the GNU public license if you so wish. Please 39250003Sadrian * contribute changes back to the authors under this freer than GPL license 40250003Sadrian * so that we may further the use of strong encryption without limitations to 41250003Sadrian * all. 42250003Sadrian * 43250003Sadrian * THIS SOFTWARE IS BEING PROVIDED "AS IS", WITHOUT ANY EXPRESS OR 44250003Sadrian * IMPLIED WARRANTY. IN PARTICULAR, NONE OF THE AUTHORS MAKES ANY 45250003Sadrian * REPRESENTATION OR WARRANTY OF ANY KIND CONCERNING THE 46250003Sadrian * MERCHANTABILITY OF THIS SOFTWARE OR ITS FITNESS FOR ANY PARTICULAR 47250003Sadrian * PURPOSE. 48250003Sadrian */ 49250003Sadrian 50250003Sadrian#include <sys/cdefs.h> 51250003Sadrian__FBSDID("$FreeBSD: head/sys/opencrypto/xform.c 285336 2015-07-09 18:16:35Z gnn $"); 52250003Sadrian 53250003Sadrian#include <sys/param.h> 54250003Sadrian#include <sys/systm.h> 55250003Sadrian#include <sys/malloc.h> 56250003Sadrian#include <sys/sysctl.h> 57250003Sadrian#include <sys/errno.h> 58250003Sadrian#include <sys/time.h> 59250003Sadrian#include <sys/kernel.h> 60250003Sadrian#include <machine/cpu.h> 61250003Sadrian 62250003Sadrian#include <crypto/blowfish/blowfish.h> 63250003Sadrian#include <crypto/des/des.h> 64250003Sadrian#include <crypto/rijndael/rijndael.h> 65250003Sadrian#include <crypto/camellia/camellia.h> 66250003Sadrian#include <crypto/sha1.h> 67250003Sadrian 68250003Sadrian#include <opencrypto/cast.h> 69250003Sadrian#include <opencrypto/deflate.h> 70250003Sadrian#include <opencrypto/rmd160.h> 71250003Sadrian#include <opencrypto/skipjack.h> 72250003Sadrian 73250003Sadrian#include <sys/md5.h> 74250003Sadrian 75250003Sadrian#include <opencrypto/cryptodev.h> 76250003Sadrian#include <opencrypto/xform.h> 77250003Sadrian 78250003Sadrianstatic int null_setkey(u_int8_t **, u_int8_t *, int); 79250003Sadrianstatic int des1_setkey(u_int8_t **, u_int8_t *, int); 80250003Sadrianstatic int des3_setkey(u_int8_t **, u_int8_t *, int); 81250003Sadrianstatic int blf_setkey(u_int8_t **, u_int8_t *, int); 82250003Sadrianstatic int cast5_setkey(u_int8_t **, u_int8_t *, int); 83250003Sadrianstatic int skipjack_setkey(u_int8_t **, u_int8_t *, int); 84250003Sadrianstatic int rijndael128_setkey(u_int8_t **, u_int8_t *, int); 85250003Sadrianstatic int aes_icm_setkey(u_int8_t **, u_int8_t *, int); 86250003Sadrianstatic int aes_xts_setkey(u_int8_t **, u_int8_t *, int); 87250003Sadrianstatic int cml_setkey(u_int8_t **, u_int8_t *, int); 88250003Sadrian 89250003Sadrianstatic void null_encrypt(caddr_t, u_int8_t *); 90250003Sadrianstatic void des1_encrypt(caddr_t, u_int8_t *); 91250003Sadrianstatic void des3_encrypt(caddr_t, u_int8_t *); 92250003Sadrianstatic void blf_encrypt(caddr_t, u_int8_t *); 93250003Sadrianstatic void cast5_encrypt(caddr_t, u_int8_t *); 94250003Sadrianstatic void skipjack_encrypt(caddr_t, u_int8_t *); 95250003Sadrianstatic void rijndael128_encrypt(caddr_t, u_int8_t *); 96250003Sadrianstatic void aes_xts_encrypt(caddr_t, u_int8_t *); 97250003Sadrianstatic void cml_encrypt(caddr_t, u_int8_t *); 98250003Sadrian 99250003Sadrianstatic void null_decrypt(caddr_t, u_int8_t *); 100250003Sadrianstatic void des1_decrypt(caddr_t, u_int8_t *); 101250003Sadrianstatic void des3_decrypt(caddr_t, u_int8_t *); 102250003Sadrianstatic void blf_decrypt(caddr_t, u_int8_t *); 103250003Sadrianstatic void cast5_decrypt(caddr_t, u_int8_t *); 104250003Sadrianstatic void skipjack_decrypt(caddr_t, u_int8_t *); 105250003Sadrianstatic void rijndael128_decrypt(caddr_t, u_int8_t *); 106250003Sadrianstatic void aes_xts_decrypt(caddr_t, u_int8_t *); 107250003Sadrianstatic void cml_decrypt(caddr_t, u_int8_t *); 108250003Sadrian 109250003Sadrianstatic void aes_icm_crypt(caddr_t, u_int8_t *); 110250003Sadrian 111250003Sadrianstatic void null_zerokey(u_int8_t **); 112250003Sadrianstatic void des1_zerokey(u_int8_t **); 113250003Sadrianstatic void des3_zerokey(u_int8_t **); 114250003Sadrianstatic void blf_zerokey(u_int8_t **); 115250003Sadrianstatic void cast5_zerokey(u_int8_t **); 116250003Sadrianstatic void skipjack_zerokey(u_int8_t **); 117250003Sadrianstatic void rijndael128_zerokey(u_int8_t **); 118250003Sadrianstatic void aes_icm_zerokey(u_int8_t **); 119250003Sadrianstatic void aes_xts_zerokey(u_int8_t **); 120250003Sadrianstatic void cml_zerokey(u_int8_t **); 121250003Sadrian 122250003Sadrianstatic void aes_icm_reinit(caddr_t, u_int8_t *); 123250003Sadrianstatic void aes_xts_reinit(caddr_t, u_int8_t *); 124250003Sadrianstatic void aes_gcm_reinit(caddr_t, u_int8_t *); 125250003Sadrian 126250003Sadrianstatic void null_init(void *); 127250003Sadrianstatic void null_reinit(void *ctx, const u_int8_t *buf, u_int16_t len); 128250003Sadrianstatic int null_update(void *, const u_int8_t *, u_int16_t); 129250003Sadrianstatic void null_final(u_int8_t *, void *); 130250003Sadrianstatic int MD5Update_int(void *, const u_int8_t *, u_int16_t); 131250003Sadrianstatic void SHA1Init_int(void *); 132250003Sadrianstatic int SHA1Update_int(void *, const u_int8_t *, u_int16_t); 133250003Sadrianstatic void SHA1Final_int(u_int8_t *, void *); 134250003Sadrianstatic int RMD160Update_int(void *, const u_int8_t *, u_int16_t); 135250003Sadrianstatic int SHA256Update_int(void *, const u_int8_t *, u_int16_t); 136250003Sadrianstatic int SHA384Update_int(void *, const u_int8_t *, u_int16_t); 137250003Sadrianstatic int SHA512Update_int(void *, const u_int8_t *, u_int16_t); 138250003Sadrian 139250003Sadrianstatic u_int32_t deflate_compress(u_int8_t *, u_int32_t, u_int8_t **); 140250003Sadrianstatic u_int32_t deflate_decompress(u_int8_t *, u_int32_t, u_int8_t **); 141250003Sadrian 142250003Sadrian#define AESICM_BLOCKSIZE 16 143250003Sadrian 144250003Sadrianstruct aes_icm_ctx { 145250003Sadrian u_int32_t ac_ek[4*(RIJNDAEL_MAXNR + 1)]; 146250003Sadrian /* ac_block is initalized to IV */ 147250003Sadrian u_int8_t ac_block[AESICM_BLOCKSIZE]; 148250003Sadrian int ac_nr; 149250003Sadrian}; 150250003Sadrian 151250003SadrianMALLOC_DEFINE(M_XDATA, "xform", "xform data buffers"); 152250003Sadrian 153250003Sadrian/* Encryption instances */ 154250003Sadrianstruct enc_xform enc_xform_null = { 155250003Sadrian CRYPTO_NULL_CBC, "NULL", 156250003Sadrian /* NB: blocksize of 4 is to generate a properly aligned ESP header */ 157250003Sadrian NULL_BLOCK_LEN, NULL_BLOCK_LEN, NULL_MIN_KEY, NULL_MAX_KEY, 158250003Sadrian null_encrypt, 159250003Sadrian null_decrypt, 160250003Sadrian null_setkey, 161250003Sadrian null_zerokey, 162250003Sadrian NULL, 163250003Sadrian}; 164250003Sadrian 165250003Sadrianstruct enc_xform enc_xform_des = { 166250003Sadrian CRYPTO_DES_CBC, "DES", 167250003Sadrian DES_BLOCK_LEN, DES_BLOCK_LEN, DES_MIN_KEY, DES_MAX_KEY, 168250003Sadrian des1_encrypt, 169250003Sadrian des1_decrypt, 170250003Sadrian des1_setkey, 171250003Sadrian des1_zerokey, 172250003Sadrian NULL, 173250003Sadrian}; 174250003Sadrian 175250003Sadrianstruct enc_xform enc_xform_3des = { 176250003Sadrian CRYPTO_3DES_CBC, "3DES", 177250003Sadrian DES3_BLOCK_LEN, DES3_BLOCK_LEN, TRIPLE_DES_MIN_KEY, 178250003Sadrian TRIPLE_DES_MAX_KEY, 179250003Sadrian des3_encrypt, 180250003Sadrian des3_decrypt, 181250003Sadrian des3_setkey, 182250003Sadrian des3_zerokey, 183250003Sadrian NULL, 184250003Sadrian}; 185250003Sadrian 186250003Sadrianstruct enc_xform enc_xform_blf = { 187250003Sadrian CRYPTO_BLF_CBC, "Blowfish", 188250003Sadrian BLOWFISH_BLOCK_LEN, BLOWFISH_BLOCK_LEN, BLOWFISH_MIN_KEY, 189250003Sadrian BLOWFISH_MAX_KEY, 190250003Sadrian blf_encrypt, 191250003Sadrian blf_decrypt, 192250003Sadrian blf_setkey, 193250003Sadrian blf_zerokey, 194250003Sadrian NULL, 195250003Sadrian}; 196250003Sadrian 197250003Sadrianstruct enc_xform enc_xform_cast5 = { 198250003Sadrian CRYPTO_CAST_CBC, "CAST-128", 199250003Sadrian CAST128_BLOCK_LEN, CAST128_BLOCK_LEN, CAST_MIN_KEY, CAST_MAX_KEY, 200250003Sadrian cast5_encrypt, 201250003Sadrian cast5_decrypt, 202250003Sadrian cast5_setkey, 203250003Sadrian cast5_zerokey, 204250003Sadrian NULL, 205250003Sadrian}; 206250003Sadrian 207250003Sadrianstruct enc_xform enc_xform_skipjack = { 208250003Sadrian CRYPTO_SKIPJACK_CBC, "Skipjack", 209250003Sadrian SKIPJACK_BLOCK_LEN, SKIPJACK_BLOCK_LEN, SKIPJACK_MIN_KEY, 210250003Sadrian SKIPJACK_MAX_KEY, 211250003Sadrian skipjack_encrypt, 212250003Sadrian skipjack_decrypt, skipjack_setkey, 213250003Sadrian skipjack_zerokey, 214250003Sadrian NULL, 215250003Sadrian}; 216250003Sadrian 217250003Sadrianstruct enc_xform enc_xform_rijndael128 = { 218250003Sadrian CRYPTO_RIJNDAEL128_CBC, "Rijndael-128/AES", 219250003Sadrian RIJNDAEL128_BLOCK_LEN, RIJNDAEL128_BLOCK_LEN, RIJNDAEL_MIN_KEY, 220250003Sadrian RIJNDAEL_MAX_KEY, 221250003Sadrian rijndael128_encrypt, 222250003Sadrian rijndael128_decrypt, 223250003Sadrian rijndael128_setkey, 224250003Sadrian rijndael128_zerokey, 225250003Sadrian NULL, 226250003Sadrian}; 227250003Sadrian 228250003Sadrianstruct enc_xform enc_xform_aes_icm = { 229250003Sadrian CRYPTO_AES_ICM, "AES-ICM", 230250003Sadrian RIJNDAEL128_BLOCK_LEN, RIJNDAEL128_BLOCK_LEN, AES_MIN_KEY, AES_MAX_KEY, 231250003Sadrian aes_icm_crypt, 232250003Sadrian aes_icm_crypt, 233250003Sadrian aes_icm_setkey, 234250003Sadrian rijndael128_zerokey, 235250003Sadrian aes_icm_reinit, 236250003Sadrian}; 237250003Sadrian 238250003Sadrianstruct enc_xform enc_xform_aes_nist_gcm = { 239250003Sadrian CRYPTO_AES_NIST_GCM_16, "AES-GCM", 240250003Sadrian AES_MIN_BLOCK_LEN, AES_IV_LEN, AES_MIN_KEY, AES_MAX_KEY, 241250003Sadrian aes_icm_crypt, 242250003Sadrian aes_icm_crypt, 243250003Sadrian aes_icm_setkey, 244250003Sadrian aes_icm_zerokey, 245250003Sadrian aes_gcm_reinit, 246250003Sadrian}; 247250003Sadrian 248250003Sadrianstruct enc_xform enc_xform_aes_nist_gmac = { 249250003Sadrian CRYPTO_AES_NIST_GMAC, "AES-GMAC", 250250003Sadrian AES_MIN_BLOCK_LEN, AES_IV_LEN, AES_MIN_KEY, AES_MAX_KEY, 251250003Sadrian NULL, 252250003Sadrian NULL, 253250003Sadrian NULL, 254250003Sadrian NULL, 255250003Sadrian NULL, 256250003Sadrian}; 257250003Sadrian 258250003Sadrianstruct enc_xform enc_xform_aes_xts = { 259250003Sadrian CRYPTO_AES_XTS, "AES-XTS", 260250003Sadrian AES_MIN_BLOCK_LEN, AES_XTS_IV_LEN, AES_XTS_MIN_KEY, AES_XTS_MAX_KEY, 261250003Sadrian aes_xts_encrypt, 262250003Sadrian aes_xts_decrypt, 263250003Sadrian aes_xts_setkey, 264250003Sadrian aes_xts_zerokey, 265250003Sadrian aes_xts_reinit 266250003Sadrian}; 267250003Sadrian 268250003Sadrianstruct enc_xform enc_xform_arc4 = { 269250003Sadrian CRYPTO_ARC4, "ARC4", 270250003Sadrian ARC4_BLOCK_LEN, ARC4_IV_LEN, ARC4_MIN_KEY, ARC4_MAX_KEY, 271250003Sadrian NULL, 272250003Sadrian NULL, 273250003Sadrian NULL, 274250003Sadrian NULL, 275250003Sadrian NULL, 276250003Sadrian}; 277250003Sadrian 278250003Sadrianstruct enc_xform enc_xform_camellia = { 279250003Sadrian CRYPTO_CAMELLIA_CBC, "Camellia", 280250003Sadrian CAMELLIA_BLOCK_LEN, CAMELLIA_BLOCK_LEN, CAMELLIA_MIN_KEY, 281250003Sadrian CAMELLIA_MAX_KEY, 282250003Sadrian cml_encrypt, 283250003Sadrian cml_decrypt, 284250003Sadrian cml_setkey, 285250003Sadrian cml_zerokey, 286250003Sadrian NULL, 287250003Sadrian}; 288250003Sadrian 289250003Sadrian/* Authentication instances */ 290250003Sadrianstruct auth_hash auth_hash_null = { /* NB: context isn't used */ 291250003Sadrian CRYPTO_NULL_HMAC, "NULL-HMAC", 292250003Sadrian NULL_HMAC_KEY_LEN, NULL_HASH_LEN, sizeof(int), NULL_HMAC_BLOCK_LEN, 293250003Sadrian null_init, null_reinit, null_reinit, null_update, null_final 294250003Sadrian}; 295250003Sadrian 296250003Sadrianstruct auth_hash auth_hash_hmac_md5 = { 297250003Sadrian CRYPTO_MD5_HMAC, "HMAC-MD5", 298250003Sadrian MD5_HMAC_KEY_LEN, MD5_HASH_LEN, sizeof(MD5_CTX), MD5_HMAC_BLOCK_LEN, 299250003Sadrian (void (*) (void *)) MD5Init, NULL, NULL, MD5Update_int, 300250003Sadrian (void (*) (u_int8_t *, void *)) MD5Final 301250003Sadrian}; 302250003Sadrian 303250003Sadrianstruct auth_hash auth_hash_hmac_sha1 = { 304250003Sadrian CRYPTO_SHA1_HMAC, "HMAC-SHA1", 305250003Sadrian SHA1_HMAC_KEY_LEN, SHA1_HASH_LEN, sizeof(SHA1_CTX), SHA1_HMAC_BLOCK_LEN, 306250003Sadrian SHA1Init_int, NULL, NULL, SHA1Update_int, SHA1Final_int 307250003Sadrian}; 308250003Sadrian 309250003Sadrianstruct auth_hash auth_hash_hmac_ripemd_160 = { 310250003Sadrian CRYPTO_RIPEMD160_HMAC, "HMAC-RIPEMD-160", 311250003Sadrian RIPEMD160_HMAC_KEY_LEN, RIPEMD160_HASH_LEN, sizeof(RMD160_CTX), 312250003Sadrian RIPEMD160_HMAC_BLOCK_LEN, 313250003Sadrian (void (*)(void *)) RMD160Init, NULL, NULL, RMD160Update_int, 314250003Sadrian (void (*)(u_int8_t *, void *)) RMD160Final 315250003Sadrian}; 316250003Sadrian 317250003Sadrianstruct auth_hash auth_hash_key_md5 = { 318250003Sadrian CRYPTO_MD5_KPDK, "Keyed MD5", 319250003Sadrian NULL_HMAC_KEY_LEN, MD5_KPDK_HASH_LEN, sizeof(MD5_CTX), 0, 320250003Sadrian (void (*)(void *)) MD5Init, NULL, NULL, MD5Update_int, 321250003Sadrian (void (*)(u_int8_t *, void *)) MD5Final 322250003Sadrian}; 323250003Sadrian 324250003Sadrianstruct auth_hash auth_hash_key_sha1 = { 325250003Sadrian CRYPTO_SHA1_KPDK, "Keyed SHA1", 326250003Sadrian NULL_HMAC_KEY_LEN, SHA1_KPDK_HASH_LEN, sizeof(SHA1_CTX), 0, 327250003Sadrian SHA1Init_int, NULL, NULL, SHA1Update_int, SHA1Final_int 328250003Sadrian}; 329250003Sadrian 330250003Sadrianstruct auth_hash auth_hash_hmac_sha2_256 = { 331250003Sadrian CRYPTO_SHA2_256_HMAC, "HMAC-SHA2-256", 332250003Sadrian SHA2_256_HMAC_KEY_LEN, SHA2_256_HASH_LEN, sizeof(SHA256_CTX), 333250003Sadrian SHA2_256_HMAC_BLOCK_LEN, 334250003Sadrian (void (*)(void *)) SHA256_Init, NULL, NULL, SHA256Update_int, 335250003Sadrian (void (*)(u_int8_t *, void *)) SHA256_Final 336250003Sadrian}; 337250003Sadrian 338250003Sadrianstruct auth_hash auth_hash_hmac_sha2_384 = { 339250003Sadrian CRYPTO_SHA2_384_HMAC, "HMAC-SHA2-384", 340250003Sadrian SHA2_384_HMAC_KEY_LEN, SHA2_384_HASH_LEN, sizeof(SHA384_CTX), 341250003Sadrian SHA2_384_HMAC_BLOCK_LEN, 342250003Sadrian (void (*)(void *)) SHA384_Init, NULL, NULL, SHA384Update_int, 343250003Sadrian (void (*)(u_int8_t *, void *)) SHA384_Final 344250003Sadrian}; 345250003Sadrian 346250003Sadrianstruct auth_hash auth_hash_hmac_sha2_512 = { 347250003Sadrian CRYPTO_SHA2_512_HMAC, "HMAC-SHA2-512", 348250003Sadrian SHA2_512_HMAC_KEY_LEN, SHA2_512_HASH_LEN, sizeof(SHA512_CTX), 349250003Sadrian SHA2_512_HMAC_BLOCK_LEN, 350250003Sadrian (void (*)(void *)) SHA512_Init, NULL, NULL, SHA512Update_int, 351250003Sadrian (void (*)(u_int8_t *, void *)) SHA512_Final 352250003Sadrian}; 353250003Sadrian 354250003Sadrianstruct auth_hash auth_hash_nist_gmac_aes_128 = { 355250003Sadrian CRYPTO_AES_128_NIST_GMAC, "GMAC-AES-128", 356250003Sadrian AES_128_HMAC_KEY_LEN, AES_HASH_LEN, sizeof(struct aes_gmac_ctx), 357250003Sadrian GMAC_BLOCK_LEN, 358250003Sadrian (void (*)(void *)) AES_GMAC_Init, 359250003Sadrian (void (*)(void *, const u_int8_t *, u_int16_t)) AES_GMAC_Setkey, 360250003Sadrian (void (*)(void *, const u_int8_t *, u_int16_t)) AES_GMAC_Reinit, 361250003Sadrian (int (*)(void *, const u_int8_t *, u_int16_t)) AES_GMAC_Update, 362250003Sadrian (void (*)(u_int8_t *, void *)) AES_GMAC_Final 363250003Sadrian}; 364250003Sadrian 365250003Sadrianstruct auth_hash auth_hash_nist_gmac_aes_192 = { 366250003Sadrian CRYPTO_AES_192_NIST_GMAC, "GMAC-AES-192", 367250003Sadrian AES_192_HMAC_KEY_LEN, AES_HASH_LEN, sizeof(struct aes_gmac_ctx), 368250003Sadrian GMAC_BLOCK_LEN, 369250003Sadrian (void (*)(void *)) AES_GMAC_Init, 370250003Sadrian (void (*)(void *, const u_int8_t *, u_int16_t)) AES_GMAC_Setkey, 371250003Sadrian (void (*)(void *, const u_int8_t *, u_int16_t)) AES_GMAC_Reinit, 372250003Sadrian (int (*)(void *, const u_int8_t *, u_int16_t)) AES_GMAC_Update, 373250003Sadrian (void (*)(u_int8_t *, void *)) AES_GMAC_Final 374250003Sadrian}; 375250003Sadrian 376250003Sadrianstruct auth_hash auth_hash_nist_gmac_aes_256 = { 377250003Sadrian CRYPTO_AES_256_NIST_GMAC, "GMAC-AES-256", 378250003Sadrian AES_256_HMAC_KEY_LEN, AES_HASH_LEN, sizeof(struct aes_gmac_ctx), 379250003Sadrian GMAC_BLOCK_LEN, 380250003Sadrian (void (*)(void *)) AES_GMAC_Init, 381250003Sadrian (void (*)(void *, const u_int8_t *, u_int16_t)) AES_GMAC_Setkey, 382250003Sadrian (void (*)(void *, const u_int8_t *, u_int16_t)) AES_GMAC_Reinit, 383250003Sadrian (int (*)(void *, const u_int8_t *, u_int16_t)) AES_GMAC_Update, 384250003Sadrian (void (*)(u_int8_t *, void *)) AES_GMAC_Final 385250003Sadrian}; 386250003Sadrian 387250003Sadrian/* Compression instance */ 388250003Sadrianstruct comp_algo comp_algo_deflate = { 389250003Sadrian CRYPTO_DEFLATE_COMP, "Deflate", 390250003Sadrian 90, deflate_compress, 391250003Sadrian deflate_decompress 392250003Sadrian}; 393250003Sadrian 394250003Sadrian/* 395250003Sadrian * Encryption wrapper routines. 396250003Sadrian */ 397250003Sadrianstatic void 398250003Sadriannull_encrypt(caddr_t key, u_int8_t *blk) 399250003Sadrian{ 400250003Sadrian} 401250003Sadrianstatic void 402250003Sadriannull_decrypt(caddr_t key, u_int8_t *blk) 403250003Sadrian{ 404250003Sadrian} 405250003Sadrianstatic int 406250003Sadriannull_setkey(u_int8_t **sched, u_int8_t *key, int len) 407250003Sadrian{ 408250003Sadrian *sched = NULL; 409250003Sadrian return 0; 410250003Sadrian} 411250003Sadrianstatic void 412250003Sadriannull_zerokey(u_int8_t **sched) 413250003Sadrian{ 414250003Sadrian *sched = NULL; 415250003Sadrian} 416250003Sadrian 417250003Sadrianstatic void 418250003Sadriandes1_encrypt(caddr_t key, u_int8_t *blk) 419250003Sadrian{ 420250003Sadrian des_cblock *cb = (des_cblock *) blk; 421250003Sadrian des_key_schedule *p = (des_key_schedule *) key; 422250003Sadrian 423250003Sadrian des_ecb_encrypt(cb, cb, p[0], DES_ENCRYPT); 424250003Sadrian} 425250003Sadrian 426250003Sadrianstatic void 427250003Sadriandes1_decrypt(caddr_t key, u_int8_t *blk) 428250003Sadrian{ 429250003Sadrian des_cblock *cb = (des_cblock *) blk; 430250003Sadrian des_key_schedule *p = (des_key_schedule *) key; 431250003Sadrian 432250003Sadrian des_ecb_encrypt(cb, cb, p[0], DES_DECRYPT); 433250003Sadrian} 434250003Sadrian 435250003Sadrianstatic int 436250003Sadriandes1_setkey(u_int8_t **sched, u_int8_t *key, int len) 437250003Sadrian{ 438250003Sadrian des_key_schedule *p; 439250003Sadrian int err; 440250003Sadrian 441250003Sadrian p = malloc(sizeof (des_key_schedule), 442250003Sadrian M_CRYPTO_DATA, M_NOWAIT|M_ZERO); 443250003Sadrian if (p != NULL) { 444250003Sadrian des_set_key((des_cblock *) key, p[0]); 445250003Sadrian err = 0; 446250003Sadrian } else 447250003Sadrian err = ENOMEM; 448250003Sadrian *sched = (u_int8_t *) p; 449250003Sadrian return err; 450250003Sadrian} 451250003Sadrian 452250003Sadrianstatic void 453250003Sadriandes1_zerokey(u_int8_t **sched) 454250003Sadrian{ 455250003Sadrian bzero(*sched, sizeof (des_key_schedule)); 456250003Sadrian free(*sched, M_CRYPTO_DATA); 457250003Sadrian *sched = NULL; 458250003Sadrian} 459250003Sadrian 460250003Sadrianstatic void 461250003Sadriandes3_encrypt(caddr_t key, u_int8_t *blk) 462250003Sadrian{ 463250003Sadrian des_cblock *cb = (des_cblock *) blk; 464250003Sadrian des_key_schedule *p = (des_key_schedule *) key; 465250003Sadrian 466250003Sadrian des_ecb3_encrypt(cb, cb, p[0], p[1], p[2], DES_ENCRYPT); 467250003Sadrian} 468250003Sadrian 469250003Sadrianstatic void 470250003Sadriandes3_decrypt(caddr_t key, u_int8_t *blk) 471250003Sadrian{ 472250003Sadrian des_cblock *cb = (des_cblock *) blk; 473250003Sadrian des_key_schedule *p = (des_key_schedule *) key; 474250003Sadrian 475250003Sadrian des_ecb3_encrypt(cb, cb, p[0], p[1], p[2], DES_DECRYPT); 476250003Sadrian} 477250003Sadrian 478250003Sadrianstatic int 479250003Sadriandes3_setkey(u_int8_t **sched, u_int8_t *key, int len) 480250003Sadrian{ 481250003Sadrian des_key_schedule *p; 482250003Sadrian int err; 483250003Sadrian 484250003Sadrian p = malloc(3*sizeof (des_key_schedule), 485250003Sadrian M_CRYPTO_DATA, M_NOWAIT|M_ZERO); 486250003Sadrian if (p != NULL) { 487250003Sadrian des_set_key((des_cblock *)(key + 0), p[0]); 488250003Sadrian des_set_key((des_cblock *)(key + 8), p[1]); 489250003Sadrian des_set_key((des_cblock *)(key + 16), p[2]); 490250003Sadrian err = 0; 491250003Sadrian } else 492250003Sadrian err = ENOMEM; 493250003Sadrian *sched = (u_int8_t *) p; 494250003Sadrian return err; 495250003Sadrian} 496250003Sadrian 497250003Sadrianstatic void 498250003Sadriandes3_zerokey(u_int8_t **sched) 499250003Sadrian{ 500250003Sadrian bzero(*sched, 3*sizeof (des_key_schedule)); 501250003Sadrian free(*sched, M_CRYPTO_DATA); 502250003Sadrian *sched = NULL; 503250003Sadrian} 504250003Sadrian 505250003Sadrianstatic void 506250003Sadrianblf_encrypt(caddr_t key, u_int8_t *blk) 507250003Sadrian{ 508250003Sadrian BF_LONG t[2]; 509250003Sadrian 510250003Sadrian memcpy(t, blk, sizeof (t)); 511250003Sadrian t[0] = ntohl(t[0]); 512250003Sadrian t[1] = ntohl(t[1]); 513250003Sadrian /* NB: BF_encrypt expects the block in host order! */ 514250003Sadrian BF_encrypt(t, (BF_KEY *) key); 515250003Sadrian t[0] = htonl(t[0]); 516250003Sadrian t[1] = htonl(t[1]); 517250003Sadrian memcpy(blk, t, sizeof (t)); 518250003Sadrian} 519250003Sadrian 520250003Sadrianstatic void 521250003Sadrianblf_decrypt(caddr_t key, u_int8_t *blk) 522250003Sadrian{ 523250003Sadrian BF_LONG t[2]; 524250003Sadrian 525250003Sadrian memcpy(t, blk, sizeof (t)); 526250003Sadrian t[0] = ntohl(t[0]); 527250003Sadrian t[1] = ntohl(t[1]); 528250003Sadrian /* NB: BF_decrypt expects the block in host order! */ 529250003Sadrian BF_decrypt(t, (BF_KEY *) key); 530250003Sadrian t[0] = htonl(t[0]); 531250003Sadrian t[1] = htonl(t[1]); 532250003Sadrian memcpy(blk, t, sizeof (t)); 533250003Sadrian} 534250003Sadrian 535250003Sadrianstatic int 536250003Sadrianblf_setkey(u_int8_t **sched, u_int8_t *key, int len) 537250003Sadrian{ 538250003Sadrian int err; 539250003Sadrian 540250003Sadrian *sched = malloc(sizeof(BF_KEY), 541250003Sadrian M_CRYPTO_DATA, M_NOWAIT|M_ZERO); 542250003Sadrian if (*sched != NULL) { 543250003Sadrian BF_set_key((BF_KEY *) *sched, len, key); 544250003Sadrian err = 0; 545250003Sadrian } else 546250003Sadrian err = ENOMEM; 547250003Sadrian return err; 548250003Sadrian} 549250003Sadrian 550250003Sadrianstatic void 551250003Sadrianblf_zerokey(u_int8_t **sched) 552250003Sadrian{ 553250003Sadrian bzero(*sched, sizeof(BF_KEY)); 554250003Sadrian free(*sched, M_CRYPTO_DATA); 555250003Sadrian *sched = NULL; 556250003Sadrian} 557250003Sadrian 558250003Sadrianstatic void 559250003Sadriancast5_encrypt(caddr_t key, u_int8_t *blk) 560250003Sadrian{ 561250003Sadrian cast_encrypt((cast_key *) key, blk, blk); 562250003Sadrian} 563250003Sadrian 564250003Sadrianstatic void 565250003Sadriancast5_decrypt(caddr_t key, u_int8_t *blk) 566250003Sadrian{ 567250003Sadrian cast_decrypt((cast_key *) key, blk, blk); 568250003Sadrian} 569250003Sadrian 570250003Sadrianstatic int 571250003Sadriancast5_setkey(u_int8_t **sched, u_int8_t *key, int len) 572250003Sadrian{ 573250003Sadrian int err; 574250003Sadrian 575250003Sadrian *sched = malloc(sizeof(cast_key), M_CRYPTO_DATA, M_NOWAIT|M_ZERO); 576250003Sadrian if (*sched != NULL) { 577250003Sadrian cast_setkey((cast_key *)*sched, key, len); 578250003Sadrian err = 0; 579250003Sadrian } else 580250003Sadrian err = ENOMEM; 581250003Sadrian return err; 582250003Sadrian} 583250003Sadrian 584250003Sadrianstatic void 585250003Sadriancast5_zerokey(u_int8_t **sched) 586250003Sadrian{ 587250003Sadrian bzero(*sched, sizeof(cast_key)); 588250003Sadrian free(*sched, M_CRYPTO_DATA); 589250003Sadrian *sched = NULL; 590250003Sadrian} 591250003Sadrian 592250003Sadrianstatic void 593250003Sadrianskipjack_encrypt(caddr_t key, u_int8_t *blk) 594250003Sadrian{ 595250003Sadrian skipjack_forwards(blk, blk, (u_int8_t **) key); 596250003Sadrian} 597250003Sadrian 598250003Sadrianstatic void 599250003Sadrianskipjack_decrypt(caddr_t key, u_int8_t *blk) 600250003Sadrian{ 601250003Sadrian skipjack_backwards(blk, blk, (u_int8_t **) key); 602250003Sadrian} 603250003Sadrian 604250003Sadrianstatic int 605250003Sadrianskipjack_setkey(u_int8_t **sched, u_int8_t *key, int len) 606250003Sadrian{ 607250003Sadrian int err; 608250003Sadrian 609250003Sadrian /* NB: allocate all the memory that's needed at once */ 610250003Sadrian *sched = malloc(10 * (sizeof(u_int8_t *) + 0x100), 611250003Sadrian M_CRYPTO_DATA, M_NOWAIT|M_ZERO); 612250003Sadrian if (*sched != NULL) { 613250003Sadrian u_int8_t** key_tables = (u_int8_t**) *sched; 614250003Sadrian u_int8_t* table = (u_int8_t*) &key_tables[10]; 615250003Sadrian int k; 616250003Sadrian 617250003Sadrian for (k = 0; k < 10; k++) { 618250003Sadrian key_tables[k] = table; 619250003Sadrian table += 0x100; 620250003Sadrian } 621250003Sadrian subkey_table_gen(key, (u_int8_t **) *sched); 622250003Sadrian err = 0; 623250003Sadrian } else 624250003Sadrian err = ENOMEM; 625250003Sadrian return err; 626250003Sadrian} 627250003Sadrian 628250003Sadrianstatic void 629250003Sadrianskipjack_zerokey(u_int8_t **sched) 630250003Sadrian{ 631250003Sadrian bzero(*sched, 10 * (sizeof(u_int8_t *) + 0x100)); 632250003Sadrian free(*sched, M_CRYPTO_DATA); 633250003Sadrian *sched = NULL; 634250003Sadrian} 635250003Sadrian 636250003Sadrianstatic void 637250003Sadrianrijndael128_encrypt(caddr_t key, u_int8_t *blk) 638250003Sadrian{ 639250003Sadrian rijndael_encrypt((rijndael_ctx *) key, (u_char *) blk, (u_char *) blk); 640250003Sadrian} 641250003Sadrian 642250003Sadrianstatic void 643250003Sadrianrijndael128_decrypt(caddr_t key, u_int8_t *blk) 644250003Sadrian{ 645250003Sadrian rijndael_decrypt(((rijndael_ctx *) key), (u_char *) blk, 646250003Sadrian (u_char *) blk); 647250003Sadrian} 648250003Sadrian 649250003Sadrianstatic int 650250003Sadrianrijndael128_setkey(u_int8_t **sched, u_int8_t *key, int len) 651250003Sadrian{ 652250003Sadrian int err; 653250003Sadrian 654250003Sadrian if (len != 16 && len != 24 && len != 32) 655250003Sadrian return (EINVAL); 656250003Sadrian *sched = malloc(sizeof(rijndael_ctx), M_CRYPTO_DATA, 657250003Sadrian M_NOWAIT|M_ZERO); 658250003Sadrian if (*sched != NULL) { 659250003Sadrian rijndael_set_key((rijndael_ctx *) *sched, (u_char *) key, 660250003Sadrian len * 8); 661250003Sadrian err = 0; 662250003Sadrian } else 663250003Sadrian err = ENOMEM; 664250003Sadrian return err; 665250003Sadrian} 666250003Sadrian 667250003Sadrianstatic void 668250003Sadrianrijndael128_zerokey(u_int8_t **sched) 669250003Sadrian{ 670250003Sadrian bzero(*sched, sizeof(rijndael_ctx)); 671250003Sadrian free(*sched, M_CRYPTO_DATA); 672250003Sadrian *sched = NULL; 673250003Sadrian} 674250003Sadrian 675250003Sadrianvoid 676250003Sadrianaes_icm_reinit(caddr_t key, u_int8_t *iv) 677250003Sadrian{ 678250003Sadrian struct aes_icm_ctx *ctx; 679250003Sadrian 680250003Sadrian ctx = (struct aes_icm_ctx *)key; 681250003Sadrian bcopy(iv, ctx->ac_block, AESICM_BLOCKSIZE); 682250003Sadrian} 683250003Sadrian 684250003Sadrianvoid 685250003Sadrianaes_gcm_reinit(caddr_t key, u_int8_t *iv) 686250003Sadrian{ 687250003Sadrian struct aes_icm_ctx *ctx; 688250003Sadrian 689250003Sadrian aes_icm_reinit(key, iv); 690250003Sadrian 691250003Sadrian ctx = (struct aes_icm_ctx *)key; 692250003Sadrian /* GCM starts with 2 as counter 1 is used for final xor of tag. */ 693250003Sadrian bzero(&ctx->ac_block[AESICM_BLOCKSIZE - 4], 4); 694250003Sadrian ctx->ac_block[AESICM_BLOCKSIZE - 1] = 2; 695250003Sadrian} 696250003Sadrian 697250003Sadrianvoid 698250003Sadrianaes_icm_crypt(caddr_t key, u_int8_t *data) 699250003Sadrian{ 700250003Sadrian struct aes_icm_ctx *ctx; 701250003Sadrian u_int8_t keystream[AESICM_BLOCKSIZE]; 702250003Sadrian int i; 703250003Sadrian 704250003Sadrian ctx = (struct aes_icm_ctx *)key; 705250003Sadrian rijndaelEncrypt(ctx->ac_ek, ctx->ac_nr, ctx->ac_block, keystream); 706250003Sadrian for (i = 0; i < AESICM_BLOCKSIZE; i++) 707250003Sadrian data[i] ^= keystream[i]; 708250003Sadrian explicit_bzero(keystream, sizeof(keystream)); 709250003Sadrian 710250003Sadrian /* increment counter */ 711250003Sadrian for (i = AESICM_BLOCKSIZE - 1; 712250003Sadrian i >= 0; i--) 713250003Sadrian if (++ctx->ac_block[i]) /* continue on overflow */ 714250003Sadrian break; 715250003Sadrian} 716250003Sadrian 717250003Sadrianint 718250003Sadrianaes_icm_setkey(u_int8_t **sched, u_int8_t *key, int len) 719250003Sadrian{ 720250003Sadrian struct aes_icm_ctx *ctx; 721250003Sadrian 722250003Sadrian *sched = malloc(sizeof(struct aes_icm_ctx), M_CRYPTO_DATA, 723250003Sadrian M_NOWAIT | M_ZERO); 724250003Sadrian if (*sched == NULL) 725250003Sadrian return ENOMEM; 726250003Sadrian 727250003Sadrian ctx = (struct aes_icm_ctx *)*sched; 728250003Sadrian ctx->ac_nr = rijndaelKeySetupEnc(ctx->ac_ek, (u_char *)key, len * 8); 729250003Sadrian if (ctx->ac_nr == 0) 730250003Sadrian return EINVAL; 731250003Sadrian return 0; 732250003Sadrian} 733250003Sadrian 734250003Sadrianvoid 735250003Sadrianaes_icm_zerokey(u_int8_t **sched) 736250003Sadrian{ 737250003Sadrian 738250003Sadrian bzero(*sched, sizeof(struct aes_icm_ctx)); 739250003Sadrian free(*sched, M_CRYPTO_DATA); 740250003Sadrian *sched = NULL; 741250003Sadrian} 742250003Sadrian 743250003Sadrian#define AES_XTS_BLOCKSIZE 16 744250003Sadrian#define AES_XTS_IVSIZE 8 745250003Sadrian#define AES_XTS_ALPHA 0x87 /* GF(2^128) generator polynomial */ 746250003Sadrian 747250003Sadrianstruct aes_xts_ctx { 748250003Sadrian rijndael_ctx key1; 749 rijndael_ctx key2; 750 u_int8_t tweak[AES_XTS_BLOCKSIZE]; 751}; 752 753void 754aes_xts_reinit(caddr_t key, u_int8_t *iv) 755{ 756 struct aes_xts_ctx *ctx = (struct aes_xts_ctx *)key; 757 u_int64_t blocknum; 758 u_int i; 759 760 /* 761 * Prepare tweak as E_k2(IV). IV is specified as LE representation 762 * of a 64-bit block number which we allow to be passed in directly. 763 */ 764 bcopy(iv, &blocknum, AES_XTS_IVSIZE); 765 for (i = 0; i < AES_XTS_IVSIZE; i++) { 766 ctx->tweak[i] = blocknum & 0xff; 767 blocknum >>= 8; 768 } 769 /* Last 64 bits of IV are always zero */ 770 bzero(ctx->tweak + AES_XTS_IVSIZE, AES_XTS_IVSIZE); 771 772 rijndael_encrypt(&ctx->key2, ctx->tweak, ctx->tweak); 773} 774 775static void 776aes_xts_crypt(struct aes_xts_ctx *ctx, u_int8_t *data, u_int do_encrypt) 777{ 778 u_int8_t block[AES_XTS_BLOCKSIZE]; 779 u_int i, carry_in, carry_out; 780 781 for (i = 0; i < AES_XTS_BLOCKSIZE; i++) 782 block[i] = data[i] ^ ctx->tweak[i]; 783 784 if (do_encrypt) 785 rijndael_encrypt(&ctx->key1, block, data); 786 else 787 rijndael_decrypt(&ctx->key1, block, data); 788 789 for (i = 0; i < AES_XTS_BLOCKSIZE; i++) 790 data[i] ^= ctx->tweak[i]; 791 792 /* Exponentiate tweak */ 793 carry_in = 0; 794 for (i = 0; i < AES_XTS_BLOCKSIZE; i++) { 795 carry_out = ctx->tweak[i] & 0x80; 796 ctx->tweak[i] = (ctx->tweak[i] << 1) | (carry_in ? 1 : 0); 797 carry_in = carry_out; 798 } 799 if (carry_in) 800 ctx->tweak[0] ^= AES_XTS_ALPHA; 801 bzero(block, sizeof(block)); 802} 803 804void 805aes_xts_encrypt(caddr_t key, u_int8_t *data) 806{ 807 aes_xts_crypt((struct aes_xts_ctx *)key, data, 1); 808} 809 810void 811aes_xts_decrypt(caddr_t key, u_int8_t *data) 812{ 813 aes_xts_crypt((struct aes_xts_ctx *)key, data, 0); 814} 815 816int 817aes_xts_setkey(u_int8_t **sched, u_int8_t *key, int len) 818{ 819 struct aes_xts_ctx *ctx; 820 821 if (len != 32 && len != 64) 822 return EINVAL; 823 824 *sched = malloc(sizeof(struct aes_xts_ctx), M_CRYPTO_DATA, 825 M_NOWAIT | M_ZERO); 826 if (*sched == NULL) 827 return ENOMEM; 828 ctx = (struct aes_xts_ctx *)*sched; 829 830 rijndael_set_key(&ctx->key1, key, len * 4); 831 rijndael_set_key(&ctx->key2, key + (len / 2), len * 4); 832 833 return 0; 834} 835 836void 837aes_xts_zerokey(u_int8_t **sched) 838{ 839 bzero(*sched, sizeof(struct aes_xts_ctx)); 840 free(*sched, M_CRYPTO_DATA); 841 *sched = NULL; 842} 843 844static void 845cml_encrypt(caddr_t key, u_int8_t *blk) 846{ 847 camellia_encrypt((camellia_ctx *) key, (u_char *) blk, (u_char *) blk); 848} 849 850static void 851cml_decrypt(caddr_t key, u_int8_t *blk) 852{ 853 camellia_decrypt(((camellia_ctx *) key), (u_char *) blk, 854 (u_char *) blk); 855} 856 857static int 858cml_setkey(u_int8_t **sched, u_int8_t *key, int len) 859{ 860 int err; 861 862 if (len != 16 && len != 24 && len != 32) 863 return (EINVAL); 864 *sched = malloc(sizeof(camellia_ctx), M_CRYPTO_DATA, 865 M_NOWAIT|M_ZERO); 866 if (*sched != NULL) { 867 camellia_set_key((camellia_ctx *) *sched, (u_char *) key, 868 len * 8); 869 err = 0; 870 } else 871 err = ENOMEM; 872 return err; 873} 874 875static void 876cml_zerokey(u_int8_t **sched) 877{ 878 bzero(*sched, sizeof(camellia_ctx)); 879 free(*sched, M_CRYPTO_DATA); 880 *sched = NULL; 881} 882 883/* 884 * And now for auth. 885 */ 886 887static void 888null_init(void *ctx) 889{ 890} 891 892static void 893null_reinit(void *ctx, const u_int8_t *buf, u_int16_t len) 894{ 895} 896 897static int 898null_update(void *ctx, const u_int8_t *buf, u_int16_t len) 899{ 900 return 0; 901} 902 903static void 904null_final(u_int8_t *buf, void *ctx) 905{ 906 if (buf != (u_int8_t *) 0) 907 bzero(buf, 12); 908} 909 910static int 911RMD160Update_int(void *ctx, const u_int8_t *buf, u_int16_t len) 912{ 913 RMD160Update(ctx, buf, len); 914 return 0; 915} 916 917static int 918MD5Update_int(void *ctx, const u_int8_t *buf, u_int16_t len) 919{ 920 MD5Update(ctx, buf, len); 921 return 0; 922} 923 924static void 925SHA1Init_int(void *ctx) 926{ 927 SHA1Init(ctx); 928} 929 930static int 931SHA1Update_int(void *ctx, const u_int8_t *buf, u_int16_t len) 932{ 933 SHA1Update(ctx, buf, len); 934 return 0; 935} 936 937static void 938SHA1Final_int(u_int8_t *blk, void *ctx) 939{ 940 SHA1Final(blk, ctx); 941} 942 943static int 944SHA256Update_int(void *ctx, const u_int8_t *buf, u_int16_t len) 945{ 946 SHA256_Update(ctx, buf, len); 947 return 0; 948} 949 950static int 951SHA384Update_int(void *ctx, const u_int8_t *buf, u_int16_t len) 952{ 953 SHA384_Update(ctx, buf, len); 954 return 0; 955} 956 957static int 958SHA512Update_int(void *ctx, const u_int8_t *buf, u_int16_t len) 959{ 960 SHA512_Update(ctx, buf, len); 961 return 0; 962} 963 964/* 965 * And compression 966 */ 967 968static u_int32_t 969deflate_compress(data, size, out) 970 u_int8_t *data; 971 u_int32_t size; 972 u_int8_t **out; 973{ 974 return deflate_global(data, size, 0, out); 975} 976 977static u_int32_t 978deflate_decompress(data, size, out) 979 u_int8_t *data; 980 u_int32_t size; 981 u_int8_t **out; 982{ 983 return deflate_global(data, size, 1, out); 984} 985