X-Git-Url: http://www.project-moonshot.org/gitweb/?p=shibboleth%2Fcpp-xmltooling.git;a=blobdiff_plain;f=xmltooling%2Fsignature%2Fimpl%2FFilesystemCredentialResolver.cpp;h=c4362d5b9acdcb3cd6862bece2fc25266c9c4305;hp=86e70b12159c7b932f691ac67907b99dd2a75f0f;hb=a21d1f24fc3fb85928b014b69c0e6916dcb66955;hpb=39502d6e48aec30be6d00ca60575b9a4cf414733 diff --git a/xmltooling/signature/impl/FilesystemCredentialResolver.cpp b/xmltooling/signature/impl/FilesystemCredentialResolver.cpp index 86e70b1..c4362d5 100644 --- a/xmltooling/signature/impl/FilesystemCredentialResolver.cpp +++ b/xmltooling/signature/impl/FilesystemCredentialResolver.cpp @@ -21,13 +21,11 @@ */ #include "internal.h" +#include "signature/KeyResolver.h" #include "signature/OpenSSLCredentialResolver.h" #include "util/NDC.h" #include "util/XMLHelper.h" -using namespace xmlsignature; -using namespace xmltooling; - #include #include #include @@ -58,20 +56,31 @@ static int passwd_callback(char* buf, int len, int verify, void* passwd) } namespace xmlsignature { - class FilesystemCredentialResolver : public CredentialResolver + class FilesystemCredentialResolver : public OpenSSLCredentialResolver, public KeyResolver { public: FilesystemCredentialResolver(const DOMElement* e); - ~FilesystemCredentialResolver(); + virtual ~FilesystemCredentialResolver(); Lockable* lock() { return this; } void unlock() {} XSECCryptoKey* loadKey(); - void attach(SSL_CTX* ctx) const; - XSECCryptoKey* getKey() const { return m_key->clone(); } + XSECCryptoKey* getKey() const { return m_key ? m_key->clone() : NULL; } const vector& getCertificates() const { return m_xseccerts; } + void attach(SSL_CTX* ctx) const; + + XSECCryptoKey* resolveKey(const KeyInfo* keyInfo) const { return m_key ? m_key->clone() : NULL; } + XSECCryptoKey* resolveKey(DSIGKeyInfoList* keyInfo) const { return m_key ? m_key->clone() : NULL; } + vector::size_type resolveCertificates(const KeyInfo* keyInfo, vector& certs) const { + certs.assign(m_xseccerts.begin(), m_xseccerts.end()); + return certs.size(); + } + vector::size_type resolveCertificates(DSIGKeyInfoList* keyInfo, vector& certs) const { + certs.assign(m_xseccerts.begin(), m_xseccerts.end()); + return certs.size(); + } private: enum format_t { PEM=SSL_FILETYPE_PEM, DER=SSL_FILETYPE_ASN1, _PKCS12, UNKNOWN }; @@ -91,6 +100,11 @@ namespace xmlsignature { { return new FilesystemCredentialResolver(e); } + + KeyResolver* XMLTOOL_DLLLOCAL FilesystemKeyResolverFactory(const DOMElement* const & e) + { + return new FilesystemCredentialResolver(e); + } }; static const XMLCh CAPath[] = UNICODE_LITERAL_6(C,A,P,a,t,h); @@ -100,7 +114,7 @@ static const XMLCh Key[] = UNICODE_LITERAL_3(K,e,y); static const XMLCh password[] = UNICODE_LITERAL_8(p,a,s,s,w,o,r,d); static const XMLCh Path[] = UNICODE_LITERAL_4(P,a,t,h); -FilesystemCredentialResolver::FilesystemCredentialResolver(const DOMElement* e) +FilesystemCredentialResolver::FilesystemCredentialResolver(const DOMElement* e) : m_key(NULL) { #ifdef _DEBUG NDC ndc("FilesystemCredentialResolver"); @@ -399,6 +413,7 @@ XSECCryptoKey* FilesystemCredentialResolver::loadKey() FilesystemCredentialResolver::~FilesystemCredentialResolver() { + delete m_key; for_each(m_certs.begin(),m_certs.end(),X509_free); for_each(m_xseccerts.begin(),m_xseccerts.end(),xmltooling::cleanup()); }