Operaciones de generacion de claves, D-H, firma y validacion.

Dependencies:   mbed CyaSSL

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);
+   
     
 }