Coverage Report

Created: 2026-01-24 06:26

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/openweave-core/src/test-apps/PASEEngineTest.cpp
Line
Count
Source
1
/*
2
 *
3
 *    Copyright (c) 2013-2017 Nest Labs, Inc.
4
 *    All rights reserved.
5
 *
6
 *    Licensed under the Apache License, Version 2.0 (the "License");
7
 *    you may not use this file except in compliance with the License.
8
 *    You may obtain a copy of the License at
9
 *
10
 *        http://www.apache.org/licenses/LICENSE-2.0
11
 *
12
 *    Unless required by applicable law or agreed to in writing, software
13
 *    distributed under the License is distributed on an "AS IS" BASIS,
14
 *    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15
 *    See the License for the specific language governing permissions and
16
 *    limitations under the License.
17
 */
18
19
/**
20
 *    @file
21
 *      A library for manipulating PASE state for testing and fuzzing
22
 *
23
 */
24
25
26
#include <stdio.h>
27
#include <vector>
28
29
#include "ToolCommon.h"
30
#include "PASEEngineTest.h"
31
#include <Weave/Support/ErrorStr.h>
32
#include <Weave/Profiles/security/WeaveSecurity.h>
33
#include <Weave/Profiles/security/WeavePASE.h>
34
#include <Weave/Support/RandUtils.h>
35
36
#if WEAVE_SYSTEM_CONFIG_USE_LWIP
37
#include "lwip/tcpip.h"
38
#endif // WEAVE_SYSTEM_CONFIG_USE_LWIP
39
40
using namespace nl::Weave::Profiles::Security;
41
using namespace nl::Weave::Profiles::Security::PASE;
42
using System::PacketBuffer;
43
44
#define TOOL_NAME "TestPASE"
45
const char * INITIATOR_STEP_1 = "InitiatorStep1";
46
const char * RESPONDER_RECONFIGURE = "ResponderReconfigure";
47
const char * RESPONDER_STEP_1 = "ResponderStep1";
48
const char * RESPONDER_STEP_2 = "ResponderStep2";
49
const char * INITIATOR_STEP_2 = "InitiatorStep2";
50
const char * RESPONDER_KEY_CONFIRM = "ResponderKeyConfirm";
51
52
14.4k
#define VerifyOrQuit(TST, MSG) \
53
14.4k
do { \
54
14.4k
    if (!(TST)) \
55
14.4k
    { \
56
0
        fprintf(stderr, "%s FAILED: ", __FUNCTION__); \
57
0
        fputs(MSG, stderr); \
58
0
        exit(-1); \
59
0
    } \
60
14.4k
} while (0)
61
62
54.4k
#define SuccessOrQuit(ERR, MSG) \
63
54.4k
do { \
64
54.4k
    if ((ERR) != WEAVE_NO_ERROR) \
65
54.4k
    { \
66
0
        fprintf(stderr, "%s FAILED: ", __FUNCTION__); \
67
0
        fputs(MSG, stderr); \
68
0
        fputs(ErrorStr(ERR), stderr); \
69
0
        fputs("\n", stderr); \
70
0
        exit(-1); \
71
0
    } \
72
54.4k
} while (0)
73
74
0
void MessageMutator::MutateMessage(const char *msgName, PacketBuffer *msgBuf) { }
75
76
static MessageMutator gNullMutator;
77
78
MessageExternalFuzzer::MessageExternalFuzzer(const char *msgType)
79
8.50k
{
80
8.50k
    mMsgType = msgType;
81
8.50k
    mSaveCorpus = false;
82
8.50k
}
83
void MessageExternalFuzzer::MutateMessage(const char *msgType, PacketBuffer *msgBuf)
84
23.9k
{
85
23.9k
    if (strcmp(msgType, mMsgType) == 0)
86
8.50k
    {
87
8.50k
        uint8_t *msgStart = msgBuf->Start();
88
8.50k
        if (mSaveCorpus)
89
0
        {
90
0
            MessageExternalFuzzer::SaveCorpus(msgStart, msgBuf->DataLength(), mMsgType);
91
0
        }
92
8.50k
        msgBuf->SetDataLength(mFuzzInputSize);
93
8.50k
        memcpy(msgStart, mFuzzInput, msgBuf->DataLength());
94
8.50k
    }
95
23.9k
}
96
97
void MessageExternalFuzzer::SaveCorpus(const uint8_t *inBuf, size_t size, const char *fileName)
98
0
{
99
0
    FILE* file = fopen(fileName, "wb+" );
100
0
    VerifyOrQuit(file != NULL, "Could not open file");
101
0
    VerifyOrQuit((fwrite(inBuf, 1, size, file) == size), "Could not write corpus file.");
102
0
    fclose(file);
103
0
}
104
105
0
MessageExternalFuzzer& MessageExternalFuzzer::SaveCorpusFile(bool val) { mSaveCorpus = val; return *this; }
106
107
8.50k
MessageExternalFuzzer& MessageExternalFuzzer::FuzzInput(const uint8_t *val, size_t size) { mFuzzInput = val; mFuzzInputSize = size; return *this; }
108
109
//Start PASEEngineTest Initialization
110
PASEEngineTest::PASEEngineTest(const char *testName)
111
8.50k
{
112
8.50k
    mTestName = testName;
113
8.50k
    mProposedConfig = mExpectedConfig = kPASEConfig_Unspecified;
114
8.50k
    mInitPW = mRespPW = "TestPassword";
115
8.50k
    mInitiatorAllowedConfigs = mResponderAllowedConfigs = kPASEConfig_Config1|kPASEConfig_Config4;
116
8.50k
    mExpectReconfig = false;
117
8.50k
    mForceRepeatedReconfig = false;
118
8.50k
    memset(mExpectedErrors, 0, sizeof(mExpectedErrors));
119
8.50k
    mMutator = &gNullMutator;
120
8.50k
    mLogMessageData = false;
121
8.50k
}
122
123
0
const char *PASEEngineTest::TestName() const { return mTestName; }
124
125
8.50k
uint32_t PASEEngineTest::ProposedConfig() const { return mProposedConfig; }
126
8.50k
PASEEngineTest& PASEEngineTest::ProposedConfig(uint32_t val) { mProposedConfig = val; return *this; }
127
128
0
uint32_t PASEEngineTest::InitiatorAllowedConfigs() const { return mInitiatorAllowedConfigs; }
129
0
PASEEngineTest& PASEEngineTest::InitiatorAllowedConfigs(uint32_t val) { mInitiatorAllowedConfigs = val; return *this; }
130
131
0
uint32_t PASEEngineTest::ResponderAllowedConfigs() const { return mResponderAllowedConfigs; }
132
8.50k
PASEEngineTest& PASEEngineTest::ResponderAllowedConfigs(uint32_t val) { mResponderAllowedConfigs = val; return *this; }
133
134
0
const char* PASEEngineTest::InitiatorPassword() const { return mInitPW; }
135
8.50k
PASEEngineTest& PASEEngineTest::InitiatorPassword(const char* val) { mInitPW = val; return *this; }
136
137
0
const char* PASEEngineTest::ResponderPassword() const { return mRespPW; }
138
8.50k
PASEEngineTest& PASEEngineTest::ResponderPassword(const char* val) { mRespPW = val; return *this; }
139
140
5.96k
uint32_t PASEEngineTest::ExpectReconfig() const { return mExpectReconfig; }
141
PASEEngineTest& PASEEngineTest::ExpectReconfig(uint32_t expectedConfig)
142
0
{
143
0
    mExpectReconfig = true;
144
0
    mExpectedConfig = expectedConfig;
145
0
    return *this;
146
0
}
147
0
uint32_t PASEEngineTest::ExpectedConfig() const { return mExpectedConfig != kPASEConfig_Unspecified ? mExpectedConfig : mProposedConfig; }
148
149
0
bool PASEEngineTest::PerformReconfig() const { return mForceRepeatedReconfig; }
150
0
PASEEngineTest& PASEEngineTest::PerformReconfig(bool val) { mForceRepeatedReconfig = val; return *this; }
151
152
0
bool PASEEngineTest::ConfirmKey() const { return mConfirmKey; }
153
8.50k
PASEEngineTest& PASEEngineTest::ConfirmKey(bool val) { mConfirmKey = val; return *this; }
154
155
PASEEngineTest& PASEEngineTest::ExpectError(WEAVE_ERROR err)
156
0
{
157
0
    return ExpectError(NULL, err);
158
0
}
159
160
PASEEngineTest& PASEEngineTest::ExpectError(const char *opName, WEAVE_ERROR err)
161
51.0k
{
162
186k
    for (size_t i = 0; i < kMaxExpectedErrors; i++)
163
186k
    {
164
186k
        if (mExpectedErrors[i].Error == WEAVE_NO_ERROR)
165
51.0k
        {
166
51.0k
            mExpectedErrors[i].Error = err;
167
51.0k
            mExpectedErrors[i].OpName = opName;
168
51.0k
            break;
169
51.0k
        }
170
186k
    }
171
172
51.0k
    return *this;
173
51.0k
}
174
175
bool PASEEngineTest::IsExpectedError(const char *opName, WEAVE_ERROR err) const
176
30.5k
{
177
165k
    for (size_t i = 0; i < kMaxExpectedErrors && mExpectedErrors[i].Error != WEAVE_NO_ERROR; i++)
178
143k
    {
179
143k
        if (mExpectedErrors[i].Error == err &&
180
8.50k
            (mExpectedErrors[i].OpName == NULL || strcmp(mExpectedErrors[i].OpName, opName) == 0))
181
8.50k
        {
182
8.50k
            return true;
183
8.50k
        }
184
143k
    }
185
22.0k
    return false;
186
30.5k
}
187
188
0
bool PASEEngineTest::IsSuccessExpected() const { return mExpectedErrors[0].Error == WEAVE_NO_ERROR; }
189
190
8.50k
PASEEngineTest& PASEEngineTest::Mutator(MessageMutator *mutator) { mMutator = mutator; return *this; }
191
192
40.9k
bool PASEEngineTest::LogMessageData() const { return mLogMessageData; }
193
8.50k
PASEEngineTest& PASEEngineTest::LogMessageData(bool val) { mLogMessageData = val; return *this; }
194
195
//private
196
void PASEEngineTest::setAllowedResponderConfigs(WeavePASEEngine &responderEng)
197
8.50k
{
198
#if WEAVE_CONFIG_SUPPORT_PASE_CONFIG0_TEST_ONLY
199
        if (mResponderAllowedConfigs == kPASEConfig_Config0_TEST_ONLY)
200
            responderEng.AllowedPASEConfigs = kPASEConfig_SupportConfig0Bit_TEST_ONLY;
201
        else
202
#endif
203
8.50k
#if WEAVE_CONFIG_SUPPORT_PASE_CONFIG1
204
8.50k
        if (mResponderAllowedConfigs == kPASEConfig_Config1)
205
8.50k
            responderEng.AllowedPASEConfigs = kPASEConfig_SupportConfig1Bit;
206
0
        else
207
0
#endif
208
#if WEAVE_CONFIG_SUPPORT_PASE_CONFIG2
209
        if (mResponderAllowedConfigs == kPASEConfig_Config2)
210
            respEng.AllowedPASEConfigs = kPASEConfig_SupportConfig2Bit;
211
        else
212
#endif
213
#if WEAVE_CONFIG_SUPPORT_PASE_CONFIG3
214
        if (mResponderAllowedConfigs == kPASEConfig_Config3)
215
            responderEng.AllowedPASEConfigs = kPASEConfig_SupportConfig3Bit;
216
        else
217
#endif
218
0
#if WEAVE_CONFIG_SUPPORT_PASE_CONFIG4
219
0
        if (mResponderAllowedConfigs == kPASEConfig_Config4)
220
0
            responderEng.AllowedPASEConfigs = kPASEConfig_SupportConfig4Bit;
221
0
        else
222
0
#endif
223
#if WEAVE_CONFIG_SUPPORT_PASE_CONFIG5
224
        if (mResponderAllowedConfigs == kPASEConfig_Config5)
225
            responderEng.AllowedPASEConfigs = kPASEConfig_SupportConfig5Bit;
226
        else
227
#endif
228
0
            responderEng.AllowedPASEConfigs = 0x0;
229
8.50k
}
230
231
enum
232
{
233
    kMaxExpectedErrors = 32
234
};
235
236
//end PASEEngineTest Initialization
237
void PASEEngineTest::Run()
238
8.50k
{
239
8.50k
    WEAVE_ERROR err;
240
8.50k
    WeavePASEEngine initiatorEng;
241
8.50k
    WeavePASEEngine responderEng;
242
8.50k
    PacketBuffer *msgBuf = NULL;
243
8.50k
    PacketBuffer *msgBuf2 = NULL;
244
8.50k
    WeaveFabricState initFabricState;
245
8.50k
    WeaveFabricState respFabricState;
246
8.50k
    const WeaveEncryptionKey *initiatorKey;
247
8.50k
    const WeaveEncryptionKey *responderKey;
248
249
8.50k
    uint64_t initNodeId = 1;
250
8.50k
    uint64_t respNodeId = 2;
251
8.50k
    uint16_t sessionKeyId = sTestDefaultSessionKeyId;
252
8.50k
    uint16_t encType = kWeaveEncryptionType_AES128CTRSHA1;
253
8.50k
    uint16_t pwSrc = kPasswordSource_PairingCode;
254
8.50k
    bool expectSuccess = strcmp(mInitPW, mRespPW) == 0;
255
256
8.50k
    if (LogMessageData())
257
0
    {
258
0
        printf("========== Starting Test: %s\n", TestName());
259
0
        printf("Pr: %d\nex: %d\n", ProposedConfig(), ExpectedConfig());
260
0
    }
261
8.50k
    initiatorEng.Init();
262
8.50k
    err = initFabricState.Init();
263
8.50k
    SuccessOrQuit(err, "initFabricState.Init failed\n");
264
8.50k
    initiatorEng.Pw = (const uint8_t *)mInitPW;
265
8.50k
    initiatorEng.PwLen = (uint16_t)strlen(mInitPW);
266
267
8.50k
onReconfig:
268
8.50k
    responderEng.Init();
269
8.50k
    err = respFabricState.Init();
270
8.50k
    setAllowedResponderConfigs(responderEng);
271
272
8.50k
    SuccessOrQuit(err, "respFabricState.Init failed\n");
273
8.50k
    respFabricState.PairingCode = mRespPW;
274
275
    // =========== Start PASE InitiatorStep1 ==============================
276
8.50k
    msgBuf = PacketBuffer::New();
277
8.50k
    VerifyOrQuit(msgBuf != NULL, "PacketBuffer::New() failed");
278
279
    // Initiator generates and sends PASE Initiator Step 1 message.
280
8.50k
    err = initiatorEng.GenerateInitiatorStep1(msgBuf, ProposedConfig(), initNodeId, respNodeId, sessionKeyId, encType, pwSrc, &initFabricState, mConfirmKey);
281
282
8.50k
    if (IsExpectedError("Initiator:GenerateInitiatorStep1", err))
283
0
        goto onExpectedError;
284
8.50k
    SuccessOrQuit(err, "WeavePASEEngine::GenerateInitiatorStep1 failed\n");
285
286
    // =========== Initiator Sends InitiatorStep1 to Responder ============
287
288
8.50k
    mMutator->MutateMessage(INITIATOR_STEP_1, msgBuf);
289
8.50k
    if (LogMessageData())
290
0
    {
291
0
        printf("Initiator->Responder: InitiatorStep1 Message (%d bytes)\n", msgBuf->DataLength());
292
0
        DumpMemory(msgBuf->Start(), msgBuf->DataLength(), "  ", 16);
293
0
    }
294
295
    // =========== Responder Processes PASE InitiatorStep1 ================
296
8.50k
    err = responderEng.ProcessInitiatorStep1(msgBuf, respNodeId, initNodeId, &respFabricState);
297
8.50k
    if (IsExpectedError(INITIATOR_STEP_1, err))
298
2.53k
        goto onExpectedError;
299
300
5.96k
    if (ExpectReconfig())
301
0
    {
302
0
        VerifyOrQuit(err == WEAVE_ERROR_PASE_RECONFIGURE_REQUIRED, "WEAVE_ERROR_PASE_RECONFIG_REQUIRED error expected");
303
0
        PacketBuffer::Free(msgBuf);
304
0
        msgBuf = NULL;
305
306
        // =========== Responder generates PASE ResponderReconfigMessage ==
307
0
        {
308
0
            msgBuf = PacketBuffer::New();
309
0
            err = responderEng.GenerateResponderReconfigure(msgBuf);
310
0
            SuccessOrQuit(err, "WeavePASEEngine::GenerateResponderReconfigure failed\n");
311
            // Reset PASE Engines
312
0
            responderEng.Reset();
313
0
        }
314
            // ========== Responder sends ResponderReconfig Message ============
315
0
        mMutator->MutateMessage(RESPONDER_RECONFIGURE, msgBuf);
316
317
0
        if (LogMessageData())
318
0
        {
319
0
            printf("Responder->Initiator: ResponderReconfig Message (%d bytes)\n", msgBuf->DataLength());
320
0
            DumpMemory(msgBuf->Start(), msgBuf->DataLength(), "  ", 16);
321
0
        }
322
323
        // =========== Initiator processes PASE ResponderReconfig =========
324
0
        {
325
0
            uint32_t tempProposedConfig = mProposedConfig;
326
0
            err = initiatorEng.ProcessResponderReconfigure(msgBuf, mProposedConfig);
327
0
            if (IsExpectedError("Initiator:ProcessResponderReconfigure", err))
328
0
            {
329
0
                mProposedConfig = tempProposedConfig;
330
0
                goto onExpectedError;
331
0
            }
332
0
            SuccessOrQuit(err, "WeavePASEEngine::ProcessResponderReconfigure failed\n");
333
0
            PacketBuffer::Free(msgBuf);
334
0
            msgBuf = NULL;
335
0
        }
336
337
0
        respFabricState.Shutdown();
338
0
        mExpectReconfig = false;
339
340
0
        goto onReconfig;
341
342
5.96k
    } else {
343
5.96k
        VerifyOrQuit(err != WEAVE_ERROR_PASE_RECONFIGURE_REQUIRED, "Unexpected reconfig!");
344
5.96k
    }
345
346
5.96k
    SuccessOrQuit(err, "WeavePASEEngine::ProcessInitiatorStep1 failed\n");
347
5.96k
    PacketBuffer::Free(msgBuf);
348
5.96k
    msgBuf = NULL;
349
350
    // =========== Responder Generates ResponderStep1 and ResponderStep2 ==
351
5.96k
    {
352
5.96k
        msgBuf = PacketBuffer::New();
353
5.96k
        err = responderEng.GenerateResponderStep1(msgBuf);
354
5.96k
        SuccessOrQuit(err, "WeavePASEEngine::GenerateResponderStep1 failed\n");
355
356
        // Responder generates and sends PASE Responder Step 2 message.
357
5.96k
        msgBuf2 = PacketBuffer::New();
358
5.96k
        err = responderEng.GenerateResponderStep2(msgBuf2);
359
5.96k
        SuccessOrQuit(err, "WeavePASEEngine::GenerateResponderStep2 failed\n");
360
5.96k
    }
361
    // =========== Responder sends ResponderStep1 ==========================
362
5.96k
    mMutator->MutateMessage(RESPONDER_STEP_1, msgBuf);
363
364
5.96k
    if (LogMessageData())
365
0
    {
366
0
        printf("Responder->Initiator: ResponderStep1 Message (%d bytes)\n", msgBuf->DataLength());
367
0
        DumpMemory(msgBuf->Start(), msgBuf->DataLength(), "  ", 16);
368
0
    }
369
370
    // =========== Responder sends ResponderStep2 ==========================
371
5.96k
    mMutator->MutateMessage(RESPONDER_STEP_2, msgBuf2);
372
373
5.96k
    if (LogMessageData())
374
0
    {
375
0
        printf("Responder->Initiator: ResponderStep2 Message (%d bytes)\n", msgBuf2->DataLength());
376
0
        DumpMemory(msgBuf2->Start(), msgBuf2->DataLength(), "  ", 16);
377
0
    }
378
379
    // =========== Initator Parses ResponderStep1 and ResponderStep2 ======
380
5.96k
    {
381
        // Initiator receives and processes PASE Responder Step 1 message.
382
5.96k
        err = initiatorEng.ProcessResponderStep1(msgBuf);
383
5.96k
        if (IsExpectedError(RESPONDER_STEP_1, err))
384
1.88k
            goto onExpectedError;
385
4.08k
        SuccessOrQuit(err, "WeavePASEEngine::ProcessResponderStep1 failed\n");
386
4.08k
        PacketBuffer::Free(msgBuf);
387
4.08k
        msgBuf = NULL;
388
389
        // Initiator receives and processes PASE Responder Step 2 message.
390
4.08k
        err = initiatorEng.ProcessResponderStep2(msgBuf2);
391
4.08k
        if (IsExpectedError(RESPONDER_STEP_2, err))
392
1.61k
            goto onExpectedError;
393
2.46k
        SuccessOrQuit(err, "WeavePASEEngine::ProcessResponderStep2 failed\n");
394
2.46k
        PacketBuffer::Free(msgBuf2);
395
2.46k
        msgBuf2 = NULL;
396
2.46k
    }
397
398
    // =========== Initator Generates InitatorStep2 ===========================
399
0
    {
400
2.46k
        msgBuf = PacketBuffer::New();
401
2.46k
        err = initiatorEng.GenerateInitiatorStep2(msgBuf);
402
2.46k
        SuccessOrQuit(err, "WeavePASEEngine::GenerateInitiatorStep2 failed\n");
403
2.46k
    }
404
    //=========== Initator Sends InitatorStep2 ============================
405
406
2.46k
    mMutator->MutateMessage(INITIATOR_STEP_2, msgBuf);
407
408
2.46k
    if (LogMessageData())
409
0
    {
410
0
        printf("Initiator->Responder: InitatorStep2 Message (%d bytes)\n", msgBuf->DataLength());
411
0
        DumpMemory(msgBuf->Start(), msgBuf->DataLength(), "  ", 16);
412
0
    }
413
414
    // =========== Responder Parses InitatorStep2 =========================
415
2.46k
    {
416
2.46k
        err = responderEng.ProcessInitiatorStep2(msgBuf);
417
2.46k
        PacketBuffer::Free(msgBuf);
418
2.46k
        msgBuf = NULL;
419
420
2.46k
        if (IsExpectedError(INITIATOR_STEP_2, err))
421
1.46k
            goto onExpectedError;
422
423
999
        if (expectSuccess)
424
999
            SuccessOrQuit(err, "WeavePASEEngine::ProcessInitiatorStep2 failed\n");
425
0
        else if (mConfirmKey)
426
0
        {
427
0
            VerifyOrQuit(err == WEAVE_ERROR_KEY_CONFIRMATION_FAILED, "Expected error from WeavePASEEngine::ProcessInitiatorStep2\n");
428
0
            return;
429
0
        }
430
999
    }
431
432
999
    if (mConfirmKey)
433
999
    {
434
        // ========== Responder Forms ResponderKeyConfirm =================
435
999
        {
436
999
            msgBuf = PacketBuffer::New();
437
999
            err = responderEng.GenerateResponderKeyConfirm(msgBuf);
438
999
            SuccessOrQuit(err, "WeavePASEEngine::GenerateResponderKeyConfirm failed\n");
439
999
        }
440
441
        // ========== Responder Sends ResponderKeyConfirm to Responder ====
442
443
999
        mMutator->MutateMessage(RESPONDER_KEY_CONFIRM, msgBuf);
444
445
999
        if (LogMessageData())
446
0
        {
447
0
            printf("Responder->Initiator: ResponderKeyConfirm Message (%d bytes)\n", msgBuf->DataLength());
448
0
            DumpMemory(msgBuf->Start(), msgBuf->DataLength(), "  ", 16);
449
0
        }
450
451
        // ========== Initiator Processes ResponderKeyConfirm =============
452
999
        {
453
999
            err = initiatorEng.ProcessResponderKeyConfirm(msgBuf);
454
455
999
            if (IsExpectedError(RESPONDER_KEY_CONFIRM, err))
456
999
                goto onExpectedError;
457
458
0
            SuccessOrQuit(err, "WeavePASEEngine::ProcessResponderKeyConfirm failed\n");
459
0
            PacketBuffer::Free(msgBuf);
460
0
            msgBuf = NULL;
461
0
        }
462
0
    }
463
464
0
    VerifyOrQuit(initiatorEng.State == WeavePASEEngine::kState_InitiatorDone, "Initiator state != Done\n");
465
0
    VerifyOrQuit(responderEng.State == WeavePASEEngine::kState_ResponderDone, "Responder state != Done\n");
466
467
0
    VerifyOrQuit(initiatorEng.SessionKeyId == responderEng.SessionKeyId, "Initiator SessionKeyId != Responder SessionKeyId\n");
468
0
    VerifyOrQuit(initiatorEng.EncryptionType == responderEng.EncryptionType, "Initiator EncryptionType != Responder EncryptionType\n");
469
0
    VerifyOrQuit(initiatorEng.PerformKeyConfirmation == responderEng.PerformKeyConfirmation, "Initiator SessionKeyId != Responder SessionKeyId\n");
470
471
0
    err = initiatorEng.GetSessionKey(initiatorKey);
472
0
    SuccessOrQuit(err, "WeavePASEEngine::GetSessionKey() failed\n");
473
474
0
    err = responderEng.GetSessionKey(responderKey);
475
0
    SuccessOrQuit(err, "WeavePASEEngine::GetSessionKey() failed\n");
476
477
0
    VerifyOrQuit(memcmp(initiatorKey->AES128CTRSHA1.DataKey, responderKey->AES128CTRSHA1.DataKey, WeaveEncryptionKey_AES128CTRSHA1::DataKeySize) == 0,
478
0
                 "Data key mismatch\n");
479
0
    VerifyOrQuit(memcmp(initiatorKey->AES128CTRSHA1.IntegrityKey, responderKey->AES128CTRSHA1.IntegrityKey, WeaveEncryptionKey_AES128CTRSHA1::IntegrityKeySize) == 0,
480
0
                 "Integrity key mismatch\n");
481
482
    // Shutdown the Initiator/Responder FabricState objects
483
0
    err = initFabricState.Shutdown();
484
0
    SuccessOrQuit(err, "initFabricState.Shutdown failed\n");
485
0
    err = respFabricState.Shutdown();
486
0
    SuccessOrQuit(err, "respFabricState.Shutdown failed\n");
487
488
8.50k
onExpectedError:
489
8.50k
    PacketBuffer::Free(msgBuf);
490
8.50k
    msgBuf = NULL;
491
492
8.50k
    PacketBuffer::Free(msgBuf2);
493
8.50k
    msgBuf2 = NULL;
494
495
8.50k
    initiatorEng.Shutdown();
496
8.50k
    responderEng.Shutdown();
497
8.50k
    initFabricState.Shutdown();
498
8.50k
    respFabricState.Shutdown();
499
8.50k
    if (LogMessageData())
500
0
        printf("Test Complete: %s\n", TestName());
501
8.50k
}