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 12 namespace content { 13 14 namespace webcrypto { 15 16 namespace { 17 18 // This class is used as a singleton. All methods must be threadsafe. 19 class AlgorithmRegistry { 20 public: AlgorithmRegistry()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 GetAlgorithm(blink::WebCryptoAlgorithmId id) const33 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 73 base::LazyInstance<AlgorithmRegistry>::Leaky g_algorithm_registry = 74 LAZY_INSTANCE_INITIALIZER; 75 GetAlgorithmImplementation(blink::WebCryptoAlgorithmId id,const AlgorithmImplementation ** impl)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