libdecaf
point_448.h
Go to the documentation of this file.
1
15#ifndef __DECAF_POINT_448_H__
16#define __DECAF_POINT_448_H__ 1
17
18#include <decaf/common.h>
19
20#ifdef __cplusplus
21extern "C" {
22#endif
23
25#define DECAF_448_SCALAR_LIMBS ((446-1)/DECAF_WORD_BITS+1)
29#define DECAF_448_SCALAR_BITS 446
30
32#ifndef __DECAF_448_GF_DEFINED__
33#define __DECAF_448_GF_DEFINED__ 1
35typedef struct gf_448_s {
37} __attribute__((aligned(32))) gf_448_s, gf_448_t[1];
38#endif /* __DECAF_448_GF_DEFINED__ */
42#define DECAF_448_SER_BYTES 56
43
47#define DECAF_448_HASH_BYTES 56
48
50#define DECAF_448_SCALAR_BYTES 56
51
53#define DECAF_448_INVERT_ELLIGATOR_WHICH_BITS 3
54
56#define DECAF_448_REMOVED_COFACTOR 4
57
59#define DECAF_X448_ENCODE_RATIO 2
60
62#define DECAF_X448_PUBLIC_BYTES 56
63
65#define DECAF_X448_PRIVATE_BYTES 56
66
68typedef struct decaf_448_point_s {
70 gf_448_t x,y,z,t; /* Twisted extended homogeneous coordinates */
73
76
79
81DECAF_API_VIS extern const size_t decaf_448_sizeof_precomputed_s, decaf_448_alignof_precomputed_s;
82
84typedef struct decaf_448_scalar_s {
86 decaf_word_t limb[DECAF_448_SCALAR_LIMBS];
89
90#if defined _MSC_VER
91
93extern const decaf_448_scalar_t DECAF_API_VIS decaf_448_scalar_one;
94
96extern const decaf_448_scalar_t DECAF_API_VIS decaf_448_scalar_zero;
97
99extern const decaf_448_point_t DECAF_API_VIS decaf_448_point_identity;
100
102extern const decaf_448_point_t DECAF_API_VIS decaf_448_point_base;
103
105extern const struct DECAF_API_VIS decaf_448_precomputed_s *decaf_448_precomputed_base;
106
107
108#else // _MSC_VER
109
111DECAF_API_VIS extern const decaf_448_scalar_t decaf_448_scalar_one;
112
114DECAF_API_VIS extern const decaf_448_scalar_t decaf_448_scalar_zero;
115
117DECAF_API_VIS extern const decaf_448_point_t decaf_448_point_identity;
118
120DECAF_API_VIS extern const decaf_448_point_t decaf_448_point_base;
121
123DECAF_API_VIS extern const struct decaf_448_precomputed_s *decaf_448_precomputed_base;
124
125#endif // _MSC_VER
136decaf_error_t DECAF_API_VIS decaf_448_scalar_decode (
138 const unsigned char ser[DECAF_448_SCALAR_BYTES]
139) DECAF_WARN_UNUSED DECAF_NONNULL DECAF_NOINLINE;
140
151 const unsigned char *ser,
152 size_t ser_len
153) DECAF_NONNULL DECAF_NOINLINE;
154
161void DECAF_API_VIS decaf_448_scalar_encode (
162 unsigned char ser[DECAF_448_SCALAR_BYTES],
163 const decaf_448_scalar_t s
164) DECAF_NONNULL DECAF_NOINLINE DECAF_NOINLINE;
165
172void DECAF_API_VIS decaf_448_scalar_add (
174 const decaf_448_scalar_t a,
175 const decaf_448_scalar_t b
176) DECAF_NONNULL DECAF_NOINLINE;
177
186 const decaf_448_scalar_t a,
187 const decaf_448_scalar_t b
188) DECAF_WARN_UNUSED DECAF_NONNULL DECAF_NOINLINE;
189
196void DECAF_API_VIS decaf_448_scalar_sub (
198 const decaf_448_scalar_t a,
199 const decaf_448_scalar_t b
200) DECAF_NONNULL DECAF_NOINLINE;
201
208void DECAF_API_VIS decaf_448_scalar_mul (
210 const decaf_448_scalar_t a,
211 const decaf_448_scalar_t b
212) DECAF_NONNULL DECAF_NOINLINE;
213
219void DECAF_API_VIS decaf_448_scalar_halve (
221 const decaf_448_scalar_t a
222) DECAF_NONNULL DECAF_NOINLINE;
223
232 const decaf_448_scalar_t a
233) DECAF_WARN_UNUSED DECAF_NONNULL DECAF_NOINLINE;
234
241static inline void DECAF_NONNULL decaf_448_scalar_copy (
243 const decaf_448_scalar_t a
244) {
245 *out = *a;
246}
247
255 uint64_t a
256) DECAF_NONNULL;
257
264void DECAF_API_VIS decaf_448_point_encode (
265 uint8_t ser[DECAF_448_SER_BYTES],
266 const decaf_448_point_t pt
267) DECAF_NONNULL DECAF_NOINLINE;
268
285 const uint8_t ser[DECAF_448_SER_BYTES],
286 decaf_bool_t allow_identity
287) DECAF_WARN_UNUSED DECAF_NONNULL DECAF_NOINLINE;
288
296static inline void DECAF_NONNULL decaf_448_point_copy (
298 const decaf_448_point_t b
299) {
300 *a=*b;
301}
302
313 const decaf_448_point_t a,
314 const decaf_448_point_t b
315) DECAF_WARN_UNUSED DECAF_NONNULL DECAF_NOINLINE;
316
326void DECAF_API_VIS decaf_448_point_add (
328 const decaf_448_point_t a,
329 const decaf_448_point_t b
330) DECAF_NONNULL;
331
339void DECAF_API_VIS decaf_448_point_double (
340 decaf_448_point_t two_a,
341 const decaf_448_point_t a
342) DECAF_NONNULL;
343
353void DECAF_API_VIS decaf_448_point_sub (
355 const decaf_448_point_t a,
356 const decaf_448_point_t b
357) DECAF_NONNULL;
358
366void DECAF_API_VIS decaf_448_point_negate (
368 const decaf_448_point_t a
369) DECAF_NONNULL;
370
378void DECAF_API_VIS decaf_448_point_scalarmul (
379 decaf_448_point_t scaled,
380 const decaf_448_point_t base,
381 const decaf_448_scalar_t scalar
382) DECAF_NONNULL DECAF_NOINLINE;
383
402 uint8_t scaled[DECAF_448_SER_BYTES],
403 const uint8_t base[DECAF_448_SER_BYTES],
404 const decaf_448_scalar_t scalar,
405 decaf_bool_t allow_identity,
406 decaf_bool_t short_circuit
407) DECAF_NONNULL DECAF_WARN_UNUSED DECAF_NOINLINE;
408
422 uint8_t shared[DECAF_X448_PUBLIC_BYTES],
423 const uint8_t base[DECAF_X448_PUBLIC_BYTES],
424 const uint8_t scalar[DECAF_X448_PRIVATE_BYTES]
425) DECAF_NONNULL DECAF_WARN_UNUSED DECAF_NOINLINE;
426
448 uint8_t out[DECAF_X448_PUBLIC_BYTES],
449 const decaf_448_point_t p
450) DECAF_NONNULL;
451
453extern const uint8_t
454#ifndef DOXYGEN
455 /* For some reason Doxygen chokes on this despite the defense in common.h... */
456 DECAF_API_VIS
457#endif
459
470void DECAF_API_VIS decaf_x448_generate_key (
471 uint8_t out[DECAF_X448_PUBLIC_BYTES],
472 const uint8_t scalar[DECAF_X448_PRIVATE_BYTES]
473) DECAF_NONNULL DECAF_NOINLINE DECAF_DEPRECATED("Renamed to decaf_x448_derive_public_key");
474
486 uint8_t out[DECAF_X448_PUBLIC_BYTES],
487 const uint8_t scalar[DECAF_X448_PRIVATE_BYTES]
488) DECAF_NONNULL DECAF_NOINLINE;
489
490/* FUTURE: uint8_t decaf_448_encode_like_curve448) */
491
501void DECAF_API_VIS decaf_448_precompute (
503 const decaf_448_point_t b
504) DECAF_NONNULL DECAF_NOINLINE;
505
518 decaf_448_point_t scaled,
519 const decaf_448_precomputed_s *base,
520 const decaf_448_scalar_t scalar
521) DECAF_NONNULL DECAF_NOINLINE;
522
537 decaf_448_point_t combo,
538 const decaf_448_point_t base1,
539 const decaf_448_scalar_t scalar1,
540 const decaf_448_point_t base2,
541 const decaf_448_scalar_t scalar2
542) DECAF_NONNULL DECAF_NOINLINE;
543
562 const decaf_448_point_t base1,
563 const decaf_448_scalar_t scalar1,
564 const decaf_448_scalar_t scalar2
565) DECAF_NONNULL DECAF_NOINLINE;
566
583 decaf_448_point_t combo,
584 const decaf_448_scalar_t scalar1,
585 const decaf_448_point_t base2,
586 const decaf_448_scalar_t scalar2
587) DECAF_NONNULL DECAF_NOINLINE;
588
598void DECAF_API_VIS decaf_448_point_cond_sel (
600 const decaf_448_point_t a,
601 const decaf_448_point_t b,
602 decaf_word_t pick_b
603) DECAF_NONNULL DECAF_NOINLINE;
604
614void DECAF_API_VIS decaf_448_scalar_cond_sel (
616 const decaf_448_scalar_t a,
617 const decaf_448_scalar_t b,
618 decaf_word_t pick_b
619) DECAF_NONNULL DECAF_NOINLINE;
620
629 const decaf_448_point_t to_test
630) DECAF_WARN_UNUSED DECAF_NONNULL DECAF_NOINLINE;
631
641 const decaf_448_point_t p
642) DECAF_NONNULL DECAF_NOINLINE;
643
655 const decaf_448_point_t p,
656 const unsigned char factor[DECAF_448_SER_BYTES]
657) DECAF_NONNULL DECAF_NOINLINE;
658
687void DECAF_API_VIS
690 const unsigned char hashed_data[DECAF_448_HASH_BYTES]
691) DECAF_NONNULL DECAF_NOINLINE;
692
703 const unsigned char hashed_data[2*DECAF_448_HASH_BYTES]
704) DECAF_NONNULL DECAF_NOINLINE;
705
734decaf_error_t DECAF_API_VIS
736 unsigned char recovered_hash[DECAF_448_HASH_BYTES],
737 const decaf_448_point_t pt,
738 uint32_t which
739) DECAF_NONNULL DECAF_NOINLINE DECAF_WARN_UNUSED;
740
759decaf_error_t DECAF_API_VIS
761 unsigned char recovered_hash[2*DECAF_448_HASH_BYTES],
762 const decaf_448_point_t pt,
763 uint32_t which
764) DECAF_NONNULL DECAF_NOINLINE DECAF_WARN_UNUSED;
765
767void DECAF_API_VIS decaf_448_scalar_destroy (
768 decaf_448_scalar_t scalar
769) DECAF_NONNULL;
770
774void DECAF_API_VIS decaf_448_point_destroy (
776) DECAF_NONNULL;
777
783) DECAF_NONNULL;
784
785#ifdef __cplusplus
786} /* extern "C" */
787#endif
788
789#endif /* __DECAF_POINT_448_H__ */
Common utility headers for Decaf library.
#define DECAF_WORD_BITS
The number of bits in a word.
Definition: common.h:76
uint32_t decaf_bool_t
"Boolean" type, will be set to all-zero or all-one (i.e.
Definition: common.h:89
uint32_t decaf_word_t
Word size for internal computations.
Definition: common.h:87
decaf_error_t
Another boolean type used to indicate success or failure.
Definition: common.h:120
void DECAF_API_VIS decaf_448_scalar_halve(decaf_448_scalar_t out, const decaf_448_scalar_t a) DECAF_NONNULL DECAF_NOINLINE
Halve a scalar.
#define DECAF_X448_PUBLIC_BYTES
Number of bytes in an x448 public key.
Definition: point_448.h:62
void DECAF_API_VIS decaf_448_point_negate(decaf_448_point_t nega, const decaf_448_point_t a) DECAF_NONNULL
Negate a point to produce another point.
void DECAF_API_VIS decaf_448_point_sub(decaf_448_point_t diff, const decaf_448_point_t a, const decaf_448_point_t b) DECAF_NONNULL
Subtract two points to produce a third point.
void DECAF_API_VIS decaf_448_point_mul_by_ratio_and_encode_like_x448(uint8_t out[DECAF_X448_PUBLIC_BYTES], const decaf_448_point_t p) DECAF_NONNULL
Multiply a point by DECAF_X448_ENCODE_RATIO, then encode it like RFC 7748.
void DECAF_API_VIS decaf_448_point_encode(uint8_t ser[DECAF_448_SER_BYTES], const decaf_448_point_t pt) DECAF_NONNULL DECAF_NOINLINE
Encode a point as a sequence of bytes.
void DECAF_API_VIS decaf_448_base_double_scalarmul_non_secret(decaf_448_point_t combo, const decaf_448_scalar_t scalar1, const decaf_448_point_t base2, const decaf_448_scalar_t scalar2) DECAF_NONNULL DECAF_NOINLINE
Multiply two base points by two scalars: scaled = scalar1*decaf_448_point_base + scalar2*base2.
void DECAF_API_VIS decaf_x448_generate_key(uint8_t out[DECAF_X448_PUBLIC_BYTES], const uint8_t scalar[DECAF_X448_PRIVATE_BYTES]) DECAF_NONNULL DECAF_NOINLINE DECAF_DEPRECATED("Renamed to decaf_x448_derive_public_key")
RFC 7748 Diffie-Hellman base point scalarmul.
decaf_error_t DECAF_API_VIS decaf_448_invert_elligator_nonuniform(unsigned char recovered_hash[DECAF_448_HASH_BYTES], const decaf_448_point_t pt, uint32_t which) DECAF_NONNULL DECAF_NOINLINE DECAF_WARN_UNUSED
Inverse of elligator-like hash to curve.
struct decaf_448_point_s decaf_448_point_t[1]
Representation of a point on the elliptic curve.
decaf_bool_t DECAF_API_VIS decaf_448_scalar_eq(const decaf_448_scalar_t a, const decaf_448_scalar_t b) DECAF_WARN_UNUSED DECAF_NONNULL DECAF_NOINLINE
Compare two scalars.
decaf_bool_t DECAF_API_VIS decaf_448_point_valid(const decaf_448_point_t to_test) DECAF_WARN_UNUSED DECAF_NONNULL DECAF_NOINLINE
Test that a point is valid, for debugging purposes.
void DECAF_API_VIS decaf_448_point_destroy(decaf_448_point_t point) DECAF_NONNULL
Securely erase a point by overwriting it with zeros.
decaf_error_t DECAF_API_VIS decaf_x448(uint8_t shared[DECAF_X448_PUBLIC_BYTES], const uint8_t base[DECAF_X448_PUBLIC_BYTES], const uint8_t scalar[DECAF_X448_PRIVATE_BYTES]) DECAF_NONNULL DECAF_WARN_UNUSED DECAF_NOINLINE
RFC 7748 Diffie-Hellman scalarmul, used to compute shared secrets.
void DECAF_API_VIS decaf_448_point_from_hash_nonuniform(decaf_448_point_t pt, const unsigned char hashed_data[DECAF_448_HASH_BYTES]) DECAF_NONNULL DECAF_NOINLINE
Almost-Elligator-like hash to curve.
void DECAF_API_VIS decaf_448_scalar_cond_sel(decaf_448_scalar_t out, const decaf_448_scalar_t a, const decaf_448_scalar_t b, decaf_word_t pick_b) DECAF_NONNULL DECAF_NOINLINE
Constant-time decision between two scalars.
#define DECAF_448_SCALAR_BYTES
Number of bytes in a serialized scalar.
Definition: point_448.h:50
void DECAF_API_VIS decaf_448_scalar_decode_long(decaf_448_scalar_t out, const unsigned char *ser, size_t ser_len) DECAF_NONNULL DECAF_NOINLINE
Read a scalar from wire format or from bytes.
void DECAF_API_VIS decaf_448_point_debugging_torque(decaf_448_point_t q, const decaf_448_point_t p) DECAF_NONNULL DECAF_NOINLINE
Torque a point, for debugging purposes.
void DECAF_API_VIS decaf_448_precomputed_destroy(decaf_448_precomputed_s *pre) DECAF_NONNULL
Securely erase a precomputed table by overwriting it with zeros.
void DECAF_API_VIS decaf_448_point_double_scalarmul(decaf_448_point_t combo, const decaf_448_point_t base1, const decaf_448_scalar_t scalar1, const decaf_448_point_t base2, const decaf_448_scalar_t scalar2) DECAF_NONNULL DECAF_NOINLINE
Multiply two base points by two scalars: scaled = scalar1*base1 + scalar2*base2.
void DECAF_API_VIS decaf_448_point_add(decaf_448_point_t sum, const decaf_448_point_t a, const decaf_448_point_t b) DECAF_NONNULL
Add two points to produce a third point.
decaf_bool_t DECAF_API_VIS decaf_448_point_eq(const decaf_448_point_t a, const decaf_448_point_t b) DECAF_WARN_UNUSED DECAF_NONNULL DECAF_NOINLINE
Test whether two points are equal.
decaf_error_t DECAF_API_VIS decaf_448_direct_scalarmul(uint8_t scaled[DECAF_448_SER_BYTES], const uint8_t base[DECAF_448_SER_BYTES], const decaf_448_scalar_t scalar, decaf_bool_t allow_identity, decaf_bool_t short_circuit) DECAF_NONNULL DECAF_WARN_UNUSED DECAF_NOINLINE
Multiply a base point by a scalar: scaled = scalar*base.
void DECAF_API_VIS decaf_448_point_from_hash_uniform(decaf_448_point_t pt, const unsigned char hashed_data[2 *DECAF_448_HASH_BYTES]) DECAF_NONNULL DECAF_NOINLINE
Indifferentiable hash function encoding to curve.
void DECAF_API_VIS decaf_448_scalar_destroy(decaf_448_scalar_t scalar) DECAF_NONNULL
Securely erase a scalar.
DECAF_API_VIS const decaf_448_scalar_t decaf_448_scalar_one
The scalar 1.
void DECAF_API_VIS decaf_448_point_debugging_pscale(decaf_448_point_t q, const decaf_448_point_t p, const unsigned char factor[DECAF_448_SER_BYTES]) DECAF_NONNULL DECAF_NOINLINE
Projectively scale a point, for debugging purposes.
struct decaf_448_scalar_s decaf_448_scalar_t[1]
Representation of an element of the scalar field.
const uint8_t DECAF_API_VIS decaf_x448_base_point[DECAF_X448_PUBLIC_BYTES]
The base point for X448 Diffie-Hellman.
Definition: decaf.c:66
void DECAF_API_VIS decaf_448_scalar_set_unsigned(decaf_448_scalar_t out, uint64_t a) DECAF_NONNULL
Set a scalar to an unsigned 64-bit integer.
void DECAF_API_VIS decaf_448_point_dual_scalarmul(decaf_448_point_t a1, decaf_448_point_t a2, const decaf_448_point_t base1, const decaf_448_scalar_t scalar1, const decaf_448_scalar_t scalar2) DECAF_NONNULL DECAF_NOINLINE
Multiply one base point by two scalars:
void DECAF_API_VIS decaf_448_precompute(decaf_448_precomputed_s *a, const decaf_448_point_t b) DECAF_NONNULL DECAF_NOINLINE
Precompute a table for fast scalar multiplication.
void DECAF_API_VIS decaf_448_scalar_mul(decaf_448_scalar_t out, const decaf_448_scalar_t a, const decaf_448_scalar_t b) DECAF_NONNULL DECAF_NOINLINE
Multiply two scalars.
void DECAF_API_VIS decaf_448_scalar_sub(decaf_448_scalar_t out, const decaf_448_scalar_t a, const decaf_448_scalar_t b) DECAF_NONNULL DECAF_NOINLINE
Subtract two scalars.
void DECAF_API_VIS decaf_448_point_scalarmul(decaf_448_point_t scaled, const decaf_448_point_t base, const decaf_448_scalar_t scalar) DECAF_NONNULL DECAF_NOINLINE
Multiply a base point by a scalar: scaled = scalar*base.
void DECAF_API_VIS decaf_x448_derive_public_key(uint8_t out[DECAF_X448_PUBLIC_BYTES], const uint8_t scalar[DECAF_X448_PRIVATE_BYTES]) DECAF_NONNULL DECAF_NOINLINE
RFC 7748 Diffie-Hellman base point scalarmul.
void DECAF_API_VIS decaf_448_point_double(decaf_448_point_t two_a, const decaf_448_point_t a) DECAF_NONNULL
Double a point.
#define DECAF_448_SER_BYTES
Number of bytes in a serialized point.
Definition: point_448.h:42
DECAF_API_VIS const decaf_448_point_t decaf_448_point_identity
The identity (zero) point on the curve.
DECAF_API_VIS const decaf_448_point_t decaf_448_point_base
An arbitrarily-chosen base point on the curve.
void DECAF_API_VIS decaf_448_precomputed_scalarmul(decaf_448_point_t scaled, const decaf_448_precomputed_s *base, const decaf_448_scalar_t scalar) DECAF_NONNULL DECAF_NOINLINE
Multiply a precomputed base point by a scalar: scaled = scalar*base.
void DECAF_API_VIS decaf_448_scalar_add(decaf_448_scalar_t out, const decaf_448_scalar_t a, const decaf_448_scalar_t b) DECAF_NONNULL DECAF_NOINLINE
Add two scalars.
#define DECAF_448_HASH_BYTES
Number of bytes in an elligated point.
Definition: point_448.h:47
#define DECAF_X448_PRIVATE_BYTES
Number of bytes in an x448 private key.
Definition: point_448.h:65
DECAF_API_VIS const struct decaf_448_precomputed_s * decaf_448_precomputed_base
Precomputed table of multiples of the base point on the curve.
DECAF_API_VIS const decaf_448_scalar_t decaf_448_scalar_zero
The scalar 0.
void DECAF_API_VIS decaf_448_point_cond_sel(decaf_448_point_t out, const decaf_448_point_t a, const decaf_448_point_t b, decaf_word_t pick_b) DECAF_NONNULL DECAF_NOINLINE
Constant-time decision between two points.
decaf_error_t DECAF_API_VIS decaf_448_point_decode(decaf_448_point_t pt, const uint8_t ser[DECAF_448_SER_BYTES], decaf_bool_t allow_identity) DECAF_WARN_UNUSED DECAF_NONNULL DECAF_NOINLINE
Decode a point from a sequence of bytes.
decaf_error_t DECAF_API_VIS decaf_448_invert_elligator_uniform(unsigned char recovered_hash[2 *DECAF_448_HASH_BYTES], const decaf_448_point_t pt, uint32_t which) DECAF_NONNULL DECAF_NOINLINE DECAF_WARN_UNUSED
Inverse of elligator-like hash to curve.
void DECAF_API_VIS decaf_448_scalar_encode(unsigned char ser[DECAF_448_SCALAR_BYTES], const decaf_448_scalar_t s) DECAF_NONNULL DECAF_NOINLINE DECAF_NOINLINE
Serialize a scalar to wire format.
DECAF_API_VIS const size_t decaf_448_sizeof_precomputed_s
Size and alignment of precomputed point tables.
struct decaf_448_precomputed_s decaf_448_precomputed_s
Precomputed table based on a point.
Definition: point_448.h:78
decaf_error_t DECAF_API_VIS decaf_448_scalar_invert(decaf_448_scalar_t out, const decaf_448_scalar_t a) DECAF_WARN_UNUSED DECAF_NONNULL DECAF_NOINLINE
Invert a scalar.
Representation of a point on the elliptic curve.
Definition: point_448.h:68
Representation of an element of the scalar field.
Definition: point_448.h:84
Definition: f_field.h:27