kx.c revision 1.1 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