kx.c 6.2 KB

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