1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160
|
#include "mirage_crypto.h"
/* Microsoft compiler does not support 128-bit integers. Drop down to
* 32-bit for MSVC.
*/
#if defined(ARCH_64BIT) && !defined(_MSC_VER)
#include "p256_64.h"
#define LIMBS 4
#define WORD uint64_t
#define WORDSIZE 64
#include "p256_tables_64.h"
#else
#include "p256_32.h"
#define LIMBS 8
#define WORD uint32_t
#define WORDSIZE 32
#include "p256_tables_32.h"
#endif
#define LEN_PRIME 256
#define CURVE_DESCRIPTION fiat_p256
#include "inversion_template.h"
#include "point_operations.h"
#include <caml/memory.h>
CAMLprim value mc_p256_sub(value out, value a, value b)
{
CAMLparam3(out, a, b);
fiat_p256_sub((WORD*)Bytes_val(out), (const WORD*)String_val(a), (const WORD*)String_val(b));
CAMLreturn(Val_unit);
}
CAMLprim value mc_p256_add(value out, value a, value b)
{
CAMLparam3(out, a, b);
fiat_p256_add((WORD*)Bytes_val(out), (const WORD*)String_val(a), (const WORD*)String_val(b));
CAMLreturn(Val_unit);
}
CAMLprim value mc_p256_mul(value out, value a, value b)
{
CAMLparam3(out, a, b);
fiat_p256_mul((WORD*)Bytes_val(out), (const WORD*)String_val(a), (const WORD*)String_val(b));
CAMLreturn(Val_unit);
}
CAMLprim value mc_p256_from_bytes(value out, value in)
{
CAMLparam2(out, in);
fiat_p256_from_bytes((WORD*)Bytes_val(out), _st_uint8(in));
CAMLreturn(Val_unit);
}
CAMLprim value mc_p256_to_bytes(value out, value in)
{
CAMLparam2(out, in);
fiat_p256_to_bytes(Bytes_val(out), (const WORD*)String_val(in));
CAMLreturn(Val_unit);
}
CAMLprim value mc_p256_sqr(value out, value in)
{
CAMLparam2(out, in);
fiat_p256_square((WORD*)Bytes_val(out), (const WORD*)String_val(in));
CAMLreturn(Val_unit);
}
CAMLprim value mc_p256_from_montgomery(value out, value in)
{
CAMLparam2(out, in);
fiat_p256_from_montgomery((WORD*)Bytes_val(out), (const WORD*)String_val(in));
CAMLreturn(Val_unit);
}
CAMLprim value mc_p256_to_montgomery(value out, value in)
{
CAMLparam2(out, in);
fiat_p256_to_montgomery((WORD*)Bytes_val(out), (const WORD*)String_val(in));
CAMLreturn(Val_unit);
}
CAMLprim value mc_p256_nz(value x)
{
CAMLparam1(x);
CAMLreturn(Val_bool(fe_nz((const WORD*)String_val(x))));
}
CAMLprim value mc_p256_set_one(value x)
{
CAMLparam1(x);
fiat_p256_set_one((WORD*)Bytes_val(x));
CAMLreturn(Val_unit);
}
CAMLprim value mc_p256_inv(value out, value in)
{
CAMLparam2(out, in);
inversion((WORD*)Bytes_val(out), (const WORD*)String_val(in));
CAMLreturn(Val_unit);
}
CAMLprim value mc_p256_point_double(value out, value in)
{
CAMLparam2(out, in);
point_double(
(WORD*)Bytes_val(Field(out, 0)),
(WORD*)Bytes_val(Field(out, 1)),
(WORD*)Bytes_val(Field(out, 2)),
(const WORD*)String_val(Field(in, 0)),
(const WORD*)String_val(Field(in, 1)),
(const WORD*)String_val(Field(in, 2))
);
CAMLreturn(Val_unit);
}
CAMLprim value mc_p256_point_add(value out, value p, value q)
{
CAMLparam3(out, p, q);
point_add(
(WORD*)Bytes_val(Field(out, 0)),
(WORD*)Bytes_val(Field(out, 1)),
(WORD*)Bytes_val(Field(out, 2)),
(const WORD*)String_val(Field(p, 0)),
(const WORD*)String_val(Field(p, 1)),
(const WORD*)String_val(Field(p, 2)),
0,
(const WORD*)String_val(Field(q, 0)),
(const WORD*)String_val(Field(q, 1)),
(const WORD*)String_val(Field(q, 2))
);
CAMLreturn(Val_unit);
}
CAMLprim value mc_p256_select(value out, value bit, value t, value f)
{
CAMLparam4(out, bit, t, f);
fe_cmovznz(
(WORD*)Bytes_val(out),
Bool_val(bit),
(const WORD*)String_val(f),
(const WORD*)String_val(t)
);
CAMLreturn(Val_unit);
}
CAMLprim value mc_p256_scalar_mult_base(value out, value s)
{
CAMLparam2(out, s);
scalar_mult_base(
(WORD *) Bytes_val(Field(out, 0)),
(WORD *) Bytes_val(Field(out, 1)),
(WORD *) Bytes_val(Field(out, 2)),
_st_uint8(s),
caml_string_length(s)
);
CAMLreturn(Val_unit);
}
|