CryptoAlgorithmRegistry.cpp [plain text]
#include "config.h"
#include "CryptoAlgorithmRegistry.h"
#if ENABLE(SUBTLE_CRYPTO)
#include "CryptoAlgorithm.h"
#include <mutex>
#include <wtf/NeverDestroyed.h>
namespace WebCore {
CryptoAlgorithmRegistry& CryptoAlgorithmRegistry::shared()
{
static NeverDestroyed<CryptoAlgorithmRegistry> registry;
return registry;
}
static std::mutex& registryMutex()
{
static std::once_flag onceFlag;
static LazyNeverDestroyed<std::mutex> mutex;
std::call_once(onceFlag, []{
mutex.construct();
});
return mutex;
}
CryptoAlgorithmRegistry::CryptoAlgorithmRegistry()
{
platformRegisterAlgorithms();
}
bool CryptoAlgorithmRegistry::getIdentifierForName(const String& name, CryptoAlgorithmIdentifier& result)
{
if (name.isEmpty())
return false;
std::lock_guard<std::mutex> 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<std::mutex> lock(registryMutex());
return m_identifierToNameMap.get(static_cast<unsigned>(identifier)).isolatedCopy();
}
std::unique_ptr<CryptoAlgorithm> CryptoAlgorithmRegistry::create(CryptoAlgorithmIdentifier identifier)
{
std::lock_guard<std::mutex> 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<std::mutex> 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)