Accept NULL auth_cfg_t passed to credential_manager_t.get_private()
This commit is contained in:
@@ -58,7 +58,6 @@ static bool rebuild_auth(private_rebuild_auth_t *this, ike_sa_t *ike_sa,
|
|||||||
enumerator_t *enumerator;
|
enumerator_t *enumerator;
|
||||||
chunk_t octets, auth_data;
|
chunk_t octets, auth_data;
|
||||||
private_key_t *private;
|
private_key_t *private;
|
||||||
auth_cfg_t *auth;
|
|
||||||
payload_t *payload;
|
payload_t *payload;
|
||||||
auth_payload_t *auth_payload;
|
auth_payload_t *auth_payload;
|
||||||
auth_method_t auth_method;
|
auth_method_t auth_method;
|
||||||
@@ -91,10 +90,8 @@ static bool rebuild_auth(private_rebuild_auth_t *this, ike_sa_t *ike_sa,
|
|||||||
id = identification_create_from_encoding(data.ptr[4], chunk_skip(data, 8));
|
id = identification_create_from_encoding(data.ptr[4], chunk_skip(data, 8));
|
||||||
generator->destroy(generator);
|
generator->destroy(generator);
|
||||||
|
|
||||||
auth = auth_cfg_create();
|
|
||||||
private = lib->credmgr->get_private(lib->credmgr, KEY_ANY,
|
private = lib->credmgr->get_private(lib->credmgr, KEY_ANY,
|
||||||
this->id ?: id, auth);
|
this->id ?: id, NULL);
|
||||||
auth->destroy(auth);
|
|
||||||
if (private == NULL)
|
if (private == NULL)
|
||||||
{
|
{
|
||||||
DBG1(DBG_CFG, "no private key found for '%Y' to rebuild AUTH",
|
DBG1(DBG_CFG, "no private key found for '%Y' to rebuild AUTH",
|
||||||
|
|||||||
@@ -685,15 +685,12 @@ static void list_public_key(public_key_t *public, FILE *out)
|
|||||||
private_key_t *private = NULL;
|
private_key_t *private = NULL;
|
||||||
chunk_t keyid;
|
chunk_t keyid;
|
||||||
identification_t *id;
|
identification_t *id;
|
||||||
auth_cfg_t *auth;
|
|
||||||
|
|
||||||
if (public->get_fingerprint(public, KEYID_PUBKEY_SHA1, &keyid))
|
if (public->get_fingerprint(public, KEYID_PUBKEY_SHA1, &keyid))
|
||||||
{
|
{
|
||||||
id = identification_create_from_encoding(ID_KEY_ID, keyid);
|
id = identification_create_from_encoding(ID_KEY_ID, keyid);
|
||||||
auth = auth_cfg_create();
|
|
||||||
private = lib->credmgr->get_private(lib->credmgr,
|
private = lib->credmgr->get_private(lib->credmgr,
|
||||||
public->get_type(public), id, auth);
|
public->get_type(public), id, NULL);
|
||||||
auth->destroy(auth);
|
|
||||||
id->destroy(id);
|
id->destroy(id);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1047,42 +1047,45 @@ METHOD(credential_manager_t, get_private, private_key_t*,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* if a specific certificate is preferred, check for a matching key */
|
if (auth)
|
||||||
cert = auth->get(auth, AUTH_RULE_SUBJECT_CERT);
|
|
||||||
if (cert)
|
|
||||||
{
|
{
|
||||||
private = get_private_by_cert(this, cert, type);
|
/* if a specific certificate is preferred, check for a matching key */
|
||||||
if (private)
|
cert = auth->get(auth, AUTH_RULE_SUBJECT_CERT);
|
||||||
|
if (cert)
|
||||||
{
|
{
|
||||||
trustchain = build_trustchain(this, cert, auth);
|
private = get_private_by_cert(this, cert, type);
|
||||||
if (trustchain)
|
if (private)
|
||||||
{
|
{
|
||||||
auth->merge(auth, trustchain, FALSE);
|
trustchain = build_trustchain(this, cert, auth);
|
||||||
trustchain->destroy(trustchain);
|
if (trustchain)
|
||||||
|
{
|
||||||
|
auth->merge(auth, trustchain, FALSE);
|
||||||
|
trustchain->destroy(trustchain);
|
||||||
|
}
|
||||||
|
return private;
|
||||||
}
|
}
|
||||||
return private;
|
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
/* try to build a trust chain for each certificate found */
|
/* try to build a trust chain for each certificate found */
|
||||||
enumerator = create_cert_enumerator(this, CERT_ANY, type, id, FALSE);
|
enumerator = create_cert_enumerator(this, CERT_ANY, type, id, FALSE);
|
||||||
while (enumerator->enumerate(enumerator, &cert))
|
while (enumerator->enumerate(enumerator, &cert))
|
||||||
{
|
|
||||||
private = get_private_by_cert(this, cert, type);
|
|
||||||
if (private)
|
|
||||||
{
|
{
|
||||||
trustchain = build_trustchain(this, cert, auth);
|
private = get_private_by_cert(this, cert, type);
|
||||||
if (trustchain)
|
if (private)
|
||||||
{
|
{
|
||||||
auth->merge(auth, trustchain, FALSE);
|
trustchain = build_trustchain(this, cert, auth);
|
||||||
trustchain->destroy(trustchain);
|
if (trustchain)
|
||||||
break;
|
{
|
||||||
|
auth->merge(auth, trustchain, FALSE);
|
||||||
|
trustchain->destroy(trustchain);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
private->destroy(private);
|
||||||
|
private = NULL;
|
||||||
}
|
}
|
||||||
private->destroy(private);
|
|
||||||
private = NULL;
|
|
||||||
}
|
}
|
||||||
|
enumerator->destroy(enumerator);
|
||||||
}
|
}
|
||||||
enumerator->destroy(enumerator);
|
|
||||||
|
|
||||||
/* if no valid trustchain was found, fall back to the first usable cert */
|
/* if no valid trustchain was found, fall back to the first usable cert */
|
||||||
if (!private)
|
if (!private)
|
||||||
@@ -1093,7 +1096,10 @@ METHOD(credential_manager_t, get_private, private_key_t*,
|
|||||||
private = get_private_by_cert(this, cert, type);
|
private = get_private_by_cert(this, cert, type);
|
||||||
if (private)
|
if (private)
|
||||||
{
|
{
|
||||||
auth->add(auth, AUTH_RULE_SUBJECT_CERT, cert->get_ref(cert));
|
if (auth)
|
||||||
|
{
|
||||||
|
auth->add(auth, AUTH_RULE_SUBJECT_CERT, cert->get_ref(cert));
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user