1*3f982cf4SFabien Sanglard // Copyright 2019 The Chromium Authors. All rights reserved. 2*3f982cf4SFabien Sanglard // Use of this source code is governed by a BSD-style license that can be 3*3f982cf4SFabien Sanglard // found in the LICENSE file. 4*3f982cf4SFabien Sanglard 5*3f982cf4SFabien Sanglard #ifndef UTIL_CRYPTO_RSA_PRIVATE_KEY_H_ 6*3f982cf4SFabien Sanglard #define UTIL_CRYPTO_RSA_PRIVATE_KEY_H_ 7*3f982cf4SFabien Sanglard 8*3f982cf4SFabien Sanglard #include <openssl/base.h> 9*3f982cf4SFabien Sanglard #include <openssl/evp.h> 10*3f982cf4SFabien Sanglard #include <stddef.h> 11*3f982cf4SFabien Sanglard #include <stdint.h> 12*3f982cf4SFabien Sanglard 13*3f982cf4SFabien Sanglard #include <memory> 14*3f982cf4SFabien Sanglard #include <vector> 15*3f982cf4SFabien Sanglard 16*3f982cf4SFabien Sanglard #include "platform/base/error.h" 17*3f982cf4SFabien Sanglard #include "platform/base/macros.h" 18*3f982cf4SFabien Sanglard 19*3f982cf4SFabien Sanglard namespace openscreen { 20*3f982cf4SFabien Sanglard 21*3f982cf4SFabien Sanglard // Encapsulates an RSA private key. Can be used to generate new keys, export 22*3f982cf4SFabien Sanglard // keys to other formats, or to extract a public key. 23*3f982cf4SFabien Sanglard class RSAPrivateKey { 24*3f982cf4SFabien Sanglard public: 25*3f982cf4SFabien Sanglard RSAPrivateKey(RSAPrivateKey&& other) noexcept = default; 26*3f982cf4SFabien Sanglard RSAPrivateKey& operator=(RSAPrivateKey&& other) = default; 27*3f982cf4SFabien Sanglard ~RSAPrivateKey(); 28*3f982cf4SFabien Sanglard 29*3f982cf4SFabien Sanglard // Create a new random instance. Can return nullptr if initialization fails. 30*3f982cf4SFabien Sanglard static ErrorOr<RSAPrivateKey> Create(uint16_t num_bits); 31*3f982cf4SFabien Sanglard 32*3f982cf4SFabien Sanglard // Create a new instance by importing an existing private key. The format is 33*3f982cf4SFabien Sanglard // an ASN.1-encoded PrivateKeyInfo block from PKCS #8. 34*3f982cf4SFabien Sanglard static ErrorOr<RSAPrivateKey> CreateFromPrivateKeyInfo( 35*3f982cf4SFabien Sanglard const std::vector<uint8_t>& input); 36*3f982cf4SFabien Sanglard 37*3f982cf4SFabien Sanglard // Create a new instance from an existing EVP_PKEY, taking a 38*3f982cf4SFabien Sanglard // reference to it. |key| must be an RSA key. 39*3f982cf4SFabien Sanglard static ErrorOr<RSAPrivateKey> CreateFromKey(EVP_PKEY* key); 40*3f982cf4SFabien Sanglard 41*3f982cf4SFabien Sanglard // Creates a copy of the object. 42*3f982cf4SFabien Sanglard ErrorOr<RSAPrivateKey> Copy() const; 43*3f982cf4SFabien Sanglard key()44*3f982cf4SFabien Sanglard EVP_PKEY* key() { return key_.get(); } key()45*3f982cf4SFabien Sanglard const EVP_PKEY* key() const { return key_.get(); } 46*3f982cf4SFabien Sanglard 47*3f982cf4SFabien Sanglard // Exports the private key to a PKCS #8 PrivateKeyInfo block. 48*3f982cf4SFabien Sanglard ErrorOr<std::vector<uint8_t>> ExportPrivateKey() const; 49*3f982cf4SFabien Sanglard 50*3f982cf4SFabien Sanglard // Exports the public key to an X509 SubjectPublicKeyInfo block. 51*3f982cf4SFabien Sanglard ErrorOr<std::vector<uint8_t>> ExportPublicKey() const; 52*3f982cf4SFabien Sanglard 53*3f982cf4SFabien Sanglard private: 54*3f982cf4SFabien Sanglard // Constructor is private. Use one of the Create*() methods above instead. 55*3f982cf4SFabien Sanglard RSAPrivateKey(); 56*3f982cf4SFabien Sanglard 57*3f982cf4SFabien Sanglard bssl::UniquePtr<EVP_PKEY> key_; 58*3f982cf4SFabien Sanglard 59*3f982cf4SFabien Sanglard OSP_DISALLOW_COPY_AND_ASSIGN(RSAPrivateKey); 60*3f982cf4SFabien Sanglard }; 61*3f982cf4SFabien Sanglard 62*3f982cf4SFabien Sanglard } // namespace openscreen 63*3f982cf4SFabien Sanglard 64*3f982cf4SFabien Sanglard #endif // UTIL_CRYPTO_RSA_PRIVATE_KEY_H_ 65