// Copyright 2014 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #include "components/webcrypto/algorithm_registry.h" #include "base/lazy_instance.h" #include "components/webcrypto/algorithm_implementation.h" #include "components/webcrypto/platform_crypto.h" #include "components/webcrypto/status.h" namespace webcrypto { namespace { // This class is used as a singleton. All methods must be threadsafe. class AlgorithmRegistry { public: AlgorithmRegistry() : sha_(CreatePlatformShaImplementation()), aes_gcm_(CreatePlatformAesGcmImplementation()), aes_cbc_(CreatePlatformAesCbcImplementation()), aes_ctr_(CreatePlatformAesCtrImplementation()), aes_kw_(CreatePlatformAesKwImplementation()), hmac_(CreatePlatformHmacImplementation()), rsa_ssa_(CreatePlatformRsaSsaImplementation()), rsa_oaep_(CreatePlatformRsaOaepImplementation()), rsa_pss_(CreatePlatformRsaPssImplementation()), ecdsa_(CreatePlatformEcdsaImplementation()), ecdh_(CreatePlatformEcdhImplementation()), hkdf_(CreatePlatformHkdfImplementation()), pbkdf2_(CreatePlatformPbkdf2Implementation()) { PlatformInit(); } const AlgorithmImplementation* GetAlgorithm( blink::WebCryptoAlgorithmId id) const { switch (id) { case blink::WebCryptoAlgorithmIdSha1: case blink::WebCryptoAlgorithmIdSha256: case blink::WebCryptoAlgorithmIdSha384: case blink::WebCryptoAlgorithmIdSha512: return sha_.get(); case blink::WebCryptoAlgorithmIdAesGcm: return aes_gcm_.get(); case blink::WebCryptoAlgorithmIdAesCbc: return aes_cbc_.get(); case blink::WebCryptoAlgorithmIdAesCtr: return aes_ctr_.get(); case blink::WebCryptoAlgorithmIdAesKw: return aes_kw_.get(); case blink::WebCryptoAlgorithmIdHmac: return hmac_.get(); case blink::WebCryptoAlgorithmIdRsaSsaPkcs1v1_5: return rsa_ssa_.get(); case blink::WebCryptoAlgorithmIdRsaOaep: return rsa_oaep_.get(); case blink::WebCryptoAlgorithmIdRsaPss: return rsa_pss_.get(); case blink::WebCryptoAlgorithmIdEcdsa: return ecdsa_.get(); case blink::WebCryptoAlgorithmIdEcdh: return ecdh_.get(); case blink::WebCryptoAlgorithmIdHkdf: return hkdf_.get(); case blink::WebCryptoAlgorithmIdPbkdf2: return pbkdf2_.get(); default: return NULL; } } private: const scoped_ptr sha_; const scoped_ptr aes_gcm_; const scoped_ptr aes_cbc_; const scoped_ptr aes_ctr_; const scoped_ptr aes_kw_; const scoped_ptr hmac_; const scoped_ptr rsa_ssa_; const scoped_ptr rsa_oaep_; const scoped_ptr rsa_pss_; const scoped_ptr ecdsa_; const scoped_ptr ecdh_; const scoped_ptr hkdf_; const scoped_ptr pbkdf2_; }; } // namespace base::LazyInstance::Leaky g_algorithm_registry = LAZY_INSTANCE_INITIALIZER; Status GetAlgorithmImplementation(blink::WebCryptoAlgorithmId id, const AlgorithmImplementation** impl) { *impl = g_algorithm_registry.Get().GetAlgorithm(id); if (*impl) return Status::Success(); return Status::ErrorUnsupported(); } } // namespace webcrypto