diff options
author | NIIBE Yutaka <[email protected]> | 2019-11-22 05:57:57 +0000 |
---|---|---|
committer | NIIBE Yutaka <[email protected]> | 2020-05-04 01:57:08 +0000 |
commit | b73fef03769f2608b8b3762cec5a44d206589ec6 (patch) | |
tree | d962058433b702505093d085f993025cdf5c476b | |
parent | gpg: Use opaque MPI for ECDH. (diff) | |
download | gnupg-b73fef03769f2608b8b3762cec5a44d206589ec6.tar.gz gnupg-b73fef03769f2608b8b3762cec5a44d206589ec6.zip |
gpg: Implement the fix-up of zero for SOS.
Signed-off-by: NIIBE Yutaka <[email protected]>
-rw-r--r-- | g10/pkglue.c | 23 |
1 files changed, 23 insertions, 0 deletions
diff --git a/g10/pkglue.c b/g10/pkglue.c index 339db67f3..0d18cb931 100644 --- a/g10/pkglue.c +++ b/g10/pkglue.c @@ -152,6 +152,7 @@ pk_verify (pubkey_algo_t pkalgo, gcry_mpi_t hash, gcry_mpi_t s = data[1]; size_t rlen, slen, n; /* (bytes) */ char buf[64]; + unsigned int nbits; log_assert (neededfixedlen <= sizeof buf); @@ -182,6 +183,17 @@ pk_verify (pubkey_algo_t pkalgo, gcry_mpi_t hash, memset (buf, 0, neededfixedlen - n); r = gcry_mpi_set_opaque_copy (NULL, buf, neededfixedlen * 8); } + else if (rlen < neededfixedlen + && gcry_mpi_get_flag (r, GCRYMPI_FLAG_OPAQUE)) + { + const unsigned char *p; + + p = gcry_mpi_get_opaque (r, &nbits); + n = (nbits+7)/8; + memcpy (buf + (neededfixedlen - n), p, n); + memset (buf, 0, neededfixedlen - n); + gcry_mpi_set_opaque_copy (r, buf, neededfixedlen * 8); + } if (slen < neededfixedlen && !gcry_mpi_get_flag (s, GCRYMPI_FLAG_OPAQUE) && !(rc=gcry_mpi_print (GCRYMPI_FMT_USG, buf, sizeof buf, &n, s))) @@ -191,6 +203,17 @@ pk_verify (pubkey_algo_t pkalgo, gcry_mpi_t hash, memset (buf, 0, neededfixedlen - n); s = gcry_mpi_set_opaque_copy (NULL, buf, neededfixedlen * 8); } + else if (slen < neededfixedlen + && gcry_mpi_get_flag (s, GCRYMPI_FLAG_OPAQUE)) + { + const unsigned char *p; + + p = gcry_mpi_get_opaque (s, &nbits); + n = (nbits+7)/8; + memcpy (buf + (neededfixedlen - n), p, n); + memset (buf, 0, neededfixedlen - n); + gcry_mpi_set_opaque_copy (s, buf, neededfixedlen * 8); + } if (!rc) rc = gcry_sexp_build (&s_sig, NULL, |