Advertisement
Guest User

hi

a guest
May 20th, 2018
181
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 8.33 KB | None | 0 0
  1. //============================================================================
  2. // Name : wolfssl_SHA256.cpp
  3. // Author :
  4. // Version :
  5. // Copyright : Your copyright notice
  6. // Description : Hello World in C++, Ansi-style
  7. //============================================================================
  8. #include <wolfssl/wolfcrypt/sha256.h>
  9. #include <stdio.h>
  10. #include <sys/time.h>
  11. #include <unistd.h>
  12.  
  13. typedef unsigned char byte;
  14. typedef unsigned char uint8_t;
  15. const int SHA256_HASH_BYTES = 32;
  16.  
  17. uint8_t password[] = { // heslo 32bytu
  18. 'D', 'i', 'p', 'l', 'o', 'm', 'o', 'v',
  19. 'a', 'P', 'r', 'a', 'c', 'e', '2', '0',
  20. '1', '8', 'V', 'U', 'T', 'F', 'E', 'K',
  21. 'T', 'B', 'r', 'n', 'o', 'P', 'C', 'h'};
  22. uint8_t message[37];
  23. uint8_t messageFromServer[34];
  24. uint8_t keySession[SHA256_HASH_BYTES];
  25. uint8_t id[] = {0x11, 0x12, 0x13, 0x14}; /// id 4 byty
  26. long int secventionNumber = 0x12345678; // sekvenční server ....n ...4 byty
  27.  
  28. int send() // simulace odesilani
  29. {
  30. return 1;
  31. }
  32.  
  33. void imagMessage02() // fiktivní přijetí zprávy 0x02 od serveru (vytvoření této zprávy) client<- server 0x02,OK,h(0x02,OK,heslo,n+1)
  34. {
  35. uint8_t messageHash[42];
  36. uint8_t hash[SHA256_HASH_BYTES];
  37.  
  38. int i, j;
  39.  
  40. for(i = 0; i < sizeof(messageFromServer); i++) //nulování proměných
  41. {
  42. messageFromServer[i] = 0x00;
  43. }
  44.  
  45. for(i = 0; i < sizeof(messageHash); i++)
  46. {
  47. messageHash[i] = 0x00;
  48. }
  49. // přidání návěští a stavu OK
  50. messageFromServer[0] = 0x02;
  51. messageFromServer[1] = 0x01;
  52.  
  53. messageHash[0] = 0x02;
  54. messageHash[1] = 0x01;
  55. // přidání hesla
  56. for(j = 0; j < sizeof(password); j++)
  57. {
  58. messageHash[j+2] = password[j];
  59. }
  60. // přidání sekvenčního čísla
  61. messageHash[j+2] = ((secventionNumber+1) & 0xFF000000) >> 4*6;
  62. messageHash[j+3] = ((secventionNumber+1) & 0x00FF0000) >> 4*4;
  63. messageHash[j+4] = ((secventionNumber+1) & 0x0000FF00) >> 4*2;
  64. messageHash[j+5] = ((secventionNumber+1) & 0x000000FF);
  65. // zahashování
  66. Sha256 sha;
  67. wc_InitSha256(&sha);
  68. wc_Sha256Update(&sha, messageHash, sizeof(messageHash));
  69. wc_Sha256Final(&sha, hash);
  70.  
  71. for(i = 0; i < sizeof(hash); i++) // spojení hashe se zprávu
  72. {
  73. messageFromServer[i+2] = hash[i];
  74. }
  75. }
  76.  
  77. void createMessage01() /// client-> server 0x01,ID,h(0x01,ID,heslo,n)
  78. {
  79. uint8_t messageHash[45];
  80. uint8_t hash[SHA256_HASH_BYTES];
  81.  
  82. int i, j;
  83.  
  84. for(i = 0; i < sizeof(messageHash); i++) // nulování proměných ( pracovní )
  85. {
  86. messageHash[i] = 0x00;
  87. }
  88.  
  89. for(i = 0; i < sizeof(message); i++)
  90. {
  91. message[i] = 0x00;
  92. }
  93.  
  94. messageHash[0] = 0x01; // přidání návěští
  95. message[0] = 0x01;
  96.  
  97.  
  98. for(i = 0; i < sizeof(id); i++) // přidání ID klienta
  99. {
  100. messageHash[i+1] = id[i];
  101. message[i+1] = id[i];
  102. }
  103.  
  104. for(j = 0; j < sizeof(password); j++) // přidání hesla
  105. {
  106. messageHash[i+j+1] = password[j];
  107. }
  108.  
  109. messageHash[i+j+1] = (secventionNumber & 0xFF000000) >> 4*6; // přidání sekvenčního čísla (nutno postupně bitově šoupat při ukládání)
  110. messageHash[i+j+2] = (secventionNumber & 0x00FF0000) >> 4*4;
  111. messageHash[i+j+3] = (secventionNumber & 0x0000FF00) >> 4*2;
  112. messageHash[i+j+4] = (secventionNumber & 0x000000FF);
  113. // hash
  114.  
  115. Sha256 sha;
  116. wc_InitSha256(&sha);
  117. wc_Sha256Update(&sha, messageHash, sizeof(messageHash));
  118. wc_Sha256Final(&sha, hash);
  119.  
  120. for(j = 0; j < sizeof(hash); j++) // spojení hashe se zprávou
  121. {
  122. message[i+j+1] = hash[j];
  123. }
  124.  
  125. }
  126.  
  127. int verify02() // Ověření přijaté zprávy clientem a ustanovené SessionKey pri uspesne autentizaci
  128. { // client<- server 0x02,OK,h(0x02,OK,heslo,n+1)
  129. if(messageFromServer[0] != 0x02) // ověření návěští zprávy
  130. return -1;
  131.  
  132. if(messageFromServer[1] == 0x01) // ověření stavu autentizace od servru
  133. {
  134. // OK // zaslaná data servru byla správná a ověřena
  135.  
  136. uint8_t messageHash[42];
  137. uint8_t keySessionMessageHash[64];
  138. uint8_t hash[SHA256_HASH_BYTES];
  139.  
  140. int i, j;
  141.  
  142. for(i = 0; i < sizeof(messageHash); i++) /// nulování proměných
  143. {
  144. messageHash[i] = 0x00;
  145. }
  146. ///// vytvoření hashe pro ověření otisku od servru ....
  147. messageHash[0] = 0x02; // přidání návěští
  148. messageHash[1] = 0x01; // přidání stavu OK
  149.  
  150. for(j = 0; j < sizeof(password); j++) // přidání hesla
  151. {
  152. messageHash[j+2] = password[j];
  153. }
  154. // přidání sekvenčního čísla
  155. messageHash[j+2] = ((secventionNumber+1) & 0xFF000000) >> 4*6;
  156. messageHash[j+3] = ((secventionNumber+1) & 0x00FF0000) >> 4*4;
  157. messageHash[j+4] = ((secventionNumber+1) & 0x0000FF00) >> 4*2;
  158. messageHash[j+5] = ((secventionNumber+1) & 0x000000FF);
  159. // hash
  160.  
  161. Sha256 sha;
  162. wc_InitSha256(&sha);
  163. wc_Sha256Update(&sha, messageHash, sizeof(messageHash));
  164. wc_Sha256Final(&sha, hash);
  165.  
  166. for(i = 0; i < sizeof(keySession); i++) // nulování proměné
  167. {
  168. keySession[i] = 0x00;
  169. }
  170. // srovnání příchozího a vytvořeného otisku
  171. for(i = 0; i < sizeof(hash); i++)
  172. {
  173. if(hash[i] != messageFromServer[i+2])
  174. return -3; // neshoda otisku
  175.  
  176. keySessionMessageHash[i] = hash[i]; // překopírovávání hahe ze zprávy 0x02 do proměnné pro výpočet hashe pro keySession
  177. }
  178.  
  179. for(j = 0; j < sizeof(password); j++)
  180. {
  181. keySessionMessageHash[i+j+1] = password[j]; // přidání hesla do proměnné pro výpočet hashe pro keySession
  182. }
  183. // výpočet keySession
  184. Sha256 sha2;
  185. wc_InitSha256(&sha2);
  186. wc_Sha256Update(&sha2, keySessionMessageHash, sizeof(keySessionMessageHash));
  187. wc_Sha256Final(&sha2, keySession);
  188.  
  189. secventionNumber++;
  190. return 1; // uspěšná autentizace
  191. }
  192. else
  193. {
  194. // ERROR //
  195. return -2; // příchozí stav ERROR od servru
  196. }
  197. }
  198.  
  199. int authentication()
  200. {
  201. /*mereni*/
  202. struct timeval start, stop;
  203. double secs1 = 0;
  204. double secs2 = 0;
  205. double secs3 = 0;
  206.  
  207. int i = 0;
  208.  
  209. /*start měření vytvoreni zpravy na klientoovi*/
  210. gettimeofday(&start, NULL);
  211.  
  212. createMessage01(); //vytvoření zprávy 0x01 client-> server 0x01,ID,h(0x01,ID,heslo,n)
  213.  
  214. gettimeofday(&stop, NULL);
  215. secs1= ( (double)(stop.tv_usec - start.tv_usec) + (double)(stop.tv_sec - start.tv_sec)*1000000 );
  216. /*konec mereni vytvoreni zpravy na klientoovi*/
  217.  
  218. send(); // fiktivní odeslání zprávy 0x01
  219.  
  220. /* start mereni vytvoreni zpravy na serveru*/
  221. gettimeofday(&start, NULL);
  222.  
  223. imagMessage02(); // fiktivní přijetí zprávy 0x02 od serveru (vytvoření této zprávy)
  224.  
  225. gettimeofday(&stop, NULL);
  226. secs2= ( (double)(stop.tv_usec - start.tv_usec) + (double)(stop.tv_sec - start.tv_sec)*1000000 );
  227. /* konec mereni vytvoreni zpravy na serveru*/
  228.  
  229. /* start mereni overeni zpravy na clientovi*/
  230. gettimeofday(&start, NULL);
  231.  
  232. int retVal = verify02();
  233.  
  234. gettimeofday(&stop, NULL);
  235. secs3= ( (double)(stop.tv_usec - start.tv_usec) + (double)(stop.tv_sec - start.tv_sec)*1000000 );
  236. /* konec mereni overeni zpravy na clientovi*/
  237.  
  238. printf("Čas vytvoření zprávy 0x01 na klientoovi: %f\n",secs1);
  239. printf("Čas vytvoření zprávy 0x02 na serveru: %f\n",secs2);
  240. printf("Čas ověření zprávy na klientovi: %f\n",secs3);
  241.  
  242. return retVal; // Ověření přijaté zprávy clientem a ustanovené SessionKey pri uspesne autentizaci client<- server 0x02,OK,h(0x02,OK,heslo,n+1)
  243. }
  244.  
  245.  
  246. void print_hex_memory(void *mem, unsigned length) {
  247. printf("Heslo pro šifrovanou komunikaci uložené v keySession: \n");
  248. byte *p = (byte *) mem;
  249. for (unsigned i = 0; i < length; i++) {
  250. printf("%02x", p[i]);
  251. }
  252. }
  253.  
  254. int main(void) {
  255. int vysledek = 0;
  256.  
  257. vysledek = authentication();
  258.  
  259. if(vysledek == 1){
  260. printf("\n Autentizace proběhlo úspěšně, v proměnné keySession je ustanovené heslo pro následnou šifrovanou komunikaci.");
  261. // keySession v této proměnné je to heslo které slouží pro normalní komunikaci přes šifru
  262. printf("\n ");
  263. print_hex_memory(&keySession, 32);
  264. } else if (vysledek == -2){
  265. printf("\n Server pokus o autentizaci odmítnul.");
  266. } else if (vysledek == -3){
  267. printf("\n Odpověď od serveru se neshoduje s odpovědí, kterou očekávám, tedy autentizace neśpěšná.");
  268. }
  269. return 0;
  270. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement