diff options
-rw-r--r-- | agent/cvt-openpgp.c | 40 |
1 files changed, 25 insertions, 15 deletions
diff --git a/agent/cvt-openpgp.c b/agent/cvt-openpgp.c index 789a50398..cb6c900bd 100644 --- a/agent/cvt-openpgp.c +++ b/agent/cvt-openpgp.c @@ -451,15 +451,16 @@ do_unprotect (const char *passphrase, nbytes = (nbits+7)/8; nbits = nbytes * 8; - if (nbits >= 8 && !(*buffer & 0x80)) - if (--nbits >= 7 && !(*buffer & 0x40)) - if (--nbits >= 6 && !(*buffer & 0x20)) - if (--nbits >= 5 && !(*buffer & 0x10)) - if (--nbits >= 4 && !(*buffer & 0x08)) - if (--nbits >= 3 && !(*buffer & 0x04)) - if (--nbits >= 2 && !(*buffer & 0x02)) - if (--nbits >= 1 && !(*buffer & 0x01)) - --nbits; + if (*buffer) + if (nbits >= 8 && !(*buffer & 0x80)) + if (--nbits >= 7 && !(*buffer & 0x40)) + if (--nbits >= 6 && !(*buffer & 0x20)) + if (--nbits >= 5 && !(*buffer & 0x10)) + if (--nbits >= 4 && !(*buffer & 0x08)) + if (--nbits >= 3 && !(*buffer & 0x04)) + if (--nbits >= 2 && !(*buffer & 0x02)) + if (--nbits >= 1 && !(*buffer & 0x01)) + --nbits; actual_csum += (nbits >> 8); actual_csum += (nbits & 0xff); @@ -882,12 +883,21 @@ convert_from_openpgp_main (ctrl_t ctrl, gcry_sexp_t s_pgp, int dontcare_exist, value = gcry_sexp_nth_data (list, ++idx, &valuelen); if (!value || !valuelen) goto bad_seckey; - skey[skeyidx] = gcry_mpi_set_opaque_copy (NULL, value, valuelen*8); - if (!skey[skeyidx]) - goto outofmem; - if (is_enc) - /* Encrypted parameters need to have a USER1 flag. */ - gcry_mpi_set_flag (skey[skeyidx], GCRYMPI_FLAG_USER1); + if (is_enc || npkey == 1 /* This is ECC */) + { + skey[skeyidx] = gcry_mpi_set_opaque_copy (NULL, value, valuelen*8); + if (!skey[skeyidx]) + goto outofmem; + if (is_enc) + /* Encrypted parameters need to have a USER1 flag. */ + gcry_mpi_set_flag (skey[skeyidx], GCRYMPI_FLAG_USER1); + } + else + { + if (gcry_mpi_scan (skey + skeyidx, GCRYMPI_FMT_STD, + value, valuelen, NULL)) + goto bad_seckey; + } skeyidx++; } skey[skeyidx++] = NULL; |