1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59
|
#include "util/read_key.h"
#include <openssl/pem.h>
#include <memory>
using std::unique_ptr;
namespace cert_trans {
namespace {
void FileCloser(FILE* fp) {
if (fp) {
fclose(fp);
}
}
} // namespace
util::StatusOr<EVP_PKEY*> ReadPrivateKey(const std::string& file) {
unique_ptr<FILE, void (*)(FILE*)> fp(fopen(file.c_str(), "r"), FileCloser);
if (!fp) {
return util::Status(util::error::NOT_FOUND, "key file not found: " + file);
}
// No password.
EVP_PKEY* retval(nullptr);
PEM_read_PrivateKey(fp.get(), &retval, nullptr, nullptr);
if (!retval)
return util::Status(util::error::FAILED_PRECONDITION,
"invalid key: " + file);
return retval;
}
util::StatusOr<EVP_PKEY*> ReadPublicKey(const std::string& file) {
unique_ptr<FILE, void (*)(FILE*)> fp(fopen(file.c_str(), "r"), FileCloser);
if (!fp) {
return util::Status(util::error::NOT_FOUND, "key file not found: " + file);
}
// No password.
EVP_PKEY* retval(nullptr);
PEM_read_PUBKEY(fp.get(), &retval, nullptr, nullptr);
if (!retval)
return util::Status(util::error::FAILED_PRECONDITION,
"invalid key: " + file);
return retval;
}
} // namespace cert_trans
|