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

rdobuilder 775784
rdobuilder 775784
#define TEST_NAME "box_easy2"
rdobuilder 775784
#include "cmptest.h"
rdobuilder 775784
rdobuilder 775784
static const unsigned char small_order_p[crypto_box_PUBLICKEYBYTES] = {
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
int
rdobuilder 775784
main(void)
rdobuilder 775784
{
rdobuilder 775784
    unsigned char *alicepk;
rdobuilder 775784
    unsigned char *alicesk;
rdobuilder 775784
    unsigned char *bobpk;
rdobuilder 775784
    unsigned char *bobsk;
rdobuilder 775784
    unsigned char *mac;
rdobuilder 775784
    unsigned char *nonce;
rdobuilder 775784
    unsigned char *k1;
rdobuilder 775784
    unsigned char *k2;
rdobuilder 775784
    unsigned char *m;
rdobuilder 775784
    unsigned char *m2;
rdobuilder 775784
    unsigned char *c;
rdobuilder 775784
    size_t         mlen;
rdobuilder 775784
    size_t         i;
rdobuilder 775784
    size_t         m_size;
rdobuilder 775784
    size_t         m2_size;
rdobuilder 775784
    size_t         c_size;
rdobuilder 775784
    int            ret;
rdobuilder 775784
rdobuilder 775784
    m2_size = m_size = 7U + randombytes_uniform(1000);
rdobuilder 775784
    c_size           = crypto_box_MACBYTES + m_size;
rdobuilder 775784
    m                = (unsigned char *) sodium_malloc(m_size);
rdobuilder 775784
    m2               = (unsigned char *) sodium_malloc(m2_size);
rdobuilder 775784
    c                = (unsigned char *) sodium_malloc(c_size);
rdobuilder 775784
    alicepk = (unsigned char *) sodium_malloc(crypto_box_PUBLICKEYBYTES);
rdobuilder 775784
    alicesk = (unsigned char *) sodium_malloc(crypto_box_SECRETKEYBYTES);
rdobuilder 775784
    bobpk   = (unsigned char *) sodium_malloc(crypto_box_PUBLICKEYBYTES);
rdobuilder 775784
    bobsk   = (unsigned char *) sodium_malloc(crypto_box_SECRETKEYBYTES);
rdobuilder 775784
    mac     = (unsigned char *) sodium_malloc(crypto_box_MACBYTES);
rdobuilder 775784
    nonce   = (unsigned char *) sodium_malloc(crypto_box_NONCEBYTES);
rdobuilder 775784
    k1      = (unsigned char *) sodium_malloc(crypto_box_BEFORENMBYTES);
rdobuilder 775784
    k2      = (unsigned char *) sodium_malloc(crypto_box_BEFORENMBYTES);
rdobuilder 775784
    crypto_box_keypair(alicepk, alicesk);
rdobuilder 775784
    crypto_box_keypair(bobpk, bobsk);
rdobuilder 775784
    mlen = (size_t) randombytes_uniform((uint32_t) m_size) + 1U;
rdobuilder 775784
    randombytes_buf(m, mlen);
rdobuilder 775784
    randombytes_buf(nonce, crypto_box_NONCEBYTES);
rdobuilder 775784
    ret = crypto_box_easy(c, m, mlen, nonce, bobpk, alicesk);
rdobuilder 775784
    assert(ret == 0);
rdobuilder 775784
    if (crypto_box_open_easy(m2, c,
rdobuilder 775784
                             (unsigned long long) mlen + crypto_box_MACBYTES,
rdobuilder 775784
                             nonce, alicepk, bobsk) != 0) {
rdobuilder 775784
        printf("open() failed");
rdobuilder 775784
        return 1;
rdobuilder 775784
    }
rdobuilder 775784
    printf("%d\n", memcmp(m, m2, mlen));
rdobuilder 775784
rdobuilder 775784
    for (i = 0; i < mlen + crypto_box_MACBYTES - 1; i++) {
rdobuilder 775784
        if (crypto_box_open_easy(m2, c, (unsigned long long) i, nonce, alicepk,
rdobuilder 775784
                                 bobsk) == 0) {
rdobuilder 775784
            printf("short open() should have failed");
rdobuilder 775784
            return 1;
rdobuilder 775784
        }
rdobuilder 775784
    }
rdobuilder 775784
    memcpy(c, m, mlen);
rdobuilder 775784
    ret =
rdobuilder 775784
        crypto_box_easy(c, c, (unsigned long long) mlen, nonce, bobpk, alicesk);
rdobuilder 775784
    assert(ret == 0);
rdobuilder 775784
    printf("%d\n", memcmp(m, c, mlen) == 0);
rdobuilder 775784
    printf("%d\n", memcmp(m, c + crypto_box_MACBYTES, mlen) == 0);
rdobuilder 775784
    if (crypto_box_open_easy(c, c,
rdobuilder 775784
                             (unsigned long long) mlen + crypto_box_MACBYTES,
rdobuilder 775784
                             nonce, alicepk, bobsk) != 0) {
rdobuilder 775784
        printf("crypto_box_open_easy() failed\n");
rdobuilder 775784
    }
rdobuilder 775784
rdobuilder 775784
    ret = crypto_box_beforenm(k1, small_order_p, bobsk);
rdobuilder 775784
    assert(ret == -1);
rdobuilder 775784
    ret = crypto_box_beforenm(k2, small_order_p, alicesk);
rdobuilder 775784
    assert(ret == -1);
rdobuilder 775784
rdobuilder 775784
    ret = crypto_box_beforenm(k1, alicepk, bobsk);
rdobuilder 775784
    assert(ret == 0);
rdobuilder 775784
    ret = crypto_box_beforenm(k2, bobpk, alicesk);
rdobuilder 775784
    assert(ret == 0);
rdobuilder 775784
rdobuilder 775784
    memset(m2, 0, m2_size);
rdobuilder 775784
rdobuilder 775784
    if (crypto_box_easy_afternm(c, m, 0, nonce, k1) != 0) {
rdobuilder 775784
        printf(
rdobuilder 775784
            "crypto_box_easy_afternm() with a null ciphertext should have "
rdobuilder 775784
            "worked\n");
rdobuilder 775784
    }
rdobuilder 775784
    crypto_box_easy_afternm(c, m, (unsigned long long) mlen, nonce, k1);
rdobuilder 775784
    if (crypto_box_open_easy_afternm(
rdobuilder 775784
            m2, c, (unsigned long long) mlen + crypto_box_MACBYTES, nonce,
rdobuilder 775784
            k2) != 0) {
rdobuilder 775784
        printf("crypto_box_open_easy_afternm() failed\n");
rdobuilder 775784
    }
rdobuilder 775784
    printf("%d\n", memcmp(m, m2, mlen));
rdobuilder 775784
    if (crypto_box_open_easy_afternm(m2, c, crypto_box_MACBYTES - 1U, nonce,
rdobuilder 775784
                                     k2) == 0) {
rdobuilder 775784
        printf(
rdobuilder 775784
            "crypto_box_open_easy_afternm() with a huge ciphertext should have "
rdobuilder 775784
            "failed\n");
rdobuilder 775784
    }
rdobuilder 775784
    memset(m2, 0, m2_size);
rdobuilder 775784
    ret = crypto_box_detached(c, mac, m, (unsigned long long) mlen, nonce,
rdobuilder 775784
                              small_order_p, bobsk);
rdobuilder 775784
    assert(ret == -1);
rdobuilder 775784
    ret = crypto_box_detached(c, mac, m, (unsigned long long) mlen, nonce,
rdobuilder 775784
                              alicepk, bobsk);
rdobuilder 775784
    assert(ret == 0);
rdobuilder 775784
    if (crypto_box_open_detached(m2, c, mac, (unsigned long long) mlen, nonce,
rdobuilder 775784
                                 small_order_p, alicesk) != -1) {
rdobuilder 775784
        printf("crypto_box_open_detached() with a weak key passed\n");
rdobuilder 775784
    }
rdobuilder 775784
    if (crypto_box_open_detached(m2, c, mac, (unsigned long long) mlen, nonce,
rdobuilder 775784
                                 bobpk, alicesk) != 0) {
rdobuilder 775784
        printf("crypto_box_open_detached() failed\n");
rdobuilder 775784
    }
rdobuilder 775784
    printf("%d\n", memcmp(m, m2, mlen));
rdobuilder 775784
rdobuilder 775784
    memset(m2, 0, m2_size);
rdobuilder 775784
    crypto_box_detached_afternm(c, mac, m, (unsigned long long) mlen, nonce,
rdobuilder 775784
                                k1);
rdobuilder 775784
    if (crypto_box_open_detached_afternm(m2, c, mac, (unsigned long long) mlen,
rdobuilder 775784
                                         nonce, k2) != 0) {
rdobuilder 775784
        printf("crypto_box_open_detached_afternm() failed\n");
rdobuilder 775784
    }
rdobuilder 775784
    printf("%d\n", memcmp(m, m2, mlen));
rdobuilder 775784
rdobuilder 775784
    sodium_free(alicepk);
rdobuilder 775784
    sodium_free(alicesk);
rdobuilder 775784
    sodium_free(bobpk);
rdobuilder 775784
    sodium_free(bobsk);
rdobuilder 775784
    sodium_free(mac);
rdobuilder 775784
    sodium_free(nonce);
rdobuilder 775784
    sodium_free(k1);
rdobuilder 775784
    sodium_free(k2);
rdobuilder 775784
    sodium_free(m);
rdobuilder 775784
    sodium_free(m2);
rdobuilder 775784
    sodium_free(c);
rdobuilder 775784
    printf("OK\n");
rdobuilder 775784
rdobuilder 775784
    return 0;
rdobuilder 775784
}