aboutsummaryrefslogtreecommitdiff
path: root/src/pki.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/pki.c')
-rw-r--r--src/pki.c113
1 files changed, 113 insertions, 0 deletions
diff --git a/src/pki.c b/src/pki.c
new file mode 100644
index 00000000..ef925dd0
--- /dev/null
+++ b/src/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;
+}
+
+/**
+ * @}
+ */