aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAris Adamantiadis <aris@0xbadc0de.be>2010-05-02 00:03:06 +0200
committerAris Adamantiadis <aris@0xbadc0de.be>2010-05-02 00:03:06 +0200
commitc691aa3e328809e5cf1100b93737ddde130bc642 (patch)
treea4b2be5311419737d2bdd4eeb8264644819fbc5c
parent430e570629d663efdf550ea4f9669a1fc0bb40f9 (diff)
downloadlibssh-c691aa3e328809e5cf1100b93737ddde130bc642.tar.gz
libssh-c691aa3e328809e5cf1100b93737ddde130bc642.tar.xz
libssh-c691aa3e328809e5cf1100b93737ddde130bc642.zip
Forgot the pki files
-rw-r--r--include/libssh/pki.h28
-rw-r--r--libssh/pki.c113
2 files changed, 141 insertions, 0 deletions
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;
+}
+
+/**
+ * @}
+ */