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