blob: c6ea253b7e448a4a8a2e64c304e2c63d85104655 [file] [log] [blame]
/*
*
* 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);
}