void TestHmacSha256(void) { static const struct { const char *key; const char *data; uint8_t hash[ot::Crypto::HmacSha256::kHashSize]; } tests[] = { { "\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b", "Hi There", { 0xb0, 0x34, 0x4c, 0x61, 0xd8, 0xdb, 0x38, 0x53, 0x5c, 0xa8, 0xaf, 0xce, 0xaf, 0x0b, 0xf1, 0x2b, 0x88, 0x1d, 0xc2, 0x00, 0xc9, 0x83, 0x3d, 0xa7, 0x26, 0xe9, 0x37, 0x6c, 0x2e, 0x32, 0xcf, 0xf7, }, }, { NULL, NULL, {}, }, }; otInstance *instance = testInitInstance(); // Make sure hmac is destructed before freeing instance. { ot::Crypto::HmacSha256 hmac; uint8_t hash[ot::Crypto::HmacSha256::kHashSize]; VerifyOrQuit(instance != NULL, "Null OpenThread instance"); for (int i = 0; tests[i].key != NULL; i++) { hmac.Start(reinterpret_cast<const uint8_t *>(tests[i].key), static_cast<uint16_t>(strlen(tests[i].key))); hmac.Update(reinterpret_cast<const uint8_t *>(tests[i].data), static_cast<uint16_t>(strlen(tests[i].data))); hmac.Finish(hash); VerifyOrQuit(memcmp(hash, tests[i].hash, sizeof(tests[i].hash)) == 0, "HMAC-SHA-256 failed\n"); } } testFreeInstance(instance); }
void TestChildTable(void) { const TestChild testChildList[] = { { Child::kStateValid, 0x8001, {{0x10, 0x20, 0x03, 0x15, 0x10, 0x00, 0x60, 0x16}}, }, { Child::kStateParentRequest, 0x8002, {{0x10, 0x20, 0x03, 0x15, 0x10, 0x00, 0x60, 0x17}}, }, { Child::kStateValid, 0x8003, {{0x10, 0x20, 0x03, 0x15, 0x10, 0x00, 0x60, 0x18}}, }, { Child::kStateValid, 0x8004, {{0x10, 0x20, 0x03, 0x15, 0x10, 0x00, 0x60, 0x19}}, }, { Child::kStateRestored, 0x8005, {{0x10, 0x20, 0x03, 0x15, 0x10, 0x00, 0x60, 0x20}}, }, { Child::kStateValid, 0x8006, {{0x10, 0x20, 0x03, 0x15, 0x10, 0x00, 0x60, 0x21}}, }, { Child::kStateChildIdRequest, 0x8007, {{0x10, 0x20, 0x03, 0x15, 0x10, 0x00, 0x60, 0x22}}, }, { Child::kStateChildUpdateRequest, 0x8008, {{0x10, 0x20, 0x03, 0x15, 0x10, 0x00, 0x60, 0x23}}, }, { Child::kStateParentResponse, 0x8009, {{0x10, 0x20, 0x03, 0x15, 0x10, 0x00, 0x60, 0x24}}, }, { Child::kStateRestored, 0x800a, {{0x10, 0x20, 0x03, 0x15, 0x10, 0x00, 0x60, 0x25}}, }, }; const uint8_t testListLength = OT_ARRAY_LENGTH(testChildList); uint8_t testNumAllowedChildren = 2; ChildTable *table; otError error; sInstance = testInitInstance(); VerifyOrQuit(sInstance != NULL, "Null instance"); table = &sInstance->Get<ChildTable>(); //- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - printf("Checking initial state after child table is constructed"); VerifyOrQuit(table->GetMaxChildrenAllowed() == table->GetMaxChildren(), "GetMaxChildrenAllowed() initial value is incorrect "); for (uint8_t i = 0; i < OT_ARRAY_LENGTH(kAllFilters); i++) { ChildTable::StateFilter filter = kAllFilters[i]; VerifyOrQuit(table->HasChildren(filter) == false, "HasChildren() failed after init"); VerifyOrQuit(table->GetNumChildren(filter) == 0, "GetNumChildren() failed after init"); } printf(" -- PASS\n"); //- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - VerifyChildTableContent(*table, 0, testChildList); VerifyOrQuit(table->GetMaxChildrenAllowed() >= testListLength, "Default child table size is too small for the unit test"); // Add the child entries from test list one by one and verify the table content for (uint8_t i = 0; i < testListLength; i++) { Child *child; child = table->GetNewChild(); VerifyOrQuit(child != NULL, "GetNewChild() failed"); child->SetState(testChildList[i].mState); child->SetRloc16(testChildList[i].mRloc16); child->SetExtAddress((static_cast<const Mac::ExtAddress &>(testChildList[i].mExtAddress))); VerifyChildTableContent(*table, i + 1, testChildList); } //- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - // Verify Child Table clear table->Clear(); VerifyChildTableContent(*table, 0, testChildList); // Add the child entries from test list in reverse order and verify the table content for (uint8_t i = testListLength; i > 0; i--) { Child *child; child = table->GetNewChild(); VerifyOrQuit(child != NULL, "GetNewChild() failed"); child->SetState(testChildList[i - 1].mState); child->SetRloc16(testChildList[i - 1].mRloc16); child->SetExtAddress((static_cast<const Mac::ExtAddress &>(testChildList[i - 1].mExtAddress))); VerifyChildTableContent(*table, testListLength - i + 1, &testChildList[i - 1]); } //- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - printf("Test Get/SetMaxChildrenAllowed"); error = table->SetMaxChildrenAllowed(kMaxChildren - 1); VerifyOrQuit(error == OT_ERROR_INVALID_STATE, "SetMaxChildrenAllowed() should fail when table is not empty"); table->Clear(); error = table->SetMaxChildrenAllowed(kMaxChildren + 1); VerifyOrQuit(error == OT_ERROR_INVALID_ARGS, "SetMaxChildrenAllowed() did not fail with an invalid arg"); error = table->SetMaxChildrenAllowed(0); VerifyOrQuit(error == OT_ERROR_INVALID_ARGS, "SetMaxChildrenAllowed() did not fail with an invalid arg"); error = table->SetMaxChildrenAllowed(testNumAllowedChildren); VerifyOrQuit(error == OT_ERROR_NONE, "SetMaxChildrenAllowed() failed"); VerifyOrQuit(table->GetMaxChildrenAllowed() == testNumAllowedChildren, "GetMaxChildrenAllowed() failed"); for (uint8_t num = 0; num < testNumAllowedChildren; num++) { Child *child = table->GetNewChild(); VerifyOrQuit(child != NULL, "GetNewChild() failed"); child->SetState(Child::kStateValid); } VerifyOrQuit(table->GetNewChild() == NULL, "GetNewChild() did not fail when table was full"); printf(" -- PASS\n"); testFreeInstance(sInstance); }