gpa: Add patches to fix card key generation.
[gpg4win.git] / patches / gpa-0.9.4 / 02-cms-detection.patch
1 #! /bin/sh
2 patch -p1 -l -f $* < $0
3 exit $?
4
5 From 3a8458ae7c083fd46e8d5e165997422a35bdd21f Mon Sep 17 00:00:00 2001
6 From: Werner Koch <wk@gnupg.org>
7 Date: Fri, 9 Aug 2013 19:46:10 +0200
8 Subject: [PATCH 1/2] Improve detection of CMS objects.
9
10 * configure.ac: Detect gpgme_data_identify.
11 * src/filetype.c (is_cms_data, is_cms_file): Use gpgme_data_identify
12 is available.
13 --
14
15 The gpgme_data_identify function has the advantage that it also
16 detects X.509 certificates.  This offers way to detect certificate
17 files and import them.  As of now the import function does only work
18 with PGP.
19 ---
20  configure.ac   |    9 +++++++++
21  src/filetype.c |   54 +++++++++++++++++++++++++++++++++++++++++++++++++++++-
22  2 files changed, 62 insertions(+), 1 deletions(-)
23
24 diff --git a/configure.ac b/configure.ac
25 index 57d677f..9f5213d 100644
26 --- a/configure.ac
27 +++ b/configure.ac
28 @@ -244,6 +244,15 @@ else
29                  have_gpgme=yes,have_gpgme=no)
30  fi
31
32 +_save_libs=$LIBS
33 +_save_cflags=$CFLAGS
34 +LIBS="$LIBS $GPGME_LIBS"
35 +CFLAGS="$CFLAGS $GPGME_CFLAGS"
36 +AC_CHECK_FUNCS([gpgme_data_identify])
37 +LIBS=$_save_libs
38 +CFLAGS="$_save_cflags"
39 +
40 +
41  dnl The tests below are not anymore used because we now depend on a
42  dnl gpgme which has all these features.  However, I keep the code here
43  dnl for future work.
44 diff --git a/src/filetype.c b/src/filetype.c
45 index c59dde7..4e68d27 100644
46 --- a/src/filetype.c
47 +++ b/src/filetype.c
48 @@ -22,6 +22,7 @@
49  #include <stdio.h>
50  #include <stdlib.h>
51  #include <string.h>
52 +#include <gpgme.h>
53
54  #include "parsetlv.h"
55  #include "filetype.h"
56 @@ -32,6 +33,7 @@
57
58
59  /* Warning: DATA may be binary but there must be a Nul before DATALEN.  */
60 +#ifndef HAVE_GPGME_DATA_IDENTIFY
61  static int
62  detect_cms (const char *data, size_t datalen)
63  {
64 @@ -90,6 +92,7 @@ detect_cms (const char *data, size_t datalen)
65
66    return 0;
67  }
68 +#endif /*!HAVE_GPGME_DATA_IDENTIFY*/
69
70
71  /* Return true if the file FNAME looks like an CMS file.  There is no
72 @@ -98,6 +101,34 @@ detect_cms (const char *data, size_t datalen)
73  int
74  is_cms_file (const char *fname)
75  {
76 +#ifdef HAVE_GPGME_DATA_IDENTIFY
77 +  FILE *fp;
78 +  gpgme_data_t dh;
79 +  gpgme_data_type_t dt;
80 +
81 +  fp = fopen (fname, "rb");
82 +  if (!fp)
83 +    return 0; /* Not found - can't be a CMS file.  */
84 +  if (gpgme_data_new_from_stream (&dh, fp))
85 +    {
86 +      fclose (fp);
87 +      return 0;
88 +    }
89 +  dt = gpgme_data_identify (dh, 0);
90 +  gpgme_data_release (dh);
91 +  fclose (fp);
92 +  switch (dt)
93 +    {
94 +    case GPGME_DATA_TYPE_CMS_SIGNED:
95 +    case GPGME_DATA_TYPE_CMS_ENCRYPTED:
96 +    case GPGME_DATA_TYPE_CMS_OTHER:
97 +    case GPGME_DATA_TYPE_X509_CERT:
98 +    case GPGME_DATA_TYPE_PKCS12:
99 +      return 1;
100 +    default:
101 +      return 0;
102 +    }
103 +#else
104    int result;
105    FILE *fp;
106    char *data;
107 @@ -121,6 +152,7 @@ is_cms_file (const char *fname)
108    result = detect_cms (data, datalen);
109    free (data);
110    return result;
111 +#endif
112  }
113
114
115 @@ -129,9 +161,28 @@ is_cms_file (const char *fname)
116  int
117  is_cms_data (const char *data, size_t datalen)
118  {
119 +#ifdef HAVE_GPGME_DATA_IDENTIFY
120 +  gpgme_data_t dh;
121 +  gpgme_data_type_t dt;
122 +
123 +  if (gpgme_data_new_from_mem (&dh, data, datalen, 0))
124 +    return 0;
125 +  dt = gpgme_data_identify (dh, 0);
126 +  gpgme_data_release (dh);
127 +  switch (dt)
128 +    {
129 +    case GPGME_DATA_TYPE_CMS_SIGNED:
130 +    case GPGME_DATA_TYPE_CMS_ENCRYPTED:
131 +    case GPGME_DATA_TYPE_CMS_OTHER:
132 +    case GPGME_DATA_TYPE_X509_CERT:
133 +    case GPGME_DATA_TYPE_PKCS12:
134 +      return 1;
135 +    default:
136 +      return 0;
137 +    }
138 +#else
139    int result;
140    char *buffer;
141 -
142    if (datalen < 24)
143      return 0; /* Too short - don't bother to copy the buffer.  */
144
145 @@ -147,4 +198,5 @@ is_cms_data (const char *data, size_t datalen)
146    result = detect_cms (buffer, datalen);
147    free (buffer);
148    return result;
149 +#endif
150  }
151 --
152 1.7.7.1