aboutsummaryrefslogtreecommitdiff
path: root/libssh/auth.c
diff options
context:
space:
mode:
authorVic Lee <llyzs@163.com>2009-12-30 12:02:36 +0800
committerAndreas Schneider <mail@cynapses.org>2009-12-30 19:05:37 +0100
commit1944dc8b5ff51daae505b5ee32c3b82c2ac4bf86 (patch)
tree77484c5868708229fb7467f74b08f50f99dfd200 /libssh/auth.c
parentf2ca2d50b5ef5559e66ed6cced71eaadec8ef866 (diff)
downloadlibssh-1944dc8b5ff51daae505b5ee32c3b82c2ac4bf86.tar.gz
libssh-1944dc8b5ff51daae505b5ee32c3b82c2ac4bf86.tar.xz
libssh-1944dc8b5ff51daae505b5ee32c3b82c2ac4bf86.zip
Add new API function ssh_userauth_privatekey_file().
Signed-off-by: Vic Lee <llyzs@163.com> Signed-off-by: Andreas Schneider <mail@cynapses.org>
Diffstat (limited to 'libssh/auth.c')
-rw-r--r--libssh/auth.c66
1 files changed, 66 insertions, 0 deletions
diff --git a/libssh/auth.c b/libssh/auth.c
index 1d94135a..2d64b903 100644
--- a/libssh/auth.c
+++ b/libssh/auth.c
@@ -594,6 +594,72 @@ error:
return rc;
}
+/**
+ * @brief Try to authenticate through a private key file.
+ *
+ * @param session The ssh session to use.
+ *
+ * @param username The username to authenticate. You can specify NULL if
+ * ssh_option_set_username() has been used. You cannot try
+ * two different logins in a row.
+ *
+ * @param filename Filename containing the private key.
+ *
+ * @param passphrase Passphrase to decrypt the private key. Set to null if
+ * none is needed or it is unknown.
+ *
+ * @returns SSH_AUTH_ERROR: A serious error happened.\n
+ * SSH_AUTH_DENIED: Authentication failed: use another method.\n
+ * SSH_AUTH_PARTIAL: You've been partially authenticated, you still
+ * have to use another method.\n
+ * SSH_AUTH_SUCCESS: Authentication successful.
+ *
+ * @see publickey_from_file()
+ * @see privatekey_from_file()
+ * @see privatekey_free()
+ * @see ssh_userauth_pubkey()
+ */
+int ssh_userauth_privatekey_file(ssh_session session, const char *username,
+ const char *filename, const char *passphrase) {
+ char *pubkeyfile = NULL;
+ ssh_string pubkey = NULL;
+ ssh_private_key privkey = NULL;
+ int type = 0;
+ int rc = SSH_AUTH_ERROR;
+
+ enter_function();
+
+ pubkeyfile = malloc(strlen(filename) + 1 + 4);
+ if (pubkeyfile == NULL) {
+ leave_function();
+ return SSH_AUTH_ERROR;
+ }
+ sprintf(pubkeyfile, "%s.pub", filename);
+
+ pubkey = publickey_from_file(session, pubkeyfile, &type);
+ if (pubkey == NULL) {
+ ssh_log(session, SSH_LOG_RARE, "Public key file %s not found. Trying to generate it.", pubkeyfile);
+ /* auto-detect the key type with type=0 */
+ privkey = privatekey_from_file(session, filename, 0, passphrase);
+ } else {
+ ssh_log(session, SSH_LOG_RARE, "Public key file %s loaded.", pubkeyfile);
+ privkey = privatekey_from_file(session, filename, type, passphrase);
+ }
+ if (privkey == NULL) {
+ goto error;
+ }
+ /* ssh_userauth_pubkey is responsible for taking care of null-pubkey */
+ rc = ssh_userauth_pubkey(session, username, pubkey, privkey);
+ privatekey_free(privkey);
+
+error:
+ SAFE_FREE(pubkeyfile);
+ string_free(pubkey);
+
+ leave_function();
+ return rc;
+}
+
#ifndef _WIN32
/**
* @brief Try to authenticate through public key with an ssh agent.