diff --git a/libwvdrmengine/tools/factory_upload_tool/cli.cpp b/libwvdrmengine/tools/factory_upload_tool/cli.cpp index 76468be2..9e88e4fd 100644 --- a/libwvdrmengine/tools/factory_upload_tool/cli.cpp +++ b/libwvdrmengine/tools/factory_upload_tool/cli.cpp @@ -6,6 +6,8 @@ #define LOG_TAG "wv_factory_extraction_tool" +#include +#include #include #include @@ -18,8 +20,10 @@ #include #include "WidevineProvisioner.h" +#include "log.h" +#include "properties.h" -constexpr size_t kChallengeSize = 32; +constexpr size_t kChallengeSize = 64; // The Google root key for the Endpoint Encryption Key chain, encoded as // COSE_Sign1 @@ -121,15 +125,38 @@ cppbor::Array getCsr(widevine::WidevineProvisioner& provisioner) { return csr; } -std::vector getCsrV3(widevine::WidevineProvisioner& provisioner) { +std::unique_ptr composeCertificateRequestV3( + const std::vector& csr) { + auto [parsedCsr, _, csrErrMsg] = cppbor::parse(csr); + if (!parsedCsr) { + LOGE("Failed to parse input CSR."); + return nullptr; + } + if (!parsedCsr->asArray()) { + LOGE("Input CSR is not a CBOR array."); + return nullptr; + } + std::string fingerPrint; + if (!wvcdm::Properties::GetBuildInfo(&fingerPrint)) { + LOGE("Failed to get finger print."); + return nullptr; + } + + cppbor::Map unverifiedDeviceInfo = + cppbor::Map().add("fingerprint", cppbor::Tstr(fingerPrint)); + parsedCsr->asArray()->add(std::move(unverifiedDeviceInfo)); + return std::unique_ptr(parsedCsr.release()->asArray()); +} + +std::unique_ptr getCsrV3( + widevine::WidevineProvisioner& provisioner) { const std::vector challenge = generateChallenge(); std::vector csr; - if (!provisioner.GenerateCertificateRequestV2(challenge, &csr)) { std::cerr << "Failed to generate certificate request v2." << std::endl; exit(-1); } - return csr; + return composeCertificateRequestV3(csr); } int main(int argc, char** argv) { @@ -155,7 +182,11 @@ int main(int argc, char** argv) { std::ostream_iterator(std::cout)); } else if (!std::strcmp(argv[1], "csr_v3")) { auto csr = getCsrV3(provisioner); - std::copy(csr.begin(), csr.end(), std::ostream_iterator(std::cout)); + if (csr != nullptr) { + auto bytes = csr->encode(); + std::copy(bytes.begin(), bytes.end(), + std::ostream_iterator(std::cout)); + } } return 0; }