@@ -3040,20 +3040,70 @@ void test_fixed_wnaf(const secp256k1_scalar *number, int w) {
30403040 CHECK (secp256k1_scalar_eq (& x , & num ));
30413041}
30423042
3043- void test_fixed_wnaf_zero (int w ) {
3043+ /* Checks that the first 8 elements of wnaf are equal to wnaf_expected and the
3044+ * rest is 0.*/
3045+ void test_fixed_wnaf_small_helper (int * wnaf , int * wnaf_expected , int w ) {
3046+ int i ;
3047+ for (i = WNAF_SIZE (w )- 1 ; i >= 8 ; -- i ) {
3048+ CHECK (wnaf [i ] == 0 );
3049+ }
3050+ for (i = 7 ; i >= 0 ; -- i ) {
3051+ CHECK (wnaf [i ] == wnaf_expected [i ]);
3052+ }
3053+ }
3054+
3055+ void test_fixed_wnaf_small (void ) {
3056+ int w = 4 ;
30443057 int wnaf [256 ] = {0 };
30453058 int i ;
30463059 int skew ;
30473060 secp256k1_scalar num ;
30483061
30493062 secp256k1_scalar_set_int (& num , 0 );
30503063 skew = secp256k1_wnaf_fixed (wnaf , & num , w );
3051-
30523064 for (i = WNAF_SIZE (w )- 1 ; i >= 0 ; -- i ) {
30533065 int v = wnaf [i ];
30543066 CHECK (v == 0 );
30553067 }
30563068 CHECK (skew == 0 );
3069+
3070+ secp256k1_scalar_set_int (& num , 1 );
3071+ skew = secp256k1_wnaf_fixed (wnaf , & num , w );
3072+ for (i = WNAF_SIZE (w )- 1 ; i >= 1 ; -- i ) {
3073+ int v = wnaf [i ];
3074+ CHECK (v == 0 );
3075+ }
3076+ CHECK (wnaf [0 ] == 1 );
3077+ CHECK (skew == 0 );
3078+
3079+ {
3080+ int wnaf_expected [8 ] = { 0xf , 0xf , 0xf , 0xf , 0xf , 0xf , 0xf , 0xf };
3081+ secp256k1_scalar_set_int (& num , 0xffffffff );
3082+ skew = secp256k1_wnaf_fixed (wnaf , & num , w );
3083+ test_fixed_wnaf_small_helper (wnaf , wnaf_expected , w );
3084+ CHECK (skew == 0 );
3085+ }
3086+ {
3087+ int wnaf_expected [8 ] = { -1 , -1 , -1 , -1 , -1 , -1 , -1 , 0xf };
3088+ secp256k1_scalar_set_int (& num , 0xeeeeeeee );
3089+ skew = secp256k1_wnaf_fixed (wnaf , & num , w );
3090+ test_fixed_wnaf_small_helper (wnaf , wnaf_expected , w );
3091+ CHECK (skew == 1 );
3092+ }
3093+ {
3094+ int wnaf_expected [8 ] = { 1 , 0 , 1 , 0 , 1 , 0 , 1 , 0 };
3095+ secp256k1_scalar_set_int (& num , 0x01010101 );
3096+ skew = secp256k1_wnaf_fixed (wnaf , & num , w );
3097+ test_fixed_wnaf_small_helper (wnaf , wnaf_expected , w );
3098+ CHECK (skew == 0 );
3099+ }
3100+ {
3101+ int wnaf_expected [8 ] = { -0xf , 0 , 0xf , -0xf , 0 , 0xf , 1 , 0 };
3102+ secp256k1_scalar_set_int (& num , 0x01ef1ef1 );
3103+ skew = secp256k1_wnaf_fixed (wnaf , & num , w );
3104+ test_fixed_wnaf_small_helper (wnaf , wnaf_expected , w );
3105+ CHECK (skew == 0 );
3106+ }
30573107}
30583108
30593109void run_wnaf (void ) {
@@ -3067,7 +3117,7 @@ void run_wnaf(void) {
30673117 n .d [0 ] = 2 ;
30683118 test_constant_wnaf (& n , 4 );
30693119 /* Test 0 */
3070- test_fixed_wnaf_zero ( 4 );
3120+ test_fixed_wnaf_small ( );
30713121 /* Random tests */
30723122 for (i = 0 ; i < count ; i ++ ) {
30733123 random_scalar_order (& n );
0 commit comments