1 #include <stdio.h>
2 #ifndef EC_ARITH_COMMON_H_
3 #define EC_ARITH_COMMON_H_
4 
5 #ifndef mod_init
6   #error "One of the mod*_default.h headers must be included before this file"
7 #endif
8 
9 #ifdef __cplusplus
10 extern "C" {
11 #endif
12 
13 /* Types of coordinates */
14 typedef enum {
15   SHORT_WEIERSTRASS_aff,
16   SHORT_WEIERSTRASS_proj,
17   MONTGOMERY_xz,
18   TWISTED_EDWARDS_proj,
19   TWISTED_EDWARDS_ext,
20 } ec_point_coord_type_t;
21 
22 
23 /* A point on an elliptic curve:
24  *   The significant coordinates are:
25  *      - x,y     for SHORT_WEIERSTRASS_aff
26  *      - x,y,z   for SHORT_WEIERSTRASS_proj
27  *      - x,  z   for MONTGOMERY_xz
28  *      - x,y,z   for TWISTED_EDWARDS_proj
29  *      - x,y,z,t for TWISTED_EDWARDS_ext
30  */
31 struct ec_point_s
32 {
33   residue_t x,y,z,t;
34 };
35 
36 typedef struct ec_point_s ec_point_t[1];
37 typedef struct ec_point_s *ec_point_ptr;
38 typedef const struct ec_point_s *ec_point_srcptr;
39 
40 #define ec_point_init MOD_APPEND_TYPE(ec_point_init)
41 static inline void
ec_point_init(ec_point_t P,const modulus_t m)42 ec_point_init (ec_point_t P, const modulus_t m)
43 {
44   mod_init (P->x, m);
45   mod_init (P->y, m);
46   mod_init (P->z, m);
47   mod_init (P->t, m);
48 }
49 
50 #define ec_point_init_noset0 MOD_APPEND_TYPE(ec_point_init_noset0)
51 static inline void
ec_point_init_noset0(ec_point_t P,const modulus_t m)52 ec_point_init_noset0 (ec_point_t P, const modulus_t m)
53 {
54   mod_init_noset0 (P->x, m);
55   mod_init_noset0 (P->y, m);
56   mod_init_noset0 (P->z, m);
57   mod_init_noset0 (P->t, m);
58 }
59 
60 #define ec_point_clear MOD_APPEND_TYPE(ec_point_clear)
61 static inline void
ec_point_clear(ec_point_t P,const modulus_t m)62 ec_point_clear (ec_point_t P, const modulus_t m)
63 {
64   mod_clear (P->x, m);
65   mod_clear (P->y, m);
66   mod_clear (P->z, m);
67   mod_clear (P->t, m);
68 }
69 
70 #define ec_point_set MOD_APPEND_TYPE(ec_point_set)
71 static inline void
ec_point_set(ec_point_t Q,const ec_point_t P,const modulus_t m,const ec_point_coord_type_t coord)72 ec_point_set (ec_point_t Q, const ec_point_t P, const modulus_t m,
73               const ec_point_coord_type_t coord)
74 {
75   mod_set (Q->x, P->x, m);
76   if (coord != MONTGOMERY_xz)
77     mod_set (Q->y, P->y, m);
78   if (coord != SHORT_WEIERSTRASS_aff)
79     mod_set (Q->z, P->z, m);
80   if (coord == TWISTED_EDWARDS_ext)
81     mod_set (Q->t, P->t, m);
82 }
83 
84 #define ec_point_swap MOD_APPEND_TYPE(ec_point_swap)
85 static inline void
ec_point_swap(ec_point_t Q,ec_point_t P,const modulus_t m,const ec_point_coord_type_t coord)86 ec_point_swap (ec_point_t Q, ec_point_t P, const modulus_t m,
87                const ec_point_coord_type_t coord)
88 {
89   mod_swap (Q->x, P->x, m);
90   if (coord != MONTGOMERY_xz)
91     mod_swap (Q->y, P->y, m);
92   if (coord != SHORT_WEIERSTRASS_aff)
93     mod_swap (Q->z, P->z, m);
94   if (coord == TWISTED_EDWARDS_ext)
95     mod_swap (Q->t, P->t, m);
96 }
97 
98 #define ec_point_fprintf MOD_APPEND_TYPE(ec_point_fprintf)
99 static inline void
ec_point_fprintf(FILE * out,const ec_point_t P,const ec_point_coord_type_t coord,const modulus_t m)100 ec_point_fprintf (FILE *out, const ec_point_t P,
101                   const ec_point_coord_type_t coord, const modulus_t m)
102 {
103   modint_t x, y, z, t;
104 
105   mod_intinit (x);
106   mod_intinit (y);
107   mod_intinit (z);
108   mod_intinit (t);
109 
110   mod_get_int (x, P->x, m);
111   if (coord != MONTGOMERY_xz)
112     mod_get_int (y, P->y, m);
113   if (coord != SHORT_WEIERSTRASS_aff)
114     mod_get_int (z, P->z, m);
115   if (coord == TWISTED_EDWARDS_ext)
116     mod_get_int (t, P->t, m);
117 
118   switch (coord)
119   {
120     case SHORT_WEIERSTRASS_aff: /* (x, y) */
121       mod_fprintf (out, "(0x%" PRIMODx ", 0x%" PRIMODx ")", MOD_PRINT_INT(x),
122           MOD_PRINT_INT(y));
123       break;
124     case TWISTED_EDWARDS_proj: /* (X : Y : Z) */
125     case SHORT_WEIERSTRASS_proj: /* (X : Y : Z) */
126       mod_fprintf (out, "(0x%" PRIMODx " : 0x%" PRIMODx " : 0x%" PRIMODx ")",
127           MOD_PRINT_INT(x), MOD_PRINT_INT(y), MOD_PRINT_INT(z));
128       break;
129     case MONTGOMERY_xz: /* (X :: Z) */
130       mod_fprintf (out, "(0x%" PRIMODx " :: 0x%" PRIMODx ")", MOD_PRINT_INT(x),
131           MOD_PRINT_INT(z));
132       break;
133     case TWISTED_EDWARDS_ext: /* (X : Y : Z : T) */
134       mod_fprintf (out, "(0x%" PRIMODx " : 0x%" PRIMODx " : 0x%" PRIMODx " : "
135           "0x%" PRIMODx ")", MOD_PRINT_INT(x), MOD_PRINT_INT(y),
136           MOD_PRINT_INT(z), MOD_PRINT_INT(t));
137       break;
138     default:
139       fprintf (stderr, "%s: unknown coordinates system\n", __func__);
140       abort ();
141   }
142 
143   mod_intclear (x);
144   mod_intclear (y);
145   mod_intclear (z);
146   mod_intclear (t);
147 }
148 
149 #ifdef __cplusplus
150 }
151 #endif
152 
153 #endif /* EC_ARITH_COMMON_H_ */
154