aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndreas Schneider <asn@cryptomilk.org>2011-08-30 11:40:16 +0200
committerAndreas Schneider <asn@cryptomilk.org>2011-08-30 12:15:20 +0200
commit64de14f51e447cc0d25a91c8ebe2a1e2108972ab (patch)
tree23e7049a0c285bdf2cf97868cbbf26155acf6ba7
parentfe246db27d69e6e27ebde35f6e72e41802ce4a26 (diff)
downloadlibssh-64de14f51e447cc0d25a91c8ebe2a1e2108972ab.tar.gz
libssh-64de14f51e447cc0d25a91c8ebe2a1e2108972ab.tar.xz
libssh-64de14f51e447cc0d25a91c8ebe2a1e2108972ab.zip
keys: Move publickey_from_privatekey() to legacy.c.
-rw-r--r--src/keys.c193
-rw-r--r--src/legacy.c32
2 files changed, 31 insertions, 194 deletions
diff --git a/src/keys.c b/src/keys.c
index 31d9cea5..04aec8d2 100644
--- a/src/keys.c
+++ b/src/keys.c
@@ -44,199 +44,6 @@
* @{
*/
-/**
- * @brief Make a public_key object out of a private_key object.
- *
- * @param[in] prv The private key to generate the public key.
- *
- * @returns The generated public key, NULL on error.
- *
- * @see publickey_to_string()
- */
-ssh_public_key publickey_from_privatekey(ssh_private_key prv) {
- ssh_public_key key = NULL;
-#ifdef HAVE_LIBGCRYPT
- gcry_sexp_t sexp;
- const char *tmp = NULL;
- size_t size;
- ssh_string p = NULL;
- ssh_string q = NULL;
- ssh_string g = NULL;
- ssh_string y = NULL;
- ssh_string e = NULL;
- ssh_string n = NULL;
-#endif /* HAVE_LIBGCRYPT */
-
- key = malloc(sizeof(struct ssh_public_key_struct));
- if (key == NULL) {
- return NULL;
- }
- ZERO_STRUCTP(key);
- key->type = prv->type;
- switch(key->type) {
- case SSH_KEYTYPE_DSS:
-#ifdef HAVE_LIBGCRYPT
- sexp = gcry_sexp_find_token(prv->dsa_priv, "p", 0);
- if (sexp == NULL) {
- goto error;
- }
- tmp = gcry_sexp_nth_data(sexp, 1, &size);
- p = ssh_string_new(size);
- if (p == NULL) {
- goto error;
- }
- ssh_string_fill(p,(char *) tmp, size);
- gcry_sexp_release(sexp);
-
- sexp = gcry_sexp_find_token(prv->dsa_priv,"q",0);
- if (sexp == NULL) {
- goto error;
- }
- tmp = gcry_sexp_nth_data(sexp,1,&size);
- q = ssh_string_new(size);
- if (q == NULL) {
- goto error;
- }
- ssh_string_fill(q,(char *) tmp,size);
- gcry_sexp_release(sexp);
-
- sexp = gcry_sexp_find_token(prv->dsa_priv, "g", 0);
- if (sexp == NULL) {
- goto error;
- }
- tmp = gcry_sexp_nth_data(sexp,1,&size);
- g = ssh_string_new(size);
- if (g == NULL) {
- goto error;
- }
- ssh_string_fill(g,(char *) tmp,size);
- gcry_sexp_release(sexp);
-
- sexp = gcry_sexp_find_token(prv->dsa_priv,"y",0);
- if (sexp == NULL) {
- goto error;
- }
- tmp = gcry_sexp_nth_data(sexp,1,&size);
- y = ssh_string_new(size);
- if (y == NULL) {
- goto error;
- }
- ssh_string_fill(y,(char *) tmp,size);
- gcry_sexp_release(sexp);
-
- gcry_sexp_build(&key->dsa_pub, NULL,
- "(public-key(dsa(p %b)(q %b)(g %b)(y %b)))",
- ssh_string_len(p), ssh_string_data(p),
- ssh_string_len(q), ssh_string_data(q),
- ssh_string_len(g), ssh_string_data(g),
- ssh_string_len(y), ssh_string_data(y));
-
- ssh_string_burn(p);
- ssh_string_free(p);
- ssh_string_burn(q);
- ssh_string_free(q);
- ssh_string_burn(g);
- ssh_string_free(g);
- ssh_string_burn(y);
- ssh_string_free(y);
-#elif defined HAVE_LIBCRYPTO
- key->dsa_pub = DSA_new();
- if (key->dsa_pub == NULL) {
- goto error;
- }
- key->dsa_pub->p = BN_dup(prv->dsa_priv->p);
- key->dsa_pub->q = BN_dup(prv->dsa_priv->q);
- key->dsa_pub->g = BN_dup(prv->dsa_priv->g);
- key->dsa_pub->pub_key = BN_dup(prv->dsa_priv->pub_key);
- if (key->dsa_pub->p == NULL ||
- key->dsa_pub->q == NULL ||
- key->dsa_pub->g == NULL ||
- key->dsa_pub->pub_key == NULL) {
- goto error;
- }
-#endif /* HAVE_LIBCRYPTO */
- break;
- case SSH_KEYTYPE_RSA:
- case SSH_KEYTYPE_RSA1:
-#ifdef HAVE_LIBGCRYPT
- sexp = gcry_sexp_find_token(prv->rsa_priv, "n", 0);
- if (sexp == NULL) {
- goto error;
- }
- tmp = gcry_sexp_nth_data(sexp, 1, &size);
- n = ssh_string_new(size);
- if (n == NULL) {
- goto error;
- }
- ssh_string_fill(n, (char *) tmp, size);
- gcry_sexp_release(sexp);
-
- sexp = gcry_sexp_find_token(prv->rsa_priv, "e", 0);
- if (sexp == NULL) {
- goto error;
- }
- tmp = gcry_sexp_nth_data(sexp, 1, &size);
- e = ssh_string_new(size);
- if (e == NULL) {
- goto error;
- }
- ssh_string_fill(e, (char *) tmp, size);
- gcry_sexp_release(sexp);
-
- gcry_sexp_build(&key->rsa_pub, NULL,
- "(public-key(rsa(n %b)(e %b)))",
- ssh_string_len(n), ssh_string_data(n),
- ssh_string_len(e), ssh_string_data(e));
- if (key->rsa_pub == NULL) {
- goto error;
- }
-
- ssh_string_burn(e);
- ssh_string_free(e);
- ssh_string_burn(n);
- ssh_string_free(n);
-#elif defined HAVE_LIBCRYPTO
- key->rsa_pub = RSA_new();
- if (key->rsa_pub == NULL) {
- goto error;
- }
- key->rsa_pub->e = BN_dup(prv->rsa_priv->e);
- key->rsa_pub->n = BN_dup(prv->rsa_priv->n);
- if (key->rsa_pub->e == NULL ||
- key->rsa_pub->n == NULL) {
- goto error;
- }
-#endif
- break;
- default:
- publickey_free(key);
- return NULL;
- }
- key->type_c = ssh_type_to_char(prv->type);
-
- return key;
-error:
-#ifdef HAVE_LIBGCRYPT
- gcry_sexp_release(sexp);
- ssh_string_burn(p);
- ssh_string_free(p);
- ssh_string_burn(q);
- ssh_string_free(q);
- ssh_string_burn(g);
- ssh_string_free(g);
- ssh_string_burn(y);
- ssh_string_free(y);
-
- ssh_string_burn(e);
- ssh_string_free(e);
- ssh_string_burn(n);
- ssh_string_free(n);
-#endif
- publickey_free(key);
-
- return NULL;
-}
-
/** @} */
/* vim: set ts=4 sw=4 et cindent: */
diff --git a/src/legacy.c b/src/legacy.c
index d15508c7..56f58370 100644
--- a/src/legacy.c
+++ b/src/legacy.c
@@ -302,7 +302,6 @@ ssh_private_key privatekey_from_file(ssh_session session, const char *filename,
int type, const char *passphrase);
int ssh_publickey_to_file(ssh_session session, const char *file,
ssh_string pubkey, int type);
-ssh_public_key publickey_from_privatekey(ssh_private_key prv);
ssh_string publickey_to_string(ssh_public_key key);
*
*/
@@ -372,6 +371,37 @@ void publickey_free(ssh_public_key key) {
SAFE_FREE(key);
}
+ssh_public_key publickey_from_privatekey(ssh_private_key prv) {
+ struct ssh_public_key_struct *p;
+ ssh_key privkey;
+ ssh_key pubkey;
+ int rc;
+
+ privkey = ssh_key_new();
+ if (privkey == NULL) {
+ return NULL;
+ }
+
+ privkey->type = prv->type;
+ privkey->type_c = ssh_key_type_to_char(privkey->type);
+ privkey->flags = SSH_KEY_FLAG_PRIVATE | SSH_KEY_FLAG_PUBLIC;
+ privkey->dsa = prv->dsa_priv;
+ privkey->rsa = prv->rsa_priv;
+
+ rc = ssh_pki_export_privkey_to_pubkey(privkey, &pubkey);
+ privkey->dsa = NULL;
+ privkey->rsa = NULL;
+ ssh_key_free(privkey);
+ if (rc < 0) {
+ return NULL;
+ }
+
+ p = ssh_pki_convert_key_to_publickey(pubkey);
+ ssh_key_free(pubkey);
+
+ return p;
+}
+
ssh_private_key privatekey_from_file(ssh_session session,
const char *filename,
int type,