aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorTobias Brunner <tobias@strongswan.org>2010-11-19 17:26:33 +0100
committerTobias Brunner <tobias@strongswan.org>2010-12-03 17:59:59 +0100
commit68c7f186432fdedac5281cce7b9ed91c5fe7a25f (patch)
treee1449a35c7ebeb64a2ef9cfd2f5291de3fd0a54b /src
parent3023a75e678cb56b81102879cd57dcb7f72566a7 (diff)
downloadstrongswan-68c7f186432fdedac5281cce7b9ed91c5fe7a25f.tar.bz2
strongswan-68c7f186432fdedac5281cce7b9ed91c5fe7a25f.tar.xz
Alternative to mem_cred_t.add_cert added, which returns the certificate.
If the certificate is already cached, the cached version is returned.
Diffstat (limited to 'src')
-rw-r--r--src/libstrongswan/credentials/sets/mem_cred.c33
-rw-r--r--src/libstrongswan/credentials/sets/mem_cred.h11
2 files changed, 40 insertions, 4 deletions
diff --git a/src/libstrongswan/credentials/sets/mem_cred.c b/src/libstrongswan/credentials/sets/mem_cred.c
index 19dbefa6b..08a1e717b 100644
--- a/src/libstrongswan/credentials/sets/mem_cred.c
+++ b/src/libstrongswan/credentials/sets/mem_cred.c
@@ -146,12 +146,23 @@ static bool certificate_equals(certificate_t *item, certificate_t *cert)
return item->equals(item, cert);
}
-METHOD(mem_cred_t, add_cert, void,
- private_mem_cred_t *this, bool trusted, certificate_t *cert)
+/**
+ * Add a certificate the the cache. Returns a reference to "cert" or a
+ * previously cached certificate that equals "cert".
+ */
+static certificate_t *add_cert_internal(private_mem_cred_t *this, bool trusted,
+ certificate_t *cert)
{
+ certificate_t *cached;
this->lock->write_lock(this->lock);
if (this->untrusted->find_last(this->untrusted,
- (linked_list_match_t)certificate_equals, NULL, cert) != SUCCESS)
+ (linked_list_match_t)certificate_equals,
+ (void**)&cached, cert) == SUCCESS)
+ {
+ cert->destroy(cert);
+ cert = cached->get_ref(cached);
+ }
+ else
{
if (trusted)
{
@@ -159,8 +170,21 @@ METHOD(mem_cred_t, add_cert, void,
}
this->untrusted->insert_last(this->untrusted, cert->get_ref(cert));
}
- cert->destroy(cert);
this->lock->unlock(this->lock);
+ return cert;
+}
+
+METHOD(mem_cred_t, add_cert, void,
+ private_mem_cred_t *this, bool trusted, certificate_t *cert)
+{
+ certificate_t *cached = add_cert_internal(this, trusted, cert);
+ cached->destroy(cached);
+}
+
+METHOD(mem_cred_t, add_cert_ref, certificate_t*,
+ private_mem_cred_t *this, bool trusted, certificate_t *cert)
+{
+ return add_cert_internal(this, trusted, cert);
}
/**
@@ -427,6 +451,7 @@ mem_cred_t *mem_cred_create()
.cache_cert = (void*)nop,
},
.add_cert = _add_cert,
+ .add_cert_ref = _add_cert_ref,
.add_key = _add_key,
.add_shared = _add_shared,
.add_shared_list = _add_shared_list,
diff --git a/src/libstrongswan/credentials/sets/mem_cred.h b/src/libstrongswan/credentials/sets/mem_cred.h
index c858ba972..3db57df3e 100644
--- a/src/libstrongswan/credentials/sets/mem_cred.h
+++ b/src/libstrongswan/credentials/sets/mem_cred.h
@@ -47,6 +47,17 @@ struct mem_cred_t {
void (*add_cert)(mem_cred_t *this, bool trusted, certificate_t *cert);
/**
+ * Add a certificate to the credential set, returning a reference to it or
+ * to a cached duplicate.
+ *
+ * @param trusted TRUE to serve certificate as trusted
+ * @param cert certificate, reference gets owned by set
+ * @return reference to cert or a previously cached duplicate
+ */
+ certificate_t *(*add_cert_ref)(mem_cred_t *this, bool trusted,
+ certificate_t *cert);
+
+ /**
* Add a private key to the credential set.
*
* @param key key, reference gets owned by set