diff options
author | NIIBE Yutaka <gniibe@fsij.org> | 2020-11-09 11:01:21 +0900 |
---|---|---|
committer | NIIBE Yutaka <gniibe@fsij.org> | 2020-11-09 11:04:22 +0900 |
commit | ba4f68416742eb241ec5490d16f88b0eb0bdc811 (patch) | |
tree | 9d0b67827853959f3129b64633592cb02ea3871f | |
parent | c896112fa3f7f3289b5198bfac992160feb0ad0a (diff) | |
download | gnupg-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.c | 21 |
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]; } |