purify
C++ Purify implementation with native circuit and BPP support
Loading...
Searching...
No Matches
curve.c File Reference
#include "curve.h"
#include <assert.h>
#include <string.h>

Go to the source code of this file.

Functions

static void purify_curve_copy_u256 (uint64_t out[4], const uint64_t value[4])
 
static void purify_curve_u256_narrow_u512_unchecked (uint64_t out[4], const uint64_t value[8])
 
static void purify_curve_u256_add_one_unchecked (uint64_t value[4])
 
static void purify_curve_u64_to_be (unsigned char out[8], uint64_t value)
 
static void purify_curve_tag_hash (unsigned char out[32])
 
static int purify_curve_hash_to_int_tagged_u320 (uint64_t out[5], const unsigned char *data, size_t data_len, const uint64_t range[5], unsigned char info_byte)
 
static purify_complete_projective_point purify_curve_complete_identity (void)
 
static purify_complete_projective_point purify_curve_secret_input_point (const purify_curve *curve, const purify_jacobian_point *point)
 
static void purify_curve_complete_assign (purify_complete_projective_point *dst, const purify_complete_projective_point *src, int flag)
 
static void purify_curve_complete_swap (purify_complete_projective_point *lhs, purify_complete_projective_point *rhs, int flag)
 
static purify_complete_projective_point purify_curve_complete_add (const purify_curve *curve, const purify_complete_projective_point *lhs, const purify_complete_projective_point *rhs)
 
static purify_complete_projective_point purify_curve_complete_double (const purify_curve *curve, const purify_complete_projective_point *point)
 
void purify_curve_prime_p (uint64_t out[4])
 
void purify_curve_order_n1 (uint64_t out[4])
 
void purify_curve_order_n2 (uint64_t out[4])
 
void purify_curve_half_n1 (uint64_t out[4])
 
void purify_curve_half_n2 (uint64_t out[4])
 
void purify_curve_packed_secret_key_space_size (uint64_t out[8])
 
void purify_curve_packed_public_key_space_size (uint64_t out[8])
 
void purify_curve_two_p (uint64_t out[5])
 
void purify_curve_field_a (purify_fe *out)
 
void purify_curve_field_b (purify_fe *out)
 
void purify_curve_field_d (purify_fe *out)
 
void purify_curve_field_di (purify_fe *out)
 
void purify_curve_jacobian_infinity (purify_jacobian_point *out)
 
void purify_curve_affine (purify_affine_point *out, const purify_curve *curve, const purify_jacobian_point *point)
 
void purify_curve_negate (purify_jacobian_point *out, const purify_jacobian_point *point)
 
int purify_curve_is_x_coord (const purify_curve *curve, const purify_fe *x)
 
int purify_curve_lift_x (purify_jacobian_point *out, const purify_curve *curve, const purify_fe *x)
 
void purify_curve_double (purify_jacobian_point *out, const purify_curve *curve, const purify_jacobian_point *point)
 
void purify_curve_add_mixed (purify_jacobian_point *out, const purify_curve *curve, const purify_jacobian_point *lhs, const purify_affine_point *rhs)
 
void purify_curve_add (purify_jacobian_point *out, const purify_curve *curve, const purify_jacobian_point *lhs, const purify_jacobian_point *rhs)
 
void purify_curve_mul (purify_jacobian_point *out, const purify_curve *curve, const purify_jacobian_point *point, const uint64_t scalar[4])
 
static void purify_curve_mul_secret_ladder_core (purify_complete_projective_point *out, const purify_curve *curve, const purify_jacobian_point *point, const uint64_t scalar[4])
 
int purify_curve_mul_secret_affine (purify_affine_point *out, const purify_curve *curve, const purify_jacobian_point *point, const uint64_t scalar[4])
 
int purify_curve_hash_to_curve (purify_jacobian_point *out, const purify_curve *curve, const unsigned char *data, size_t data_len)
 
int purify_curve_is_valid_secret_key (const uint64_t value[8])
 
int purify_curve_is_valid_public_key (const uint64_t value[8])
 
static void purify_curve_unpack_secret_from_valid (uint64_t first[4], uint64_t second[4], const uint64_t value[8])
 
int purify_curve_unpack_secret (uint64_t first[4], uint64_t second[4], const uint64_t value[8])
 
int purify_curve_unpack_public (uint64_t first[4], uint64_t second[4], const uint64_t value[8])
 
void purify_curve_pack_public (uint64_t out[8], const uint64_t x1[4], const uint64_t x2[4])
 
void purify_curve_combine (purify_fe *out, const purify_fe *x1, const purify_fe *x2)
 
int purify_curve_key_to_bits (int *out_bits, size_t out_len, const uint64_t value[4], const uint64_t max_value[4])
 

Variables

static const uint64_t kPurifyPrimeP [4]
 
static const uint64_t kPurifyOrderN1 [4]
 
static const uint64_t kPurifyOrderN2 [4]
 
static const uint64_t kPurifyHalfN1 [4]
 
static const uint64_t kPurifyHalfN2 [4]
 
static const uint64_t kPurifyFieldDi [4]
 
static const char kPurifyHashToCurveTag [] = "Purify/HashToCurve"
 

Function Documentation

◆ purify_curve_add()

◆ purify_curve_add_mixed()

◆ purify_curve_affine()

◆ purify_curve_combine()

void purify_curve_combine ( purify_fe out,
const purify_fe x1,
const purify_fe x2 
)

◆ purify_curve_complete_add()

◆ purify_curve_complete_assign()

static void purify_curve_complete_assign ( purify_complete_projective_point dst,
const purify_complete_projective_point src,
int  flag 
)
static

◆ purify_curve_complete_double()

◆ purify_curve_complete_identity()

◆ purify_curve_complete_swap()

static void purify_curve_complete_swap ( purify_complete_projective_point lhs,
purify_complete_projective_point rhs,
int  flag 
)
static

Definition at line 266 of file curve.c.

References purify_curve_complete_assign().

Referenced by purify_curve_mul_secret_ladder_core().

◆ purify_curve_copy_u256()

static void purify_curve_copy_u256 ( uint64_t  out[4],
const uint64_t  value[4] 
)
static

◆ purify_curve_double()

◆ purify_curve_field_a()

void purify_curve_field_a ( purify_fe out)

Definition at line 425 of file curve.c.

References purify_fe_set_u64().

Referenced by purify::field_a(), and purify_curve_combine().

◆ purify_curve_field_b()

void purify_curve_field_b ( purify_fe out)

Definition at line 429 of file curve.c.

References purify_fe_set_u64().

Referenced by purify::field_b(), and purify_curve_combine().

◆ purify_curve_field_d()

void purify_curve_field_d ( purify_fe out)

Definition at line 433 of file curve.c.

References purify_fe_set_u64().

Referenced by purify::field_d().

◆ purify_curve_field_di()

void purify_curve_field_di ( purify_fe out)

Definition at line 437 of file curve.c.

References kPurifyFieldDi, and purify_fe_set_u256().

Referenced by purify::field_di(), and purify_curve_combine().

◆ purify_curve_half_n1()

void purify_curve_half_n1 ( uint64_t  out[4])

Definition at line 404 of file curve.c.

References kPurifyHalfN1, and purify_curve_copy_u256().

Referenced by purify::half_n1().

◆ purify_curve_half_n2()

void purify_curve_half_n2 ( uint64_t  out[4])

Definition at line 408 of file curve.c.

References kPurifyHalfN2, and purify_curve_copy_u256().

Referenced by purify::half_n2().

◆ purify_curve_hash_to_curve()

int purify_curve_hash_to_curve ( purify_jacobian_point out,
const purify_curve curve,
const unsigned char *  data,
size_t  data_len 
)

◆ purify_curve_hash_to_int_tagged_u320()

static int purify_curve_hash_to_int_tagged_u320 ( uint64_t  out[5],
const unsigned char *  data,
size_t  data_len,
const uint64_t  range[5],
unsigned char  info_byte 
)
static

◆ purify_curve_is_valid_public_key()

int purify_curve_is_valid_public_key ( const uint64_t  value[8])

◆ purify_curve_is_valid_secret_key()

int purify_curve_is_valid_secret_key ( const uint64_t  value[8])

◆ purify_curve_is_x_coord()

int purify_curve_is_x_coord ( const purify_curve curve,
const purify_fe x 
)

◆ purify_curve_jacobian_infinity()

◆ purify_curve_key_to_bits()

int purify_curve_key_to_bits ( int *  out_bits,
size_t  out_len,
const uint64_t  value[4],
const uint64_t  max_value[4] 
)

Definition at line 937 of file curve.c.

References purify_curve_copy_u256().

Referenced by purify::key_to_bits().

◆ purify_curve_lift_x()

◆ purify_curve_mul()

void purify_curve_mul ( purify_jacobian_point out,
const purify_curve curve,
const purify_jacobian_point point,
const uint64_t  scalar[4] 
)

◆ purify_curve_mul_secret_affine()

◆ purify_curve_mul_secret_ladder_core()

static void purify_curve_mul_secret_ladder_core ( purify_complete_projective_point out,
const purify_curve curve,
const purify_jacobian_point point,
const uint64_t  scalar[4] 
)
static

◆ purify_curve_negate()

◆ purify_curve_order_n1()

void purify_curve_order_n1 ( uint64_t  out[4])

Definition at line 396 of file curve.c.

References kPurifyOrderN1, and purify_curve_copy_u256().

Referenced by purify::order_n1().

◆ purify_curve_order_n2()

void purify_curve_order_n2 ( uint64_t  out[4])

Definition at line 400 of file curve.c.

References kPurifyOrderN2, and purify_curve_copy_u256().

Referenced by purify::order_n2().

◆ purify_curve_pack_public()

void purify_curve_pack_public ( uint64_t  out[8],
const uint64_t  x1[4],
const uint64_t  x2[4] 
)

Definition at line 897 of file curve.c.

References kPurifyPrimeP, purify_u512_multiply_u256(), and purify_u512_widen_u256().

Referenced by purify::pack_public().

◆ purify_curve_packed_public_key_space_size()

void purify_curve_packed_public_key_space_size ( uint64_t  out[8])

◆ purify_curve_packed_secret_key_space_size()

void purify_curve_packed_secret_key_space_size ( uint64_t  out[8])

◆ purify_curve_prime_p()

void purify_curve_prime_p ( uint64_t  out[4])

Definition at line 392 of file curve.c.

References kPurifyPrimeP, and purify_curve_copy_u256().

Referenced by purify::prime_p().

◆ purify_curve_secret_input_point()

◆ purify_curve_tag_hash()

static void purify_curve_tag_hash ( unsigned char  out[32])
static

Definition at line 107 of file curve.c.

References kPurifyHashToCurveTag, and purify_sha256().

Referenced by purify_curve_hash_to_int_tagged_u320().

◆ purify_curve_two_p()

void purify_curve_two_p ( uint64_t  out[5])

Definition at line 420 of file curve.c.

References kPurifyPrimeP, and purify_u320_widen_u256().

Referenced by purify_curve_hash_to_curve(), and purify::two_p().

◆ purify_curve_u256_add_one_unchecked()

static void purify_curve_u256_add_one_unchecked ( uint64_t  value[4])
static

Definition at line 87 of file curve.c.

Referenced by purify_curve_unpack_secret_from_valid().

◆ purify_curve_u256_narrow_u512_unchecked()

static void purify_curve_u256_narrow_u512_unchecked ( uint64_t  out[4],
const uint64_t  value[8] 
)
static

Definition at line 83 of file curve.c.

Referenced by purify_curve_unpack_secret_from_valid().

◆ purify_curve_u64_to_be()

static void purify_curve_u64_to_be ( unsigned char  out[8],
uint64_t  value 
)
static

Definition at line 99 of file curve.c.

Referenced by purify_curve_hash_to_int_tagged_u320().

◆ purify_curve_unpack_public()

int purify_curve_unpack_public ( uint64_t  first[4],
uint64_t  second[4],
const uint64_t  value[8] 
)

◆ purify_curve_unpack_secret()

int purify_curve_unpack_secret ( uint64_t  first[4],
uint64_t  second[4],
const uint64_t  value[8] 
)

◆ purify_curve_unpack_secret_from_valid()

static void purify_curve_unpack_secret_from_valid ( uint64_t  first[4],
uint64_t  second[4],
const uint64_t  value[8] 
)
static

Variable Documentation

◆ kPurifyFieldDi

const uint64_t kPurifyFieldDi[4]
static
Initial value:
= {
UINT64_C(0x4CBA8C385348E6E7),
UINT64_C(0xE445F1F5DFB6A67E),
UINT64_C(0x6666666666666665),
UINT64_C(0x6666666666666666),
}

Definition at line 66 of file curve.c.

Referenced by purify_curve_field_di().

◆ kPurifyHalfN1

const uint64_t kPurifyHalfN1[4]
static
Initial value:
= {
UINT64_C(0x452D15162C72A3F4),
UINT64_C(0xD1947922029A3909),
UINT64_C(0xFFFFFFFFFFFFFFFF),
UINT64_C(0x7FFFFFFFFFFFFFFF),
}

Definition at line 44 of file curve.c.

Referenced by purify_curve_half_n1(), purify_curve_packed_secret_key_space_size(), and purify_curve_unpack_secret_from_valid().

◆ kPurifyHalfN2

const uint64_t kPurifyHalfN2[4]
static
Initial value:
= {
UINT64_C(0x7AA54976A3C39D4D),
UINT64_C(0xE91A63C4ACAE6732),
UINT64_C(0xFFFFFFFFFFFFFFFE),
UINT64_C(0x7FFFFFFFFFFFFFFF),
}

Definition at line 55 of file curve.c.

Referenced by purify_curve_half_n2(), and purify_curve_packed_secret_key_space_size().

◆ kPurifyHashToCurveTag

const char kPurifyHashToCurveTag[] = "Purify/HashToCurve"
static

Definition at line 77 of file curve.c.

Referenced by purify_curve_tag_hash().

◆ kPurifyOrderN1

const uint64_t kPurifyOrderN1[4]
static
Initial value:
= {
UINT64_C(0x8A5A2A2C58E547E9),
UINT64_C(0xA328F24405347212),
UINT64_C(0xFFFFFFFFFFFFFFFF),
UINT64_C(0xFFFFFFFFFFFFFFFF),
}

Definition at line 22 of file curve.c.

Referenced by purify_curve_order_n1().

◆ kPurifyOrderN2

const uint64_t kPurifyOrderN2[4]
static
Initial value:
= {
UINT64_C(0xF54A92ED47873A9B),
UINT64_C(0xD234C789595CCE64),
UINT64_C(0xFFFFFFFFFFFFFFFD),
UINT64_C(0xFFFFFFFFFFFFFFFF),
}

Definition at line 33 of file curve.c.

Referenced by purify_curve_order_n2().

◆ kPurifyPrimeP

const uint64_t kPurifyPrimeP[4]
static
Initial value:
= {
UINT64_C(0xBFD25E8CD0364141),
UINT64_C(0xBAAEDCE6AF48A03B),
UINT64_C(0xFFFFFFFFFFFFFFFE),
UINT64_C(0xFFFFFFFFFFFFFFFF),
}

Definition at line 10 of file curve.c.

Referenced by purify_curve_pack_public(), purify_curve_packed_public_key_space_size(), purify_curve_prime_p(), purify_curve_two_p(), and purify_curve_unpack_public().