2018-10-22: This is a temporary repository to fix issue mbed OS issue 8344. I'm reverting to an earlier mbed revision that isn't messed up. Expect mbed to fix the linker issue in the next release and I'll remove this repository. I havne't tested the code at this revision - sorry!

Dependencies:   BLE_API mbed mbedtls nRF51822

Committer:
electronichamsters
Date:
Sat Jul 29 21:49:32 2017 +0000
Revision:
11:d5edb6e3edab
Parent:
10:9db2ac7e1eea
Child:
12:30c6e83f0fe5
Added spoof checking

Who changed what in which revision?

UserRevisionLine numberNew contents of line
electronichamsters 11:d5edb6e3edab 1 /*
electronichamsters 9:1ea51b2048a8 2 Eric Tsai
electronichamsters 11:d5edb6e3edab 3
electronichamsters 11:d5edb6e3edab 4 7/29/2017: Added spoof checking using clock algorithm.
electronichamsters 9:1ea51b2048a8 5
electronichamsters 11:d5edb6e3edab 6 */
electronichamsters 8:46c5e0bfab05 7
electronichamsters 9:1ea51b2048a8 8 #include "mbed.h"
electronichamsters 9:1ea51b2048a8 9 #include "ble/BLE.h"
electronichamsters 9:1ea51b2048a8 10 #include "mbedtls/aes.h"
electronichamsters 8:46c5e0bfab05 11
electronichamsters 8:46c5e0bfab05 12
electronichamsters 9:1ea51b2048a8 13 //comment out when done with debug uart, else eats batteries
electronichamsters 9:1ea51b2048a8 14 #define MyDebugEnb 0
sunsmile2015 0:3dc6e424dba0 15
electronichamsters 8:46c5e0bfab05 16
electronichamsters 11:d5edb6e3edab 17
electronichamsters 9:1ea51b2048a8 18 //DigitalOut led1(LED1, 1);
electronichamsters 9:1ea51b2048a8 19 Ticker ticker;
electronichamsters 8:46c5e0bfab05 20
electronichamsters 11:d5edb6e3edab 21 const uint16_t Periodicity = 180; //clock periodicity used for spoof checking, should be 1800 seconds for 30minutes
electronichamsters 11:d5edb6e3edab 22
electronichamsters 9:1ea51b2048a8 23 //aes stuff
electronichamsters 9:1ea51b2048a8 24 uint8_t src_buf[16] = {0x1,0x2,0x3,0x4,0x1,0x2,0x3,0x4,0x1,0x2,0x3,0x4,0x1,0x2,0x3,0x4};
electronichamsters 9:1ea51b2048a8 25 uint8_t des_buf[16] = {0x1,0x2,0x3,0x4,0x1,0x2,0x3,0x4,0x1,0x2,0x3,0x4,0x1,0x2,0x3,0x4};
electronichamsters 9:1ea51b2048a8 26 mbedtls_aes_context aes;
electronichamsters 9:1ea51b2048a8 27 unsigned char iv[16] = {0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x1, 0x2}; //16-byte key
electronichamsters 9:1ea51b2048a8 28 size_t input_len = 16;
electronichamsters 9:1ea51b2048a8 29 size_t output_len = 0;
electronichamsters 9:1ea51b2048a8 30
electronichamsters 9:1ea51b2048a8 31 Serial device(p9, p11); //nRF51822 uart : TX=p9. RX=p11
electronichamsters 9:1ea51b2048a8 32
electronichamsters 11:d5edb6e3edab 33 //data structures for tracking wake time of BLE end nodes, for to prevent spoofing
electronichamsters 11:d5edb6e3edab 34 struct MAC_Birth_Record
electronichamsters 11:d5edb6e3edab 35 {
electronichamsters 11:d5edb6e3edab 36 uint8_t MAC_Addr[6]; //mac[0] is low order byte in mac address
electronichamsters 11:d5edb6e3edab 37 uint16_t MAC_Time; //The time of birth for this end node
electronichamsters 11:d5edb6e3edab 38 uint16_t Attempt_MAC_Time;
electronichamsters 11:d5edb6e3edab 39 uint8_t Attempt_Cnt;
electronichamsters 11:d5edb6e3edab 40 uint8_t Xmit_Cnt;
electronichamsters 11:d5edb6e3edab 41 };
electronichamsters 11:d5edb6e3edab 42 const uint8_t sizeOfSpoof = 50;
electronichamsters 11:d5edb6e3edab 43 MAC_Birth_Record Spoof_Check[sizeOfSpoof]; //array tracking end node birth times
electronichamsters 11:d5edb6e3edab 44 uint8_t Spoof_Ray_Tail = 0; //array index for next record
electronichamsters 11:d5edb6e3edab 45 uint8_t Received_MAC_Addr[6]; //mac[0] is low order byte in mac address
electronichamsters 11:d5edb6e3edab 46 uint16_t Received_MAC_Time;
electronichamsters 11:d5edb6e3edab 47 static Timer Gateway_Time;
electronichamsters 11:d5edb6e3edab 48 static uint16_t Expected_MAC_Time;
electronichamsters 11:d5edb6e3edab 49 uint8_t Received_Xmit_Cnt;
electronichamsters 11:d5edb6e3edab 50
electronichamsters 11:d5edb6e3edab 51
electronichamsters 11:d5edb6e3edab 52 const uint8_t ADVisUnknown = 0;
electronichamsters 11:d5edb6e3edab 53 const uint8_t ADVisNew = 1;
electronichamsters 11:d5edb6e3edab 54 const uint8_t ADVisDuplicate = 2;
electronichamsters 11:d5edb6e3edab 55 const uint8_t ADVisSpoof = 3;
electronichamsters 11:d5edb6e3edab 56
electronichamsters 11:d5edb6e3edab 57 //********************
electronichamsters 11:d5edb6e3edab 58 // Takes into account 30-minute clock, wrap arounds and edge cases
electronichamsters 11:d5edb6e3edab 59 // returns:
electronichamsters 11:d5edb6e3edab 60 // TRUE: if sensor's reported time lines up to gateway's recorded time
electronichamsters 11:d5edb6e3edab 61 // Expected_MAC_Time
electronichamsters 11:d5edb6e3edab 62 //*******************
electronichamsters 11:d5edb6e3edab 63 bool Is_Birth_Time_Correct (uint16_t gateway_mac_time, uint16_t sensor_mac_time, uint8_t margin)
electronichamsters 11:d5edb6e3edab 64 {
electronichamsters 11:d5edb6e3edab 65 bool return_val = 0;
electronichamsters 11:d5edb6e3edab 66 uint16_t current_time = (uint16_t)(Gateway_Time.read_ms()/1000);
electronichamsters 11:d5edb6e3edab 67 int16_t gateway_time_zone = current_time - sensor_mac_time;
electronichamsters 11:d5edb6e3edab 68
electronichamsters 11:d5edb6e3edab 69 if (current_time >= sensor_mac_time)
electronichamsters 11:d5edb6e3edab 70 {
electronichamsters 11:d5edb6e3edab 71 Expected_MAC_Time = current_time - sensor_mac_time;
electronichamsters 11:d5edb6e3edab 72 }
electronichamsters 11:d5edb6e3edab 73 else
electronichamsters 11:d5edb6e3edab 74 {
electronichamsters 11:d5edb6e3edab 75 Expected_MAC_Time = (Periodicity - sensor_mac_time + current_time);
electronichamsters 11:d5edb6e3edab 76 }
electronichamsters 11:d5edb6e3edab 77
electronichamsters 11:d5edb6e3edab 78 if (1) //check for count==0 situations
electronichamsters 11:d5edb6e3edab 79 {
electronichamsters 11:d5edb6e3edab 80 if ( (gateway_mac_time < (Expected_MAC_Time + margin)) && (gateway_mac_time > (Expected_MAC_Time - margin)) )
electronichamsters 11:d5edb6e3edab 81 {
electronichamsters 11:d5edb6e3edab 82 return_val = 1;
electronichamsters 11:d5edb6e3edab 83 }
electronichamsters 11:d5edb6e3edab 84 else
electronichamsters 11:d5edb6e3edab 85 {
electronichamsters 11:d5edb6e3edab 86 return_val = 0;
electronichamsters 11:d5edb6e3edab 87
electronichamsters 11:d5edb6e3edab 88 }
electronichamsters 11:d5edb6e3edab 89 }
electronichamsters 11:d5edb6e3edab 90
electronichamsters 11:d5edb6e3edab 91 /*
electronichamsters 11:d5edb6e3edab 92 //if positive, not a wrap around edge case
electronichamsters 11:d5edb6e3edab 93 //todo: take into account low count, indicates reset?
electronichamsters 11:d5edb6e3edab 94 if ((gateway_time_zone >= 0) && (1))
electronichamsters 11:d5edb6e3edab 95 {
electronichamsters 11:d5edb6e3edab 96 Expected_MAC_Time = gateway_time_zone;
electronichamsters 11:d5edb6e3edab 97 if ( (gateway_mac_time < (Expected_MAC_Time + margin)) && (gateway_mac_time > (Expected_MAC_Time - margin)) )
electronichamsters 11:d5edb6e3edab 98 {
electronichamsters 11:d5edb6e3edab 99 return_val = 1; //valid birth time
electronichamsters 11:d5edb6e3edab 100 }
electronichamsters 11:d5edb6e3edab 101
electronichamsters 11:d5edb6e3edab 102 }
electronichamsters 11:d5edb6e3edab 103 else //wrap around edge case, gateway_time_zone is negative
electronichamsters 11:d5edb6e3edab 104 {
electronichamsters 11:d5edb6e3edab 105 gateway_time_zone = (Periodicity - sensor_mac_time + current_time);
electronichamsters 11:d5edb6e3edab 106 Expected_MAC_Time = gateway_time_zone; //todo: 2 declarations??
electronichamsters 11:d5edb6e3edab 107 //if ( (Periodicity-gateway_mac_time)+current_time == sensor_mac_time) //wrong, need bands
electronichamsters 11:d5edb6e3edab 108 if ( (gateway_mac_time < (Expected_MAC_Time + margin)) && (gateway_mac_time > (Expected_MAC_Time - margin)) )
electronichamsters 11:d5edb6e3edab 109 {
electronichamsters 11:d5edb6e3edab 110 return_val = 1;
electronichamsters 11:d5edb6e3edab 111 }
electronichamsters 11:d5edb6e3edab 112 else
electronichamsters 11:d5edb6e3edab 113 {
electronichamsters 11:d5edb6e3edab 114 return_val = 0;
electronichamsters 11:d5edb6e3edab 115
electronichamsters 11:d5edb6e3edab 116 }
electronichamsters 11:d5edb6e3edab 117
electronichamsters 11:d5edb6e3edab 118 }
electronichamsters 11:d5edb6e3edab 119 */
electronichamsters 11:d5edb6e3edab 120 return return_val;
electronichamsters 11:d5edb6e3edab 121
electronichamsters 11:d5edb6e3edab 122 }//end Is_Birth_Time_Correct
electronichamsters 11:d5edb6e3edab 123
electronichamsters 11:d5edb6e3edab 124
electronichamsters 11:d5edb6e3edab 125
electronichamsters 11:d5edb6e3edab 126 /* **************************************
electronichamsters 11:d5edb6e3edab 127 check adv against birth records to detect spoofing
electronichamsters 11:d5edb6e3edab 128 add device to birth records if new
electronichamsters 11:d5edb6e3edab 129 returns
electronichamsters 11:d5edb6e3edab 130 TRUE: if device reported birth time matches real birth time
electronichamsters 11:d5edb6e3edab 131 if device is first encountered
electronichamsters 11:d5edb6e3edab 132 if X consecutive birth time matches
electronichamsters 11:d5edb6e3edab 133 FALSE: if device reported birth time does not match
electronichamsters 11:d5edb6e3edab 134
electronichamsters 11:d5edb6e3edab 135 ToDo: add attempts
electronichamsters 11:d5edb6e3edab 136 ToDo: wrap around of gateway clock not accounted for. Like if Gateway_Time.read_ms() - Received_MAC_Time < 0
electronichamsters 11:d5edb6e3edab 137 */
electronichamsters 11:d5edb6e3edab 138 uint8_t Is_Not_Spoofed ()
electronichamsters 8:46c5e0bfab05 139 {
electronichamsters 11:d5edb6e3edab 140 uint8_t return_val = ADVisUnknown;
electronichamsters 11:d5edb6e3edab 141 //iterate through all of birth records looking for one that matches MAC address
electronichamsters 11:d5edb6e3edab 142 for (int i=0; i<sizeOfSpoof; i++)
electronichamsters 11:d5edb6e3edab 143 {
electronichamsters 11:d5edb6e3edab 144 //Search for matching MAC address
electronichamsters 11:d5edb6e3edab 145 if (Spoof_Check[i].MAC_Addr[0] == Received_MAC_Addr[0] &&
electronichamsters 11:d5edb6e3edab 146 Spoof_Check[i].MAC_Addr[1] == Received_MAC_Addr[1] &&
electronichamsters 11:d5edb6e3edab 147 Spoof_Check[i].MAC_Addr[2] == Received_MAC_Addr[2] &&
electronichamsters 11:d5edb6e3edab 148 Spoof_Check[i].MAC_Addr[3] == Received_MAC_Addr[3] &&
electronichamsters 11:d5edb6e3edab 149 Spoof_Check[i].MAC_Addr[4] == Received_MAC_Addr[4] &&
electronichamsters 11:d5edb6e3edab 150 Spoof_Check[i].MAC_Addr[5] == Received_MAC_Addr[5])
electronichamsters 11:d5edb6e3edab 151 {
electronichamsters 11:d5edb6e3edab 152
electronichamsters 11:d5edb6e3edab 153
electronichamsters 11:d5edb6e3edab 154
electronichamsters 11:d5edb6e3edab 155 #if MyDebugEnb
electronichamsters 11:d5edb6e3edab 156 device.printf("found MAC address in array\r\n");
electronichamsters 11:d5edb6e3edab 157 device.printf(" Index = %d \r\n", i);
electronichamsters 11:d5edb6e3edab 158 device.printf(" MAC = %02x:%02x:%02x:%02x:%02x:%02x \r\n", Received_MAC_Addr[5],Received_MAC_Addr[4],Received_MAC_Addr[3],Received_MAC_Addr[2],Received_MAC_Addr[1],Received_MAC_Addr[0]);
electronichamsters 11:d5edb6e3edab 159 device.printf(" Received MAC Time = %d \r\n", Received_MAC_Time);
electronichamsters 11:d5edb6e3edab 160 device.printf(" Gateway time = %d \r\n", (uint16_t)(Gateway_Time.read_ms()/1000));
electronichamsters 11:d5edb6e3edab 161 device.printf(" Array.MAC_Time = %d \r\n", Spoof_Check[i].MAC_Time);
electronichamsters 11:d5edb6e3edab 162 device.printf(" Array.Attempt_MAC_Time = %d \r\n", Spoof_Check[i].Attempt_MAC_Time);
electronichamsters 11:d5edb6e3edab 163 device.printf(" Array.Attempt_Cnt = %d \r\n", Spoof_Check[i].Attempt_Cnt);
electronichamsters 11:d5edb6e3edab 164 device.printf(" Array.Xmit_Cnt = %d \r\n", Spoof_Check[i].Xmit_Cnt);
electronichamsters 11:d5edb6e3edab 165 device.printf(" expected time = %d \r\n", ((uint16_t)(Gateway_Time.read_ms()/1000)) - Received_MAC_Time);
electronichamsters 11:d5edb6e3edab 166 #endif
electronichamsters 11:d5edb6e3edab 167
electronichamsters 11:d5edb6e3edab 168 //calcuate the time of birth of this bluetooth module @ gateway time zone relative to received MAC_Time.
electronichamsters 11:d5edb6e3edab 169 //int16_t expected_mac_time = ((uint16_t)(Gateway_Time.read_ms()/1000)) - Received_MAC_Time;
electronichamsters 11:d5edb6e3edab 170 //uint16_t expected_mac_time = 0;
electronichamsters 11:d5edb6e3edab 171
electronichamsters 11:d5edb6e3edab 172
electronichamsters 11:d5edb6e3edab 173 //todo: this needs to be a POSITIVE VALUE, calculated by Is_MAC_Time_Correct();
electronichamsters 11:d5edb6e3edab 174
electronichamsters 11:d5edb6e3edab 175
electronichamsters 11:d5edb6e3edab 176 // ToDo: there's a bug here. Need to use count to figure out when it's a first-powered on device. Can't use time?
electronichamsters 11:d5edb6e3edab 177
electronichamsters 11:d5edb6e3edab 178 //*****
electronichamsters 11:d5edb6e3edab 179 // check primary Mac_Time
electronichamsters 11:d5edb6e3edab 180 //****
electronichamsters 11:d5edb6e3edab 181 if
electronichamsters 11:d5edb6e3edab 182 (
electronichamsters 11:d5edb6e3edab 183 Is_Birth_Time_Correct(Spoof_Check[i].MAC_Time, Received_MAC_Time, 3)
electronichamsters 11:d5edb6e3edab 184 )
electronichamsters 11:d5edb6e3edab 185 {
electronichamsters 11:d5edb6e3edab 186 if (Spoof_Check[i].Xmit_Cnt != Received_Xmit_Cnt)
electronichamsters 11:d5edb6e3edab 187 {
electronichamsters 11:d5edb6e3edab 188 return_val = ADVisNew; //MAC Time checks out and not duplicate
electronichamsters 11:d5edb6e3edab 189 Spoof_Check[i].MAC_Time = Expected_MAC_Time; //update birth time for this device.
electronichamsters 11:d5edb6e3edab 190 Spoof_Check[i].Xmit_Cnt = Received_Xmit_Cnt;
electronichamsters 11:d5edb6e3edab 191 //i = sizeOfSpoof; //exit for loop, we've found the MAC address. But can't do it this way.
electronichamsters 11:d5edb6e3edab 192 //ToDo: hey, what happens if the array holds entries w/ same MAC? Is that possible?
electronichamsters 11:d5edb6e3edab 193 #if MyDebugEnb
electronichamsters 11:d5edb6e3edab 194 device.printf("Pirmary MAC Time as expected...expected=%d...Spoof_mac_tmr=%d \r\n", Expected_MAC_Time, Spoof_Check[i].MAC_Time);
electronichamsters 11:d5edb6e3edab 195 #endif
electronichamsters 11:d5edb6e3edab 196 }
electronichamsters 11:d5edb6e3edab 197 else
electronichamsters 11:d5edb6e3edab 198 {
electronichamsters 11:d5edb6e3edab 199 return_val = ADVisDuplicate; //MAC Time checks out and is duplicate
electronichamsters 11:d5edb6e3edab 200 }
electronichamsters 11:d5edb6e3edab 201 }//if primary MAC_time match
electronichamsters 11:d5edb6e3edab 202 else
electronichamsters 11:d5edb6e3edab 203 {
electronichamsters 11:d5edb6e3edab 204 //*****
electronichamsters 11:d5edb6e3edab 205 // check secondary Mac_Time
electronichamsters 11:d5edb6e3edab 206 //****
electronichamsters 11:d5edb6e3edab 207 #if MyDebugEnb
electronichamsters 11:d5edb6e3edab 208 device.printf(" MAC Time No Match!!...expected=%d...Spoof_mac_tmr=%d \r\n", Expected_MAC_Time, Spoof_Check[i].MAC_Time);
electronichamsters 11:d5edb6e3edab 209
electronichamsters 11:d5edb6e3edab 210 #endif
electronichamsters 11:d5edb6e3edab 211
electronichamsters 11:d5edb6e3edab 212 //increment count if matches secondary
electronichamsters 11:d5edb6e3edab 213 //if ( (Spoof_Check[i].Attempt_MAC_Time < (expected_mac_time + 5)) && (Spoof_Check[i].Attempt_MAC_Time > (expected_mac_time - 5)) )
electronichamsters 11:d5edb6e3edab 214 if (Is_Birth_Time_Correct(Spoof_Check[i].Attempt_MAC_Time, Received_MAC_Time, 3))
electronichamsters 11:d5edb6e3edab 215 {
electronichamsters 11:d5edb6e3edab 216 if (Spoof_Check[i].Xmit_Cnt != Received_Xmit_Cnt)
electronichamsters 11:d5edb6e3edab 217 {
electronichamsters 11:d5edb6e3edab 218
electronichamsters 11:d5edb6e3edab 219 //Spoof_Check[i].Attempt_MAC_Time = expected_mac_time;
electronichamsters 11:d5edb6e3edab 220 Spoof_Check[i].Attempt_Cnt++;
electronichamsters 11:d5edb6e3edab 221 Spoof_Check[i].Xmit_Cnt = Received_Xmit_Cnt;
electronichamsters 11:d5edb6e3edab 222 #if MyDebugEnb
electronichamsters 11:d5edb6e3edab 223 device.printf(" Match on secondary, Attempt_Cnt= %d, Attempt_MAC_Time = %d, Expected_MAC_Time=%d \r\n", Spoof_Check[i].Attempt_Cnt, Spoof_Check[i].Attempt_MAC_Time, Expected_MAC_Time);
electronichamsters 11:d5edb6e3edab 224 #endif
electronichamsters 11:d5edb6e3edab 225 //this takes care of usecase where a module is reset after it's already been seen by gateway
electronichamsters 11:d5edb6e3edab 226 //after 3 consecutive correlated MAC_Time attempts we assume is our long lost friend and not a spoof.
electronichamsters 11:d5edb6e3edab 227 if (Spoof_Check[i].Attempt_Cnt >= 3)
electronichamsters 11:d5edb6e3edab 228 {
electronichamsters 11:d5edb6e3edab 229 return_val = ADVisNew;
electronichamsters 11:d5edb6e3edab 230
electronichamsters 11:d5edb6e3edab 231 //promote this MAC_Time to primary and start accepting data @ this MAC_Time
electronichamsters 11:d5edb6e3edab 232 Spoof_Check[i].MAC_Time = Expected_MAC_Time;
electronichamsters 11:d5edb6e3edab 233 Spoof_Check[i].Xmit_Cnt = Received_Xmit_Cnt;
electronichamsters 11:d5edb6e3edab 234 Spoof_Check[i].Attempt_Cnt = 0;
electronichamsters 11:d5edb6e3edab 235 }
electronichamsters 11:d5edb6e3edab 236 else //Received_MAC_Time matches Attempt, but not enough times to be considered as valid.
electronichamsters 11:d5edb6e3edab 237 {
electronichamsters 11:d5edb6e3edab 238 return_val = ADVisSpoof;
electronichamsters 11:d5edb6e3edab 239
electronichamsters 11:d5edb6e3edab 240 }
electronichamsters 11:d5edb6e3edab 241
electronichamsters 11:d5edb6e3edab 242
electronichamsters 11:d5edb6e3edab 243 }//is not duplicate, and transmit count matches
electronichamsters 11:d5edb6e3edab 244 else
electronichamsters 11:d5edb6e3edab 245 {
electronichamsters 11:d5edb6e3edab 246 #if MyDebugEnb
electronichamsters 11:d5edb6e3edab 247 device.printf(" is Duplicate , but matches Attempt_MAC_Time matches\r\n");
electronichamsters 11:d5edb6e3edab 248 #endif
electronichamsters 11:d5edb6e3edab 249 return_val = ADVisDuplicate;
electronichamsters 11:d5edb6e3edab 250 }
electronichamsters 11:d5edb6e3edab 251 } //Recevied MAC_Time matches secondary MAC_Time
electronichamsters 11:d5edb6e3edab 252 else
electronichamsters 11:d5edb6e3edab 253 {
electronichamsters 11:d5edb6e3edab 254 #if MyDebugEnb
electronichamsters 11:d5edb6e3edab 255 device.printf(" No Match on secondary either, ===setting return_val = Spoof ===\r\n");
electronichamsters 11:d5edb6e3edab 256 #endif
electronichamsters 11:d5edb6e3edab 257 return_val = ADVisSpoof; //it should still be zero, so this is just for clarification
electronichamsters 11:d5edb6e3edab 258 //at this point: MAC matches, MAC_Time doesn't match primary nor secondary.
electronichamsters 11:d5edb6e3edab 259 Spoof_Check[i].Attempt_Cnt = 0; //reset secondary count
electronichamsters 11:d5edb6e3edab 260
electronichamsters 11:d5edb6e3edab 261 }
electronichamsters 11:d5edb6e3edab 262 //update second backup regardless whether it matches exptected_mac_time matches secondary or not.
electronichamsters 11:d5edb6e3edab 263 Spoof_Check[i].Attempt_MAC_Time = Expected_MAC_Time;
electronichamsters 11:d5edb6e3edab 264 Spoof_Check[i].Xmit_Cnt = Received_Xmit_Cnt;
electronichamsters 11:d5edb6e3edab 265 }//if Primary MAC_Time doesn't match
electronichamsters 11:d5edb6e3edab 266
electronichamsters 11:d5edb6e3edab 267 break; //return_val tells us if this is a valid or not. Don't need to search through remainder of array
electronichamsters 11:d5edb6e3edab 268 }//if matching MAC address
electronichamsters 11:d5edb6e3edab 269 else //MAC doesn't match
electronichamsters 11:d5edb6e3edab 270 {
electronichamsters 11:d5edb6e3edab 271 //MAC doesn't match and we've searched through entire record
electronichamsters 11:d5edb6e3edab 272 //let's add this MAC as new, an initialze records to match this sensor
electronichamsters 11:d5edb6e3edab 273 if (i >= (sizeOfSpoof - 1)) //we've searched through entire array and didn't find this MAC
electronichamsters 11:d5edb6e3edab 274 {
electronichamsters 11:d5edb6e3edab 275 //we've searched through the entire array and didn't find this MAC address
electronichamsters 11:d5edb6e3edab 276 //add this MAC to array, and report this as valid MAC_Time
electronichamsters 11:d5edb6e3edab 277 #if MyDebugEnb
electronichamsters 11:d5edb6e3edab 278 device.printf("MAC not found, creating new at %d \r\n", Spoof_Ray_Tail);
electronichamsters 11:d5edb6e3edab 279 device.printf(" sizeOfSpoof=%d ... and i=%d \r\n", sizeOfSpoof, i);
electronichamsters 11:d5edb6e3edab 280 #endif
electronichamsters 11:d5edb6e3edab 281
electronichamsters 11:d5edb6e3edab 282 return_val = ADVisNew;
electronichamsters 11:d5edb6e3edab 283
electronichamsters 11:d5edb6e3edab 284 //create new entry for newly seen MAC @ tail
electronichamsters 11:d5edb6e3edab 285 // why refigure?? Spoof_Check[Spoof_Ray_Tail].MAC_Time = ((uint16_t)(Gateway_Time.read_ms()/1000)) - Received_MAC_Time;
electronichamsters 11:d5edb6e3edab 286 Spoof_Check[Spoof_Ray_Tail].MAC_Addr[0] = Received_MAC_Addr[0];
electronichamsters 11:d5edb6e3edab 287 Spoof_Check[Spoof_Ray_Tail].MAC_Addr[1] = Received_MAC_Addr[1];
electronichamsters 11:d5edb6e3edab 288 Spoof_Check[Spoof_Ray_Tail].MAC_Addr[2] = Received_MAC_Addr[2];
electronichamsters 11:d5edb6e3edab 289 Spoof_Check[Spoof_Ray_Tail].MAC_Addr[3] = Received_MAC_Addr[3];
electronichamsters 11:d5edb6e3edab 290 Spoof_Check[Spoof_Ray_Tail].MAC_Addr[4] = Received_MAC_Addr[4];
electronichamsters 11:d5edb6e3edab 291 Spoof_Check[Spoof_Ray_Tail].MAC_Addr[5] = Received_MAC_Addr[5];
electronichamsters 11:d5edb6e3edab 292 Spoof_Check[Spoof_Ray_Tail].Xmit_Cnt = Received_Xmit_Cnt;
electronichamsters 11:d5edb6e3edab 293
electronichamsters 11:d5edb6e3edab 294 //calculate Expected_MAC_Time
electronichamsters 11:d5edb6e3edab 295 Is_Birth_Time_Correct (0, Received_MAC_Time, 3);
electronichamsters 11:d5edb6e3edab 296 #if MyDebugEnb
electronichamsters 11:d5edb6e3edab 297 device.printf("Expected_MAC_Time should be %d \r\n", Expected_MAC_Time);
electronichamsters 11:d5edb6e3edab 298
electronichamsters 11:d5edb6e3edab 299 #endif
electronichamsters 11:d5edb6e3edab 300 Spoof_Check[Spoof_Ray_Tail].MAC_Time = Expected_MAC_Time; //wrong!!!
electronichamsters 11:d5edb6e3edab 301 Spoof_Check[Spoof_Ray_Tail].Xmit_Cnt = Received_Xmit_Cnt;
electronichamsters 11:d5edb6e3edab 302 Spoof_Check[Spoof_Ray_Tail].Attempt_Cnt = 0;
electronichamsters 11:d5edb6e3edab 303
electronichamsters 11:d5edb6e3edab 304 //increment tail pointer to next position or wrap around
electronichamsters 11:d5edb6e3edab 305 //todo: might not be using the last index position of this array, not sure. Doesn't matter IDK.
electronichamsters 11:d5edb6e3edab 306 if (Spoof_Ray_Tail >= (sizeOfSpoof-1) ) //FIFO at end of array, return to beginning
electronichamsters 11:d5edb6e3edab 307 {
electronichamsters 11:d5edb6e3edab 308 Spoof_Ray_Tail = 0;
electronichamsters 11:d5edb6e3edab 309 }
electronichamsters 11:d5edb6e3edab 310 else
electronichamsters 11:d5edb6e3edab 311 {
electronichamsters 11:d5edb6e3edab 312 Spoof_Ray_Tail++;
electronichamsters 11:d5edb6e3edab 313 }
electronichamsters 11:d5edb6e3edab 314
electronichamsters 11:d5edb6e3edab 315 }//end if loop at end of array
electronichamsters 11:d5edb6e3edab 316 }//end else not maching MAC
electronichamsters 11:d5edb6e3edab 317
electronichamsters 11:d5edb6e3edab 318 }//loop through Spoof_Check array
electronichamsters 11:d5edb6e3edab 319
electronichamsters 11:d5edb6e3edab 320
electronichamsters 11:d5edb6e3edab 321 return return_val;
electronichamsters 11:d5edb6e3edab 322 }//end Is_Not_Spoofed()
electronichamsters 11:d5edb6e3edab 323
electronichamsters 11:d5edb6e3edab 324
electronichamsters 11:d5edb6e3edab 325
electronichamsters 11:d5edb6e3edab 326
electronichamsters 11:d5edb6e3edab 327 void periodicCallback(void) //every 1800 seconds = 30 minutes, max for ticker.
electronichamsters 11:d5edb6e3edab 328 {
electronichamsters 11:d5edb6e3edab 329 #if MyDebugEnb
electronichamsters 11:d5edb6e3edab 330 device.printf("===== reset timer ===== \r\n");
electronichamsters 11:d5edb6e3edab 331 #endif
electronichamsters 9:1ea51b2048a8 332 //led1 = !led1; /* Do blinky on LED1 while we're waiting for BLE events */
electronichamsters 9:1ea51b2048a8 333 //device.printf("periodic 5...");
electronichamsters 9:1ea51b2048a8 334 //device.printf("\r\n");
electronichamsters 11:d5edb6e3edab 335 Gateway_Time.reset();
electronichamsters 11:d5edb6e3edab 336 }
electronichamsters 11:d5edb6e3edab 337
electronichamsters 11:d5edb6e3edab 338
electronichamsters 11:d5edb6e3edab 339 //with the current beacon, I see 3 valid advertisements per wake period with ambient other beacons. sometimes 4.
electronichamsters 11:d5edb6e3edab 340 //even with 2 phones broadcasting at 10Hz, still see 3 adv's.
electronichamsters 11:d5edb6e3edab 341 bool is_ours(const uint8_t * adv_data, const uint8_t * adv_address)
electronichamsters 11:d5edb6e3edab 342 {
electronichamsters 11:d5edb6e3edab 343 //if ((adv_data[5] == adv_address[3]) && (adv_data[6] == adv_address[2]) && (adv_data[7] == adv_address[1]) && (adv_data[8] == adv_address[0]))
electronichamsters 11:d5edb6e3edab 344 if ((adv_data[5] == adv_address[3]) && (adv_data[6] == adv_address[2]))
electronichamsters 11:d5edb6e3edab 345 return 1;
electronichamsters 11:d5edb6e3edab 346 else
electronichamsters 11:d5edb6e3edab 347 return 0;
electronichamsters 8:46c5e0bfab05 348 }
electronichamsters 8:46c5e0bfab05 349
electronichamsters 9:1ea51b2048a8 350 void advertisementCallback(const Gap::AdvertisementCallbackParams_t *params) {
electronichamsters 8:46c5e0bfab05 351
electronichamsters 8:46c5e0bfab05 352
electronichamsters 9:1ea51b2048a8 353 //BLE MAC Address (6 bytes):
electronichamsters 9:1ea51b2048a8 354 // params->peerAddr[5]
electronichamsters 9:1ea51b2048a8 355 // params->peerAddr[4]
electronichamsters 9:1ea51b2048a8 356 // ...
electronichamsters 9:1ea51b2048a8 357 // params->peerAddr[0]
electronichamsters 9:1ea51b2048a8 358 //RSSI = params->rssi
electronichamsters 9:1ea51b2048a8 359 //Payload
electronichamsters 9:1ea51b2048a8 360 // params->advertisingData[#<advertisingDataLen]
electronichamsters 8:46c5e0bfab05 361
electronichamsters 8:46c5e0bfab05 362
electronichamsters 8:46c5e0bfab05 363
electronichamsters 9:1ea51b2048a8 364 // [<---MY DATA-->]
electronichamsters 9:1ea51b2048a8 365 //0x02 0x01 0x06 0x06 0xff D E C ? ?
electronichamsters 9:1ea51b2048a8 366 //0 1 2 3 4 5 6 7 8 9
electronichamsters 8:46c5e0bfab05 367
electronichamsters 9:1ea51b2048a8 368 if ( (params->advertisingDataLen) >= 8)
electronichamsters 9:1ea51b2048a8 369 {
electronichamsters 9:1ea51b2048a8 370 //if one of "ours", these UUID fields will be this value. Arbitrary "
electronichamsters 11:d5edb6e3edab 371
electronichamsters 11:d5edb6e3edab 372 //if ( (params->advertisingData[5] == 0x44) && (params->advertisingData[6] == 0x45) && (params->advertisingData[7]==0x43) )
electronichamsters 11:d5edb6e3edab 373 //if (is_ours(params->advertisingData[5],params->advertisingData[6],params->advertisingData[7], params->advertisingData[8], params->peerAddr[3], params->peerAddr[2], params->peerAddr[1], params->peerAddr[0] ))
electronichamsters 11:d5edb6e3edab 374 if (is_ours(params->advertisingData, params->peerAddr))
electronichamsters 9:1ea51b2048a8 375 {
electronichamsters 11:d5edb6e3edab 376 #if MyDebugEnb
electronichamsters 11:d5edb6e3edab 377 device.printf("----------- ADV CAll Back -----------------\r\n ");
electronichamsters 11:d5edb6e3edab 378 #endif
electronichamsters 11:d5edb6e3edab 379 //**************
electronichamsters 11:d5edb6e3edab 380 // Decrypt data
electronichamsters 11:d5edb6e3edab 381 //**************
electronichamsters 11:d5edb6e3edab 382 //prep array for deciphering the encrypted portion of advertisement
electronichamsters 11:d5edb6e3edab 383 //device.printf("\r\n copy adv length: %d \r\n", params->advertisingDataLen); //always 31
electronichamsters 11:d5edb6e3edab 384 for (int i = 0; i<16; i++)
electronichamsters 11:d5edb6e3edab 385 {
electronichamsters 11:d5edb6e3edab 386 src_buf[i]=params->advertisingData[i+15];
electronichamsters 11:d5edb6e3edab 387 #if MyDebugEnb
electronichamsters 11:d5edb6e3edab 388 //device.printf("%x ", src_buf[i]);
electronichamsters 11:d5edb6e3edab 389 #endif
electronichamsters 11:d5edb6e3edab 390 }
electronichamsters 11:d5edb6e3edab 391 #if MyDebugEnb
electronichamsters 11:d5edb6e3edab 392 //device.printf("...\r\n ");
electronichamsters 11:d5edb6e3edab 393 #endif
electronichamsters 11:d5edb6e3edab 394
electronichamsters 11:d5edb6e3edab 395
electronichamsters 11:d5edb6e3edab 396 mbedtls_aes_crypt_ecb( &aes, MBEDTLS_AES_DECRYPT, src_buf, des_buf ); //execution time not an issue
electronichamsters 11:d5edb6e3edab 397
electronichamsters 11:d5edb6e3edab 398
electronichamsters 11:d5edb6e3edab 399 #if MyDebugEnb
electronichamsters 11:d5edb6e3edab 400
electronichamsters 11:d5edb6e3edab 401 //device.printf("decoded first 16 bytes \r\n");
electronichamsters 11:d5edb6e3edab 402 for (int i = 0; i<16; i++)
electronichamsters 11:d5edb6e3edab 403 {
electronichamsters 11:d5edb6e3edab 404 //device.printf("%02x", params->advertisingData[index]);
electronichamsters 11:d5edb6e3edab 405 if (i < 2)
electronichamsters 11:d5edb6e3edab 406 {
electronichamsters 11:d5edb6e3edab 407 //device.printf("%x ", des_buf[i]);
electronichamsters 11:d5edb6e3edab 408 }
electronichamsters 11:d5edb6e3edab 409 else
electronichamsters 11:d5edb6e3edab 410 {
electronichamsters 11:d5edb6e3edab 411 //device.printf("%c ", des_buf[i]);
electronichamsters 11:d5edb6e3edab 412 }
electronichamsters 11:d5edb6e3edab 413 }
electronichamsters 11:d5edb6e3edab 414 //device.printf("done----- \r\n");
electronichamsters 11:d5edb6e3edab 415 #endif
electronichamsters 11:d5edb6e3edab 416 //save MAC address
electronichamsters 11:d5edb6e3edab 417 Received_MAC_Addr[0] = params->peerAddr[0];
electronichamsters 11:d5edb6e3edab 418 Received_MAC_Addr[1] = params->peerAddr[1];
electronichamsters 11:d5edb6e3edab 419 Received_MAC_Addr[2] = params->peerAddr[2];
electronichamsters 11:d5edb6e3edab 420 Received_MAC_Addr[3] = params->peerAddr[3];
electronichamsters 11:d5edb6e3edab 421 Received_MAC_Addr[4] = params->peerAddr[4];
electronichamsters 11:d5edb6e3edab 422 Received_MAC_Addr[5] = params->peerAddr[5];
electronichamsters 11:d5edb6e3edab 423
electronichamsters 11:d5edb6e3edab 424 uint16_t beacon_timer = des_buf[0] | (des_buf[1] << 8); //it's a 2 byte uint little endian
electronichamsters 11:d5edb6e3edab 425 Received_MAC_Time = beacon_timer;
electronichamsters 11:d5edb6e3edab 426 Received_Xmit_Cnt = des_buf[2];
electronichamsters 11:d5edb6e3edab 427
electronichamsters 11:d5edb6e3edab 428
electronichamsters 11:d5edb6e3edab 429
electronichamsters 9:1ea51b2048a8 430 /*
electronichamsters 9:1ea51b2048a8 431 BLE Received from MAC C2F154BB0AF9
electronichamsters 9:1ea51b2048a8 432 volt:3.11,mag:1
electronichamsters 9:1ea51b2048a8 433
electronichamsters 9:1ea51b2048a8 434 uart-transmit:
electronichamsters 9:1ea51b2048a8 435 mac:C2F154BB0AF9,rssi:##,volt:3.11,mag:1
electronichamsters 9:1ea51b2048a8 436
electronichamsters 9:1ea51b2048a8 437 /ble/C2F154BB0AF9/rssi
electronichamsters 9:1ea51b2048a8 438 /ble/C2F154BB0AF9/1st_token
electronichamsters 9:1ea51b2048a8 439 /ble/c2F153
electronichamsters 9:1ea51b2048a8 440
electronichamsters 9:1ea51b2048a8 441 */
electronichamsters 9:1ea51b2048a8 442 /*
electronichamsters 9:1ea51b2048a8 443 device.printf("Adv peerAddr: [%02x%02x%02x%02x%02x%02x] rssi %d, ScanResp: %u, AdvType: %u\r\n",
electronichamsters 9:1ea51b2048a8 444 params->peerAddr[5], params->peerAddr[4], params->peerAddr[3], params->peerAddr[2], params->peerAddr[1], params->peerAddr[0],
electronichamsters 9:1ea51b2048a8 445 params->rssi, params->isScanResponse, params->type);
electronichamsters 9:1ea51b2048a8 446 */
electronichamsters 9:1ea51b2048a8 447
electronichamsters 11:d5edb6e3edab 448 // punch out the data as json
electronichamsters 11:d5edb6e3edab 449 //---------------------------------------
electronichamsters 11:d5edb6e3edab 450 // 1. MAC and RSSI
electronichamsters 11:d5edb6e3edab 451 // "mac":xxxxxxxx,rssi:xx,
electronichamsters 11:d5edb6e3edab 452 //---------------------------------------
electronichamsters 11:d5edb6e3edab 453 uint8_t ADV_Result = Is_Not_Spoofed();
electronichamsters 11:d5edb6e3edab 454 #if MyDebugEnb
electronichamsters 11:d5edb6e3edab 455 device.printf("--------ADV_Result = %d", ADV_Result);
electronichamsters 11:d5edb6e3edab 456 #endif
electronichamsters 11:d5edb6e3edab 457
electronichamsters 11:d5edb6e3edab 458
electronichamsters 11:d5edb6e3edab 459 if (ADV_Result == ADVisNew)
electronichamsters 9:1ea51b2048a8 460 {
electronichamsters 11:d5edb6e3edab 461 device.printf("{\"mac\":\"%02x%02x%02x%02x%02x%02x\",\"rssi\":%d,",
electronichamsters 11:d5edb6e3edab 462 params->peerAddr[5],
electronichamsters 11:d5edb6e3edab 463 params->peerAddr[4],
electronichamsters 11:d5edb6e3edab 464 params->peerAddr[3],
electronichamsters 11:d5edb6e3edab 465 params->peerAddr[2],
electronichamsters 11:d5edb6e3edab 466 params->peerAddr[1],
electronichamsters 11:d5edb6e3edab 467 params->peerAddr[0],
electronichamsters 11:d5edb6e3edab 468 params->rssi
electronichamsters 11:d5edb6e3edab 469 );
electronichamsters 11:d5edb6e3edab 470 //mac:"c2f154bb0af9"
electronichamsters 11:d5edb6e3edab 471
electronichamsters 11:d5edb6e3edab 472 //---------------------------------------
electronichamsters 11:d5edb6e3edab 473 // 2. Volt
electronichamsters 11:d5edb6e3edab 474 // "volt":3.03,
electronichamsters 11:d5edb6e3edab 475 //---------------------------------------
electronichamsters 11:d5edb6e3edab 476 device.printf("\"volt\":%c%c%c%c,",
electronichamsters 11:d5edb6e3edab 477 params->advertisingData[9],
electronichamsters 11:d5edb6e3edab 478 params->advertisingData[10],
electronichamsters 11:d5edb6e3edab 479 params->advertisingData[11],
electronichamsters 11:d5edb6e3edab 480 params->advertisingData[12]);
electronichamsters 11:d5edb6e3edab 481
electronichamsters 11:d5edb6e3edab 482
electronichamsters 11:d5edb6e3edab 483
electronichamsters 11:d5edb6e3edab 484
electronichamsters 11:d5edb6e3edab 485 //---------------------------------------
electronichamsters 11:d5edb6e3edab 486 // 3. clock
electronichamsters 11:d5edb6e3edab 487 // "tmr":xxx,
electronichamsters 11:d5edb6e3edab 488 //---------------------------------------
electronichamsters 11:d5edb6e3edab 489 //print clock
electronichamsters 11:d5edb6e3edab 490 // "tmr":3232,
electronichamsters 11:d5edb6e3edab 491 //---------------------------------------
electronichamsters 11:d5edb6e3edab 492
electronichamsters 11:d5edb6e3edab 493 device.printf("\"tmr\":%d,", beacon_timer);
electronichamsters 11:d5edb6e3edab 494 //device.printf("\"tmr\":%d,", des_buf[0]);
electronichamsters 11:d5edb6e3edab 495 device.printf("\"xmit_cnt\":%d,", Received_Xmit_Cnt);
electronichamsters 11:d5edb6e3edab 496
electronichamsters 11:d5edb6e3edab 497 //---------------------------------------
electronichamsters 11:d5edb6e3edab 498 // 4. rest of payload as json
electronichamsters 11:d5edb6e3edab 499 // "tmr":xxx,
electronichamsters 11:d5edb6e3edab 500 //---------------------------------------
electronichamsters 11:d5edb6e3edab 501 for (int i = 3; i< 16; i++)
electronichamsters 9:1ea51b2048a8 502 {
electronichamsters 11:d5edb6e3edab 503 //device.printf("%02x", params->advertisingData[index]);
electronichamsters 11:d5edb6e3edab 504 device.printf("%c", des_buf[i]); //print as character
electronichamsters 9:1ea51b2048a8 505 }
electronichamsters 11:d5edb6e3edab 506
electronichamsters 11:d5edb6e3edab 507
electronichamsters 11:d5edb6e3edab 508
electronichamsters 11:d5edb6e3edab 509 /*
electronichamsters 11:d5edb6e3edab 510 for (unsigned index = 8; index < params->advertisingDataLen; index++)
electronichamsters 9:1ea51b2048a8 511 {
electronichamsters 9:1ea51b2048a8 512 //device.printf("%02x", params->advertisingData[index]);
electronichamsters 9:1ea51b2048a8 513 device.printf("%c", params->advertisingData[index]);
electronichamsters 11:d5edb6e3edab 514 }
electronichamsters 11:d5edb6e3edab 515 */
electronichamsters 11:d5edb6e3edab 516
electronichamsters 11:d5edb6e3edab 517 device.printf("}");
electronichamsters 11:d5edb6e3edab 518 device.printf("\r\n");
electronichamsters 11:d5edb6e3edab 519
electronichamsters 11:d5edb6e3edab 520 /*
electronichamsters 11:d5edb6e3edab 521 mac:c2f154bb0af9,rssi:-55,volt:3.05,mag:1
electronichamsters 11:d5edb6e3edab 522 mac:c2f154bb0af9,rssi:-67,volt:3.05,mag:1
electronichamsters 11:d5edb6e3edab 523 mac:c2f154bb0af9,rssi:-60,volt:3.07,mag:0
electronichamsters 11:d5edb6e3edab 524 */
electronichamsters 9:1ea51b2048a8 525 }
electronichamsters 11:d5edb6e3edab 526 if (ADV_Result == ADVisDuplicate)
electronichamsters 9:1ea51b2048a8 527 {
electronichamsters 11:d5edb6e3edab 528 device.printf("{\"mac\":\"%02x%02x%02x%02x%02x%02x\",\"duplicate\": %d}\r\n",
electronichamsters 11:d5edb6e3edab 529 params->peerAddr[5],
electronichamsters 11:d5edb6e3edab 530 params->peerAddr[4],
electronichamsters 11:d5edb6e3edab 531 params->peerAddr[3],
electronichamsters 11:d5edb6e3edab 532 params->peerAddr[2],
electronichamsters 11:d5edb6e3edab 533 params->peerAddr[1],
electronichamsters 11:d5edb6e3edab 534 params->peerAddr[0],
electronichamsters 11:d5edb6e3edab 535 ADV_Result);
electronichamsters 9:1ea51b2048a8 536 }
electronichamsters 11:d5edb6e3edab 537 if (ADV_Result == ADVisSpoof)
electronichamsters 11:d5edb6e3edab 538 {
electronichamsters 11:d5edb6e3edab 539 device.printf("{\"mac\":\"%02x%02x%02x%02x%02x%02x\",\"spoof\": %d}\r\n",
electronichamsters 11:d5edb6e3edab 540 params->peerAddr[5],
electronichamsters 11:d5edb6e3edab 541 params->peerAddr[4],
electronichamsters 11:d5edb6e3edab 542 params->peerAddr[3],
electronichamsters 11:d5edb6e3edab 543 params->peerAddr[2],
electronichamsters 11:d5edb6e3edab 544 params->peerAddr[1],
electronichamsters 11:d5edb6e3edab 545 params->peerAddr[0],
electronichamsters 11:d5edb6e3edab 546 ADV_Result);
electronichamsters 11:d5edb6e3edab 547 }
electronichamsters 11:d5edb6e3edab 548 if (ADV_Result == ADVisUnknown)
electronichamsters 11:d5edb6e3edab 549 {
electronichamsters 11:d5edb6e3edab 550 device.printf("{\"mac\":\"%02x%02x%02x%02x%02x%02x\",\"unknown\": %d}\r\n",
electronichamsters 11:d5edb6e3edab 551 params->peerAddr[5],
electronichamsters 11:d5edb6e3edab 552 params->peerAddr[4],
electronichamsters 11:d5edb6e3edab 553 params->peerAddr[3],
electronichamsters 11:d5edb6e3edab 554 params->peerAddr[2],
electronichamsters 11:d5edb6e3edab 555 params->peerAddr[1],
electronichamsters 11:d5edb6e3edab 556 params->peerAddr[0],
electronichamsters 11:d5edb6e3edab 557 ADV_Result);
electronichamsters 11:d5edb6e3edab 558 }
electronichamsters 9:1ea51b2048a8 559 }//end if it's our adv
electronichamsters 9:1ea51b2048a8 560 }//end if advertisingDataLen
electronichamsters 8:46c5e0bfab05 561
electronichamsters 11:d5edb6e3edab 562 }//end advertisementCallback
electronichamsters 8:46c5e0bfab05 563
electronichamsters 8:46c5e0bfab05 564
electronichamsters 8:46c5e0bfab05 565
andresag 7:0a8bbb6dea16 566 /**
electronichamsters 9:1ea51b2048a8 567 * This function is called when the ble initialization process has failed
andresag 7:0a8bbb6dea16 568 */
andresag 7:0a8bbb6dea16 569 void onBleInitError(BLE &ble, ble_error_t error)
andresag 7:0a8bbb6dea16 570 {
andresag 7:0a8bbb6dea16 571 /* Initialization error handling should go here */
electronichamsters 9:1ea51b2048a8 572 device.printf("periodic callback ");
electronichamsters 9:1ea51b2048a8 573 device.printf("\r\n");
andresag 7:0a8bbb6dea16 574 }
andresag 7:0a8bbb6dea16 575
andresag 7:0a8bbb6dea16 576 /**
andresag 7:0a8bbb6dea16 577 * Callback triggered when the ble initialization process has finished
andresag 7:0a8bbb6dea16 578 */
andresag 7:0a8bbb6dea16 579 void bleInitComplete(BLE::InitializationCompleteCallbackContext *params)
sunsmile2015 2:b935358da5ba 580 {
andresag 7:0a8bbb6dea16 581 BLE& ble = params->ble;
andresag 7:0a8bbb6dea16 582 ble_error_t error = params->error;
andresag 7:0a8bbb6dea16 583
andresag 7:0a8bbb6dea16 584 if (error != BLE_ERROR_NONE) {
andresag 7:0a8bbb6dea16 585 /* In case of error, forward the error handling to onBleInitError */
andresag 7:0a8bbb6dea16 586 onBleInitError(ble, error);
andresag 7:0a8bbb6dea16 587 return;
andresag 7:0a8bbb6dea16 588 }
andresag 7:0a8bbb6dea16 589
andresag 7:0a8bbb6dea16 590 /* Ensure that it is the default instance of BLE */
andresag 7:0a8bbb6dea16 591 if(ble.getInstanceID() != BLE::DEFAULT_INSTANCE) {
andresag 7:0a8bbb6dea16 592 return;
andresag 7:0a8bbb6dea16 593 }
electronichamsters 9:1ea51b2048a8 594
electronichamsters 9:1ea51b2048a8 595 // in ms. Duty cycle = (interval / window); 200ms/500ms = 40%
electronichamsters 9:1ea51b2048a8 596 ble.gap().setScanParams(500 /* scan interval */, 200 /* scan window */);
electronichamsters 9:1ea51b2048a8 597 ble.gap().startScan(advertisementCallback);
sunsmile2015 4:e5fa4c8838db 598 }
sunsmile2015 4:e5fa4c8838db 599
sunsmile2015 2:b935358da5ba 600 int main(void)
sunsmile2015 2:b935358da5ba 601 {
electronichamsters 11:d5edb6e3edab 602 for (int i=0; i<sizeOfSpoof; i++)
electronichamsters 11:d5edb6e3edab 603 {
electronichamsters 11:d5edb6e3edab 604 Spoof_Check[i].MAC_Addr[0]= 0;
electronichamsters 11:d5edb6e3edab 605 Spoof_Check[i].MAC_Addr[1]= 0;
electronichamsters 11:d5edb6e3edab 606 Spoof_Check[i].MAC_Addr[2]= 0;
electronichamsters 11:d5edb6e3edab 607 Spoof_Check[i].MAC_Time = 0;
electronichamsters 11:d5edb6e3edab 608 Spoof_Check[i].Attempt_MAC_Time = 0;
electronichamsters 11:d5edb6e3edab 609 Spoof_Check[i].Attempt_Cnt = 0;
electronichamsters 11:d5edb6e3edab 610 Spoof_Check[i].Attempt_Cnt = 0;
electronichamsters 11:d5edb6e3edab 611 Spoof_Check[i].Xmit_Cnt = 0;
electronichamsters 11:d5edb6e3edab 612 }
electronichamsters 11:d5edb6e3edab 613
electronichamsters 11:d5edb6e3edab 614 Gateway_Time.start();
electronichamsters 8:46c5e0bfab05 615 device.baud(9600);
electronichamsters 11:d5edb6e3edab 616 device.printf("started main 06 hashed observer... ");
electronichamsters 8:46c5e0bfab05 617 device.printf("\r\n");
electronichamsters 11:d5edb6e3edab 618 ticker.attach(periodicCallback, Periodicity);
electronichamsters 8:46c5e0bfab05 619
electronichamsters 9:1ea51b2048a8 620 //mbedtls_aes_init(&aes);
electronichamsters 9:1ea51b2048a8 621 mbedtls_aes_setkey_dec( &aes, iv, 128 );
electronichamsters 9:1ea51b2048a8 622 //mbedtls_aes_crypt_ecb( &aes, MBEDTLS_AES_DECRYPT, input, output );
sunsmile2015 0:3dc6e424dba0 623
andresag 7:0a8bbb6dea16 624 BLE &ble = BLE::Instance();
andresag 7:0a8bbb6dea16 625 ble.init(bleInitComplete);
rgrover1 5:f4d74a8cad43 626
sunsmile2015 0:3dc6e424dba0 627 while (true) {
electronichamsters 9:1ea51b2048a8 628 ble.waitForEvent();
electronichamsters 9:1ea51b2048a8 629 }
electronichamsters 9:1ea51b2048a8 630 }