aboutsummaryrefslogtreecommitdiffstats
path: root/g10/sign.c
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--g10/sign.c39
1 files changed, 33 insertions, 6 deletions
diff --git a/g10/sign.c b/g10/sign.c
index ab9d1a38f..d1d981480 100644
--- a/g10/sign.c
+++ b/g10/sign.c
@@ -40,6 +40,7 @@
#include "trustdb.h"
#include "status.h"
#include "i18n.h"
+#include "cardglue.h"
#ifdef HAVE_DOSISH_SYSTEM
@@ -305,12 +306,38 @@ do_sign( PKT_secret_key *sk, PKT_signature *sig,
sig->digest_algo = digest_algo;
sig->digest_start[0] = dp[0];
sig->digest_start[1] = dp[1];
- frame = encode_md_value( sk->pubkey_algo, md,
- digest_algo, mpi_get_nbits(sk->skey[0]), 0 );
- if (!frame)
- return G10ERR_GENERAL;
- rc = pubkey_sign( sk->pubkey_algo, sig->data, frame, sk->skey );
- mpi_free(frame);
+#ifdef ENABLE_CARD_SUPPORT
+ if (sk->is_protected && sk->protect.s2k.mode == 1002)
+ {
+ char *rbuf;
+ size_t rbuflen;
+ char *snbuf;
+
+ snbuf = serialno_and_fpr_from_sk (sk->protect.iv, sk->protect.ivlen,sk);
+ rc = G10ERR_GENERAL;
+/* agent_scd_pksign (snbuf, digest_algo, */
+/* gcry_md_read (md, digest_algo), */
+/* gcry_md_get_algo_dlen (digest_algo), */
+/* &rbuf, &rbuflen); */
+ xfree (snbuf);
+ if (!rc)
+ {
+/* if (gcry_mpi_scan (&sig->data[0], GCRYMPI_FMT_USG, */
+/* rbuf, rbuflen, NULL)) */
+ BUG ();
+ }
+ }
+ else
+#endif /* ENABLE_CARD_SUPPORT */
+ {
+ frame = encode_md_value( sk->pubkey_algo, md,
+ digest_algo, mpi_get_nbits(sk->skey[0]), 0 );
+ if (!frame)
+ return G10ERR_GENERAL;
+ rc = pubkey_sign( sk->pubkey_algo, sig->data, frame, sk->skey );
+ mpi_free(frame);
+ }
+
if (!rc && !opt.no_sig_create_check) {
/* check that the signature verification worked and nothing is
* fooling us e.g. by a bug in the signature create