imob

Dependencies:   mbedtls mbed BLE_API nRF51822 AccelSensor

Committer:
osilvam
Date:
Sat Mar 20 19:09:06 2021 +0000
Revision:
1:471d502617fe
Parent:
0:5284859bb3e8
last version

Who changed what in which revision?

UserRevisionLine numberNew contents of line
osilvam 0:5284859bb3e8 1 #ifndef __BLE_IMOB_STATE_SERVICE_H__
osilvam 0:5284859bb3e8 2 #define __BLE_IMOB_STATE_SERVICE_H__
osilvam 0:5284859bb3e8 3
osilvam 0:5284859bb3e8 4 #include "mbed.h"
osilvam 0:5284859bb3e8 5 #include "ble/BLE.h"
osilvam 0:5284859bb3e8 6 #include "ble/Gap.h"
osilvam 0:5284859bb3e8 7 #include "crypt.h"
osilvam 0:5284859bb3e8 8
osilvam 0:5284859bb3e8 9 #include "softdevice_handler.h"
osilvam 0:5284859bb3e8 10
osilvam 0:5284859bb3e8 11 #define PASSLEN 16
osilvam 0:5284859bb3e8 12 #define KEYLEN 16
osilvam 0:5284859bb3e8 13 #define MACLEN 6
osilvam 0:5284859bb3e8 14
osilvam 0:5284859bb3e8 15 static bool authenticated = false;
osilvam 0:5284859bb3e8 16 static bool activated = false;
osilvam 0:5284859bb3e8 17 static bool userIsConnected = false;
osilvam 0:5284859bb3e8 18 static bool initial_activation = false;
osilvam 0:5284859bb3e8 19
osilvam 0:5284859bb3e8 20 uint8_t defaultPass[PASSLEN] = {0};
osilvam 0:5284859bb3e8 21 uint8_t defaultMac[MACLEN] = {0};
osilvam 0:5284859bb3e8 22
osilvam 0:5284859bb3e8 23 bool equal_arrays(uint8_t a1 [], const uint8_t a2 [], uint8_t n)
osilvam 0:5284859bb3e8 24 {
osilvam 0:5284859bb3e8 25 for (uint8_t i = 0; i < n; ++i)
osilvam 0:5284859bb3e8 26 if (a1[i] != a2[i])
osilvam 0:5284859bb3e8 27 return false;
osilvam 0:5284859bb3e8 28 return (true);
osilvam 0:5284859bb3e8 29 }
osilvam 0:5284859bb3e8 30
osilvam 0:5284859bb3e8 31 class ImobStateService {
osilvam 0:5284859bb3e8 32 public:
osilvam 0:5284859bb3e8 33 const static uint16_t IMOB_STATE_SERVICE_UUID = 0xA000;
osilvam 0:5284859bb3e8 34 const static uint16_t IMOB_STATE_PASS_CHARACTERISTIC_UUID = 0xA001;
osilvam 0:5284859bb3e8 35 const static uint16_t IMOB_STATE_NONCE_CHARACTERISTIC_UUID = 0xA002;
osilvam 0:5284859bb3e8 36 const static uint16_t IMOB_STATE_NONCE_UPDATED_CHARACTERISTIC_UUID = 0xA003;
osilvam 0:5284859bb3e8 37 const static uint16_t IMOB_STATE_AUTHENTICATION_CHARACTERISTIC_UUID = 0xA004;
osilvam 0:5284859bb3e8 38 const static uint16_t IMOB_STATE_ACTIVATION_CHARACTERISTIC_UUID = 0xA005;
osilvam 0:5284859bb3e8 39
osilvam 0:5284859bb3e8 40 ImobStateService(BLEDevice &_ble) :
osilvam 0:5284859bb3e8 41 ble(_ble),
osilvam 0:5284859bb3e8 42 passUpdated(false),
osilvam 0:5284859bb3e8 43 nonceUpdated(false),
osilvam 0:5284859bb3e8 44 activation(0),
osilvam 0:5284859bb3e8 45 authentication(0),
osilvam 0:5284859bb3e8 46 passCharacteristic(IMOB_STATE_PASS_CHARACTERISTIC_UUID, defaultPass),
osilvam 0:5284859bb3e8 47 nonceCharacteristic(IMOB_STATE_NONCE_CHARACTERISTIC_UUID, defaultPass),
osilvam 0:5284859bb3e8 48 nonceUpdatedCharacteristic(IMOB_STATE_NONCE_UPDATED_CHARACTERISTIC_UUID, (uint8_t*)&nonceUpdated),
osilvam 0:5284859bb3e8 49 activationCharacteristic(IMOB_STATE_ACTIVATION_CHARACTERISTIC_UUID, &activation),
osilvam 0:5284859bb3e8 50 authenticationCharacteristic(IMOB_STATE_AUTHENTICATION_CHARACTERISTIC_UUID, &authentication)
osilvam 0:5284859bb3e8 51
osilvam 0:5284859bb3e8 52 {
osilvam 0:5284859bb3e8 53 GattCharacteristic *charTable[] = {&passCharacteristic, &nonceCharacteristic, &nonceUpdatedCharacteristic, &activationCharacteristic, &authenticationCharacteristic};
osilvam 0:5284859bb3e8 54 GattService imobStateService(IMOB_STATE_SERVICE_UUID, charTable, sizeof(charTable) / sizeof(GattCharacteristic *));
osilvam 0:5284859bb3e8 55
osilvam 0:5284859bb3e8 56 ble.addService(imobStateService);
osilvam 0:5284859bb3e8 57
osilvam 0:5284859bb3e8 58 ble.gap().onDisconnection(this, &ImobStateService::onDisconnectionFilter);
osilvam 0:5284859bb3e8 59 ble.gap().onConnection(this, &ImobStateService::onConnectionFilter);
osilvam 0:5284859bb3e8 60 ble.gattServer().onDataWritten(this, &ImobStateService::onDataWritten);
osilvam 0:5284859bb3e8 61
osilvam 0:5284859bb3e8 62 resetAuthenticationValues();
osilvam 0:5284859bb3e8 63
osilvam 0:5284859bb3e8 64 for(uint8_t i = 0; i < PASSLEN;i++)
osilvam 0:5284859bb3e8 65 correctPass[i] = defaultPass[i];
osilvam 0:5284859bb3e8 66
osilvam 0:5284859bb3e8 67 for(uint8_t i = 0; i < KEYLEN;i++)
osilvam 0:5284859bb3e8 68 p_ecb_key[i] = defaultPass[i];
osilvam 0:5284859bb3e8 69
osilvam 0:5284859bb3e8 70 for(uint8_t i = 0; i < MACLEN;i++)
osilvam 0:5284859bb3e8 71 recentMac[i] = defaultMac[i];
osilvam 0:5284859bb3e8 72
osilvam 0:5284859bb3e8 73 }
osilvam 0:5284859bb3e8 74
osilvam 0:5284859bb3e8 75 void resetAuthenticationValues()
osilvam 0:5284859bb3e8 76 {
osilvam 0:5284859bb3e8 77 updateAuthenticationValue(false);
osilvam 0:5284859bb3e8 78
osilvam 0:5284859bb3e8 79 passUpdated = false;
osilvam 0:5284859bb3e8 80
osilvam 0:5284859bb3e8 81 for(uint8_t i = 0; i < PASSLEN; i++)
osilvam 0:5284859bb3e8 82 pass[i] = defaultPass[i];
osilvam 0:5284859bb3e8 83
osilvam 0:5284859bb3e8 84 ble.updateCharacteristicValue(passCharacteristic.getValueHandle(), pass, PASSLEN);
osilvam 0:5284859bb3e8 85 }
osilvam 0:5284859bb3e8 86
osilvam 0:5284859bb3e8 87 void updateAuthenticationPassValues(const uint8_t newpass[PASSLEN])
osilvam 0:5284859bb3e8 88 {
osilvam 0:5284859bb3e8 89 passUpdated = true;
osilvam 0:5284859bb3e8 90
osilvam 0:5284859bb3e8 91 for(uint8_t i = 0; i < PASSLEN;i++)
osilvam 0:5284859bb3e8 92 pass[i] = newpass[i];
osilvam 0:5284859bb3e8 93
osilvam 0:5284859bb3e8 94 ctr_init(nonce, p_ecb_key);//solo para pruebas!!!
osilvam 0:5284859bb3e8 95 ctr_encrypt(pass);// se encripta en este punto solo para pruebas
osilvam 0:5284859bb3e8 96 ctr_init(nonce, p_ecb_key); // debería llegar la pass encriptada. ctr_init se llama para reiniciar el contador de paquetes
osilvam 0:5284859bb3e8 97 ctr_decrypt(pass);
osilvam 0:5284859bb3e8 98 }
osilvam 0:5284859bb3e8 99
osilvam 0:5284859bb3e8 100 void updateAuthenticationNonceValues(const uint8_t newnonce[PASSLEN])
osilvam 0:5284859bb3e8 101 {
osilvam 0:5284859bb3e8 102 updateNonceUpdatedValue(true);
osilvam 0:5284859bb3e8 103
osilvam 0:5284859bb3e8 104 for(uint8_t i = 0; i < PASSLEN;i++)
osilvam 0:5284859bb3e8 105 nonce[i] = newnonce[i];
osilvam 0:5284859bb3e8 106
osilvam 0:5284859bb3e8 107 nonce_generate(nonce);// se sobreescribe el nonce para las pruebas (no se toma el nonce entrante)
osilvam 0:5284859bb3e8 108 ble.updateCharacteristicValue(nonceCharacteristic.getValueHandle(),nonce,PASSLEN);
osilvam 0:5284859bb3e8 109 ctr_init(nonce, p_ecb_key);
osilvam 0:5284859bb3e8 110 }
osilvam 0:5284859bb3e8 111
osilvam 0:5284859bb3e8 112 void updateNonceUpdatedValue(bool value)
osilvam 0:5284859bb3e8 113 {
osilvam 0:5284859bb3e8 114 nonceUpdated = value;
osilvam 0:5284859bb3e8 115 uint8_t aux_nonceUpdated = (nonceUpdated) ? 1: 0;
osilvam 0:5284859bb3e8 116 ble.gattServer().write(nonceUpdatedCharacteristic.getValueHandle(), &aux_nonceUpdated, 1);
osilvam 0:5284859bb3e8 117
osilvam 0:5284859bb3e8 118 }
osilvam 0:5284859bb3e8 119
osilvam 0:5284859bb3e8 120 void updateAuthenticationValue(bool value)
osilvam 0:5284859bb3e8 121 {
osilvam 0:5284859bb3e8 122 authenticated = value;
osilvam 0:5284859bb3e8 123 authentication = (authenticated) ? 1: 0;
osilvam 0:5284859bb3e8 124 ble.gattServer().write(authenticationCharacteristic.getValueHandle(), &authentication, 1);
osilvam 0:5284859bb3e8 125 }
osilvam 0:5284859bb3e8 126
osilvam 0:5284859bb3e8 127 void updateActivationValue(const uint8_t value)
osilvam 0:5284859bb3e8 128 {
osilvam 0:5284859bb3e8 129 activated = (value == 1) ? true: false;
osilvam 0:5284859bb3e8 130 activation = (activated) ? 1: 0;
osilvam 0:5284859bb3e8 131 ble.gattServer().write(activationCharacteristic.getValueHandle(), &activation, 1);
osilvam 0:5284859bb3e8 132 }
osilvam 0:5284859bb3e8 133
osilvam 0:5284859bb3e8 134 void setCorrectPass(const uint8_t * newCorrectPass)
osilvam 0:5284859bb3e8 135 {
osilvam 0:5284859bb3e8 136 for(uint8_t i = 0; i < PASSLEN;i++)
osilvam 0:5284859bb3e8 137 correctPass[i] = newCorrectPass[i];
osilvam 0:5284859bb3e8 138 }
osilvam 0:5284859bb3e8 139
osilvam 0:5284859bb3e8 140 void setCryptKey(const uint8_t * newCryptKey)
osilvam 0:5284859bb3e8 141 {
osilvam 0:5284859bb3e8 142 for(uint8_t i = 0; i < PASSLEN;i++)
osilvam 0:5284859bb3e8 143 p_ecb_key[i] = newCryptKey[i];
osilvam 0:5284859bb3e8 144 }
osilvam 0:5284859bb3e8 145
osilvam 0:5284859bb3e8 146 protected:
osilvam 0:5284859bb3e8 147 virtual void onDataWritten(const GattWriteCallbackParams *params)
osilvam 0:5284859bb3e8 148 {
osilvam 0:5284859bb3e8 149 if ((params->handle == passCharacteristic.getValueHandle()) && (params->len == PASSLEN) && (nonceUpdated))
osilvam 0:5284859bb3e8 150 {
osilvam 0:5284859bb3e8 151 updateAuthenticationPassValues((params->data));
osilvam 0:5284859bb3e8 152 }
osilvam 0:5284859bb3e8 153 else if ((params->handle == nonceCharacteristic.getValueHandle()) && (params->len == PASSLEN))
osilvam 0:5284859bb3e8 154 {
osilvam 0:5284859bb3e8 155 updateAuthenticationNonceValues((params->data));
osilvam 0:5284859bb3e8 156 }
osilvam 0:5284859bb3e8 157 else if ((params->handle == activationCharacteristic.getValueHandle()) && (params->len == 1) && authenticated)
osilvam 0:5284859bb3e8 158 {
osilvam 0:5284859bb3e8 159 updateActivationValue(*(params->data));
osilvam 0:5284859bb3e8 160 }
osilvam 0:5284859bb3e8 161
osilvam 0:5284859bb3e8 162 if(passUpdated)
osilvam 0:5284859bb3e8 163 {
osilvam 0:5284859bb3e8 164 if(equal_arrays(pass, correctPass, PASSLEN))
osilvam 0:5284859bb3e8 165 {
osilvam 0:5284859bb3e8 166 updateAuthenticationValue(true);
osilvam 0:5284859bb3e8 167 initial_activation = true;
osilvam 0:5284859bb3e8 168 }
osilvam 0:5284859bb3e8 169 else
osilvam 0:5284859bb3e8 170 {
osilvam 0:5284859bb3e8 171 resetAuthenticationValues();
osilvam 0:5284859bb3e8 172 }
osilvam 0:5284859bb3e8 173 }
osilvam 0:5284859bb3e8 174 }
osilvam 0:5284859bb3e8 175
osilvam 0:5284859bb3e8 176 void onDisconnectionFilter(const Gap::DisconnectionCallbackParams_t *params)
osilvam 0:5284859bb3e8 177 {
osilvam 0:5284859bb3e8 178 resetAuthenticationValues();
osilvam 0:5284859bb3e8 179 userIsConnected = false;
osilvam 0:5284859bb3e8 180 }
osilvam 0:5284859bb3e8 181
osilvam 0:5284859bb3e8 182 void onConnectionFilter(const Gap::ConnectionCallbackParams_t* params)
osilvam 0:5284859bb3e8 183 {
osilvam 0:5284859bb3e8 184 uint8_t newMac[MACLEN];
osilvam 0:5284859bb3e8 185 for(uint8_t i = 0; i < 6; i++)
osilvam 0:5284859bb3e8 186 newMac[i] = params->peerAddr[i];
osilvam 0:5284859bb3e8 187
osilvam 0:5284859bb3e8 188 if(!equal_arrays(recentMac, newMac, MACLEN))
osilvam 0:5284859bb3e8 189 {
osilvam 0:5284859bb3e8 190 for(uint8_t i = 0; i < 6; i++)
osilvam 0:5284859bb3e8 191 recentMac[i] = newMac[i];
osilvam 0:5284859bb3e8 192
osilvam 0:5284859bb3e8 193 updateNonceUpdatedValue(false);
osilvam 0:5284859bb3e8 194
osilvam 0:5284859bb3e8 195 for(uint8_t i = 0; i < PASSLEN; i++)
osilvam 0:5284859bb3e8 196 nonce[i] = defaultPass[i];
osilvam 0:5284859bb3e8 197
osilvam 0:5284859bb3e8 198 ble.updateCharacteristicValue(nonceCharacteristic.getValueHandle(), nonce, PASSLEN);
osilvam 0:5284859bb3e8 199 }
osilvam 0:5284859bb3e8 200
osilvam 0:5284859bb3e8 201 userIsConnected = true;
osilvam 0:5284859bb3e8 202 }
osilvam 0:5284859bb3e8 203
osilvam 0:5284859bb3e8 204 private:
osilvam 0:5284859bb3e8 205 BLEDevice &ble;
osilvam 0:5284859bb3e8 206 bool passUpdated;
osilvam 0:5284859bb3e8 207 bool nonceUpdated;
osilvam 0:5284859bb3e8 208
osilvam 0:5284859bb3e8 209 uint8_t pass[PASSLEN];
osilvam 0:5284859bb3e8 210 uint8_t nonce[PASSLEN];
osilvam 0:5284859bb3e8 211 uint8_t correctPass[PASSLEN];
osilvam 0:5284859bb3e8 212 uint8_t p_ecb_key[KEYLEN];
osilvam 0:5284859bb3e8 213
osilvam 0:5284859bb3e8 214 uint8_t recentMac[MACLEN];
osilvam 0:5284859bb3e8 215
osilvam 0:5284859bb3e8 216 uint8_t activation;
osilvam 0:5284859bb3e8 217 uint8_t authentication;
osilvam 0:5284859bb3e8 218
osilvam 0:5284859bb3e8 219 WriteOnlyArrayGattCharacteristic <uint8_t, sizeof(pass)> passCharacteristic;
osilvam 0:5284859bb3e8 220 WriteOnlyArrayGattCharacteristic <uint8_t, sizeof(pass)> nonceCharacteristic;
osilvam 0:5284859bb3e8 221
osilvam 0:5284859bb3e8 222 ReadOnlyGattCharacteristic < uint8_t > nonceUpdatedCharacteristic;
osilvam 0:5284859bb3e8 223 ReadWriteGattCharacteristic < uint8_t > activationCharacteristic;
osilvam 0:5284859bb3e8 224 ReadOnlyGattCharacteristic < uint8_t > authenticationCharacteristic;
osilvam 0:5284859bb3e8 225
osilvam 0:5284859bb3e8 226
osilvam 0:5284859bb3e8 227 };
osilvam 0:5284859bb3e8 228
osilvam 0:5284859bb3e8 229 #endif /* #ifndef __BLE_IMOB_STATE_SERVICE_H__ */