Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
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
Generated on Tue Jul 19 2022 15:58:40 by
1.7.2