blob: a9dcf1247bcc7b9120b7a4ecca4facff6a85b80a [file] [log] [blame]
// 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.
#include "util/crypto/pem_helpers.h"
#include <openssl/bytestring.h>
#include <openssl/pem.h>
#include <openssl/rsa.h>
#include <stdio.h>
#include <string.h>
#include "absl/strings/match.h"
#include "util/osp_logging.h"
namespace openscreen {
std::vector<std::string> ReadCertificatesFromPemFile(
absl::string_view filename) {
FILE* fp = fopen(filename.data(), "r");
if (!fp) {
return {};
}
std::vector<std::string> certs;
char* name;
char* header;
unsigned char* data;
long length; // NOLINT
while (PEM_read(fp, &name, &header, &data, &length) == 1) {
if (absl::StartsWith(name, "CERTIFICATE")) {
certs.emplace_back(reinterpret_cast<char*>(data), length);
}
OPENSSL_free(name);
OPENSSL_free(header);
OPENSSL_free(data);
}
fclose(fp);
return certs;
}
bssl::UniquePtr<EVP_PKEY> ReadKeyFromPemFile(absl::string_view filename) {
FILE* fp = fopen(filename.data(), "r");
if (!fp) {
return nullptr;
}
bssl::UniquePtr<EVP_PKEY> pkey;
char* name;
char* header;
unsigned char* data;
long length; // NOLINT
while (PEM_read(fp, &name, &header, &data, &length) == 1) {
if (absl::StartsWith(name, "RSA PRIVATE KEY")) {
OSP_DCHECK(!pkey);
CBS cbs;
CBS_init(&cbs, data, length);
RSA* rsa = RSA_parse_private_key(&cbs);
if (rsa) {
pkey.reset(EVP_PKEY_new());
EVP_PKEY_assign_RSA(pkey.get(), rsa);
}
}
OPENSSL_free(name);
OPENSSL_free(header);
OPENSSL_free(data);
}
fclose(fp);
return pkey;
}
} // namespace openscreen