mirror of
				https://github.com/0xFEEDC0DE64/arduino-esp32.git
				synced 2025-10-30 21:51:40 +01:00 
			
		
		
		
	
		
			
	
	
		
			163 lines
		
	
	
		
			5.5 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
		
		
			
		
	
	
			163 lines
		
	
	
		
			5.5 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
|   | /*
 | ||
|  |  --------------------------------------------------------------------------- | ||
|  |  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. | ||
|  |  */ | ||
|  | 
 | ||
|  | #ifndef AES_H
 | ||
|  | #define AES_H
 | ||
|  | 
 | ||
|  | #if 1
 | ||
|  | #  define AES_ENC_PREKEYED  /* AES encryption with a precomputed key schedule  */
 | ||
|  | #endif
 | ||
|  | #if 1
 | ||
|  | #  define AES_DEC_PREKEYED  /* AES decryption with a precomputed key schedule  */
 | ||
|  | #endif
 | ||
|  | #if 1
 | ||
|  | #  define AES_ENC_128_OTFK  /* AES encryption with 'on the fly' 128 bit keying */
 | ||
|  | #endif
 | ||
|  | #if 1
 | ||
|  | #  define AES_DEC_128_OTFK  /* AES decryption with 'on the fly' 128 bit keying */
 | ||
|  | #endif
 | ||
|  | #if 1
 | ||
|  | #  define AES_ENC_256_OTFK  /* AES encryption with 'on the fly' 256 bit keying */
 | ||
|  | #endif
 | ||
|  | #if 1
 | ||
|  | #  define AES_DEC_256_OTFK  /* AES decryption with 'on the fly' 256 bit keying */
 | ||
|  | #endif
 | ||
|  | 
 | ||
|  | #define N_ROW                   4
 | ||
|  | #define N_COL                   4
 | ||
|  | #define N_BLOCK   (N_ROW * N_COL)
 | ||
|  | #define N_MAX_ROUNDS           14
 | ||
|  | 
 | ||
|  | typedef unsigned char uint_8t; | ||
|  | 
 | ||
|  | typedef uint_8t return_type; | ||
|  | 
 | ||
|  | /*  Warning: The key length for 256 bit keys overflows a byte
 | ||
|  |     (see comment below) | ||
|  | */ | ||
|  | 
 | ||
|  | typedef uint_8t length_type; | ||
|  | 
 | ||
|  | typedef struct { | ||
|  |     uint_8t ksch[(N_MAX_ROUNDS + 1) * N_BLOCK]; | ||
|  |     uint_8t rnd; | ||
|  | } aes_context; | ||
|  | 
 | ||
|  | /*  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). | ||
|  | */ | ||
|  | 
 | ||
|  | #if defined( AES_ENC_PREKEYED ) || defined( AES_DEC_PREKEYED )
 | ||
|  | 
 | ||
|  | return_type aes_set_key( const unsigned char key[], | ||
|  |                          length_type keylen, | ||
|  |                          aes_context ctx[1] ); | ||
|  | #endif
 | ||
|  | 
 | ||
|  | #if defined( AES_ENC_PREKEYED )
 | ||
|  | 
 | ||
|  | return_type bluedroid_aes_encrypt( const unsigned char in[N_BLOCK], | ||
|  |                                    unsigned char out[N_BLOCK], | ||
|  |                                    const aes_context ctx[1] ); | ||
|  | 
 | ||
|  | return_type aes_cbc_encrypt( const unsigned char *in, | ||
|  |                              unsigned char *out, | ||
|  |                              int n_block, | ||
|  |                              unsigned char iv[N_BLOCK], | ||
|  |                              const aes_context ctx[1] ); | ||
|  | #endif
 | ||
|  | 
 | ||
|  | #if defined( AES_DEC_PREKEYED )
 | ||
|  | 
 | ||
|  | return_type bluedroid_aes_decrypt( const unsigned char in[N_BLOCK], | ||
|  |                                    unsigned char out[N_BLOCK], | ||
|  |                                    const aes_context ctx[1] ); | ||
|  | 
 | ||
|  | return_type aes_cbc_decrypt( const unsigned char *in, | ||
|  |                              unsigned char *out, | ||
|  |                              int n_block, | ||
|  |                              unsigned char iv[N_BLOCK], | ||
|  |                              const aes_context ctx[1] ); | ||
|  | #endif
 | ||
|  | 
 | ||
|  | /*  The following calls are for 'on the fly' keying.  In this case the
 | ||
|  |     encryption and decryption keys are different. | ||
|  | 
 | ||
|  |     The encryption subroutines take a key in an array of bytes in | ||
|  |     key[L] where L is 16, 24 or 32 bytes for key lengths of 128, | ||
|  |     192, and 256 bits respectively.  They then encrypts the input | ||
|  |     data, in[] with this key and put the reult in the output array | ||
|  |     out[].  In addition, the second key array, o_key[L], is used | ||
|  |     to output the key that is needed by the decryption subroutine | ||
|  |     to reverse the encryption operation.  The two key arrays can | ||
|  |     be the same array but in this case the original key will be | ||
|  |     overwritten. | ||
|  | 
 | ||
|  |     In the same way, the decryption subroutines output keys that | ||
|  |     can be used to reverse their effect when used for encryption. | ||
|  | 
 | ||
|  |     Only 128 and 256 bit keys are supported in these 'on the fly' | ||
|  |     modes. | ||
|  | */ | ||
|  | 
 | ||
|  | #if defined( AES_ENC_128_OTFK )
 | ||
|  | void bluedroid_aes_encrypt_128( const unsigned char in[N_BLOCK], | ||
|  |                                 unsigned char out[N_BLOCK], | ||
|  |                                 const unsigned char key[N_BLOCK], | ||
|  |                                 uint_8t o_key[N_BLOCK] ); | ||
|  | #endif
 | ||
|  | 
 | ||
|  | #if defined( AES_DEC_128_OTFK )
 | ||
|  | void bluedroid_aes_decrypt_128( const unsigned char in[N_BLOCK], | ||
|  |                                 unsigned char out[N_BLOCK], | ||
|  |                                 const unsigned char key[N_BLOCK], | ||
|  |                                 unsigned char o_key[N_BLOCK] ); | ||
|  | #endif
 | ||
|  | 
 | ||
|  | #if defined( AES_ENC_256_OTFK )
 | ||
|  | void bluedroid_aes_encrypt_256( const unsigned char in[N_BLOCK], | ||
|  |                                 unsigned char out[N_BLOCK], | ||
|  |                                 const unsigned char key[2 * N_BLOCK], | ||
|  |                                 unsigned char o_key[2 * N_BLOCK] ); | ||
|  | #endif
 | ||
|  | 
 | ||
|  | #if defined( AES_DEC_256_OTFK )
 | ||
|  | void bluedroid_aes_decrypt_256( const unsigned char in[N_BLOCK], | ||
|  |                                 unsigned char out[N_BLOCK], | ||
|  |                                 const unsigned char key[2 * N_BLOCK], | ||
|  |                                 unsigned char o_key[2 * N_BLOCK] ); | ||
|  | #endif
 | ||
|  | 
 | ||
|  | #endif
 |