@@ -41,16 +41,22 @@ SECP256K1_INLINE static void secp256k1_scalar_set_int(secp256k1_scalar *r, unsig
41
41
r -> d [1 ] = 0 ;
42
42
r -> d [2 ] = 0 ;
43
43
r -> d [3 ] = 0 ;
44
+
45
+ secp256k1_scalar_verify (r );
44
46
}
45
47
46
48
SECP256K1_INLINE static unsigned int secp256k1_scalar_get_bits (const secp256k1_scalar * a , unsigned int offset , unsigned int count ) {
49
+ secp256k1_scalar_verify (a );
47
50
VERIFY_CHECK ((offset + count - 1 ) >> 6 == offset >> 6 );
51
+
48
52
return (a -> d [offset >> 6 ] >> (offset & 0x3F )) & ((((uint64_t )1 ) << count ) - 1 );
49
53
}
50
54
51
55
SECP256K1_INLINE static unsigned int secp256k1_scalar_get_bits_var (const secp256k1_scalar * a , unsigned int offset , unsigned int count ) {
56
+ secp256k1_scalar_verify (a );
52
57
VERIFY_CHECK (count < 32 );
53
58
VERIFY_CHECK (offset + count <= 256 );
59
+
54
60
if ((offset + count - 1 ) >> 6 == offset >> 6 ) {
55
61
return secp256k1_scalar_get_bits (a , offset , count );
56
62
} else {
@@ -74,6 +80,7 @@ SECP256K1_INLINE static int secp256k1_scalar_check_overflow(const secp256k1_scal
74
80
SECP256K1_INLINE static int secp256k1_scalar_reduce (secp256k1_scalar * r , unsigned int overflow ) {
75
81
secp256k1_uint128 t ;
76
82
VERIFY_CHECK (overflow <= 1 );
83
+
77
84
secp256k1_u128_from_u64 (& t , r -> d [0 ]);
78
85
secp256k1_u128_accum_u64 (& t , overflow * SECP256K1_N_C_0 );
79
86
r -> d [0 ] = secp256k1_u128_to_u64 (& t ); secp256k1_u128_rshift (& t , 64 );
@@ -85,12 +92,17 @@ SECP256K1_INLINE static int secp256k1_scalar_reduce(secp256k1_scalar *r, unsigne
85
92
r -> d [2 ] = secp256k1_u128_to_u64 (& t ); secp256k1_u128_rshift (& t , 64 );
86
93
secp256k1_u128_accum_u64 (& t , r -> d [3 ]);
87
94
r -> d [3 ] = secp256k1_u128_to_u64 (& t );
95
+
96
+ secp256k1_scalar_verify (r );
88
97
return overflow ;
89
98
}
90
99
91
100
static int secp256k1_scalar_add (secp256k1_scalar * r , const secp256k1_scalar * a , const secp256k1_scalar * b ) {
92
101
int overflow ;
93
102
secp256k1_uint128 t ;
103
+ secp256k1_scalar_verify (a );
104
+ secp256k1_scalar_verify (b );
105
+
94
106
secp256k1_u128_from_u64 (& t , a -> d [0 ]);
95
107
secp256k1_u128_accum_u64 (& t , b -> d [0 ]);
96
108
r -> d [0 ] = secp256k1_u128_to_u64 (& t ); secp256k1_u128_rshift (& t , 64 );
@@ -106,13 +118,17 @@ static int secp256k1_scalar_add(secp256k1_scalar *r, const secp256k1_scalar *a,
106
118
overflow = secp256k1_u128_to_u64 (& t ) + secp256k1_scalar_check_overflow (r );
107
119
VERIFY_CHECK (overflow == 0 || overflow == 1 );
108
120
secp256k1_scalar_reduce (r , overflow );
121
+
122
+ secp256k1_scalar_verify (r );
109
123
return overflow ;
110
124
}
111
125
112
126
static void secp256k1_scalar_cadd_bit (secp256k1_scalar * r , unsigned int bit , int flag ) {
113
127
secp256k1_uint128 t ;
114
128
volatile int vflag = flag ;
129
+ secp256k1_scalar_verify (r );
115
130
VERIFY_CHECK (bit < 256 );
131
+
116
132
bit += ((uint32_t ) vflag - 1 ) & 0x100 ; /* forcing (bit >> 6) > 3 makes this a noop */
117
133
secp256k1_u128_from_u64 (& t , r -> d [0 ]);
118
134
secp256k1_u128_accum_u64 (& t , ((uint64_t )((bit >> 6 ) == 0 )) << (bit & 0x3F ));
@@ -126,6 +142,8 @@ static void secp256k1_scalar_cadd_bit(secp256k1_scalar *r, unsigned int bit, int
126
142
secp256k1_u128_accum_u64 (& t , r -> d [3 ]);
127
143
secp256k1_u128_accum_u64 (& t , ((uint64_t )((bit >> 6 ) == 3 )) << (bit & 0x3F ));
128
144
r -> d [3 ] = secp256k1_u128_to_u64 (& t );
145
+
146
+ secp256k1_scalar_verify (r );
129
147
#ifdef VERIFY
130
148
VERIFY_CHECK (secp256k1_u128_hi_u64 (& t ) == 0 );
131
149
#endif
@@ -141,22 +159,30 @@ static void secp256k1_scalar_set_b32(secp256k1_scalar *r, const unsigned char *b
141
159
if (overflow ) {
142
160
* overflow = over ;
143
161
}
162
+
163
+ secp256k1_scalar_verify (r );
144
164
}
145
165
146
166
static void secp256k1_scalar_get_b32 (unsigned char * bin , const secp256k1_scalar * a ) {
167
+ secp256k1_scalar_verify (a );
168
+
147
169
secp256k1_write_be64 (& bin [0 ], a -> d [3 ]);
148
170
secp256k1_write_be64 (& bin [8 ], a -> d [2 ]);
149
171
secp256k1_write_be64 (& bin [16 ], a -> d [1 ]);
150
172
secp256k1_write_be64 (& bin [24 ], a -> d [0 ]);
151
173
}
152
174
153
175
SECP256K1_INLINE static int secp256k1_scalar_is_zero (const secp256k1_scalar * a ) {
176
+ secp256k1_scalar_verify (a );
177
+
154
178
return (a -> d [0 ] | a -> d [1 ] | a -> d [2 ] | a -> d [3 ]) == 0 ;
155
179
}
156
180
157
181
static void secp256k1_scalar_negate (secp256k1_scalar * r , const secp256k1_scalar * a ) {
158
182
uint64_t nonzero = 0xFFFFFFFFFFFFFFFFULL * (secp256k1_scalar_is_zero (a ) == 0 );
159
183
secp256k1_uint128 t ;
184
+ secp256k1_scalar_verify (a );
185
+
160
186
secp256k1_u128_from_u64 (& t , ~a -> d [0 ]);
161
187
secp256k1_u128_accum_u64 (& t , SECP256K1_N_0 + 1 );
162
188
r -> d [0 ] = secp256k1_u128_to_u64 (& t ) & nonzero ; secp256k1_u128_rshift (& t , 64 );
@@ -169,15 +195,21 @@ static void secp256k1_scalar_negate(secp256k1_scalar *r, const secp256k1_scalar
169
195
secp256k1_u128_accum_u64 (& t , ~a -> d [3 ]);
170
196
secp256k1_u128_accum_u64 (& t , SECP256K1_N_3 );
171
197
r -> d [3 ] = secp256k1_u128_to_u64 (& t ) & nonzero ;
198
+
199
+ secp256k1_scalar_verify (r );
172
200
}
173
201
174
202
SECP256K1_INLINE static int secp256k1_scalar_is_one (const secp256k1_scalar * a ) {
203
+ secp256k1_scalar_verify (a );
204
+
175
205
return ((a -> d [0 ] ^ 1 ) | a -> d [1 ] | a -> d [2 ] | a -> d [3 ]) == 0 ;
176
206
}
177
207
178
208
static int secp256k1_scalar_is_high (const secp256k1_scalar * a ) {
179
209
int yes = 0 ;
180
210
int no = 0 ;
211
+ secp256k1_scalar_verify (a );
212
+
181
213
no |= (a -> d [3 ] < SECP256K1_N_H_3 );
182
214
yes |= (a -> d [3 ] > SECP256K1_N_H_3 ) & ~no ;
183
215
no |= (a -> d [2 ] < SECP256K1_N_H_2 ) & ~yes ; /* No need for a > check. */
@@ -194,6 +226,8 @@ static int secp256k1_scalar_cond_negate(secp256k1_scalar *r, int flag) {
194
226
uint64_t mask = - vflag ;
195
227
uint64_t nonzero = (secp256k1_scalar_is_zero (r ) != 0 ) - 1 ;
196
228
secp256k1_uint128 t ;
229
+ secp256k1_scalar_verify (r );
230
+
197
231
secp256k1_u128_from_u64 (& t , r -> d [0 ] ^ mask );
198
232
secp256k1_u128_accum_u64 (& t , (SECP256K1_N_0 + 1 ) & mask );
199
233
r -> d [0 ] = secp256k1_u128_to_u64 (& t ) & nonzero ; secp256k1_u128_rshift (& t , 64 );
@@ -206,6 +240,8 @@ static int secp256k1_scalar_cond_negate(secp256k1_scalar *r, int flag) {
206
240
secp256k1_u128_accum_u64 (& t , r -> d [3 ] ^ mask );
207
241
secp256k1_u128_accum_u64 (& t , SECP256K1_N_3 & mask );
208
242
r -> d [3 ] = secp256k1_u128_to_u64 (& t ) & nonzero ;
243
+
244
+ secp256k1_scalar_verify (r );
209
245
return 2 * (mask == 0 ) - 1 ;
210
246
}
211
247
@@ -764,23 +800,34 @@ static void secp256k1_scalar_mul_512(uint64_t l[8], const secp256k1_scalar *a, c
764
800
765
801
static void secp256k1_scalar_mul (secp256k1_scalar * r , const secp256k1_scalar * a , const secp256k1_scalar * b ) {
766
802
uint64_t l [8 ];
803
+ secp256k1_scalar_verify (a );
804
+ secp256k1_scalar_verify (b );
805
+
767
806
secp256k1_scalar_mul_512 (l , a , b );
768
807
secp256k1_scalar_reduce_512 (r , l );
808
+
809
+ secp256k1_scalar_verify (r );
769
810
}
770
811
771
812
static int secp256k1_scalar_shr_int (secp256k1_scalar * r , int n ) {
772
813
int ret ;
814
+ secp256k1_scalar_verify (r );
773
815
VERIFY_CHECK (n > 0 );
774
816
VERIFY_CHECK (n < 16 );
817
+
775
818
ret = r -> d [0 ] & ((1 << n ) - 1 );
776
819
r -> d [0 ] = (r -> d [0 ] >> n ) + (r -> d [1 ] << (64 - n ));
777
820
r -> d [1 ] = (r -> d [1 ] >> n ) + (r -> d [2 ] << (64 - n ));
778
821
r -> d [2 ] = (r -> d [2 ] >> n ) + (r -> d [3 ] << (64 - n ));
779
822
r -> d [3 ] = (r -> d [3 ] >> n );
823
+
824
+ secp256k1_scalar_verify (r );
780
825
return ret ;
781
826
}
782
827
783
828
static void secp256k1_scalar_split_128 (secp256k1_scalar * r1 , secp256k1_scalar * r2 , const secp256k1_scalar * k ) {
829
+ secp256k1_scalar_verify (k );
830
+
784
831
r1 -> d [0 ] = k -> d [0 ];
785
832
r1 -> d [1 ] = k -> d [1 ];
786
833
r1 -> d [2 ] = 0 ;
@@ -789,9 +836,15 @@ static void secp256k1_scalar_split_128(secp256k1_scalar *r1, secp256k1_scalar *r
789
836
r2 -> d [1 ] = k -> d [3 ];
790
837
r2 -> d [2 ] = 0 ;
791
838
r2 -> d [3 ] = 0 ;
839
+
840
+ secp256k1_scalar_verify (r1 );
841
+ secp256k1_scalar_verify (r2 );
792
842
}
793
843
794
844
SECP256K1_INLINE static int secp256k1_scalar_eq (const secp256k1_scalar * a , const secp256k1_scalar * b ) {
845
+ secp256k1_scalar_verify (a );
846
+ secp256k1_scalar_verify (b );
847
+
795
848
return ((a -> d [0 ] ^ b -> d [0 ]) | (a -> d [1 ] ^ b -> d [1 ]) | (a -> d [2 ] ^ b -> d [2 ]) | (a -> d [3 ] ^ b -> d [3 ])) == 0 ;
796
849
}
797
850
@@ -800,7 +853,10 @@ SECP256K1_INLINE static void secp256k1_scalar_mul_shift_var(secp256k1_scalar *r,
800
853
unsigned int shiftlimbs ;
801
854
unsigned int shiftlow ;
802
855
unsigned int shifthigh ;
856
+ secp256k1_scalar_verify (a );
857
+ secp256k1_scalar_verify (b );
803
858
VERIFY_CHECK (shift >= 256 );
859
+
804
860
secp256k1_scalar_mul_512 (l , a , b );
805
861
shiftlimbs = shift >> 6 ;
806
862
shiftlow = shift & 0x3F ;
@@ -810,18 +866,24 @@ SECP256K1_INLINE static void secp256k1_scalar_mul_shift_var(secp256k1_scalar *r,
810
866
r -> d [2 ] = shift < 384 ? (l [2 + shiftlimbs ] >> shiftlow | (shift < 320 && shiftlow ? (l [3 + shiftlimbs ] << shifthigh ) : 0 )) : 0 ;
811
867
r -> d [3 ] = shift < 320 ? (l [3 + shiftlimbs ] >> shiftlow ) : 0 ;
812
868
secp256k1_scalar_cadd_bit (r , 0 , (l [(shift - 1 ) >> 6 ] >> ((shift - 1 ) & 0x3f )) & 1 );
869
+
870
+ secp256k1_scalar_verify (r );
813
871
}
814
872
815
873
static SECP256K1_INLINE void secp256k1_scalar_cmov (secp256k1_scalar * r , const secp256k1_scalar * a , int flag ) {
816
874
uint64_t mask0 , mask1 ;
817
875
volatile int vflag = flag ;
876
+ secp256k1_scalar_verify (a );
818
877
SECP256K1_CHECKMEM_CHECK_VERIFY (r -> d , sizeof (r -> d ));
878
+
819
879
mask0 = vflag + ~((uint64_t )0 );
820
880
mask1 = ~mask0 ;
821
881
r -> d [0 ] = (r -> d [0 ] & mask0 ) | (a -> d [0 ] & mask1 );
822
882
r -> d [1 ] = (r -> d [1 ] & mask0 ) | (a -> d [1 ] & mask1 );
823
883
r -> d [2 ] = (r -> d [2 ] & mask0 ) | (a -> d [2 ] & mask1 );
824
884
r -> d [3 ] = (r -> d [3 ] & mask0 ) | (a -> d [3 ] & mask1 );
885
+
886
+ secp256k1_scalar_verify (r );
825
887
}
826
888
827
889
static void secp256k1_scalar_from_signed62 (secp256k1_scalar * r , const secp256k1_modinv64_signed62 * a ) {
@@ -841,18 +903,13 @@ static void secp256k1_scalar_from_signed62(secp256k1_scalar *r, const secp256k1_
841
903
r -> d [2 ] = a2 >> 4 | a3 << 58 ;
842
904
r -> d [3 ] = a3 >> 6 | a4 << 56 ;
843
905
844
- #ifdef VERIFY
845
- VERIFY_CHECK (secp256k1_scalar_check_overflow (r ) == 0 );
846
- #endif
906
+ secp256k1_scalar_verify (r );
847
907
}
848
908
849
909
static void secp256k1_scalar_to_signed62 (secp256k1_modinv64_signed62 * r , const secp256k1_scalar * a ) {
850
910
const uint64_t M62 = UINT64_MAX >> 2 ;
851
911
const uint64_t a0 = a -> d [0 ], a1 = a -> d [1 ], a2 = a -> d [2 ], a3 = a -> d [3 ];
852
-
853
- #ifdef VERIFY
854
- VERIFY_CHECK (secp256k1_scalar_check_overflow (a ) == 0 );
855
- #endif
912
+ secp256k1_scalar_verify (a );
856
913
857
914
r -> v [0 ] = a0 & M62 ;
858
915
r -> v [1 ] = (a0 >> 62 | a1 << 2 ) & M62 ;
@@ -871,10 +928,13 @@ static void secp256k1_scalar_inverse(secp256k1_scalar *r, const secp256k1_scalar
871
928
#ifdef VERIFY
872
929
int zero_in = secp256k1_scalar_is_zero (x );
873
930
#endif
931
+ secp256k1_scalar_verify (x );
932
+
874
933
secp256k1_scalar_to_signed62 (& s , x );
875
934
secp256k1_modinv64 (& s , & secp256k1_const_modinfo_scalar );
876
935
secp256k1_scalar_from_signed62 (r , & s );
877
936
937
+ secp256k1_scalar_verify (r );
878
938
#ifdef VERIFY
879
939
VERIFY_CHECK (secp256k1_scalar_is_zero (r ) == zero_in );
880
940
#endif
@@ -885,16 +945,21 @@ static void secp256k1_scalar_inverse_var(secp256k1_scalar *r, const secp256k1_sc
885
945
#ifdef VERIFY
886
946
int zero_in = secp256k1_scalar_is_zero (x );
887
947
#endif
948
+ secp256k1_scalar_verify (x );
949
+
888
950
secp256k1_scalar_to_signed62 (& s , x );
889
951
secp256k1_modinv64_var (& s , & secp256k1_const_modinfo_scalar );
890
952
secp256k1_scalar_from_signed62 (r , & s );
891
953
954
+ secp256k1_scalar_verify (r );
892
955
#ifdef VERIFY
893
956
VERIFY_CHECK (secp256k1_scalar_is_zero (r ) == zero_in );
894
957
#endif
895
958
}
896
959
897
960
SECP256K1_INLINE static int secp256k1_scalar_is_even (const secp256k1_scalar * a ) {
961
+ secp256k1_scalar_verify (a );
962
+
898
963
return !(a -> d [0 ] & 1 );
899
964
}
900
965
0 commit comments