aboutsummaryrefslogtreecommitdiffstats
path: root/agent/protect-tool.c
diff options
context:
space:
mode:
Diffstat (limited to 'agent/protect-tool.c')
-rw-r--r--agent/protect-tool.c22
1 files changed, 20 insertions, 2 deletions
diff --git a/agent/protect-tool.c b/agent/protect-tool.c
index d4f945a94..2d1df4d7c 100644
--- a/agent/protect-tool.c
+++ b/agent/protect-tool.c
@@ -563,6 +563,23 @@ rsa_key_check (struct rsa_secret_key_s *skey)
}
+/* A callback used by p12_parse to return a certificate. */
+static void
+import_p12_cert_cb (void *opaque, const unsigned char *cert, size_t certlen)
+{
+ struct b64state state;
+ gpg_error_t err, err2;
+
+ err = b64enc_start (&state, stdout, "CERTIFICATE");
+ if (!err)
+ err = b64enc_write (&state, cert, certlen);
+ err2 = b64enc_finish (&state);
+ if (!err)
+ err = err2;
+ if (err)
+ log_error ("error writing armored certificate: %s\n", gpg_strerror (err));
+}
+
static void
import_p12_file (const char *fname)
{
@@ -583,11 +600,12 @@ import_p12_file (const char *fname)
if (!buf)
return;
- kparms = p12_parse (buf, buflen, get_passphrase ());
+ kparms = p12_parse (buf, buflen, get_passphrase (),
+ import_p12_cert_cb, NULL);
xfree (buf);
if (!kparms)
{
- log_error ("error parsing or decrypting the PKCS-1 file\n");
+ log_error ("error parsing or decrypting the PKCS-12 file\n");
return;
}
for (i=0; kparms[i]; i++)