fota lib for mdot
mdot/Lora/Utils/aes.h@3:63d10f2375ea, 2018-09-14 (annotated)
- Committer:
- Jenkins@KEILDM1.dc.multitech.prv
- Date:
- Fri Sep 14 15:39:09 2018 -0500
- Revision:
- 3:63d10f2375ea
fota lib updates
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 1 | /* |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 2 | --------------------------------------------------------------------------- |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 3 | Copyright (c) 1998-2008, Brian Gladman, Worcester, UK. All rights reserved. |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 4 | |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 5 | LICENSE TERMS |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 6 | |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 7 | The redistribution and use of this software (with or without changes) |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 8 | is allowed without the payment of fees or royalties provided that: |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 9 | |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 10 | 1. source code distributions include the above copyright notice, this |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 11 | list of conditions and the following disclaimer; |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 12 | |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 13 | 2. binary distributions include the above copyright notice, this list |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 14 | of conditions and the following disclaimer in their documentation; |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 15 | |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 16 | 3. the name of the copyright holder is not used to endorse products |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 17 | built using this software without specific written permission. |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 18 | |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 19 | DISCLAIMER |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 20 | |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 21 | This software is provided 'as is' with no explicit or implied warranties |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 22 | in respect of its properties, including, but not limited to, correctness |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 23 | and/or fitness for purpose. |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 24 | --------------------------------------------------------------------------- |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 25 | Issue 09/09/2006 |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 26 | |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 27 | This is an AES implementation that uses only 8-bit byte operations on the |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 28 | cipher state. |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 29 | */ |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 30 | |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 31 | #ifndef AES_H |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 32 | #define AES_H |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 33 | |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 34 | #ifdef __cplusplus |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 35 | extern "C" { |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 36 | #endif |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 37 | |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 38 | #if 1 |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 39 | # define AES_ENC_PREKEYED /* AES encryption with a precomputed key schedule */ |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 40 | #endif |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 41 | #if 1 |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 42 | # define AES_DEC_PREKEYED /* AES decryption with a precomputed key schedule */ |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 43 | #endif |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 44 | #if 0 |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 45 | # define AES_ENC_128_OTFK /* AES encryption with 'on the fly' 128 bit keying */ |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 46 | #endif |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 47 | #if 0 |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 48 | # define AES_DEC_128_OTFK /* AES decryption with 'on the fly' 128 bit keying */ |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 49 | #endif |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 50 | #if 0 |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 51 | # define AES_ENC_256_OTFK /* AES encryption with 'on the fly' 256 bit keying */ |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 52 | #endif |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 53 | #if 0 |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 54 | # define AES_DEC_256_OTFK /* AES decryption with 'on the fly' 256 bit keying */ |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 55 | #endif |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 56 | |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 57 | #define N_ROW 4 |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 58 | #define N_COL 4 |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 59 | #define N_BLOCK (N_ROW * N_COL) |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 60 | #define N_MAX_ROUNDS 14 |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 61 | |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 62 | typedef unsigned char uint_8t; |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 63 | |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 64 | typedef uint_8t return_type; |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 65 | |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 66 | /* Warning: The key length for 256 bit keys overflows a byte |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 67 | (see comment below) |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 68 | */ |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 69 | |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 70 | typedef uint_8t length_type; |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 71 | |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 72 | typedef struct |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 73 | { uint_8t ksch[(N_MAX_ROUNDS + 1) * N_BLOCK]; |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 74 | uint_8t rnd; |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 75 | } aes_context; |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 76 | |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 77 | /* The following calls are for a precomputed key schedule |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 78 | |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 79 | NOTE: If the length_type used for the key length is an |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 80 | unsigned 8-bit character, a key length of 256 bits must |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 81 | be entered as a length in bytes (valid inputs are hence |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 82 | 128, 192, 16, 24 and 32). |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 83 | */ |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 84 | |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 85 | #if defined( AES_ENC_PREKEYED ) || defined( AES_DEC_PREKEYED ) |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 86 | |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 87 | return_type aes_set_key( const unsigned char key[], |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 88 | length_type keylen, |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 89 | aes_context ctx[1] ); |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 90 | #endif |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 91 | |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 92 | #if defined( AES_ENC_PREKEYED ) |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 93 | |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 94 | return_type aes_encrypt( const unsigned char in[N_BLOCK], |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 95 | unsigned char out[N_BLOCK], |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 96 | const aes_context ctx[1] ); |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 97 | |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 98 | return_type aes_cbc_encrypt( const unsigned char *in, |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 99 | unsigned char *out, |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 100 | int n_block, |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 101 | unsigned char iv[N_BLOCK], |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 102 | const aes_context ctx[1] ); |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 103 | #endif |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 104 | |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 105 | #if defined( AES_DEC_PREKEYED ) |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 106 | |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 107 | return_type aes_decrypt( const unsigned char in[N_BLOCK], |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 108 | unsigned char out[N_BLOCK], |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 109 | const aes_context ctx[1] ); |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 110 | |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 111 | return_type aes_cbc_decrypt( const unsigned char *in, |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 112 | unsigned char *out, |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 113 | int n_block, |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 114 | unsigned char iv[N_BLOCK], |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 115 | const aes_context ctx[1] ); |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 116 | #endif |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 117 | |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 118 | /* The following calls are for 'on the fly' keying. In this case the |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 119 | encryption and decryption keys are different. |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 120 | |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 121 | The encryption subroutines take a key in an array of bytes in |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 122 | key[L] where L is 16, 24 or 32 bytes for key lengths of 128, |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 123 | 192, and 256 bits respectively. They then encrypts the input |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 124 | data, in[] with this key and put the reult in the output array |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 125 | out[]. In addition, the second key array, o_key[L], is used |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 126 | to output the key that is needed by the decryption subroutine |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 127 | to reverse the encryption operation. The two key arrays can |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 128 | be the same array but in this case the original key will be |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 129 | overwritten. |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 130 | |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 131 | In the same way, the decryption subroutines output keys that |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 132 | can be used to reverse their effect when used for encryption. |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 133 | |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 134 | Only 128 and 256 bit keys are supported in these 'on the fly' |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 135 | modes. |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 136 | */ |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 137 | |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 138 | #if defined( AES_ENC_128_OTFK ) |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 139 | void aes_encrypt_128( const unsigned char in[N_BLOCK], |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 140 | unsigned char out[N_BLOCK], |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 141 | const unsigned char key[N_BLOCK], |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 142 | uint_8t o_key[N_BLOCK] ); |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 143 | #endif |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 144 | |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 145 | #if defined( AES_DEC_128_OTFK ) |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 146 | void aes_decrypt_128( const unsigned char in[N_BLOCK], |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 147 | unsigned char out[N_BLOCK], |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 148 | const unsigned char key[N_BLOCK], |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 149 | unsigned char o_key[N_BLOCK] ); |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 150 | #endif |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 151 | |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 152 | #if defined( AES_ENC_256_OTFK ) |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 153 | void aes_encrypt_256( const unsigned char in[N_BLOCK], |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 154 | unsigned char out[N_BLOCK], |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 155 | const unsigned char key[2 * N_BLOCK], |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 156 | unsigned char o_key[2 * N_BLOCK] ); |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 157 | #endif |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 158 | |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 159 | #if defined( AES_DEC_256_OTFK ) |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 160 | void aes_decrypt_256( const unsigned char in[N_BLOCK], |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 161 | unsigned char out[N_BLOCK], |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 162 | const unsigned char key[2 * N_BLOCK], |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 163 | unsigned char o_key[2 * N_BLOCK] ); |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 164 | #endif |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 165 | |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 166 | #ifdef __cplusplus |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 167 | } |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 168 | #endif |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 169 | |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 170 | #endif |
Jenkins@KEILDM1.dc.multitech.prv | 3:63d10f2375ea | 171 |