Martin Kojtal / cc3000_hostdriver_mbedsocket Featured

Dependents:   cc3000_hello_world_demo cc3000_simple_socket_demo cc3000_ntp_demo cc3000_ping_demo ... more

Committer:
SolderSplashLabs
Date:
Sat Oct 12 20:46:19 2013 +0000
Revision:
39:03ac37ab34eb
Parent:
0:615c697c33b0
Child:
45:50ab13d8f2dc
Added mbed ethernet library compatability, get ip, gateway and sub mask functions. Added enabled flag so we know when the module is enabled. Smart config tweaks

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Kojto 0:615c697c33b0 1 /*****************************************************************************
Kojto 0:615c697c33b0 2 *
Kojto 0:615c697c33b0 3 * C++ interface/implementation created by Martin Kojtal (0xc0170). Thanks to
Kojto 0:615c697c33b0 4 * Jim Carver and Frank Vannieuwkerke for their inital cc3000 mbed port and
Kojto 0:615c697c33b0 5 * provided help.
Kojto 0:615c697c33b0 6 *
Kojto 0:615c697c33b0 7 * This version of "host driver" uses CC3000 Host Driver Implementation. Thus
Kojto 0:615c697c33b0 8 * read the following copyright:
Kojto 0:615c697c33b0 9 *
Kojto 0:615c697c33b0 10 * Copyright (C) 2011 Texas Instruments Incorporated - http://www.ti.com/
Kojto 0:615c697c33b0 11 *
Kojto 0:615c697c33b0 12 * Redistribution and use in source and binary forms, with or without
Kojto 0:615c697c33b0 13 * modification, are permitted provided that the following conditions
Kojto 0:615c697c33b0 14 * are met:
Kojto 0:615c697c33b0 15 *
Kojto 0:615c697c33b0 16 * Redistributions of source code must retain the above copyright
Kojto 0:615c697c33b0 17 * notice, this list of conditions and the following disclaimer.
Kojto 0:615c697c33b0 18 *
Kojto 0:615c697c33b0 19 * Redistributions in binary form must reproduce the above copyright
Kojto 0:615c697c33b0 20 * notice, this list of conditions and the following disclaimer in the
Kojto 0:615c697c33b0 21 * documentation and/or other materials provided with the
Kojto 0:615c697c33b0 22 * distribution.
Kojto 0:615c697c33b0 23 *
Kojto 0:615c697c33b0 24 * Neither the name of Texas Instruments Incorporated nor the names of
Kojto 0:615c697c33b0 25 * its contributors may be used to endorse or promote products derived
Kojto 0:615c697c33b0 26 * from this software without specific prior written permission.
Kojto 0:615c697c33b0 27 *
Kojto 0:615c697c33b0 28 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
Kojto 0:615c697c33b0 29 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
Kojto 0:615c697c33b0 30 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
Kojto 0:615c697c33b0 31 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
Kojto 0:615c697c33b0 32 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
Kojto 0:615c697c33b0 33 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
Kojto 0:615c697c33b0 34 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
Kojto 0:615c697c33b0 35 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
Kojto 0:615c697c33b0 36 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
Kojto 0:615c697c33b0 37 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
Kojto 0:615c697c33b0 38 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
Kojto 0:615c697c33b0 39 *
Kojto 0:615c697c33b0 40 *****************************************************************************/
Kojto 0:615c697c33b0 41 #include "cc3000.h"
Kojto 0:615c697c33b0 42
Kojto 0:615c697c33b0 43 namespace mbed_cc3000 {
Kojto 0:615c697c33b0 44
Kojto 0:615c697c33b0 45 #ifndef CC3000_UNENCRYPTED_SMART_CONFIG
Kojto 0:615c697c33b0 46
Kojto 0:615c697c33b0 47 // forward sbox
Kojto 0:615c697c33b0 48 static const uint8_t sbox[256] = {
Kojto 0:615c697c33b0 49 //0 1 2 3 4 5 6 7 8 9 A B C D E F
Kojto 0:615c697c33b0 50 0x63, 0x7c, 0x77, 0x7b, 0xf2, 0x6b, 0x6f, 0xc5, 0x30, 0x01, 0x67, 0x2b, 0xfe, 0xd7, 0xab, 0x76, //0
Kojto 0:615c697c33b0 51 0xca, 0x82, 0xc9, 0x7d, 0xfa, 0x59, 0x47, 0xf0, 0xad, 0xd4, 0xa2, 0xaf, 0x9c, 0xa4, 0x72, 0xc0, //1
Kojto 0:615c697c33b0 52 0xb7, 0xfd, 0x93, 0x26, 0x36, 0x3f, 0xf7, 0xcc, 0x34, 0xa5, 0xe5, 0xf1, 0x71, 0xd8, 0x31, 0x15, //2
Kojto 0:615c697c33b0 53 0x04, 0xc7, 0x23, 0xc3, 0x18, 0x96, 0x05, 0x9a, 0x07, 0x12, 0x80, 0xe2, 0xeb, 0x27, 0xb2, 0x75, //3
Kojto 0:615c697c33b0 54 0x09, 0x83, 0x2c, 0x1a, 0x1b, 0x6e, 0x5a, 0xa0, 0x52, 0x3b, 0xd6, 0xb3, 0x29, 0xe3, 0x2f, 0x84, //4
Kojto 0:615c697c33b0 55 0x53, 0xd1, 0x00, 0xed, 0x20, 0xfc, 0xb1, 0x5b, 0x6a, 0xcb, 0xbe, 0x39, 0x4a, 0x4c, 0x58, 0xcf, //5
Kojto 0:615c697c33b0 56 0xd0, 0xef, 0xaa, 0xfb, 0x43, 0x4d, 0x33, 0x85, 0x45, 0xf9, 0x02, 0x7f, 0x50, 0x3c, 0x9f, 0xa8, //6
Kojto 0:615c697c33b0 57 0x51, 0xa3, 0x40, 0x8f, 0x92, 0x9d, 0x38, 0xf5, 0xbc, 0xb6, 0xda, 0x21, 0x10, 0xff, 0xf3, 0xd2, //7
Kojto 0:615c697c33b0 58 0xcd, 0x0c, 0x13, 0xec, 0x5f, 0x97, 0x44, 0x17, 0xc4, 0xa7, 0x7e, 0x3d, 0x64, 0x5d, 0x19, 0x73, //8
Kojto 0:615c697c33b0 59 0x60, 0x81, 0x4f, 0xdc, 0x22, 0x2a, 0x90, 0x88, 0x46, 0xee, 0xb8, 0x14, 0xde, 0x5e, 0x0b, 0xdb, //9
Kojto 0:615c697c33b0 60 0xe0, 0x32, 0x3a, 0x0a, 0x49, 0x06, 0x24, 0x5c, 0xc2, 0xd3, 0xac, 0x62, 0x91, 0x95, 0xe4, 0x79, //A
Kojto 0:615c697c33b0 61 0xe7, 0xc8, 0x37, 0x6d, 0x8d, 0xd5, 0x4e, 0xa9, 0x6c, 0x56, 0xf4, 0xea, 0x65, 0x7a, 0xae, 0x08, //B
Kojto 0:615c697c33b0 62 0xba, 0x78, 0x25, 0x2e, 0x1c, 0xa6, 0xb4, 0xc6, 0xe8, 0xdd, 0x74, 0x1f, 0x4b, 0xbd, 0x8b, 0x8a, //C
Kojto 0:615c697c33b0 63 0x70, 0x3e, 0xb5, 0x66, 0x48, 0x03, 0xf6, 0x0e, 0x61, 0x35, 0x57, 0xb9, 0x86, 0xc1, 0x1d, 0x9e, //D
Kojto 0:615c697c33b0 64 0xe1, 0xf8, 0x98, 0x11, 0x69, 0xd9, 0x8e, 0x94, 0x9b, 0x1e, 0x87, 0xe9, 0xce, 0x55, 0x28, 0xdf, //E
Kojto 0:615c697c33b0 65 0x8c, 0xa1, 0x89, 0x0d, 0xbf, 0xe6, 0x42, 0x68, 0x41, 0x99, 0x2d, 0x0f, 0xb0, 0x54, 0xbb, 0x16 }; //F
Kojto 0:615c697c33b0 66 // inverse sbox
Kojto 0:615c697c33b0 67 static const uint8_t rsbox[256] =
Kojto 0:615c697c33b0 68 { 0x52, 0x09, 0x6a, 0xd5, 0x30, 0x36, 0xa5, 0x38, 0xbf, 0x40, 0xa3, 0x9e, 0x81, 0xf3, 0xd7, 0xfb
Kojto 0:615c697c33b0 69 , 0x7c, 0xe3, 0x39, 0x82, 0x9b, 0x2f, 0xff, 0x87, 0x34, 0x8e, 0x43, 0x44, 0xc4, 0xde, 0xe9, 0xcb
Kojto 0:615c697c33b0 70 , 0x54, 0x7b, 0x94, 0x32, 0xa6, 0xc2, 0x23, 0x3d, 0xee, 0x4c, 0x95, 0x0b, 0x42, 0xfa, 0xc3, 0x4e
Kojto 0:615c697c33b0 71 , 0x08, 0x2e, 0xa1, 0x66, 0x28, 0xd9, 0x24, 0xb2, 0x76, 0x5b, 0xa2, 0x49, 0x6d, 0x8b, 0xd1, 0x25
Kojto 0:615c697c33b0 72 , 0x72, 0xf8, 0xf6, 0x64, 0x86, 0x68, 0x98, 0x16, 0xd4, 0xa4, 0x5c, 0xcc, 0x5d, 0x65, 0xb6, 0x92
Kojto 0:615c697c33b0 73 , 0x6c, 0x70, 0x48, 0x50, 0xfd, 0xed, 0xb9, 0xda, 0x5e, 0x15, 0x46, 0x57, 0xa7, 0x8d, 0x9d, 0x84
Kojto 0:615c697c33b0 74 , 0x90, 0xd8, 0xab, 0x00, 0x8c, 0xbc, 0xd3, 0x0a, 0xf7, 0xe4, 0x58, 0x05, 0xb8, 0xb3, 0x45, 0x06
Kojto 0:615c697c33b0 75 , 0xd0, 0x2c, 0x1e, 0x8f, 0xca, 0x3f, 0x0f, 0x02, 0xc1, 0xaf, 0xbd, 0x03, 0x01, 0x13, 0x8a, 0x6b
Kojto 0:615c697c33b0 76 , 0x3a, 0x91, 0x11, 0x41, 0x4f, 0x67, 0xdc, 0xea, 0x97, 0xf2, 0xcf, 0xce, 0xf0, 0xb4, 0xe6, 0x73
Kojto 0:615c697c33b0 77 , 0x96, 0xac, 0x74, 0x22, 0xe7, 0xad, 0x35, 0x85, 0xe2, 0xf9, 0x37, 0xe8, 0x1c, 0x75, 0xdf, 0x6e
Kojto 0:615c697c33b0 78 , 0x47, 0xf1, 0x1a, 0x71, 0x1d, 0x29, 0xc5, 0x89, 0x6f, 0xb7, 0x62, 0x0e, 0xaa, 0x18, 0xbe, 0x1b
Kojto 0:615c697c33b0 79 , 0xfc, 0x56, 0x3e, 0x4b, 0xc6, 0xd2, 0x79, 0x20, 0x9a, 0xdb, 0xc0, 0xfe, 0x78, 0xcd, 0x5a, 0xf4
Kojto 0:615c697c33b0 80 , 0x1f, 0xdd, 0xa8, 0x33, 0x88, 0x07, 0xc7, 0x31, 0xb1, 0x12, 0x10, 0x59, 0x27, 0x80, 0xec, 0x5f
Kojto 0:615c697c33b0 81 , 0x60, 0x51, 0x7f, 0xa9, 0x19, 0xb5, 0x4a, 0x0d, 0x2d, 0xe5, 0x7a, 0x9f, 0x93, 0xc9, 0x9c, 0xef
Kojto 0:615c697c33b0 82 , 0xa0, 0xe0, 0x3b, 0x4d, 0xae, 0x2a, 0xf5, 0xb0, 0xc8, 0xeb, 0xbb, 0x3c, 0x83, 0x53, 0x99, 0x61
Kojto 0:615c697c33b0 83 , 0x17, 0x2b, 0x04, 0x7e, 0xba, 0x77, 0xd6, 0x26, 0xe1, 0x69, 0x14, 0x63, 0x55, 0x21, 0x0c, 0x7d };
Kojto 0:615c697c33b0 84 // round constant
Kojto 0:615c697c33b0 85 static const uint8_t Rcon[11] = {0x8d, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1b, 0x36};
Kojto 0:615c697c33b0 86
Kojto 0:615c697c33b0 87 void cc3000_security::expandKey(uint8_t *expanded_key, uint8_t *key) {
Kojto 0:615c697c33b0 88 uint16_t ii, buf1;
Kojto 0:615c697c33b0 89 for (ii=0;ii<16;ii++)
Kojto 0:615c697c33b0 90 expanded_key[ii] = key[ii];
Kojto 0:615c697c33b0 91 for (ii=1;ii<11;ii++)
Kojto 0:615c697c33b0 92 {
Kojto 0:615c697c33b0 93 buf1 = expanded_key[ii*16 - 4];
Kojto 0:615c697c33b0 94 expanded_key[ii*16 + 0] = sbox[expanded_key[ii*16 - 3]]^expanded_key[(ii-1)*16 + 0]^Rcon[ii];
Kojto 0:615c697c33b0 95 expanded_key[ii*16 + 1] = sbox[expanded_key[ii*16 - 2]]^expanded_key[(ii-1)*16 + 1];
Kojto 0:615c697c33b0 96 expanded_key[ii*16 + 2] = sbox[expanded_key[ii*16 - 1]]^expanded_key[(ii-1)*16 + 2];
Kojto 0:615c697c33b0 97 expanded_key[ii*16 + 3] = sbox[buf1 ]^expanded_key[(ii-1)*16 + 3];
Kojto 0:615c697c33b0 98 expanded_key[ii*16 + 4] = expanded_key[(ii-1)*16 + 4]^expanded_key[ii*16 + 0];
Kojto 0:615c697c33b0 99 expanded_key[ii*16 + 5] = expanded_key[(ii-1)*16 + 5]^expanded_key[ii*16 + 1];
Kojto 0:615c697c33b0 100 expanded_key[ii*16 + 6] = expanded_key[(ii-1)*16 + 6]^expanded_key[ii*16 + 2];
Kojto 0:615c697c33b0 101 expanded_key[ii*16 + 7] = expanded_key[(ii-1)*16 + 7]^expanded_key[ii*16 + 3];
Kojto 0:615c697c33b0 102 expanded_key[ii*16 + 8] = expanded_key[(ii-1)*16 + 8]^expanded_key[ii*16 + 4];
Kojto 0:615c697c33b0 103 expanded_key[ii*16 + 9] = expanded_key[(ii-1)*16 + 9]^expanded_key[ii*16 + 5];
Kojto 0:615c697c33b0 104 expanded_key[ii*16 +10] = expanded_key[(ii-1)*16 +10]^expanded_key[ii*16 + 6];
Kojto 0:615c697c33b0 105 expanded_key[ii*16 +11] = expanded_key[(ii-1)*16 +11]^expanded_key[ii*16 + 7];
Kojto 0:615c697c33b0 106 expanded_key[ii*16 +12] = expanded_key[(ii-1)*16 +12]^expanded_key[ii*16 + 8];
Kojto 0:615c697c33b0 107 expanded_key[ii*16 +13] = expanded_key[(ii-1)*16 +13]^expanded_key[ii*16 + 9];
Kojto 0:615c697c33b0 108 expanded_key[ii*16 +14] = expanded_key[(ii-1)*16 +14]^expanded_key[ii*16 +10];
Kojto 0:615c697c33b0 109 expanded_key[ii*16 +15] = expanded_key[(ii-1)*16 +15]^expanded_key[ii*16 +11];
Kojto 0:615c697c33b0 110 }
Kojto 0:615c697c33b0 111 }
Kojto 0:615c697c33b0 112
Kojto 0:615c697c33b0 113 uint8_t cc3000_security::galois_mul2(uint8_t value) {
Kojto 0:615c697c33b0 114 if (value >> 7) {
Kojto 0:615c697c33b0 115 value = value << 1;
Kojto 0:615c697c33b0 116 return (value ^ 0x1b);
Kojto 0:615c697c33b0 117 } else {
Kojto 0:615c697c33b0 118 return (value << 1);
Kojto 0:615c697c33b0 119 }
Kojto 0:615c697c33b0 120 }
Kojto 0:615c697c33b0 121
Kojto 0:615c697c33b0 122 void cc3000_security::aes_encr(uint8_t *state, uint8_t *expanded_key) {
Kojto 0:615c697c33b0 123 uint8_t buf1, buf2, buf3, round;
Kojto 0:615c697c33b0 124
Kojto 0:615c697c33b0 125 for (round = 0; round < 9; round ++)
Kojto 0:615c697c33b0 126 {
Kojto 0:615c697c33b0 127 // addroundkey, sbox and shiftrows
Kojto 0:615c697c33b0 128 // row 0
Kojto 0:615c697c33b0 129 state[ 0] = sbox[(state[ 0] ^ expanded_key[(round*16) ])];
Kojto 0:615c697c33b0 130 state[ 4] = sbox[(state[ 4] ^ expanded_key[(round*16) + 4])];
Kojto 0:615c697c33b0 131 state[ 8] = sbox[(state[ 8] ^ expanded_key[(round*16) + 8])];
Kojto 0:615c697c33b0 132 state[12] = sbox[(state[12] ^ expanded_key[(round*16) + 12])];
Kojto 0:615c697c33b0 133 // row 1
Kojto 0:615c697c33b0 134 buf1 = state[1] ^ expanded_key[(round*16) + 1];
Kojto 0:615c697c33b0 135 state[ 1] = sbox[(state[ 5] ^ expanded_key[(round*16) + 5])];
Kojto 0:615c697c33b0 136 state[ 5] = sbox[(state[ 9] ^ expanded_key[(round*16) + 9])];
Kojto 0:615c697c33b0 137 state[ 9] = sbox[(state[13] ^ expanded_key[(round*16) + 13])];
Kojto 0:615c697c33b0 138 state[13] = sbox[buf1];
Kojto 0:615c697c33b0 139 // row 2
Kojto 0:615c697c33b0 140 buf1 = state[2] ^ expanded_key[(round*16) + 2];
Kojto 0:615c697c33b0 141 buf2 = state[6] ^ expanded_key[(round*16) + 6];
Kojto 0:615c697c33b0 142 state[ 2] = sbox[(state[10] ^ expanded_key[(round*16) + 10])];
Kojto 0:615c697c33b0 143 state[ 6] = sbox[(state[14] ^ expanded_key[(round*16) + 14])];
Kojto 0:615c697c33b0 144 state[10] = sbox[buf1];
Kojto 0:615c697c33b0 145 state[14] = sbox[buf2];
Kojto 0:615c697c33b0 146 // row 3
Kojto 0:615c697c33b0 147 buf1 = state[15] ^ expanded_key[(round*16) + 15];
Kojto 0:615c697c33b0 148 state[15] = sbox[(state[11] ^ expanded_key[(round*16) + 11])];
Kojto 0:615c697c33b0 149 state[11] = sbox[(state[ 7] ^ expanded_key[(round*16) + 7])];
Kojto 0:615c697c33b0 150 state[ 7] = sbox[(state[ 3] ^ expanded_key[(round*16) + 3])];
Kojto 0:615c697c33b0 151 state[ 3] = sbox[buf1];
Kojto 0:615c697c33b0 152
Kojto 0:615c697c33b0 153 // mixcolums //////////
Kojto 0:615c697c33b0 154 // col1
Kojto 0:615c697c33b0 155 buf1 = state[0] ^ state[1] ^ state[2] ^ state[3];
Kojto 0:615c697c33b0 156 buf2 = state[0];
Kojto 0:615c697c33b0 157 buf3 = state[0]^state[1]; buf3=galois_mul2(buf3); state[0] = state[0] ^ buf3 ^ buf1;
Kojto 0:615c697c33b0 158 buf3 = state[1]^state[2]; buf3=galois_mul2(buf3); state[1] = state[1] ^ buf3 ^ buf1;
Kojto 0:615c697c33b0 159 buf3 = state[2]^state[3]; buf3=galois_mul2(buf3); state[2] = state[2] ^ buf3 ^ buf1;
Kojto 0:615c697c33b0 160 buf3 = state[3]^buf2; buf3=galois_mul2(buf3); state[3] = state[3] ^ buf3 ^ buf1;
Kojto 0:615c697c33b0 161 // col2
Kojto 0:615c697c33b0 162 buf1 = state[4] ^ state[5] ^ state[6] ^ state[7];
Kojto 0:615c697c33b0 163 buf2 = state[4];
Kojto 0:615c697c33b0 164 buf3 = state[4]^state[5]; buf3=galois_mul2(buf3); state[4] = state[4] ^ buf3 ^ buf1;
Kojto 0:615c697c33b0 165 buf3 = state[5]^state[6]; buf3=galois_mul2(buf3); state[5] = state[5] ^ buf3 ^ buf1;
Kojto 0:615c697c33b0 166 buf3 = state[6]^state[7]; buf3=galois_mul2(buf3); state[6] = state[6] ^ buf3 ^ buf1;
Kojto 0:615c697c33b0 167 buf3 = state[7]^buf2; buf3=galois_mul2(buf3); state[7] = state[7] ^ buf3 ^ buf1;
Kojto 0:615c697c33b0 168 // col3
Kojto 0:615c697c33b0 169 buf1 = state[8] ^ state[9] ^ state[10] ^ state[11];
Kojto 0:615c697c33b0 170 buf2 = state[8];
Kojto 0:615c697c33b0 171 buf3 = state[8]^state[9]; buf3=galois_mul2(buf3); state[8] = state[8] ^ buf3 ^ buf1;
Kojto 0:615c697c33b0 172 buf3 = state[9]^state[10]; buf3=galois_mul2(buf3); state[9] = state[9] ^ buf3 ^ buf1;
Kojto 0:615c697c33b0 173 buf3 = state[10]^state[11]; buf3=galois_mul2(buf3); state[10] = state[10] ^ buf3 ^ buf1;
Kojto 0:615c697c33b0 174 buf3 = state[11]^buf2; buf3=galois_mul2(buf3); state[11] = state[11] ^ buf3 ^ buf1;
Kojto 0:615c697c33b0 175 // col4
Kojto 0:615c697c33b0 176 buf1 = state[12] ^ state[13] ^ state[14] ^ state[15];
Kojto 0:615c697c33b0 177 buf2 = state[12];
Kojto 0:615c697c33b0 178 buf3 = state[12]^state[13]; buf3=galois_mul2(buf3); state[12] = state[12] ^ buf3 ^ buf1;
Kojto 0:615c697c33b0 179 buf3 = state[13]^state[14]; buf3=galois_mul2(buf3); state[13] = state[13] ^ buf3 ^ buf1;
Kojto 0:615c697c33b0 180 buf3 = state[14]^state[15]; buf3=galois_mul2(buf3); state[14] = state[14] ^ buf3 ^ buf1;
Kojto 0:615c697c33b0 181 buf3 = state[15]^buf2; buf3=galois_mul2(buf3); state[15] = state[15] ^ buf3 ^ buf1;
Kojto 0:615c697c33b0 182
Kojto 0:615c697c33b0 183 }
Kojto 0:615c697c33b0 184 // 10th round without mixcols
Kojto 0:615c697c33b0 185 state[ 0] = sbox[(state[ 0] ^ expanded_key[(round*16) ])];
Kojto 0:615c697c33b0 186 state[ 4] = sbox[(state[ 4] ^ expanded_key[(round*16) + 4])];
Kojto 0:615c697c33b0 187 state[ 8] = sbox[(state[ 8] ^ expanded_key[(round*16) + 8])];
Kojto 0:615c697c33b0 188 state[12] = sbox[(state[12] ^ expanded_key[(round*16) + 12])];
Kojto 0:615c697c33b0 189 // row 1
Kojto 0:615c697c33b0 190 buf1 = state[1] ^ expanded_key[(round*16) + 1];
Kojto 0:615c697c33b0 191 state[ 1] = sbox[(state[ 5] ^ expanded_key[(round*16) + 5])];
Kojto 0:615c697c33b0 192 state[ 5] = sbox[(state[ 9] ^ expanded_key[(round*16) + 9])];
Kojto 0:615c697c33b0 193 state[ 9] = sbox[(state[13] ^ expanded_key[(round*16) + 13])];
Kojto 0:615c697c33b0 194 state[13] = sbox[buf1];
Kojto 0:615c697c33b0 195 // row 2
Kojto 0:615c697c33b0 196 buf1 = state[2] ^ expanded_key[(round*16) + 2];
Kojto 0:615c697c33b0 197 buf2 = state[6] ^ expanded_key[(round*16) + 6];
Kojto 0:615c697c33b0 198 state[ 2] = sbox[(state[10] ^ expanded_key[(round*16) + 10])];
Kojto 0:615c697c33b0 199 state[ 6] = sbox[(state[14] ^ expanded_key[(round*16) + 14])];
Kojto 0:615c697c33b0 200 state[10] = sbox[buf1];
Kojto 0:615c697c33b0 201 state[14] = sbox[buf2];
Kojto 0:615c697c33b0 202 // row 3
Kojto 0:615c697c33b0 203 buf1 = state[15] ^ expanded_key[(round*16) + 15];
Kojto 0:615c697c33b0 204 state[15] = sbox[(state[11] ^ expanded_key[(round*16) + 11])];
Kojto 0:615c697c33b0 205 state[11] = sbox[(state[ 7] ^ expanded_key[(round*16) + 7])];
Kojto 0:615c697c33b0 206 state[ 7] = sbox[(state[ 3] ^ expanded_key[(round*16) + 3])];
Kojto 0:615c697c33b0 207 state[ 3] = sbox[buf1];
Kojto 0:615c697c33b0 208 // last addroundkey
Kojto 0:615c697c33b0 209 state[ 0]^=expanded_key[160];
Kojto 0:615c697c33b0 210 state[ 1]^=expanded_key[161];
Kojto 0:615c697c33b0 211 state[ 2]^=expanded_key[162];
Kojto 0:615c697c33b0 212 state[ 3]^=expanded_key[163];
Kojto 0:615c697c33b0 213 state[ 4]^=expanded_key[164];
Kojto 0:615c697c33b0 214 state[ 5]^=expanded_key[165];
Kojto 0:615c697c33b0 215 state[ 6]^=expanded_key[166];
Kojto 0:615c697c33b0 216 state[ 7]^=expanded_key[167];
Kojto 0:615c697c33b0 217 state[ 8]^=expanded_key[168];
Kojto 0:615c697c33b0 218 state[ 9]^=expanded_key[169];
Kojto 0:615c697c33b0 219 state[10]^=expanded_key[170];
Kojto 0:615c697c33b0 220 state[11]^=expanded_key[171];
Kojto 0:615c697c33b0 221 state[12]^=expanded_key[172];
Kojto 0:615c697c33b0 222 state[13]^=expanded_key[173];
Kojto 0:615c697c33b0 223 state[14]^=expanded_key[174];
Kojto 0:615c697c33b0 224 state[15]^=expanded_key[175];
Kojto 0:615c697c33b0 225 }
Kojto 0:615c697c33b0 226
Kojto 0:615c697c33b0 227 void cc3000_security::aes_decr(uint8_t *state, uint8_t *expanded_key) {
Kojto 0:615c697c33b0 228 uint8_t buf1, buf2, buf3;
Kojto 0:615c697c33b0 229 int8_t round;
Kojto 0:615c697c33b0 230 round = 9;
Kojto 0:615c697c33b0 231
Kojto 0:615c697c33b0 232 // initial addroundkey
Kojto 0:615c697c33b0 233 state[ 0]^=expanded_key[160];
Kojto 0:615c697c33b0 234 state[ 1]^=expanded_key[161];
Kojto 0:615c697c33b0 235 state[ 2]^=expanded_key[162];
Kojto 0:615c697c33b0 236 state[ 3]^=expanded_key[163];
Kojto 0:615c697c33b0 237 state[ 4]^=expanded_key[164];
Kojto 0:615c697c33b0 238 state[ 5]^=expanded_key[165];
Kojto 0:615c697c33b0 239 state[ 6]^=expanded_key[166];
Kojto 0:615c697c33b0 240 state[ 7]^=expanded_key[167];
Kojto 0:615c697c33b0 241 state[ 8]^=expanded_key[168];
Kojto 0:615c697c33b0 242 state[ 9]^=expanded_key[169];
Kojto 0:615c697c33b0 243 state[10]^=expanded_key[170];
Kojto 0:615c697c33b0 244 state[11]^=expanded_key[171];
Kojto 0:615c697c33b0 245 state[12]^=expanded_key[172];
Kojto 0:615c697c33b0 246 state[13]^=expanded_key[173];
Kojto 0:615c697c33b0 247 state[14]^=expanded_key[174];
Kojto 0:615c697c33b0 248 state[15]^=expanded_key[175];
Kojto 0:615c697c33b0 249
Kojto 0:615c697c33b0 250 // 10th round without mixcols
Kojto 0:615c697c33b0 251 state[ 0] = rsbox[state[ 0]] ^ expanded_key[(round*16) ];
Kojto 0:615c697c33b0 252 state[ 4] = rsbox[state[ 4]] ^ expanded_key[(round*16) + 4];
Kojto 0:615c697c33b0 253 state[ 8] = rsbox[state[ 8]] ^ expanded_key[(round*16) + 8];
Kojto 0:615c697c33b0 254 state[12] = rsbox[state[12]] ^ expanded_key[(round*16) + 12];
Kojto 0:615c697c33b0 255 // row 1
Kojto 0:615c697c33b0 256 buf1 = rsbox[state[13]] ^ expanded_key[(round*16) + 1];
Kojto 0:615c697c33b0 257 state[13] = rsbox[state[ 9]] ^ expanded_key[(round*16) + 13];
Kojto 0:615c697c33b0 258 state[ 9] = rsbox[state[ 5]] ^ expanded_key[(round*16) + 9];
Kojto 0:615c697c33b0 259 state[ 5] = rsbox[state[ 1]] ^ expanded_key[(round*16) + 5];
Kojto 0:615c697c33b0 260 state[ 1] = buf1;
Kojto 0:615c697c33b0 261 // row 2
Kojto 0:615c697c33b0 262 buf1 = rsbox[state[ 2]] ^ expanded_key[(round*16) + 10];
Kojto 0:615c697c33b0 263 buf2 = rsbox[state[ 6]] ^ expanded_key[(round*16) + 14];
Kojto 0:615c697c33b0 264 state[ 2] = rsbox[state[10]] ^ expanded_key[(round*16) + 2];
Kojto 0:615c697c33b0 265 state[ 6] = rsbox[state[14]] ^ expanded_key[(round*16) + 6];
Kojto 0:615c697c33b0 266 state[10] = buf1;
Kojto 0:615c697c33b0 267 state[14] = buf2;
Kojto 0:615c697c33b0 268 // row 3
Kojto 0:615c697c33b0 269 buf1 = rsbox[state[ 3]] ^ expanded_key[(round*16) + 15];
Kojto 0:615c697c33b0 270 state[ 3] = rsbox[state[ 7]] ^ expanded_key[(round*16) + 3];
Kojto 0:615c697c33b0 271 state[ 7] = rsbox[state[11]] ^ expanded_key[(round*16) + 7];
Kojto 0:615c697c33b0 272 state[11] = rsbox[state[15]] ^ expanded_key[(round*16) + 11];
Kojto 0:615c697c33b0 273 state[15] = buf1;
Kojto 0:615c697c33b0 274
Kojto 0:615c697c33b0 275 for (round = 8; round >= 0; round--)
Kojto 0:615c697c33b0 276 {
Kojto 0:615c697c33b0 277 // barreto
Kojto 0:615c697c33b0 278 //col1
Kojto 0:615c697c33b0 279 buf1 = galois_mul2(galois_mul2(state[0]^state[2]));
Kojto 0:615c697c33b0 280 buf2 = galois_mul2(galois_mul2(state[1]^state[3]));
Kojto 0:615c697c33b0 281 state[0] ^= buf1; state[1] ^= buf2; state[2] ^= buf1; state[3] ^= buf2;
Kojto 0:615c697c33b0 282 //col2
Kojto 0:615c697c33b0 283 buf1 = galois_mul2(galois_mul2(state[4]^state[6]));
Kojto 0:615c697c33b0 284 buf2 = galois_mul2(galois_mul2(state[5]^state[7]));
Kojto 0:615c697c33b0 285 state[4] ^= buf1; state[5] ^= buf2; state[6] ^= buf1; state[7] ^= buf2;
Kojto 0:615c697c33b0 286 //col3
Kojto 0:615c697c33b0 287 buf1 = galois_mul2(galois_mul2(state[8]^state[10]));
Kojto 0:615c697c33b0 288 buf2 = galois_mul2(galois_mul2(state[9]^state[11]));
Kojto 0:615c697c33b0 289 state[8] ^= buf1; state[9] ^= buf2; state[10] ^= buf1; state[11] ^= buf2;
Kojto 0:615c697c33b0 290 //col4
Kojto 0:615c697c33b0 291 buf1 = galois_mul2(galois_mul2(state[12]^state[14]));
Kojto 0:615c697c33b0 292 buf2 = galois_mul2(galois_mul2(state[13]^state[15]));
Kojto 0:615c697c33b0 293 state[12] ^= buf1; state[13] ^= buf2; state[14] ^= buf1; state[15] ^= buf2;
Kojto 0:615c697c33b0 294 // mixcolums //////////
Kojto 0:615c697c33b0 295 // col1
Kojto 0:615c697c33b0 296 buf1 = state[0] ^ state[1] ^ state[2] ^ state[3];
Kojto 0:615c697c33b0 297 buf2 = state[0];
Kojto 0:615c697c33b0 298 buf3 = state[0]^state[1]; buf3=galois_mul2(buf3); state[0] = state[0] ^ buf3 ^ buf1;
Kojto 0:615c697c33b0 299 buf3 = state[1]^state[2]; buf3=galois_mul2(buf3); state[1] = state[1] ^ buf3 ^ buf1;
Kojto 0:615c697c33b0 300 buf3 = state[2]^state[3]; buf3=galois_mul2(buf3); state[2] = state[2] ^ buf3 ^ buf1;
Kojto 0:615c697c33b0 301 buf3 = state[3]^buf2; buf3=galois_mul2(buf3); state[3] = state[3] ^ buf3 ^ buf1;
Kojto 0:615c697c33b0 302 // col2
Kojto 0:615c697c33b0 303 buf1 = state[4] ^ state[5] ^ state[6] ^ state[7];
Kojto 0:615c697c33b0 304 buf2 = state[4];
Kojto 0:615c697c33b0 305 buf3 = state[4]^state[5]; buf3=galois_mul2(buf3); state[4] = state[4] ^ buf3 ^ buf1;
Kojto 0:615c697c33b0 306 buf3 = state[5]^state[6]; buf3=galois_mul2(buf3); state[5] = state[5] ^ buf3 ^ buf1;
Kojto 0:615c697c33b0 307 buf3 = state[6]^state[7]; buf3=galois_mul2(buf3); state[6] = state[6] ^ buf3 ^ buf1;
Kojto 0:615c697c33b0 308 buf3 = state[7]^buf2; buf3=galois_mul2(buf3); state[7] = state[7] ^ buf3 ^ buf1;
Kojto 0:615c697c33b0 309 // col3
Kojto 0:615c697c33b0 310 buf1 = state[8] ^ state[9] ^ state[10] ^ state[11];
Kojto 0:615c697c33b0 311 buf2 = state[8];
Kojto 0:615c697c33b0 312 buf3 = state[8]^state[9]; buf3=galois_mul2(buf3); state[8] = state[8] ^ buf3 ^ buf1;
Kojto 0:615c697c33b0 313 buf3 = state[9]^state[10]; buf3=galois_mul2(buf3); state[9] = state[9] ^ buf3 ^ buf1;
Kojto 0:615c697c33b0 314 buf3 = state[10]^state[11]; buf3=galois_mul2(buf3); state[10] = state[10] ^ buf3 ^ buf1;
Kojto 0:615c697c33b0 315 buf3 = state[11]^buf2; buf3=galois_mul2(buf3); state[11] = state[11] ^ buf3 ^ buf1;
Kojto 0:615c697c33b0 316 // col4
Kojto 0:615c697c33b0 317 buf1 = state[12] ^ state[13] ^ state[14] ^ state[15];
Kojto 0:615c697c33b0 318 buf2 = state[12];
Kojto 0:615c697c33b0 319 buf3 = state[12]^state[13]; buf3=galois_mul2(buf3); state[12] = state[12] ^ buf3 ^ buf1;
Kojto 0:615c697c33b0 320 buf3 = state[13]^state[14]; buf3=galois_mul2(buf3); state[13] = state[13] ^ buf3 ^ buf1;
Kojto 0:615c697c33b0 321 buf3 = state[14]^state[15]; buf3=galois_mul2(buf3); state[14] = state[14] ^ buf3 ^ buf1;
Kojto 0:615c697c33b0 322 buf3 = state[15]^buf2; buf3=galois_mul2(buf3); state[15] = state[15] ^ buf3 ^ buf1;
Kojto 0:615c697c33b0 323
Kojto 0:615c697c33b0 324 // addroundkey, rsbox and shiftrows
Kojto 0:615c697c33b0 325 // row 0
Kojto 0:615c697c33b0 326 state[ 0] = rsbox[state[ 0]] ^ expanded_key[(round*16) ];
Kojto 0:615c697c33b0 327 state[ 4] = rsbox[state[ 4]] ^ expanded_key[(round*16) + 4];
Kojto 0:615c697c33b0 328 state[ 8] = rsbox[state[ 8]] ^ expanded_key[(round*16) + 8];
Kojto 0:615c697c33b0 329 state[12] = rsbox[state[12]] ^ expanded_key[(round*16) + 12];
Kojto 0:615c697c33b0 330 // row 1
Kojto 0:615c697c33b0 331 buf1 = rsbox[state[13]] ^ expanded_key[(round*16) + 1];
Kojto 0:615c697c33b0 332 state[13] = rsbox[state[ 9]] ^ expanded_key[(round*16) + 13];
Kojto 0:615c697c33b0 333 state[ 9] = rsbox[state[ 5]] ^ expanded_key[(round*16) + 9];
Kojto 0:615c697c33b0 334 state[ 5] = rsbox[state[ 1]] ^ expanded_key[(round*16) + 5];
Kojto 0:615c697c33b0 335 state[ 1] = buf1;
Kojto 0:615c697c33b0 336 // row 2
Kojto 0:615c697c33b0 337 buf1 = rsbox[state[ 2]] ^ expanded_key[(round*16) + 10];
Kojto 0:615c697c33b0 338 buf2 = rsbox[state[ 6]] ^ expanded_key[(round*16) + 14];
Kojto 0:615c697c33b0 339 state[ 2] = rsbox[state[10]] ^ expanded_key[(round*16) + 2];
Kojto 0:615c697c33b0 340 state[ 6] = rsbox[state[14]] ^ expanded_key[(round*16) + 6];
Kojto 0:615c697c33b0 341 state[10] = buf1;
Kojto 0:615c697c33b0 342 state[14] = buf2;
Kojto 0:615c697c33b0 343 // row 3
Kojto 0:615c697c33b0 344 buf1 = rsbox[state[ 3]] ^ expanded_key[(round*16) + 15];
Kojto 0:615c697c33b0 345 state[ 3] = rsbox[state[ 7]] ^ expanded_key[(round*16) + 3];
Kojto 0:615c697c33b0 346 state[ 7] = rsbox[state[11]] ^ expanded_key[(round*16) + 7];
Kojto 0:615c697c33b0 347 state[11] = rsbox[state[15]] ^ expanded_key[(round*16) + 11];
Kojto 0:615c697c33b0 348 state[15] = buf1;
Kojto 0:615c697c33b0 349 }
Kojto 0:615c697c33b0 350 }
Kojto 0:615c697c33b0 351
Kojto 0:615c697c33b0 352 void cc3000_security::aes_encrypt(uint8_t *state, uint8_t *key) {
Kojto 0:615c697c33b0 353 // expand the key into 176 bytes
Kojto 0:615c697c33b0 354 expandKey(_expanded_key, key);
Kojto 0:615c697c33b0 355 aes_encr(state, _expanded_key);
Kojto 0:615c697c33b0 356 }
Kojto 0:615c697c33b0 357
Kojto 0:615c697c33b0 358 void cc3000_security::aes_decrypt(uint8_t *state, uint8_t *key) {
Kojto 0:615c697c33b0 359 expandKey(_expanded_key, key); // expand the key into 176 bytes
Kojto 0:615c697c33b0 360 aes_decr(state, _expanded_key);
Kojto 0:615c697c33b0 361 }
Kojto 0:615c697c33b0 362
Kojto 0:615c697c33b0 363 int32_t cc3000_security::aes_read_key(uint8_t *key) {
Kojto 0:615c697c33b0 364 int32_t returnValue;
Kojto 0:615c697c33b0 365
Kojto 0:615c697c33b0 366 returnValue = nvmem_read(NVMEM_AES128_KEY_FILEID, AES128_KEY_SIZE, 0, key);
Kojto 0:615c697c33b0 367
Kojto 0:615c697c33b0 368 return returnValue;
Kojto 0:615c697c33b0 369 }
Kojto 0:615c697c33b0 370
Kojto 0:615c697c33b0 371 int32_t cc3000_security::aes_write_key(uint8_t *key) {
Kojto 0:615c697c33b0 372 int32_t returnValue;
Kojto 0:615c697c33b0 373
Kojto 0:615c697c33b0 374 returnValue = nvmem_write(NVMEM_AES128_KEY_FILEID, AES128_KEY_SIZE, 0, key);
Kojto 0:615c697c33b0 375
Kojto 0:615c697c33b0 376 return returnValue;
Kojto 0:615c697c33b0 377 }
Kojto 0:615c697c33b0 378 #endif
Kojto 0:615c697c33b0 379
Kojto 0:615c697c33b0 380 } /* end of cc3000 namespace */
Kojto 0:615c697c33b0 381