packages feed

crypton-2.1.3: cbits/tests/ct/ct_p256.c

/* The two P-256 scalar multiplications and the scalar inversion, all of
 * which take the private key as the scalar. */
#include "tests/ct/ct.h"
#include <string.h>
#include "p256/p256.h"

void crypton_p256e_point_mul(const crypton_p256_int *n,
    const crypton_p256_int *ix, const crypton_p256_int *iy,
    crypton_p256_int *ox, crypton_p256_int *oy);
void crypton_p256e_scalar_invert(const crypton_p256_int *a,
                                 crypton_p256_int *b);

int main(void) {
    crypton_p256_int n, px, py, ox, oy, inv, one;
    int i;

    /* a public point to be multiplied: the generator's 0x9e3779b9 multiple */
    crypton_p256_init(&one);
    P256_DIGIT(&one, 0) = 0x9e3779b9u;
    crypton_p256_base_point_mul(&one, &px, &py);

    for (i = 0; i < P256_NDIGITS; i++)
        P256_DIGIT(&n, i) = (crypton_p256_digit)ct_rnd();
    crypton_p256_mod(&crypton_SECP256r1_n, &n, &n);

    CT_SECRET(&n, sizeof n);

    crypton_p256_base_point_mul(&n, &ox, &oy);
    CT_PUBLIC(&ox, sizeof ox);
    CT_PUBLIC(&oy, sizeof oy);
    ct_sink(&ox, sizeof ox);

    crypton_p256e_point_mul(&n, &px, &py, &ox, &oy);
    CT_PUBLIC(&ox, sizeof ox);
    CT_PUBLIC(&oy, sizeof oy);
    ct_sink(&oy, sizeof oy);

    crypton_p256e_scalar_invert(&n, &inv);
    CT_PUBLIC(&inv, sizeof inv);
    ct_sink(&inv, sizeof inv);
    return 0;
}