| /* |
| * |
| * 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. |
| * |
| */ |
| |
| #ifndef __STDC_FORMAT_MACROS |
| #define __STDC_FORMAT_MACROS |
| #endif |
| |
| #ifndef __STDC_LIMIT_MACROS |
| #define __STDC_LIMIT_MACROS |
| #endif |
| |
| #include <stdint.h> |
| #include <stdio.h> |
| #include <nltest.h> |
| #include <string.h> |
| #include <new> |
| |
| #include "ToolCommon.h" |
| #include "TestGroupKeyStore.h" |
| #include <Weave/Support/ErrorStr.h> |
| #include <Weave/Core/WeaveKeyIds.h> |
| #include <Weave/Core/WeaveEncoding.h> |
| #include <Weave/Profiles/security/WeaveApplicationKeys.h> |
| #include <Weave/Profiles/security/WeavePasscodes.h> |
| #include <Weave/Support/crypto/WeaveCrypto.h> |
| |
| using namespace nl::Weave::Encoding; |
| using namespace nl::Weave::Crypto; |
| using namespace nl::Weave::Profiles::Security::AppKeys; |
| using namespace nl::Weave::Profiles::Security::Passcodes; |
| |
| #define DEBUG_PRINT_ENABLE 0 |
| |
| static void ClearSecretKeyMaterial(WeaveGroupKey& key) |
| { |
| key.KeyId = WeaveKeyId::kNone; |
| key.KeyLen = 0; |
| key.StartTime = UINT32_MAX; |
| ClearSecretData(key.Key, key.MaxKeySize); |
| } |
| |
| void DeriveAppRootKey_Test(nlTestSuite *inSuite, void *inContext) |
| { |
| WEAVE_ERROR err; |
| TestGroupKeyStore keyStore; |
| WeaveGroupKey rootKey; |
| uint32_t keyId; |
| uint8_t rootKeyHKDF[kWeaveAppRootKeySize]; |
| |
| // Derive fabric root key. |
| keyId = WeaveKeyId::kFabricRootKey; |
| err = keyStore.GetGroupKey(keyId, rootKey); |
| NL_TEST_ASSERT(inSuite, err == WEAVE_NO_ERROR); |
| NL_TEST_ASSERT(inSuite, rootKey.KeyLen == kWeaveAppRootKeySize); |
| NL_TEST_ASSERT(inSuite, rootKey.KeyId == keyId); |
| |
| #if DEBUG_PRINT_ENABLE |
| printf("Derived fabric root key:\n"); |
| DumpMemoryCStyle(rootKey.Key, rootKey.KeyLen, " ", 16); |
| #endif |
| |
| // Use HKDF function manually to derive fabric root key and compare against result generated by GetGroupKey(). |
| err = HKDFSHA1::DeriveKey(NULL, 0, |
| sFabricSecret, sFabricSecretLen, |
| NULL, 0, |
| kWeaveAppFabricRootKeyDiversifier, kWeaveAppFabricRootKeyDiversifierSize, |
| rootKeyHKDF, sizeof(rootKeyHKDF), kWeaveAppRootKeySize); |
| NL_TEST_ASSERT(inSuite, err == WEAVE_NO_ERROR); |
| NL_TEST_ASSERT(inSuite, memcmp(rootKey.Key, rootKeyHKDF, kWeaveAppRootKeySize) == 0); |
| |
| // Compare the result against precalculated value. |
| NL_TEST_ASSERT(inSuite, memcmp(rootKey.Key, sFabricRootKey, sFabricRootKeyLen) == 0); |
| |
| ClearSecretKeyMaterial(rootKey); |
| |
| // Derive client root key. |
| keyId = WeaveKeyId::kClientRootKey; |
| err = keyStore.GetGroupKey(keyId, rootKey); |
| NL_TEST_ASSERT(inSuite, err == WEAVE_NO_ERROR); |
| NL_TEST_ASSERT(inSuite, rootKey.KeyLen == kWeaveAppRootKeySize); |
| NL_TEST_ASSERT(inSuite, rootKey.KeyId == keyId); |
| |
| #if DEBUG_PRINT_ENABLE |
| printf("Derived client root key:\n"); |
| DumpMemoryCStyle(rootKey.Key, rootKey.KeyLen, " ", 16); |
| #endif |
| |
| // Use HKDF function manually to derive client root key and compare against result generated by GetGroupKey(). |
| err = HKDFSHA1::DeriveKey(NULL, 0, |
| sFabricSecret, sFabricSecretLen, |
| NULL, 0, |
| kWeaveAppClientRootKeyDiversifier, kWeaveAppClientRootKeyDiversifierSize, |
| rootKeyHKDF, sizeof(rootKeyHKDF), kWeaveAppRootKeySize); |
| NL_TEST_ASSERT(inSuite, err == WEAVE_NO_ERROR); |
| NL_TEST_ASSERT(inSuite, memcmp(rootKey.Key, rootKeyHKDF, kWeaveAppRootKeySize) == 0); |
| |
| // Compare the result against precalculated value. |
| NL_TEST_ASSERT(inSuite, memcmp(rootKey.Key, sClientRootKey, sClientRootKeyLen) == 0); |
| |
| ClearSecretKeyMaterial(rootKey); |
| |
| // Retrieve service root key. |
| keyId = WeaveKeyId::kServiceRootKey; |
| err = keyStore.GetGroupKey(keyId, rootKey); |
| NL_TEST_ASSERT(inSuite, err == WEAVE_NO_ERROR); |
| NL_TEST_ASSERT(inSuite, rootKey.KeyLen == kWeaveAppRootKeySize); |
| NL_TEST_ASSERT(inSuite, rootKey.KeyId == keyId); |
| NL_TEST_ASSERT(inSuite, memcmp(rootKey.Key, sServiceRootKey, sServiceRootKeyLen) == 0); |
| |
| ClearSecretKeyMaterial(rootKey); |
| |
| // Try to derive invalid root key. |
| keyId = sInvalidRootKeyId; |
| err = keyStore.GetGroupKey(keyId, rootKey); |
| NL_TEST_ASSERT(inSuite, err == WEAVE_ERROR_KEY_NOT_FOUND); |
| } |
| |
| void DeriveAppIntermediateKey_Test(nlTestSuite *inSuite, void *inContext) |
| { |
| WEAVE_ERROR err; |
| TestGroupKeyStore keyStore; |
| WeaveGroupKey intermediateKey; |
| uint32_t keyId; |
| |
| // Derive intermediate key from fabric root key and epoch key #2. |
| keyId = sIntermediateKeyId_FRK_E2; |
| err = keyStore.GetGroupKey(keyId, intermediateKey); |
| NL_TEST_ASSERT(inSuite, err == WEAVE_NO_ERROR); |
| |
| #if DEBUG_PRINT_ENABLE |
| printf("Derived intermediate key using fabric root key and epoch key #2 (FRK_E2):\n"); |
| DumpMemoryCStyle(intermediateKey.Key, intermediateKey.KeyLen, " ", 16); |
| #endif |
| |
| // Compare the result against precalculated value. |
| NL_TEST_ASSERT(inSuite, intermediateKey.KeyLen == kWeaveAppIntermediateKeySize); |
| NL_TEST_ASSERT(inSuite, intermediateKey.KeyId == keyId); |
| NL_TEST_ASSERT(inSuite, memcmp(intermediateKey.Key, sIntermediateKey_FRK_E2, sIntermediateKeyLen_FRK_E2) == 0); |
| |
| ClearSecretKeyMaterial(intermediateKey); |
| |
| // Derive intermediate key from fabric root key and current epoch key. |
| keyId = sIntermediateKeyId_FRK_EC; |
| sCurrentUTCTime = sEpochKey2_StartTime + 1; |
| err = keyStore.GetGroupKey(keyId, intermediateKey); |
| NL_TEST_ASSERT(inSuite, err == WEAVE_NO_ERROR); |
| |
| NL_TEST_ASSERT(inSuite, intermediateKey.KeyLen == kWeaveAppIntermediateKeySize); |
| NL_TEST_ASSERT(inSuite, intermediateKey.KeyId == sIntermediateKeyId_FRK_E2); |
| NL_TEST_ASSERT(inSuite, memcmp(intermediateKey.Key, sIntermediateKey_FRK_E2, sIntermediateKeyLen_FRK_E2) == 0); |
| NL_TEST_ASSERT(inSuite, sLastUsedEpochKeyId == sEpochKey2_KeyId); |
| NL_TEST_ASSERT(inSuite, keyStore.TestValue_LastUsedEpochKeyId() == sEpochKey2_KeyId); |
| NL_TEST_ASSERT(inSuite, keyStore.TestValue_NextEpochKeyStartTime() == sEpochKey3_StartTime); |
| |
| ClearSecretKeyMaterial(intermediateKey); |
| |
| // Derive intermediate key from fabric root key and current epoch key, while the time value is not accurate. |
| keyId = sIntermediateKeyId_FRK_EC; |
| sCurrentUTCTime = 0x0; |
| err = keyStore.GetGroupKey(keyId, intermediateKey); |
| NL_TEST_ASSERT(inSuite, err == WEAVE_NO_ERROR); |
| |
| NL_TEST_ASSERT(inSuite, intermediateKey.KeyLen == kWeaveAppIntermediateKeySize); |
| NL_TEST_ASSERT(inSuite, intermediateKey.KeyId == sIntermediateKeyId_FRK_E2); |
| NL_TEST_ASSERT(inSuite, memcmp(intermediateKey.Key, sIntermediateKey_FRK_E2, sIntermediateKeyLen_FRK_E2) == 0); |
| NL_TEST_ASSERT(inSuite, keyStore.TestValue_LastUsedEpochKeyId() == sEpochKey2_KeyId); |
| |
| ClearSecretKeyMaterial(intermediateKey); |
| } |
| |
| void DeriveAppStaticKey_Test(nlTestSuite *inSuite, void *inContext) |
| { |
| WEAVE_ERROR err; |
| TestGroupKeyStore keyStore; |
| uint8_t appStaticKey[sAppStaticKeyLen_CRK_G10]; |
| uint32_t keyId; |
| uint8_t appStaticKeyHKDF[sAppStaticKeyLen_CRK_G10]; |
| uint32_t appGroupGlobalId; |
| |
| // Derive application static key from client root key and group master key #10. |
| keyId = sAppStaticKeyId_CRK_G10; |
| err = keyStore.DeriveApplicationKey(keyId, NULL, 0, |
| sAppStaticKeyDiversifier_CRK_G10, sAppStaticKeyDiversifierLen_CRK_G10, |
| appStaticKey, sizeof(appStaticKey), sAppStaticKeyLen_CRK_G10, appGroupGlobalId); |
| NL_TEST_ASSERT(inSuite, err == WEAVE_NO_ERROR); |
| NL_TEST_ASSERT(inSuite, appGroupGlobalId == sAppGroupMasterKey10_GlobalId); |
| |
| #if DEBUG_PRINT_ENABLE |
| printf("Derived application static key, using client root key and group master key #10 (CRK_G10):\n"); |
| DumpMemoryCStyle(appStaticKey, sAppStaticKeyLen_CRK_G10, " ", 16); |
| #endif |
| |
| // Use HKDF function manually to derive application static key and compare against result generated by DeriveApplicationKey(). |
| err = HKDFSHA1::DeriveKey(NULL, 0, |
| sClientRootKey, sClientRootKeyLen, |
| sAppGroupMasterKey10_Key, sAppGroupMasterKey10_KeyLen, |
| sAppStaticKeyDiversifier_CRK_G10, sAppStaticKeyDiversifierLen_CRK_G10, |
| appStaticKeyHKDF, sizeof(appStaticKeyHKDF), sAppStaticKeyLen_CRK_G10); |
| NL_TEST_ASSERT(inSuite, err == WEAVE_NO_ERROR); |
| |
| NL_TEST_ASSERT(inSuite, memcmp(appStaticKey, appStaticKeyHKDF, sAppStaticKeyLen_CRK_G10) == 0); |
| |
| // Compare the result against precalculated value. |
| NL_TEST_ASSERT(inSuite, keyId == sAppStaticKeyId_CRK_G10); |
| NL_TEST_ASSERT(inSuite, memcmp(appStaticKey, sAppStaticKey_CRK_G10, sAppStaticKeyLen_CRK_G10) == 0); |
| } |
| |
| void DeriveAppRotatingKey_Test(nlTestSuite *inSuite, void *inContext) |
| { |
| WEAVE_ERROR err; |
| TestGroupKeyStore keyStore; |
| uint8_t appRotatingKey[sAppRotatingKeyLen_SRK_E3_G54]; |
| uint32_t keyId; |
| uint8_t intermediateKeyHKDF[kWeaveAppIntermediateKeySize]; |
| uint8_t appRotatingKeyHKDF[sAppRotatingKeyLen_SRK_E3_G54]; |
| uint32_t appGroupGlobalId; |
| |
| // Derive application rotating key from service root key and group master key #54. |
| keyId = sAppRotatingKeyId_SRK_E3_G54; |
| err = keyStore.DeriveApplicationKey(keyId, NULL, 0, |
| sAppRotatingKeyDiversifier_SRK_E3_G54, sAppRotatingKeyDiversifierLen_SRK_E3_G54, |
| appRotatingKey, sizeof(appRotatingKey), sAppRotatingKeyLen_SRK_E3_G54, appGroupGlobalId); |
| NL_TEST_ASSERT(inSuite, err == WEAVE_NO_ERROR); |
| NL_TEST_ASSERT(inSuite, appGroupGlobalId == sAppGroupMasterKey54_GlobalId); |
| |
| #if DEBUG_PRINT_ENABLE |
| printf("Derived application rotating key, using service root key, epoch key #3 and group master key #54 (SRK_E3_G54):\n"); |
| DumpMemoryCStyle(appRotatingKey, sAppRotatingKeyLen_SRK_E3_G54, " ", 16); |
| #endif |
| |
| // Use HKDF function manually to derive application rotating key and compare against result generated by DeriveApplicationKey(). |
| err = HKDFSHA1::DeriveKey(NULL, 0, |
| sServiceRootKey, sServiceRootKeyLen, |
| sEpochKey3_Key, sEpochKey3_KeyLen, |
| kWeaveAppIntermediateKeyDiversifier, kWeaveAppIntermediateKeyDiversifierSize, |
| intermediateKeyHKDF, sizeof(intermediateKeyHKDF), kWeaveAppIntermediateKeySize); |
| NL_TEST_ASSERT(inSuite, err == WEAVE_NO_ERROR); |
| |
| err = HKDFSHA1::DeriveKey(NULL, 0, |
| intermediateKeyHKDF, kWeaveAppIntermediateKeySize, |
| sAppGroupMasterKey54_Key, sAppGroupMasterKey54_KeyLen, |
| sAppRotatingKeyDiversifier_SRK_E3_G54, sAppRotatingKeyDiversifierLen_SRK_E3_G54, |
| appRotatingKeyHKDF, sizeof(appRotatingKeyHKDF), sAppRotatingKeyLen_SRK_E3_G54); |
| NL_TEST_ASSERT(inSuite, err == WEAVE_NO_ERROR); |
| |
| NL_TEST_ASSERT(inSuite, memcmp(appRotatingKey, appRotatingKeyHKDF, sAppRotatingKeyLen_SRK_E3_G54) == 0); |
| |
| // Compare the result against precalculated value. |
| NL_TEST_ASSERT(inSuite, keyId == sAppRotatingKeyId_SRK_E3_G54); |
| NL_TEST_ASSERT(inSuite, memcmp(appRotatingKey, sAppRotatingKey_SRK_E3_G54, sAppRotatingKeyLen_SRK_E3_G54) == 0); |
| } |
| |
| void DerivePasscodeKeys_Test(nlTestSuite *inSuite, void *inContext) |
| { |
| WEAVE_ERROR err; |
| TestGroupKeyStore keyStore; |
| uint8_t appKey[sPasscodeEncRotatingKeyLen_CRK_E0_G4]; |
| uint32_t keyId; |
| uint8_t nonce[sPasscodeEncryptionKeyNonceLen]; |
| uint8_t intermediateKeyHKDF[kWeaveAppIntermediateKeySize]; |
| uint8_t appKeyHKDF[sPasscodeEncRotatingKeyLen_CRK_E0_G4]; |
| uint32_t appGroupGlobalId; |
| |
| // 1. Derive passcode encryption (and authentication) ROTATING key using client root key, epoch key #0 and group master key #4. |
| keyId = sPasscodeEncRotatingKeyId_CRK_E0_G4; |
| LittleEndian::Put32(nonce, sPasscodeEncryptionKeyNonce); |
| err = keyStore.DeriveApplicationKey(keyId, nonce, sPasscodeEncryptionKeyNonceLen, |
| sPasscodeEncryptionKeyDiversifier, sPasscodeEncryptionKeyDiversifierLen, |
| appKey, sizeof(appKey), sPasscodeEncRotatingKeyLen_CRK_E0_G4, appGroupGlobalId); |
| NL_TEST_ASSERT(inSuite, err == WEAVE_NO_ERROR); |
| NL_TEST_ASSERT(inSuite, keyId == sPasscodeEncRotatingKeyId_CRK_E0_G4); |
| NL_TEST_ASSERT(inSuite, memcmp(appKey, sPasscodeEncRotatingKey_CRK_E0_G4, sPasscodeEncRotatingKeyLen_CRK_E0_G4) == 0); |
| NL_TEST_ASSERT(inSuite, appGroupGlobalId == sAppGroupMasterKey4_GlobalId); |
| |
| #if DEBUG_PRINT_ENABLE |
| printf("Derived passcode encryption (and authentication) rotating key using client root key, epoch key #0 and group master key #4 (CRK_E0_G4):\n"); |
| DumpMemoryCStyle(appKey, sPasscodeEncRotatingKeyLen_CRK_E0_G4, " ", 16); |
| #endif |
| |
| // Use HKDF function manually to derive passcode encryption rotating key and compare against result generated by DeriveApplicationKey(). |
| err = HKDFSHA1::DeriveKey(NULL, 0, |
| sClientRootKey, sClientRootKeyLen, |
| sEpochKey0_Key, sEpochKey0_KeyLen, |
| kWeaveAppIntermediateKeyDiversifier, kWeaveAppIntermediateKeyDiversifierSize, |
| intermediateKeyHKDF, sizeof(intermediateKeyHKDF), kWeaveAppIntermediateKeySize); |
| NL_TEST_ASSERT(inSuite, err == WEAVE_NO_ERROR); |
| |
| err = HKDFSHA1::DeriveKey(nonce, sPasscodeEncryptionKeyNonceLen, |
| intermediateKeyHKDF, kWeaveAppIntermediateKeySize, |
| sAppGroupMasterKey4_Key, sAppGroupMasterKey4_KeyLen, |
| sPasscodeEncryptionKeyDiversifier, sPasscodeEncryptionKeyDiversifierLen, |
| appKeyHKDF, sizeof(appKeyHKDF), sPasscodeEncRotatingKeyLen_CRK_E0_G4); |
| NL_TEST_ASSERT(inSuite, err == WEAVE_NO_ERROR); |
| NL_TEST_ASSERT(inSuite, memcmp(appKey, appKeyHKDF, sPasscodeEncRotatingKeyLen_CRK_E0_G4) == 0); |
| |
| |
| // 2. Derive passcode encryption (and authentication) STATIC key using client root key and group master key #4. |
| keyId = sPasscodeEncStaticKeyId_CRK_G4; |
| LittleEndian::Put32(nonce, sPasscodeEncryptionKeyNonce); |
| err = keyStore.DeriveApplicationKey(keyId, nonce, sPasscodeEncryptionKeyNonceLen, |
| sPasscodeEncryptionKeyDiversifier, sPasscodeEncryptionKeyDiversifierLen, |
| appKey, sizeof(appKey), sPasscodeEncStaticKeyLen_CRK_G4, appGroupGlobalId); |
| NL_TEST_ASSERT(inSuite, err == WEAVE_NO_ERROR); |
| NL_TEST_ASSERT(inSuite, keyId == sPasscodeEncStaticKeyId_CRK_G4); |
| NL_TEST_ASSERT(inSuite, memcmp(appKey, sPasscodeEncStaticKey_CRK_G4, sPasscodeEncStaticKeyLen_CRK_G4) == 0); |
| NL_TEST_ASSERT(inSuite, appGroupGlobalId == sAppGroupMasterKey4_GlobalId); |
| |
| #if DEBUG_PRINT_ENABLE |
| printf("Derived passcode encryption (and authentication) static key using client root key and group master key #4 (CRK_G4):\n"); |
| DumpMemoryCStyle(appKey, sPasscodeEncStaticKeyLen_CRK_G4, " ", 16); |
| #endif |
| |
| // Use HKDF function manually to derive passcode encryption static key and compare against result generated by DeriveApplicationKey(). |
| err = HKDFSHA1::DeriveKey(nonce, sPasscodeEncryptionKeyNonceLen, |
| sClientRootKey, sClientRootKeyLen, |
| sAppGroupMasterKey4_Key, sAppGroupMasterKey4_KeyLen, |
| sPasscodeEncryptionKeyDiversifier, sPasscodeEncryptionKeyDiversifierLen, |
| appKeyHKDF, sizeof(appKeyHKDF), sPasscodeEncRotatingKeyLen_CRK_E0_G4); |
| NL_TEST_ASSERT(inSuite, err == WEAVE_NO_ERROR); |
| NL_TEST_ASSERT(inSuite, memcmp(appKey, appKeyHKDF, sPasscodeEncStaticKeyLen_CRK_G4) == 0); |
| |
| |
| // 3. Derive passcode fingerprint (always static) key using client root key and group master key #4. |
| keyId = sPasscodeFingerprintKeyId_CRK_G4; |
| err = keyStore.DeriveApplicationKey(keyId, NULL, 0, |
| kPasscodeFingerprintKeyDiversifier, kPasscodeFingerprintKeyDiversifierSize, |
| appKey, sizeof(appKey), sPasscodeFingerprintKeyLen_CRK_G4, appGroupGlobalId); |
| NL_TEST_ASSERT(inSuite, err == WEAVE_NO_ERROR); |
| NL_TEST_ASSERT(inSuite, keyId == sPasscodeFingerprintKeyId_CRK_G4); |
| NL_TEST_ASSERT(inSuite, memcmp(appKey, sPasscodeFingerprintKey_CRK_G4, sPasscodeFingerprintKeyLen_CRK_G4) == 0); |
| NL_TEST_ASSERT(inSuite, appGroupGlobalId == sAppGroupMasterKey4_GlobalId); |
| |
| #if DEBUG_PRINT_ENABLE |
| printf("Derived passcode fingerprint key using client root key and group master key #4 (CRK_G4):\n"); |
| DumpMemoryCStyle(appKey, sPasscodeFingerprintKeyLen_CRK_G4, " ", 16); |
| #endif |
| |
| // Use HKDF function manually to derive passcode encryption static key and compare against result generated by DeriveApplicationKey(). |
| err = HKDFSHA1::DeriveKey(NULL, 0, |
| sClientRootKey, sClientRootKeyLen, |
| sAppGroupMasterKey4_Key, sAppGroupMasterKey4_KeyLen, |
| kPasscodeFingerprintKeyDiversifier, kPasscodeFingerprintKeyDiversifierSize, |
| appKeyHKDF, sizeof(appKeyHKDF), sPasscodeFingerprintKeyLen_CRK_G4); |
| NL_TEST_ASSERT(inSuite, err == WEAVE_NO_ERROR); |
| NL_TEST_ASSERT(inSuite, memcmp(appKey, appKeyHKDF, sPasscodeFingerprintKeyLen_CRK_G4) == 0); |
| } |
| |
| void GetAppGroupMasterKeyId_Test(nlTestSuite *inSuite, void *inContext) |
| { |
| WEAVE_ERROR err; |
| TestGroupKeyStore keyStore; |
| uint32_t groupGlobalId; |
| uint32_t groupMasterKeyId; |
| |
| // Get application group key Id given group global Id - for the app group #0. |
| groupGlobalId = sAppGroupMasterKey0_GlobalId; |
| err = GetAppGroupMasterKeyId(groupGlobalId, &keyStore, groupMasterKeyId); |
| NL_TEST_ASSERT(inSuite, err == WEAVE_NO_ERROR); |
| NL_TEST_ASSERT(inSuite, groupMasterKeyId == sAppGroupMasterKey0_KeyId); |
| |
| groupMasterKeyId = WeaveKeyId::kNone; |
| groupGlobalId = 0; |
| |
| // Get application group key Id given group global Id - for the app group #4. |
| groupGlobalId = sAppGroupMasterKey4_GlobalId; |
| err = GetAppGroupMasterKeyId(groupGlobalId, &keyStore, groupMasterKeyId); |
| NL_TEST_ASSERT(inSuite, err == WEAVE_NO_ERROR); |
| NL_TEST_ASSERT(inSuite, groupMasterKeyId == sAppGroupMasterKey4_KeyId); |
| |
| groupMasterKeyId = WeaveKeyId::kNone; |
| groupGlobalId = 0; |
| |
| // Get application group key Id given group global Id - for the app group #10. |
| groupGlobalId = sAppGroupMasterKey10_GlobalId; |
| err = GetAppGroupMasterKeyId(groupGlobalId, &keyStore, groupMasterKeyId); |
| NL_TEST_ASSERT(inSuite, err == WEAVE_NO_ERROR); |
| NL_TEST_ASSERT(inSuite, groupMasterKeyId == sAppGroupMasterKey10_KeyId); |
| |
| groupMasterKeyId = WeaveKeyId::kNone; |
| groupGlobalId = 0; |
| |
| // Get application group key Id given group global Id - for the app group #54. |
| groupGlobalId = sAppGroupMasterKey54_GlobalId; |
| err = GetAppGroupMasterKeyId(groupGlobalId, &keyStore, groupMasterKeyId); |
| NL_TEST_ASSERT(inSuite, err == WEAVE_NO_ERROR); |
| NL_TEST_ASSERT(inSuite, groupMasterKeyId == sAppGroupMasterKey54_KeyId); |
| } |
| |
| |
| int main(int argc, char *argv[]) |
| { |
| static const nlTest tests[] = { |
| NL_TEST_DEF("DeriveAppRootKey", DeriveAppRootKey_Test), |
| NL_TEST_DEF("DeriveAppIntermediateKey", DeriveAppIntermediateKey_Test), |
| NL_TEST_DEF("DeriveAppStaticKey", DeriveAppStaticKey_Test), |
| NL_TEST_DEF("DeriveAppRotatingKey", DeriveAppRotatingKey_Test), |
| NL_TEST_DEF("DerivePasscodeKeys", DerivePasscodeKeys_Test), |
| NL_TEST_DEF("GetAppGroupMasterKeyId", GetAppGroupMasterKeyId_Test), |
| NL_TEST_SENTINEL() |
| }; |
| |
| static nlTestSuite testSuite = { |
| "application-keys", |
| &tests[0] |
| }; |
| |
| nl_test_set_output_style(OUTPUT_CSV); |
| |
| nlTestRunner(&testSuite, NULL); |
| |
| return nlTestRunnerStats(&testSuite); |
| } |