diff options
author | Simon Josefsson <simon@josefsson.org> | 2007-01-14 21:18:24 +0000 |
---|---|---|
committer | Simon Josefsson <simon@josefsson.org> | 2007-01-14 21:18:24 +0000 |
commit | b60f98edcd4023b25ae1c6f10aeca66ff8911a34 (patch) | |
tree | 969a51134daac4fddb9e11a75a225f317819df1c /libextra/opencdk/pubkey.c | |
parent | 8a38600fe2aef0346287859757d0badba668351f (diff) | |
download | gnutls-b60f98edcd4023b25ae1c6f10aeca66ff8911a34.tar.gz |
(cdk_pubkey_to_sexp, cdk_seckey_to_sexp): New functions, from Mario
Lenz <mario.lenz@gmx.net>.
Diffstat (limited to 'libextra/opencdk/pubkey.c')
-rw-r--r-- | libextra/opencdk/pubkey.c | 117 |
1 files changed, 117 insertions, 0 deletions
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; +} |