Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Fork of cc3000_hostdriver_mbedsocket by
cc3000_security.cpp
00001 /***************************************************************************** 00002 * 00003 * C++ interface/implementation created by Martin Kojtal (0xc0170). Thanks to 00004 * Jim Carver and Frank Vannieuwkerke for their inital cc3000 mbed port and 00005 * provided help. 00006 * 00007 * This version of "host driver" uses CC3000 Host Driver Implementation. Thus 00008 * read the following copyright: 00009 * 00010 * Copyright (C) 2011 Texas Instruments Incorporated - http://www.ti.com/ 00011 * 00012 * Redistribution and use in source and binary forms, with or without 00013 * modification, are permitted provided that the following conditions 00014 * are met: 00015 * 00016 * Redistributions of source code must retain the above copyright 00017 * notice, this list of conditions and the following disclaimer. 00018 * 00019 * Redistributions in binary form must reproduce the above copyright 00020 * notice, this list of conditions and the following disclaimer in the 00021 * documentation and/or other materials provided with the 00022 * distribution. 00023 * 00024 * Neither the name of Texas Instruments Incorporated nor the names of 00025 * its contributors may be used to endorse or promote products derived 00026 * from this software without specific prior written permission. 00027 * 00028 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 00029 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 00030 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 00031 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 00032 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 00033 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 00034 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 00035 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 00036 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 00037 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 00038 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 00039 * 00040 *****************************************************************************/ 00041 #include "cc3000.h" 00042 00043 namespace mbed_cc3000 { 00044 00045 #ifndef CC3000_UNENCRYPTED_SMART_CONFIG 00046 00047 // forward sbox 00048 static const uint8_t sbox[256] = { 00049 //0 1 2 3 4 5 6 7 8 9 A B C D E F 00050 0x63, 0x7c, 0x77, 0x7b, 0xf2, 0x6b, 0x6f, 0xc5, 0x30, 0x01, 0x67, 0x2b, 0xfe, 0xd7, 0xab, 0x76, //0 00051 0xca, 0x82, 0xc9, 0x7d, 0xfa, 0x59, 0x47, 0xf0, 0xad, 0xd4, 0xa2, 0xaf, 0x9c, 0xa4, 0x72, 0xc0, //1 00052 0xb7, 0xfd, 0x93, 0x26, 0x36, 0x3f, 0xf7, 0xcc, 0x34, 0xa5, 0xe5, 0xf1, 0x71, 0xd8, 0x31, 0x15, //2 00053 0x04, 0xc7, 0x23, 0xc3, 0x18, 0x96, 0x05, 0x9a, 0x07, 0x12, 0x80, 0xe2, 0xeb, 0x27, 0xb2, 0x75, //3 00054 0x09, 0x83, 0x2c, 0x1a, 0x1b, 0x6e, 0x5a, 0xa0, 0x52, 0x3b, 0xd6, 0xb3, 0x29, 0xe3, 0x2f, 0x84, //4 00055 0x53, 0xd1, 0x00, 0xed, 0x20, 0xfc, 0xb1, 0x5b, 0x6a, 0xcb, 0xbe, 0x39, 0x4a, 0x4c, 0x58, 0xcf, //5 00056 0xd0, 0xef, 0xaa, 0xfb, 0x43, 0x4d, 0x33, 0x85, 0x45, 0xf9, 0x02, 0x7f, 0x50, 0x3c, 0x9f, 0xa8, //6 00057 0x51, 0xa3, 0x40, 0x8f, 0x92, 0x9d, 0x38, 0xf5, 0xbc, 0xb6, 0xda, 0x21, 0x10, 0xff, 0xf3, 0xd2, //7 00058 0xcd, 0x0c, 0x13, 0xec, 0x5f, 0x97, 0x44, 0x17, 0xc4, 0xa7, 0x7e, 0x3d, 0x64, 0x5d, 0x19, 0x73, //8 00059 0x60, 0x81, 0x4f, 0xdc, 0x22, 0x2a, 0x90, 0x88, 0x46, 0xee, 0xb8, 0x14, 0xde, 0x5e, 0x0b, 0xdb, //9 00060 0xe0, 0x32, 0x3a, 0x0a, 0x49, 0x06, 0x24, 0x5c, 0xc2, 0xd3, 0xac, 0x62, 0x91, 0x95, 0xe4, 0x79, //A 00061 0xe7, 0xc8, 0x37, 0x6d, 0x8d, 0xd5, 0x4e, 0xa9, 0x6c, 0x56, 0xf4, 0xea, 0x65, 0x7a, 0xae, 0x08, //B 00062 0xba, 0x78, 0x25, 0x2e, 0x1c, 0xa6, 0xb4, 0xc6, 0xe8, 0xdd, 0x74, 0x1f, 0x4b, 0xbd, 0x8b, 0x8a, //C 00063 0x70, 0x3e, 0xb5, 0x66, 0x48, 0x03, 0xf6, 0x0e, 0x61, 0x35, 0x57, 0xb9, 0x86, 0xc1, 0x1d, 0x9e, //D 00064 0xe1, 0xf8, 0x98, 0x11, 0x69, 0xd9, 0x8e, 0x94, 0x9b, 0x1e, 0x87, 0xe9, 0xce, 0x55, 0x28, 0xdf, //E 00065 0x8c, 0xa1, 0x89, 0x0d, 0xbf, 0xe6, 0x42, 0x68, 0x41, 0x99, 0x2d, 0x0f, 0xb0, 0x54, 0xbb, 0x16 }; //F 00066 // inverse sbox 00067 static const uint8_t rsbox[256] = 00068 { 0x52, 0x09, 0x6a, 0xd5, 0x30, 0x36, 0xa5, 0x38, 0xbf, 0x40, 0xa3, 0x9e, 0x81, 0xf3, 0xd7, 0xfb 00069 , 0x7c, 0xe3, 0x39, 0x82, 0x9b, 0x2f, 0xff, 0x87, 0x34, 0x8e, 0x43, 0x44, 0xc4, 0xde, 0xe9, 0xcb 00070 , 0x54, 0x7b, 0x94, 0x32, 0xa6, 0xc2, 0x23, 0x3d, 0xee, 0x4c, 0x95, 0x0b, 0x42, 0xfa, 0xc3, 0x4e 00071 , 0x08, 0x2e, 0xa1, 0x66, 0x28, 0xd9, 0x24, 0xb2, 0x76, 0x5b, 0xa2, 0x49, 0x6d, 0x8b, 0xd1, 0x25 00072 , 0x72, 0xf8, 0xf6, 0x64, 0x86, 0x68, 0x98, 0x16, 0xd4, 0xa4, 0x5c, 0xcc, 0x5d, 0x65, 0xb6, 0x92 00073 , 0x6c, 0x70, 0x48, 0x50, 0xfd, 0xed, 0xb9, 0xda, 0x5e, 0x15, 0x46, 0x57, 0xa7, 0x8d, 0x9d, 0x84 00074 , 0x90, 0xd8, 0xab, 0x00, 0x8c, 0xbc, 0xd3, 0x0a, 0xf7, 0xe4, 0x58, 0x05, 0xb8, 0xb3, 0x45, 0x06 00075 , 0xd0, 0x2c, 0x1e, 0x8f, 0xca, 0x3f, 0x0f, 0x02, 0xc1, 0xaf, 0xbd, 0x03, 0x01, 0x13, 0x8a, 0x6b 00076 , 0x3a, 0x91, 0x11, 0x41, 0x4f, 0x67, 0xdc, 0xea, 0x97, 0xf2, 0xcf, 0xce, 0xf0, 0xb4, 0xe6, 0x73 00077 , 0x96, 0xac, 0x74, 0x22, 0xe7, 0xad, 0x35, 0x85, 0xe2, 0xf9, 0x37, 0xe8, 0x1c, 0x75, 0xdf, 0x6e 00078 , 0x47, 0xf1, 0x1a, 0x71, 0x1d, 0x29, 0xc5, 0x89, 0x6f, 0xb7, 0x62, 0x0e, 0xaa, 0x18, 0xbe, 0x1b 00079 , 0xfc, 0x56, 0x3e, 0x4b, 0xc6, 0xd2, 0x79, 0x20, 0x9a, 0xdb, 0xc0, 0xfe, 0x78, 0xcd, 0x5a, 0xf4 00080 , 0x1f, 0xdd, 0xa8, 0x33, 0x88, 0x07, 0xc7, 0x31, 0xb1, 0x12, 0x10, 0x59, 0x27, 0x80, 0xec, 0x5f 00081 , 0x60, 0x51, 0x7f, 0xa9, 0x19, 0xb5, 0x4a, 0x0d, 0x2d, 0xe5, 0x7a, 0x9f, 0x93, 0xc9, 0x9c, 0xef 00082 , 0xa0, 0xe0, 0x3b, 0x4d, 0xae, 0x2a, 0xf5, 0xb0, 0xc8, 0xeb, 0xbb, 0x3c, 0x83, 0x53, 0x99, 0x61 00083 , 0x17, 0x2b, 0x04, 0x7e, 0xba, 0x77, 0xd6, 0x26, 0xe1, 0x69, 0x14, 0x63, 0x55, 0x21, 0x0c, 0x7d }; 00084 // round constant 00085 static const uint8_t Rcon[11] = {0x8d, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1b, 0x36}; 00086 00087 void cc3000_security::expandKey(uint8_t *expanded_key, uint8_t *key) { 00088 uint16_t ii, buf1; 00089 for (ii=0;ii<16;ii++) 00090 expanded_key[ii] = key[ii]; 00091 for (ii=1;ii<11;ii++) 00092 { 00093 buf1 = expanded_key[ii*16 - 4]; 00094 expanded_key[ii*16 + 0] = sbox[expanded_key[ii*16 - 3]]^expanded_key[(ii-1)*16 + 0]^Rcon[ii]; 00095 expanded_key[ii*16 + 1] = sbox[expanded_key[ii*16 - 2]]^expanded_key[(ii-1)*16 + 1]; 00096 expanded_key[ii*16 + 2] = sbox[expanded_key[ii*16 - 1]]^expanded_key[(ii-1)*16 + 2]; 00097 expanded_key[ii*16 + 3] = sbox[buf1 ]^expanded_key[(ii-1)*16 + 3]; 00098 expanded_key[ii*16 + 4] = expanded_key[(ii-1)*16 + 4]^expanded_key[ii*16 + 0]; 00099 expanded_key[ii*16 + 5] = expanded_key[(ii-1)*16 + 5]^expanded_key[ii*16 + 1]; 00100 expanded_key[ii*16 + 6] = expanded_key[(ii-1)*16 + 6]^expanded_key[ii*16 + 2]; 00101 expanded_key[ii*16 + 7] = expanded_key[(ii-1)*16 + 7]^expanded_key[ii*16 + 3]; 00102 expanded_key[ii*16 + 8] = expanded_key[(ii-1)*16 + 8]^expanded_key[ii*16 + 4]; 00103 expanded_key[ii*16 + 9] = expanded_key[(ii-1)*16 + 9]^expanded_key[ii*16 + 5]; 00104 expanded_key[ii*16 +10] = expanded_key[(ii-1)*16 +10]^expanded_key[ii*16 + 6]; 00105 expanded_key[ii*16 +11] = expanded_key[(ii-1)*16 +11]^expanded_key[ii*16 + 7]; 00106 expanded_key[ii*16 +12] = expanded_key[(ii-1)*16 +12]^expanded_key[ii*16 + 8]; 00107 expanded_key[ii*16 +13] = expanded_key[(ii-1)*16 +13]^expanded_key[ii*16 + 9]; 00108 expanded_key[ii*16 +14] = expanded_key[(ii-1)*16 +14]^expanded_key[ii*16 +10]; 00109 expanded_key[ii*16 +15] = expanded_key[(ii-1)*16 +15]^expanded_key[ii*16 +11]; 00110 } 00111 } 00112 00113 uint8_t cc3000_security::galois_mul2(uint8_t value) { 00114 if (value >> 7) { 00115 value = value << 1; 00116 return (value ^ 0x1b); 00117 } else { 00118 return (value << 1); 00119 } 00120 } 00121 00122 void cc3000_security::aes_encr(uint8_t *state, uint8_t *expanded_key) { 00123 uint8_t buf1, buf2, buf3, round; 00124 00125 for (round = 0; round < 9; round ++) 00126 { 00127 // addroundkey, sbox and shiftrows 00128 // row 0 00129 state[ 0] = sbox[(state[ 0] ^ expanded_key[(round*16) ])]; 00130 state[ 4] = sbox[(state[ 4] ^ expanded_key[(round*16) + 4])]; 00131 state[ 8] = sbox[(state[ 8] ^ expanded_key[(round*16) + 8])]; 00132 state[12] = sbox[(state[12] ^ expanded_key[(round*16) + 12])]; 00133 // row 1 00134 buf1 = state[1] ^ expanded_key[(round*16) + 1]; 00135 state[ 1] = sbox[(state[ 5] ^ expanded_key[(round*16) + 5])]; 00136 state[ 5] = sbox[(state[ 9] ^ expanded_key[(round*16) + 9])]; 00137 state[ 9] = sbox[(state[13] ^ expanded_key[(round*16) + 13])]; 00138 state[13] = sbox[buf1]; 00139 // row 2 00140 buf1 = state[2] ^ expanded_key[(round*16) + 2]; 00141 buf2 = state[6] ^ expanded_key[(round*16) + 6]; 00142 state[ 2] = sbox[(state[10] ^ expanded_key[(round*16) + 10])]; 00143 state[ 6] = sbox[(state[14] ^ expanded_key[(round*16) + 14])]; 00144 state[10] = sbox[buf1]; 00145 state[14] = sbox[buf2]; 00146 // row 3 00147 buf1 = state[15] ^ expanded_key[(round*16) + 15]; 00148 state[15] = sbox[(state[11] ^ expanded_key[(round*16) + 11])]; 00149 state[11] = sbox[(state[ 7] ^ expanded_key[(round*16) + 7])]; 00150 state[ 7] = sbox[(state[ 3] ^ expanded_key[(round*16) + 3])]; 00151 state[ 3] = sbox[buf1]; 00152 00153 // mixcolums ////////// 00154 // col1 00155 buf1 = state[0] ^ state[1] ^ state[2] ^ state[3]; 00156 buf2 = state[0]; 00157 buf3 = state[0]^state[1]; buf3=galois_mul2(buf3); state[0] = state[0] ^ buf3 ^ buf1; 00158 buf3 = state[1]^state[2]; buf3=galois_mul2(buf3); state[1] = state[1] ^ buf3 ^ buf1; 00159 buf3 = state[2]^state[3]; buf3=galois_mul2(buf3); state[2] = state[2] ^ buf3 ^ buf1; 00160 buf3 = state[3]^buf2; buf3=galois_mul2(buf3); state[3] = state[3] ^ buf3 ^ buf1; 00161 // col2 00162 buf1 = state[4] ^ state[5] ^ state[6] ^ state[7]; 00163 buf2 = state[4]; 00164 buf3 = state[4]^state[5]; buf3=galois_mul2(buf3); state[4] = state[4] ^ buf3 ^ buf1; 00165 buf3 = state[5]^state[6]; buf3=galois_mul2(buf3); state[5] = state[5] ^ buf3 ^ buf1; 00166 buf3 = state[6]^state[7]; buf3=galois_mul2(buf3); state[6] = state[6] ^ buf3 ^ buf1; 00167 buf3 = state[7]^buf2; buf3=galois_mul2(buf3); state[7] = state[7] ^ buf3 ^ buf1; 00168 // col3 00169 buf1 = state[8] ^ state[9] ^ state[10] ^ state[11]; 00170 buf2 = state[8]; 00171 buf3 = state[8]^state[9]; buf3=galois_mul2(buf3); state[8] = state[8] ^ buf3 ^ buf1; 00172 buf3 = state[9]^state[10]; buf3=galois_mul2(buf3); state[9] = state[9] ^ buf3 ^ buf1; 00173 buf3 = state[10]^state[11]; buf3=galois_mul2(buf3); state[10] = state[10] ^ buf3 ^ buf1; 00174 buf3 = state[11]^buf2; buf3=galois_mul2(buf3); state[11] = state[11] ^ buf3 ^ buf1; 00175 // col4 00176 buf1 = state[12] ^ state[13] ^ state[14] ^ state[15]; 00177 buf2 = state[12]; 00178 buf3 = state[12]^state[13]; buf3=galois_mul2(buf3); state[12] = state[12] ^ buf3 ^ buf1; 00179 buf3 = state[13]^state[14]; buf3=galois_mul2(buf3); state[13] = state[13] ^ buf3 ^ buf1; 00180 buf3 = state[14]^state[15]; buf3=galois_mul2(buf3); state[14] = state[14] ^ buf3 ^ buf1; 00181 buf3 = state[15]^buf2; buf3=galois_mul2(buf3); state[15] = state[15] ^ buf3 ^ buf1; 00182 00183 } 00184 // 10th round without mixcols 00185 state[ 0] = sbox[(state[ 0] ^ expanded_key[(round*16) ])]; 00186 state[ 4] = sbox[(state[ 4] ^ expanded_key[(round*16) + 4])]; 00187 state[ 8] = sbox[(state[ 8] ^ expanded_key[(round*16) + 8])]; 00188 state[12] = sbox[(state[12] ^ expanded_key[(round*16) + 12])]; 00189 // row 1 00190 buf1 = state[1] ^ expanded_key[(round*16) + 1]; 00191 state[ 1] = sbox[(state[ 5] ^ expanded_key[(round*16) + 5])]; 00192 state[ 5] = sbox[(state[ 9] ^ expanded_key[(round*16) + 9])]; 00193 state[ 9] = sbox[(state[13] ^ expanded_key[(round*16) + 13])]; 00194 state[13] = sbox[buf1]; 00195 // row 2 00196 buf1 = state[2] ^ expanded_key[(round*16) + 2]; 00197 buf2 = state[6] ^ expanded_key[(round*16) + 6]; 00198 state[ 2] = sbox[(state[10] ^ expanded_key[(round*16) + 10])]; 00199 state[ 6] = sbox[(state[14] ^ expanded_key[(round*16) + 14])]; 00200 state[10] = sbox[buf1]; 00201 state[14] = sbox[buf2]; 00202 // row 3 00203 buf1 = state[15] ^ expanded_key[(round*16) + 15]; 00204 state[15] = sbox[(state[11] ^ expanded_key[(round*16) + 11])]; 00205 state[11] = sbox[(state[ 7] ^ expanded_key[(round*16) + 7])]; 00206 state[ 7] = sbox[(state[ 3] ^ expanded_key[(round*16) + 3])]; 00207 state[ 3] = sbox[buf1]; 00208 // last addroundkey 00209 state[ 0]^=expanded_key[160]; 00210 state[ 1]^=expanded_key[161]; 00211 state[ 2]^=expanded_key[162]; 00212 state[ 3]^=expanded_key[163]; 00213 state[ 4]^=expanded_key[164]; 00214 state[ 5]^=expanded_key[165]; 00215 state[ 6]^=expanded_key[166]; 00216 state[ 7]^=expanded_key[167]; 00217 state[ 8]^=expanded_key[168]; 00218 state[ 9]^=expanded_key[169]; 00219 state[10]^=expanded_key[170]; 00220 state[11]^=expanded_key[171]; 00221 state[12]^=expanded_key[172]; 00222 state[13]^=expanded_key[173]; 00223 state[14]^=expanded_key[174]; 00224 state[15]^=expanded_key[175]; 00225 } 00226 00227 void cc3000_security::aes_decr(uint8_t *state, uint8_t *expanded_key) { 00228 uint8_t buf1, buf2, buf3; 00229 int8_t round; 00230 round = 9; 00231 00232 // initial addroundkey 00233 state[ 0]^=expanded_key[160]; 00234 state[ 1]^=expanded_key[161]; 00235 state[ 2]^=expanded_key[162]; 00236 state[ 3]^=expanded_key[163]; 00237 state[ 4]^=expanded_key[164]; 00238 state[ 5]^=expanded_key[165]; 00239 state[ 6]^=expanded_key[166]; 00240 state[ 7]^=expanded_key[167]; 00241 state[ 8]^=expanded_key[168]; 00242 state[ 9]^=expanded_key[169]; 00243 state[10]^=expanded_key[170]; 00244 state[11]^=expanded_key[171]; 00245 state[12]^=expanded_key[172]; 00246 state[13]^=expanded_key[173]; 00247 state[14]^=expanded_key[174]; 00248 state[15]^=expanded_key[175]; 00249 00250 // 10th round without mixcols 00251 state[ 0] = rsbox[state[ 0]] ^ expanded_key[(round*16) ]; 00252 state[ 4] = rsbox[state[ 4]] ^ expanded_key[(round*16) + 4]; 00253 state[ 8] = rsbox[state[ 8]] ^ expanded_key[(round*16) + 8]; 00254 state[12] = rsbox[state[12]] ^ expanded_key[(round*16) + 12]; 00255 // row 1 00256 buf1 = rsbox[state[13]] ^ expanded_key[(round*16) + 1]; 00257 state[13] = rsbox[state[ 9]] ^ expanded_key[(round*16) + 13]; 00258 state[ 9] = rsbox[state[ 5]] ^ expanded_key[(round*16) + 9]; 00259 state[ 5] = rsbox[state[ 1]] ^ expanded_key[(round*16) + 5]; 00260 state[ 1] = buf1; 00261 // row 2 00262 buf1 = rsbox[state[ 2]] ^ expanded_key[(round*16) + 10]; 00263 buf2 = rsbox[state[ 6]] ^ expanded_key[(round*16) + 14]; 00264 state[ 2] = rsbox[state[10]] ^ expanded_key[(round*16) + 2]; 00265 state[ 6] = rsbox[state[14]] ^ expanded_key[(round*16) + 6]; 00266 state[10] = buf1; 00267 state[14] = buf2; 00268 // row 3 00269 buf1 = rsbox[state[ 3]] ^ expanded_key[(round*16) + 15]; 00270 state[ 3] = rsbox[state[ 7]] ^ expanded_key[(round*16) + 3]; 00271 state[ 7] = rsbox[state[11]] ^ expanded_key[(round*16) + 7]; 00272 state[11] = rsbox[state[15]] ^ expanded_key[(round*16) + 11]; 00273 state[15] = buf1; 00274 00275 for (round = 8; round >= 0; round--) 00276 { 00277 // barreto 00278 //col1 00279 buf1 = galois_mul2(galois_mul2(state[0]^state[2])); 00280 buf2 = galois_mul2(galois_mul2(state[1]^state[3])); 00281 state[0] ^= buf1; state[1] ^= buf2; state[2] ^= buf1; state[3] ^= buf2; 00282 //col2 00283 buf1 = galois_mul2(galois_mul2(state[4]^state[6])); 00284 buf2 = galois_mul2(galois_mul2(state[5]^state[7])); 00285 state[4] ^= buf1; state[5] ^= buf2; state[6] ^= buf1; state[7] ^= buf2; 00286 //col3 00287 buf1 = galois_mul2(galois_mul2(state[8]^state[10])); 00288 buf2 = galois_mul2(galois_mul2(state[9]^state[11])); 00289 state[8] ^= buf1; state[9] ^= buf2; state[10] ^= buf1; state[11] ^= buf2; 00290 //col4 00291 buf1 = galois_mul2(galois_mul2(state[12]^state[14])); 00292 buf2 = galois_mul2(galois_mul2(state[13]^state[15])); 00293 state[12] ^= buf1; state[13] ^= buf2; state[14] ^= buf1; state[15] ^= buf2; 00294 // mixcolums ////////// 00295 // col1 00296 buf1 = state[0] ^ state[1] ^ state[2] ^ state[3]; 00297 buf2 = state[0]; 00298 buf3 = state[0]^state[1]; buf3=galois_mul2(buf3); state[0] = state[0] ^ buf3 ^ buf1; 00299 buf3 = state[1]^state[2]; buf3=galois_mul2(buf3); state[1] = state[1] ^ buf3 ^ buf1; 00300 buf3 = state[2]^state[3]; buf3=galois_mul2(buf3); state[2] = state[2] ^ buf3 ^ buf1; 00301 buf3 = state[3]^buf2; buf3=galois_mul2(buf3); state[3] = state[3] ^ buf3 ^ buf1; 00302 // col2 00303 buf1 = state[4] ^ state[5] ^ state[6] ^ state[7]; 00304 buf2 = state[4]; 00305 buf3 = state[4]^state[5]; buf3=galois_mul2(buf3); state[4] = state[4] ^ buf3 ^ buf1; 00306 buf3 = state[5]^state[6]; buf3=galois_mul2(buf3); state[5] = state[5] ^ buf3 ^ buf1; 00307 buf3 = state[6]^state[7]; buf3=galois_mul2(buf3); state[6] = state[6] ^ buf3 ^ buf1; 00308 buf3 = state[7]^buf2; buf3=galois_mul2(buf3); state[7] = state[7] ^ buf3 ^ buf1; 00309 // col3 00310 buf1 = state[8] ^ state[9] ^ state[10] ^ state[11]; 00311 buf2 = state[8]; 00312 buf3 = state[8]^state[9]; buf3=galois_mul2(buf3); state[8] = state[8] ^ buf3 ^ buf1; 00313 buf3 = state[9]^state[10]; buf3=galois_mul2(buf3); state[9] = state[9] ^ buf3 ^ buf1; 00314 buf3 = state[10]^state[11]; buf3=galois_mul2(buf3); state[10] = state[10] ^ buf3 ^ buf1; 00315 buf3 = state[11]^buf2; buf3=galois_mul2(buf3); state[11] = state[11] ^ buf3 ^ buf1; 00316 // col4 00317 buf1 = state[12] ^ state[13] ^ state[14] ^ state[15]; 00318 buf2 = state[12]; 00319 buf3 = state[12]^state[13]; buf3=galois_mul2(buf3); state[12] = state[12] ^ buf3 ^ buf1; 00320 buf3 = state[13]^state[14]; buf3=galois_mul2(buf3); state[13] = state[13] ^ buf3 ^ buf1; 00321 buf3 = state[14]^state[15]; buf3=galois_mul2(buf3); state[14] = state[14] ^ buf3 ^ buf1; 00322 buf3 = state[15]^buf2; buf3=galois_mul2(buf3); state[15] = state[15] ^ buf3 ^ buf1; 00323 00324 // addroundkey, rsbox and shiftrows 00325 // row 0 00326 state[ 0] = rsbox[state[ 0]] ^ expanded_key[(round*16) ]; 00327 state[ 4] = rsbox[state[ 4]] ^ expanded_key[(round*16) + 4]; 00328 state[ 8] = rsbox[state[ 8]] ^ expanded_key[(round*16) + 8]; 00329 state[12] = rsbox[state[12]] ^ expanded_key[(round*16) + 12]; 00330 // row 1 00331 buf1 = rsbox[state[13]] ^ expanded_key[(round*16) + 1]; 00332 state[13] = rsbox[state[ 9]] ^ expanded_key[(round*16) + 13]; 00333 state[ 9] = rsbox[state[ 5]] ^ expanded_key[(round*16) + 9]; 00334 state[ 5] = rsbox[state[ 1]] ^ expanded_key[(round*16) + 5]; 00335 state[ 1] = buf1; 00336 // row 2 00337 buf1 = rsbox[state[ 2]] ^ expanded_key[(round*16) + 10]; 00338 buf2 = rsbox[state[ 6]] ^ expanded_key[(round*16) + 14]; 00339 state[ 2] = rsbox[state[10]] ^ expanded_key[(round*16) + 2]; 00340 state[ 6] = rsbox[state[14]] ^ expanded_key[(round*16) + 6]; 00341 state[10] = buf1; 00342 state[14] = buf2; 00343 // row 3 00344 buf1 = rsbox[state[ 3]] ^ expanded_key[(round*16) + 15]; 00345 state[ 3] = rsbox[state[ 7]] ^ expanded_key[(round*16) + 3]; 00346 state[ 7] = rsbox[state[11]] ^ expanded_key[(round*16) + 7]; 00347 state[11] = rsbox[state[15]] ^ expanded_key[(round*16) + 11]; 00348 state[15] = buf1; 00349 } 00350 } 00351 00352 void cc3000_security::aes_encrypt(uint8_t *state, uint8_t *key) { 00353 // expand the key into 176 bytes 00354 expandKey(_expanded_key, key); 00355 aes_encr(state, _expanded_key); 00356 } 00357 00358 void cc3000_security::aes_decrypt(uint8_t *state, uint8_t *key) { 00359 expandKey(_expanded_key, key); // expand the key into 176 bytes 00360 aes_decr(state, _expanded_key); 00361 } 00362 00363 int32_t cc3000_security::aes_read_key(uint8_t *key) { 00364 int32_t returnValue; 00365 00366 returnValue = nvmem_read(NVMEM_AES128_KEY_FILEID, AES128_KEY_SIZE, 0, key); 00367 00368 return returnValue; 00369 } 00370 00371 int32_t cc3000_security::aes_write_key(uint8_t *key) { 00372 int32_t returnValue; 00373 00374 returnValue = nvmem_write(NVMEM_AES128_KEY_FILEID, AES128_KEY_SIZE, 0, key); 00375 00376 return returnValue; 00377 } 00378 #endif 00379 00380 } // mbed_cc3000 namespace 00381
Generated on Fri Jul 15 2022 17:19:25 by
1.7.2
