Blame SOURCES/libsodium-1.0.18/test/default/kx.c

ca16be
ca16be
#define TEST_NAME "kx"
ca16be
#include "cmptest.h"
ca16be
ca16be
static const unsigned char small_order_p[crypto_scalarmult_BYTES] = {
ca16be
    0xe0, 0xeb, 0x7a, 0x7c, 0x3b, 0x41, 0xb8, 0xae, 0x16, 0x56, 0xe3,
ca16be
    0xfa, 0xf1, 0x9f, 0xc4, 0x6a, 0xda, 0x09, 0x8d, 0xeb, 0x9c, 0x32,
ca16be
    0xb1, 0xfd, 0x86, 0x62, 0x05, 0x16, 0x5f, 0x49, 0xb8, 0x00
ca16be
};
ca16be
ca16be
static void
ca16be
tv_kx(void)
ca16be
{
ca16be
    unsigned char *seed;
ca16be
    unsigned char *client_pk, *client_sk;
ca16be
    unsigned char *client_rx, *client_tx;
ca16be
    unsigned char *server_pk, *server_sk;
ca16be
    unsigned char *server_rx, *server_tx;
ca16be
    char           hex[65];
ca16be
    int            i;
ca16be
ca16be
    seed = (unsigned char *) sodium_malloc(crypto_kx_SEEDBYTES);
ca16be
    for (i = 0; i < crypto_kx_SEEDBYTES; i++) {
ca16be
        seed[i] = (unsigned char) i;
ca16be
    }
ca16be
    client_pk = (unsigned char *) sodium_malloc(crypto_kx_PUBLICKEYBYTES);
ca16be
    client_sk = (unsigned char *) sodium_malloc(crypto_kx_SECRETKEYBYTES);
ca16be
    crypto_kx_seed_keypair(client_pk, client_sk, seed);
ca16be
ca16be
    sodium_bin2hex(hex, sizeof hex, client_pk, crypto_kx_PUBLICKEYBYTES);
ca16be
    printf("client_pk: [%s]\n", hex);
ca16be
    sodium_bin2hex(hex, sizeof hex, client_sk, crypto_kx_SECRETKEYBYTES);
ca16be
    printf("client_sk: [%s]\n", hex);
ca16be
ca16be
    server_pk = (unsigned char *) sodium_malloc(crypto_kx_PUBLICKEYBYTES);
ca16be
    server_sk = (unsigned char *) sodium_malloc(crypto_kx_SECRETKEYBYTES);
ca16be
    crypto_kx_keypair(server_pk, server_sk);
ca16be
ca16be
    client_rx = (unsigned char *) sodium_malloc(crypto_kx_SESSIONKEYBYTES);
ca16be
    client_tx = (unsigned char *) sodium_malloc(crypto_kx_SESSIONKEYBYTES);
ca16be
ca16be
    assert(crypto_kx_client_session_keys(client_rx, client_tx,
ca16be
                                         client_pk, client_sk,
ca16be
                                         small_order_p) == -1);
ca16be
    if (crypto_kx_client_session_keys(client_rx, client_tx,
ca16be
                                      client_pk, client_sk, server_pk) != 0) {
ca16be
        printf("crypto_kx_client_session_keys() failed\n");
ca16be
    }
ca16be
ca16be
    server_rx = (unsigned char *) sodium_malloc(crypto_kx_SESSIONKEYBYTES);
ca16be
    server_tx = (unsigned char *) sodium_malloc(crypto_kx_SESSIONKEYBYTES);
ca16be
ca16be
    assert(crypto_kx_server_session_keys(server_rx, server_tx,
ca16be
                                         server_pk, server_sk,
ca16be
                                         small_order_p) == -1);
ca16be
    if (crypto_kx_server_session_keys(server_rx, server_tx,
ca16be
                                      server_pk, server_sk, client_pk) != 0) {
ca16be
        printf("crypto_kx_server_session_keys() failed\n");
ca16be
    }
ca16be
    if (memcmp(server_rx, client_tx, crypto_kx_SESSIONKEYBYTES) != 0 ||
ca16be
        memcmp(server_tx, client_rx, crypto_kx_SESSIONKEYBYTES) != 0) {
ca16be
        printf("client session keys != server session keys\n");
ca16be
    }
ca16be
ca16be
    sodium_increment(client_pk, crypto_kx_PUBLICKEYBYTES);
ca16be
    if (crypto_kx_server_session_keys(server_rx, server_tx,
ca16be
                                      server_pk, server_sk, client_pk) != 0) {
ca16be
        printf("crypto_kx_server_session_keys() failed\n");
ca16be
    }
ca16be
    if (memcmp(server_rx, client_tx, crypto_kx_SESSIONKEYBYTES) == 0 &&
ca16be
        memcmp(server_tx, client_rx, crypto_kx_SESSIONKEYBYTES) == 0) {
ca16be
        printf("peer's public key is ignored\n");
ca16be
    }
ca16be
ca16be
    crypto_kx_keypair(client_pk, client_sk);
ca16be
    if (crypto_kx_server_session_keys(server_rx, server_tx,
ca16be
                                      server_pk, server_sk, client_pk) != 0) {
ca16be
        printf("crypto_kx_server_session_keys() failed\n");
ca16be
    }
ca16be
    if (memcmp(server_rx, client_tx, crypto_kx_SESSIONKEYBYTES) == 0 ||
ca16be
        memcmp(server_tx, client_rx, crypto_kx_SESSIONKEYBYTES) == 0) {
ca16be
        printf("session keys are constant\n");
ca16be
    }
ca16be
ca16be
    crypto_kx_seed_keypair(client_pk, client_sk, seed);
ca16be
    sodium_increment(seed, crypto_kx_SEEDBYTES);
ca16be
    crypto_kx_seed_keypair(server_pk, server_sk, seed);
ca16be
    if (crypto_kx_server_session_keys(server_rx, server_tx,
ca16be
                                      server_pk, server_sk, client_pk) != 0) {
ca16be
        printf("crypto_kx_server_session_keys() failed\n");
ca16be
    }
ca16be
    sodium_bin2hex(hex, sizeof hex, server_rx, crypto_kx_SESSIONKEYBYTES);
ca16be
    printf("server_rx: [%s]\n", hex);
ca16be
    sodium_bin2hex(hex, sizeof hex, server_tx, crypto_kx_SESSIONKEYBYTES);
ca16be
    printf("server_tx: [%s]\n", hex);
ca16be
ca16be
    if (crypto_kx_client_session_keys(client_rx, client_tx,
ca16be
                                      client_pk, client_sk, server_pk) != 0) {
ca16be
        printf("crypto_kx_client_session_keys() failed\n");
ca16be
    }
ca16be
    sodium_bin2hex(hex, sizeof hex, client_rx, crypto_kx_SESSIONKEYBYTES);
ca16be
    printf("client_rx: [%s]\n", hex);
ca16be
    sodium_bin2hex(hex, sizeof hex, client_tx, crypto_kx_SESSIONKEYBYTES);
ca16be
    printf("client_tx: [%s]\n", hex);
ca16be
ca16be
    randombytes_buf(client_rx, crypto_kx_SESSIONKEYBYTES);
ca16be
    randombytes_buf(client_tx, crypto_kx_SESSIONKEYBYTES);
ca16be
    randombytes_buf(server_rx, crypto_kx_SESSIONKEYBYTES);
ca16be
    randombytes_buf(server_tx, crypto_kx_SESSIONKEYBYTES);
ca16be
    if (crypto_kx_client_session_keys(client_rx, NULL,
ca16be
                                      client_pk, client_sk, server_pk) != 0 ||
ca16be
        crypto_kx_client_session_keys(NULL, client_tx,
ca16be
                                      client_pk, client_sk, server_pk) != 0 ||
ca16be
        crypto_kx_server_session_keys(server_rx, NULL,
ca16be
                                      server_pk, server_sk, client_pk) != 0 ||
ca16be
        crypto_kx_server_session_keys(NULL, server_tx,
ca16be
                                      server_pk, server_sk, client_pk) != 0) {
ca16be
        printf("failure when one of the pointers happens to be NULL");
ca16be
    }
ca16be
    assert(memcmp(client_rx, client_tx, crypto_kx_SESSIONKEYBYTES) == 0);
ca16be
    assert(memcmp(client_tx, server_rx, crypto_kx_SESSIONKEYBYTES) == 0);
ca16be
    assert(memcmp(server_rx, server_tx, crypto_kx_SESSIONKEYBYTES) == 0);
ca16be
ca16be
    sodium_free(client_rx);
ca16be
    sodium_free(client_tx);
ca16be
    sodium_free(server_rx);
ca16be
    sodium_free(server_tx);
ca16be
    sodium_free(server_sk);
ca16be
    sodium_free(server_pk);
ca16be
    sodium_free(client_sk);
ca16be
    sodium_free(client_pk);
ca16be
    sodium_free(seed);
ca16be
ca16be
    assert(strcmp(crypto_kx_primitive(), crypto_kx_PRIMITIVE) == 0);
ca16be
    assert(crypto_kx_publickeybytes() == crypto_kx_PUBLICKEYBYTES);
ca16be
    assert(crypto_kx_secretkeybytes() == crypto_kx_SECRETKEYBYTES);
ca16be
    assert(crypto_kx_seedbytes() == crypto_kx_SEEDBYTES);
ca16be
    assert(crypto_kx_sessionkeybytes() == crypto_kx_SESSIONKEYBYTES);
ca16be
ca16be
    printf("tv_kx: ok\n");
ca16be
}
ca16be
ca16be
int
ca16be
main(void)
ca16be
{
ca16be
    tv_kx();
ca16be
ca16be
    return 0;
ca16be
}