| OLD | NEW |
| (Empty) |
| 1 // Copyright 2007-2009 Google Inc. | |
| 2 // | |
| 3 // Licensed under the Apache License, Version 2.0 (the "License"); | |
| 4 // you may not use this file except in compliance with the License. | |
| 5 // You may obtain a copy of the License at | |
| 6 // | |
| 7 // http://www.apache.org/licenses/LICENSE-2.0 | |
| 8 // | |
| 9 // Unless required by applicable law or agreed to in writing, software | |
| 10 // distributed under the License is distributed on an "AS IS" BASIS, | |
| 11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |
| 12 // See the License for the specific language governing permissions and | |
| 13 // limitations under the License. | |
| 14 // ======================================================================== | |
| 15 // | |
| 16 // Optimized for code size. Lacking decrypt functionality. | |
| 17 // Currently 1042 bytes of code. | |
| 18 | |
| 19 #include "aes.h" | |
| 20 | |
| 21 #include <stdio.h> | |
| 22 #include <stdlib.h> | |
| 23 #include <memory.h> | |
| 24 #include <inttypes.h> | |
| 25 | |
| 26 static const uint8_t sbox_e[256]= { | |
| 27 99 , 124 , 119 , 123 , 242 , 107 , 111 , 197 | |
| 28 , 48 , 1 , 103 , 43 , 254 , 215 , 171 , 118 | |
| 29 , 202 , 130 , 201 , 125 , 250 , 89 , 71 , 240 | |
| 30 , 173 , 212 , 162 , 175 , 156 , 164 , 114 , 192 | |
| 31 , 183 , 253 , 147 , 38 , 54 , 63 , 247 , 204 | |
| 32 , 52 , 165 , 229 , 241 , 113 , 216 , 49 , 21 | |
| 33 , 4 , 199 , 35 , 195 , 24 , 150 , 5 , 154 | |
| 34 , 7 , 18 , 128 , 226 , 235 , 39 , 178 , 117 | |
| 35 , 9 , 131 , 44 , 26 , 27 , 110 , 90 , 160 | |
| 36 , 82 , 59 , 214 , 179 , 41 , 227 , 47 , 132 | |
| 37 , 83 , 209 , 0 , 237 , 32 , 252 , 177 , 91 | |
| 38 , 106 , 203 , 190 , 57 , 74 , 76 , 88 , 207 | |
| 39 , 208 , 239 , 170 , 251 , 67 , 77 , 51 , 133 | |
| 40 , 69 , 249 , 2 , 127 , 80 , 60 , 159 , 168 | |
| 41 , 81 , 163 , 64 , 143 , 146 , 157 , 56 , 245 | |
| 42 , 188 , 182 , 218 , 33 , 16 , 255 , 243 , 210 | |
| 43 , 205 , 12 , 19 , 236 , 95 , 151 , 68 , 23 | |
| 44 , 196 , 167 , 126 , 61 , 100 , 93 , 25 , 115 | |
| 45 , 96 , 129 , 79 , 220 , 34 , 42 , 144 , 136 | |
| 46 , 70 , 238 , 184 , 20 , 222 , 94 , 11 , 219 | |
| 47 , 224 , 50 , 58 , 10 , 73 , 6 , 36 , 92 | |
| 48 , 194 , 211 , 172 , 98 , 145 , 149 , 228 , 121 | |
| 49 , 231 , 200 , 55 , 109 , 141 , 213 , 78 , 169 | |
| 50 , 108 , 86 , 244 , 234 , 101 , 122 , 174 , 8 | |
| 51 , 186 , 120 , 37 , 46 , 28 , 166 , 180 , 198 | |
| 52 , 232 , 221 , 116 , 31 , 75 , 189 , 139 , 138 | |
| 53 , 112 , 62 , 181 , 102 , 72 , 3 , 246 , 14 | |
| 54 , 97 , 53 , 87 , 185 , 134 , 193 , 29 , 158 | |
| 55 , 225 , 248 , 152 , 17 , 105 , 217 , 142 , 148 | |
| 56 , 155 , 30 , 135 , 233 , 206 , 85 , 40 , 223 | |
| 57 , 140 , 161 , 137 , 13 , 191 , 230 , 66 , 104 | |
| 58 , 65 , 153 , 45 , 15 , 176 , 84 , 187 , 22 | |
| 59 }; | |
| 60 | |
| 61 static uint8_t xtime(int in) { | |
| 62 in <<= 1; | |
| 63 if( in&0x100 ) in ^= 0x11b; | |
| 64 return (uint8_t)in; | |
| 65 } | |
| 66 | |
| 67 static void expand_key(const uint8_t* key, uint32_t* expanded_key) { | |
| 68 int nrounds; | |
| 69 union { | |
| 70 uint8_t b[16]; | |
| 71 uint32_t w[4]; | |
| 72 } W; | |
| 73 uint8_t xor = 1; | |
| 74 | |
| 75 memcpy( &W, key, 16 ); | |
| 76 memcpy( expanded_key, &W, 16 ); | |
| 77 | |
| 78 for( nrounds = 0; nrounds < 10; ++nrounds ) { | |
| 79 | |
| 80 // update key schedule | |
| 81 W.b[0] ^= sbox_e[W.b[12+1]] ^ xor; | |
| 82 W.b[1] ^= sbox_e[W.b[12+2]]; | |
| 83 W.b[2] ^= sbox_e[W.b[12+3]]; | |
| 84 W.b[3] ^= sbox_e[W.b[12+0]]; | |
| 85 W.w[1] ^= W.w[0]; | |
| 86 W.w[2] ^= W.w[1]; | |
| 87 W.w[3] ^= W.w[2]; | |
| 88 | |
| 89 xor = xtime( xor ); | |
| 90 | |
| 91 expanded_key += 4; | |
| 92 memcpy( expanded_key, &W, 16 ); | |
| 93 } | |
| 94 } | |
| 95 | |
| 96 void AES_encrypt_block(const uint8_t* key, const uint8_t* in, uint8_t* out) { | |
| 97 int j, nrounds; | |
| 98 union { | |
| 99 uint8_t b[16]; | |
| 100 uint32_t w[4]; | |
| 101 } rd_state; | |
| 102 uint32_t expanded_key[11 * 4]; | |
| 103 uint32_t* expkey = &expanded_key[0]; | |
| 104 | |
| 105 expand_key( key, expanded_key ); | |
| 106 | |
| 107 memcpy( &rd_state, in, 16 ); | |
| 108 | |
| 109 // xor with initial key | |
| 110 rd_state.w[0] ^= *expkey++; | |
| 111 rd_state.w[1] ^= *expkey++; | |
| 112 rd_state.w[2] ^= *expkey++; | |
| 113 rd_state.w[3] ^= *expkey++; | |
| 114 | |
| 115 nrounds = 10; | |
| 116 | |
| 117 do { | |
| 118 uint8_t tmp; | |
| 119 | |
| 120 // bytesub && shiftrow | |
| 121 | |
| 122 // 1st | |
| 123 rd_state.b[0] = sbox_e[rd_state.b[0]]; | |
| 124 rd_state.b[4] = sbox_e[rd_state.b[4]]; | |
| 125 rd_state.b[8] = sbox_e[rd_state.b[8]]; | |
| 126 rd_state.b[12] = sbox_e[rd_state.b[12]]; | |
| 127 | |
| 128 // 2nd | |
| 129 tmp = rd_state.b[1]; | |
| 130 rd_state.b[1] = sbox_e[rd_state.b[5]]; | |
| 131 rd_state.b[5] = sbox_e[rd_state.b[9]]; | |
| 132 rd_state.b[9] = sbox_e[rd_state.b[13]]; | |
| 133 rd_state.b[13] = sbox_e[tmp]; | |
| 134 | |
| 135 // 3th | |
| 136 tmp = rd_state.b[2]; | |
| 137 rd_state.b[2] = sbox_e[rd_state.b[10]]; | |
| 138 rd_state.b[10] = sbox_e[tmp]; | |
| 139 tmp = rd_state.b[6]; | |
| 140 rd_state.b[6] = sbox_e[rd_state.b[14]]; | |
| 141 rd_state.b[14] = sbox_e[tmp]; | |
| 142 | |
| 143 // 4th | |
| 144 tmp = rd_state.b[3]; | |
| 145 rd_state.b[3] = sbox_e[rd_state.b[15]]; | |
| 146 rd_state.b[15] = sbox_e[rd_state.b[11]]; | |
| 147 rd_state.b[11] = sbox_e[rd_state.b[7]]; | |
| 148 rd_state.b[7] = sbox_e[tmp]; | |
| 149 | |
| 150 // mixcolumn except for last round | |
| 151 if( --nrounds ) { | |
| 152 for( j = 0; j < 16; j += 4 ) { | |
| 153 uint8_t tmp = | |
| 154 rd_state.b[j+0] ^ | |
| 155 rd_state.b[j+1] ^ | |
| 156 rd_state.b[j+2] ^ | |
| 157 rd_state.b[j+3]; | |
| 158 | |
| 159 rd_state.b[j+0] ^= xtime( rd_state.b[j+0] ^ rd_state.b[j+1] ) ^ tmp; | |
| 160 rd_state.b[j+1] ^= xtime( rd_state.b[j+1] ^ rd_state.b[j+2] ) ^ tmp; | |
| 161 rd_state.b[j+2] ^= xtime( rd_state.b[j+2] ^ rd_state.b[j+3] ) ^ tmp; | |
| 162 rd_state.b[j+3] = | |
| 163 rd_state.b[j+0] ^ | |
| 164 rd_state.b[j+1] ^ | |
| 165 rd_state.b[j+2] ^ | |
| 166 tmp; | |
| 167 } | |
| 168 } | |
| 169 | |
| 170 rd_state.w[0] ^= *expkey++; | |
| 171 rd_state.w[1] ^= *expkey++; | |
| 172 rd_state.w[2] ^= *expkey++; | |
| 173 rd_state.w[3] ^= *expkey++; | |
| 174 } while( nrounds ); | |
| 175 | |
| 176 memcpy( out, &rd_state, 16 ); | |
| 177 } | |
| OLD | NEW |