1 #ifndef GE25519_H
2 #define GE25519_H
3 
4 #include "fe25519.h"
5 #include "sc25519.h"
6 
7 #define ge25519                           crypto_sign_ed25519_amd64_64_ge25519
8 #define ge25519_base                      crypto_sign_ed25519_amd64_64_ge25519_base
9 #define ge25519_unpackneg_vartime         crypto_sign_ed25519_amd64_64_unpackneg_vartime
10 #define ge25519_pack                      crypto_sign_ed25519_amd64_64_pack
11 #define ge25519_isneutral_vartime         crypto_sign_ed25519_amd64_64_isneutral_vartime
12 #define ge25519_add                       crypto_sign_ed25519_amd64_64_ge25519_add
13 #define ge25519_double                    crypto_sign_ed25519_amd64_64_ge25519_double
14 #define ge25519_double_scalarmult_vartime crypto_sign_ed25519_amd64_64_double_scalarmult_vartime
15 #define ge25519_multi_scalarmult_vartime  crypto_sign_ed25519_amd64_64_ge25519_multi_scalarmult_vartime
16 #define ge25519_scalarmult_base           crypto_sign_ed25519_amd64_64_scalarmult_base
17 #define ge25519_p1p1_to_p2                crypto_sign_ed25519_amd64_64_ge25519_p1p1_to_p2
18 #define ge25519_p1p1_to_p3                crypto_sign_ed25519_amd64_64_ge25519_p1p1_to_p3
19 #define ge25519_add_p1p1                  crypto_sign_ed25519_amd64_64_ge25519_add_p1p1
20 #define ge25519_dbl_p1p1                  crypto_sign_ed25519_amd64_64_ge25519_dbl_p1p1
21 #define choose_t                          crypto_sign_ed25519_amd64_64_choose_t
22 #define ge25519_nielsadd2                 crypto_sign_ed25519_amd64_64_ge25519_nielsadd2
23 #define ge25519_nielsadd_p1p1             crypto_sign_ed25519_amd64_64_ge25519_nielsadd_p1p1
24 #define ge25519_pnielsadd_p1p1            crypto_sign_ed25519_amd64_64_ge25519_pnielsadd_p1p1
25 
26 
27 #define ge25519_p3 ge25519
28 
29 typedef struct
30 {
31   fe25519 x;
32   fe25519 y;
33   fe25519 z;
34   fe25519 t;
35 } ge25519;
36 
37 typedef struct
38 {
39   fe25519 x;
40   fe25519 z;
41   fe25519 y;
42   fe25519 t;
43 } ge25519_p1p1;
44 
45 typedef struct
46 {
47   fe25519 x;
48   fe25519 y;
49   fe25519 z;
50 } ge25519_p2;
51 
52 typedef struct
53 {
54   fe25519 ysubx;
55   fe25519 xaddy;
56   fe25519 t2d;
57 } ge25519_niels;
58 
59 typedef struct
60 {
61   fe25519 ysubx;
62   fe25519 xaddy;
63   fe25519 z;
64   fe25519 t2d;
65 } ge25519_pniels;
66 
67 typedef unsigned char bytes32[32];
68 
69 extern void ge25519_p1p1_to_p2(ge25519_p2 *r, const ge25519_p1p1 *p);
70 extern void ge25519_p1p1_to_p3(ge25519_p3 *r, const ge25519_p1p1 *p);
71 extern void ge25519_add_p1p1(ge25519_p1p1 *r, const ge25519_p3 *p, const ge25519_p3 *q);
72 extern void ge25519_dbl_p1p1(ge25519_p1p1 *r, const ge25519_p2 *p);
73 extern void choose_t(ge25519_niels *t, unsigned long long pos, signed long long b, const ge25519_niels *base_multiples);
74 extern void ge25519_nielsadd2(ge25519_p3 *r, const ge25519_niels *q);
75 extern void ge25519_nielsadd_p1p1(ge25519_p1p1 *r, const ge25519_p3 *p, const ge25519_niels *q);
76 extern void ge25519_pnielsadd_p1p1(ge25519_p1p1 *r, const ge25519_p3 *p, const ge25519_pniels *q);
77 
78 extern const ge25519 ge25519_base;
79 
80 extern int ge25519_unpackneg_vartime(ge25519 *r, const unsigned char p[32]);
81 
82 extern void ge25519_pack(unsigned char r[32], const ge25519 *p);
83 
84 extern void ge25519_batchpack_destructive_1(bytes32 out[], ge25519_p3 in[], fe25519 *inz[], fe25519 tmp[], size_t num);
85 extern void ge25519_batchpack_destructive_finish(bytes32 out, ge25519_p3 *unf);
86 
87 extern int ge25519_isneutral_vartime(const ge25519 *p);
88 
89 extern void ge25519_add(ge25519 *r, const ge25519 *p, const ge25519 *q);
90 
91 extern void ge25519_double(ge25519 *r, const ge25519 *p);
92 
93 /* computes [s1]p1 + [s2]ge25519_base */
94 extern void ge25519_double_scalarmult_vartime(ge25519 *r, const ge25519 *p1, const sc25519 *s1, const sc25519 *s2);
95 
96 extern void ge25519_multi_scalarmult_vartime(ge25519 *r, ge25519 *p, sc25519 *s, const unsigned long long npoints);
97 
98 extern void ge25519_scalarmult_base(ge25519 *r, const sc25519 *s);
99 
100 #endif
101