@@ -1401,53 +1401,38 @@ CHIP_ERROR CASESession::HandleSigma2Resume(System::PacketBufferHandle && msg)
1401
1401
MATTER_TRACE_SCOPE (" HandleSigma2Resume" , " CASESession" );
1402
1402
CHIP_ERROR err = CHIP_NO_ERROR;
1403
1403
System::PacketBufferTLVReader tlvReader;
1404
- TLV::TLVType containerType = TLV::kTLVType_Structure ;
1405
-
1406
- uint16_t responderSessionId;
1407
-
1408
- uint32_t decodeTagIdSeq = 0 ;
1409
1404
1410
1405
ChipLogDetail (SecureChannel, " Received Sigma2Resume msg" );
1411
1406
MATTER_TRACE_COUNTER (" Sigma2Resume" );
1412
1407
MATTER_LOG_METRIC_END (kMetricDeviceCASESessionSigma1 , err);
1413
1408
1414
- uint8_t sigma2ResumeMIC[CHIP_CRYPTO_AEAD_MIC_LENGTH_BYTES];
1415
-
1416
- tlvReader.Init (std::move (msg));
1417
- SuccessOrExit (err = tlvReader.Next (containerType, TLV::AnonymousTag ()));
1418
- SuccessOrExit (err = tlvReader.EnterContainer (containerType));
1419
-
1420
- SuccessOrExit (err = tlvReader.Next ());
1421
- VerifyOrExit (TLV::TagNumFromTag (tlvReader.GetTag ()) == ++decodeTagIdSeq, err = CHIP_ERROR_INVALID_TLV_TAG);
1422
- SessionResumptionStorage::ResumptionIdStorage resumptionId;
1423
- VerifyOrExit (tlvReader.GetLength () == resumptionId.size (), err = CHIP_ERROR_INVALID_TLV_ELEMENT);
1424
- SuccessOrExit (err = tlvReader.GetBytes (resumptionId.data (), resumptionId.size ()));
1409
+ // uint8_t sigma2ResumeMIC[CHIP_CRYPTO_AEAD_MIC_LENGTH_BYTES];
1425
1410
1426
- SuccessOrExit (err = tlvReader.Next ());
1427
- VerifyOrExit (TLV::TagNumFromTag (tlvReader.GetTag ()) == ++decodeTagIdSeq, err = CHIP_ERROR_INVALID_TLV_TAG);
1428
- VerifyOrExit (tlvReader.GetLength () == CHIP_CRYPTO_AEAD_MIC_LENGTH_BYTES, err = CHIP_ERROR_INVALID_TLV_ELEMENT);
1429
- SuccessOrExit (err = tlvReader.GetBytes (sigma2ResumeMIC, CHIP_CRYPTO_AEAD_MIC_LENGTH_BYTES));
1411
+ ParsedSigma2Resume parsedSigma2Resume;
1430
1412
1431
- SuccessOrExit (err = ValidateSigmaResumeMIC (ByteSpan (sigma2ResumeMIC), ByteSpan (mInitiatorRandom ), resumptionId,
1432
- ByteSpan (kKDFS2RKeyInfo ), ByteSpan (kResume2MIC_Nonce )));
1413
+ tlvReader.Init (std::move (msg));
1433
1414
1434
- SuccessOrExit (err = tlvReader.Next ());
1435
- VerifyOrExit (TLV::TagNumFromTag (tlvReader.GetTag ()) == ++decodeTagIdSeq, err = CHIP_ERROR_INVALID_TLV_TAG);
1436
- SuccessOrExit (err = tlvReader.Get (responderSessionId));
1415
+ SuccessOrExit (err = ParseSigma2Resume (tlvReader, parsedSigma2Resume));
1437
1416
1438
- if (tlvReader. Next () != CHIP_END_OF_TLV )
1417
+ if (parsedSigma2Resume. responderMrpParamsPresent )
1439
1418
{
1440
- SuccessOrExit (err = DecodeMRPParametersIfPresent ( TLV::ContextTag ( 4 ), tlvReader) );
1419
+ SetRemoteSessionParameters (parsedSigma2Resume. responderSessionParams );
1441
1420
mExchangeCtxt .Value ()->GetSessionHandle ()->AsUnauthenticatedSession ()->SetRemoteSessionParameters (
1442
1421
GetRemoteSessionParameters ());
1443
1422
}
1444
1423
1445
- ChipLogDetail (SecureChannel, " Peer assigned session key ID %d" , responderSessionId);
1446
- SetPeerSessionId (responderSessionId);
1424
+ SuccessOrExit (err = ValidateSigmaResumeMIC (parsedSigma2Resume.sigma2ResumeMIC , ByteSpan (mInitiatorRandom ),
1425
+ parsedSigma2Resume.resumptionId , ByteSpan (kKDFS2RKeyInfo ),
1426
+ ByteSpan (kResume2MIC_Nonce )));
1427
+
1428
+ ChipLogDetail (SecureChannel, " Peer assigned session key ID %d" , parsedSigma2Resume.responderSessionId );
1429
+ SetPeerSessionId (parsedSigma2Resume.responderSessionId );
1447
1430
1448
1431
if (mSessionResumptionStorage != nullptr )
1449
1432
{
1450
- CHIP_ERROR err2 = mSessionResumptionStorage ->Save (GetPeer (), resumptionId, mSharedSecret , mPeerCATs );
1433
+ CHIP_ERROR err2 = mSessionResumptionStorage ->Save (
1434
+ GetPeer (), SessionResumptionStorage::ConstResumptionIdView (parsedSigma2Resume.resumptionId .data ()), mSharedSecret ,
1435
+ mPeerCATs );
1451
1436
if (err2 != CHIP_NO_ERROR)
1452
1437
ChipLogError (SecureChannel, " Unable to save session resumption state: %" CHIP_ERROR_FORMAT, err2.Format ());
1453
1438
}
@@ -1466,6 +1451,40 @@ CHIP_ERROR CASESession::HandleSigma2Resume(System::PacketBufferHandle && msg)
1466
1451
return err;
1467
1452
}
1468
1453
1454
+ CHIP_ERROR CASESession::ParseSigma2Resume (ContiguousBufferTLVReader & tlvReader, ParsedSigma2Resume & outParsedSigma2Resume)
1455
+ {
1456
+
1457
+ CHIP_ERROR err = CHIP_NO_ERROR;
1458
+ TLVType containerType = kTLVType_Structure ;
1459
+
1460
+ ReturnErrorOnFailure (err = tlvReader.Next (containerType, AnonymousTag ()));
1461
+ ReturnErrorOnFailure (err = tlvReader.EnterContainer (containerType));
1462
+
1463
+ ReturnErrorOnFailure (err = tlvReader.Next ());
1464
+ VerifyOrReturnError (tlvReader.GetTag () == AsTlvContextTag (Sigma2ResumeTags::kResumptionID ), CHIP_ERROR_INVALID_TLV_TAG);
1465
+ ReturnErrorOnFailure (err = tlvReader.GetByteView (outParsedSigma2Resume.resumptionId ));
1466
+ VerifyOrReturnError (outParsedSigma2Resume.resumptionId .size () == SessionResumptionStorage::kResumptionIdSize ,
1467
+ CHIP_ERROR_INVALID_CASE_PARAMETER);
1468
+
1469
+ ReturnErrorOnFailure (err = tlvReader.Next ());
1470
+ VerifyOrReturnError (tlvReader.GetTag () == AsTlvContextTag (Sigma2ResumeTags::kSigma2ResumeMIC ), CHIP_ERROR_INVALID_TLV_TAG);
1471
+ ReturnErrorOnFailure (err = tlvReader.GetByteView (outParsedSigma2Resume.sigma2ResumeMIC ));
1472
+ VerifyOrReturnError (outParsedSigma2Resume.sigma2ResumeMIC .size () == CHIP_CRYPTO_AEAD_MIC_LENGTH_BYTES,
1473
+ CHIP_ERROR_INVALID_CASE_PARAMETER);
1474
+
1475
+ ReturnErrorOnFailure (err = tlvReader.Next ());
1476
+ VerifyOrReturnError (tlvReader.GetTag () == AsTlvContextTag (Sigma2ResumeTags::kResponderSessionID ), CHIP_ERROR_INVALID_TLV_TAG);
1477
+ ReturnErrorOnFailure (err = tlvReader.Get (outParsedSigma2Resume.responderSessionId ));
1478
+
1479
+ if (tlvReader.Next () != CHIP_END_OF_TLV)
1480
+ {
1481
+ ReturnErrorOnFailure (err = DecodeMRPParametersIfPresent (AsTlvContextTag (Sigma2ResumeTags::kResponderSessionID ), tlvReader,
1482
+ outParsedSigma2Resume.responderSessionParams ));
1483
+ }
1484
+
1485
+ return CHIP_NO_ERROR;
1486
+ }
1487
+
1469
1488
CHIP_ERROR CASESession::HandleSigma2_and_SendSigma3 (System::PacketBufferHandle && msg)
1470
1489
{
1471
1490
MATTER_TRACE_SCOPE (" HandleSigma2_and_SendSigma3" , " CASESession" );
@@ -2587,7 +2606,8 @@ CHIP_ERROR CASESession::OnMessageReceived(ExchangeContext * ec, const PayloadHea
2587
2606
case State::kSentSigma2Resume :
2588
2607
if (msgType == Protocols::SecureChannel::MsgType::StatusReport)
2589
2608
{
2590
- // Need to capture before invoking status report since 'this' might be deallocated on successful completion of sigma3
2609
+ // Need to capture before invoking status report since 'this' might be deallocated on successful completion of
2610
+ // sigma3
2591
2611
MetricKey key = (mState == State::kSentSigma3 ) ? kMetricDeviceCASESessionSigma3 : kMetricDeviceCASESessionSigma2Resume ;
2592
2612
err = HandleStatusReport (std::move (msg), /* successExpected*/ true );
2593
2613
MATTER_LOG_METRIC_END (key, err);
0 commit comments