diff options
author | Werner Koch <wk@gnupg.org> | 2002-02-28 12:07:59 +0100 |
---|---|---|
committer | Werner Koch <wk@gnupg.org> | 2002-02-28 12:07:59 +0100 |
commit | 56341c289cabffb7f468f7a3ee706626a9106a96 (patch) | |
tree | 41fdd684c4cfdd7a164f22ae3fc56ba061d19a6c /agent/pkdecrypt.c | |
parent | * assuan-client.c (assuan_transact): Add 2 more arguments to (diff) | |
download | gnupg2-56341c289cabffb7f468f7a3ee706626a9106a96.tar.xz gnupg2-56341c289cabffb7f468f7a3ee706626a9106a96.zip |
Changes needed to support smartcards. Well, only _support_. There is
no real code yet.
Diffstat (limited to 'agent/pkdecrypt.c')
-rw-r--r-- | agent/pkdecrypt.c | 41 |
1 files changed, 27 insertions, 14 deletions
diff --git a/agent/pkdecrypt.c b/agent/pkdecrypt.c index 78f70ad52..33663a9f7 100644 --- a/agent/pkdecrypt.c +++ b/agent/pkdecrypt.c @@ -39,6 +39,7 @@ agent_pkdecrypt (CTRL ctrl, const char *ciphertext, size_t ciphertextlen, FILE *outfp) { GCRY_SEXP s_skey = NULL, s_cipher = NULL, s_plain = NULL; + unsigned char *shadow_info = NULL; int rc; char *buf = NULL; size_t len; @@ -63,27 +64,38 @@ agent_pkdecrypt (CTRL ctrl, const char *ciphertext, size_t ciphertextlen, log_printhex ("keygrip:", ctrl->keygrip, 20); log_printhex ("cipher: ", ciphertext, ciphertextlen); } - s_skey = agent_key_from_file (ctrl->keygrip); - if (!s_skey) + s_skey = agent_key_from_file (ctrl->keygrip, &shadow_info); + if (!s_skey && !shadow_info) { log_error ("failed to read the secret key\n"); rc = seterr (No_Secret_Key); goto leave; } - - if (DBG_CRYPTO) - { - log_debug ("skey: "); - gcry_sexp_dump (s_skey); + if (!s_skey) + { /* divert operation to the smartcard */ + rc = divert_pkdecrypt (&s_plain, s_cipher, shadow_info); + if (rc) + { + log_error ("smartcard decryption failed: %s\n", gnupg_strerror (rc)); + goto leave; + } } + else + { /* no smartcard, but a private key */ + if (DBG_CRYPTO) + { + log_debug ("skey: "); + gcry_sexp_dump (s_skey); + } - rc = gcry_pk_decrypt (&s_plain, s_cipher, s_skey); - if (rc) - { - log_error ("decryption failed: %s\n", gcry_strerror (rc)); - rc = map_gcry_err (rc); - goto leave; - } + rc = gcry_pk_decrypt (&s_plain, s_cipher, s_skey); + if (rc) + { + log_error ("decryption failed: %s\n", gcry_strerror (rc)); + rc = map_gcry_err (rc); + goto leave; + } + } if (DBG_CRYPTO) { @@ -106,6 +118,7 @@ agent_pkdecrypt (CTRL ctrl, const char *ciphertext, size_t ciphertextlen, gcry_sexp_release (s_plain); gcry_sexp_release (s_cipher); xfree (buf); + xfree (shadow_info); return rc; } |