From c691aa3e328809e5cf1100b93737ddde130bc642 Mon Sep 17 00:00:00 2001 From: Aris Adamantiadis Date: Sun, 2 May 2010 00:03:06 +0200 Subject: Forgot the pki files --- include/libssh/pki.h | 28 +++++++++++++ libssh/pki.c | 113 +++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 141 insertions(+) create mode 100644 include/libssh/pki.h create mode 100644 libssh/pki.c diff --git a/include/libssh/pki.h b/include/libssh/pki.h new file mode 100644 index 00000000..6a0403e2 --- /dev/null +++ b/include/libssh/pki.h @@ -0,0 +1,28 @@ +#ifndef PKI_H_ +#define PKI_H_ + +#define SSH_KEY_FLAG_EMPTY 0 +#define SSH_KEY_FLAG_PUBLIC 1 +#define SSH_KEY_FLAG_PRIVATE 2 + +struct ssh_key_struct { + enum ssh_keytypes_e type; + int flags; + const char *type_c; /* Don't free it ! it is static */ +#ifdef HAVE_LIBGCRYPT + gcry_sexp_t dsa; + gcry_sexp_t rsa; +#elif HAVE_LIBCRYPTO + DSA *dsa; + RSA *rsa; +#endif +}; + +ssh_key ssh_key_new (void); +void ssh_key_clean (ssh_key key); +enum ssh_keytypes_e ssh_key_type(ssh_key key); +int ssh_key_import_private(ssh_key key, ssh_session session, + const char *filename, const char *passphrase); +void ssh_key_free (ssh_key key); + +#endif /* PKI_H_ */ diff --git a/libssh/pki.c b/libssh/pki.c new file mode 100644 index 00000000..ef925dd0 --- /dev/null +++ b/libssh/pki.c @@ -0,0 +1,113 @@ +/* + * This file is part of the SSH Library + * + * Copyright (c) 2010 by Aris Adamantiadis + * + * The SSH Library is free software; you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation; either version 2.1 of the License, or (at your + * option) any later version. + * + * The SSH Library is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY + * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public + * License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with the SSH Library; see the file COPYING. If not, write to + * the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, + * MA 02111-1307, USA. + */ + +/** @defgroup ssh_pki SSH Public Key Infrastructure + * @ingroup libssh + * + * Functions for the creation, importation and manipulation of public and + * private keys in the context of the SSH protocol + * + * @{ + */ + +#include "libssh/priv.h" +#include "libssh/pki.h" +#include "libssh/keys.h" + +/** + * @brief creates a new empty SSH key + * @returns an empty ssh_key handle + */ +ssh_key ssh_key_new (void){ + ssh_key ptr=malloc (sizeof (struct ssh_key_struct)); + ZERO_STRUCTP(ptr); + return ptr; +} + +/** + * @brief clean up the key and deallocate all existing keys + * @param[in] key ssh_key to clean + */ +void ssh_key_clean (ssh_key key){ + if(key==NULL) + return; +#ifdef HAVE_LIBGCRYPT + gcry_sexp_release(key->dsa); + gcry_sexp_release(key->rsa); +#elif defined HAVE_LIBCRYPTO + DSA_free(key->dsa); + RSA_free(key->rsa); +#endif + key->flags=SSH_KEY_FLAG_EMPTY; + key->type=SSH_KEYTYPE_UNKNOWN; + key->type_c=NULL; +} + +/** + * @brief deallocate a SSH key + * @param[in] key ssh_key handle to free + */ +void ssh_key_free (ssh_key key){ + if(key){ + ssh_key_clean(key); + SAFE_FREE(key); + } +} + +/** + * @brief returns the type of a ssh key + * @param[in] key the ssh_key handle + * @returns one of SSH_KEYTYPE_RSA,SSH_KEYTYPE_DSS,SSH_KEYTYPE_RSA1 + * @returns SSH_KEYTYPE_UNKNOWN if the type is unknown + */ +enum ssh_keytypes_e ssh_key_type(ssh_key key){ + if (key==NULL) + return SSH_KEYTYPE_UNKNOWN; + return key->type; +} + +/** + * @brief import a key from a file + * @param[out] key the ssh_key to update + * @param[in] session The SSH Session to use. If a key decryption callback is set, it will + * be used to ask for the passphrase. + * @param[in] filename The filename of the the private key. + * @param[in] passphrase The passphrase to decrypt the private key. Set to null + * if none is needed or it is unknown. + * @returns SSH_OK on success, SSH_ERROR otherwise. + **/ +int ssh_key_import_private(ssh_key key, ssh_session session, const char *filename, const char *passphrase){ + ssh_private_key priv=privatekey_from_file(session,filename,0,passphrase); + if(priv==NULL) + return SSH_ERROR; + ssh_key_clean(key); + key->dsa=priv->dsa_priv; + key->rsa=priv->rsa_priv; + key->type=priv->type; + key->flags=SSH_KEY_FLAG_PRIVATE | SSH_KEY_FLAG_PUBLIC; + key->type_c=ssh_type_to_char(key->type); + SAFE_FREE(priv); + return SSH_OK; +} + +/** + * @} + */ -- cgit v1.2.3