// Copyright 2015 The Chromium Authors // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #include "components/webcrypto/blink_key_handle.h" #include #include "base/check_op.h" #include "third_party/boringssl/src/include/openssl/evp.h" namespace webcrypto { namespace { class SymKey; class AsymKey; // Base class for wrapping OpenSSL keys in a type that can be passed to // Blink (blink::WebCryptoKeyHandle). class Key : public blink::WebCryptoKeyHandle { public: // Helpers to add some safety to casting. virtual SymKey* AsSymKey() { return nullptr; } virtual AsymKey* AsAsymKey() { return nullptr; } }; class SymKey : public Key { public: explicit SymKey(base::span raw_key_data) : raw_key_data_(raw_key_data.begin(), raw_key_data.end()) {} SymKey(const SymKey&) = delete; SymKey& operator=(const SymKey&) = delete; SymKey* AsSymKey() override { return this; } const std::vector& raw_key_data() const { return raw_key_data_; } private: std::vector raw_key_data_; }; class AsymKey : public Key { public: // After construction the |pkey| should NOT be mutated. explicit AsymKey(bssl::UniquePtr pkey) : pkey_(std::move(pkey)) {} AsymKey(const AsymKey&) = delete; AsymKey& operator=(const AsymKey&) = delete; AsymKey* AsAsymKey() override { return this; } // The caller should NOT mutate this EVP_PKEY. EVP_PKEY* pkey() { return pkey_.get(); } private: bssl::UniquePtr pkey_; }; Key* GetKey(const blink::WebCryptoKey& key) { return static_cast(key.Handle()); } } // namespace const std::vector& GetSymmetricKeyData( const blink::WebCryptoKey& key) { DCHECK_EQ(blink::kWebCryptoKeyTypeSecret, key.GetType()); return GetKey(key)->AsSymKey()->raw_key_data(); } EVP_PKEY* GetEVP_PKEY(const blink::WebCryptoKey& key) { DCHECK_NE(blink::kWebCryptoKeyTypeSecret, key.GetType()); return GetKey(key)->AsAsymKey()->pkey(); } blink::WebCryptoKeyHandle* CreateSymmetricKeyHandle( base::span key_bytes) { return new SymKey(key_bytes); } blink::WebCryptoKeyHandle* CreateAsymmetricKeyHandle( bssl::UniquePtr pkey) { return new AsymKey(std::move(pkey)); } } // namespace webcrypto