Package: gnupg / 1.4.18-7+deb8u5

0045-g10-fix-cmp_public_key-and-cmp_secret_keys.patch Patch series | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
From: NIIBE Yutaka <gniibe@fsij.org>
Date: Thu, 30 Apr 2015 17:20:08 +0900
Subject: g10: fix cmp_public_key and cmp_secret_keys.

* g10/free-packet.c (cmp_public_keys, cmp_secret_keys): Compare opaque
data at the first entry of the array when it's unknown algo.
* mpi/mpi-cmp.c (mpi_cmp): Backport libgcrypt 1.5.0's semantics.

--

(backported from 2.0 commit 43429c7869152f301157e4b24790b3801dce0f0a)

GnuPG-bug-id: 1962
---
 g10/free-packet.c | 22 ++++++++++++++--------
 mpi/mpi-cmp.c     | 16 ++++++++++++++++
 2 files changed, 30 insertions(+), 8 deletions(-)

diff --git a/g10/free-packet.c b/g10/free-packet.c
index 0f8e0e8..e772c08 100644
--- a/g10/free-packet.c
+++ b/g10/free-packet.c
@@ -452,11 +452,14 @@ cmp_public_keys( PKT_public_key *a, PKT_public_key *b )
 	return -1;
 
     n = pubkey_get_npkey( b->pubkey_algo );
-    if( !n )
-	return -1; /* can't compare due to unknown algorithm */
-    for(i=0; i < n; i++ ) {
-	if( mpi_cmp( a->pkey[i], b->pkey[i] ) )
+    if( !n ) { /* unknown algorithm, rest is in opaque MPI */
+	if( mpi_cmp( a->pkey[0], b->pkey[0] ) )
 	    return -1;
+    } else {
+	for(i=0; i < n; i++ ) {
+	    if( mpi_cmp( a->pkey[i], b->pkey[i] ) )
+		return -1;
+	}
     }
 
     return 0;
@@ -479,11 +482,14 @@ cmp_secret_keys( PKT_secret_key *a, PKT_secret_key *b )
 	return -1;
 
     n = pubkey_get_npkey( b->pubkey_algo );
-    if( !n )
-	return -1; /* can't compare due to unknown algorithm */
-    for(i=0; i < n; i++ ) {
-	if( mpi_cmp( a->skey[i], b->skey[i] ) )
+    if( !n ) { /* unknown algorithm, rest is in opaque MPI */
+	if( mpi_cmp( a->skey[0], b->skey[0] ) )
 	    return -1;
+    } else {
+	for(i=0; i < n; i++ ) {
+	    if( mpi_cmp( a->skey[i], b->skey[i] ) )
+		return -1;
+	}
     }
 
     return 0;
diff --git a/mpi/mpi-cmp.c b/mpi/mpi-cmp.c
index e119fad..3c1322a 100644
--- a/mpi/mpi-cmp.c
+++ b/mpi/mpi-cmp.c
@@ -20,6 +20,7 @@
 #include <config.h>
 #include <stdio.h>
 #include <stdlib.h>
+#include <string.h>
 #include "mpi-internal.h"
 
 int
@@ -49,6 +50,21 @@ mpi_cmp( MPI u, MPI v )
     mpi_size_t usize, vsize;
     int cmp;
 
+    if (mpi_is_opaque (u) || mpi_is_opaque (v))
+      {
+	if (mpi_is_opaque (u) && !mpi_is_opaque (v))
+	  return -1;
+	if (!mpi_is_opaque (u) && mpi_is_opaque (v))
+	  return 1;
+	if (!u->nbits && !v->nbits)
+	  return 0; /* Empty buffers are identical.  */
+	if (u->nbits < v->nbits)
+	  return -1;
+	if (u->nbits > v->nbits)
+	  return 1;
+	return memcmp (u->d, v->d, u->nbits);
+      }
+
     mpi_normalize( u );
     mpi_normalize( v );
     usize = u->nlimbs;