blob: 2edabad3e34a3bbf45110954f3e136ab03937184 [file] [log] [blame]
#include <memory>
#include "gtest/gtest.h"
#include "avb_tools.h"
#include "nugget_tools.h"
#include "nugget/app/avb/avb.pb.h"
#include "nugget/app/keymaster/keymaster.pb.h"
#include "Keymaster.client.h"
#include <application.h>
#include <keymaster.h>
#include <nos/AppClient.h>
#include <nos/NuggetClientInterface.h>
#include "util.h"
#include <openssl/bio.h>
#include <openssl/evp.h>
#include <openssl/pem.h>
using std::cout;
using std::string;
using std::unique_ptr;
using namespace nugget::app::avb;
using namespace nugget::app::keymaster;
namespace {
class KeymasterProvisionTest: public testing::Test {
protected:
static unique_ptr<nos::NuggetClientInterface> client;
static unique_ptr<test_harness::TestHarness> uart_printer;
static void SetUpTestCase();
static void TearDownTestCase();
virtual void SetUp(void);
virtual void PopulateDefaultRequest(ProvisionDeviceIdsRequest *request);
};
unique_ptr<nos::NuggetClientInterface> KeymasterProvisionTest::client;
unique_ptr<test_harness::TestHarness> KeymasterProvisionTest::uart_printer;
void KeymasterProvisionTest::SetUpTestCase() {
uart_printer = test_harness::TestHarness::MakeUnique();
client = nugget_tools::MakeNuggetClient();
client->Open();
EXPECT_TRUE(client->IsOpen()) << "Unable to connect";
}
void KeymasterProvisionTest::TearDownTestCase() {
client->Close();
client = unique_ptr<nos::NuggetClientInterface>();
uart_printer = nullptr;
}
void KeymasterProvisionTest::SetUp(void) {
avb_tools::ResetProduction(client.get());
}
void KeymasterProvisionTest::PopulateDefaultRequest(
ProvisionDeviceIdsRequest *request) {
request->set_product_brand("Pixel");
request->set_product_device("3");
request->set_product_name("Pixel");
request->set_serialno("12345678");
request->set_product_manufacturer("Google");
request->set_product_model("3");
request->set_imei("12345678");
request->set_meid("12345678");
}
// Tests
TEST_F(KeymasterProvisionTest, ProvisionDeviceIdsSuccess) {
ProvisionDeviceIdsRequest request;
ProvisionDeviceIdsResponse response;
PopulateDefaultRequest(&request);
Keymaster service(*client);
ASSERT_NO_ERROR(service.ProvisionDeviceIds(request, &response), "");
ASSERT_EQ((ErrorCode)response.error_code(), ErrorCode::OK);
}
TEST_F(KeymasterProvisionTest, ReProvisionDeviceIdsSuccess) {
ProvisionDeviceIdsRequest request;
ProvisionDeviceIdsResponse response;
PopulateDefaultRequest(&request);
Keymaster service(*client);
// First instance.
ASSERT_NO_ERROR(service.ProvisionDeviceIds(request, &response), "");
ASSERT_EQ((ErrorCode)response.error_code(), ErrorCode::OK);
// Second ...
ASSERT_NO_ERROR(service.ProvisionDeviceIds(request, &response), "");
ASSERT_EQ((ErrorCode)response.error_code(), ErrorCode::OK);
}
TEST_F(KeymasterProvisionTest, ProductionModeProvisionFails) {
ProvisionDeviceIdsRequest request;
ProvisionDeviceIdsResponse response;
PopulateDefaultRequest(&request);
Keymaster service(*client);
// Set production bit.
avb_tools::SetProduction(client.get(), true, NULL, 0);
// Provisioning is now disallowed.
ASSERT_NO_ERROR(service.ProvisionDeviceIds(request, &response), "");
ASSERT_EQ((ErrorCode)response.error_code(),
ErrorCode::PRODUCTION_MODE_PROVISIONING);
}
TEST_F(KeymasterProvisionTest, InvalidDeviceIdFails) {
ProvisionDeviceIdsRequest request;
ProvisionDeviceIdsResponse response;
PopulateDefaultRequest(&request);
string bad_serialno(KM_MNF_MAX_ENTRY_SIZE + 1, '5');
request.set_serialno(bad_serialno);
Keymaster service(*client);
ASSERT_NO_ERROR(service.ProvisionDeviceIds(request, &response), "");
ASSERT_EQ((ErrorCode)response.error_code(),
ErrorCode::INVALID_DEVICE_IDS);
}
TEST_F(KeymasterProvisionTest, MaxDeviceIdSuccess) {
ProvisionDeviceIdsRequest request;
ProvisionDeviceIdsResponse response;
PopulateDefaultRequest(&request);
string max_serialno(KM_MNF_MAX_ENTRY_SIZE, '5');
request.set_serialno(max_serialno);
Keymaster service(*client);
ASSERT_NO_ERROR(service.ProvisionDeviceIds(request, &response), "");
ASSERT_EQ((ErrorCode)response.error_code(), ErrorCode::OK);
}
// Regression test for b/77830050#comment6
TEST_F(KeymasterProvisionTest, NoMeidSuccess) {
ProvisionDeviceIdsRequest request;
ProvisionDeviceIdsResponse response;
PopulateDefaultRequest(&request);
request.clear_meid();
Keymaster service(*client);
ASSERT_NO_ERROR(service.ProvisionDeviceIds(request, &response), "");
ASSERT_EQ((ErrorCode)response.error_code(), ErrorCode::OK);
}
} // namespace