diff options
author | Werner Koch <[email protected]> | 2014-03-22 19:51:16 +0000 |
---|---|---|
committer | Werner Koch <[email protected]> | 2014-03-22 19:52:03 +0000 |
commit | a77ed0f266d03e234027dda4de5a7f3dd6787b1e (patch) | |
tree | 78dcefaf7f6b6547d7cd747a90373b240d697585 /agent/pksign.c | |
parent | tools: Fix NULL deref in gpg-connect-agent. (diff) | |
download | gnupg-a77ed0f266d03e234027dda4de5a7f3dd6787b1e.tar.gz gnupg-a77ed0f266d03e234027dda4de5a7f3dd6787b1e.zip |
agent: Cleanups to prepare implementation of Ed25519.
* agent/cvt-openpgp.c: Remove.
(convert_to_openpgp): Use gcry_sexp_extract_param.
* agent/findkey.c (is_eddsa): New.
(agent_is_dsa_key, agent_is_eddsa_key): Check whether ecc means EdDSA.
* agent/pksign.c (agent_pksign_do): Add args OVERRIDEDATA and
OVERRIDEDATALEN.
* common/ssh-utils.c (is_eddsa): New.
(get_fingerprint): Take care or EdDSA.
Diffstat (limited to 'agent/pksign.c')
-rw-r--r-- | agent/pksign.c | 41 |
1 files changed, 27 insertions, 14 deletions
diff --git a/agent/pksign.c b/agent/pksign.c index 088615011..fb593a6e2 100644 --- a/agent/pksign.c +++ b/agent/pksign.c @@ -276,18 +276,35 @@ do_encode_raw_pkcs1 (const byte *md, size_t mdlen, unsigned int nbits, the signature S-expression. LOOKUP is an optional function to provide a way for lower layers to ask for the caching TTL. If a CACHE_NONCE is given that cache item is first tried to get a - passphrase. */ + passphrase. If OVERRIDEDATA is not NULL, OVERRIDEDATALEN bytes + from this buffer are used instead of the data in CTRL. The + override feature is required to allow the use of Ed25519 with ssh + because Ed25519 dies the hashing itself. */ int agent_pksign_do (ctrl_t ctrl, const char *cache_nonce, const char *desc_text, gcry_sexp_t *signature_sexp, - cache_mode_t cache_mode, lookup_ttl_t lookup_ttl) + cache_mode_t cache_mode, lookup_ttl_t lookup_ttl, + const void *overridedata, size_t overridedatalen) { gcry_sexp_t s_skey = NULL, s_sig = NULL; unsigned char *shadow_info = NULL; unsigned int rc = 0; /* FIXME: gpg-error? */ + const unsigned char *data; + int datalen; - if (! ctrl->have_keygrip) + if (overridedata) + { + data = overridedata; + datalen = overridedatalen; + } + else + { + data = ctrl->digest.value; + datalen = ctrl->digest.valuelen; + } + + if (!ctrl->have_keygrip) return gpg_error (GPG_ERR_NO_SECKEY); rc = agent_key_from_file (ctrl, cache_nonce, desc_text, ctrl->keygrip, @@ -315,8 +332,7 @@ agent_pksign_do (ctrl_t ctrl, const char *cache_nonce, is_ECDSA = 1; rc = divert_pksign (ctrl, - ctrl->digest.value, - ctrl->digest.valuelen, + data, datalen, ctrl->digest.algo, shadow_info, &buf, &len); if (rc) @@ -405,22 +421,18 @@ agent_pksign_do (ctrl_t ctrl, const char *cache_nonce, /* Put the hash into a sexp */ if (agent_is_eddsa_key (s_skey)) - rc = do_encode_eddsa (ctrl->digest.value, - ctrl->digest.valuelen, + rc = do_encode_eddsa (data, datalen, &s_hash); else if (ctrl->digest.algo == MD_USER_TLS_MD5SHA1) - rc = do_encode_raw_pkcs1 (ctrl->digest.value, - ctrl->digest.valuelen, + rc = do_encode_raw_pkcs1 (data, datalen, gcry_pk_get_nbits (s_skey), &s_hash); else if ( (dsaalgo = agent_is_dsa_key (s_skey)) ) - rc = do_encode_dsa (ctrl->digest.value, - ctrl->digest.valuelen, + rc = do_encode_dsa (data, datalen, dsaalgo, s_skey, &s_hash); else - rc = do_encode_md (ctrl->digest.value, - ctrl->digest.valuelen, + rc = do_encode_md (data, datalen, ctrl->digest.algo, &s_hash, ctrl->digest.raw_value); @@ -468,7 +480,8 @@ agent_pksign (ctrl_t ctrl, const char *cache_nonce, const char *desc_text, size_t len = 0; int rc = 0; - rc = agent_pksign_do (ctrl, cache_nonce, desc_text, &s_sig, cache_mode, NULL); + rc = agent_pksign_do (ctrl, cache_nonce, desc_text, &s_sig, cache_mode, NULL, + NULL, 0); if (rc) goto leave; |