sara matheu / Mbed 2 deprecated CurvasElipticas

Dependencies:   mbed CyaSSL

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers main.cpp Source File

main.cpp

00001 #include <mbed.h>
00002 #include <time.h>
00003 #include <string>
00004 #include <stdlib.h> 
00005 #include <cstdio>
00006 #include <cstdlib>
00007 #include <alloca.h>
00008 #include "sha256.h"
00009 #include "ecc.h"
00010 #include "ctc_rsa.h"
00011 
00012 Serial pc(USBTX, USBRX); // tx, rx
00013 
00014 void vli_print(uint32_t *p_vli, unsigned int p_size)
00015 {
00016     while(p_size)
00017     {
00018         printf("%08X ", (unsigned)p_vli[p_size - 1]);
00019         --p_size;
00020     }
00021 }
00022 
00023 int rsa_test()
00024 {
00025         RsaKey genKey;
00026         InitRsaKey(&genKey, 0);
00027         for (int i=0; i<100;i++){
00028             pc.printf("%d ", genKey.p.dp[i]);
00029             }
00030             RsaKey* key;
00031             RNG* rng;
00032             InitRng(rng);
00033         MakeRsaKey(key, 512, 65537, rng);
00034     return 0;
00035 }
00036 
00037 
00038 int main() {
00039     clock_t t_ini, t_fin;
00040   double secs;
00041 
00042   
00043     /*GENERACION DE CLAVES*/
00044     pc.printf("Hola soy Alice, voy a generar mi clave publica coordenada x \n");
00045     uint32_t l_private1[NUM_ECC_DIGITS];//clave privada
00046     uint32_t aleat[NUM_ECC_DIGITS];  //aleatorio
00047     for (int i=0; i<NUM_ECC_DIGITS;i++){
00048           aleat[i]=rand()%10;  //entero entre 0-9
00049     }
00050     
00051     EccPoint l_public1;
00052 t_ini = clock();
00053     ecc_make_key(&l_public1, l_private1, aleat);  //Calcula la publica
00054 t_fin = clock();
00055     pc.printf("%08X ", (unsigned)l_public1.x);  //imprime coordenada x de la clave publica
00056     pc.printf("Hola soy Alice, voy a generar mi clave publica coordenada y \n");
00057     pc.printf("%08X ", (unsigned)l_public1.y);  //imprime coordenada y de la clave publica
00058     
00059     uint32_t l_private2[NUM_ECC_DIGITS];  //aleatoria
00060     EccPoint l_public2;
00061     ecc_make_key(&l_public2, l_private2, aleat);  //Calcula la publica
00062     pc.printf("Hola soy Bob, voy a generar mi clave publica coordenada x \n");
00063     pc.printf("%08X ", (unsigned)l_public2.x);  //imprime coordenada x de la clave publica
00064     pc.printf("Hola soy Bob, voy a generar mi clave publica coordenada y \n");
00065     pc.printf("%08X ", (unsigned)l_public2.y);  //imprime coordenada y de la clave publica
00066     
00067     /*D-H*/
00068     uint32_t l_shared1[NUM_ECC_DIGITS];
00069     uint32_t l_shared2[NUM_ECC_DIGITS];
00070     uint32_t l_random1[NUM_ECC_DIGITS];
00071     uint32_t l_random2[NUM_ECC_DIGITS];
00072     
00073     //comprobamos que se ha generado bien la clave compartida y que tienen la misma
00074     if(!ecdh_shared_secret(l_shared1, &l_public1, l_private2, l_random1)) 
00075         {
00076         pc.printf("shared_secret() failed (1)\n");
00077             return 1;
00078         }
00079 
00080         if(!ecdh_shared_secret(l_shared2, &l_public2, l_private1, l_random2))
00081         {
00082             pc.printf("shared_secret() failed (2)\n");
00083             return 1;
00084         }
00085         
00086         if(memcmp(l_shared1, l_shared2, sizeof(l_shared1)) != 0)
00087         {
00088             pc.printf("Shared secrets are not identical!\n");
00089             pc.printf("Shared secret 1 = ");
00090             vli_print(l_shared1, NUM_ECC_DIGITS);
00091             pc.printf("\n");
00092             pc.printf("Shared secret 2 = ");
00093             vli_print(l_shared2, NUM_ECC_DIGITS);
00094             pc.printf("\n");
00095             pc.printf("Private key 1 = ");
00096             vli_print(l_private1, NUM_ECC_DIGITS);
00097             pc.printf("\n");
00098             pc.printf("Private key 2 = ");
00099             vli_print(l_private2, NUM_ECC_DIGITS);
00100             pc.printf("\n");
00101         }else {
00102             pc.printf("Shared secrets are identical!\n");
00103         }
00104         
00105         /*FIRMA y VERIFICACION*/
00106         
00107     string mensaje = "Hola";
00108     
00109     //SHA-256 y paso a uint32//
00110     string output1 = sha256(mensaje);
00111     uint32_t hash[NUM_ECC_DIGITS];
00112     
00113     int j=0;
00114     while (j<NUM_ECC_DIGITS){
00115         string cortada=output1.substr(8*j, 7);
00116         //pc.printf("corte: %s ", cortada); 
00117         const char* caracteres=cortada.c_str();
00118         uint32_t x = strtoul(caracteres, NULL, 16);
00119         //pc.printf("hash: %08X ", (unsigned)x); 
00120         hash[j]=x;
00121         j++;
00122     }
00123     ///--------///
00124     uint32_t aleatorio[NUM_ECC_DIGITS];  
00125     for (int i=0; i<NUM_ECC_DIGITS;i++){
00126           aleatorio[i]=rand()%10;  //entero entre 0-9
00127     }
00128     uint32_t r[NUM_ECC_DIGITS];
00129     uint32_t s[NUM_ECC_DIGITS];
00130     
00131     if(!ecdsa_sign(r, s, l_private1, aleatorio, hash))
00132         {
00133             pc.printf("ecdsa_sign() failed\n");
00134         }
00135         
00136         if(!ecc_valid_public_key(&l_public1))
00137         {
00138             pc.printf("Not a valid public key!\n");
00139         }
00140         
00141         if(!ecdsa_verify(&l_public1, hash, r, s))
00142         {
00143             pc.printf("ecdsa_verify() failed\n");
00144         }else{
00145             pc.printf("ecdsa_verify() correcto \n");
00146         }
00147    
00148 
00149   secs = (double)(t_fin - t_ini) / CLOCKS_PER_SEC;
00150    pc.printf("%.16g milisegundos\n", secs * 1000.0);
00151    
00152    rsa_test();
00153     
00154 }
00155