The sliding-window expansion in libgcrypt, having left-to-right method for computing in RSA-1024 implementation, is vulnerable to cache side-channel attack resulting into complete break of RSA-1024 and RSA-2048.
Change-Id: I19c3ac02da9d88860cd3e7bf94d22bbb0ec78467
Reviewed-on: http://photon-jenkins.eng.vmware.com:8082/6654
Reviewed-by: Joao Lima
Tested-by: gerrit-photon <photon-checkins@vmware.com>
Reviewed-by: Anish Swaminathan <anishs@vmware.com>
| 1 | 1 |
new file mode 100644 |
| ... | ... |
@@ -0,0 +1,503 @@ |
| 0 |
+X-Git-Url: http://git.gnupg.org/cgi-bin/gitweb.cgi?p=libgcrypt.git;a=blobdiff_plain;f=cipher%2Frsa.c;h=9f83e8f239fb1f6467d7657ad4dda671fd395ade;hp=7f12ecd610851dce82e34e608c2d4439f7e4a84f;hb=e6a3dc9900433bbc8ad362a595a3837318c28fa9;hpb=d091610377b2c92cf385282b1adfc30fa6cd5c75 |
|
| 1 |
+ |
|
| 2 |
+diff --git a/cipher/rsa.c b/cipher/rsa.c |
|
| 3 |
+index 7f12ecd..9f83e8f 100644 |
|
| 4 |
+--- a/cipher/rsa.c |
|
| 5 |
+@@ -991,20 +991,64 @@ stronger_key_check ( RSA_secret_key *skey ) |
|
| 6 |
+ #endif |
|
| 7 |
+ |
|
| 8 |
+ |
|
| 9 |
+- |
|
| 10 |
+-/**************** |
|
| 11 |
+- * Secret key operation. Encrypt INPUT with SKEY and put result into OUTPUT. |
|
| 12 |
++ |
|
| 13 |
++/* Secret key operation - standard version. |
|
| 14 |
+ * |
|
| 15 |
+ * m = c^d mod n |
|
| 16 |
+- * |
|
| 17 |
+- * Or faster: |
|
| 18 |
++ */ |
|
| 19 |
++static void |
|
| 20 |
++secret_core_std (gcry_mpi_t M, gcry_mpi_t C, |
|
| 21 |
++ gcry_mpi_t D, gcry_mpi_t N) |
|
| 22 |
++{
|
|
| 23 |
++ mpi_powm (M, C, D, N); |
|
| 24 |
++} |
|
| 25 |
++ |
|
| 26 |
++ |
|
| 27 |
++/* Secret key operation - using the CRT. |
|
| 28 |
+ * |
|
| 29 |
+ * m1 = c ^ (d mod (p-1)) mod p |
|
| 30 |
+ * m2 = c ^ (d mod (q-1)) mod q |
|
| 31 |
+ * h = u * (m2 - m1) mod q |
|
| 32 |
+ * m = m1 + h * p |
|
| 33 |
+- * |
|
| 34 |
+- * Where m is OUTPUT, c is INPUT and d,n,p,q,u are elements of SKEY. |
|
| 35 |
++ */ |
|
| 36 |
++static void |
|
| 37 |
++secret_core_crt (gcry_mpi_t M, gcry_mpi_t C, |
|
| 38 |
++ gcry_mpi_t D, unsigned int Nlimbs, |
|
| 39 |
++ gcry_mpi_t P, gcry_mpi_t Q, gcry_mpi_t U) |
|
| 40 |
++{
|
|
| 41 |
++ gcry_mpi_t m1 = mpi_alloc_secure ( Nlimbs + 1 ); |
|
| 42 |
++ gcry_mpi_t m2 = mpi_alloc_secure ( Nlimbs + 1 ); |
|
| 43 |
++ gcry_mpi_t h = mpi_alloc_secure ( Nlimbs + 1 ); |
|
| 44 |
++ |
|
| 45 |
++ /* m1 = c ^ (d mod (p-1)) mod p */ |
|
| 46 |
++ mpi_sub_ui ( h, P, 1 ); |
|
| 47 |
++ mpi_fdiv_r ( h, D, h ); |
|
| 48 |
++ mpi_powm ( m1, C, h, P ); |
|
| 49 |
++ |
|
| 50 |
++ /* m2 = c ^ (d mod (q-1)) mod q */ |
|
| 51 |
++ mpi_sub_ui ( h, Q, 1 ); |
|
| 52 |
++ mpi_fdiv_r ( h, D, h ); |
|
| 53 |
++ mpi_powm ( m2, C, h, Q ); |
|
| 54 |
++ |
|
| 55 |
++ /* h = u * ( m2 - m1 ) mod q */ |
|
| 56 |
++ mpi_sub ( h, m2, m1 ); |
|
| 57 |
++ if ( mpi_has_sign ( h ) ) |
|
| 58 |
++ mpi_add ( h, h, Q ); |
|
| 59 |
++ mpi_mulm ( h, U, h, Q ); |
|
| 60 |
++ |
|
| 61 |
++ /* m = m1 + h * p */ |
|
| 62 |
++ mpi_mul ( h, h, P ); |
|
| 63 |
++ mpi_add ( M, m1, h ); |
|
| 64 |
++ |
|
| 65 |
++ mpi_free ( h ); |
|
| 66 |
++ mpi_free ( m1 ); |
|
| 67 |
++ mpi_free ( m2 ); |
|
| 68 |
++} |
|
| 69 |
++ |
|
| 70 |
++ |
|
| 71 |
++/* Secret key operation. |
|
| 72 |
++ * Encrypt INPUT with SKEY and put result into |
|
| 73 |
++ * OUTPUT. SKEY has the secret key parameters. |
|
| 74 |
+ */ |
|
| 75 |
+ static void |
|
| 76 |
+ secret (gcry_mpi_t output, gcry_mpi_t input, RSA_secret_key *skey ) |
|
| 77 |
+@@ -1014,37 +1058,16 @@ secret (gcry_mpi_t output, gcry_mpi_t input, RSA_secret_key *skey ) |
|
| 78 |
+ |
|
| 79 |
+ if (!skey->p || !skey->q || !skey->u) |
|
| 80 |
+ {
|
|
| 81 |
+- mpi_powm (output, input, skey->d, skey->n); |
|
| 82 |
++ secret_core_std (output, input, skey->d, skey->n); |
|
| 83 |
+ } |
|
| 84 |
+ else |
|
| 85 |
+ {
|
|
| 86 |
+- gcry_mpi_t m1 = mpi_alloc_secure( mpi_get_nlimbs(skey->n)+1 ); |
|
| 87 |
+- gcry_mpi_t m2 = mpi_alloc_secure( mpi_get_nlimbs(skey->n)+1 ); |
|
| 88 |
+- gcry_mpi_t h = mpi_alloc_secure( mpi_get_nlimbs(skey->n)+1 ); |
|
| 89 |
+- |
|
| 90 |
+- /* m1 = c ^ (d mod (p-1)) mod p */ |
|
| 91 |
+- mpi_sub_ui( h, skey->p, 1 ); |
|
| 92 |
+- mpi_fdiv_r( h, skey->d, h ); |
|
| 93 |
+- mpi_powm( m1, input, h, skey->p ); |
|
| 94 |
+- /* m2 = c ^ (d mod (q-1)) mod q */ |
|
| 95 |
+- mpi_sub_ui( h, skey->q, 1 ); |
|
| 96 |
+- mpi_fdiv_r( h, skey->d, h ); |
|
| 97 |
+- mpi_powm( m2, input, h, skey->q ); |
|
| 98 |
+- /* h = u * ( m2 - m1 ) mod q */ |
|
| 99 |
+- mpi_sub( h, m2, m1 ); |
|
| 100 |
+- if ( mpi_has_sign ( h ) ) |
|
| 101 |
+- mpi_add ( h, h, skey->q ); |
|
| 102 |
+- mpi_mulm( h, skey->u, h, skey->q ); |
|
| 103 |
+- /* m = m1 + h * p */ |
|
| 104 |
+- mpi_mul ( h, h, skey->p ); |
|
| 105 |
+- mpi_add ( output, m1, h ); |
|
| 106 |
+- |
|
| 107 |
+- mpi_free ( h ); |
|
| 108 |
+- mpi_free ( m1 ); |
|
| 109 |
+- mpi_free ( m2 ); |
|
| 110 |
++ secret_core_crt (output, input, skey->d, mpi_get_nlimbs (skey->n), |
|
| 111 |
++ skey->p, skey->q, skey->u); |
|
| 112 |
+ } |
|
| 113 |
+ } |
|
| 114 |
+ |
|
| 115 |
++ |
|
| 116 |
+ static void |
|
| 117 |
+ secret_blinded (gcry_mpi_t output, gcry_mpi_t input, |
|
| 118 |
+ RSA_secret_key *sk, unsigned int nbits) |
|
| 119 |
+@@ -1088,6 +1111,7 @@ secret_blinded (gcry_mpi_t output, gcry_mpi_t input, |
|
| 120 |
+ _gcry_mpi_release (ri); |
|
| 121 |
+ } |
|
| 122 |
+ |
|
| 123 |
++ |
|
| 124 |
+ /********************************************* |
|
| 125 |
+ ************** interface ****************** |
|
| 126 |
+ *********************************************/ |
|
| 127 |
+ |
|
| 128 |
+ |
|
| 129 |
+ |
|
| 130 |
+X-Git-Url: http://git.gnupg.org/cgi-bin/gitweb.cgi?p=libgcrypt.git;a=blobdiff_plain;f=cipher%2Frsa.c;h=ce73f106b2699b498e5053a08d625349a7c34099;hp=9f83e8f239fb1f6467d7657ad4dda671fd395ade;hb=8725c99ffa41778f382ca97233183bcd687bb0ce;hpb=78130828e9a140a9de4dafadbc844dbb64cb709a |
|
| 131 |
+ |
|
| 132 |
+diff --git a/cipher/rsa.c b/cipher/rsa.c |
|
| 133 |
+index 9f83e8f..ce73f10 100644 |
|
| 134 |
+--- a/cipher/rsa.c |
|
| 135 |
+@@ -1019,16 +1019,37 @@ secret_core_crt (gcry_mpi_t M, gcry_mpi_t C, |
|
| 136 |
+ gcry_mpi_t m1 = mpi_alloc_secure ( Nlimbs + 1 ); |
|
| 137 |
+ gcry_mpi_t m2 = mpi_alloc_secure ( Nlimbs + 1 ); |
|
| 138 |
+ gcry_mpi_t h = mpi_alloc_secure ( Nlimbs + 1 ); |
|
| 139 |
+- |
|
| 140 |
+- /* m1 = c ^ (d mod (p-1)) mod p */ |
|
| 141 |
++ gcry_mpi_t D_blind = mpi_alloc_secure ( Nlimbs + 1 ); |
|
| 142 |
++ gcry_mpi_t r; |
|
| 143 |
++ unsigned int r_nbits; |
|
| 144 |
++ |
|
| 145 |
++ r_nbits = mpi_get_nbits (P) / 4; |
|
| 146 |
++ if (r_nbits < 96) |
|
| 147 |
++ r_nbits = 96; |
|
| 148 |
++ r = mpi_alloc_secure ( (r_nbits + BITS_PER_MPI_LIMB-1)/BITS_PER_MPI_LIMB ); |
|
| 149 |
++ |
|
| 150 |
++ /* d_blind = (d mod (p-1)) + (p-1) * r */ |
|
| 151 |
++ /* m1 = c ^ d_blind mod p */ |
|
| 152 |
++ _gcry_mpi_randomize (r, r_nbits, GCRY_WEAK_RANDOM); |
|
| 153 |
++ mpi_set_highbit (r, r_nbits - 1); |
|
| 154 |
+ mpi_sub_ui ( h, P, 1 ); |
|
| 155 |
++ mpi_mul ( D_blind, h, r ); |
|
| 156 |
+ mpi_fdiv_r ( h, D, h ); |
|
| 157 |
+- mpi_powm ( m1, C, h, P ); |
|
| 158 |
++ mpi_add ( D_blind, D_blind, h ); |
|
| 159 |
++ mpi_powm ( m1, C, D_blind, P ); |
|
| 160 |
+ |
|
| 161 |
+- /* m2 = c ^ (d mod (q-1)) mod q */ |
|
| 162 |
++ /* d_blind = (d mod (q-1)) + (q-1) * r */ |
|
| 163 |
++ /* m2 = c ^ d_blind mod q */ |
|
| 164 |
++ _gcry_mpi_randomize (r, r_nbits, GCRY_WEAK_RANDOM); |
|
| 165 |
++ mpi_set_highbit (r, r_nbits - 1); |
|
| 166 |
+ mpi_sub_ui ( h, Q, 1 ); |
|
| 167 |
++ mpi_mul ( D_blind, h, r ); |
|
| 168 |
+ mpi_fdiv_r ( h, D, h ); |
|
| 169 |
+- mpi_powm ( m2, C, h, Q ); |
|
| 170 |
++ mpi_add ( D_blind, D_blind, h ); |
|
| 171 |
++ mpi_powm ( m2, C, D_blind, Q ); |
|
| 172 |
++ |
|
| 173 |
++ mpi_free ( r ); |
|
| 174 |
++ mpi_free ( D_blind ); |
|
| 175 |
+ |
|
| 176 |
+ /* h = u * ( m2 - m1 ) mod q */ |
|
| 177 |
+ mpi_sub ( h, m2, m1 ); |
|
| 178 |
+ |
|
| 179 |
+ |
|
| 180 |
+ |
|
| 181 |
+--- a/mpi/mpi-pow.c |
|
| 182 |
+@@ -573,6 +573,8 @@ _gcry_mpi_powm (gcry_mpi_t res, |
|
| 183 |
+ MPN_COPY (precomp[i], rp, rsize); |
|
| 184 |
+ } |
|
| 185 |
+ |
|
| 186 |
++ if (msize > max_u_size) |
|
| 187 |
++ max_u_size = msize; |
|
| 188 |
+ base_u = mpi_alloc_limb_space (max_u_size, esec); |
|
| 189 |
+ MPN_ZERO (base_u, max_u_size); |
|
| 190 |
+ |
|
| 191 |
+@@ -609,12 +611,8 @@ _gcry_mpi_powm (gcry_mpi_t res, |
|
| 192 |
+ if (e == 0) |
|
| 193 |
+ {
|
|
| 194 |
+ j += c; |
|
| 195 |
+- i--; |
|
| 196 |
+- if ( i < 0 ) |
|
| 197 |
+- {
|
|
| 198 |
+- c = 0; |
|
| 199 |
+- break; |
|
| 200 |
+- } |
|
| 201 |
++ if ( --i < 0 ) |
|
| 202 |
++ break; |
|
| 203 |
+ |
|
| 204 |
+ e = ep[i]; |
|
| 205 |
+ c = BITS_PER_MPI_LIMB; |
|
| 206 |
+@@ -623,79 +621,78 @@ _gcry_mpi_powm (gcry_mpi_t res, |
|
| 207 |
+ {
|
|
| 208 |
+ int c0; |
|
| 209 |
+ mpi_limb_t e0; |
|
| 210 |
++ struct gcry_mpi w, u; |
|
| 211 |
++ w.sign = u.sign = 0; |
|
| 212 |
++ w.flags = u.flags = 0; |
|
| 213 |
++ w.d = base_u; |
|
| 214 |
+ |
|
| 215 |
+ count_leading_zeros (c0, e); |
|
| 216 |
+ e = (e << c0); |
|
| 217 |
+ c -= c0; |
|
| 218 |
+ j += c0; |
|
| 219 |
+ |
|
| 220 |
++ e0 = (e >> (BITS_PER_MPI_LIMB - W)); |
|
| 221 |
+ if (c >= W) |
|
| 222 |
+- {
|
|
| 223 |
+- e0 = (e >> (BITS_PER_MPI_LIMB - W)); |
|
| 224 |
+- e = (e << W); |
|
| 225 |
+- c -= W; |
|
| 226 |
+- } |
|
| 227 |
++ c0 = 0; |
|
| 228 |
+ else |
|
| 229 |
+ {
|
|
| 230 |
+- i--; |
|
| 231 |
+- if ( i < 0 ) |
|
| 232 |
++ if ( --i < 0 ) |
|
| 233 |
+ {
|
|
| 234 |
+- e = (e >> (BITS_PER_MPI_LIMB - c)); |
|
| 235 |
+- break; |
|
| 236 |
++ e0 = (e >> (BITS_PER_MPI_LIMB - c)); |
|
| 237 |
++ j += c - W; |
|
| 238 |
++ goto last_step; |
|
| 239 |
++ } |
|
| 240 |
++ else |
|
| 241 |
++ {
|
|
| 242 |
++ c0 = c; |
|
| 243 |
++ e = ep[i]; |
|
| 244 |
++ c = BITS_PER_MPI_LIMB; |
|
| 245 |
++ e0 |= (e >> (BITS_PER_MPI_LIMB - (W - c0))); |
|
| 246 |
+ } |
|
| 247 |
+- |
|
| 248 |
+- c0 = c; |
|
| 249 |
+- e0 = (e >> (BITS_PER_MPI_LIMB - W)) |
|
| 250 |
+- | (ep[i] >> (BITS_PER_MPI_LIMB - W + c0)); |
|
| 251 |
+- e = (ep[i] << (W - c0)); |
|
| 252 |
+- c = BITS_PER_MPI_LIMB - W + c0; |
|
| 253 |
+ } |
|
| 254 |
+ |
|
| 255 |
++ e = e << (W - c0); |
|
| 256 |
++ c -= (W - c0); |
|
| 257 |
++ |
|
| 258 |
++ last_step: |
|
| 259 |
+ count_trailing_zeros (c0, e0); |
|
| 260 |
+ e0 = (e0 >> c0) >> 1; |
|
| 261 |
+ |
|
| 262 |
+- for (j += W - c0; j; j--) |
|
| 263 |
++ for (j += W - c0; j >= 0; j--) |
|
| 264 |
+ {
|
|
| 265 |
+- mul_mod (xp, &xsize, rp, rsize, rp, rsize, mp, msize, &karactx); |
|
| 266 |
+- tp = rp; rp = xp; xp = tp; |
|
| 267 |
+- rsize = xsize; |
|
| 268 |
+- } |
|
| 269 |
+ |
|
| 270 |
+- /* |
|
| 271 |
+- * base_u <= precomp[e0] |
|
| 272 |
+- * base_u_size <= precomp_size[e0] |
|
| 273 |
+- */ |
|
| 274 |
+- base_u_size = 0; |
|
| 275 |
+- for (k = 0; k < (1<< (W - 1)); k++) |
|
| 276 |
+- {
|
|
| 277 |
+- struct gcry_mpi w, u; |
|
| 278 |
+- w.alloced = w.nlimbs = precomp_size[k]; |
|
| 279 |
+- u.alloced = u.nlimbs = precomp_size[k]; |
|
| 280 |
+- w.sign = u.sign = 0; |
|
| 281 |
+- w.flags = u.flags = 0; |
|
| 282 |
+- w.d = base_u; |
|
| 283 |
+- u.d = precomp[k]; |
|
| 284 |
++ /* |
|
| 285 |
++ * base_u <= precomp[e0] |
|
| 286 |
++ * base_u_size <= precomp_size[e0] |
|
| 287 |
++ */ |
|
| 288 |
++ base_u_size = 0; |
|
| 289 |
++ for (k = 0; k < (1<< (W - 1)); k++) |
|
| 290 |
++ {
|
|
| 291 |
++ w.alloced = w.nlimbs = precomp_size[k]; |
|
| 292 |
++ u.alloced = u.nlimbs = precomp_size[k]; |
|
| 293 |
++ u.d = precomp[k]; |
|
| 294 |
+ |
|
| 295 |
+- mpi_set_cond (&w, &u, k == e0); |
|
| 296 |
+- base_u_size |= (precomp_size[k] & ((mpi_size_t)0 - (k == e0)) ); |
|
| 297 |
+- } |
|
| 298 |
++ mpi_set_cond (&w, &u, k == e0); |
|
| 299 |
++ base_u_size |= ( precomp_size[k] & (0UL - (k == e0)) ); |
|
| 300 |
++ } |
|
| 301 |
+ |
|
| 302 |
+- mul_mod (xp, &xsize, rp, rsize, base_u, base_u_size, |
|
| 303 |
+- mp, msize, &karactx); |
|
| 304 |
+- tp = rp; rp = xp; xp = tp; |
|
| 305 |
+- rsize = xsize; |
|
| 306 |
++ w.alloced = w.nlimbs = rsize; |
|
| 307 |
++ u.alloced = u.nlimbs = rsize; |
|
| 308 |
++ u.d = rp; |
|
| 309 |
++ mpi_set_cond (&w, &u, j != 0); |
|
| 310 |
++ base_u_size ^= ((base_u_size ^ rsize) & (0UL - (j != 0))); |
|
| 311 |
++ |
|
| 312 |
++ mul_mod (xp, &xsize, rp, rsize, base_u, base_u_size, |
|
| 313 |
++ mp, msize, &karactx); |
|
| 314 |
++ tp = rp; rp = xp; xp = tp; |
|
| 315 |
++ rsize = xsize; |
|
| 316 |
++ } |
|
| 317 |
+ |
|
| 318 |
+ j = c0; |
|
| 319 |
++ if ( i < 0 ) |
|
| 320 |
++ break; |
|
| 321 |
+ } |
|
| 322 |
+ |
|
| 323 |
+- if (c != 0) |
|
| 324 |
+- {
|
|
| 325 |
+- j += c; |
|
| 326 |
+- count_trailing_zeros (c, e); |
|
| 327 |
+- e = (e >> c); |
|
| 328 |
+- j -= c; |
|
| 329 |
+- } |
|
| 330 |
+- |
|
| 331 |
+ while (j--) |
|
| 332 |
+ {
|
|
| 333 |
+ mul_mod (xp, &xsize, rp, rsize, rp, rsize, mp, msize, &karactx); |
|
| 334 |
+@@ -703,40 +700,6 @@ _gcry_mpi_powm (gcry_mpi_t res, |
|
| 335 |
+ rsize = xsize; |
|
| 336 |
+ } |
|
| 337 |
+ |
|
| 338 |
+- if (e != 0) |
|
| 339 |
+- {
|
|
| 340 |
+- /* |
|
| 341 |
+- * base_u <= precomp[(e>>1)] |
|
| 342 |
+- * base_u_size <= precomp_size[(e>>1)] |
|
| 343 |
+- */ |
|
| 344 |
+- base_u_size = 0; |
|
| 345 |
+- for (k = 0; k < (1<< (W - 1)); k++) |
|
| 346 |
+- {
|
|
| 347 |
+- struct gcry_mpi w, u; |
|
| 348 |
+- w.alloced = w.nlimbs = precomp_size[k]; |
|
| 349 |
+- u.alloced = u.nlimbs = precomp_size[k]; |
|
| 350 |
+- w.sign = u.sign = 0; |
|
| 351 |
+- w.flags = u.flags = 0; |
|
| 352 |
+- w.d = base_u; |
|
| 353 |
+- u.d = precomp[k]; |
|
| 354 |
+- |
|
| 355 |
+- mpi_set_cond (&w, &u, k == (e>>1)); |
|
| 356 |
+- base_u_size |= (precomp_size[k] & ((mpi_size_t)0 - (k == (e>>1))) ); |
|
| 357 |
+- } |
|
| 358 |
+- |
|
| 359 |
+- mul_mod (xp, &xsize, rp, rsize, base_u, base_u_size, |
|
| 360 |
+- mp, msize, &karactx); |
|
| 361 |
+- tp = rp; rp = xp; xp = tp; |
|
| 362 |
+- rsize = xsize; |
|
| 363 |
+- |
|
| 364 |
+- for (; c; c--) |
|
| 365 |
+- {
|
|
| 366 |
+- mul_mod (xp, &xsize, rp, rsize, rp, rsize, mp, msize, &karactx); |
|
| 367 |
+- tp = rp; rp = xp; xp = tp; |
|
| 368 |
+- rsize = xsize; |
|
| 369 |
+- } |
|
| 370 |
+- } |
|
| 371 |
+- |
|
| 372 |
+ /* We shifted MOD, the modulo reduction argument, left |
|
| 373 |
+ MOD_SHIFT_CNT steps. Adjust the result by reducing it with the |
|
| 374 |
+ original MOD. |
|
| 375 |
+ |
|
| 376 |
+ |
|
| 377 |
+ |
|
| 378 |
+From 619ebae9847831f43314a95cc3180f4b329b4d3b Mon Sep 17 00:00:00 2001 |
|
| 379 |
+From: NIIBE Yutaka <gniibe@fsij.org> |
|
| 380 |
+Date: Fri, 7 Jul 2017 11:39:09 +0900 |
|
| 381 |
+Subject: [PATCH] Fix mpi_pow alternative implementation. |
|
| 382 |
+ |
|
| 383 |
+* mpi/mpi-pow.c [USE_ALGORITHM_SIMPLE_EXPONENTIATION] (_gcry_mpi_powm): |
|
| 384 |
+Allocate size fix. |
|
| 385 |
+ |
|
| 386 |
+Signed-off-by: NIIBE Yutaka <gniibe@fsij.org> |
|
| 387 |
+--- |
|
| 388 |
+ mpi/mpi-pow.c | 4 ++-- |
|
| 389 |
+ 1 file changed, 2 insertions(+), 2 deletions(-) |
|
| 390 |
+ |
|
| 391 |
+diff --git a/mpi/mpi-pow.c b/mpi/mpi-pow.c |
|
| 392 |
+index 3cba6903..3d6d68c8 100644 |
|
| 393 |
+--- a/mpi/mpi-pow.c |
|
| 394 |
+@@ -189,8 +189,8 @@ _gcry_mpi_powm (gcry_mpi_t res, |
|
| 395 |
+ mpi_limb_t carry_limb; |
|
| 396 |
+ struct karatsuba_ctx karactx; |
|
| 397 |
+ |
|
| 398 |
+- xp_nlimbs = msec? (2 * (msize + 1)):0; |
|
| 399 |
+- xp = xp_marker = mpi_alloc_limb_space( 2 * (msize + 1), msec ); |
|
| 400 |
++ xp_nlimbs = msec? size:0; |
|
| 401 |
++ xp = xp_marker = mpi_alloc_limb_space( size, msec ); |
|
| 402 |
+ |
|
| 403 |
+ memset( &karactx, 0, sizeof karactx ); |
|
| 404 |
+ negative_result = (ep[0] & 1) && bsign; |
|
| 405 |
+ |
|
| 406 |
+ |
|
| 407 |
+ |
|
| 408 |
+From 66ed4d53789892def7b237756d8a0ab28df9d222 Mon Sep 17 00:00:00 2001 |
|
| 409 |
+From: NIIBE Yutaka <gniibe@fsij.org> |
|
| 410 |
+Date: Fri, 7 Jul 2017 12:00:03 +0900 |
|
| 411 |
+Subject: [PATCH] mpi: Fix mpi_pow alternative implementation. |
|
| 412 |
+ |
|
| 413 |
+* mpi/mpi-pow.c |
|
| 414 |
+ [USE_ALGORITHM_SIMPLE_EXPONENTIATION] (_gcry_mpi_powm): Use |
|
| 415 |
+ mpi_set_cond. |
|
| 416 |
+ |
|
| 417 |
+-- |
|
| 418 |
+ |
|
| 419 |
+Limbs of RES may be allocated more before the call of mpi_pow, |
|
| 420 |
+but it only uses the space of SIZE. |
|
| 421 |
+ |
|
| 422 |
+Signed-off-by: NIIBE Yutaka <gniibe@fsij.org> |
|
| 423 |
+--- |
|
| 424 |
+ mpi/mpi-pow.c | 16 +++++++++++----- |
|
| 425 |
+ 1 file changed, 11 insertions(+), 5 deletions(-) |
|
| 426 |
+ |
|
| 427 |
+diff --git a/mpi/mpi-pow.c b/mpi/mpi-pow.c |
|
| 428 |
+index 3d6d68c8..54f477b2 100644 |
|
| 429 |
+--- a/mpi/mpi-pow.c |
|
| 430 |
+@@ -188,10 +188,16 @@ _gcry_mpi_powm (gcry_mpi_t res, |
|
| 431 |
+ mpi_limb_t e; |
|
| 432 |
+ mpi_limb_t carry_limb; |
|
| 433 |
+ struct karatsuba_ctx karactx; |
|
| 434 |
++ struct gcry_mpi w, u; |
|
| 435 |
+ |
|
| 436 |
+ xp_nlimbs = msec? size:0; |
|
| 437 |
+ xp = xp_marker = mpi_alloc_limb_space( size, msec ); |
|
| 438 |
+ |
|
| 439 |
++ w.sign = u.sign = 0; |
|
| 440 |
++ w.flags = u.flags = 0; |
|
| 441 |
++ w.alloced = w.nlimbs = size; /* RES->alloc may be longer. */ |
|
| 442 |
++ u.alloced = u.nlimbs = size; |
|
| 443 |
++ |
|
| 444 |
+ memset( &karactx, 0, sizeof karactx ); |
|
| 445 |
+ negative_result = (ep[0] & 1) && bsign; |
|
| 446 |
+ |
|
| 447 |
+@@ -267,11 +273,11 @@ _gcry_mpi_powm (gcry_mpi_t res, |
|
| 448 |
+ xsize = msize; |
|
| 449 |
+ } |
|
| 450 |
+ } |
|
| 451 |
+- if ( (mpi_limb_signed_t)e < 0 ) |
|
| 452 |
+- {
|
|
| 453 |
+- tp = rp; rp = xp; xp = tp; |
|
| 454 |
+- rsize = xsize; |
|
| 455 |
+- } |
|
| 456 |
++ |
|
| 457 |
++ w.d = rp; |
|
| 458 |
++ u.d = xp; |
|
| 459 |
++ mpi_set_cond (&w, &u, ((mpi_limb_signed_t)e < 0)); |
|
| 460 |
++ |
|
| 461 |
+ e <<= 1; |
|
| 462 |
+ c--; |
|
| 463 |
+ } |
|
| 464 |
+ |
|
| 465 |
+ |
|
| 466 |
+ |
|
| 467 |
+From 61b0f52c1cc85bf8c3cac9aba40e28682e4e1b8b Mon Sep 17 00:00:00 2001 |
|
| 468 |
+From: NIIBE Yutaka <gniibe@fsij.org> |
|
| 469 |
+Date: Fri, 7 Jul 2017 14:48:17 +0900 |
|
| 470 |
+Subject: [PATCH] mpi: Minor fix of mpi_pow. |
|
| 471 |
+ |
|
| 472 |
+* mpi/mpi-pow.c (_gcry_mpi_powm): Allocate size fix. |
|
| 473 |
+ |
|
| 474 |
+-- |
|
| 475 |
+ |
|
| 476 |
+Same thing of 619ebae9847831f43314a95cc3180f4b329b4d3b applied. |
|
| 477 |
+ |
|
| 478 |
+Signed-off-by: NIIBE Yutaka <gniibe@fsij.org> |
|
| 479 |
+--- |
|
| 480 |
+ mpi/mpi-pow.c | 4 ++-- |
|
| 481 |
+ 1 file changed, 2 insertions(+), 2 deletions(-) |
|
| 482 |
+ |
|
| 483 |
+diff --git a/mpi/mpi-pow.c b/mpi/mpi-pow.c |
|
| 484 |
+index 54f477b2..62b4a808 100644 |
|
| 485 |
+--- a/mpi/mpi-pow.c |
|
| 486 |
+@@ -552,8 +552,8 @@ _gcry_mpi_powm (gcry_mpi_t res, |
|
| 487 |
+ struct karatsuba_ctx karactx; |
|
| 488 |
+ mpi_ptr_t tp; |
|
| 489 |
+ |
|
| 490 |
+- xp_nlimbs = msec? (2 * (msize + 1)):0; |
|
| 491 |
+- xp = xp_marker = mpi_alloc_limb_space( 2 * (msize + 1), msec ); |
|
| 492 |
++ xp_nlimbs = msec? size:0; |
|
| 493 |
++ xp = xp_marker = mpi_alloc_limb_space( size, msec ); |
|
| 494 |
+ |
|
| 495 |
+ memset( &karactx, 0, sizeof karactx ); |
|
| 496 |
+ negative_result = (ep[0] & 1) && bsign; |
| ... | ... |
@@ -1,7 +1,7 @@ |
| 1 | 1 |
Summary: Crypto Libraries |
| 2 | 2 |
Name: libgcrypt |
| 3 | 3 |
Version: 1.7.6 |
| 4 |
-Release: 4%{?dist}
|
|
| 4 |
+Release: 5%{?dist}
|
|
| 5 | 5 |
License: GPLv2+ and LGPLv2+ |
| 6 | 6 |
URL: http://www.gnu.org/software/libgcrypt/ |
| 7 | 7 |
Source0: ftp://ftp.gnupg.org/gcrypt/libgcrypt/%{name}-%{version}.tar.bz2
|
| ... | ... |
@@ -9,6 +9,7 @@ Source0: ftp://ftp.gnupg.org/gcrypt/libgcrypt/%{name}-%{version}.tar.bz2
|
| 9 | 9 |
Patch0: CVE-2017-0379.patch |
| 10 | 10 |
Patch1: libgcrypt-CVE-2017-9526.patch |
| 11 | 11 |
Patch2: libgcrypt-CVE-2018-0495.patch |
| 12 |
+Patch3: libgcrypt-CVE-2017-7526.patch |
|
| 12 | 13 |
Group: System Environment/Libraries |
| 13 | 14 |
Vendor: VMware, Inc. |
| 14 | 15 |
BuildRequires: libgpg-error |
| ... | ... |
@@ -33,6 +34,8 @@ that use libgcrypt. |
| 33 | 33 |
%patch0 -p1 |
| 34 | 34 |
%patch1 -p1 |
| 35 | 35 |
%patch2 -p1 |
| 36 |
+%patch3 -p1 |
|
| 37 |
+ |
|
| 36 | 38 |
%build |
| 37 | 39 |
./configure \ |
| 38 | 40 |
--prefix=%{_prefix}
|
| ... | ... |
@@ -46,6 +49,7 @@ rm %{buildroot}%{_infodir}/*
|
| 46 | 46 |
make -k check |& tee %{_specdir}/%{name}-check-log || %{nocheck}
|
| 47 | 47 |
|
| 48 | 48 |
%post -p /sbin/ldconfig |
| 49 |
+ |
|
| 49 | 50 |
%postun -p /sbin/ldconfig |
| 50 | 51 |
|
| 51 | 52 |
%files |
| ... | ... |
@@ -62,6 +66,8 @@ make -k check |& tee %{_specdir}/%{name}-check-log || %{nocheck}
|
| 62 | 62 |
/usr/share/aclocal/libgcrypt.m4 |
| 63 | 63 |
|
| 64 | 64 |
%changelog |
| 65 |
+* Wed Feb 06 2019 Dweep Advani <dadvani@vmware.com> 1.7.6-5 |
|
| 66 |
+- Fixed CVE-2017-7526 |
|
| 65 | 67 |
* Mon Sep 03 2018 Ankit Jain <ankitja@vmware.com> 1.7.6-4 |
| 66 | 68 |
- Fix for CVE-2018-0495 |
| 67 | 69 |
* Thu Oct 19 2017 Xiaolin Li <xiaolinl@vmware.com> 1.7.6-3 |