@@ -21,7 +21,7 @@ static int _ecc_sign_hash(const unsigned char *in, unsigned long inlen,
21
21
prng_state * prng , int wprng , const ecc_key * key , int sigformat )
22
22
{
23
23
ecc_key pubkey ;
24
- void * r , * s , * e , * p ;
24
+ void * r , * s , * e , * p , * b ;
25
25
int err , max_iterations = LTC_PK_MAX_RETRIES ;
26
26
unsigned long pbits , pbytes , i , shift_right ;
27
27
unsigned char ch , buf [MAXBLOCKSIZE ];
@@ -37,7 +37,7 @@ static int _ecc_sign_hash(const unsigned char *in, unsigned long inlen,
37
37
}
38
38
39
39
/* 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 ) {
41
41
return err ;
42
42
}
43
43
@@ -72,12 +72,15 @@ static int _ecc_sign_hash(const unsigned char *in, unsigned long inlen,
72
72
if (mp_iszero (r ) == LTC_MP_YES ) {
73
73
ecc_free (& pubkey );
74
74
} else {
75
+ if ((err = rand_bn_upto (b , p , prng , wprng )) != CRYPT_OK ) { goto error ; } /* b = blinding value */
75
76
/* 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 */
77
79
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 */
81
84
ecc_free (& pubkey );
82
85
if (mp_iszero (s ) == LTC_MP_NO ) {
83
86
break ;
@@ -111,7 +114,7 @@ static int _ecc_sign_hash(const unsigned char *in, unsigned long inlen,
111
114
error :
112
115
ecc_free (& pubkey );
113
116
errnokey :
114
- mp_clear_multi (r , s , e , NULL );
117
+ mp_clear_multi (r , s , e , b , NULL );
115
118
return err ;
116
119
}
117
120
0 commit comments