Accept NULL auth_cfg_t passed to credential_manager_t.get_private()

This commit is contained in:
Martin Willi
2012-03-20 17:31:39 +01:00
parent 6261c0c3b7
commit 5aef6bd0f3
3 changed files with 34 additions and 34 deletions
+1 -4
View File
@@ -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",
+1 -4
View File
@@ -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;
} }
} }