14c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley/* ==================================================================== 24c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley * Copyright (c) 2002-2006 The OpenSSL Project. All rights reserved. 34c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley * 44c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley * Redistribution and use in source and binary forms, with or without 54c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley * modification, are permitted provided that the following conditions 64c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley * are met: 74c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley * 84c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley * 1. Redistributions of source code must retain the above copyright 94c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley * notice, this list of conditions and the following disclaimer. 104c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley * 114c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley * 2. Redistributions in binary form must reproduce the above copyright 124c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley * notice, this list of conditions and the following disclaimer in 134c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley * the documentation and/or other materials provided with the 144c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley * distribution. 154c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley * 164c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley * 3. All advertising materials mentioning features or use of this 174c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley * software must display the following acknowledgment: 184c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley * "This product includes software developed by the OpenSSL Project 194c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley * for use in the OpenSSL Toolkit. (http://www.openssl.org/)" 204c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley * 214c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to 224c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley * endorse or promote products derived from this software without 234c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley * prior written permission. For written permission, please contact 244c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley * openssl-core@openssl.org. 254c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley * 264c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley * 5. Products derived from this software may not be called "OpenSSL" 274c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley * nor may "OpenSSL" appear in their names without prior written 284c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley * permission of the OpenSSL Project. 294c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley * 304c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley * 6. Redistributions of any form whatsoever must retain the following 314c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley * acknowledgment: 324c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley * "This product includes software developed by the OpenSSL Project 334c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley * for use in the OpenSSL Toolkit (http://www.openssl.org/)" 344c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley * 354c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY 364c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 374c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 384c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR 394c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 404c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 414c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 424c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 434c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, 444c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 454c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED 464c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley * OF THE POSSIBILITY OF SUCH DAMAGE. 474c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley * ==================================================================== */ 484c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley 494c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley#ifndef OPENSSL_HEADER_AES_H 504c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley#define OPENSSL_HEADER_AES_H 514c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley 524c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley#include <openssl/base.h> 534c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley 544c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley#if defined(__cplusplus) 554c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langleyextern "C" { 564c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley#endif 574c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley 584c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley 594c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley/* Raw AES functions. */ 604c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley 614c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley 624c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley#define AES_ENCRYPT 1 634c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley#define AES_DECRYPT 0 644c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley 654c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley/* AES_MAXNR is the maximum number of AES rounds. */ 664c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley#define AES_MAXNR 14 674c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley 684c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley#define AES_BLOCK_SIZE 16 694c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley 704c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley/* aes_key_st should be an opaque type, but EVP requires that the size be 714c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley * known. */ 724c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langleystruct aes_key_st { 734c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley uint32_t rd_key[4 * (AES_MAXNR + 1)]; 744c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley unsigned rounds; 754c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley}; 764c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langleytypedef struct aes_key_st AES_KEY; 774c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley 784c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley/* AES_set_encrypt_key configures |aeskey| to encrypt with the |bits|-bit key, 794c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley * |key|. 804c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley * 814c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley * WARNING: unlike other OpenSSL functions, this returns zero on success and a 824c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley * negative number on error. */ 83eb7d2ed1fe8a33b3e3871502ba7e12efaf94360cAdam LangleyOPENSSL_EXPORT int AES_set_encrypt_key(const uint8_t *key, unsigned bits, 84eb7d2ed1fe8a33b3e3871502ba7e12efaf94360cAdam Langley AES_KEY *aeskey); 854c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley 864c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley/* AES_set_decrypt_key configures |aeskey| to decrypt with the |bits|-bit key, 874c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley * |key|. 884c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley * 894c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley * WARNING: unlike other OpenSSL functions, this returns zero on success and a 904c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley * negative number on error. */ 91eb7d2ed1fe8a33b3e3871502ba7e12efaf94360cAdam LangleyOPENSSL_EXPORT int AES_set_decrypt_key(const uint8_t *key, unsigned bits, 92eb7d2ed1fe8a33b3e3871502ba7e12efaf94360cAdam Langley AES_KEY *aeskey); 934c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley 944c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley/* AES_encrypt encrypts a single block from |in| to |out| with |key|. The |in| 954c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley * and |out| pointers may overlap. */ 96eb7d2ed1fe8a33b3e3871502ba7e12efaf94360cAdam LangleyOPENSSL_EXPORT void AES_encrypt(const uint8_t *in, uint8_t *out, 97eb7d2ed1fe8a33b3e3871502ba7e12efaf94360cAdam Langley const AES_KEY *key); 984c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley 994c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley/* AES_decrypt decrypts a single block from |in| to |out| with |key|. The |in| 1004c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley * and |out| pointers may overlap. */ 101eb7d2ed1fe8a33b3e3871502ba7e12efaf94360cAdam LangleyOPENSSL_EXPORT void AES_decrypt(const uint8_t *in, uint8_t *out, 102eb7d2ed1fe8a33b3e3871502ba7e12efaf94360cAdam Langley const AES_KEY *key); 1034c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley 1044c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley 1054c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley/* Block cipher modes. */ 1064c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley 1074c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley/* AES_ctr128_encrypt encrypts (or decrypts, it's the same in CTR mode) |len| 1084c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley * bytes from |in| to |out|. The |num| parameter must be set to zero on the 1094c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley * first call and |ivec| will be incremented. */ 110eb7d2ed1fe8a33b3e3871502ba7e12efaf94360cAdam LangleyOPENSSL_EXPORT void AES_ctr128_encrypt(const uint8_t *in, uint8_t *out, 111eb7d2ed1fe8a33b3e3871502ba7e12efaf94360cAdam Langley size_t len, const AES_KEY *key, 112eb7d2ed1fe8a33b3e3871502ba7e12efaf94360cAdam Langley uint8_t ivec[AES_BLOCK_SIZE], 113eb7d2ed1fe8a33b3e3871502ba7e12efaf94360cAdam Langley uint8_t ecount_buf[AES_BLOCK_SIZE], 114eb7d2ed1fe8a33b3e3871502ba7e12efaf94360cAdam Langley unsigned int *num); 1154c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley 1164c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley/* AES_ecb_encrypt encrypts (or decrypts, if |enc| == |AES_DECRYPT|) a single, 1174c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley * 16 byte block from |in| to |out|. */ 118eb7d2ed1fe8a33b3e3871502ba7e12efaf94360cAdam LangleyOPENSSL_EXPORT void AES_ecb_encrypt(const uint8_t *in, uint8_t *out, 119eb7d2ed1fe8a33b3e3871502ba7e12efaf94360cAdam Langley const AES_KEY *key, const int enc); 1204c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley 1214c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley/* AES_cbc_encrypt encrypts (or decrypts, if |enc| == |AES_DECRYPT|) |len| 1224c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley * bytes from |in| to |out|. The length must be a multiple of the block size. */ 123eb7d2ed1fe8a33b3e3871502ba7e12efaf94360cAdam LangleyOPENSSL_EXPORT void AES_cbc_encrypt(const uint8_t *in, uint8_t *out, size_t len, 124eb7d2ed1fe8a33b3e3871502ba7e12efaf94360cAdam Langley const AES_KEY *key, uint8_t *ivec, 125eb7d2ed1fe8a33b3e3871502ba7e12efaf94360cAdam Langley const int enc); 1264c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley 1274c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley/* AES_ofb128_encrypt encrypts (or decrypts, it's the same in CTR mode) |len| 1284c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley * bytes from |in| to |out|. The |num| parameter must be set to zero on the 1294c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley * first call. */ 130eb7d2ed1fe8a33b3e3871502ba7e12efaf94360cAdam LangleyOPENSSL_EXPORT void AES_ofb128_encrypt(const uint8_t *in, uint8_t *out, 131eb7d2ed1fe8a33b3e3871502ba7e12efaf94360cAdam Langley size_t len, const AES_KEY *key, 132eb7d2ed1fe8a33b3e3871502ba7e12efaf94360cAdam Langley uint8_t *ivec, int *num); 1334c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley 1344c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley/* AES_cfb128_encrypt encrypts (or decrypts, if |enc| == |AES_DECRYPT|) |len| 1354c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley * bytes from |in| to |out|. The |num| parameter must be set to zero on the 1364c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley * first call. */ 137eb7d2ed1fe8a33b3e3871502ba7e12efaf94360cAdam LangleyOPENSSL_EXPORT void AES_cfb128_encrypt(const uint8_t *in, uint8_t *out, 138eb7d2ed1fe8a33b3e3871502ba7e12efaf94360cAdam Langley size_t len, const AES_KEY *key, 139eb7d2ed1fe8a33b3e3871502ba7e12efaf94360cAdam Langley uint8_t *ivec, int *num, int enc); 1404c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley 1414c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley 1424c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley#if defined(__cplusplus) 1434c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley} /* extern C */ 1444c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley#endif 1454c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley 1464c921e1bbcc1d1cd23848e3b11ab2c9f85ee37eaAdam Langley#endif /* OPENSSL_HEADER_AES_H */ 147