+CredentialCriteria::CredentialCriteria()
+ : m_keyUsage(Credential::UNSPECIFIED_CREDENTIAL), m_keySize(0), m_key(nullptr),
+ m_keyInfo(nullptr), m_nativeKeyInfo(nullptr), m_credential(nullptr)
+{
+}
+
+CredentialCriteria::~CredentialCriteria()
+{
+ delete m_credential;
+}
+
+unsigned int CredentialCriteria::getUsage() const
+{
+ return m_keyUsage;
+}
+
+void CredentialCriteria::setUsage(unsigned int usage)
+{
+ m_keyUsage = usage;
+}
+
+const char* CredentialCriteria::getPeerName() const
+{
+ return m_peerName.c_str();
+}
+
+void CredentialCriteria::setPeerName(const char* peerName)
+{
+ m_peerName.erase();
+ if (peerName)
+ m_peerName = peerName;
+}
+
+const char* CredentialCriteria::getKeyAlgorithm() const
+{
+ return m_keyAlgorithm.c_str();
+}
+
+void CredentialCriteria::setKeyAlgorithm(const char* keyAlgorithm)
+{
+ m_keyAlgorithm.erase();
+ if (keyAlgorithm)
+ m_keyAlgorithm = keyAlgorithm;
+}
+
+unsigned int CredentialCriteria::getKeySize() const
+{
+ return m_keySize;
+}
+
+void CredentialCriteria::setKeySize(unsigned int keySize)
+{
+ m_keySize = keySize;
+}
+
+void CredentialCriteria::setXMLAlgorithm(const XMLCh* algorithm)
+{
+ if (algorithm) {
+ pair<const char*,unsigned int> mapped = XMLToolingConfig::getConfig().mapXMLAlgorithmToKeyAlgorithm(algorithm);
+ setKeyAlgorithm(mapped.first);
+ setKeySize(mapped.second);
+ }
+ else {
+ setKeyAlgorithm(nullptr);
+ setKeySize(0);
+ }
+}
+
+const set<string>& CredentialCriteria::getKeyNames() const
+{
+ return m_keyNames;
+}
+
+set<string>& CredentialCriteria::getKeyNames()
+{
+ return m_keyNames;
+}
+
+XSECCryptoKey* CredentialCriteria::getPublicKey() const
+{
+ return m_key;
+}
+
+void CredentialCriteria::setPublicKey(XSECCryptoKey* key)
+{
+ m_key = key;
+}
+
+const KeyInfo* CredentialCriteria::getKeyInfo() const
+{
+ return m_keyInfo;
+}
+
+void CredentialCriteria::setKeyInfo(const KeyInfo* keyInfo, int extraction)
+{
+ delete m_credential;
+ m_credential = nullptr;
+ m_keyInfo = keyInfo;
+ if (!keyInfo || !extraction)
+ return;
+
+ int types = (extraction & KEYINFO_EXTRACTION_KEY) ? Credential::RESOLVE_KEYS : 0;
+ types |= (extraction & KEYINFO_EXTRACTION_KEYNAMES) ? X509Credential::RESOLVE_CERTS : 0;
+ m_credential = XMLToolingConfig::getConfig().getKeyInfoResolver()->resolve(keyInfo,types);
+
+ // Ensure any key names have been sucked out for later if desired.
+ if (extraction & KEYINFO_EXTRACTION_KEYNAMES) {
+ X509Credential* xcred = dynamic_cast<X509Credential*>(m_credential);
+ if (xcred)
+ xcred->extract();
+ }
+}
+
+DSIGKeyInfoList* CredentialCriteria::getNativeKeyInfo() const
+{
+ return m_nativeKeyInfo;
+}
+
+void CredentialCriteria::setNativeKeyInfo(DSIGKeyInfoList* keyInfo, int extraction)
+{
+ delete m_credential;
+ m_credential = nullptr;
+ m_nativeKeyInfo = keyInfo;
+ if (!keyInfo || !extraction)
+ return;
+
+ int types = (extraction & KEYINFO_EXTRACTION_KEY) ? Credential::RESOLVE_KEYS : 0;
+ types |= (extraction & KEYINFO_EXTRACTION_KEYNAMES) ? X509Credential::RESOLVE_CERTS : 0;
+ m_credential = XMLToolingConfig::getConfig().getKeyInfoResolver()->resolve(keyInfo,types);
+
+ // Ensure any key names have been sucked out for later if desired.
+ if (extraction & KEYINFO_EXTRACTION_KEYNAMES) {
+ X509Credential* xcred = dynamic_cast<X509Credential*>(m_credential);
+ if (xcred)
+ xcred->extract();
+ }
+}
+
+void CredentialCriteria::setSignature(const Signature& sig, int extraction)
+{
+ setXMLAlgorithm(sig.getSignatureAlgorithm());
+ KeyInfo* k = sig.getKeyInfo();
+ if (k)
+ return setKeyInfo(k, extraction);
+ DSIGSignature* dsig = sig.getXMLSignature();
+ if (dsig)
+ setNativeKeyInfo(dsig->getKeyInfoList(), extraction);
+}
+