aboutsummaryrefslogtreecommitdiff
path: root/src/pki_crypto.c
diff options
context:
space:
mode:
authorAndreas Schneider <asn@cryptomilk.org>2011-08-15 17:42:11 +0200
committerAndreas Schneider <asn@cryptomilk.org>2011-08-15 18:48:08 +0200
commitc77b23b32a550a3dd52b8d2c5b3d1b177126dc54 (patch)
treecb995b46d8e2bd29100ff856de92439165e0107f /src/pki_crypto.c
parent962bdb1eea88cfa385e94c59342ce69567a8c59c (diff)
downloadlibssh-c77b23b32a550a3dd52b8d2c5b3d1b177126dc54.tar.gz
libssh-c77b23b32a550a3dd52b8d2c5b3d1b177126dc54.tar.xz
libssh-c77b23b32a550a3dd52b8d2c5b3d1b177126dc54.zip
pki: Cleanup pki header.
Diffstat (limited to 'src/pki_crypto.c')
-rw-r--r--src/pki_crypto.c96
1 files changed, 96 insertions, 0 deletions
diff --git a/src/pki_crypto.c b/src/pki_crypto.c
index 821d3ccb..763cb46a 100644
--- a/src/pki_crypto.c
+++ b/src/pki_crypto.c
@@ -347,6 +347,102 @@ 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 buffer;
+ ssh_string type_s;
+ ssh_string e = NULL;
+ ssh_string n = NULL;
+ ssh_string p = NULL;
+ ssh_string g = NULL;
+ ssh_string q = NULL;
+ int rc;
+
+ buffer = ssh_buffer_new();
+ if (buffer == NULL) {
+ return NULL;
+ }
+
+ type_s = ssh_string_from_char(key->type_c);
+ if (type_s == NULL) {
+ ssh_buffer_free(buffer);
+ return NULL;
+ }
+
+ rc = buffer_add_ssh_string(buffer, type_s);
+ string_free(type_s);
+ if (rc < 0) {
+ ssh_buffer_free(buffer);
+ return NULL;
+ }
+
+ switch (key->type) {
+ case SSH_KEYTYPE_DSS:
+ p = make_bignum_string(key->p);
+ if (p == NULL) {
+ goto fail;
+ }
+
+ q = make_bignum_string(key->q);
+ if (q == NULL) {
+ goto fail;
+ }
+
+ g = make_bignum_string(key->g);
+ if (g == NULL) {
+ goto fail;
+ }
+
+ n = make_bignum_string(key->pub_key);
+ if (n == NULL) {
+ goto fail;
+ }
+
+ if (buffer_add_ssh_string(buffer, p) < 0) {
+ goto fail;
+ }
+ if (buffer_add_ssh_string(buffer, q) < 0) {
+ goto fail;
+ }
+ if (buffer_add_ssh_string(buffer, g) < 0) {
+ goto fail;
+ }
+ 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;
+ }
+
+ str = ssh_string_new(buffer_get_rest_len(buffer));
+ if (str == NULL) {
+ goto fail;
+ }
+
+ rc = ssh_string_fill(str, buffer_get_rest(buffer), buffer_get_rest_len(buffer));
+ if (rc < 0) {
+ goto fail;
+ }
+ ssh_buffer_free(buffer);
+
+ *pstr = str;
+ return SSH_OK;
+fail:
+ ssh_buffer_free(buffer);
+ ssh_string_free(e);
+ ssh_string_free(p);
+ ssh_string_free(g);
+ ssh_string_free(q);
+ ssh_string_free(n);
+
+ return SSH_ERROR;
+}
+
struct signature_struct *pki_do_sign(ssh_key privatekey,
const unsigned char *hash) {
struct signature_struct *sign;