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

rdobuilder 775784
#define TEST_NAME "scalarmult_ed25519"
rdobuilder 775784
#include "cmptest.h"
rdobuilder 775784
rdobuilder 775784
static const unsigned char non_canonical_p[32] = {
rdobuilder 775784
    0xf6, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
rdobuilder 775784
    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f
rdobuilder 775784
};
rdobuilder 775784
static const unsigned char non_canonical_invalid_p[32] = {
rdobuilder 775784
    0xf5, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
rdobuilder 775784
    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f
rdobuilder 775784
};
rdobuilder 775784
static const unsigned char max_canonical_p[32] = {
rdobuilder 775784
    0xe4, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
rdobuilder 775784
    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f
rdobuilder 775784
};
rdobuilder 775784
rdobuilder 775784
static const unsigned char B[32] = {
rdobuilder 775784
    0x58, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66,
rdobuilder 775784
    0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66, 0x66
rdobuilder 775784
};
rdobuilder 775784
rdobuilder 775784
int
rdobuilder 775784
main(void)
rdobuilder 775784
{
rdobuilder 775784
    unsigned char *n, *p, *q, *q2;
rdobuilder 775784
rdobuilder 775784
    n = (unsigned char *) sodium_malloc(crypto_scalarmult_ed25519_SCALARBYTES);
rdobuilder 775784
    p = (unsigned char *) sodium_malloc(crypto_scalarmult_ed25519_BYTES);
rdobuilder 775784
    q = (unsigned char *) sodium_malloc(crypto_scalarmult_ed25519_BYTES);
rdobuilder 775784
    q2 = (unsigned char *) sodium_malloc(crypto_scalarmult_ed25519_BYTES);
rdobuilder 775784
rdobuilder 775784
    randombytes_buf(n, crypto_scalarmult_ed25519_SCALARBYTES);
rdobuilder 775784
    if (crypto_scalarmult_ed25519_base(q, n) != 0) {
rdobuilder 775784
        printf("crypto_scalarmult_ed25519_base() failed\n");
rdobuilder 775784
    }
rdobuilder 775784
    memcpy(p, B, crypto_scalarmult_ed25519_BYTES);
rdobuilder 775784
    if (crypto_scalarmult_ed25519(q2, n, p) != 0) {
rdobuilder 775784
        printf("crypto_scalarmult_ed25519() failed\n");
rdobuilder 775784
    }
rdobuilder 775784
    if (memcmp(q, q2, crypto_scalarmult_ed25519_BYTES) != 0) {
rdobuilder 775784
        printf("crypto_scalarmult_ed25519_base(n) != crypto_scalarmult_ed25519(n, 9)\n");
rdobuilder 775784
    }
rdobuilder 775784
rdobuilder 775784
    memset(n, 0, crypto_scalarmult_ed25519_SCALARBYTES);
rdobuilder 775784
    if (crypto_scalarmult_ed25519_base(q, n) != -1) {
rdobuilder 775784
        printf("crypto_scalarmult_ed25519_base(0) passed\n");
rdobuilder 775784
    }
rdobuilder 775784
    if (crypto_scalarmult_ed25519(q2, n, p) != -1) {
rdobuilder 775784
        printf("crypto_scalarmult_ed25519(0) passed\n");
rdobuilder 775784
    }
rdobuilder 775784
    if (crypto_scalarmult_ed25519_noclamp(q2, n, p) != -1) {
rdobuilder 775784
        printf("crypto_scalarmult_ed25519_noclamp(0) passed\n");
rdobuilder 775784
    }
rdobuilder 775784
rdobuilder 775784
    n[0] = 1;
rdobuilder 775784
    if (crypto_scalarmult_ed25519_base(q, n) != 0) {
rdobuilder 775784
        printf("crypto_scalarmult_ed25519_base() failed\n");
rdobuilder 775784
    }
rdobuilder 775784
    if (crypto_scalarmult_ed25519(q2, n, p) != 0) {
rdobuilder 775784
        printf("crypto_scalarmult_ed25519() failed\n");
rdobuilder 775784
    }
rdobuilder 775784
    if (crypto_scalarmult_ed25519_noclamp(q2, n, p) != 0) {
rdobuilder 775784
        printf("crypto_scalarmult_ed25519_noclamp() failed\n");
rdobuilder 775784
    }
rdobuilder 775784
rdobuilder 775784
    if (crypto_scalarmult_ed25519(q, n, non_canonical_p) != -1) {
rdobuilder 775784
        printf("crypto_scalarmult_ed25519() didn't fail\n");
rdobuilder 775784
    }
rdobuilder 775784
    if (crypto_scalarmult_ed25519(q, n, non_canonical_invalid_p) != -1) {
rdobuilder 775784
        printf("crypto_scalarmult_ed25519() didn't fail\n");
rdobuilder 775784
    }
rdobuilder 775784
    if (crypto_scalarmult_ed25519(q, n, max_canonical_p) != 0) {
rdobuilder 775784
        printf("crypto_scalarmult_ed25519() failed\n");
rdobuilder 775784
    }
rdobuilder 775784
rdobuilder 775784
    n[0] = 9;
rdobuilder 775784
    if (crypto_scalarmult_ed25519(q, n, p) != 0) {
rdobuilder 775784
        printf("crypto_scalarmult_ed25519() failed\n");
rdobuilder 775784
    }
rdobuilder 775784
    if (crypto_scalarmult_ed25519_noclamp(q2, n, p) != 0) {
rdobuilder 775784
        printf("crypto_scalarmult_ed25519_noclamp() failed\n");
rdobuilder 775784
    }
rdobuilder 775784
    if (memcmp(q, q2, crypto_scalarmult_ed25519_BYTES) == 0) {
rdobuilder 775784
        printf("clamping not applied\n");
rdobuilder 775784
    }
rdobuilder 775784
rdobuilder 775784
    n[0] = 9;
rdobuilder 775784
    if (crypto_scalarmult_ed25519_base(q, n) != 0) {
rdobuilder 775784
        printf("crypto_scalarmult_ed25519_base() failed\n");
rdobuilder 775784
    }
rdobuilder 775784
    if (crypto_scalarmult_ed25519_base_noclamp(q2, n) != 0) {
rdobuilder 775784
        printf("crypto_scalarmult_ed25519_base_noclamp() failed\n");
rdobuilder 775784
    }
rdobuilder 775784
    if (memcmp(q, q2, crypto_scalarmult_ed25519_BYTES) == 0) {
rdobuilder 775784
        printf("clamping not applied\n");
rdobuilder 775784
    }
rdobuilder 775784
rdobuilder 775784
    n[0] = 8;
rdobuilder 775784
    n[31] = 64;
rdobuilder 775784
    if (crypto_scalarmult_ed25519_noclamp(q2, n, p) != 0) {
rdobuilder 775784
        printf("crypto_scalarmult_ed25519_noclamp() failed\n");
rdobuilder 775784
    }
rdobuilder 775784
    if (memcmp(q, q2, crypto_scalarmult_ed25519_BYTES) != 0) {
rdobuilder 775784
        printf("inconsistent clamping\n");
rdobuilder 775784
    }
rdobuilder 775784
rdobuilder 775784
    memset(p, 0, crypto_scalarmult_ed25519_BYTES);
rdobuilder 775784
    if (crypto_scalarmult_ed25519(q, n, p) != -1) {
rdobuilder 775784
        printf("crypto_scalarmult_ed25519() didn't fail\n");
rdobuilder 775784
    }
rdobuilder 775784
    if (crypto_scalarmult_ed25519_noclamp(q, n, p) != -1) {
rdobuilder 775784
        printf("crypto_scalarmult_ed25519_noclamp() didn't fail\n");
rdobuilder 775784
    }
rdobuilder 775784
rdobuilder 775784
    n[0] = 8;
rdobuilder 775784
    if (crypto_scalarmult_ed25519(q, n, p) != -1) {
rdobuilder 775784
        printf("crypto_scalarmult_ed25519() didn't fail\n");
rdobuilder 775784
    }
rdobuilder 775784
    if (crypto_scalarmult_ed25519_noclamp(q, n, p) != -1) {
rdobuilder 775784
        printf("crypto_scalarmult_ed25519_noclamp() didn't fail\n");
rdobuilder 775784
    }
rdobuilder 775784
rdobuilder 775784
    sodium_free(q2);
rdobuilder 775784
    sodium_free(q);
rdobuilder 775784
    sodium_free(p);
rdobuilder 775784
    sodium_free(n);
rdobuilder 775784
rdobuilder 775784
    assert(crypto_scalarmult_ed25519_BYTES == crypto_scalarmult_ed25519_bytes());
rdobuilder 775784
    assert(crypto_scalarmult_ed25519_SCALARBYTES == crypto_scalarmult_ed25519_scalarbytes());
rdobuilder 775784
rdobuilder 775784
    printf("OK\n");
rdobuilder 775784
rdobuilder 775784
    return 0;
rdobuilder 775784
}