• 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 #ifndef CONTENT_CHILD_WEBCRYPTO_OPENSSL_KEY_OPENSSL_H_
6 #define CONTENT_CHILD_WEBCRYPTO_OPENSSL_KEY_OPENSSL_H_
7 
8 #include <openssl/ossl_typ.h>
9 #include <stdint.h>
10 #include <vector>
11 
12 #include "base/macros.h"
13 #include "crypto/scoped_openssl_types.h"
14 #include "third_party/WebKit/public/platform/WebCryptoKey.h"
15 
16 namespace content {
17 
18 namespace webcrypto {
19 
20 class CryptoData;
21 class AsymKeyOpenSsl;
22 class SymKeyOpenSsl;
23 
24 // Base key class for all OpenSSL keys, used to safely cast between types. Each
25 // key maintains a copy of its serialized form in either 'raw', 'pkcs8', or
26 // 'spki' format. This is to allow structured cloning of keys synchronously from
27 // the target Blink thread without having to lock access to the key.
28 class KeyOpenSsl : public blink::WebCryptoKeyHandle {
29  public:
30   explicit KeyOpenSsl(const CryptoData& serialized_key_data);
31   virtual ~KeyOpenSsl();
32 
33   virtual SymKeyOpenSsl* AsSymKey();
34   virtual AsymKeyOpenSsl* AsAsymKey();
35 
serialized_key_data()36   const std::vector<uint8_t>& serialized_key_data() const {
37     return serialized_key_data_;
38   }
39 
40  private:
41   const std::vector<uint8_t> serialized_key_data_;
42 };
43 
44 class SymKeyOpenSsl : public KeyOpenSsl {
45  public:
46   virtual ~SymKeyOpenSsl();
47   explicit SymKeyOpenSsl(const CryptoData& raw_key_data);
48 
49   static SymKeyOpenSsl* Cast(const blink::WebCryptoKey& key);
50 
51   virtual SymKeyOpenSsl* AsSymKey() OVERRIDE;
52 
raw_key_data()53   const std::vector<uint8_t>& raw_key_data() const {
54     return serialized_key_data();
55   }
56 
57  private:
58   DISALLOW_COPY_AND_ASSIGN(SymKeyOpenSsl);
59 };
60 
61 class AsymKeyOpenSsl : public KeyOpenSsl {
62  public:
63   virtual ~AsymKeyOpenSsl();
64   AsymKeyOpenSsl(crypto::ScopedEVP_PKEY key,
65                  const CryptoData& serialized_key_data);
66 
67   static AsymKeyOpenSsl* Cast(const blink::WebCryptoKey& key);
68 
69   virtual AsymKeyOpenSsl* AsAsymKey() OVERRIDE;
70 
key()71   EVP_PKEY* key() { return key_.get(); }
72 
73  private:
74   crypto::ScopedEVP_PKEY key_;
75 
76   DISALLOW_COPY_AND_ASSIGN(AsymKeyOpenSsl);
77 };
78 
79 }  // namespace webcrypto
80 
81 }  // namespace content
82 
83 #endif  // CONTENT_CHILD_WEBCRYPTO_OPENSSL_KEY_OPENSSL_H_
84