@@ -21,7 +21,7 @@ static int _ecc_sign_hash(const unsigned char *in, unsigned long inlen,
2121 prng_state * prng , int wprng , const 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 ];
@@ -37,7 +37,7 @@ static int _ecc_sign_hash(const unsigned char *in, unsigned long inlen,
3737 }
3838
3939 /* init the bignums */
40- if ((err = mp_init_multi (& r , & s , & e , NULL )) != CRYPT_OK ) {
40+ if ((err = mp_init_multi (& r , & s , & e , & b , NULL )) != CRYPT_OK ) {
4141 return err ;
4242 }
4343
@@ -72,12 +72,15 @@ static int _ecc_sign_hash(const unsigned char *in, unsigned long inlen,
7272 if (mp_iszero (r ) == LTC_MP_YES ) {
7373 ecc_free (& pubkey );
7474 } else {
75+ if ((err = rand_bn_upto (b , p , prng , wprng )) != CRYPT_OK ) { goto error ; } /* b = blinding value */
7576 /* find s = (e + xr)/k */
76- if ((err = mp_invmod (pubkey .k , p , pubkey .k )) != CRYPT_OK ) { goto error ; } /* k = 1/k */
77+ if ((err = mp_mulmod (pubkey .k , b , p , pubkey .k )) != CRYPT_OK ) { goto error ; } /* k = kb */
78+ if ((err = mp_invmod (pubkey .k , p , pubkey .k )) != CRYPT_OK ) { goto error ; } /* k = 1/kb */
7779 if ((err = mp_mulmod (key -> k , r , p , s )) != CRYPT_OK ) { goto error ; } /* s = xr */
78- if ((err = mp_add (e , s , s )) != CRYPT_OK ) { goto error ; } /* s = e + xr */
79- if ((err = mp_mod (s , p , s )) != CRYPT_OK ) { goto error ; } /* s = e + xr */
80- if ((err = mp_mulmod (s , pubkey .k , p , s )) != CRYPT_OK ) { goto error ; } /* s = (e + xr)/k */
80+ if ((err = mp_mulmod (pubkey .k , s , p , s )) != CRYPT_OK ) { goto error ; } /* s = xr/kb */
81+ if ((err = mp_mulmod (pubkey .k , e , p , e )) != CRYPT_OK ) { goto error ; } /* e = e/kb */
82+ if ((err = mp_add (e , s , s )) != CRYPT_OK ) { goto error ; } /* s = e/kb + xr/kb */
83+ if ((err = mp_mulmod (s , b , p , s )) != CRYPT_OK ) { goto error ; } /* s = b(e/kb + xr/kb) = (e + xr)/k */
8184 ecc_free (& pubkey );
8285 if (mp_iszero (s ) == LTC_MP_NO ) {
8386 break ;
@@ -111,7 +114,7 @@ static int _ecc_sign_hash(const unsigned char *in, unsigned long inlen,
111114error :
112115 ecc_free (& pubkey );
113116errnokey :
114- mp_clear_multi (r , s , e , NULL );
117+ mp_clear_multi (r , s , e , b , NULL );
115118 return err ;
116119}
117120
0 commit comments