mirror of
git://git.gnupg.org/gnupg.git
synced 2025-07-02 22:46:30 +02:00
g10,scd: Fix ECC keygen.
* g10/keygen.c (generate_keypair): For card key generation, fill parameters by KEY-ATTR. * scd/app-openpgp.c (ecc_read_pubkey): OID should be freed at last, after its reference by OIDBUF is finished. (ecc_writekey): Likewise. -- Signed-off-by: NIIBE Yutaka <gniibe@fsij.org>
This commit is contained in:
parent
693e657ff0
commit
d2653b1a6d
3 changed files with 70 additions and 21 deletions
60
g10/keygen.c
60
g10/keygen.c
|
@ -3756,17 +3756,26 @@ generate_keypair (ctrl_t ctrl, int full, const char *fname,
|
|||
if (card_serialno)
|
||||
{
|
||||
#ifdef ENABLE_CARD_SUPPORT
|
||||
gpg_error_t err;
|
||||
struct agent_card_info_s info;
|
||||
|
||||
memset (&info, 0, sizeof (info));
|
||||
err = agent_scd_getattr ("KEY-ATTR", &info);
|
||||
if (err)
|
||||
{
|
||||
log_error (_("error getting current key info: %s\n"), gpg_strerror (err));
|
||||
return;
|
||||
}
|
||||
|
||||
r = xcalloc (1, sizeof *r + strlen (card_serialno) );
|
||||
r->key = pSERIALNO;
|
||||
strcpy( r->u.value, card_serialno);
|
||||
r->next = para;
|
||||
para = r;
|
||||
|
||||
algo = PUBKEY_ALGO_RSA;
|
||||
|
||||
r = xcalloc (1, sizeof *r + 20 );
|
||||
r->key = pKEYTYPE;
|
||||
sprintf( r->u.value, "%d", algo );
|
||||
sprintf( r->u.value, "%d", info.key_attr[0].algo );
|
||||
r->next = para;
|
||||
para = r;
|
||||
r = xcalloc (1, sizeof *r + 20 );
|
||||
|
@ -3774,10 +3783,28 @@ generate_keypair (ctrl_t ctrl, int full, const char *fname,
|
|||
strcpy (r->u.value, "sign");
|
||||
r->next = para;
|
||||
para = r;
|
||||
if (info.key_attr[0].algo == PUBKEY_ALGO_RSA)
|
||||
{
|
||||
r = xcalloc (1, sizeof *r + 20 );
|
||||
r->key = pKEYLENGTH;
|
||||
sprintf( r->u.value, "%u", info.key_attr[0].nbits);
|
||||
r->next = para;
|
||||
para = r;
|
||||
}
|
||||
else if (info.key_attr[0].algo == PUBKEY_ALGO_ECDSA
|
||||
|| info.key_attr[0].algo == PUBKEY_ALGO_EDDSA
|
||||
|| info.key_attr[0].algo == PUBKEY_ALGO_ECDH)
|
||||
{
|
||||
r = xcalloc (1, sizeof *r + strlen (info.key_attr[0].curve));
|
||||
r->key = pKEYCURVE;
|
||||
strcpy (r->u.value, info.key_attr[0].curve);
|
||||
r->next = para;
|
||||
para = r;
|
||||
}
|
||||
|
||||
r = xcalloc (1, sizeof *r + 20 );
|
||||
r->key = pSUBKEYTYPE;
|
||||
sprintf( r->u.value, "%d", algo );
|
||||
sprintf( r->u.value, "%d", info.key_attr[1].algo );
|
||||
r->next = para;
|
||||
para = r;
|
||||
r = xcalloc (1, sizeof *r + 20 );
|
||||
|
@ -3785,10 +3812,28 @@ generate_keypair (ctrl_t ctrl, int full, const char *fname,
|
|||
strcpy (r->u.value, "encrypt");
|
||||
r->next = para;
|
||||
para = r;
|
||||
if (info.key_attr[1].algo == PUBKEY_ALGO_RSA)
|
||||
{
|
||||
r = xcalloc (1, sizeof *r + 20 );
|
||||
r->key = pSUBKEYLENGTH;
|
||||
sprintf( r->u.value, "%u", info.key_attr[1].nbits);
|
||||
r->next = para;
|
||||
para = r;
|
||||
}
|
||||
else if (info.key_attr[1].algo == PUBKEY_ALGO_ECDSA
|
||||
|| info.key_attr[1].algo == PUBKEY_ALGO_EDDSA
|
||||
|| info.key_attr[1].algo == PUBKEY_ALGO_ECDH)
|
||||
{
|
||||
r = xcalloc (1, sizeof *r + strlen (info.key_attr[1].curve));
|
||||
r->key = pSUBKEYCURVE;
|
||||
strcpy (r->u.value, info.key_attr[1].curve);
|
||||
r->next = para;
|
||||
para = r;
|
||||
}
|
||||
|
||||
r = xcalloc (1, sizeof *r + 20 );
|
||||
r->key = pAUTHKEYTYPE;
|
||||
sprintf( r->u.value, "%d", algo );
|
||||
sprintf( r->u.value, "%d", info.key_attr[2].algo );
|
||||
r->next = para;
|
||||
para = r;
|
||||
|
||||
|
@ -4873,6 +4918,7 @@ gen_card_key (int keyno, int is_primary, kbnode_t pub_root,
|
|||
unsigned char *public;
|
||||
gcry_sexp_t s_key;
|
||||
|
||||
memset (&info, 0, sizeof (info));
|
||||
err = agent_scd_getattr ("KEY-ATTR", &info);
|
||||
if (err)
|
||||
{
|
||||
|
@ -4931,8 +4977,8 @@ gen_card_key (int keyno, int is_primary, kbnode_t pub_root,
|
|||
if (algo == PUBKEY_ALGO_RSA)
|
||||
err = key_from_sexp (pk->pkey, s_key, "public-key", "ne");
|
||||
else if (algo == PUBKEY_ALGO_ECDSA
|
||||
|| algo == PUBKEY_ALGO_EDDSA
|
||||
|| algo == PUBKEY_ALGO_ECDH )
|
||||
|| algo == PUBKEY_ALGO_EDDSA
|
||||
|| algo == PUBKEY_ALGO_ECDH )
|
||||
err = ecckey_from_sexp (pk->pkey, s_key, algo);
|
||||
else
|
||||
err = gpg_error (GPG_ERR_PUBKEY_ALGO);
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue