// Copyright 2019 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #ifndef UTIL_CRYPTO_RSA_PRIVATE_KEY_H_ #define UTIL_CRYPTO_RSA_PRIVATE_KEY_H_ #include #include #include #include #include #include #include "platform/base/error.h" #include "platform/base/macros.h" namespace openscreen { // Encapsulates an RSA private key. Can be used to generate new keys, export // keys to other formats, or to extract a public key. class RSAPrivateKey { public: RSAPrivateKey(RSAPrivateKey&& other) noexcept = default; RSAPrivateKey& operator=(RSAPrivateKey&& other) = default; ~RSAPrivateKey(); // Create a new random instance. Can return nullptr if initialization fails. static ErrorOr Create(uint16_t num_bits); // Create a new instance by importing an existing private key. The format is // an ASN.1-encoded PrivateKeyInfo block from PKCS #8. static ErrorOr CreateFromPrivateKeyInfo( const std::vector& input); // Create a new instance from an existing EVP_PKEY, taking a // reference to it. |key| must be an RSA key. static ErrorOr CreateFromKey(EVP_PKEY* key); // Creates a copy of the object. ErrorOr Copy() const; EVP_PKEY* key() { return key_.get(); } const EVP_PKEY* key() const { return key_.get(); } // Exports the private key to a PKCS #8 PrivateKeyInfo block. ErrorOr> ExportPrivateKey() const; // Exports the public key to an X509 SubjectPublicKeyInfo block. ErrorOr> ExportPublicKey() const; private: // Constructor is private. Use one of the Create*() methods above instead. RSAPrivateKey(); bssl::UniquePtr key_; OSP_DISALLOW_COPY_AND_ASSIGN(RSAPrivateKey); }; } // namespace openscreen #endif // UTIL_CRYPTO_RSA_PRIVATE_KEY_H_