aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorNIIBE Yutaka <gniibe@fsij.org>2020-11-09 11:01:21 +0900
committerNIIBE Yutaka <gniibe@fsij.org>2020-11-09 11:04:22 +0900
commitba4f68416742eb241ec5490d16f88b0eb0bdc811 (patch)
tree9d0b67827853959f3129b64633592cb02ea3871f
parentc896112fa3f7f3289b5198bfac992160feb0ad0a (diff)
downloadgnupg-ba4f68416742eb241ec5490d16f88b0eb0bdc811.tar.gz
agent: Fix SOS handling with libgcrypt 1.8.
* agent/cvt-openpgp.c (apply_protection): Handle opaque MPI. -- GnuPG-bug-id: 5116 Signed-off-by: NIIBE Yutaka <gniibe@fsij.org>
-rw-r--r--agent/cvt-openpgp.c21
1 files changed, 19 insertions, 2 deletions
diff --git a/agent/cvt-openpgp.c b/agent/cvt-openpgp.c
index c43809f90..3da553f95 100644
--- a/agent/cvt-openpgp.c
+++ b/agent/cvt-openpgp.c
@@ -1159,14 +1159,31 @@ apply_protection (gcry_mpi_t *array, int npkey, int nskey,
ndata = 20; /* Space for the SHA-1 checksum. */
for (i = npkey, j = 0; i < nskey; i++, j++ )
{
- err = gcry_mpi_aprint (GCRYMPI_FMT_USG, bufarr+j, narr+j, array[i]);
+ if (gcry_mpi_get_flag (array[i], GCRYMPI_FLAG_OPAQUE))
+ {
+ p = gcry_mpi_get_opaque (array[i], &nbits[j]);
+ narr[j] = (nbits[j] + 7)/8;
+ data = xtrymalloc_secure (narr[j]);
+ if (!data)
+ err = gpg_error_from_syserror ();
+ else
+ {
+ memcpy (data, p, narr[j]);
+ bufarr[j] = data;
+ err = 0;
+ }
+ }
+ else
+ {
+ err = gcry_mpi_aprint (GCRYMPI_FMT_USG, bufarr+j, narr+j, array[i]);
+ nbits[j] = gcry_mpi_get_nbits (array[i]);
+ }
if (err)
{
for (i = 0; i < j; i++)
xfree (bufarr[i]);
return err;
}
- nbits[j] = gcry_mpi_get_nbits (array[i]);
ndata += 2 + narr[j];
}