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