Browse code

libgcrypt: Fix for CVE-2017-7526

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>

dweepadvani authored on 2019/02/07 05:02:29
Showing 2 changed files
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