diff options
Diffstat (limited to 'cast/common/certificate/test_helpers.cc')
-rw-r--r-- | cast/common/certificate/test_helpers.cc | 85 |
1 files changed, 85 insertions, 0 deletions
diff --git a/cast/common/certificate/test_helpers.cc b/cast/common/certificate/test_helpers.cc index d64f10c4..fa04a2e9 100644 --- a/cast/common/certificate/test_helpers.cc +++ b/cast/common/certificate/test_helpers.cc @@ -8,10 +8,35 @@ #include <stdio.h> #include <string.h> +#include "platform/api/logging.h" + namespace cast { namespace certificate { namespace testing { +std::string ReadEntireFileToString(const std::string& filename) { + FILE* file = fopen(filename.c_str(), "r"); + if (file == nullptr) { + return {}; + } + fseek(file, 0, SEEK_END); + long file_size = ftell(file); + fseek(file, 0, SEEK_SET); + std::string contents(file_size, 0); + int bytes_read = 0; + while (bytes_read < file_size) { + size_t ret = fread(&contents[bytes_read], 1, file_size - bytes_read, file); + if (ret == 0 && ferror(file)) { + return {}; + } else { + bytes_read += ret; + } + } + fclose(file); + + return contents; +} + std::vector<std::string> ReadCertificatesFromPemFile( const std::string& filename) { FILE* fp = fopen(filename.c_str(), "r"); @@ -40,6 +65,66 @@ std::vector<std::string> ReadCertificatesFromPemFile( return certs; } +SignatureTestData::SignatureTestData() + : message{nullptr, 0}, sha1{nullptr, 0}, sha256{nullptr, 0} {} + +SignatureTestData::~SignatureTestData() { + OPENSSL_free(const_cast<uint8_t*>(message.data)); + OPENSSL_free(const_cast<uint8_t*>(sha1.data)); + OPENSSL_free(const_cast<uint8_t*>(sha256.data)); +} + +SignatureTestData ReadSignatureTestData(const std::string& filename) { + FILE* fp = fopen(filename.c_str(), "r"); + OSP_DCHECK(fp); + SignatureTestData result = {}; + for (;;) { + char* name; + char* header; + unsigned char* data; + long length; + if (PEM_read(fp, &name, &header, &data, &length) == 1) { + if (strcmp(name, "MESSAGE") == 0) { + OSP_DCHECK(!result.message.data); + result.message.data = data; + result.message.length = length; + } else if (strcmp(name, "SIGNATURE SHA1") == 0) { + OSP_DCHECK(!result.sha1.data); + result.sha1.data = data; + result.sha1.length = length; + } else if (strcmp(name, "SIGNATURE SHA256") == 0) { + OSP_DCHECK(!result.sha256.data); + result.sha256.data = data; + result.sha256.length = length; + } else { + OPENSSL_free(data); + } + OPENSSL_free(name); + OPENSSL_free(header); + } else { + break; + } + } + OSP_DCHECK(result.message.data); + OSP_DCHECK(result.sha1.data); + OSP_DCHECK(result.sha256.data); + + return result; +} + +std::unique_ptr<TrustStore> CreateTrustStoreFromPemFile( + const std::string& filename) { + std::unique_ptr<TrustStore> store = std::make_unique<TrustStore>(); + + std::vector<std::string> certs = + testing::ReadCertificatesFromPemFile(filename); + for (const auto& der_cert : certs) { + const uint8_t* data = (const uint8_t*)der_cert.data(); + store->certs.emplace_back(d2i_X509(nullptr, &data, der_cert.size())); + } + return store; +} + } // namespace testing } // namespace certificate } // namespace cast |