aboutsummaryrefslogtreecommitdiffstats
path: root/agent/pksign.c
diff options
context:
space:
mode:
authorNIIBE Yutaka <[email protected]>2014-04-08 03:15:20 +0000
committerNIIBE Yutaka <[email protected]>2014-04-08 03:15:20 +0000
commit5ff6d0c25e6d0f422b17809b954e9e87cb137347 (patch)
tree984819417b529f71a77618dcdf4a5afaa988f9e5 /agent/pksign.c
parentg10: EdDSA support. (diff)
downloadgnupg-5ff6d0c25e6d0f422b17809b954e9e87cb137347.tar.gz
gnupg-5ff6d0c25e6d0f422b17809b954e9e87cb137347.zip
agent: Support EdDSA.
* agent/pksign.c (agent_pksign_do): Handle EdDSA signature.
Diffstat (limited to 'agent/pksign.c')
-rw-r--r--agent/pksign.c21
1 files changed, 16 insertions, 5 deletions
diff --git a/agent/pksign.c b/agent/pksign.c
index fb593a6e2..713c8ba79 100644
--- a/agent/pksign.c
+++ b/agent/pksign.c
@@ -324,12 +324,18 @@ agent_pksign_do (ctrl_t ctrl, const char *cache_nonce,
int key_type;
int is_RSA = 0;
int is_ECDSA = 0;
+ int is_EdDSA = 0;
- key_type = agent_is_dsa_key (s_skey);
- if (key_type == 0)
- is_RSA = 1;
- else if (key_type == GCRY_PK_ECDSA)
- is_ECDSA = 1;
+ if (agent_is_eddsa_key (s_skey))
+ is_EdDSA = 1;
+ else
+ {
+ key_type = agent_is_dsa_key (s_skey);
+ if (key_type == 0)
+ is_RSA = 1;
+ else if (key_type == GCRY_PK_ECDSA)
+ is_ECDSA = 1;
+ }
rc = divert_pksign (ctrl,
data, datalen,
@@ -356,6 +362,11 @@ agent_pksign_do (ctrl_t ctrl, const char *cache_nonce,
rc = gcry_sexp_build (&s_sig, NULL, "(sig-val(rsa(s%b)))", len, buf);
}
+ else if (is_EdDSA)
+ {
+ rc = gcry_sexp_build (&s_sig, NULL, "(sig-val(eddsa(r%b)(s%b)))",
+ len/2, buf, len/2, buf + len/2);
+ }
else if (is_ECDSA)
{
unsigned char *r_buf_allocated = NULL;