summaryrefslogtreecommitdiff
path: root/libextra
diff options
context:
space:
mode:
authorSimon Josefsson <simon@josefsson.org>2007-01-14 21:18:24 +0000
committerSimon Josefsson <simon@josefsson.org>2007-01-14 21:18:24 +0000
commitb60f98edcd4023b25ae1c6f10aeca66ff8911a34 (patch)
tree969a51134daac4fddb9e11a75a225f317819df1c /libextra
parent8a38600fe2aef0346287859757d0badba668351f (diff)
downloadgnutls-b60f98edcd4023b25ae1c6f10aeca66ff8911a34.tar.gz
(cdk_pubkey_to_sexp, cdk_seckey_to_sexp): New functions, from Mario
Lenz <mario.lenz@gmx.net>.
Diffstat (limited to 'libextra')
-rw-r--r--libextra/opencdk/opencdk.h6
-rw-r--r--libextra/opencdk/pubkey.c117
2 files changed, 122 insertions, 1 deletions
diff --git a/libextra/opencdk/opencdk.h b/libextra/opencdk/opencdk.h
index 752db525d4..5eb4afb1d7 100644
--- a/libextra/opencdk/opencdk.h
+++ b/libextra/opencdk/opencdk.h
@@ -1,5 +1,5 @@
/* opencdk.h - Open Crypto Development Kit (OpenCDK)
- * Copyright (C) 2006 Free Software Foundation, Inc.
+ * Copyright (C) 2006, 2007 Free Software Foundation, Inc.
* Copyright (C) 2001, 2002, 2003, 2005 Timo Schulz
*
* This file is part of OpenCDK.
@@ -632,6 +632,10 @@ cdk_error_t cdk_sk_unprotect( cdk_pkt_seckey_t sk, const char * pw );
cdk_error_t cdk_sk_protect( cdk_pkt_seckey_t sk, const char * pw );
cdk_error_t cdk_pk_from_secret_key( cdk_pkt_seckey_t sk,
cdk_pkt_pubkey_t *ret_pk );
+cdk_error_t cdk_pubkey_to_sexp (cdk_pkt_pubkey_t pk,
+ char **sexp, size_t * len);
+cdk_error_t cdk_seckey_to_sexp (cdk_pkt_seckey_t sk,
+ char **sexp, size_t * len);
/*-- seskey.c --*/
cdk_error_t cdk_sesskey_new( cdk_sesskey_t * r_sk );
diff --git a/libextra/opencdk/pubkey.c b/libextra/opencdk/pubkey.c
index 679574b6f9..b0c8550d46 100644
--- a/libextra/opencdk/pubkey.c
+++ b/libextra/opencdk/pubkey.c
@@ -1,5 +1,6 @@
/* -*- Mode: C; c-file-style: "bsd" -*-
* pubkey.c - Public key API
+ * Copyright (C) 2007 Free Software Foundation, Inc.
* Copyright (C) 2002, 2003 Timo Schulz
*
* This file is part of OpenCDK.
@@ -1073,3 +1074,119 @@ _cdk_pkt_get_fingerprint( cdk_packet_t pkt, byte * fpr )
}
return 0;
}
+
+/**
+ * cdk_pubkey_to_sexp:
+ * @pk: the public key
+ * @sexp: where to store the S- expression
+ * @len: the length of sexp
+ *
+ * Convert a public key to an S- expression. sexp is allocated
+ * by this function, but you have to cdk_free() it yourself.
+ * The S- expression is stored in canonical format as used by
+ * libgcrypt (GCRYSEXP_FMT_CANON).
+ **/
+
+cdk_error_t
+cdk_pubkey_to_sexp (cdk_pkt_pubkey_t pk, char **sexp, size_t * len)
+{
+ int rc;
+ char *buf;
+ size_t sexp_len;
+ gcry_sexp_t pk_sexp;
+
+ if (!pk || !sexp)
+ return CDK_Inv_Value;
+
+ rc = pubkey_to_sexp (&pk_sexp, pk);
+ if (rc)
+ return rc;
+
+ sexp_len = gcry_sexp_sprint (pk_sexp, GCRYSEXP_FMT_CANON, NULL, 0);
+ if (!sexp_len)
+ {
+ return CDK_Gcry_Error;
+ }
+
+ buf = (char *) cdk_malloc (sexp_len);
+ if (!buf)
+ {
+ gcry_sexp_release (pk_sexp);
+ return CDK_Out_Of_Core;
+ }
+
+ sexp_len =
+ gcry_sexp_sprint (pk_sexp, GCRYSEXP_FMT_CANON, buf, sexp_len);
+
+ gcry_sexp_release (pk_sexp);
+
+ if (!sexp_len)
+ {
+ cdk_free (buf);
+ return CDK_Gcry_Error;
+ }
+
+ if (len)
+ *len = sexp_len;
+ *sexp = buf;
+
+ return CDK_Success;
+}
+
+/**
+ * cdk_seckey_to_sexp:
+ * @sk: the secret key
+ * @sexp: where to store the S- expression
+ * @len: the length of sexp
+ *
+ * Convert a public key to an S- expression. sexp is allocated
+ * by this function, but you have to cdk_free() it yourself.
+ * The S- expression is stored in canonical format as used by
+ * libgcrypt (GCRYSEXP_FMT_CANON).
+ **/
+
+cdk_error_t
+cdk_seckey_to_sexp (cdk_pkt_seckey_t sk, char **sexp, size_t * len)
+{
+ int rc;
+ char *buf;
+ size_t sexp_len;
+ gcry_sexp_t sk_sexp;
+
+ if (!sk || !sexp)
+ return CDK_Inv_Value;
+
+ rc = seckey_to_sexp (&sk_sexp, sk);
+ if (rc)
+ return rc;
+
+ sexp_len = gcry_sexp_sprint (sk_sexp, GCRYSEXP_FMT_CANON, NULL, 0);
+ if (!sexp_len)
+ {
+ return CDK_Gcry_Error;
+ }
+
+ buf = (char *) cdk_malloc (sexp_len);
+ if (!buf)
+ {
+ gcry_sexp_release (sk_sexp);
+ return CDK_Out_Of_Core;
+ }
+
+ sexp_len =
+ gcry_sexp_sprint (sk_sexp, GCRYSEXP_FMT_CANON, buf, sexp_len);
+
+ gcry_sexp_release (sk_sexp);
+
+ if (!sexp_len)
+ {
+ cdk_free (buf);
+ return CDK_Gcry_Error;
+ }
+
+ if (len)
+ *len = sexp_len;
+ *sexp = buf;
+
+ return CDK_Success;
+}