version 1.59, 2017/12/18 02:25:15 |
version 1.60, 2018/02/07 02:06:51 |
|
|
if ((rsa = RSA_new()) == NULL || |
if ((rsa = RSA_new()) == NULL || |
(rsa->n = BN_new()) == NULL || |
(rsa->n = BN_new()) == NULL || |
(rsa->e = BN_new()) == NULL) { |
(rsa->e = BN_new()) == NULL) { |
if (rsa != NULL) |
RSA_free(rsa); |
RSA_free(rsa); |
|
free(k); |
free(k); |
return NULL; |
return NULL; |
} |
} |
|
|
(dsa->q = BN_new()) == NULL || |
(dsa->q = BN_new()) == NULL || |
(dsa->g = BN_new()) == NULL || |
(dsa->g = BN_new()) == NULL || |
(dsa->pub_key = BN_new()) == NULL) { |
(dsa->pub_key = BN_new()) == NULL) { |
if (dsa != NULL) |
DSA_free(dsa); |
DSA_free(dsa); |
|
free(k); |
free(k); |
return NULL; |
return NULL; |
} |
} |
|
|
#ifdef WITH_OPENSSL |
#ifdef WITH_OPENSSL |
case KEY_RSA: |
case KEY_RSA: |
case KEY_RSA_CERT: |
case KEY_RSA_CERT: |
if (k->rsa != NULL) |
RSA_free(k->rsa); |
RSA_free(k->rsa); |
|
k->rsa = NULL; |
k->rsa = NULL; |
break; |
break; |
case KEY_DSA: |
case KEY_DSA: |
case KEY_DSA_CERT: |
case KEY_DSA_CERT: |
if (k->dsa != NULL) |
DSA_free(k->dsa); |
DSA_free(k->dsa); |
|
k->dsa = NULL; |
k->dsa = NULL; |
break; |
break; |
case KEY_ECDSA: |
case KEY_ECDSA: |
case KEY_ECDSA_CERT: |
case KEY_ECDSA_CERT: |
if (k->ecdsa != NULL) |
EC_KEY_free(k->ecdsa); |
EC_KEY_free(k->ecdsa); |
|
k->ecdsa = NULL; |
k->ecdsa = NULL; |
break; |
break; |
#endif /* WITH_OPENSSL */ |
#endif /* WITH_OPENSSL */ |
|
|
switch (sshkey_type_plain(ret->type)) { |
switch (sshkey_type_plain(ret->type)) { |
#ifdef WITH_OPENSSL |
#ifdef WITH_OPENSSL |
case KEY_RSA: |
case KEY_RSA: |
if (ret->rsa != NULL) |
RSA_free(ret->rsa); |
RSA_free(ret->rsa); |
|
ret->rsa = k->rsa; |
ret->rsa = k->rsa; |
k->rsa = NULL; |
k->rsa = NULL; |
#ifdef DEBUG_PK |
#ifdef DEBUG_PK |
|
|
#endif |
#endif |
break; |
break; |
case KEY_DSA: |
case KEY_DSA: |
if (ret->dsa != NULL) |
DSA_free(ret->dsa); |
DSA_free(ret->dsa); |
|
ret->dsa = k->dsa; |
ret->dsa = k->dsa; |
k->dsa = NULL; |
k->dsa = NULL; |
#ifdef DEBUG_PK |
#ifdef DEBUG_PK |
|
|
#endif |
#endif |
break; |
break; |
case KEY_ECDSA: |
case KEY_ECDSA: |
if (ret->ecdsa != NULL) |
EC_KEY_free(ret->ecdsa); |
EC_KEY_free(ret->ecdsa); |
|
ret->ecdsa = k->ecdsa; |
ret->ecdsa = k->ecdsa; |
ret->ecdsa_nid = k->ecdsa_nid; |
ret->ecdsa_nid = k->ecdsa_nid; |
k->ecdsa = NULL; |
k->ecdsa = NULL; |
|
|
private = NULL; |
private = NULL; |
ret = 0; |
ret = 0; |
out: |
out: |
if (private != NULL) |
RSA_free(private); |
RSA_free(private); |
BN_free(f4); |
if (f4 != NULL) |
|
BN_free(f4); |
|
return ret; |
return ret; |
} |
} |
|
|
|
|
private = NULL; |
private = NULL; |
ret = 0; |
ret = 0; |
out: |
out: |
if (private != NULL) |
DSA_free(private); |
DSA_free(private); |
|
return ret; |
return ret; |
} |
} |
|
|
|
|
private = NULL; |
private = NULL; |
ret = 0; |
ret = 0; |
out: |
out: |
if (private != NULL) |
EC_KEY_free(private); |
EC_KEY_free(private); |
|
return ret; |
return ret; |
} |
} |
#endif /* WITH_OPENSSL */ |
#endif /* WITH_OPENSSL */ |
|
|
ret = SSH_ERR_EC_CURVE_MISMATCH; |
ret = SSH_ERR_EC_CURVE_MISMATCH; |
goto out; |
goto out; |
} |
} |
if (key->ecdsa != NULL) |
EC_KEY_free(key->ecdsa); |
EC_KEY_free(key->ecdsa); |
|
if ((key->ecdsa = EC_KEY_new_by_curve_name(key->ecdsa_nid)) |
if ((key->ecdsa = EC_KEY_new_by_curve_name(key->ecdsa_nid)) |
== NULL) { |
== NULL) { |
ret = SSH_ERR_EC_CURVE_INVALID; |
ret = SSH_ERR_EC_CURVE_INVALID; |
|
|
free(curve); |
free(curve); |
free(pk); |
free(pk); |
#ifdef WITH_OPENSSL |
#ifdef WITH_OPENSSL |
if (q != NULL) |
EC_POINT_free(q); |
EC_POINT_free(q); |
|
#endif /* WITH_OPENSSL */ |
#endif /* WITH_OPENSSL */ |
return ret; |
return ret; |
} |
} |
|
|
free(tname); |
free(tname); |
free(curve); |
free(curve); |
#ifdef WITH_OPENSSL |
#ifdef WITH_OPENSSL |
if (exponent != NULL) |
BN_clear_free(exponent); |
BN_clear_free(exponent); |
|
#endif /* WITH_OPENSSL */ |
#endif /* WITH_OPENSSL */ |
sshkey_free(k); |
sshkey_free(k); |
if (ed25519_pk != NULL) { |
if (ed25519_pk != NULL) { |
|
|
ret = 0; |
ret = 0; |
out: |
out: |
BN_CTX_free(bnctx); |
BN_CTX_free(bnctx); |
if (nq != NULL) |
EC_POINT_free(nq); |
EC_POINT_free(nq); |
|
return ret; |
return ret; |
} |
} |
|
|
|
|
} |
} |
out: |
out: |
BIO_free(bio); |
BIO_free(bio); |
if (pk != NULL) |
EVP_PKEY_free(pk); |
EVP_PKEY_free(pk); |
|
sshkey_free(prv); |
sshkey_free(prv); |
return r; |
return r; |
} |
} |