- struct XMLTOOL_DLLLOCAL CacheEntry {
- CacheEntry() : m_key(NULL), m_crl(NULL) {}
- ~CacheEntry() {
- delete m_key;
- for_each(m_certs.begin(),m_certs.end(),xmltooling::cleanup<XSECCryptoX509>());
- delete m_crl;
- }
- XSECCryptoKey* m_key;
- vector<XSECCryptoX509*> m_certs;
- XSECCryptoX509CRL* m_crl;
- };
-
- void _resolve(const KeyInfo* keyInfo, CacheEntry& entry) const;
- XSECCryptoKey* _resolveKey(const KeyInfo* keyInfo) const;
- vector<XSECCryptoX509*>::size_type _resolveCertificates(const KeyInfo* keyInfo, vector<XSECCryptoX509*>& certs) const;
- XSECCryptoX509CRL* _resolveCRL(const KeyInfo* keyInfo) const;
-
- RWLock* m_lock;
- mutable map<const KeyInfo*,CacheEntry> m_cache;
+ bool resolveCerts(const KeyInfo* keyInfo);
+ bool resolveKey(const KeyInfo* keyInfo);
+ bool resolveCRLs(const KeyInfo* keyInfo);
+
+ KeyInfoCredentialContext* m_credctx;
+ };
+
+ class XMLTOOL_DLLLOCAL InlineKeyResolver : public KeyInfoResolver
+ {
+ public:
+ InlineKeyResolver() {}
+ virtual ~InlineKeyResolver() {}
+
+ Credential* resolve(const KeyInfo* keyInfo, int types=0) const {
+ if (!keyInfo)
+ return NULL;
+ if (types == 0)
+ types = Credential::RESOLVE_KEYS|X509Credential::RESOLVE_CERTS|X509Credential::RESOLVE_CRLS;
+ auto_ptr<InlineCredential> credential(new InlineCredential(keyInfo));
+ credential->resolve(keyInfo, types);
+ return credential.release();
+ }
+ Credential* resolve(DSIGKeyInfoList* keyInfo, int types=0) const {
+ if (!keyInfo)
+ return NULL;
+ if (types == 0)
+ types = Credential::RESOLVE_KEYS|X509Credential::RESOLVE_CERTS|X509Credential::RESOLVE_CRLS;
+ auto_ptr<InlineCredential> credential(new InlineCredential(keyInfo));
+ credential->resolve(keyInfo, types);
+ return credential.release();
+ }
+ Credential* resolve(KeyInfoCredentialContext* context, int types=0) const {
+ if (!context)
+ return NULL;
+ if (types == 0)
+ types = Credential::RESOLVE_KEYS|X509Credential::RESOLVE_CERTS|X509Credential::RESOLVE_CRLS;
+ auto_ptr<InlineCredential> credential(new InlineCredential(context));
+ if (context->getKeyInfo())
+ credential->resolve(context->getKeyInfo(), types);
+ else if (context->getNativeKeyInfo())
+ credential->resolve(context->getNativeKeyInfo(), types);
+ credential->setCredentialContext(context);
+ return credential.release();
+ }