11
11
#include "num.h"
12
12
#include "field.h"
13
13
14
+ static SECP256K1_INLINE void secp256k1_fe_cmov_limbs (uint32_t * r , const uint32_t * a , int len , int flag ) {
15
+ int i ;
16
+ uint32_t diff , rest , r_i ;
17
+ static const uint32_t half = 0x55555555UL ;
18
+ VERIFY_CHECK (flag == 0 || flag == 1 );
19
+ rest = half << flag ;
20
+ for (i = 0 ; i < len ; i ++ ) {
21
+ r_i = r [i ];
22
+ diff = r_i ^ a [i ];
23
+ r_i ^= (diff & half );
24
+ r_i ^= (diff & rest );
25
+ r [i ] = r_i ;
26
+ }
27
+ }
28
+
14
29
#ifdef VERIFY
15
30
static void secp256k1_fe_verify (const secp256k1_fe * a ) {
16
31
const uint32_t * d = a -> n ;
@@ -1092,19 +1107,7 @@ static void secp256k1_fe_sqr(secp256k1_fe *r, const secp256k1_fe *a) {
1092
1107
}
1093
1108
1094
1109
static SECP256K1_INLINE void secp256k1_fe_cmov (secp256k1_fe * r , const secp256k1_fe * a , int flag ) {
1095
- uint32_t mask0 , mask1 ;
1096
- mask0 = flag + ~((uint32_t )0 );
1097
- mask1 = ~mask0 ;
1098
- r -> n [0 ] = (r -> n [0 ] & mask0 ) | (a -> n [0 ] & mask1 );
1099
- r -> n [1 ] = (r -> n [1 ] & mask0 ) | (a -> n [1 ] & mask1 );
1100
- r -> n [2 ] = (r -> n [2 ] & mask0 ) | (a -> n [2 ] & mask1 );
1101
- r -> n [3 ] = (r -> n [3 ] & mask0 ) | (a -> n [3 ] & mask1 );
1102
- r -> n [4 ] = (r -> n [4 ] & mask0 ) | (a -> n [4 ] & mask1 );
1103
- r -> n [5 ] = (r -> n [5 ] & mask0 ) | (a -> n [5 ] & mask1 );
1104
- r -> n [6 ] = (r -> n [6 ] & mask0 ) | (a -> n [6 ] & mask1 );
1105
- r -> n [7 ] = (r -> n [7 ] & mask0 ) | (a -> n [7 ] & mask1 );
1106
- r -> n [8 ] = (r -> n [8 ] & mask0 ) | (a -> n [8 ] & mask1 );
1107
- r -> n [9 ] = (r -> n [9 ] & mask0 ) | (a -> n [9 ] & mask1 );
1110
+ secp256k1_fe_cmov_limbs (r -> n , a -> n , 10 , flag );
1108
1111
#ifdef VERIFY
1109
1112
if (a -> magnitude > r -> magnitude ) {
1110
1113
r -> magnitude = a -> magnitude ;
@@ -1114,17 +1117,7 @@ static SECP256K1_INLINE void secp256k1_fe_cmov(secp256k1_fe *r, const secp256k1_
1114
1117
}
1115
1118
1116
1119
static SECP256K1_INLINE void secp256k1_fe_storage_cmov (secp256k1_fe_storage * r , const secp256k1_fe_storage * a , int flag ) {
1117
- uint32_t mask0 , mask1 ;
1118
- mask0 = flag + ~((uint32_t )0 );
1119
- mask1 = ~mask0 ;
1120
- r -> n [0 ] = (r -> n [0 ] & mask0 ) | (a -> n [0 ] & mask1 );
1121
- r -> n [1 ] = (r -> n [1 ] & mask0 ) | (a -> n [1 ] & mask1 );
1122
- r -> n [2 ] = (r -> n [2 ] & mask0 ) | (a -> n [2 ] & mask1 );
1123
- r -> n [3 ] = (r -> n [3 ] & mask0 ) | (a -> n [3 ] & mask1 );
1124
- r -> n [4 ] = (r -> n [4 ] & mask0 ) | (a -> n [4 ] & mask1 );
1125
- r -> n [5 ] = (r -> n [5 ] & mask0 ) | (a -> n [5 ] & mask1 );
1126
- r -> n [6 ] = (r -> n [6 ] & mask0 ) | (a -> n [6 ] & mask1 );
1127
- r -> n [7 ] = (r -> n [7 ] & mask0 ) | (a -> n [7 ] & mask1 );
1120
+ secp256k1_fe_cmov_limbs (r -> n , a -> n , 8 , flag );
1128
1121
}
1129
1122
1130
1123
static void secp256k1_fe_to_storage (secp256k1_fe_storage * r , const secp256k1_fe * a ) {
0 commit comments