• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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)76 Status 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