mirror of
https://git.libssh.org/projects/libssh.git
synced 2026-02-12 03:00:26 +09:00
pki: Add ssh_pki_publickey_to_string().
This commit is contained in:
@@ -32,6 +32,7 @@
|
||||
|
||||
#include "libssh/priv.h"
|
||||
#include "libssh/libssh.h"
|
||||
#include "libssh/buffer.h"
|
||||
#include "libssh/session.h"
|
||||
#include "libssh/callbacks.h"
|
||||
#include "libssh/pki.h"
|
||||
@@ -347,10 +348,11 @@ int pki_pubkey_build_rsa(ssh_key key,
|
||||
return SSH_OK;
|
||||
}
|
||||
|
||||
int pki_publickey_to_string(const ssh_key key, ssh_string *pstr)
|
||||
ssh_string pki_publickey_to_string(const ssh_key key)
|
||||
{
|
||||
ssh_string buffer;
|
||||
ssh_buffer buffer;
|
||||
ssh_string type_s;
|
||||
ssh_string str = NULL;
|
||||
ssh_string e = NULL;
|
||||
ssh_string n = NULL;
|
||||
ssh_string p = NULL;
|
||||
@@ -378,22 +380,22 @@ int pki_publickey_to_string(const ssh_key key, ssh_string *pstr)
|
||||
|
||||
switch (key->type) {
|
||||
case SSH_KEYTYPE_DSS:
|
||||
p = make_bignum_string(key->p);
|
||||
p = make_bignum_string(key->dsa->p);
|
||||
if (p == NULL) {
|
||||
goto fail;
|
||||
}
|
||||
|
||||
q = make_bignum_string(key->q);
|
||||
q = make_bignum_string(key->dsa->q);
|
||||
if (q == NULL) {
|
||||
goto fail;
|
||||
}
|
||||
|
||||
g = make_bignum_string(key->g);
|
||||
g = make_bignum_string(key->dsa->g);
|
||||
if (g == NULL) {
|
||||
goto fail;
|
||||
}
|
||||
|
||||
n = make_bignum_string(key->pub_key);
|
||||
n = make_bignum_string(key->dsa->pub_key);
|
||||
if (n == NULL) {
|
||||
goto fail;
|
||||
}
|
||||
@@ -410,14 +412,46 @@ int pki_publickey_to_string(const ssh_key key, ssh_string *pstr)
|
||||
if (buffer_add_ssh_string(buffer, n) < 0) {
|
||||
goto fail;
|
||||
}
|
||||
break;
|
||||
case SSH_KEYTYPE_RSA:
|
||||
case SSH_KEYTYPE_RSA1:
|
||||
if (rsa_public_to_string(key->rsa_pub, buf) < 0) {
|
||||
goto error;
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
ssh_string_burn(p);
|
||||
ssh_string_free(p);
|
||||
ssh_string_burn(g);
|
||||
ssh_string_free(g);
|
||||
ssh_string_burn(q);
|
||||
ssh_string_free(q);
|
||||
ssh_string_burn(n);
|
||||
ssh_string_free(n);
|
||||
|
||||
break;
|
||||
case SSH_KEYTYPE_RSA:
|
||||
case SSH_KEYTYPE_RSA1:
|
||||
e = make_bignum_string(key->rsa->e);
|
||||
if (p == NULL) {
|
||||
goto fail;
|
||||
}
|
||||
|
||||
n = make_bignum_string(key->rsa->n);
|
||||
if (q == NULL) {
|
||||
goto fail;
|
||||
}
|
||||
|
||||
if (buffer_add_ssh_string(buffer, e) < 0) {
|
||||
goto fail;
|
||||
}
|
||||
if (buffer_add_ssh_string(buffer, n) < 0) {
|
||||
goto fail;
|
||||
}
|
||||
|
||||
ssh_string_burn(e);
|
||||
ssh_string_free(e);
|
||||
ssh_string_burn(n);
|
||||
ssh_string_free(n);
|
||||
|
||||
break;
|
||||
case SSH_KEYTYPE_ECDSA:
|
||||
case SSH_KEYTYPE_UNKNOWN:
|
||||
goto fail;
|
||||
}
|
||||
|
||||
str = ssh_string_new(buffer_get_rest_len(buffer));
|
||||
if (str == NULL) {
|
||||
@@ -430,17 +464,23 @@ int pki_publickey_to_string(const ssh_key key, ssh_string *pstr)
|
||||
}
|
||||
ssh_buffer_free(buffer);
|
||||
|
||||
*pstr = str;
|
||||
return SSH_OK;
|
||||
return str;
|
||||
fail:
|
||||
ssh_buffer_free(buffer);
|
||||
ssh_string_burn(str);
|
||||
ssh_string_free(str);
|
||||
ssh_string_burn(e);
|
||||
ssh_string_free(e);
|
||||
ssh_string_burn(p);
|
||||
ssh_string_free(p);
|
||||
ssh_string_burn(g);
|
||||
ssh_string_free(g);
|
||||
ssh_string_burn(q);
|
||||
ssh_string_free(q);
|
||||
ssh_string_burn(n);
|
||||
ssh_string_free(n);
|
||||
|
||||
return SSH_ERROR;
|
||||
return NULL;
|
||||
}
|
||||
|
||||
struct signature_struct *pki_do_sign(ssh_key privatekey,
|
||||
|
||||
Reference in New Issue
Block a user