mirror of
git://git.gnupg.org/gnupg.git
synced 2024-12-22 10:19:57 +01:00
command-ssh.c: Fix saving of RSA keys (meaning of p/q/u was borked);
correctly use secure memory for message requests.
This commit is contained in:
parent
c8fdb50dfb
commit
fbf6eb0ada
@ -96,6 +96,21 @@ typedef struct ssh_key_type_spec
|
|||||||
|
|
||||||
static uint32_t lifetime_default;
|
static uint32_t lifetime_default;
|
||||||
|
|
||||||
|
/* General utility functions. */
|
||||||
|
|
||||||
|
static void *
|
||||||
|
realloc_secure (void *a, size_t n)
|
||||||
|
{
|
||||||
|
void *p;
|
||||||
|
|
||||||
|
if (a)
|
||||||
|
p = gcry_realloc (a, n);
|
||||||
|
else
|
||||||
|
p = gcry_malloc_secure (n);
|
||||||
|
|
||||||
|
return p;
|
||||||
|
}
|
||||||
|
|
||||||
/* Primitive I/O functions. */
|
/* Primitive I/O functions. */
|
||||||
|
|
||||||
static gpg_error_t
|
static gpg_error_t
|
||||||
@ -532,14 +547,14 @@ ssh_key_modifier_rsa (const char *elems, gcry_mpi_t *mpis)
|
|||||||
/* Modifying only necessary for secret keys. */
|
/* Modifying only necessary for secret keys. */
|
||||||
goto out;
|
goto out;
|
||||||
|
|
||||||
|
u = mpis[3];
|
||||||
p = mpis[4];
|
p = mpis[4];
|
||||||
q = mpis[5];
|
q = mpis[5];
|
||||||
u = mpis[3];
|
|
||||||
|
|
||||||
if (gcry_mpi_cmp (p, q))
|
if (gcry_mpi_cmp (p, q) > 0)
|
||||||
{
|
{
|
||||||
/* P shall be smaller then Q! Swap primes. iqmp becomes u. */
|
/* P shall be smaller then Q! Swap primes. iqmp becomes u. */
|
||||||
gcry_mpi_t tmp = NULL;
|
gcry_mpi_t tmp;
|
||||||
|
|
||||||
tmp = mpis[4];
|
tmp = mpis[4];
|
||||||
mpis[4] = mpis[5];
|
mpis[4] = mpis[5];
|
||||||
@ -656,6 +671,7 @@ ssh_sexp_construct (gcry_sexp_t *sexp,
|
|||||||
const char *elems;
|
const char *elems;
|
||||||
size_t elems_n;
|
size_t elems_n;
|
||||||
unsigned int i;
|
unsigned int i;
|
||||||
|
unsigned int j;
|
||||||
void **arg_list;
|
void **arg_list;
|
||||||
|
|
||||||
err = 0;
|
err = 0;
|
||||||
@ -687,7 +703,15 @@ ssh_sexp_construct (gcry_sexp_t *sexp,
|
|||||||
for (i = 0; i < elems_n; i++)
|
for (i = 0; i < elems_n; i++)
|
||||||
{
|
{
|
||||||
sprintf (strchr (sexp_template, 0), "(%c %%m)", elems[i]);
|
sprintf (strchr (sexp_template, 0), "(%c %%m)", elems[i]);
|
||||||
arg_list[i] = &mpis[i];
|
if (secret)
|
||||||
|
{
|
||||||
|
for (j = 0; j < elems_n; j++)
|
||||||
|
if (key_spec.elems_key_secret[j] == elems[i])
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
j = i;
|
||||||
|
arg_list[i] = &mpis[j];
|
||||||
}
|
}
|
||||||
arg_list[i] = &comment;
|
arg_list[i] = &comment;
|
||||||
sprintf (strchr (sexp_template, 0), ") (comment %%s))");
|
sprintf (strchr (sexp_template, 0), ") (comment %%s))");
|
||||||
@ -2230,7 +2254,8 @@ start_command_handler_ssh (int sock_client)
|
|||||||
log_debug ("[ssh-agent] Received request of length: %u\n",
|
log_debug ("[ssh-agent] Received request of length: %u\n",
|
||||||
request_size);
|
request_size);
|
||||||
|
|
||||||
stream_request = es_mopen (NULL, 0, 0, 1, NULL, NULL, "r+");
|
stream_request = es_mopen (NULL, 0, 0, 1,
|
||||||
|
realloc_secure, gcry_free, "r+");
|
||||||
if (! stream_request)
|
if (! stream_request)
|
||||||
{
|
{
|
||||||
err = gpg_error_from_errno (errno);
|
err = gpg_error_from_errno (errno);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user