diff options
author | Andreas Schneider <mail@cynapses.org> | 2009-02-06 09:46:10 +0000 |
---|---|---|
committer | Andreas Schneider <mail@cynapses.org> | 2009-02-06 09:46:10 +0000 |
commit | 73cde232be40f850467cc8bcc3e85429a82e0e08 (patch) | |
tree | dd87ca9a0b92cbafd4cbf0e05634ddb374657f17 /libssh/keys.c | |
parent | 53226f98f245da9b0260709bc4866f67b479b825 (diff) | |
download | libssh-73cde232be40f850467cc8bcc3e85429a82e0e08.tar.gz libssh-73cde232be40f850467cc8bcc3e85429a82e0e08.tar.xz libssh-73cde232be40f850467cc8bcc3e85429a82e0e08.zip |
Complete ssh client agent support.
git-svn-id: svn+ssh://svn.berlios.de/svnroot/repos/libssh/trunk@231 7dcaeef0-15fb-0310-b436-a5af3365683c
Diffstat (limited to 'libssh/keys.c')
-rw-r--r-- | libssh/keys.c | 51 |
1 files changed, 51 insertions, 0 deletions
diff --git a/libssh/keys.c b/libssh/keys.c index 2b981ac6..406bcdd8 100644 --- a/libssh/keys.c +++ b/libssh/keys.c @@ -45,6 +45,25 @@ char *ssh_type_to_char(int type){ } } +int ssh_type_from_name(char *name) { + if (strcmp(name, "rsa1") == 0) { + return TYPE_RSA1; + } else if (strcmp(name, "rsa") == 0) { + return TYPE_RSA; + } else if (strcmp(name, "dsa") == 0) { + return TYPE_DSS; + } else if (strcmp(name, "ssh-rsa1") == 0) { + return TYPE_RSA1; + } else if (strcmp(name, "ssh-rsa") == 0) { + return TYPE_RSA; + } else if (strcmp(name, "ssh-dss") == 0) { + return TYPE_DSS; + } + + ssh_say(2, "key_type_from_name: unknown key type '%s'\n", name); + return -1; +} + PUBLIC_KEY *publickey_make_dss(SSH_SESSION *session, BUFFER *buffer){ STRING *p,*q,*g,*pubkey; PUBLIC_KEY *key=malloc(sizeof(PUBLIC_KEY)); @@ -601,6 +620,38 @@ static STRING *RSA_do_sign(void *payload,int len,RSA *privkey){ } #endif +STRING *ssh_do_sign_with_agent(struct ssh_session *session, + struct buffer_struct *buf, struct public_key_struct *publickey) { + struct buffer_struct *sigbuf = NULL; + struct string_struct *signature = NULL; + struct string_struct *session_id = NULL; + struct ssh_crypto_struct *crypto = NULL; + + if (session->current_crypto) { + crypto = session->current_crypto; + } else { + crypto = session->next_crypto; + } + + /* prepend session identifier */ + session_id = string_new(SHA_DIGEST_LEN); + string_fill(session_id, crypto->session_id, SHA_DIGEST_LEN); + + sigbuf = buffer_new(); + + buffer_add_ssh_string(sigbuf, session_id); + + /* append out buffer */ + buffer_add_buffer(sigbuf, buf); + + /* create signature */ + signature = agent_sign_data(session, sigbuf, publickey); + + buffer_free(sigbuf); + + return signature; +} + /* this function signs the session id (known as H) as a string then the content of sigbuf */ STRING *ssh_do_sign(SSH_SESSION *session,BUFFER *sigbuf, PRIVATE_KEY *privatekey){ SHACTX ctx; |