123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381 |
- #ifndef __AES_H__
- #define __AES_H__
-
- #include "AES_config.h"
- /*
- ---------------------------------------------------------------------------
- Copyright (c) 1998-2008, Brian Gladman, Worcester, UK. All rights reserved.
-
- LICENSE TERMS
-
- The redistribution and use of this software (with or without changes)
- is allowed without the payment of fees or royalties provided that:
-
- 1. source code distributions include the above copyright notice, this
- list of conditions and the following disclaimer;
-
- 2. binary distributions include the above copyright notice, this list
- of conditions and the following disclaimer in their documentation;
-
- 3. the name of the copyright holder is not used to endorse products
- built using this software without specific written permission.
-
- DISCLAIMER
-
- This software is provided 'as is' with no explicit or implied warranties
- in respect of its properties, including, but not limited to, correctness
- and/or fitness for purpose.
- ---------------------------------------------------------------------------
- Issue 09/09/2006
-
- This is an AES implementation that uses only 8-bit byte operations on the
- cipher state.
- */
-
- /* code was modified by george spanos <spaniakos@gmail.com>
- * 16/12/14
- */
- /** AES class */
- class AES
- {
- public:
-
- /* The following calls are for a precomputed key schedule
-
- NOTE: If the length_type used for the key length is an
- unsigned 8-bit character, a key length of 256 bits must
- be entered as a length in bytes (valid inputs are hence
- 128, 192, 16, 24 and 32).
- */
- /** \fn AES()
- * \brief AES constructor
- *
- * This function initialized an instance of AES.
- */
- AES();
-
- /** Set the cipher key for the pre-keyed version.
- * @param key[] pointer to the key string.
- * @param keylen Integer that indicates the length of the key.
- * @note NOTE: If the length_type used for the key length is an unsigned 8-bit character,
- * a key length of 256 bits must be entered as a length in bytes
- * (valid inputs are hence 128, 192, 16, 24 and 32).
- *
- */
- byte set_key (byte key[], int keylen) ;
-
- /** clean up subkeys after use.
- *
- */
- void clean () ; // delete key schedule after use
-
- /** copying and xoring utilities.
- * @param *AESt byte pointer of the AEStination array.
- * @param *src byte pointer of the source array.
- * @param n byte, indicating the sizeof the bytes to be copied.
- * @note this is an alternative for memcpy(void *s1,const void *s2, site_t n),
- * i have not updated the function in the implementation yet, but it is considered a future plan.
- *
- */
- void copy_n_bytes (byte * AESt, byte * src, byte n) ;
-
- /** Encrypt a single block of 16 bytes .
- * @param plain Array of the plaintext.
- * @param cipher Array of the ciphertext.
- * @note The N_BLOCK is defined in AES_config.h as,
- * @code #define N_ROW 4
- * #define N_COL 4
- * #define N_BLOCK (N_ROW * N_COL)
- * @endcode
- * Changed to that will change the Block_size.
- * @return 0 if SUCCESS or -1 if FAILURE
- *
- */
- byte encrypt (byte plain [N_BLOCK], byte cipher [N_BLOCK]) ;
-
- /** CBC encrypt a number of blocks (input and return an IV).
- *
- * @param *plain Pointer, points to the plaintex.
- * @param *cipher Pointer, points to the ciphertext that will be created.
- * @param n_block integer, indicated the number of blocks to be ciphered.
- * @param iv byte Array that holds the IV (initialization vector).
- * @return 0 if SUCCESS or -1 if FAILURE
- *
- */
- byte cbc_encrypt (byte * plain, byte * cipher, int n_block, byte iv [N_BLOCK]) ;
-
- /** CBC encrypt a number of blocks (input and return an IV).
- *
- * @param *plain Pointer, points to the plaintex.
- * @param *cipher Pointer, points to the ciphertext that will be created.
- * @param n_block integer, indicated the number of blocks to be ciphered.
- * @return 0 if SUCCESS or -1 if FAILURE
- *
- */
- byte cbc_encrypt (byte * plain, byte * cipher, int n_block) ;
-
-
- /** Decrypt a single block of 16 bytes
- * @param cipher Array of the ciphertext.
- * @param plain Array of the plaintext.
- * @note The N_BLOCK is defined in AES_config.h as,
- * @code #define N_ROW 4
- * #define N_COL 4
- * #define N_BLOCK (N_ROW * N_COL)
- * @endcode
- * Changed to that will change the Block_size.
- * @return 0 if SUCCESS or -1 if FAILURE
- *
- */
- byte decrypt (byte cipher [N_BLOCK], byte plain [N_BLOCK]) ;
-
- /** CBC decrypt a number of blocks (input and return an IV)
- *
- * @param *cipher Pointer, points to the ciphertext that will be created.
- * @param *plain Pointer, points to the plaintex.
- * @param n_block integer, indicated the number of blocks to be ciphered.
- * @param iv byte Array that holds the IV (initialization vector).
- * @return 0 if SUCCESS or -1 if FAILURE
- *
- */
- byte cbc_decrypt (byte * cipher, byte * plain, int n_block, byte iv [N_BLOCK]) ;
-
- /** CBC decrypt a number of blocks (input and return an IV)
- *
- * @param *cipher Pointer, points to the ciphertext that will be created.
- * @param *plain Pointer, points to the plaintex.
- * @param n_block integer, indicated the number of blocks to be ciphered.
- * @return 0 if SUCCESS or -1 if FAILURE
- *
- */
- byte cbc_decrypt (byte * cipher, byte * plain, int n_block) ;
-
- /** Sets IV (initialization vector) and IVC (IV counter).
- * This function changes the ivc and iv variables needed for AES.
- *
- * @param IVCl int or hex value of iv , ex. 0x0000000000000001
- * @note example:
- * @code unsigned long long int my_iv = 01234567; @endcode
- */
- void set_IV(unsigned long long int IVCl);
-
- /** increase the iv (initialization vector) and IVC (IV counter) by 1
- *
- * This function increased the VI by one step in order to have a different IV each time
- *
- */
- void iv_inc();
-
- /** Getter method for size
- *
- * This function return the size
- * @return an integer, that is the size of the of the padded plaintext,
- * thus, the size of the ciphertext.
- */
- int get_size();
-
- /** Setter method for size
- *
- * This function sets the size of the plaintext+pad
- *
- */
- void set_size(int sizel);
-
- /** Getter method for IV
- *
- * This function return the IV
- * @param out byte pointer that gets the IV.
- * @return none, the IV is writed to the out pointer.
- */
- void get_IV(byte *out);
-
- /** Calculates the size of the plaintext and the padding.
- *
- * Calculates the size of theplaintext with the padding
- * and the size of the padding needed. Moreover it stores them in their class variables.
- *
- * @param p_size the size of the byte array ex sizeof(plaintext)
- */
- void calc_size_n_pad(int p_size);
-
- /** Pads the plaintext
- *
- * This function pads the plaintext and returns an char array with the
- * plaintext and the padding in order for the plaintext to be compatible with
- * 16bit size blocks required by AES
- *
- * @param in the string of the plaintext in a byte array
- * @param out The string of the out array.
- * @return no return, The padded plaintext is stored in the out pointer.
- */
- void padPlaintext(void* in,byte* out);
-
- /** Check the if the padding is correct.
- *
- * This functions checks the padding of the plaintext.
- *
- * @param in the string of the plaintext in a byte array
- * @param size the size of the string
- * @return true if correct / false if not
- */
- bool CheckPad(byte* in,int size);
-
- /** Prints the array given.
- *
- * This function prints the given array and pad,
- * It is mainlly used for debugging purpuses or to output the string.
- *
- * @param output[] the string of the text in a byte array
- * @param p_pad optional, used to print with out the padding characters
- */
- void printArray(byte output[],bool p_pad = true);
-
- /** Prints the array given.
- *
- * This function prints the given array in Hexadecimal.
- *
- * @param output[] the string of the text in a byte array
- * @param sizel the size of the array.
- */
- void printArray(byte output[],int sizel);
-
- /** User friendly implementation of AES-CBC encryption.
- *
- * @param *plain pointer to the plaintext
- * @param size_p size of the plaintext
- * @param *cipher pointer to the ciphertext
- * @param *key pointer to the key that will be used.
- * @param bits bits of the encryption/decrpytion
- * @param ivl the initialization vector IV that will be used for encryption.
- * @note The key will be stored in class variable.
- */
- void do_aes_encrypt(byte *plain,int size_p,byte *cipher,byte *key, int bits, byte ivl [N_BLOCK]);
-
- /** User friendly implementation of AES-CBC encryption.
- *
- * @param *plain pointer to the plaintext
- * @param size_p size of the plaintext
- * @param *cipher pointer to the ciphertext
- * @param *key pointer to the key that will be used.
- * @param bits bits of the encryption/decrpytion
- * @note The key will be stored in class variable.
- */
- void do_aes_encrypt(byte *plain,int size_p,byte *cipher,byte *key, int bits);
-
- /** User friendly implementation of AES-CBC decryption.
- *
- * @param *cipher pointer to the ciphertext
- * @param size_c size of the ciphertext
- * @param *plain pointer to the plaintext
- * @param *key pointer to the key that will be used.
- * @param bits bits of the encryption/decrpytion
- * @param ivl the initialization vector IV that will be used for decryption.
- * @note The key will be stored in class variable.
- */
- void do_aes_decrypt(byte *cipher,int size_c,byte *plain,byte *key, int bits, byte ivl [N_BLOCK]);
-
- /** User friendly implementation of AES-CBC decryption.
- *
- * @param *cipher pointer to the ciphertext
- * @param size_c size of the ciphertext
- * @param *plain pointer to the plaintext
- * @param *key pointer to the key that will be used.
- * @param bits bits of the encryption/decrpytion
- * @note The key will be stored in class variable.
- */
- void do_aes_decrypt(byte *cipher,int size_c,byte *plain,byte *key, int bits);
-
- #if defined(AES_LINUX)
- /**
- * used in linux in order to retrieve the time in milliseconds.
- *
- * @return returns the milliseconds in a double format.
- */
- double millis();
- #endif
- private:
- int round ;/**< holds the number of rounds to be used. */
- byte key_sched [KEY_SCHEDULE_BYTES]
- ;/**< holds the pre-computed key for the encryption/decrpytion. */
- unsigned long long int IVC;/**< holds the initialization vector counter in numerical format. */
- byte iv[16];/**< holds the initialization vector that will be used in the cipher. */
- int pad;/**< holds the size of the padding. */
- int size;/**< hold the size of the plaintext to be ciphered */
- #if defined(AES_LINUX)
- timeval tv;/**< holds the time value on linux */
- byte arr_pad[15];/**< holds the hexadecimal padding values on linux */
- #else
- byte arr_pad[15];// = { 0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0a,0x0b,0x0c,0x0d,0x0e,0x0f };/**< holds the hexadecimal padding values */
- #endif
- } ;
-
-
- #endif
-
- /**
- * @defgroup aeslib AES library for Arduino and Raspberry pi
- * @ingroup internals
- *
- * @section AesGoals design Goals
- *
- * This library is AESigned to be...
- * @li Fast and efficient.
- * @li Able to effectively encrypt and decrypt any size of string.
- * @li Able to encrypt and decrypt using AES
- * @li Able to encrypt and decrypt using AES-CBC
- * @li Easy for the user to use in his programs.
- *
- * @section Acknowledgements Acknowledgements
- * This is an AES library for the Arduino, based on tzikis's AES library, which you can find <a href= "https://github.com/tzikis/arduino">here:</a>.<br />
- * Tzikis library was based on scottmac`s library, which you can find <a href="https://github.com/scottmac/arduino">here:</a><br />
- *
- * @section Installation Installation
- * <h3>Arduino</h3>
- * Create a folder named _AES_ in the _libraries_ folder inside your Arduino sketch folder. If the
- * libraries folder doesn't exist, create it. Then copy everything inside. (re)launch the Arduino IDE.<br />
- * You're done. Time for a mojito
- *
- * <h3>Raspberry pi</h3>
- * <b>install</b><br /><br />
- *
- * sudo make install<br />
- * cd examples_Rpi<br />
- * make<br /><br />
- *
- * <b>What to do after changes to the library</b><br /><br />
- * sudo make clean<br />
- * sudo make install<br />
- * cd examples_Rpi<br />
- * make clean<br />
- * make<br /><br />
- * <b>What to do after changes to a sketch</b><br /><br />
- * cd examples_Rpi<br />
- * make \<sketch\><br /><br />
- * or <br />
- * make clean<br />
- * make<br /><br /><br />
- * <b>How to start a sketch</b><br /><br />
- * cd examples_Rpi<br />
- * sudo ./\<sketch\><br /><br />
- *
- * @section AesNews News
- *
- * If issues are discovered with the documentation, please report them <a href="https://github.com/spaniakos/spaniakos.github.io/issues"> here</a>
- * @section AesUseful Useful References
- *
- * Please refer to:
- *
- * @li <a href="http://spaniakos.github.io/AES/classAES.html"><b>AES</b> Class Documentation</a>
- * @li <a href="https://github.com/spaniakos/AES/archive/master.zip"><b>Download</b></a>
- * @li <a href="https://github.com/spaniakos/AES/"><b>Source Code</b></a>
- * @li <a href="http://spaniakos.github.io/">All spaniakos Documentation Main Page</a>
- *
- * @section AesBoard_Support Board Support
- *
- * Most standard Arduino based boards are supported:
- * - Arduino
- * - Intel Galileo support
- * - Raspberry Pi Support
- *
- * - The library has not been tested to other boards, but it should suppport ATMega 328 based boards,Mega Boards,Arduino Due,ATTiny board
- */
|