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

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