1// Copyright 2014 The Chromium Authors. All rights reserved. 2// Use of this source code is governed by a BSD-style license that can be 3// found in the LICENSE file. 4 5#include "content/child/webcrypto/algorithm_registry.h" 6 7#include "base/lazy_instance.h" 8#include "content/child/webcrypto/algorithm_implementation.h" 9#include "content/child/webcrypto/platform_crypto.h" 10#include "content/child/webcrypto/status.h" 11 12namespace content { 13 14namespace webcrypto { 15 16namespace { 17 18// This class is used as a singleton. All methods must be threadsafe. 19class AlgorithmRegistry { 20 public: 21 AlgorithmRegistry() 22 : sha_(CreatePlatformShaImplementation()), 23 aes_gcm_(CreatePlatformAesGcmImplementation()), 24 aes_cbc_(CreatePlatformAesCbcImplementation()), 25 aes_ctr_(CreatePlatformAesCtrImplementation()), 26 aes_kw_(CreatePlatformAesKwImplementation()), 27 hmac_(CreatePlatformHmacImplementation()), 28 rsa_ssa_(CreatePlatformRsaSsaImplementation()), 29 rsa_oaep_(CreatePlatformRsaOaepImplementation()) { 30 PlatformInit(); 31 } 32 33 const AlgorithmImplementation* GetAlgorithm( 34 blink::WebCryptoAlgorithmId id) const { 35 switch (id) { 36 case blink::WebCryptoAlgorithmIdSha1: 37 case blink::WebCryptoAlgorithmIdSha256: 38 case blink::WebCryptoAlgorithmIdSha384: 39 case blink::WebCryptoAlgorithmIdSha512: 40 return sha_.get(); 41 case blink::WebCryptoAlgorithmIdAesGcm: 42 return aes_gcm_.get(); 43 case blink::WebCryptoAlgorithmIdAesCbc: 44 return aes_cbc_.get(); 45 case blink::WebCryptoAlgorithmIdAesCtr: 46 return aes_ctr_.get(); 47 case blink::WebCryptoAlgorithmIdAesKw: 48 return aes_kw_.get(); 49 case blink::WebCryptoAlgorithmIdHmac: 50 return hmac_.get(); 51 case blink::WebCryptoAlgorithmIdRsaSsaPkcs1v1_5: 52 return rsa_ssa_.get(); 53 case blink::WebCryptoAlgorithmIdRsaOaep: 54 return rsa_oaep_.get(); 55 default: 56 return NULL; 57 } 58 } 59 60 private: 61 const scoped_ptr<AlgorithmImplementation> sha_; 62 const scoped_ptr<AlgorithmImplementation> aes_gcm_; 63 const scoped_ptr<AlgorithmImplementation> aes_cbc_; 64 const scoped_ptr<AlgorithmImplementation> aes_ctr_; 65 const scoped_ptr<AlgorithmImplementation> aes_kw_; 66 const scoped_ptr<AlgorithmImplementation> hmac_; 67 const scoped_ptr<AlgorithmImplementation> rsa_ssa_; 68 const scoped_ptr<AlgorithmImplementation> rsa_oaep_; 69}; 70 71} // namespace 72 73base::LazyInstance<AlgorithmRegistry>::Leaky g_algorithm_registry = 74 LAZY_INSTANCE_INITIALIZER; 75 76Status GetAlgorithmImplementation(blink::WebCryptoAlgorithmId id, 77 const AlgorithmImplementation** impl) { 78 *impl = g_algorithm_registry.Get().GetAlgorithm(id); 79 if (*impl) 80 return Status::Success(); 81 return Status::ErrorUnsupported(); 82} 83 84} // namespace webcrypto 85 86} // namespace content 87