sara matheu
/
CurvasElipticas
Operaciones de generacion de claves, D-H, firma y validacion.
Diff: main.cpp
- Revision:
- 3:74a69ff114ba
- Parent:
- 2:94f5ffb2a52d
- Child:
- 5:4f619b9a7bb2
diff -r 94f5ffb2a52d -r 74a69ff114ba main.cpp --- a/main.cpp Thu Feb 05 23:08:03 2015 +0000 +++ b/main.cpp Sat Feb 14 18:10:15 2015 +0000 @@ -1,4 +1,11 @@ #include <mbed.h> +#include <time.h> +#include <string> +#include <stdlib.h> +#include <cstdio> +#include <cstdlib> +#include <alloca.h> +#include "sha256.h" #include "ecc.h" Serial pc(USBTX, USBRX); // tx, rx @@ -12,19 +19,29 @@ } int main() { - + clock_t t_ini, t_fin; + double secs; + + /*GENERACION DE CLAVES*/ pc.printf("Hola soy Alice, voy a generar mi clave publica coordenada x \n"); - uint32_t l_private1[NUM_ECC_DIGITS]; //aleatoria + uint32_t l_private1[NUM_ECC_DIGITS];//clave privada + uint32_t aleat[NUM_ECC_DIGITS]; //aleatorio + for (int i=0; i<NUM_ECC_DIGITS;i++){ + aleat[i]=rand()%10; //entero entre 0-9 + } + EccPoint l_public1; - ecc_make_key(&l_public1, l_private1, l_private1); //Calcula la publica +t_ini = clock(); + ecc_make_key(&l_public1, l_private1, aleat); //Calcula la publica +t_fin = clock(); pc.printf("%08X ", (unsigned)l_public1.x); //imprime coordenada x de la clave publica pc.printf("Hola soy Alice, voy a generar mi clave publica coordenada y \n"); pc.printf("%08X ", (unsigned)l_public1.y); //imprime coordenada y de la clave publica uint32_t l_private2[NUM_ECC_DIGITS]; //aleatoria EccPoint l_public2; - ecc_make_key(&l_public2, l_private2, l_private2); //Calcula la publica + ecc_make_key(&l_public2, l_private2, aleat); //Calcula la publica pc.printf("Hola soy Bob, voy a generar mi clave publica coordenada x \n"); pc.printf("%08X ", (unsigned)l_public2.x); //imprime coordenada x de la clave publica pc.printf("Hola soy Bob, voy a generar mi clave publica coordenada y \n"); @@ -70,13 +87,31 @@ /*FIRMA y VERIFICACION*/ - uint32_t l_hash[NUM_ECC_DIGITS]; //Se supone que es el hash del mensaje que queremos firmar - uint32_t l_random[NUM_ECC_DIGITS]; + string mensaje = "Hola"; + + //SHA-256 y paso a uint32// + string output1 = sha256(mensaje); + uint32_t hash[NUM_ECC_DIGITS]; + int j=0; + while (j<NUM_ECC_DIGITS){ + string cortada=output1.substr(8*j, 7); + //pc.printf("corte: %s ", cortada); + const char* caracteres=cortada.c_str(); + uint32_t x = strtoul(caracteres, NULL, 16); + //pc.printf("hash: %08X ", (unsigned)x); + hash[j]=x; + j++; + } + ///--------/// + uint32_t aleatorio[NUM_ECC_DIGITS]; + for (int i=0; i<NUM_ECC_DIGITS;i++){ + aleatorio[i]=rand()%10; //entero entre 0-9 + } uint32_t r[NUM_ECC_DIGITS]; uint32_t s[NUM_ECC_DIGITS]; - if(!ecdsa_sign(r, s, l_private1, l_random, l_hash)) + if(!ecdsa_sign(r, s, l_private1, aleatorio, hash)) { pc.printf("ecdsa_sign() failed\n"); } @@ -86,11 +121,16 @@ pc.printf("Not a valid public key!\n"); } - if(!ecdsa_verify(&l_public1, l_hash, r, s)) + if(!ecdsa_verify(&l_public1, hash, r, s)) { pc.printf("ecdsa_verify() failed\n"); }else{ pc.printf("ecdsa_verify() correcto \n"); } + + + secs = (double)(t_fin - t_ini) / CLOCKS_PER_SEC; + pc.printf("%.16g milisegundos\n", secs * 1000.0); + }