Add install keybox tool and test
This adds an install keybox tool to the OEMCrypto unit test directory. It is built when we build the OPK w/linux IPC. This CL also adds some scripts to use this tool when running the OPK Linux TA, and then runs the standard tests. Bug: 295371549 Change-Id: I11e59faa3b24d906f573bcd3f4855e73a4aa5fdf
This commit is contained in:
committed by
Robert Shih
parent
e7017475b7
commit
05f3d0c524
104
libwvdrmengine/oemcrypto/test/install_keybox_tool.cpp
Normal file
104
libwvdrmengine/oemcrypto/test/install_keybox_tool.cpp
Normal file
@@ -0,0 +1,104 @@
|
||||
#include "stdio.h"
|
||||
|
||||
#include <fstream>
|
||||
#include <iostream>
|
||||
#include <sstream>
|
||||
#include <string>
|
||||
|
||||
#include <string.h>
|
||||
|
||||
#include "OEMCryptoCENC.h"
|
||||
#include "clock.h"
|
||||
#include "file_store.h"
|
||||
#include "oemcrypto_types.h"
|
||||
#include "string_conversions.h"
|
||||
|
||||
// Return a printable string from data. If all the characters are printable,
|
||||
// then just use the string. Otherwise, convert to hex.
|
||||
std::string MaybeHex(const uint8_t* data, size_t length) {
|
||||
// Ignore any trailing 0s.
|
||||
const size_t actual_length =
|
||||
strnlen(reinterpret_cast<const char*>(data), length);
|
||||
for (size_t i = actual_length; i < length; i++) {
|
||||
// But check that there is nothing nonzero after the first 0.
|
||||
if (data[i] != 0) return "0x" + wvutil::HexEncode(data, length);
|
||||
}
|
||||
// if there are any non-printable characters, just use hex.
|
||||
for (size_t i = 0; i < actual_length; i++) {
|
||||
if (!isprint(data[i])) return "0x" + wvutil::HexEncode(data, length);
|
||||
}
|
||||
return std::string(reinterpret_cast<const char*>(data), actual_length);
|
||||
}
|
||||
|
||||
bool install_binary_keybox(const uint8_t* keybox, size_t keybox_length) {
|
||||
printf("Installing keybox %s\n",
|
||||
wvutil::HexEncode(keybox, keybox_length).c_str());
|
||||
OEMCryptoResult status = OEMCrypto_Initialize();
|
||||
printf("Init status = %d\n", status);
|
||||
if (status != OEMCrypto_SUCCESS) {
|
||||
printf("OEMCrypto Initialize failed: %d\n", status);
|
||||
return false;
|
||||
}
|
||||
|
||||
status = OEMCrypto_InstallKeyboxOrOEMCert(keybox, keybox_length);
|
||||
if (status != OEMCrypto_SUCCESS) {
|
||||
printf("OEMCrypto Install keybox failed: %d\n", status);
|
||||
return false;
|
||||
}
|
||||
|
||||
uint8_t dev_id[128] = {0};
|
||||
size_t dev_id_len = 128;
|
||||
status = OEMCrypto_GetDeviceID(dev_id, &dev_id_len);
|
||||
if (status != OEMCrypto_SUCCESS) {
|
||||
printf("OEMCrypto_GetDeviceID failed: %d\n", status);
|
||||
return false;
|
||||
}
|
||||
printf("Device Id = '%s'\n", MaybeHex(dev_id, dev_id_len).c_str());
|
||||
|
||||
uint8_t key_data[256];
|
||||
size_t key_data_len = sizeof(key_data);
|
||||
status = OEMCrypto_GetKeyData(key_data, &key_data_len);
|
||||
if (status != OEMCrypto_SUCCESS) {
|
||||
printf("OEMCrypto_GetKeyData failed: %d\n", status);
|
||||
return false;
|
||||
}
|
||||
uint32_t* data = reinterpret_cast<uint32_t*>(key_data);
|
||||
printf("KeyData system_id = %u = 0x%04X, version=%u\n", htonl(data[1]),
|
||||
htonl(data[1]), htonl(data[0]));
|
||||
|
||||
status = OEMCrypto_Terminate();
|
||||
printf("Term status = %d\n", status);
|
||||
return true;
|
||||
}
|
||||
|
||||
bool install_xml_keybox(const std::string& xml) {
|
||||
// This does not yet work.
|
||||
return false;
|
||||
}
|
||||
|
||||
bool install_keybox(const std::string& keybox) {
|
||||
// Try to install the keybox as binary. if that doesn't work, try xml.
|
||||
if (install_binary_keybox(reinterpret_cast<const uint8_t*>(keybox.c_str()),
|
||||
keybox.length())) {
|
||||
return true;
|
||||
}
|
||||
if (install_xml_keybox(keybox)) {
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
int main(int argc, char** argv) {
|
||||
if (argc != 2) {
|
||||
printf("Usage: %s <filename>\n", argv[0]);
|
||||
return 1;
|
||||
}
|
||||
std::ifstream file(argv[1]);
|
||||
if (!file) {
|
||||
printf("Error opening file %s\n", argv[1]);
|
||||
return 1;
|
||||
}
|
||||
std::stringstream buffer;
|
||||
buffer << file.rdbuf();
|
||||
return install_keybox(buffer.str()) ? 0 : 1;
|
||||
}
|
||||
Reference in New Issue
Block a user