From: Simon Josefsson Date: Sun, 14 Jan 2007 21:18:24 +0000 (+0000) Subject: (cdk_pubkey_to_sexp, cdk_seckey_to_sexp): New functions, from Mario X-Git-Tag: gnutls_1_7_2~5 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=b60f98edcd4023b25ae1c6f10aeca66ff8911a34;p=thirdparty%2Fgnutls.git (cdk_pubkey_to_sexp, cdk_seckey_to_sexp): New functions, from Mario Lenz . --- 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; +}