slave

Dependencies:   mbedtls-slave-prot-prod

Dependents:   _Prototipo_Produccion _Prototipo_Produccion

Committer:
pabloandres2906
Date:
Mon Jul 22 22:02:09 2019 +0000
Revision:
2:1141f1fb0761
Parent:
0:424cd8b7203c
Programa Slave

Who changed what in which revision?

UserRevisionLine numberNew contents of line
williequesada 0:424cd8b7203c 1 #include "Slave.h"
williequesada 0:424cd8b7203c 2 #include "mbed.h"
williequesada 0:424cd8b7203c 3 #include "stdio.h"
williequesada 0:424cd8b7203c 4 #include <string>
williequesada 0:424cd8b7203c 5
williequesada 0:424cd8b7203c 6 #include "mbedtls/rsa.h"
williequesada 0:424cd8b7203c 7 #include "mbedtls/pk.h"
williequesada 0:424cd8b7203c 8 #include "mbedtls/base64.h"
williequesada 0:424cd8b7203c 9 #include "mbedtls/ctr_drbg.h"
williequesada 0:424cd8b7203c 10 #include "mbedtls/error.h"
williequesada 0:424cd8b7203c 11 #include "mbedtls/ctr_drbg.h"
williequesada 0:424cd8b7203c 12 #include "mbedtls/platform.h"
williequesada 0:424cd8b7203c 13 #include "mbedtls/entropy.h"
williequesada 0:424cd8b7203c 14
williequesada 0:424cd8b7203c 15 #define NEXT_STEP 0x85
williequesada 0:424cd8b7203c 16 #define NEXT_SLEEP 0x86
williequesada 0:424cd8b7203c 17 #define NO_DATA 0x87
williequesada 0:424cd8b7203c 18
williequesada 0:424cd8b7203c 19 static const uint8_t PublicKeyTXT[] =
williequesada 0:424cd8b7203c 20 "-----BEGIN PUBLIC KEY-----\n"
williequesada 0:424cd8b7203c 21 "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCtlciI/Mk4fkxeOwiB0iwiBmoS\n"
williequesada 0:424cd8b7203c 22 "yhqQNKBg+KmzpZDcLkl8ShDY/BjZjW9UXYX8ptCHwV9WU4ltdA4fBTm51m52fOGv\n"
williequesada 0:424cd8b7203c 23 "ZPODurIbNEnaFMRn9hsDJRA6adz32XRQVsjQYLMnQnlaMYGKvuatHPPK/ZCuJRmd\n"
williequesada 0:424cd8b7203c 24 "ttiijs3t/bmCU/Vi8wIDAQAB\n"
williequesada 0:424cd8b7203c 25 "-----END PUBLIC KEY-----\n";
williequesada 0:424cd8b7203c 26
williequesada 0:424cd8b7203c 27 char Slave_Buffer[255];
williequesada 0:424cd8b7203c 28 int Slave_Counter=0;
williequesada 0:424cd8b7203c 29
williequesada 0:424cd8b7203c 30 uint8_t MessageDecrypt[] ="{\"municipio\":\"San Jose\",\"id\":\"1067\",\"place\":\"AAAA\",\"time\":\"000\",\"t2\":\"%5303105315252296=21080000000000000000?\"}";
williequesada 0:424cd8b7203c 31 uint8_t Encryption[200];
williequesada 0:424cd8b7203c 32 uint8_t Encryption1[200];
williequesada 0:424cd8b7203c 33 size_t *Olen2;
williequesada 0:424cd8b7203c 34
williequesada 0:424cd8b7203c 35 SLAVE::SLAVE(PinName TX, PinName RX,PinName AWAKE):Uart(TX,RX),_AWAKE(AWAKE)
williequesada 0:424cd8b7203c 36 {
williequesada 0:424cd8b7203c 37 _AWAKE=0;
williequesada 0:424cd8b7203c 38 Uart.attach(this,&SLAVE::UartInterruption);
williequesada 0:424cd8b7203c 39 }
williequesada 0:424cd8b7203c 40
williequesada 0:424cd8b7203c 41 bool SLAVE::Available()
williequesada 0:424cd8b7203c 42 {
williequesada 0:424cd8b7203c 43 if(Slave_Counter>0) {
williequesada 0:424cd8b7203c 44 return 1;
williequesada 0:424cd8b7203c 45 } else {
williequesada 0:424cd8b7203c 46 return 0;
williequesada 0:424cd8b7203c 47 }
williequesada 0:424cd8b7203c 48 }
williequesada 0:424cd8b7203c 49
williequesada 0:424cd8b7203c 50 bool SLAVE::Message()
williequesada 0:424cd8b7203c 51 {
williequesada 0:424cd8b7203c 52 if(Slave_Counter>4) {
williequesada 0:424cd8b7203c 53 return 1;
williequesada 0:424cd8b7203c 54 } else {
williequesada 0:424cd8b7203c 55 return 0;
williequesada 0:424cd8b7203c 56 }
williequesada 0:424cd8b7203c 57 }
williequesada 0:424cd8b7203c 58
williequesada 0:424cd8b7203c 59 void SLAVE::Command(uint8_t _Command)
williequesada 0:424cd8b7203c 60 {
williequesada 0:424cd8b7203c 61 if(Uart.writeable()) {
williequesada 0:424cd8b7203c 62 Uart.putc(_Command);
williequesada 0:424cd8b7203c 63 } else {
williequesada 0:424cd8b7203c 64 wait_ms(500);
williequesada 0:424cd8b7203c 65 if(Uart.writeable()) {
williequesada 0:424cd8b7203c 66 Uart.putc(_Command);
williequesada 0:424cd8b7203c 67 }
williequesada 0:424cd8b7203c 68 }
williequesada 0:424cd8b7203c 69 }
williequesada 0:424cd8b7203c 70
williequesada 0:424cd8b7203c 71 void SLAVE::Send_Hosting(char Parquimetro[],char Municipio[],char Estado[])
williequesada 0:424cd8b7203c 72 {
williequesada 0:424cd8b7203c 73 if(Uart.writeable()) {
williequesada 0:424cd8b7203c 74 Uart.printf("%s",Municipio);
williequesada 0:424cd8b7203c 75 Uart.printf("%s",Estado);
williequesada 0:424cd8b7203c 76 Uart.printf("%s",Parquimetro);
williequesada 0:424cd8b7203c 77 } else {
williequesada 0:424cd8b7203c 78 wait_ms(500);
williequesada 0:424cd8b7203c 79 if(Uart.writeable()) {
williequesada 0:424cd8b7203c 80 Uart.printf("%s",Municipio);
williequesada 0:424cd8b7203c 81 Uart.printf("%s",Estado);
williequesada 0:424cd8b7203c 82 Uart.printf("%s",Parquimetro);
williequesada 0:424cd8b7203c 83 }
williequesada 0:424cd8b7203c 84 }
williequesada 0:424cd8b7203c 85 }
williequesada 0:424cd8b7203c 86
williequesada 0:424cd8b7203c 87 void SLAVE::Encryption_Send()
williequesada 0:424cd8b7203c 88 {
williequesada 0:424cd8b7203c 89 if(Uart.writeable()) {
williequesada 0:424cd8b7203c 90 for(int i=0;i<172;i++){
williequesada 0:424cd8b7203c 91 Uart.putc(Encryption1[i]);
williequesada 0:424cd8b7203c 92
williequesada 0:424cd8b7203c 93 }
williequesada 0:424cd8b7203c 94 } else {
williequesada 0:424cd8b7203c 95 wait_ms(500);
williequesada 0:424cd8b7203c 96 if(Uart.writeable()) {
williequesada 0:424cd8b7203c 97 for(int i=0;i<172;i++){
williequesada 0:424cd8b7203c 98 Uart.putc(Encryption1[i]);
williequesada 0:424cd8b7203c 99 }
williequesada 0:424cd8b7203c 100 }
williequesada 0:424cd8b7203c 101 }
williequesada 0:424cd8b7203c 102 }
williequesada 0:424cd8b7203c 103
williequesada 0:424cd8b7203c 104 void SLAVE::Encryption_Print()
williequesada 0:424cd8b7203c 105 {
williequesada 0:424cd8b7203c 106 for(int i=0;i<172;i++){
williequesada 0:424cd8b7203c 107 printf("%c",Encryption1[i]);
williequesada 0:424cd8b7203c 108 }
williequesada 0:424cd8b7203c 109 printf("\n");
williequesada 0:424cd8b7203c 110 }
williequesada 0:424cd8b7203c 111
williequesada 0:424cd8b7203c 112 void SLAVE::Set_Time(int Time){
williequesada 0:424cd8b7203c 113 char TimeString[4];
williequesada 0:424cd8b7203c 114 if(Time<100) {
williequesada 0:424cd8b7203c 115 sprintf(TimeString,"0%i",Time);
williequesada 0:424cd8b7203c 116 } else {
williequesada 0:424cd8b7203c 117 sprintf(TimeString,"%i",Time);
williequesada 0:424cd8b7203c 118 }
williequesada 0:424cd8b7203c 119 MessageDecrypt[59]=TimeString[0];
williequesada 0:424cd8b7203c 120 MessageDecrypt[60]=TimeString[1];
williequesada 0:424cd8b7203c 121 MessageDecrypt[61]=TimeString[2];
williequesada 0:424cd8b7203c 122 }
williequesada 0:424cd8b7203c 123
williequesada 0:424cd8b7203c 124 void SLAVE::Set_Place(char Place[]){
williequesada 0:424cd8b7203c 125 MessageDecrypt[45]=Place[0];
williequesada 0:424cd8b7203c 126 MessageDecrypt[46]=Place[1];
williequesada 0:424cd8b7203c 127 MessageDecrypt[47]=Place[2];
williequesada 0:424cd8b7203c 128 MessageDecrypt[48]=Place[3];
williequesada 0:424cd8b7203c 129 }
williequesada 0:424cd8b7203c 130
williequesada 0:424cd8b7203c 131 void SLAVE::Set_Track(char Track2[]){
williequesada 0:424cd8b7203c 132 for(int i=0; i<37; i++) {
williequesada 0:424cd8b7203c 133 MessageDecrypt[71+i]=Track2[i];
williequesada 0:424cd8b7203c 134 }
williequesada 0:424cd8b7203c 135 }
williequesada 0:424cd8b7203c 136
williequesada 0:424cd8b7203c 137 void SLAVE::Encryption_Data(char Parquimetro[],char Municipio[],int Tiempo,char Espacio[],char Track2[]){
williequesada 0:424cd8b7203c 138 // Municipio
williequesada 0:424cd8b7203c 139 MessageDecrypt[14]=Municipio[0];
williequesada 0:424cd8b7203c 140 MessageDecrypt[15]=Municipio[1];
williequesada 0:424cd8b7203c 141 MessageDecrypt[16]=Municipio[2];
williequesada 0:424cd8b7203c 142 MessageDecrypt[17]=Municipio[3];
williequesada 0:424cd8b7203c 143 MessageDecrypt[18]=Municipio[4];
williequesada 0:424cd8b7203c 144 MessageDecrypt[19]=Municipio[5];
williequesada 0:424cd8b7203c 145 MessageDecrypt[20]=Municipio[6];
williequesada 0:424cd8b7203c 146 MessageDecrypt[21]=Municipio[7];
williequesada 0:424cd8b7203c 147 // Identificador
williequesada 0:424cd8b7203c 148 MessageDecrypt[30]=Parquimetro[0];
williequesada 0:424cd8b7203c 149 MessageDecrypt[31]=Parquimetro[1];
williequesada 0:424cd8b7203c 150 MessageDecrypt[32]=Parquimetro[2];
williequesada 0:424cd8b7203c 151 MessageDecrypt[33]=Parquimetro[3];
williequesada 0:424cd8b7203c 152 // Espacio
williequesada 0:424cd8b7203c 153 MessageDecrypt[45]=Espacio[0];
williequesada 0:424cd8b7203c 154 MessageDecrypt[46]=Espacio[1];
williequesada 0:424cd8b7203c 155 MessageDecrypt[47]=Espacio[2];
williequesada 0:424cd8b7203c 156 MessageDecrypt[48]=Espacio[3];
williequesada 0:424cd8b7203c 157 // Tiempo
williequesada 0:424cd8b7203c 158 char TiempoString[4];
williequesada 0:424cd8b7203c 159 if(Tiempo<100) {
williequesada 0:424cd8b7203c 160 sprintf(TiempoString,"0%i",Tiempo);
williequesada 0:424cd8b7203c 161 } else {
williequesada 0:424cd8b7203c 162 sprintf(TiempoString,"%i",Tiempo);
williequesada 0:424cd8b7203c 163 }
williequesada 0:424cd8b7203c 164 MessageDecrypt[59]=TiempoString[0];
williequesada 0:424cd8b7203c 165 MessageDecrypt[60]=TiempoString[1];
williequesada 0:424cd8b7203c 166 MessageDecrypt[61]=TiempoString[2];
williequesada 0:424cd8b7203c 167 // Track2
williequesada 0:424cd8b7203c 168 for(int i=0; i<37; i++) {
williequesada 0:424cd8b7203c 169 MessageDecrypt[71+i]=Track2[i];
williequesada 0:424cd8b7203c 170 }
williequesada 0:424cd8b7203c 171 }
williequesada 0:424cd8b7203c 172
williequesada 0:424cd8b7203c 173 void SLAVE::Encryption_Execute(){
williequesada 0:424cd8b7203c 174
williequesada 0:424cd8b7203c 175 mbedtls_entropy_context entropy;
williequesada 0:424cd8b7203c 176 mbedtls_entropy_init( &entropy );
williequesada 0:424cd8b7203c 177
williequesada 0:424cd8b7203c 178 mbedtls_ctr_drbg_context ctr_drbg;
williequesada 0:424cd8b7203c 179 mbedtls_ctr_drbg_init(&ctr_drbg);
williequesada 0:424cd8b7203c 180
williequesada 0:424cd8b7203c 181 mbedtls_pk_context PublicKey; // Crea la llave
williequesada 0:424cd8b7203c 182 mbedtls_pk_init(&PublicKey); // Inicializa la llave
williequesada 0:424cd8b7203c 183
williequesada 0:424cd8b7203c 184 int ret;
williequesada 0:424cd8b7203c 185 size_t olen = 0;
williequesada 0:424cd8b7203c 186 uint8_t error[100];
williequesada 0:424cd8b7203c 187 size_t errorlen=100;
williequesada 0:424cd8b7203c 188 const char *pers = "mbedtls_pk_encrypt";
williequesada 0:424cd8b7203c 189
williequesada 0:424cd8b7203c 190 // Se inicia el generador de entropia del MCU para obtner numeros aleatorios
williequesada 0:424cd8b7203c 191
williequesada 0:424cd8b7203c 192 if( ( ret = mbedtls_ctr_drbg_seed(&ctr_drbg, mbedtls_entropy_func, &entropy, (const unsigned char*)pers, strlen(pers))) != 0)
williequesada 0:424cd8b7203c 193 {
williequesada 0:424cd8b7203c 194 mbedtls_strerror(ret,(char*)error,errorlen);
williequesada 0:424cd8b7203c 195 } else {
williequesada 0:424cd8b7203c 196 printf( "Entropy generator ok\n");
williequesada 0:424cd8b7203c 197 }
williequesada 0:424cd8b7203c 198
williequesada 0:424cd8b7203c 199 // Iniciar la llave almacenada en al variable PublucKey para la encriptacion
williequesada 0:424cd8b7203c 200
williequesada 0:424cd8b7203c 201 if ((ret=mbedtls_pk_parse_public_key(&PublicKey, PublicKeyTXT, sizeof(PublicKeyTXT))) != 0)
williequesada 0:424cd8b7203c 202 {
williequesada 0:424cd8b7203c 203 printf( "Public key fail\n");
williequesada 0:424cd8b7203c 204 printf(" Ret: 0x%04x\n",ret);
williequesada 0:424cd8b7203c 205 mbedtls_strerror(ret,(char*)error,errorlen);
williequesada 0:424cd8b7203c 206 printf( "Error: %s\n",error);
williequesada 0:424cd8b7203c 207 } else {
williequesada 0:424cd8b7203c 208 //printf( "Public key ok ");
williequesada 0:424cd8b7203c 209 //SizeOutputKey=mbedtls_pk_get_len(&PublicKey);
williequesada 0:424cd8b7203c 210 //printf("--> %i\n\n",SizeOutputKey);
williequesada 0:424cd8b7203c 211 }
williequesada 0:424cd8b7203c 212
williequesada 0:424cd8b7203c 213 // Proceso de encriptacion donde se utilizan tanto el generador random como la key inicializadas
williequesada 0:424cd8b7203c 214
williequesada 0:424cd8b7203c 215 if ((ret=mbedtls_pk_encrypt(&PublicKey, MessageDecrypt, sizeof(MessageDecrypt)-1,Encryption, &olen, 200 ,mbedtls_ctr_drbg_random, &ctr_drbg)) != 0)
williequesada 0:424cd8b7203c 216 {
williequesada 0:424cd8b7203c 217 printf("Encrypt failed\n");
williequesada 0:424cd8b7203c 218 printf("Ret: 0x%04x, Olen: %i,\n",ret,olen);
williequesada 0:424cd8b7203c 219 mbedtls_strerror(ret,(char*)error,errorlen);
williequesada 0:424cd8b7203c 220 printf( "Error: %s\n",error);
williequesada 0:424cd8b7203c 221 }
williequesada 0:424cd8b7203c 222 else
williequesada 0:424cd8b7203c 223 {
williequesada 0:424cd8b7203c 224 //printf(" Encrypt ok\n");
williequesada 0:424cd8b7203c 225 //printf(" Ret: 0x%04x, Olen: %i,\n\n",ret,olen);
williequesada 0:424cd8b7203c 226 }
williequesada 0:424cd8b7203c 227
williequesada 0:424cd8b7203c 228 // Se convierte el resultado de la encriptacion a base 64 para eliminar caracteres invalidos
williequesada 0:424cd8b7203c 229
williequesada 0:424cd8b7203c 230 mbedtls_base64_encode(Encryption1,200,Olen2,Encryption,128);
williequesada 0:424cd8b7203c 231 //printf( "Mensaje encriptado: %s\n",Encryption1);
williequesada 0:424cd8b7203c 232 //printf( "Longitud encriptado: %i\n",Olen2);
williequesada 0:424cd8b7203c 233 printf( "Mensaje Original: %s\n", MessageDecrypt);
williequesada 0:424cd8b7203c 234
williequesada 0:424cd8b7203c 235 mbedtls_pk_free(&PublicKey); // Libera las variables usadas en el proceso
williequesada 0:424cd8b7203c 236 mbedtls_ctr_drbg_free(&ctr_drbg );
williequesada 0:424cd8b7203c 237 mbedtls_entropy_free(&entropy );
williequesada 0:424cd8b7203c 238
williequesada 0:424cd8b7203c 239 }
williequesada 0:424cd8b7203c 240
williequesada 0:424cd8b7203c 241 void SLAVE::Send_User(char Parquimetro[],char Municipio[],int Tiempo,char Espacio[],char Track2[])
williequesada 0:424cd8b7203c 242 {
williequesada 0:424cd8b7203c 243 if(Uart.writeable()) {
williequesada 0:424cd8b7203c 244 Uart.printf("%s",Municipio);
williequesada 0:424cd8b7203c 245 Uart.printf("%s",Espacio);
williequesada 0:424cd8b7203c 246 Uart.printf("%s",Parquimetro);
williequesada 0:424cd8b7203c 247 if(Tiempo<100) {
williequesada 0:424cd8b7203c 248 Uart.putc('0');
williequesada 0:424cd8b7203c 249 Uart.printf("%i",Tiempo);
williequesada 0:424cd8b7203c 250 } else {
williequesada 0:424cd8b7203c 251 Uart.printf("%i",Tiempo);
williequesada 0:424cd8b7203c 252 }
williequesada 0:424cd8b7203c 253 Uart.printf("%s",Track2);
williequesada 0:424cd8b7203c 254 } else {
williequesada 0:424cd8b7203c 255 wait_ms(500);
williequesada 0:424cd8b7203c 256 if(Uart.writeable()) {
williequesada 0:424cd8b7203c 257 Uart.printf("%s",Municipio);
williequesada 0:424cd8b7203c 258 Uart.printf("%s",Espacio);
williequesada 0:424cd8b7203c 259 Uart.printf("%s",Parquimetro);
williequesada 0:424cd8b7203c 260 if(Tiempo<100) {
williequesada 0:424cd8b7203c 261 Uart.putc('0');
williequesada 0:424cd8b7203c 262 Uart.printf("%i",Tiempo);
williequesada 0:424cd8b7203c 263 } else {
williequesada 0:424cd8b7203c 264 Uart.printf("%i",Tiempo);
williequesada 0:424cd8b7203c 265 }
williequesada 0:424cd8b7203c 266 Uart.printf("%s",Track2);
williequesada 0:424cd8b7203c 267 }
williequesada 0:424cd8b7203c 268 }
williequesada 0:424cd8b7203c 269 }
williequesada 0:424cd8b7203c 270
williequesada 0:424cd8b7203c 271 char SLAVE::Recibe()
williequesada 0:424cd8b7203c 272 {
williequesada 0:424cd8b7203c 273 if(Slave_Counter>0) {
williequesada 0:424cd8b7203c 274 Slave_Counter--;
williequesada 0:424cd8b7203c 275 return Slave_Buffer[Slave_Counter];
williequesada 0:424cd8b7203c 276 } else {
williequesada 0:424cd8b7203c 277 return NO_DATA;
williequesada 0:424cd8b7203c 278 }
williequesada 0:424cd8b7203c 279 }
williequesada 0:424cd8b7203c 280
williequesada 0:424cd8b7203c 281 bool SLAVE::Answer()
williequesada 0:424cd8b7203c 282 {
williequesada 0:424cd8b7203c 283 if(Slave_Counter>0) {
williequesada 0:424cd8b7203c 284 Slave_Counter--;
williequesada 0:424cd8b7203c 285 if(Slave_Buffer[Slave_Counter]==NEXT_STEP) {
williequesada 0:424cd8b7203c 286 return 1;
williequesada 0:424cd8b7203c 287 } else {
williequesada 0:424cd8b7203c 288 return 0;
williequesada 0:424cd8b7203c 289 }
williequesada 0:424cd8b7203c 290 }
williequesada 0:424cd8b7203c 291 return 0;
williequesada 0:424cd8b7203c 292 }
williequesada 0:424cd8b7203c 293
williequesada 0:424cd8b7203c 294 void SLAVE::Awake()
williequesada 0:424cd8b7203c 295 {
pabloandres2906 2:1141f1fb0761 296 _AWAKE=1; //despierta al esclavo con un flanco positivo
williequesada 0:424cd8b7203c 297 wait_us(50);
pabloandres2906 2:1141f1fb0761 298 _AWAKE=0; //se vuelve a poner en cero para que el proximo AWAKE=1 sea un flanco positivo
williequesada 0:424cd8b7203c 299 }
williequesada 0:424cd8b7203c 300
williequesada 0:424cd8b7203c 301 void SLAVE::Sleep()
williequesada 0:424cd8b7203c 302 {
williequesada 0:424cd8b7203c 303 if(Uart.writeable()) {
williequesada 0:424cd8b7203c 304 Uart.putc(NEXT_SLEEP);
williequesada 0:424cd8b7203c 305 } else {
williequesada 0:424cd8b7203c 306 wait_ms(500);
williequesada 0:424cd8b7203c 307 if(Uart.writeable()) {
williequesada 0:424cd8b7203c 308 Uart.putc(NEXT_SLEEP);
williequesada 0:424cd8b7203c 309 }
williequesada 0:424cd8b7203c 310 }
williequesada 0:424cd8b7203c 311
williequesada 0:424cd8b7203c 312 }
williequesada 0:424cd8b7203c 313
williequesada 0:424cd8b7203c 314 void SLAVE::UartInterruption()
williequesada 0:424cd8b7203c 315 {
williequesada 0:424cd8b7203c 316 if(Uart.readable()) {
williequesada 0:424cd8b7203c 317 Slave_Buffer[Slave_Counter]=Uart.getc();
williequesada 0:424cd8b7203c 318 Slave_Counter++;
williequesada 0:424cd8b7203c 319 }
williequesada 0:424cd8b7203c 320 }