CryptoAlgorithmRegistry.cpp [plain text]
#include "config.h"
#include "CryptoAlgorithmRegistry.h"
#if ENABLE(SUBTLE_CRYPTO)
#include "CryptoAlgorithm.h"
#include <wtf/Lock.h>
#include <wtf/NeverDestroyed.h>
namespace WebCore {
CryptoAlgorithmRegistry& CryptoAlgorithmRegistry::singleton()
{
static NeverDestroyed<CryptoAlgorithmRegistry> registry;
return registry;
}
static StaticLock registryMutex;
CryptoAlgorithmRegistry::CryptoAlgorithmRegistry()
{
platformRegisterAlgorithms();
}
bool CryptoAlgorithmRegistry::getIdentifierForName(const String& name, CryptoAlgorithmIdentifier& result)
{
if (name.isEmpty())
return false;
std::lock_guard<StaticLock> lock(registryMutex);
auto iter = m_nameToIdentifierMap.find(name.isolatedCopy());
if (iter == m_nameToIdentifierMap.end())
return false;
result = iter->value;
return true;
}
String CryptoAlgorithmRegistry::nameForIdentifier(CryptoAlgorithmIdentifier identifier)
{
std::lock_guard<StaticLock> lock(registryMutex);
return m_identifierToNameMap.get(static_cast<unsigned>(identifier)).isolatedCopy();
}
RefPtr<CryptoAlgorithm> CryptoAlgorithmRegistry::create(CryptoAlgorithmIdentifier identifier)
{
std::lock_guard<StaticLock> lock(registryMutex);
auto iter = m_identifierToConstructorMap.find(static_cast<unsigned>(identifier));
if (iter == m_identifierToConstructorMap.end())
return nullptr;
return iter->value();
}
void CryptoAlgorithmRegistry::registerAlgorithm(const String& name, CryptoAlgorithmIdentifier identifier, CryptoAlgorithmConstructor constructor)
{
std::lock_guard<StaticLock> lock(registryMutex);
bool added = m_nameToIdentifierMap.add(name, identifier).isNewEntry;
ASSERT_UNUSED(added, added);
added = m_identifierToNameMap.add(static_cast<unsigned>(identifier), name).isNewEntry;
ASSERT_UNUSED(added, added);
added = m_identifierToConstructorMap.add(static_cast<unsigned>(identifier), constructor).isNewEntry;
ASSERT_UNUSED(added, added);
}
}
#endif // ENABLE(SUBTLE_CRYPTO)