keys: Move publickey_from_privatekey() to legacy.c.
Этот коммит содержится в:
родитель
fe246db27d
Коммит
64de14f51e
193
src/keys.c
193
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: */
|
||||
|
32
src/legacy.c
32
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,
|
||||
|
Загрузка…
Ссылка в новой задаче
Block a user