@@ -66,21 +66,19 @@ void gt_get_gen(gt_t g) {
66
66
67
67
int g1_is_valid (const g1_t a ) {
68
68
bn_t n ;
69
- g1_t t , u , v ;
69
+ g1_t u , v ;
70
70
int r = 0 ;
71
71
72
72
if (g1_is_infty (a )) {
73
73
return 0 ;
74
74
}
75
75
76
76
bn_null (n );
77
- g1_null (t );
78
77
g1_null (u );
79
78
g1_null (v );
80
79
81
80
RLC_TRY {
82
81
bn_new (n );
83
- g1_new (t );
84
82
g1_new (u );
85
83
g1_new (v );
86
84
@@ -90,24 +88,26 @@ int g1_is_valid(const g1_t a) {
90
88
r = g1_on_curve (a );
91
89
} else {
92
90
switch (ep_curve_is_pairf ()) {
93
- /* Formulas from "Faster Subgroup Checks for BLS12-381" by Bowe.
94
- * https://eprint.iacr.org/2019/814.pdf, together with tweaks
95
- * by Mike Scott. */
91
+ /* Formulas from "Co-factor clearing and subgroup membership
92
+ * testing on pairing-friendly curves" by El Housni, Guillevic,
93
+ * Piellard. https://eprint.iacr.org/2022/352.pdf */
96
94
case EP_B12 :
97
- /* Check [(z^2−1)](\psi(P)+P) == -P.*/
95
+ case EP_B24 :
96
+ /* Check [\psi(P) == [z^2 - 1]P. */
98
97
fp_prime_get_par (n );
99
98
bn_sqr (n , n );
99
+ if (ep_curve_is_pairf () == EP_B24 ) {
100
+ bn_sqr (n , n );
101
+ }
100
102
bn_sub_dig (n , n , 1 );
101
- ep_psi (t , a );
102
- ep_add (t , t , a );
103
- ep_copy (u , t );
103
+ ep_copy (u , a );
104
104
for (int i = bn_bits (n ) - 2 ; i >= 0 ; i -- ) {
105
105
g1_dbl (u , u );
106
106
if (bn_get_bit (n , i )) {
107
- g1_add (u , u , t );
107
+ g1_add (u , u , a );
108
108
}
109
109
}
110
- g1_neg (v , a );
110
+ ep_psi (v , a );
111
111
r = g1_on_curve (a ) && (g1_cmp (v , u ) == RLC_EQ );
112
112
break ;
113
113
default :
@@ -126,7 +126,6 @@ int g1_is_valid(const g1_t a) {
126
126
RLC_THROW (ERR_CAUGHT );
127
127
} RLC_FINALLY {
128
128
bn_free (n );
129
- g1_free (t );
130
129
g1_free (u );
131
130
g1_free (v );
132
131
}
@@ -183,17 +182,19 @@ int g2_is_valid(const g2_t a) {
183
182
r = g2_on_curve (a ) && (g2_cmp (u , v ) == RLC_EQ );
184
183
} else {
185
184
switch (ep_curve_is_pairf ()) {
186
- /* Formulas from "Faster Subgroup Checks for BLS12-381" by Bowe.
187
- * https://eprint.iacr.org/2019/814.pdf */
185
+ /* Formulas from "Co-factor clearing and subgroup membership
186
+ * testing on pairing-friendly curves" by El Housni, Guillevic,
187
+ * Piellard. https://eprint.iacr.org/2022/352.pdf */
188
188
case EP_B12 :
189
+ case EP_B24 :
189
190
#if FP_PRIME == 383
190
191
/* Since p mod n = r, we can check instead that
191
192
* psi^4(P) + P == \psi^2(P). */
192
193
ep2_frb (u , a , 4 );
193
194
ep2_add (u , u , a );
194
195
ep2_frb (v , a , 2 );
195
196
#else
196
- /* Check [z] psi^3 (P) + P == \psi^2 (P). */
197
+ /* Check \ psi(P) == z (P). */
197
198
fp_prime_get_par (n );
198
199
g2_copy (u , a );
199
200
for (int i = bn_bits (n ) - 2 ; i >= 0 ; i -- ) {
@@ -205,9 +206,7 @@ int g2_is_valid(const g2_t a) {
205
206
if (bn_sign (n ) == RLC_NEG ) {
206
207
g2_neg (u , u );
207
208
}
208
- g2_frb (u , u , 3 );
209
- g2_frb (v , a , 2 );
210
- g2_add (u , u , a );
209
+ g2_frb (v , a , 1 );
211
210
#endif
212
211
r = g2_on_curve (a ) && (g2_cmp (u , v ) == RLC_EQ );
213
212
break ;
@@ -305,15 +304,13 @@ int gt_is_valid(const gt_t a) {
305
304
#endif
306
305
r &= fp12_test_cyc ((void * )a );
307
306
break ;
308
- #if FP_PRIME == 315 || FP_PRIME == 317 || FP_PRIME == 509
309
307
case EP_B24 :
310
308
/* Check that a^u = a^p. */
311
309
gt_frb (u , a , 1 );
312
310
fp24_exp_cyc_sps ((void * )v , (void * )a , b , l , bn_sign (n ));
313
311
r = (gt_cmp (u , v ) == RLC_EQ );
314
- r = fp24_test_cyc ((void * )a );
312
+ r & = fp24_test_cyc ((void * )a );
315
313
break ;
316
- #endif
317
314
default :
318
315
/* Common case. */
319
316
bn_sub_dig (n , n , 1 );
0 commit comments