summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorJinWang An <jinwang.an@samsung.com>2021-12-01 16:54:39 +0900
committerJinWang An <jinwang.an@samsung.com>2021-12-01 16:54:39 +0900
commitd19c360948ede5ffe5974de8abc9da44be617ca1 (patch)
treef77dd8640a12e7e960c3d408f90e08e069ece9f1 /src
parentfc59d1efdca7b2886739948b88a1aa8cd4243146 (diff)
downloadgpgme-d19c360948ede5ffe5974de8abc9da44be617ca1.tar.gz
gpgme-d19c360948ede5ffe5974de8abc9da44be617ca1.tar.bz2
gpgme-d19c360948ede5ffe5974de8abc9da44be617ca1.zip
Imported Upstream version 1.16.0upstream/1.16.0
Diffstat (limited to 'src')
-rw-r--r--src/Makefile.am2
-rw-r--r--src/Makefile.in6
-rw-r--r--src/cJSON.c20
-rw-r--r--src/context.h3
-rw-r--r--src/conversion.c11
-rw-r--r--src/data-identify.c4
-rw-r--r--src/data.c118
-rw-r--r--src/data.h49
-rw-r--r--src/engine-gpg.c39
-rw-r--r--src/export.c1
-rw-r--r--src/gpgme.c12
-rw-r--r--src/gpgme.h.in18
-rw-r--r--src/key.c1
-rw-r--r--src/keylist.c30
-rw-r--r--src/util.h3
15 files changed, 261 insertions, 56 deletions
diff --git a/src/Makefile.am b/src/Makefile.am
index 35add9c..39c341f 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -101,7 +101,7 @@ endif
# We use a global CFLAGS setting for all libraries
# versions, because then every object file is only compiled once.
-AM_CFLAGS = @LIBASSUAN_CFLAGS@ @GLIB_CFLAGS@
+AM_CFLAGS = @LIBASSUAN_CFLAGS@ @GPG_ERROR_CFLAGS@ @GLIB_CFLAGS@
gpgme_tool_SOURCES = gpgme-tool.c argparse.c argparse.h
gpgme_tool_LDADD = libgpgme.la @LIBASSUAN_LIBS@ @GPG_ERROR_LIBS@
diff --git a/src/Makefile.in b/src/Makefile.in
index 8b323ed..65d40af 100644
--- a/src/Makefile.in
+++ b/src/Makefile.in
@@ -1,7 +1,7 @@
-# Makefile.in generated by automake 1.16.1 from Makefile.am.
+# Makefile.in generated by automake 1.16.3 from Makefile.am.
# @configure_input@
-# Copyright (C) 1994-2018 Free Software Foundation, Inc.
+# Copyright (C) 1994-2020 Free Software Foundation, Inc.
# This Makefile.in is free software; the Free Software Foundation
# gives unlimited permission to copy and/or distribute it,
@@ -617,7 +617,7 @@ libgpgme_la_SOURCES = $(main_sources) $(system_components_not_extra)
# We use a global CFLAGS setting for all libraries
# versions, because then every object file is only compiled once.
-AM_CFLAGS = @LIBASSUAN_CFLAGS@ @GLIB_CFLAGS@
+AM_CFLAGS = @LIBASSUAN_CFLAGS@ @GPG_ERROR_CFLAGS@ @GLIB_CFLAGS@
gpgme_tool_SOURCES = gpgme-tool.c argparse.c argparse.h
gpgme_tool_LDADD = libgpgme.la @LIBASSUAN_LIBS@ @GPG_ERROR_LIBS@
gpgme_json_SOURCES = gpgme-json.c cJSON.c cJSON.h
diff --git a/src/cJSON.c b/src/cJSON.c
index 7769b0e..1925a04 100644
--- a/src/cJSON.c
+++ b/src/cJSON.c
@@ -50,21 +50,13 @@
#include "cJSON.h"
+
/* Only use calloc. */
#define CALLOC_ONLY 1
/* Maximum recursion depth */
#define MAX_DEPTH 512
-/* To avoid that a compiler optimizes certain memset calls away, these
- macros may be used instead. */
-#define wipememory2(_ptr,_set,_len) do { \
- volatile char *_vptr=(volatile char *)(_ptr); \
- size_t _vlen=(_len); \
- while(_vlen) { *_vptr=(_set); _vptr++; _vlen--; } \
- } while(0)
-#define wipememory(_ptr,_len) wipememory2(_ptr,0,_len)
-
/* We use malloc function wrappers from gpgrt (aka libgpg-error). */
#include <gpgrt.h>
#define xtrycalloc(a,b) gpgrt_calloc ((a), (b))
@@ -77,6 +69,16 @@
#endif
+static void
+wipememory (void *ptr, size_t len)
+{
+ /* Prevent compiler from optimizing away the call to memset by accessing
+ * memset through volatile pointer. */
+ static void *(*volatile memset_ptr)(void *, int, size_t) = (void *)memset;
+ memset_ptr (ptr, 0, len);
+}
+
+
static int
cJSON_strcasecmp (const char *s1, const char *s2)
{
diff --git a/src/context.h b/src/context.h
index 3ed3818..2792a16 100644
--- a/src/context.h
+++ b/src/context.h
@@ -174,6 +174,9 @@ struct gpgme_context
/* The optional trust-model override. */
char *trust_model;
+ /* The optional expiration date of a certification. */
+ char *cert_expire;
+
/* The operation data hooked into the context. */
ctx_op_data_t op_data;
diff --git a/src/conversion.c b/src/conversion.c
index 1d28096..17dce7f 100644
--- a/src/conversion.c
+++ b/src/conversion.c
@@ -43,6 +43,17 @@
+void
+_gpgme_wipememory (void *ptr, size_t len)
+{
+ /* Prevent compiler from optimizing away the call to memset by accessing
+ * memset through volatile pointer. */
+ static void *(*volatile memset_ptr)(void *, int, size_t) = (void *)memset;
+ memset_ptr (ptr, 0, len);
+}
+
+
+
static char *
do_strconcat (const char *s1, va_list arg_ptr)
{
diff --git a/src/data-identify.c b/src/data-identify.c
index eb65786..8e0295e 100644
--- a/src/data-identify.c
+++ b/src/data-identify.c
@@ -416,8 +416,8 @@ basic_detection (char *data, size_t datalen)
}
else if (ti.length == 11)
{
- if (!memcmp (s, "\x2A\x86\x48\x86\xF7\x0D\x01\x09\x10\x01\x02", 11))
- return GPGME_DATA_TYPE_CMS_OTHER; /* Auth Data. */
+ if (!memcmp (s, "\x2A\x86\x48\x86\xF7\x0D\x01\x09\x10\x01\x17", 11))
+ return GPGME_DATA_TYPE_CMS_ENCRYPTED; /* AuthEnveloped Data. */
}
}
diff --git a/src/data.c b/src/data.c
index 7059590..62b7231 100644
--- a/src/data.c
+++ b/src/data.c
@@ -52,7 +52,7 @@
*/
struct property_s
{
- gpgme_data_t dh; /* The data objcet or NULL if the slot is not used. */
+ gpgme_data_t dh; /* The data object or NULL if the slot is not used. */
uint64_t dserial; /* The serial number of the data object. */
struct {
unsigned int blankout : 1; /* Void the held data. */
@@ -339,6 +339,21 @@ _gpgme_data_release (gpgme_data_t dh)
remove_from_property_table (dh, dh->propidx);
if (dh->file_name)
free (dh->file_name);
+ if (dh->inbound_buffer)
+ {
+ if (dh->sensitive)
+ _gpgme_wipememory (dh->inbound_buffer, dh->io_buffer_size);
+ free (dh->inbound_buffer);
+ }
+ if (dh->outbound_buffer)
+ {
+ if (dh->sensitive)
+ _gpgme_wipememory (dh->outbound_buffer, dh->io_buffer_size);
+ free (dh->outbound_buffer);
+ }
+ if (dh->sensitive)
+ _gpgme_wipememory (dh->outboundspace, BUFFER_SIZE);
+
free (dh);
}
@@ -431,11 +446,11 @@ gpgme_data_seek (gpgme_data_t dh, gpgme_off_t offset, int whence)
/* For relative movement, we must take into account the actual
position of the read counter. */
if (whence == SEEK_CUR)
- offset -= dh->pending_len;
+ offset -= dh->outbound_pending;
offset = (*dh->cbs->seek) (dh, offset, whence);
if (offset >= 0)
- dh->pending_len = 0;
+ dh->outbound_pending = 0;
return TRACE_SYSRES ((int)offset);
}
@@ -555,6 +570,28 @@ gpgme_data_set_flag (gpgme_data_t dh, const char *name, const char *value)
{
dh->size_hint= value? _gpgme_string_to_off (value) : 0;
}
+ else if (!strcmp (name, "io-buffer-size"))
+ {
+ gpgme_off_t val;
+
+ /* We may set this only once. */
+ if (dh->io_buffer_size)
+ return gpg_error (GPG_ERR_CONFLICT);
+
+ val = value? _gpgme_string_to_off (value) : 0;
+ if (val > 1024*1024)
+ val = 1024*1024; /* Cap at 1MiB */
+ else if (val < BUFFER_SIZE)
+ val = 0; /* We can use the default buffer. */
+
+ /* Actual allocation happens as needed but we round it to a
+ * multiple of 1k. */
+ dh->io_buffer_size = ((val + 1023)/1024)*1024;
+ }
+ else if (!strcmp (name, "sensitive"))
+ {
+ dh->sensitive = (value && *value)? !!atoi (value) : 0;
+ }
else
return gpg_error (GPG_ERR_UNKNOWN_NAME);
@@ -569,14 +606,35 @@ gpgme_error_t
_gpgme_data_inbound_handler (void *opaque, int fd)
{
struct io_cb_data *data = (struct io_cb_data *) opaque;
+ gpg_error_t err;
gpgme_data_t dh = (gpgme_data_t) data->handler_value;
- char buffer[BUFFER_SIZE];
- char *bufp = buffer;
+ char bufferspace[BUFFER_SIZE];
+ char *buffer;
+ size_t buffer_size;
+ char *bufp;
gpgme_ssize_t buflen;
TRACE_BEG (DEBUG_CTX, "_gpgme_data_inbound_handler", dh,
"fd=%d", fd);
- buflen = _gpgme_io_read (fd, buffer, BUFFER_SIZE);
+ if (dh->io_buffer_size)
+ {
+ if (!dh->inbound_buffer)
+ {
+ dh->inbound_buffer = malloc (dh->io_buffer_size);
+ if (!dh->inbound_buffer)
+ return TRACE_ERR (gpg_error_from_syserror ());
+ }
+ buffer_size = dh->io_buffer_size;
+ buffer = dh->inbound_buffer;
+ }
+ else
+ {
+ buffer_size = BUFFER_SIZE;
+ buffer = bufferspace;
+ }
+ bufp = buffer;
+
+ buflen = _gpgme_io_read (fd, buffer, buffer_size);
if (buflen < 0)
return gpg_error_from_syserror ();
if (buflen == 0)
@@ -589,12 +647,21 @@ _gpgme_data_inbound_handler (void *opaque, int fd)
{
gpgme_ssize_t amt = gpgme_data_write (dh, bufp, buflen);
if (amt == 0 || (amt < 0 && errno != EINTR))
- return TRACE_ERR (gpg_error_from_syserror ());
+ {
+ err = gpg_error_from_syserror ();
+ goto leave;
+ }
bufp += amt;
buflen -= amt;
}
while (buflen > 0);
- return TRACE_ERR (0);
+ err = 0;
+
+ leave:
+ if (dh->sensitive && buffer == bufferspace)
+ _gpgme_wipememory (bufferspace, BUFFER_SIZE);
+
+ return TRACE_ERR (err);
}
@@ -603,13 +670,34 @@ _gpgme_data_outbound_handler (void *opaque, int fd)
{
struct io_cb_data *data = (struct io_cb_data *) opaque;
gpgme_data_t dh = (gpgme_data_t) data->handler_value;
+ char *buffer;
+ size_t buffer_size;
gpgme_ssize_t nwritten;
TRACE_BEG (DEBUG_CTX, "_gpgme_data_outbound_handler", dh,
"fd=%d", fd);
- if (!dh->pending_len)
+ if (dh->io_buffer_size)
+ {
+ if (!dh->outbound_buffer)
+ {
+ dh->outbound_buffer = malloc (dh->io_buffer_size);
+ if (!dh->outbound_buffer)
+ return TRACE_ERR (gpg_error_from_syserror ());
+ dh->outbound_pending = 0;
+ }
+ buffer_size = dh->io_buffer_size;
+ buffer = dh->outbound_buffer;
+ }
+ else
+ {
+ buffer_size = BUFFER_SIZE;
+ buffer = dh->outboundspace;
+ }
+
+
+ if (!dh->outbound_pending)
{
- gpgme_ssize_t amt = gpgme_data_read (dh, dh->pending, BUFFER_SIZE);
+ gpgme_ssize_t amt = gpgme_data_read (dh, buffer, buffer_size);
if (amt < 0)
return TRACE_ERR (gpg_error_from_syserror ());
if (amt == 0)
@@ -617,10 +705,10 @@ _gpgme_data_outbound_handler (void *opaque, int fd)
_gpgme_io_close (fd);
return TRACE_ERR (0);
}
- dh->pending_len = amt;
+ dh->outbound_pending = amt;
}
- nwritten = _gpgme_io_write (fd, dh->pending, dh->pending_len);
+ nwritten = _gpgme_io_write (fd, buffer, dh->outbound_pending);
if (nwritten == -1 && errno == EAGAIN)
return TRACE_ERR (0);
@@ -637,9 +725,9 @@ _gpgme_data_outbound_handler (void *opaque, int fd)
if (nwritten <= 0)
return TRACE_ERR (gpg_error_from_syserror ());
- if (nwritten < dh->pending_len)
- memmove (dh->pending, dh->pending + nwritten, dh->pending_len - nwritten);
- dh->pending_len -= nwritten;
+ if (nwritten < dh->outbound_pending)
+ memmove (buffer, buffer + nwritten, dh->outbound_pending - nwritten);
+ dh->outbound_pending -= nwritten;
return TRACE_ERR (0);
}
diff --git a/src/data.h b/src/data.h
index 481a245..648d976 100644
--- a/src/data.h
+++ b/src/data.h
@@ -33,6 +33,22 @@
#include "gpgme.h"
+/* Figure out the standard size for internal data buffers. */
+#ifdef PIPE_BUF
+# define BUFFER_SIZE PIPE_BUF
+#else
+# ifdef _POSIX_PIPE_BUF
+# define BUFFER_SIZE _POSIX_PIPE_BUF
+# else
+# ifdef HAVE_W32_SYSTEM
+# define BUFFER_SIZE 4096
+# else
+# define BUFFER_SIZE 512
+# endif
+# endif
+#endif
+
+
/* Read up to SIZE bytes into buffer BUFFER from the data object with
the handle DH. Return the number of characters read, 0 on EOF and
@@ -76,24 +92,33 @@ struct gpgme_data
gpgme_data_encoding_t encoding;
unsigned int propidx; /* Index into the property table. */
-#ifdef PIPE_BUF
-#define BUFFER_SIZE PIPE_BUF
-#else
-#ifdef _POSIX_PIPE_BUF
-#define BUFFER_SIZE _POSIX_PIPE_BUF
-#else
-#define BUFFER_SIZE 512
-#endif
-#endif
- char pending[BUFFER_SIZE];
- int pending_len;
-
/* File name of the data object. */
char *file_name;
/* Hint on the to be expected total size of the data. */
gpgme_off_t size_hint;
+ /* If no 0 the size of an allocated inbound or outpund buffers. The
+ * value is at least BUFFER_SIZE and capped at 1MiB. */
+ unsigned int io_buffer_size;
+
+ /* If not NULL a malloced buffer used for inbound data used instead
+ * of the handler's static buffer. Its size is io_buffer_size. */
+ char *inbound_buffer;
+
+ /* A default memory space for the outbound handler and the number of
+ * actual pending bytes. If outbound_buffer is not NULL, this is a
+ * malloced buffer used instead of the outboundspace. Its malloced
+ * size is io_buffer_size. */
+ char outboundspace[BUFFER_SIZE];
+ unsigned int outbound_pending;
+ char *outbound_buffer;
+
+ /* If set sensitive data is conveyed via the internal buffer. This
+ * flags overwrites the memory of the buffers with zero before they
+ * are released. */
+ unsigned int sensitive:1;
+
union
{
/* For gpgme_data_new_from_fd. */
diff --git a/src/engine-gpg.c b/src/engine-gpg.c
index 9a9a26e..b51ea17 100644
--- a/src/engine-gpg.c
+++ b/src/engine-gpg.c
@@ -1961,6 +1961,27 @@ append_args_from_sig_notations (engine_gpg_t gpg, gpgme_ctx_t ctx /* FIXME */,
static gpgme_error_t
+append_args_from_cert_expire (engine_gpg_t gpg, gpgme_ctx_t ctx)
+{
+ gpgme_error_t err;
+
+ if (ctx->cert_expire)
+ {
+ /* Override ask-cert-expire set in the configuration, so that the specified
+ * default is actually used. */
+ err = add_arg (gpg, "--no-ask-cert-expire");
+ if (!err)
+ err = add_arg (gpg, "--default-cert-expire");
+ if (!err)
+ err = add_arg (gpg, ctx->cert_expire);
+ }
+ else
+ err = 0;
+ return err;
+}
+
+
+static gpgme_error_t
gpg_edit (void *engine, int type, gpgme_key_t key, gpgme_data_t out,
gpgme_ctx_t ctx /* FIXME */)
{
@@ -1976,6 +1997,8 @@ gpg_edit (void *engine, int type, gpgme_key_t key, gpgme_data_t out,
if (!err)
err = append_args_from_sig_notations (gpg, ctx, NOTATION_FLAG_CERT);
if (!err)
+ err = append_args_from_cert_expire (gpg, ctx);
+ if (!err)
err = add_arg (gpg, type == 0 ? "--edit-key" : "--card-edit");
if (!err)
err = add_data (gpg, out, 1, 1);
@@ -2336,13 +2359,8 @@ export_common (engine_gpg_t gpg, gpgme_export_mode_t mode,
if ((mode & GPGME_EXPORT_MODE_MINIMAL))
{
- if ((mode & GPGME_EXPORT_MODE_NOUID))
- err = add_arg (gpg, "--export-options=export-minimal,export-drop-uids");
- else
- err = add_arg (gpg, "--export-options=export-minimal");
+ err = add_arg (gpg, "--export-options=export-minimal");
}
- else if ((mode & GPGME_EXPORT_MODE_NOUID))
- err = add_arg (gpg, "--export-options=export-drop-uids");
if (err)
;
@@ -2358,8 +2376,6 @@ export_common (engine_gpg_t gpg, gpgme_export_mode_t mode,
else if ((mode & GPGME_EXPORT_MODE_EXTERN))
{
err = add_arg (gpg, "--send-keys");
- if (!err && (mode & GPGME_EXPORT_MODE_NOUID))
- err = add_arg (gpg, "--keyserver-options=export-drop-uids");
}
else
{
@@ -3171,6 +3187,13 @@ gpg_keysign (void *engine, gpgme_key_t key, const char *userid,
else
err = add_arg (gpg, "--quick-sign-key");
+ /* The force flag as only an effect with recent gpg versions; if the
+ * gpg version is too old, the signature will simply not be created.
+ * I think this is better than bailing out. */
+ if (!err && (flags & GPGME_KEYSIGN_FORCE)
+ && have_gpg_version (gpg, "2.2.28"))
+ err = add_arg (gpg, "--force-sign-key");
+
if (!err)
err = append_args_from_signers (gpg, ctx);
diff --git a/src/export.c b/src/export.c
index 879a54f..4cee0ef 100644
--- a/src/export.c
+++ b/src/export.c
@@ -129,7 +129,6 @@ export_start (gpgme_ctx_t ctx, int synchronous, const char *pattern,
|GPGME_EXPORT_MODE_SECRET
|GPGME_EXPORT_MODE_SSH
|GPGME_EXPORT_MODE_RAW
- |GPGME_EXPORT_MODE_NOUID
|GPGME_EXPORT_MODE_PKCS12)))
return gpg_error (GPG_ERR_INV_VALUE); /* Invalid flags in MODE. */
diff --git a/src/gpgme.c b/src/gpgme.c
index 8bc11d5..255d116 100644
--- a/src/gpgme.c
+++ b/src/gpgme.c
@@ -253,6 +253,7 @@ gpgme_release (gpgme_ctx_t ctx)
free (ctx->request_origin);
free (ctx->auto_key_locate);
free (ctx->trust_model);
+ free (ctx->cert_expire);
_gpgme_engine_info_release (ctx->engine_info);
ctx->engine_info = NULL;
DESTROY_LOCK (ctx->lock);
@@ -578,6 +579,13 @@ gpgme_set_ctx_flag (gpgme_ctx_t ctx, const char *name, const char *value)
{
ctx->extended_edit = abool;
}
+ else if (!strcmp (name, "cert-expire"))
+ {
+ free (ctx->cert_expire);
+ ctx->cert_expire = strdup (value);
+ if (!ctx->cert_expire)
+ err = gpg_error_from_syserror ();
+ }
else
err = gpg_error (GPG_ERR_UNKNOWN_NAME);
@@ -647,6 +655,10 @@ gpgme_get_ctx_flag (gpgme_ctx_t ctx, const char *name)
{
return ctx->extended_edit ? "1":"";
}
+ else if (!strcmp (name, "cert-expire"))
+ {
+ return ctx->cert_expire? ctx->cert_expire : "";
+ }
else
return NULL;
}
diff --git a/src/gpgme.h.in b/src/gpgme.h.in
index 1defa4d..5c74afd 100644
--- a/src/gpgme.h.in
+++ b/src/gpgme.h.in
@@ -406,7 +406,6 @@ gpgme_pinentry_mode_t;
#define GPGME_EXPORT_MODE_SECRET 16
#define GPGME_EXPORT_MODE_RAW 32
#define GPGME_EXPORT_MODE_PKCS12 64
-#define GPGME_EXPORT_MODE_NOUID 128 /* Experimental(!)*/
#define GPGME_EXPORT_MODE_SSH 256
typedef unsigned int gpgme_export_mode_t;
@@ -628,7 +627,13 @@ struct _gpgme_key_sig
unsigned int exportable : 1;
/* Internal to GPGME, do not use. */
- unsigned int _unused : 28;
+ unsigned int _unused : 12;
+
+ /* The depth of a trust signature, 0 if no trust signature. */
+ unsigned int trust_depth : 8;
+
+ /* The trust value of a trust signature, 0 if no trust signature. */
+ unsigned int trust_value : 8;
/* The public key algorithm used to create the signature. */
gpgme_pubkey_algo_t pubkey_algo;
@@ -675,6 +680,9 @@ struct _gpgme_key_sig
/* Internal to GPGME, do not use. */
gpgme_sig_notation_t _last_notation;
+
+ /* The scope of a trust signature. Might be NULL. */
+ char *trust_scope;
};
typedef struct _gpgme_key_sig *gpgme_key_sig_t;
@@ -1906,6 +1914,7 @@ gpgme_error_t gpgme_op_delete_ext (gpgme_ctx_t ctx, const gpgme_key_t key,
#define GPGME_KEYSIGN_LOCAL (1 << 7) /* Create a local signature. */
#define GPGME_KEYSIGN_LFSEP (1 << 8) /* Indicate LF separated user ids. */
#define GPGME_KEYSIGN_NOEXPIRE (1 << 9) /* Force no expiration. */
+#define GPGME_KEYSIGN_FORCE (1 << 10) /* Force creation. */
/* Sign the USERID of KEY using the current set of signers. */
@@ -2463,6 +2472,11 @@ char *gpgme_addrspec_from_uid (const char *uid);
* Deprecated types, constants and functions.
*/
+/* This is a former experimental only features. The constant is
+ * provided to not break existing code in the compiler phase. */
+#define GPGME_EXPORT_MODE_NOUID 128 /* Do not use! */
+
+
/* The possible stati for gpgme_op_edit. The use of that function and
* these status codes are deprecated in favor of gpgme_op_interact. */
typedef enum
diff --git a/src/key.c b/src/key.c
index e4b8577..322bd0a 100644
--- a/src/key.c
+++ b/src/key.c
@@ -369,6 +369,7 @@ gpgme_key_unref (gpgme_key_t key)
notation = next_notation;
}
+ free (keysig->trust_scope);
free (keysig);
keysig = next_keysig;
}
diff --git a/src/keylist.c b/src/keylist.c
index a4de3ad..f2c90d2 100644
--- a/src/keylist.c
+++ b/src/keylist.c
@@ -734,7 +734,7 @@ keylist_colon_handler (void *priv, char *line)
}
/* Field 18 has the compliance flags. */
- if (fields >= 17 && *field[17])
+ if (fields >= 18 && *field[17])
PARSE_COMPLIANCE_FLAGS (field[17], subkey);
if (fields >= 20)
@@ -817,7 +817,7 @@ keylist_colon_handler (void *priv, char *line)
}
/* Field 18 has the compliance flags. */
- if (fields >= 17 && *field[17])
+ if (fields >= 18 && *field[17])
PARSE_COMPLIANCE_FLAGS (field[17], subkey);
break;
@@ -967,6 +967,30 @@ keylist_colon_handler (void *priv, char *line)
if (fields >= 7)
keysig->expires = _gpgme_parse_timestamp (field[6], NULL);
+ /* Field 8 has the trust depth and the trust value. */
+ if (fields >= 8 && *field[7])
+ {
+ const char *trust_depth = field[7];
+ char *trust_value = strchr (field[7] + 1, ' ');
+ if (trust_value)
+ *(trust_value++) = '\0';
+ if (trust_value)
+ {
+ int depth = atoi (trust_depth);
+ int value = atoi (trust_value);
+
+ if (depth >= 1 && depth < 256)
+ keysig->trust_depth = depth;
+ if (value >= 1 && value < 256)
+ keysig->trust_value = value;
+ }
+ }
+
+ /* Field 9 has the trust signature scope (a regular expression). */
+ if (fields >= 9)
+ if (_gpgme_decode_c_string (field[8], &keysig->trust_scope, 0))
+ return gpg_error (GPG_ERR_ENOMEM); /* FIXME */
+
/* Field 11 has the signature class (eg, 0x30 means revoked). */
if (fields >= 11)
if (field[10][0] && field[10][1])
@@ -991,7 +1015,7 @@ keylist_colon_handler (void *priv, char *line)
return 0;
assert (opd->tmp_keysig == key->_last_uid->_last_keysig);
- if (fields >= 4)
+ if (fields >= 5)
{
/* Field 2 has the subpacket type. */
int type = atoi (field[1]);
diff --git a/src/util.h b/src/util.h
index bc78c9b..8907584 100644
--- a/src/util.h
+++ b/src/util.h
@@ -96,6 +96,9 @@ int _gpgme_ttyname_r (int fd, char *buf, size_t buflen);
/*-- conversion.c --*/
+/* Make sure to to erase the memory (PTR,LEN). */
+void _gpgme_wipememory (void *ptr, size_t len);
+
/* Concatenate the string S1 with all the following strings up to a
NULL. Returns a malloced buffer with the new string or NULL on a
malloc error or if too many arguments are given. */