| /* |
| * |
| * Copyright (c) 2016-2017 Nest Labs, Inc. |
| * All rights reserved. |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| /** |
| * @file |
| * This file implements unit tests for the Weave application keys library. |
| * |
| */ |
| |
| #include <stdio.h> |
| #include <nltest.h> |
| #include <string.h> |
| |
| #include "ToolCommon.h" |
| #include "TestGroupKeyStore.h" |
| #include <Weave/Support/ErrorStr.h> |
| #include <Weave/Core/WeaveKeyIds.h> |
| |
| #define DEBUG_PRINT_ENABLE 0 |
| |
| void KeyIds_Test1(nlTestSuite *inSuite, void *inContext) |
| { |
| // Testing WeaveKeyId::GetType(). |
| NL_TEST_ASSERT(inSuite, WeaveKeyId::GetType(WeaveKeyId::kNone) == WeaveKeyId::kType_None); |
| NL_TEST_ASSERT(inSuite, WeaveKeyId::GetType(WeaveKeyId::kFabricSecret) == WeaveKeyId::kType_General); |
| NL_TEST_ASSERT(inSuite, WeaveKeyId::GetType(sTestDefaultTCPSessionKeyId) == WeaveKeyId::kType_Session); |
| NL_TEST_ASSERT(inSuite, WeaveKeyId::GetType(sAppStaticKeyId_CRK_G10) == WeaveKeyId::kType_AppStaticKey); |
| NL_TEST_ASSERT(inSuite, WeaveKeyId::GetType(sAppRotatingKeyId_SRK_E3_G54) == WeaveKeyId::kType_AppRotatingKey); |
| NL_TEST_ASSERT(inSuite, WeaveKeyId::GetType(WeaveKeyId::kServiceRootKey) == WeaveKeyId::kType_AppRootKey); |
| NL_TEST_ASSERT(inSuite, WeaveKeyId::GetType(sEpochKey0_KeyId) == WeaveKeyId::kType_AppEpochKey); |
| NL_TEST_ASSERT(inSuite, WeaveKeyId::GetType(sAppGroupMasterKey0_KeyId) == WeaveKeyId::kType_AppGroupMasterKey); |
| NL_TEST_ASSERT(inSuite, WeaveKeyId::GetType(sIntermediateKeyId_FRK_E2) == WeaveKeyId::kType_AppIntermediateKey); |
| |
| // Testing key type checking functions. |
| NL_TEST_ASSERT(inSuite, WeaveKeyId::IsGeneralKey(WeaveKeyId::kFabricSecret)); |
| NL_TEST_ASSERT(inSuite, WeaveKeyId::IsSessionKey(sTestDefaultSessionKeyId)); |
| NL_TEST_ASSERT(inSuite, WeaveKeyId::IsAppStaticKey(sPasscodeEncStaticKeyId_CRK_G4)); |
| NL_TEST_ASSERT(inSuite, WeaveKeyId::IsAppRotatingKey(sPasscodeEncRotatingKeyId_CRK_E0_G4)); |
| NL_TEST_ASSERT(inSuite, WeaveKeyId::IsAppGroupKey(sPasscodeEncRotatingKeyId_CRK_E0_G4)); |
| NL_TEST_ASSERT(inSuite, WeaveKeyId::IsAppRootKey(sInvalidRootKeyId)); |
| NL_TEST_ASSERT(inSuite, WeaveKeyId::IsAppEpochKey(sEpochKey3_KeyId)); |
| NL_TEST_ASSERT(inSuite, WeaveKeyId::IsAppGroupMasterKey(sAppGroupMasterKey54_KeyId)); |
| |
| NL_TEST_ASSERT(inSuite, !WeaveKeyId::IsGeneralKey(sTestDefaultSessionKeyId)); |
| NL_TEST_ASSERT(inSuite, !WeaveKeyId::IsSessionKey(sAppGroupMasterKey54_KeyId)); |
| NL_TEST_ASSERT(inSuite, !WeaveKeyId::IsAppStaticKey(sPasscodeEncRotatingKeyId_CRK_E0_G4)); |
| NL_TEST_ASSERT(inSuite, !WeaveKeyId::IsAppRotatingKey(sPasscodeEncStaticKeyId_CRK_G4)); |
| NL_TEST_ASSERT(inSuite, !WeaveKeyId::IsAppGroupKey(WeaveKeyId::kFabricSecret)); |
| NL_TEST_ASSERT(inSuite, !WeaveKeyId::IsAppRootKey(WeaveKeyId::kFabricSecret)); |
| NL_TEST_ASSERT(inSuite, !WeaveKeyId::IsAppEpochKey(sInvalidRootKeyId)); |
| NL_TEST_ASSERT(inSuite, !WeaveKeyId::IsAppGroupMasterKey(sEpochKey3_KeyId)); |
| |
| // Testing get constituent key functions. |
| NL_TEST_ASSERT(inSuite, WeaveKeyId::GetRootKeyId(sPasscodeEncRotatingKeyId_CRK_E0_G4) == WeaveKeyId::kClientRootKey); |
| NL_TEST_ASSERT(inSuite, WeaveKeyId::GetEpochKeyId(sPasscodeEncRotatingKeyId_CRK_E0_G4) == sEpochKey0_KeyId); |
| NL_TEST_ASSERT(inSuite, WeaveKeyId::GetAppGroupMasterKeyId(sPasscodeEncStaticKeyId_CRK_G4) == sAppGroupMasterKey4_KeyId); |
| NL_TEST_ASSERT(inSuite, WeaveKeyId::GetRootKeyNumber(sInvalidRootKeyId) == sInvalidRootKeyNumber); |
| NL_TEST_ASSERT(inSuite, WeaveKeyId::GetEpochKeyNumber(sAppRotatingKeyId_SRK_E3_G54) == sEpochKey3_Number); |
| NL_TEST_ASSERT(inSuite, WeaveKeyId::GetAppGroupLocalNumber(sPasscodeEncStaticKeyId_CRK_G4) == sAppGroupMasterKey4_Number); |
| |
| // Testing make key functions. |
| uint16_t shortKeyNumber = 0x02F6; |
| uint16_t longKeyNumber = 0x8000 | shortKeyNumber; |
| NL_TEST_ASSERT(inSuite, WeaveKeyId::MakeSessionKeyId(shortKeyNumber) == (WeaveKeyId::kType_Session | shortKeyNumber)); |
| NL_TEST_ASSERT(inSuite, WeaveKeyId::MakeGeneralKeyId(shortKeyNumber) == (WeaveKeyId::kType_General | shortKeyNumber)); |
| NL_TEST_ASSERT(inSuite, WeaveKeyId::MakeSessionKeyId(longKeyNumber) == (WeaveKeyId::kType_Session | shortKeyNumber)); |
| NL_TEST_ASSERT(inSuite, WeaveKeyId::MakeGeneralKeyId(longKeyNumber) == (WeaveKeyId::kType_General | shortKeyNumber)); |
| shortKeyNumber = 0x03; |
| NL_TEST_ASSERT(inSuite, WeaveKeyId::MakeRootKeyId(shortKeyNumber) == (static_cast<uint32_t>(WeaveKeyId::kType_AppRootKey | (shortKeyNumber << 10)))); |
| NL_TEST_ASSERT(inSuite, WeaveKeyId::MakeEpochKeyId(shortKeyNumber) == (static_cast<uint32_t>(WeaveKeyId::kType_AppEpochKey | (shortKeyNumber << 7)))); |
| NL_TEST_ASSERT(inSuite, WeaveKeyId::MakeAppGroupMasterKeyId(shortKeyNumber) == (static_cast<uint32_t>(WeaveKeyId::kType_AppGroupMasterKey | (shortKeyNumber << 0)))); |
| |
| // Testing property checking functions. |
| NL_TEST_ASSERT(inSuite, WeaveKeyId::IncorporatesEpochKey(sPasscodeEncRotatingKeyId_CRK_E0_G4)); |
| NL_TEST_ASSERT(inSuite, WeaveKeyId::UsesCurrentEpochKey(sIntermediateKeyId_FRK_EC)); |
| NL_TEST_ASSERT(inSuite, WeaveKeyId::IncorporatesRootKey(sAppRotatingKeyId_SRK_E3_G54)); |
| NL_TEST_ASSERT(inSuite, WeaveKeyId::IncorporatesAppGroupMasterKey(sAppStaticKeyId_CRK_G10)); |
| |
| NL_TEST_ASSERT(inSuite, !WeaveKeyId::IncorporatesEpochKey(sPasscodeEncStaticKeyId_CRK_G4)); |
| NL_TEST_ASSERT(inSuite, !WeaveKeyId::UsesCurrentEpochKey(sIntermediateKeyId_FRK_E2)); |
| NL_TEST_ASSERT(inSuite, !WeaveKeyId::IncorporatesRootKey(sTestDefaultSessionKeyId)); |
| NL_TEST_ASSERT(inSuite, !WeaveKeyId::IncorporatesAppGroupMasterKey(sIntermediateKeyId_FRK_E2)); |
| |
| // Testing make key functions. |
| uint32_t keyId; |
| uint32_t keyId2; |
| keyId = WeaveKeyId::MakeAppKeyId(WeaveKeyId::kType_AppRootKey, WeaveKeyId::kClientRootKey, WeaveKeyId::kNone, WeaveKeyId::kNone, false); |
| NL_TEST_ASSERT(inSuite, keyId == WeaveKeyId::kClientRootKey); |
| keyId = WeaveKeyId::MakeAppKeyId(WeaveKeyId::kType_AppEpochKey, WeaveKeyId::kNone, sEpochKey3_KeyId, WeaveKeyId::kNone, true); |
| NL_TEST_ASSERT(inSuite, keyId == WeaveKeyId::ConvertToCurrentAppKeyId(sEpochKey3_KeyId)); |
| keyId = WeaveKeyId::MakeAppIntermediateKeyId(WeaveKeyId::kClientRootKey, sEpochKey3_KeyId, false); |
| keyId2 = WeaveKeyId::kType_AppIntermediateKey | ((WeaveKeyId::kClientRootKey | sEpochKey3_KeyId) & 0xFFF); |
| NL_TEST_ASSERT(inSuite, keyId == keyId2); |
| keyId = WeaveKeyId::MakeAppRotatingKeyId(WeaveKeyId::kFabricRootKey, sEpochKey5_KeyId, sAppGroupMasterKey54_KeyId, false); |
| keyId2 = WeaveKeyId::kType_AppRotatingKey | ((WeaveKeyId::kFabricRootKey | sEpochKey5_KeyId | sAppGroupMasterKey54_KeyId) & 0xFFF); |
| NL_TEST_ASSERT(inSuite, keyId == keyId2); |
| keyId = WeaveKeyId::MakeAppStaticKeyId(WeaveKeyId::kServiceRootKey, sAppGroupMasterKey4_KeyId); |
| keyId2 = WeaveKeyId::kType_AppStaticKey | ((WeaveKeyId::kServiceRootKey | sAppGroupMasterKey4_KeyId) & 0xFFF); |
| NL_TEST_ASSERT(inSuite, keyId == keyId2); |
| |
| NL_TEST_ASSERT(inSuite, WeaveKeyId::ConvertToCurrentAppKeyId(sIntermediateKeyId_FRK_E2) == sIntermediateKeyId_FRK_EC); |
| NL_TEST_ASSERT(inSuite, WeaveKeyId::ConvertToStaticAppKeyId(sPasscodeEncRotatingKeyId_CRK_E0_G4) == sPasscodeEncStaticKeyId_CRK_G4); |
| NL_TEST_ASSERT(inSuite, WeaveKeyId::UpdateEpochKeyId(sIntermediateKeyId_FRK_EC, sEpochKey2_KeyId) == sIntermediateKeyId_FRK_E2); |
| |
| // Testing WeaveKeyId::IsValidKeyId() function. |
| NL_TEST_ASSERT(inSuite, !WeaveKeyId::IsValidKeyId(WeaveKeyId::kNone)); |
| NL_TEST_ASSERT(inSuite, WeaveKeyId::IsValidKeyId(WeaveKeyId::kFabricSecret)); |
| NL_TEST_ASSERT(inSuite, WeaveKeyId::IsValidKeyId(sTestDefaultSessionKeyId)); |
| NL_TEST_ASSERT(inSuite, WeaveKeyId::IsValidKeyId(sPasscodeEncStaticKeyId_CRK_G4)); |
| NL_TEST_ASSERT(inSuite, WeaveKeyId::IsValidKeyId(sPasscodeEncRotatingKeyId_CRK_E0_G4)); |
| NL_TEST_ASSERT(inSuite, WeaveKeyId::IsValidKeyId(WeaveKeyId::kClientRootKey)); |
| NL_TEST_ASSERT(inSuite, WeaveKeyId::IsValidKeyId(sIntermediateKeyId_FRK_E2)); |
| NL_TEST_ASSERT(inSuite, WeaveKeyId::IsValidKeyId(sIntermediateKeyId_FRK_EC)); |
| NL_TEST_ASSERT(inSuite, WeaveKeyId::IsValidKeyId(sEpochKey4_KeyId)); |
| NL_TEST_ASSERT(inSuite, WeaveKeyId::IsValidKeyId(WeaveKeyId::ConvertToCurrentAppKeyId(sEpochKey4_KeyId))); |
| NL_TEST_ASSERT(inSuite, WeaveKeyId::IsValidKeyId(sAppGroupMasterKey54_KeyId)); |
| |
| NL_TEST_ASSERT(inSuite, !WeaveKeyId::IsValidKeyId(sInvalidRootKeyId)); |
| NL_TEST_ASSERT(inSuite, !WeaveKeyId::IsValidKeyId(WeaveKeyId::MakeEpochKeyId(0x08))); |
| NL_TEST_ASSERT(inSuite, !WeaveKeyId::IsValidKeyId(WeaveKeyId::MakeAppGroupMasterKeyId(0x80))); |
| NL_TEST_ASSERT(inSuite, !WeaveKeyId::IsValidKeyId(sPasscodeEncStaticKeyId_CRK_G4 | 0x40000000)); |
| NL_TEST_ASSERT(inSuite, !WeaveKeyId::IsValidKeyId(WeaveKeyId::kType_AppGroupMasterKey | WeaveKeyId::kType_AppRotatingKey)); |
| |
| // Testing WeaveKeyId::DescribeKey() function. |
| const char *strKeyId1; |
| const char *strKeyId2; |
| strKeyId1 = WeaveKeyId::DescribeKey(WeaveKeyId::kNone); |
| strKeyId2 = WeaveKeyId::DescribeKey(0xFFF); |
| NL_TEST_ASSERT(inSuite, strcmp(strKeyId1, strKeyId2) == 0); |
| strKeyId1 = WeaveKeyId::DescribeKey(WeaveKeyId::kFabricSecret); |
| strKeyId2 = WeaveKeyId::DescribeKey(WeaveKeyId::kFabricRootKey); |
| NL_TEST_ASSERT(inSuite, strcmp(strKeyId1, strKeyId2) != 0); |
| strKeyId1 = WeaveKeyId::DescribeKey(sIntermediateKeyId_FRK_E2); |
| NL_TEST_ASSERT(inSuite, strcmp(strKeyId1, "Application Intermediate Key") == 0); |
| strKeyId1 = WeaveKeyId::DescribeKey(sInvalidRootKeyId); |
| NL_TEST_ASSERT(inSuite, strcmp(strKeyId1, "Other Root Key") == 0); |
| strKeyId1 = WeaveKeyId::DescribeKey(sAppGroupMasterKey54_KeyId); |
| NL_TEST_ASSERT(inSuite, strcmp(strKeyId1, "Application Group Master Key") == 0); |
| } |
| |
| |
| int main(int argc, char *argv[]) |
| { |
| static const nlTest tests[] = { |
| NL_TEST_DEF("KeyIds_Test1", KeyIds_Test1), |
| NL_TEST_SENTINEL() |
| }; |
| |
| static nlTestSuite testSuite = { |
| "key-identifiers", |
| &tests[0] |
| }; |
| |
| nl_test_set_output_style(OUTPUT_CSV); |
| |
| nlTestRunner(&testSuite, NULL); |
| |
| return nlTestRunnerStats(&testSuite); |
| } |