version 1.320, 2018/09/12 01:21:34 |
version 1.321, 2018/09/13 02:08:33 |
|
|
u_int magic, i1, i2, i3, i4; |
u_int magic, i1, i2, i3, i4; |
size_t slen; |
size_t slen; |
u_long e; |
u_long e; |
|
BIGNUM *dsa_p = NULL, *dsa_q = NULL, *dsa_g = NULL; |
|
BIGNUM *dsa_pub_key = NULL, *dsa_priv_key = NULL; |
|
BIGNUM *rsa_n = NULL, *rsa_e = NULL, *rsa_d = NULL; |
|
BIGNUM *rsa_p = NULL, *rsa_q = NULL, *rsa_iqmp = NULL; |
if ((b = sshbuf_from(blob, blen)) == NULL) |
if ((b = sshbuf_from(blob, blen)) == NULL) |
fatal("%s: sshbuf_from failed", __func__); |
fatal("%s: sshbuf_from failed", __func__); |
if ((r = sshbuf_get_u32(b, &magic)) != 0) |
if ((r = sshbuf_get_u32(b, &magic)) != 0) |
|
|
|
|
switch (key->type) { |
switch (key->type) { |
case KEY_DSA: |
case KEY_DSA: |
buffer_get_bignum_bits(b, key->dsa->p); |
if ((dsa_p = BN_new()) == NULL || |
buffer_get_bignum_bits(b, key->dsa->g); |
(dsa_q = BN_new()) == NULL || |
buffer_get_bignum_bits(b, key->dsa->q); |
(dsa_g = BN_new()) == NULL || |
buffer_get_bignum_bits(b, key->dsa->pub_key); |
(dsa_pub_key = BN_new()) == NULL || |
buffer_get_bignum_bits(b, key->dsa->priv_key); |
(dsa_priv_key = BN_new()) == NULL) |
|
fatal("%s: BN_new", __func__); |
|
buffer_get_bignum_bits(b, dsa_p); |
|
buffer_get_bignum_bits(b, dsa_g); |
|
buffer_get_bignum_bits(b, dsa_q); |
|
buffer_get_bignum_bits(b, dsa_pub_key); |
|
buffer_get_bignum_bits(b, dsa_priv_key); |
|
if (!DSA_set0_pqg(key->dsa, dsa_p, dsa_q, dsa_g)) |
|
fatal("%s: DSA_set0_pqg failed", __func__); |
|
dsa_p = dsa_q = dsa_g = NULL; /* transferred */ |
|
if (!DSA_set0_key(key->dsa, dsa_pub_key, dsa_priv_key)) |
|
fatal("%s: DSA_set0_key failed", __func__); |
|
dsa_pub_key = dsa_priv_key = NULL; /* transferred */ |
break; |
break; |
case KEY_RSA: |
case KEY_RSA: |
if ((r = sshbuf_get_u8(b, &e1)) != 0 || |
if ((r = sshbuf_get_u8(b, &e1)) != 0 || |
|
|
e += e3; |
e += e3; |
debug("e %lx", e); |
debug("e %lx", e); |
} |
} |
if (!BN_set_word(key->rsa->e, e)) { |
if ((rsa_e = BN_new()) == NULL) |
|
fatal("%s: BN_new", __func__); |
|
if (!BN_set_word(rsa_e, e)) { |
|
BN_clear_free(rsa_e); |
sshbuf_free(b); |
sshbuf_free(b); |
sshkey_free(key); |
sshkey_free(key); |
return NULL; |
return NULL; |
} |
} |
buffer_get_bignum_bits(b, key->rsa->d); |
if ((rsa_n = BN_new()) == NULL || |
buffer_get_bignum_bits(b, key->rsa->n); |
(rsa_d = BN_new()) == NULL || |
buffer_get_bignum_bits(b, key->rsa->iqmp); |
(rsa_p = BN_new()) == NULL || |
buffer_get_bignum_bits(b, key->rsa->q); |
(rsa_q = BN_new()) == NULL || |
buffer_get_bignum_bits(b, key->rsa->p); |
(rsa_iqmp = BN_new()) == NULL) |
if ((r = ssh_rsa_generate_additional_parameters(key)) != 0) |
fatal("%s: BN_new", __func__); |
|
buffer_get_bignum_bits(b, rsa_d); |
|
buffer_get_bignum_bits(b, rsa_n); |
|
buffer_get_bignum_bits(b, rsa_iqmp); |
|
buffer_get_bignum_bits(b, rsa_q); |
|
buffer_get_bignum_bits(b, rsa_p); |
|
if (!RSA_set0_key(key->rsa, rsa_n, rsa_e, rsa_d)) |
|
fatal("%s: RSA_set0_key failed", __func__); |
|
rsa_n = rsa_e = rsa_d = NULL; /* transferred */ |
|
if (!RSA_set0_factors(key->rsa, rsa_p, rsa_q)) |
|
fatal("%s: RSA_set0_factors failed", __func__); |
|
rsa_p = rsa_q = NULL; /* transferred */ |
|
if ((r = ssh_rsa_complete_crt_parameters(key, rsa_iqmp)) != 0) |
fatal("generate RSA parameters failed: %s", ssh_err(r)); |
fatal("generate RSA parameters failed: %s", ssh_err(r)); |
|
BN_clear_free(rsa_iqmp); |
break; |
break; |
} |
} |
rlen = sshbuf_len(b); |
rlen = sshbuf_len(b); |
|
|
identity_file); |
identity_file); |
} |
} |
fclose(fp); |
fclose(fp); |
switch (EVP_PKEY_type(pubkey->type)) { |
switch (EVP_PKEY_base_id(pubkey)) { |
case EVP_PKEY_RSA: |
case EVP_PKEY_RSA: |
if ((*k = sshkey_new(KEY_UNSPEC)) == NULL) |
if ((*k = sshkey_new(KEY_UNSPEC)) == NULL) |
fatal("sshkey_new failed"); |
fatal("sshkey_new failed"); |
|
|
break; |
break; |
default: |
default: |
fatal("%s: unsupported pubkey type %d", __func__, |
fatal("%s: unsupported pubkey type %d", __func__, |
EVP_PKEY_type(pubkey->type)); |
EVP_PKEY_base_id(pubkey)); |
} |
} |
EVP_PKEY_free(pubkey); |
EVP_PKEY_free(pubkey); |
return; |
return; |