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