Home | History | Annotate | Line # | Download | only in default
      1  1.1  riastrad 
      2  1.1  riastrad #define TEST_NAME "kx"
      3  1.1  riastrad #include "cmptest.h"
      4  1.1  riastrad 
      5  1.1  riastrad static const unsigned char small_order_p[crypto_scalarmult_BYTES] = {
      6  1.1  riastrad     0xe0, 0xeb, 0x7a, 0x7c, 0x3b, 0x41, 0xb8, 0xae, 0x16, 0x56, 0xe3,
      7  1.1  riastrad     0xfa, 0xf1, 0x9f, 0xc4, 0x6a, 0xda, 0x09, 0x8d, 0xeb, 0x9c, 0x32,
      8  1.1  riastrad     0xb1, 0xfd, 0x86, 0x62, 0x05, 0x16, 0x5f, 0x49, 0xb8, 0x00
      9  1.1  riastrad };
     10  1.1  riastrad 
     11  1.1  riastrad static void
     12  1.1  riastrad tv_kx(void)
     13  1.1  riastrad {
     14  1.1  riastrad     unsigned char *seed;
     15  1.1  riastrad     unsigned char *client_pk, *client_sk;
     16  1.1  riastrad     unsigned char *client_rx, *client_tx;
     17  1.1  riastrad     unsigned char *server_pk, *server_sk;
     18  1.1  riastrad     unsigned char *server_rx, *server_tx;
     19  1.1  riastrad     char           hex[65];
     20  1.1  riastrad     int            i;
     21  1.1  riastrad 
     22  1.1  riastrad     seed = (unsigned char *) sodium_malloc(crypto_kx_SEEDBYTES);
     23  1.1  riastrad     for (i = 0; i < crypto_kx_SEEDBYTES; i++) {
     24  1.1  riastrad         seed[i] = (unsigned char) i;
     25  1.1  riastrad     }
     26  1.1  riastrad     client_pk = (unsigned char *) sodium_malloc(crypto_kx_PUBLICKEYBYTES);
     27  1.1  riastrad     client_sk = (unsigned char *) sodium_malloc(crypto_kx_SECRETKEYBYTES);
     28  1.1  riastrad     crypto_kx_seed_keypair(client_pk, client_sk, seed);
     29  1.1  riastrad 
     30  1.1  riastrad     sodium_bin2hex(hex, sizeof hex, client_pk, crypto_kx_PUBLICKEYBYTES);
     31  1.1  riastrad     printf("client_pk: [%s]\n", hex);
     32  1.1  riastrad     sodium_bin2hex(hex, sizeof hex, client_sk, crypto_kx_SECRETKEYBYTES);
     33  1.1  riastrad     printf("client_sk: [%s]\n", hex);
     34  1.1  riastrad 
     35  1.1  riastrad     server_pk = (unsigned char *) sodium_malloc(crypto_kx_PUBLICKEYBYTES);
     36  1.1  riastrad     server_sk = (unsigned char *) sodium_malloc(crypto_kx_SECRETKEYBYTES);
     37  1.1  riastrad     crypto_kx_keypair(server_pk, server_sk);
     38  1.1  riastrad 
     39  1.1  riastrad     client_rx = (unsigned char *) sodium_malloc(crypto_kx_SESSIONKEYBYTES);
     40  1.1  riastrad     client_tx = (unsigned char *) sodium_malloc(crypto_kx_SESSIONKEYBYTES);
     41  1.1  riastrad 
     42  1.1  riastrad     assert(crypto_kx_client_session_keys(client_rx, client_tx,
     43  1.1  riastrad                                          client_pk, client_sk,
     44  1.1  riastrad                                          small_order_p) == -1);
     45  1.1  riastrad     if (crypto_kx_client_session_keys(client_rx, client_tx,
     46  1.1  riastrad                                       client_pk, client_sk, server_pk) != 0) {
     47  1.1  riastrad         printf("crypto_kx_client_session_keys() failed\n");
     48  1.1  riastrad     }
     49  1.1  riastrad 
     50  1.1  riastrad     server_rx = (unsigned char *) sodium_malloc(crypto_kx_SESSIONKEYBYTES);
     51  1.1  riastrad     server_tx = (unsigned char *) sodium_malloc(crypto_kx_SESSIONKEYBYTES);
     52  1.1  riastrad 
     53  1.1  riastrad     assert(crypto_kx_server_session_keys(server_rx, server_tx,
     54  1.1  riastrad                                          server_pk, server_sk,
     55  1.1  riastrad                                          small_order_p) == -1);
     56  1.1  riastrad     if (crypto_kx_server_session_keys(server_rx, server_tx,
     57  1.1  riastrad                                       server_pk, server_sk, client_pk) != 0) {
     58  1.1  riastrad         printf("crypto_kx_server_session_keys() failed\n");
     59  1.1  riastrad     }
     60  1.1  riastrad     if (memcmp(server_rx, client_tx, crypto_kx_SESSIONKEYBYTES) != 0 ||
     61  1.1  riastrad         memcmp(server_tx, client_rx, crypto_kx_SESSIONKEYBYTES) != 0) {
     62  1.1  riastrad         printf("client session keys != server session keys\n");
     63  1.1  riastrad     }
     64  1.1  riastrad 
     65  1.1  riastrad     sodium_increment(client_pk, crypto_kx_PUBLICKEYBYTES);
     66  1.1  riastrad     if (crypto_kx_server_session_keys(server_rx, server_tx,
     67  1.1  riastrad                                       server_pk, server_sk, client_pk) != 0) {
     68  1.1  riastrad         printf("crypto_kx_server_session_keys() failed\n");
     69  1.1  riastrad     }
     70  1.1  riastrad     if (memcmp(server_rx, client_tx, crypto_kx_SESSIONKEYBYTES) == 0 &&
     71  1.1  riastrad         memcmp(server_tx, client_rx, crypto_kx_SESSIONKEYBYTES) == 0) {
     72  1.1  riastrad         printf("peer's public key is ignored\n");
     73  1.1  riastrad     }
     74  1.1  riastrad 
     75  1.1  riastrad     crypto_kx_keypair(client_pk, client_sk);
     76  1.1  riastrad     if (crypto_kx_server_session_keys(server_rx, server_tx,
     77  1.1  riastrad                                       server_pk, server_sk, client_pk) != 0) {
     78  1.1  riastrad         printf("crypto_kx_server_session_keys() failed\n");
     79  1.1  riastrad     }
     80  1.1  riastrad     if (memcmp(server_rx, client_tx, crypto_kx_SESSIONKEYBYTES) == 0 ||
     81  1.1  riastrad         memcmp(server_tx, client_rx, crypto_kx_SESSIONKEYBYTES) == 0) {
     82  1.1  riastrad         printf("session keys are constant\n");
     83  1.1  riastrad     }
     84  1.1  riastrad 
     85  1.1  riastrad     crypto_kx_seed_keypair(client_pk, client_sk, seed);
     86  1.1  riastrad     sodium_increment(seed, crypto_kx_SEEDBYTES);
     87  1.1  riastrad     crypto_kx_seed_keypair(server_pk, server_sk, seed);
     88  1.1  riastrad     if (crypto_kx_server_session_keys(server_rx, server_tx,
     89  1.1  riastrad                                       server_pk, server_sk, client_pk) != 0) {
     90  1.1  riastrad         printf("crypto_kx_server_session_keys() failed\n");
     91  1.1  riastrad     }
     92  1.1  riastrad     sodium_bin2hex(hex, sizeof hex, server_rx, crypto_kx_SESSIONKEYBYTES);
     93  1.1  riastrad     printf("server_rx: [%s]\n", hex);
     94  1.1  riastrad     sodium_bin2hex(hex, sizeof hex, server_tx, crypto_kx_SESSIONKEYBYTES);
     95  1.1  riastrad     printf("server_tx: [%s]\n", hex);
     96  1.1  riastrad 
     97  1.1  riastrad     if (crypto_kx_client_session_keys(client_rx, client_tx,
     98  1.1  riastrad                                       client_pk, client_sk, server_pk) != 0) {
     99  1.1  riastrad         printf("crypto_kx_client_session_keys() failed\n");
    100  1.1  riastrad     }
    101  1.1  riastrad     sodium_bin2hex(hex, sizeof hex, client_rx, crypto_kx_SESSIONKEYBYTES);
    102  1.1  riastrad     printf("client_rx: [%s]\n", hex);
    103  1.1  riastrad     sodium_bin2hex(hex, sizeof hex, client_tx, crypto_kx_SESSIONKEYBYTES);
    104  1.1  riastrad     printf("client_tx: [%s]\n", hex);
    105  1.1  riastrad 
    106  1.1  riastrad     randombytes_buf(client_rx, crypto_kx_SESSIONKEYBYTES);
    107  1.1  riastrad     randombytes_buf(client_tx, crypto_kx_SESSIONKEYBYTES);
    108  1.1  riastrad     randombytes_buf(server_rx, crypto_kx_SESSIONKEYBYTES);
    109  1.1  riastrad     randombytes_buf(server_tx, crypto_kx_SESSIONKEYBYTES);
    110  1.1  riastrad     if (crypto_kx_client_session_keys(client_rx, NULL,
    111  1.1  riastrad                                       client_pk, client_sk, server_pk) != 0 ||
    112  1.1  riastrad         crypto_kx_client_session_keys(NULL, client_tx,
    113  1.1  riastrad                                       client_pk, client_sk, server_pk) != 0 ||
    114  1.1  riastrad         crypto_kx_server_session_keys(server_rx, NULL,
    115  1.1  riastrad                                       server_pk, server_sk, client_pk) != 0 ||
    116  1.1  riastrad         crypto_kx_server_session_keys(NULL, server_tx,
    117  1.1  riastrad                                       server_pk, server_sk, client_pk) != 0) {
    118  1.1  riastrad         printf("failure when one of the pointers happens to be NULL");
    119  1.1  riastrad     }
    120  1.1  riastrad     assert(memcmp(client_rx, client_tx, crypto_kx_SESSIONKEYBYTES) == 0);
    121  1.1  riastrad     assert(memcmp(client_tx, server_rx, crypto_kx_SESSIONKEYBYTES) == 0);
    122  1.1  riastrad     assert(memcmp(server_rx, server_tx, crypto_kx_SESSIONKEYBYTES) == 0);
    123  1.1  riastrad 
    124  1.1  riastrad     sodium_free(client_rx);
    125  1.1  riastrad     sodium_free(client_tx);
    126  1.1  riastrad     sodium_free(server_rx);
    127  1.1  riastrad     sodium_free(server_tx);
    128  1.1  riastrad     sodium_free(server_sk);
    129  1.1  riastrad     sodium_free(server_pk);
    130  1.1  riastrad     sodium_free(client_sk);
    131  1.1  riastrad     sodium_free(client_pk);
    132  1.1  riastrad     sodium_free(seed);
    133  1.1  riastrad 
    134  1.1  riastrad     assert(strcmp(crypto_kx_primitive(), crypto_kx_PRIMITIVE) == 0);
    135  1.1  riastrad     assert(crypto_kx_publickeybytes() == crypto_kx_PUBLICKEYBYTES);
    136  1.1  riastrad     assert(crypto_kx_secretkeybytes() == crypto_kx_SECRETKEYBYTES);
    137  1.1  riastrad     assert(crypto_kx_seedbytes() == crypto_kx_SEEDBYTES);
    138  1.1  riastrad     assert(crypto_kx_sessionkeybytes() == crypto_kx_SESSIONKEYBYTES);
    139  1.1  riastrad 
    140  1.1  riastrad     printf("tv_kx: ok\n");
    141  1.1  riastrad }
    142  1.1  riastrad 
    143  1.1  riastrad int
    144  1.1  riastrad main(void)
    145  1.1  riastrad {
    146  1.1  riastrad     tv_kx();
    147  1.1  riastrad 
    148  1.1  riastrad     return 0;
    149  1.1  riastrad }
    150