ttest.c - sick - sign and check files using ed25519
 (HTM) git clone git://z3bra.org/sick
 (DIR) Log
 (DIR) Files
 (DIR) Refs
 (DIR) README
 (DIR) LICENSE
       ---
       ttest.c (4674B)
       ---
            1 #include <stdlib.h>
            2 #include <stdio.h>
            3 #include <string.h>
            4 #include <time.h>
            5 
            6 /* #define ED25519_DLL */
            7 #include "src/ed25519.h"
            8 
            9 #include "src/ge.h"
           10 #include "src/sc.h"
           11 
           12 
           13 int main() {
           14     unsigned char public_key[32], private_key[64], seed[32], scalar[32];
           15     unsigned char other_public_key[32], other_private_key[64];
           16     unsigned char shared_secret[32], other_shared_secret[32];
           17     unsigned char signature[64];
           18 
           19     clock_t start;
           20     clock_t end;
           21     int i;
           22 
           23     const unsigned char message[] = "Hello, world!";
           24     const int message_len = strlen((char*) message);
           25 
           26     /* create a random seed, and a keypair out of that seed */
           27     ed25519_create_seed(seed);
           28     ed25519_create_keypair(public_key, private_key, seed);
           29 
           30     /* create signature on the message with the keypair */
           31     ed25519_sign(signature, message, message_len, public_key, private_key);
           32 
           33     /* verify the signature */
           34     if (ed25519_verify(signature, message, message_len, public_key)) {
           35         printf("valid signature\n");
           36     } else {
           37         printf("invalid signature\n");
           38     }
           39 
           40     /* create scalar and add it to the keypair */
           41     ed25519_create_seed(scalar);
           42     ed25519_add_scalar(public_key, private_key, scalar);
           43 
           44     /* create signature with the new keypair */
           45     ed25519_sign(signature, message, message_len, public_key, private_key);
           46 
           47     /* verify the signature with the new keypair */
           48     if (ed25519_verify(signature, message, message_len, public_key)) {
           49         printf("valid signature\n");
           50     } else {
           51         printf("invalid signature\n");
           52     }
           53 
           54     /* make a slight adjustment and verify again */
           55     signature[44] ^= 0x10;
           56     if (ed25519_verify(signature, message, message_len, public_key)) {
           57         printf("did not detect signature change\n");
           58     } else {
           59         printf("correctly detected signature change\n");
           60     }
           61 
           62     /* generate two keypairs for testing key exchange */
           63     ed25519_create_seed(seed);
           64     ed25519_create_keypair(public_key, private_key, seed);
           65     ed25519_create_seed(seed);
           66     ed25519_create_keypair(other_public_key, other_private_key, seed);
           67 
           68     /* create two shared secrets - from both perspectives - and check if they're equal */
           69     ed25519_key_exchange(shared_secret, other_public_key, private_key);
           70     ed25519_key_exchange(other_shared_secret, public_key, other_private_key);
           71 
           72     for (i = 0; i < 32; ++i) {
           73         if (shared_secret[i] != other_shared_secret[i]) {
           74             printf("key exchange was incorrect\n");
           75             break;
           76         }
           77     }
           78 
           79     if (i == 32) {
           80         printf("key exchange was correct\n");
           81     }
           82 
           83     /* test performance */
           84     printf("testing seed generation performance: ");
           85     start = clock();
           86     for (i = 0; i < 10000; ++i) {
           87         ed25519_create_seed(seed);
           88     }
           89     end = clock();
           90 
           91     printf("%fus per seed\n", ((double) ((end - start) * 1000)) / CLOCKS_PER_SEC / i * 1000);
           92 
           93 
           94     printf("testing key generation performance: ");
           95     start = clock();
           96     for (i = 0; i < 10000; ++i) {
           97         ed25519_create_keypair(public_key, private_key, seed);
           98     }
           99     end = clock();
          100 
          101     printf("%fus per keypair\n", ((double) ((end - start) * 1000)) / CLOCKS_PER_SEC / i * 1000);
          102 
          103     printf("testing sign performance: ");
          104     start = clock();
          105     for (i = 0; i < 10000; ++i) {
          106         ed25519_sign(signature, message, message_len, public_key, private_key);
          107     }
          108     end = clock();
          109 
          110     printf("%fus per signature\n", ((double) ((end - start) * 1000)) / CLOCKS_PER_SEC / i * 1000);
          111 
          112     printf("testing verify performance: ");
          113     start = clock();
          114     for (i = 0; i < 10000; ++i) {
          115         ed25519_verify(signature, message, message_len, public_key);
          116     }
          117     end = clock();
          118 
          119     printf("%fus per signature\n", ((double) ((end - start) * 1000)) / CLOCKS_PER_SEC / i * 1000);
          120     
          121 
          122     printf("testing keypair scalar addition performance: ");
          123     start = clock();
          124     for (i = 0; i < 10000; ++i) {
          125         ed25519_add_scalar(public_key, private_key, scalar);
          126     }
          127     end = clock();
          128 
          129     printf("%fus per keypair\n", ((double) ((end - start) * 1000)) / CLOCKS_PER_SEC / i * 1000);
          130 
          131     printf("testing public key scalar addition performance: ");
          132     start = clock();
          133     for (i = 0; i < 10000; ++i) {
          134         ed25519_add_scalar(public_key, NULL, scalar);
          135     }
          136     end = clock();
          137 
          138     printf("%fus per key\n", ((double) ((end - start) * 1000)) / CLOCKS_PER_SEC / i * 1000);
          139 
          140     printf("testing key exchange performance: ");
          141     start = clock();
          142     for (i = 0; i < 10000; ++i) {
          143         ed25519_key_exchange(shared_secret, other_public_key, private_key);
          144     }
          145     end = clock();
          146 
          147     printf("%fus per shared secret\n", ((double) ((end - start) * 1000)) / CLOCKS_PER_SEC / i * 1000);
          148 
          149     return 0;
          150 }