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