@@ -21,7 +21,7 @@ static int _ecc_sign_hash(const unsigned char *in, unsigned long inlen,
2121 prng_state * prng , int wprng , ecc_key * key , int sigformat )
2222{
2323 ecc_key pubkey ;
24- void * r , * s , * e , * p ;
24+ void * r , * s , * e , * p , * b ;
2525 int err , max_iterations = LTC_PK_MAX_RETRIES ;
2626 unsigned long pbits , pbytes , i , shift_right ;
2727 unsigned char ch , buf [MAXBLOCKSIZE ];
@@ -46,7 +46,7 @@ static int _ecc_sign_hash(const unsigned char *in, unsigned long inlen,
4646 }
4747
4848 /* init the bignums */
49- if ((err = mp_init_multi (& r , & s , & p , & e , NULL )) != CRYPT_OK ) {
49+ if ((err = mp_init_multi (& r , & s , & p , & e , & b , NULL )) != CRYPT_OK ) {
5050 return err ;
5151 }
5252 if ((err = mp_read_radix (p , (char * )key -> dp -> order , 16 )) != CRYPT_OK ) { goto errnokey ; }
@@ -82,12 +82,15 @@ static int _ecc_sign_hash(const unsigned char *in, unsigned long inlen,
8282 if (mp_iszero (r ) == LTC_MP_YES ) {
8383 ecc_free (& pubkey );
8484 } else {
85+ if ((err = rand_bn_upto (b , p , prng , wprng )) != CRYPT_OK ) { goto error ; } /* b = blinding value */
8586 /* find s = (e + xr)/k */
86- if ((err = mp_invmod (pubkey .k , p , pubkey .k )) != CRYPT_OK ) { goto error ; } /* k = 1/k */
87+ if ((err = mp_mulmod (pubkey .k , b , p , pubkey .k )) != CRYPT_OK ) { goto error ; } /* k = kb */
88+ if ((err = mp_invmod (pubkey .k , p , pubkey .k )) != CRYPT_OK ) { goto error ; } /* k = 1/kb */
8789 if ((err = mp_mulmod (key -> k , r , p , s )) != CRYPT_OK ) { goto error ; } /* s = xr */
88- if ((err = mp_add (e , s , s )) != CRYPT_OK ) { goto error ; } /* s = e + xr */
89- if ((err = mp_mod (s , p , s )) != CRYPT_OK ) { goto error ; } /* s = e + xr */
90- if ((err = mp_mulmod (s , pubkey .k , p , s )) != CRYPT_OK ) { goto error ; } /* s = (e + xr)/k */
90+ if ((err = mp_mulmod (pubkey .k , s , p , s )) != CRYPT_OK ) { goto error ; } /* s = xr/kb */
91+ if ((err = mp_mulmod (pubkey .k , e , p , e )) != CRYPT_OK ) { goto error ; } /* e = e/kb */
92+ if ((err = mp_add (e , s , s )) != CRYPT_OK ) { goto error ; } /* s = e/kb + xr/kb */
93+ if ((err = mp_mulmod (s , b , p , s )) != CRYPT_OK ) { goto error ; } /* s = b(e/kb + xr/kb) = (e + xr)/k */
9194 ecc_free (& pubkey );
9295 if (mp_iszero (s ) == LTC_MP_NO ) {
9396 break ;
@@ -121,7 +124,7 @@ static int _ecc_sign_hash(const unsigned char *in, unsigned long inlen,
121124error :
122125 ecc_free (& pubkey );
123126errnokey :
124- mp_clear_multi (r , s , p , e , NULL );
127+ mp_clear_multi (r , s , p , e , b , NULL );
125128 return err ;
126129}
127130
0 commit comments