Home | History | Annotate | Download | only in src
      1 #include <memory>
      2 
      3 #include "gtest/gtest.h"
      4 #include "avb_tools.h"
      5 #include "nugget_tools.h"
      6 #include "nugget/app/avb/avb.pb.h"
      7 #include "Avb.client.h"
      8 #include "src/test-data/test-keys/reset_key_data.h"
      9 #include <avb.h>
     10 #include <application.h>
     11 #include <nos/AppClient.h>
     12 #include <nos/NuggetClientInterface.h>
     13 #include "util.h"
     14 
     15 #include <openssl/bio.h>
     16 #include <openssl/evp.h>
     17 #include <openssl/pem.h>
     18 
     19 using std::cout;
     20 using std::string;
     21 using std::unique_ptr;
     22 
     23 using namespace nugget::app::avb;
     24 using namespace avb_tools;
     25 
     26 namespace {
     27 
     28 class AvbTest: public testing::Test {
     29  protected:
     30   static unique_ptr<nos::NuggetClientInterface> client;
     31   static unique_ptr<test_harness::TestHarness> uart_printer;
     32 
     33   static void SetUpTestCase();
     34   static void TearDownTestCase();
     35 
     36   virtual void SetUp(void);
     37 
     38   int ProductionResetTest(uint32_t selector, uint64_t nonce,
     39                           const uint8_t *device_data, size_t data_len,
     40                           const uint8_t *signature, size_t signature_len);
     41   int SignChallenge(const struct ResetMessage *message,
     42                     uint8_t *signature, size_t *siglen);
     43 
     44   int Load(uint8_t slot, uint64_t *version);
     45   int Store(uint8_t slot, uint64_t version);
     46   int SetDeviceLock(uint8_t locked);
     47   int SetBootLock(uint8_t locked);
     48   int SetOwnerLock(uint8_t locked, const uint8_t *metadata, size_t size);
     49   int GetOwnerKey(uint32_t offset, uint8_t *metadata, size_t *size);
     50   int SetCarrierLock(uint8_t locked, const uint8_t *metadata, size_t size);
     51 
     52  public:
     53   const uint64_t LAST_NONCE = 0x4141414141414140ULL;
     54   const uint64_t VERSION = 1;
     55   const uint64_t NONCE = 0x4141414141414141ULL;
     56   const uint8_t DEVICE_DATA[AVB_DEVICE_DATA_SIZE] = {
     57     0x42, 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, 0x42,
     58     0x42, 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, 0x42,
     59     0x42, 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, 0x42,
     60     0x42, 0x42, 0x42, 0x42, 0x42, 0x42, 0x42, 0x42,
     61   };
     62   const uint8_t SIGNATURE[AVB_SIGNATURE_SIZE] = {
     63     0x68, 0x86, 0x9a, 0x16, 0xca, 0x62, 0xea, 0xa9,
     64     0x9b, 0xa0, 0x51, 0x03, 0xa6, 0x00, 0x3f, 0xe8,
     65     0xf1, 0x43, 0xe6, 0xb7, 0xde, 0x76, 0xfe, 0x21,
     66     0x65, 0x87, 0x78, 0xe5, 0x1d, 0x11, 0x6a, 0xe1,
     67     0x7b, 0xc6, 0x2e, 0xe2, 0x96, 0x25, 0x48, 0xa7,
     68     0x09, 0x43, 0x2c, 0xfd, 0x28, 0xa9, 0x66, 0x8a,
     69     0x09, 0xd5, 0x83, 0x3b, 0xde, 0x18, 0x5d, 0xef,
     70     0x50, 0x12, 0x8a, 0x8d, 0xfb, 0x2d, 0x46, 0x20,
     71     0x69, 0x55, 0x4e, 0x86, 0x63, 0xf6, 0x10, 0xe3,
     72     0x59, 0x3f, 0x55, 0x72, 0x18, 0xcb, 0x60, 0x80,
     73     0x0d, 0x2e, 0x2f, 0xfc, 0xc2, 0xbf, 0xda, 0x3f,
     74     0x4f, 0x2b, 0x6b, 0xf1, 0x5d, 0x28, 0x6b, 0x2b,
     75     0x9b, 0x92, 0xf3, 0x4e, 0xf2, 0xb6, 0x23, 0x8e,
     76     0x50, 0x64, 0xf6, 0xee, 0xc7, 0x78, 0x6a, 0xe0,
     77     0xed, 0xce, 0x2c, 0x1f, 0x0a, 0x47, 0x43, 0x5c,
     78     0xe4, 0x69, 0xc5, 0xc1, 0xf9, 0x52, 0x8c, 0xed,
     79     0xfd, 0x71, 0x8f, 0x9a, 0xde, 0x62, 0xfc, 0x21,
     80     0x07, 0xf9, 0x5f, 0xe1, 0x1e, 0xdc, 0x65, 0x95,
     81     0x15, 0xc8, 0xe7, 0xf2, 0xce, 0xa9, 0xd0, 0x55,
     82     0xf1, 0x18, 0x89, 0xae, 0xe8, 0x47, 0xd8, 0x8a,
     83     0x1f, 0x68, 0xa8, 0x6f, 0x5e, 0x5c, 0xda, 0x3d,
     84     0x98, 0xeb, 0x82, 0xf8, 0x1f, 0x7a, 0x43, 0x6d,
     85     0x3a, 0x7c, 0x36, 0x76, 0x4f, 0x55, 0xa4, 0x55,
     86     0x5f, 0x52, 0x47, 0xa5, 0x71, 0x17, 0x7b, 0x73,
     87     0xaa, 0x5c, 0x85, 0x94, 0xb6, 0xe2, 0x37, 0x1f,
     88     0x22, 0x29, 0x46, 0x59, 0x20, 0x1f, 0x49, 0x36,
     89     0x50, 0xa9, 0x60, 0x5d, 0xeb, 0x99, 0x3f, 0x92,
     90     0x31, 0xa0, 0x1d, 0xad, 0xdb, 0xde, 0x40, 0xf6,
     91     0xaf, 0x9c, 0x36, 0xe4, 0x0c, 0xf4, 0xcc, 0xaf,
     92     0x9f, 0x8b, 0xf9, 0xe6, 0x12, 0x53, 0x4e, 0x58,
     93     0xeb, 0x9a, 0x57, 0x08, 0x89, 0xa5, 0x4f, 0x7c,
     94     0xb9, 0x78, 0x07, 0x02, 0x17, 0x2c, 0xce, 0xb8,
     95   };
     96 };
     97 
     98 unique_ptr<nos::NuggetClientInterface> AvbTest::client;
     99 unique_ptr<test_harness::TestHarness> AvbTest::uart_printer;
    100 
    101 void AvbTest::SetUpTestCase() {
    102   uart_printer = test_harness::TestHarness::MakeUnique();
    103 
    104   client = nugget_tools::MakeNuggetClient();
    105   client->Open();
    106   EXPECT_TRUE(client->IsOpen()) << "Unable to connect";
    107 }
    108 
    109 void AvbTest::TearDownTestCase() {
    110   client->Close();
    111   client = unique_ptr<nos::NuggetClientInterface>();
    112 
    113   uart_printer = nullptr;
    114 }
    115 
    116 void AvbTest::SetUp(void)
    117 {
    118   bool bootloader;
    119   bool production;
    120   uint8_t locks[4];
    121   int code;
    122 
    123   avb_tools::BootloaderDone(client.get());  // We don't need BL for setup.
    124   // Perform a challenge/response. If this fails, either
    125   // the reset path is broken or the image is probably not
    126   // TEST_IMAGE=1.
    127   // Note: the reset tests are not safe on -UTEST_IMAGE unless
    128   //       the storage can be reflashed.
    129   ResetProduction(client.get());
    130 
    131   code = Reset(client.get(), ResetRequest::LOCKS, NULL, 0);
    132   ASSERT_NO_ERROR(code, "");
    133 
    134   GetState(client.get(), &bootloader, &production, locks);
    135   EXPECT_EQ(bootloader, false);
    136   EXPECT_EQ(production, false);
    137   EXPECT_EQ(locks[BOOT], 0x00);
    138   EXPECT_EQ(locks[CARRIER], 0x00);
    139   EXPECT_EQ(locks[DEVICE], 0x00);
    140   EXPECT_EQ(locks[OWNER], 0x00);
    141 }
    142 
    143 RSA *GetResetKey()
    144 {
    145   BIO *bio = BIO_new_mem_buf((void*)test_data::kResetKeyPem,
    146                               test_data::kResetKeyPemSize - 1);
    147   RSA *rsa = PEM_read_bio_RSAPrivateKey(bio, NULL, 0, NULL);
    148   BIO_free(bio);
    149   return rsa;
    150 }
    151 
    152 int AvbTest::ProductionResetTest(uint32_t selector, uint64_t nonce,
    153                                  const uint8_t *device_data, size_t data_len,
    154                                  const uint8_t *signature, size_t signature_len)
    155 {
    156   ProductionResetTestRequest request;
    157   request.set_selector(selector);
    158   request.set_nonce(nonce);
    159   if (signature && signature_len) {
    160     request.set_signature(signature, signature_len);
    161   }
    162   if (device_data && data_len) {
    163     request.set_device_data(device_data, data_len);
    164   }
    165   Avb service(*client);
    166   return service.ProductionResetTest(request, nullptr);
    167 }
    168 
    169 int AvbTest::SignChallenge(const struct ResetMessage *message,
    170                            uint8_t *signature, size_t *maxsig)
    171 {
    172   size_t siglen = *maxsig;
    173   RSA *key = GetResetKey();
    174   if (!key)
    175     return -1;
    176   EVP_PKEY *pkey = EVP_PKEY_new();
    177   if (!pkey)
    178     return -1;
    179   if (!EVP_PKEY_set1_RSA(pkey, key))
    180     return -1;
    181   EVP_MD_CTX md_ctx;
    182   EVP_MD_CTX_init(&md_ctx);
    183   EVP_PKEY_CTX *pkey_ctx;
    184   if (!EVP_DigestSignInit(&md_ctx, &pkey_ctx, EVP_sha256(), NULL, pkey))
    185     return -1;
    186   if (!EVP_PKEY_CTX_set_rsa_padding(pkey_ctx, RSA_PKCS1_PSS_PADDING))
    187     return -1;
    188   if (!EVP_DigestSignUpdate(&md_ctx, (uint8_t *)message, sizeof(*message)))
    189     return -1;
    190   EVP_DigestSignFinal(&md_ctx, NULL, &siglen);
    191   if (siglen > *maxsig) {
    192     std::cerr << "Signature length too long: " << siglen << " > "
    193               << *maxsig << std::endl;
    194     return -2;
    195   }
    196   *maxsig = siglen;
    197   int code = EVP_DigestSignFinal(&md_ctx, signature, &siglen);
    198   if (!code) {
    199     std::cerr << "OpenSSL error: " <<  ERR_get_error() << ": "
    200               << ERR_reason_error_string(ERR_get_error()) << std::endl;
    201     return -3;
    202   }
    203   EVP_MD_CTX_cleanup(&md_ctx);
    204   EVP_PKEY_free(pkey);
    205   RSA_free(key);
    206   // Feed it in
    207   return 0;
    208 }
    209 
    210 int AvbTest::Load(uint8_t slot, uint64_t *version)
    211 {
    212   LoadRequest request;
    213   LoadResponse response;
    214   int code;
    215 
    216   request.set_slot(slot);
    217 
    218   Avb service(*client);
    219   code = service.Load(request, &response);
    220   if (code == APP_SUCCESS) {
    221     *version = response.version();
    222   }
    223 
    224   return code;
    225 }
    226 
    227 int AvbTest::Store(uint8_t slot, uint64_t version)
    228 {
    229   StoreRequest request;
    230 
    231   request.set_slot(slot);
    232   request.set_version(version);
    233 
    234   Avb service(*client);
    235   return service.Store(request, nullptr);
    236 }
    237 
    238 int AvbTest::SetDeviceLock(uint8_t locked)
    239 {
    240   SetDeviceLockRequest request;
    241 
    242   request.set_locked(locked);
    243 
    244   Avb service(*client);
    245   return service.SetDeviceLock(request, nullptr);
    246 }
    247 
    248 int AvbTest::SetBootLock(uint8_t locked)
    249 {
    250   SetBootLockRequest request;
    251 
    252   request.set_locked(locked);
    253 
    254   Avb service(*client);
    255   return service.SetBootLock(request, nullptr);
    256 }
    257 
    258 int AvbTest::SetOwnerLock(uint8_t locked, const uint8_t *metadata, size_t size)
    259 {
    260   SetOwnerLockRequest request;
    261 
    262   request.set_locked(locked);
    263   if (metadata != NULL && size > 0) {
    264     request.set_key(metadata, size);
    265   }
    266 
    267   Avb service(*client);
    268   return service.SetOwnerLock(request, nullptr);
    269 }
    270 
    271 int AvbTest::GetOwnerKey(uint32_t offset, uint8_t *metadata, size_t *size)
    272 {
    273   GetOwnerKeyRequest request;
    274   GetOwnerKeyResponse response;
    275   size_t i;
    276   int code;
    277 
    278   request.set_offset(offset);
    279   if (size != NULL)
    280     request.set_size(*size);
    281 
    282   Avb service(*client);
    283   code = service.GetOwnerKey(request, &response);
    284 
    285   if (code == APP_SUCCESS) {
    286     auto chunk = response.chunk();
    287 
    288     if (metadata != NULL) {
    289       for (i = 0; i < chunk.size(); i++)
    290         metadata[i] = chunk[i];
    291     }
    292     if (size != NULL)
    293       *size = chunk.size();
    294   }
    295 
    296   return code;
    297 }
    298 
    299 int AvbTest::SetCarrierLock(uint8_t locked, const uint8_t *metadata, size_t size)
    300 {
    301   CarrierLockRequest request;
    302 
    303   request.set_locked(locked);
    304   if (metadata != NULL && size > 0) {
    305     request.set_device_data(metadata, size);
    306   }
    307 
    308   Avb service(*client);
    309   return service.CarrierLock(request, nullptr);
    310 }
    311 
    312 // Tests
    313 
    314 TEST_F(AvbTest, CarrierLockTest)
    315 {
    316   uint8_t carrier_data[AVB_DEVICE_DATA_SIZE];
    317   uint8_t locks[4];
    318   int code;
    319 
    320   // Test we can set and unset the carrier lock in non production mode
    321   memset(carrier_data, 0, sizeof(carrier_data));
    322 
    323   code = SetCarrierLock(0x12, carrier_data, sizeof(carrier_data));
    324   ASSERT_NO_ERROR(code, "");
    325 
    326   GetState(client.get(), NULL, NULL, locks);
    327   ASSERT_EQ(locks[CARRIER], 0x12);
    328 
    329   code = SetCarrierLock(0, NULL, 0);
    330   ASSERT_NO_ERROR(code, "");
    331 
    332   // Set production mode
    333   avb_tools::SetBootloader(client.get());
    334   code = SetProduction(client.get(), true, NULL, 0);
    335   ASSERT_NO_ERROR(code, "");
    336   avb_tools::BootloaderDone(client.get());
    337 
    338   // Test we cannot set or unset the carrier lock in production mode
    339   code = SetCarrierLock(0x12, carrier_data, sizeof(carrier_data));
    340   ASSERT_EQ(code, APP_ERROR_AVB_AUTHORIZATION);
    341 
    342   GetState(client.get(), NULL, NULL, locks);
    343   ASSERT_EQ(locks[CARRIER], 0x00);
    344 
    345   code = SetCarrierLock(0, NULL, 0);
    346   ASSERT_EQ(code, APP_ERROR_AVB_AUTHORIZATION);
    347 }
    348 
    349 TEST_F(AvbTest, CarrierUnlockTest)
    350 {
    351   CarrierLockTestRequest request;
    352   CarrierLockTestResponse response;
    353   CarrierUnlock *token;
    354 
    355   token = new CarrierUnlock();
    356   token->set_nonce(NONCE);
    357   token->set_version(VERSION);
    358   token->set_signature(SIGNATURE, sizeof(SIGNATURE));
    359 
    360   request.set_last_nonce(LAST_NONCE);
    361   request.set_version(VERSION);
    362   request.set_device_data(DEVICE_DATA, sizeof(DEVICE_DATA));
    363   request.set_allocated_token(token);
    364 
    365   Avb service(*client);
    366   ASSERT_NO_ERROR(service.CarrierLockTest(request, &response), "");
    367 
    368   // The nonce is covered by the signature, so changing it should trip the
    369   // signature verification
    370   token->set_nonce(NONCE + 1);
    371   ASSERT_EQ(service.CarrierLockTest(request, &response), APP_ERROR_AVB_AUTHORIZATION);
    372 }
    373 
    374 TEST_F(AvbTest, DeviceLockTest)
    375 {
    376   bool bootloader;
    377   bool production;
    378   uint8_t locks[4];
    379   int code;
    380 
    381   // Test cannot set the lock
    382   avb_tools::SetBootloader(client.get());
    383   code = SetProduction(client.get(), true, NULL, 0);
    384   ASSERT_NO_ERROR(code, "");
    385 
    386   code = SetDeviceLock(0x12);
    387   ASSERT_EQ(code, APP_ERROR_AVB_HLOS);
    388 
    389   // Test can set lock
    390   ResetProduction(client.get());
    391   avb_tools::SetBootloader(client.get());
    392 
    393   code = SetDeviceLock(0x34);
    394   ASSERT_NO_ERROR(code, "");
    395 
    396   GetState(client.get(), &bootloader, &production, locks);
    397   ASSERT_TRUE(bootloader);
    398   ASSERT_FALSE(production);
    399   ASSERT_EQ(locks[DEVICE], 0x34);
    400 
    401   // Test cannot set while set
    402   code = SetDeviceLock(0x56);
    403   ASSERT_EQ(code, APP_ERROR_AVB_DENIED);
    404 
    405   GetState(client.get(), NULL, NULL, locks);
    406   ASSERT_EQ(locks[DEVICE], 0x34);
    407 
    408   // Test can unset
    409   code = SetDeviceLock(0x00);
    410   ASSERT_NO_ERROR(code, "");
    411 
    412   GetState(client.get(), NULL, NULL, locks);
    413   ASSERT_EQ(locks[DEVICE], 0x00);
    414 }
    415 
    416 TEST_F(AvbTest, SetDeviceLockIsIdempotent) {
    417   ASSERT_NO_ERROR(SetDeviceLock(0x65), "");
    418   ASSERT_NO_ERROR(SetDeviceLock(0x65), "");
    419 }
    420 
    421 TEST_F(AvbTest, BootLockTest)
    422 {
    423   uint8_t locks[4];
    424   int code;
    425   // Test production logic.
    426   code = SetProduction(client.get(), true, NULL, 0);
    427   ASSERT_NO_ERROR(code, "");
    428 
    429   // Test cannot set lock
    430   code = SetBootLock(0x12);
    431   ASSERT_EQ(code, APP_ERROR_AVB_BOOTLOADER);
    432 
    433   GetState(client.get(), NULL, NULL, locks);
    434   ASSERT_EQ(locks[BOOT], 0x00);
    435 
    436   // Show the bootloader setting and unsetting.
    437   avb_tools::SetBootloader(client.get());
    438   code = SetBootLock(0x12);
    439   ASSERT_NO_ERROR(code, "");
    440 
    441   GetState(client.get(), NULL, NULL, locks);
    442   ASSERT_EQ(locks[BOOT], 0x12);
    443 
    444   code = SetBootLock(0x0);
    445   ASSERT_NO_ERROR(code, "");
    446 
    447   GetState(client.get(), NULL, NULL, locks);
    448   ASSERT_EQ(locks[BOOT], 0x00);
    449 
    450   // Test cannot unset lock while carrier set
    451   ResetProduction(client.get());
    452   code = Reset(client.get(), ResetRequest::LOCKS, NULL, 0);
    453   ASSERT_NO_ERROR(code, "");
    454 
    455   code = SetCarrierLock(0x34, DEVICE_DATA, sizeof(DEVICE_DATA));
    456   ASSERT_NO_ERROR(code, "");
    457 
    458   code = SetProduction(client.get(), true, NULL, 0);
    459   ASSERT_NO_ERROR(code, "");
    460 
    461   // Can lock when carrier lock is set.
    462   avb_tools::SetBootloader(client.get());
    463   code = SetBootLock(0x56);
    464   ASSERT_NO_ERROR(code, "");
    465 
    466   // Cannot unlock.
    467   code = SetBootLock(0x0);
    468   ASSERT_EQ(code, APP_ERROR_AVB_DENIED);
    469 
    470   // Or change the value.
    471   code = SetBootLock(0x42);
    472   ASSERT_EQ(code, APP_ERROR_AVB_DENIED);
    473 
    474   GetState(client.get(), NULL, NULL, locks);
    475   ASSERT_EQ(locks[CARRIER], 0x34);
    476   ASSERT_EQ(locks[BOOT], 0x56);
    477 
    478   // Clear the locks to show device lock enforcement.
    479   ResetProduction(client.get());
    480   code = Reset(client.get(), ResetRequest::LOCKS, NULL, 0);
    481   ASSERT_NO_ERROR(code, "");
    482   code = SetProduction(client.get(), true, NULL, 0);
    483   ASSERT_NO_ERROR(code, "");
    484   avb_tools::SetBootloader(client.get());
    485 
    486   // Need to be in the HLOS.
    487   code = SetDeviceLock(0x78);
    488   ASSERT_EQ(code, APP_ERROR_AVB_HLOS);
    489 
    490   avb_tools::BootloaderDone(client.get());
    491   code = SetDeviceLock(0x78);
    492   ASSERT_NO_ERROR(code, "");
    493 
    494   // We can move to a locked state when
    495   // device lock is true.
    496   avb_tools::SetBootloader(client.get());
    497   code = SetBootLock(0x9A);
    498   ASSERT_NO_ERROR(code, "");
    499 
    500   // But we can't move back.
    501   code = SetBootLock(0x0);
    502   ASSERT_EQ(code, APP_ERROR_AVB_DENIED);
    503 
    504   GetState(client.get(), NULL, NULL, locks);
    505   ASSERT_EQ(locks[DEVICE], 0x78);
    506   ASSERT_EQ(locks[BOOT], 0x9A);
    507 }
    508 
    509 TEST_F(AvbTest, SetBootLockIsIdempotent) {
    510   ASSERT_NO_ERROR(SetBootLock(0x12), "");
    511   ASSERT_NO_ERROR(SetBootLock(0x12), "");
    512 }
    513 
    514 TEST_F(AvbTest, SetBootLockAfterWipingUserData) {
    515   // This is a sequence of commands that the bootloader will issue
    516   ASSERT_NO_ERROR(SetProduction(client.get(), true, NULL, 0), "");
    517   avb_tools::SetBootloader(client.get());
    518   ASSERT_TRUE(nugget_tools::WipeUserData(client.get()));
    519   ASSERT_NO_ERROR(SetBootLock(0xdc), "");
    520 }
    521 
    522 TEST_F(AvbTest, OwnerLockTest)
    523 {
    524   uint8_t owner_key[AVB_METADATA_MAX_SIZE];
    525   uint8_t chunk[AVB_CHUNK_MAX_SIZE];
    526   uint8_t locks[4];
    527   int code;
    528   size_t i;
    529 
    530   for (i = 0; i < AVB_METADATA_MAX_SIZE; i += 2) {
    531     owner_key[i + 0] = (i >> 8) & 0xFF;
    532     owner_key[i + 1] = (i >> 8) & 0xFF;
    533   }
    534 
    535   // This should pass when BOOT lock is not set
    536   code = SetOwnerLock(0x65, owner_key, sizeof(owner_key));
    537   ASSERT_NO_ERROR(code, "");
    538 
    539   GetState(client.get(), NULL, NULL, locks);
    540   ASSERT_EQ(locks[OWNER], 0x65);
    541 
    542   for (i = 0; i < AVB_METADATA_MAX_SIZE; i += AVB_CHUNK_MAX_SIZE) {
    543     size_t size = sizeof(chunk);
    544     size_t j;
    545 
    546     code = GetOwnerKey(i, chunk, &size);
    547     ASSERT_NO_ERROR(code, "");
    548     ASSERT_EQ(size, sizeof(chunk));
    549     for (j = 0; j < size; j++) {
    550       ASSERT_EQ(chunk[j], owner_key[i + j]);
    551     }
    552   }
    553 
    554   // Test setting the lock while set fails
    555   code = SetOwnerLock(0x87, owner_key, sizeof(owner_key));
    556   ASSERT_EQ(code, APP_ERROR_AVB_DENIED);
    557 
    558   GetState(client.get(), NULL, NULL, locks);
    559   ASSERT_EQ(locks[OWNER], 0x65);
    560 
    561   // Clear it
    562   code = SetOwnerLock(0x00, owner_key, sizeof(owner_key));
    563   ASSERT_NO_ERROR(code, "");
    564 
    565   GetState(client.get(), NULL, NULL, locks);
    566   ASSERT_EQ(locks[OWNER], 0x00);
    567 
    568   // Set the boot lock
    569   avb_tools::SetBootloader(client.get());
    570   code = SetBootLock(0x43);
    571   ASSERT_NO_ERROR(code, "");
    572 
    573   GetState(client.get(), NULL, NULL, locks);
    574   ASSERT_EQ(locks[BOOT], 0x43);
    575 
    576   // Test setting the lock while BOOT is locked fails
    577   code = SetOwnerLock(0x21, owner_key, sizeof(owner_key));
    578   ASSERT_EQ(code, APP_ERROR_AVB_DENIED);
    579 }
    580 
    581 TEST_F(AvbTest, ProductionMode)
    582 {
    583   bool production;
    584   uint8_t locks[4];
    585   int code;
    586 
    587   // Check we're not in production mode
    588   GetState(client.get(), NULL, &production, NULL);
    589   ASSERT_FALSE(production);
    590 
    591   // Set some lock values to make sure production doesn't affect them
    592   avb_tools::SetBootloader(client.get());
    593   code = SetOwnerLock(0x11, NULL, 0);
    594   ASSERT_NO_ERROR(code, "");
    595 
    596   code = SetBootLock(0x22);
    597   ASSERT_NO_ERROR(code, "");
    598 
    599   code = SetCarrierLock(0x33, DEVICE_DATA, sizeof(DEVICE_DATA));
    600   ASSERT_NO_ERROR(code, "");
    601 
    602   code = SetDeviceLock(0x44);
    603   ASSERT_NO_ERROR(code, "");
    604 
    605   // Set production mode with a DUT hash
    606   code = SetProduction(client.get(), true, NULL, 0);
    607   ASSERT_NO_ERROR(code, "");
    608 
    609   GetState(client.get(), NULL, &production, locks);
    610   ASSERT_TRUE(production);
    611   ASSERT_EQ(locks[OWNER], 0x11);
    612   ASSERT_EQ(locks[BOOT], 0x22);
    613   ASSERT_EQ(locks[CARRIER], 0x33);
    614   ASSERT_EQ(locks[DEVICE], 0x44);
    615 
    616   // Test production cannot be turned off.
    617   code = SetProduction(client.get(), false, NULL, 0);
    618   ASSERT_EQ(code, APP_ERROR_AVB_AUTHORIZATION);
    619   avb_tools::BootloaderDone(client.get());
    620   code = SetProduction(client.get(), false, NULL, 0);
    621   ASSERT_EQ(code, APP_ERROR_AVB_AUTHORIZATION);
    622 }
    623 
    624 TEST_F(AvbTest, Rollback)
    625 {
    626   uint64_t value = ~0ULL;
    627   int code, i;
    628 
    629   // Test we cannot change values in normal mode
    630   code = SetProduction(client.get(), true, NULL, 0);
    631   ASSERT_NO_ERROR(code, "");
    632   for (i = 0; i < 8; i++) {
    633     code = Store(i, 0xFF00000011223344 + i);
    634     ASSERT_EQ(code, APP_ERROR_AVB_BOOTLOADER);
    635 
    636     code = Load(i, &value);
    637     ASSERT_NO_ERROR(code, "");
    638     ASSERT_EQ(value, 0x00ULL);
    639   }
    640 
    641   // Test we can change values in bootloader mode
    642   avb_tools::SetBootloader(client.get());
    643   for (i = 0; i < 8; i++) {
    644     code = Store(i, 0xFF00000011223344 + i);
    645     ASSERT_NO_ERROR(code, "");
    646 
    647     code = Load(i, &value);
    648     ASSERT_NO_ERROR(code, "");
    649     ASSERT_EQ(value, 0xFF00000011223344 + i);
    650 
    651     code = Store(i, 0x8800000011223344 - i);
    652     ASSERT_NO_ERROR(code, "");
    653 
    654     code = Load(i, &value);
    655     ASSERT_NO_ERROR(code, "");
    656     ASSERT_EQ(value, 0x8800000011223344 - i);
    657   }
    658 }
    659 
    660 TEST_F(AvbTest, Reset)
    661 {
    662   bool bootloader;
    663   bool production;
    664   uint8_t locks[4];
    665   int code;
    666 
    667   // Set some locks and production mode*/
    668   avb_tools::SetBootloader(client.get());
    669   code = SetBootLock(0x12);
    670   ASSERT_NO_ERROR(code, "");
    671 
    672   code = SetDeviceLock(0x34);
    673   ASSERT_NO_ERROR(code, "");
    674 
    675   code = SetProduction(client.get(), true, NULL, 0);
    676   ASSERT_NO_ERROR(code, "");
    677 
    678   avb_tools::BootloaderDone(client.get());
    679 
    680   GetState(client.get(), &bootloader, &production, locks);
    681   ASSERT_FALSE(bootloader);
    682   ASSERT_TRUE(production);
    683   ASSERT_EQ(locks[BOOT], 0x12);
    684   ASSERT_EQ(locks[DEVICE], 0x34);
    685 
    686   // Try reset, should fail
    687   code = Reset(client.get(), ResetRequest::LOCKS, NULL, 0);
    688   ASSERT_EQ(code, APP_ERROR_AVB_DENIED);
    689 
    690   GetState(client.get(), &bootloader, &production, locks);
    691   ASSERT_FALSE(bootloader);
    692   ASSERT_TRUE(production);
    693   ASSERT_EQ(locks[BOOT], 0x12);
    694   ASSERT_EQ(locks[DEVICE], 0x34);
    695 
    696   // Disable production, try reset, should pass
    697   ResetProduction(client.get());
    698   code = Reset(client.get(), ResetRequest::LOCKS, NULL, 0);
    699   ASSERT_NO_ERROR(code, "");
    700 
    701   GetState(client.get(), &bootloader, &production, locks);
    702   ASSERT_FALSE(bootloader);
    703   ASSERT_FALSE(production);
    704   ASSERT_EQ(locks[BOOT], 0x00);
    705   ASSERT_EQ(locks[DEVICE], 0x00);
    706 }
    707 
    708 TEST_F(AvbTest, GetResetChallengeTest)
    709 {
    710   int code;
    711   uint32_t selector;
    712   uint64_t nonce;
    713   uint8_t data[32];
    714   uint8_t empty[32];
    715   size_t len = sizeof(data);
    716 
    717   memset(data, 0, sizeof(data));
    718   memset(empty, 0, sizeof(empty));
    719   code = GetResetChallenge(client.get(), &selector, &nonce, data, &len);
    720   ASSERT_LE(sizeof(data), len);
    721   ASSERT_NO_ERROR(code, "");
    722   EXPECT_NE(0ULL, nonce);
    723   EXPECT_LE(selector, (uint32_t)ResetToken::CURRENT);
    724   EXPECT_EQ(32UL, len);
    725   // We didn't set a device id.
    726   EXPECT_EQ(0, memcmp(data, empty, sizeof(empty)));
    727 }
    728 
    729 // TODO(drewry) move to new test suite since this is unsafe on
    730 //  non-TEST_IMAGE builds.
    731 TEST_F(AvbTest, ResetProductionValid)
    732 {
    733   static const uint8_t kDeviceHash[] = {
    734     0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8,
    735     0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8,
    736     0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8,
    737     0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8
    738   };
    739   struct ResetMessage message;
    740   int code;
    741   uint32_t selector;
    742   size_t len = sizeof(message.data);
    743   uint8_t signature[2048/8 + 1];
    744   size_t siglen = sizeof(signature);
    745 
    746   // Lock in a fixed device hash
    747   code = SetProduction(client.get(), true, kDeviceHash, sizeof(kDeviceHash));
    748   EXPECT_EQ(0, code);
    749 
    750   memset(message.data, 0, sizeof(message.data));
    751   code = GetResetChallenge(client.get(), &selector, &message.nonce, message.data, &len);
    752   ASSERT_NO_ERROR(code, "");
    753   // Expect, not assert, just in case something goes weird, we may still
    754   // exit cleanly.
    755   EXPECT_EQ(0, memcmp(message.data, kDeviceHash, sizeof(kDeviceHash)));
    756   ASSERT_EQ(0, SignChallenge(&message, signature, &siglen));
    757 
    758   // Try a bad challenge, wasting the nonce.
    759   uint8_t orig = signature[0];
    760   signature[0] += 1;
    761   code = Reset(client.get(), ResetRequest::PRODUCTION, signature, siglen);
    762   // TODO: expect the LINENO error
    763   EXPECT_NE(0, code);
    764   signature[0] = orig;
    765   // Re-lock since TEST_IMAGE will unlock on failure.
    766   code = SetProduction(client.get(), true, kDeviceHash, sizeof(kDeviceHash));
    767   EXPECT_EQ(0, code);
    768 
    769   // Now use a good one, but without getting a new nonce.
    770   code = Reset(client.get(), ResetRequest::PRODUCTION, signature, siglen);
    771   EXPECT_EQ(code, APP_ERROR_AVB_DENIED);
    772 
    773   // Now get the nonce and use a good signature.
    774   code = GetResetChallenge(client.get(), &selector, &message.nonce, message.data, &len);
    775   ASSERT_NO_ERROR(code, "");
    776   ASSERT_EQ(0, SignChallenge(&message, signature, &siglen));
    777   code = Reset(client.get(), ResetRequest::PRODUCTION, signature, siglen);
    778   ASSERT_NO_ERROR(code, "");
    779 }
    780 
    781 TEST_F(AvbTest, ProductionResetTestValid)
    782 {
    783   static const uint8_t kDeviceHash[] = {
    784     0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8,
    785     0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8,
    786     0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8,
    787     0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8
    788   };
    789   struct ResetMessage message;
    790   int code;
    791   uint32_t selector = ResetToken::CURRENT;
    792   size_t len = sizeof(message.data);
    793   uint8_t signature[2048/8 + 1];
    794   size_t siglen = sizeof(signature);
    795 
    796   memcpy(message.data, kDeviceHash, sizeof(message.data));
    797   message.nonce = 123456;
    798   ASSERT_EQ(0, SignChallenge(&message, signature, &siglen));
    799 
    800   // Try a bad challenge, wasting the nonce.
    801   uint8_t orig = signature[0];
    802   signature[0] += 1;
    803   code = ProductionResetTest(selector, message.nonce, message.data, len,
    804                              signature, siglen);
    805   EXPECT_NE(0, code);
    806   signature[0] = orig;
    807 
    808   // Now use a good signature.
    809   code = ProductionResetTest(selector, message.nonce, message.data, len,
    810                              signature, siglen);
    811   ASSERT_NO_ERROR(code, "");
    812 
    813   // Note, testing nonce expiration is handled in the Reset(PRODUCTION)
    814   // test. This just checks a second signature over an app sourced nonce.
    815   code = GetResetChallenge(client.get(), &selector, &message.nonce, message.data, &len);
    816   ASSERT_NO_ERROR(code, "");
    817   ASSERT_EQ(0, SignChallenge(&message, signature, &siglen));
    818   code = Reset(client.get(), ResetRequest::PRODUCTION, signature, siglen);
    819   ASSERT_NO_ERROR(code, "");
    820 
    821   // Now test a null signature as we will for the real keys
    822   message.nonce = 0;
    823   memset(message.data, 0, sizeof(message.data));
    824   code = ProductionResetTest(selector, message.nonce, message.data, len,
    825                              test_data::kResetSignatures[selector],
    826                              test_data::kResetSignatureLengths[selector]);
    827   ASSERT_NO_ERROR(code, "");
    828 }
    829 
    830 TEST_F(AvbTest, WipeUserDataDoesNotLockDeviceLock) {
    831   ASSERT_NO_ERROR(SetDeviceLock(0x00), "");
    832   ASSERT_TRUE(nugget_tools::WipeUserData(client.get()));
    833 
    834   uint8_t locks[4];
    835   GetState(client.get(), nullptr, nullptr, locks);
    836   EXPECT_EQ(locks[DEVICE], 0x00);
    837 }
    838 
    839 TEST_F(AvbTest, ResetKeyNullTokenSignatureTest)
    840 {
    841   struct ResetMessage message;
    842   int code;
    843 
    844   uint32_t selector;
    845   uint64_t nonce;
    846   uint8_t device_data[AVB_DEVICE_DATA_SIZE];
    847   size_t len = sizeof(device_data);
    848 
    849   // Get the selector
    850   code = GetResetChallenge(client.get(), &selector, &nonce,
    851                            device_data, &len);
    852   ASSERT_NO_ERROR(code, "");
    853   ASSERT_LT(selector, test_data::kResetSignatureCount);
    854 
    855   memset(&message, 0, sizeof(message));
    856   // Now use a good one, but without getting a new nonce.
    857   cout << "Testing key: " << selector << "\n";
    858   code = ProductionResetTest(selector, message.nonce, message.data, 32,
    859                              test_data::kResetSignatures[selector],
    860                              test_data::kResetSignatureLengths[selector]);
    861   ASSERT_NO_ERROR(code, "");
    862 }
    863 
    864 }  // namespace
    865