@@ -100,7 +100,8 @@ static void bits2int(uECC_word_t *native, const uint8_t *bits, unsigned bits_siz
100
100
int uECC_sign_with_k (const uint8_t * private_key , const uint8_t * message_hash , unsigned hash_size , uECC_word_t * k , uint8_t * signature , uECC_Curve curve ) {
101
101
uECC_word_t tmp [NUM_ECC_WORDS ];
102
102
uECC_word_t s [NUM_ECC_WORDS ];
103
- uECC_word_t * k2 [2 ] = {tmp , s };
103
+ uECC_word_t * k2 [2 ] = {tmp , s };
104
+ uECC_word_t * initial_Z = 0 ;
104
105
uECC_word_t p [NUM_ECC_WORDS * 2 ];
105
106
uECC_word_t carry ;
106
107
wordcount_t num_words = curve -> num_words ;
@@ -113,7 +114,15 @@ int uECC_sign_with_k(const uint8_t *private_key, const uint8_t *message_hash, un
113
114
}
114
115
115
116
carry = regularize_k (k , tmp , s , curve );
116
- EccPoint_mult (p , curve -> G , k2 [!carry ], 0 , num_n_bits + 1 , curve );
117
+ /* If an RNG function was specified, try to get a random initial Z value to improve
118
+ protection against side-channel attacks. */
119
+ if (g_rng_function ) {
120
+ if (!uECC_generate_random_int (k2 [carry ], curve -> p , num_words )) {
121
+ return 0 ;
122
+ }
123
+ initial_Z = k2 [carry ];
124
+ }
125
+ EccPoint_mult (p , curve -> G , k2 [!carry ], initial_Z , num_n_bits + 1 , curve );
117
126
if (uECC_vli_isZero (p , num_words )) {
118
127
return 0 ;
119
128
}
0 commit comments