Skip to content

Commit cc77e8c

Browse files
committed
factor out ParseSigma2Resume
1 parent b085862 commit cc77e8c

File tree

2 files changed

+65
-31
lines changed

2 files changed

+65
-31
lines changed

src/protocols/secure_channel/CASESession.cpp

+51-31
Original file line numberDiff line numberDiff line change
@@ -1401,53 +1401,38 @@ CHIP_ERROR CASESession::HandleSigma2Resume(System::PacketBufferHandle && msg)
14011401
MATTER_TRACE_SCOPE("HandleSigma2Resume", "CASESession");
14021402
CHIP_ERROR err = CHIP_NO_ERROR;
14031403
System::PacketBufferTLVReader tlvReader;
1404-
TLV::TLVType containerType = TLV::kTLVType_Structure;
1405-
1406-
uint16_t responderSessionId;
1407-
1408-
uint32_t decodeTagIdSeq = 0;
14091404

14101405
ChipLogDetail(SecureChannel, "Received Sigma2Resume msg");
14111406
MATTER_TRACE_COUNTER("Sigma2Resume");
14121407
MATTER_LOG_METRIC_END(kMetricDeviceCASESessionSigma1, err);
14131408

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];
14251410

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;
14301412

1431-
SuccessOrExit(err = ValidateSigmaResumeMIC(ByteSpan(sigma2ResumeMIC), ByteSpan(mInitiatorRandom), resumptionId,
1432-
ByteSpan(kKDFS2RKeyInfo), ByteSpan(kResume2MIC_Nonce)));
1413+
tlvReader.Init(std::move(msg));
14331414

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));
14371416

1438-
if (tlvReader.Next() != CHIP_END_OF_TLV)
1417+
if (parsedSigma2Resume.responderMrpParamsPresent)
14391418
{
1440-
SuccessOrExit(err = DecodeMRPParametersIfPresent(TLV::ContextTag(4), tlvReader));
1419+
SetRemoteSessionParameters(parsedSigma2Resume.responderSessionParams);
14411420
mExchangeCtxt.Value()->GetSessionHandle()->AsUnauthenticatedSession()->SetRemoteSessionParameters(
14421421
GetRemoteSessionParameters());
14431422
}
14441423

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);
14471430

14481431
if (mSessionResumptionStorage != nullptr)
14491432
{
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);
14511436
if (err2 != CHIP_NO_ERROR)
14521437
ChipLogError(SecureChannel, "Unable to save session resumption state: %" CHIP_ERROR_FORMAT, err2.Format());
14531438
}
@@ -1466,6 +1451,40 @@ CHIP_ERROR CASESession::HandleSigma2Resume(System::PacketBufferHandle && msg)
14661451
return err;
14671452
}
14681453

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+
14691488
CHIP_ERROR CASESession::HandleSigma2_and_SendSigma3(System::PacketBufferHandle && msg)
14701489
{
14711490
MATTER_TRACE_SCOPE("HandleSigma2_and_SendSigma3", "CASESession");
@@ -2587,7 +2606,8 @@ CHIP_ERROR CASESession::OnMessageReceived(ExchangeContext * ec, const PayloadHea
25872606
case State::kSentSigma2Resume:
25882607
if (msgType == Protocols::SecureChannel::MsgType::StatusReport)
25892608
{
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
25912611
MetricKey key = (mState == State::kSentSigma3) ? kMetricDeviceCASESessionSigma3 : kMetricDeviceCASESessionSigma2Resume;
25922612
err = HandleStatusReport(std::move(msg), /* successExpected*/ true);
25932613
MATTER_LOG_METRIC_END(key, err);

src/protocols/secure_channel/CASESession.h

+14
Original file line numberDiff line numberDiff line change
@@ -270,6 +270,17 @@ class DLL_EXPORT CASESession : public Messaging::UnsolicitedMessageHandler,
270270
ByteSpan resumptionId;
271271
};
272272

273+
struct ParsedSigma2Resume
274+
{
275+
ByteSpan resumptionId;
276+
ByteSpan sigma2ResumeMIC;
277+
uint16_t responderSessionId;
278+
const ReliableMessageProtocolConfig * responderMrpConfig;
279+
SessionParameters responderSessionParams;
280+
// TODO consider removing this?
281+
bool responderMrpParamsPresent = false;
282+
};
283+
273284
/**
274285
* @brief Encodes a Sigma1 message into TLV format and allocates a buffer for it, which is owned by the PacketBufferHandle
275286
* outparam.
@@ -304,6 +315,9 @@ class DLL_EXPORT CASESession : public Messaging::UnsolicitedMessageHandler,
304315
static CHIP_ERROR ParseSigma2(TLV::ContiguousBufferTLVReader & tlvReader, ParsedSigma2 & parsedMessage);
305316

306317
static CHIP_ERROR ParseSigma2TBEData(TLV::ContiguousBufferTLVReader & tlvReader, ParsedSigma2TBEData & parsedMessage);
318+
319+
static CHIP_ERROR ParseSigma2Resume(TLV::ContiguousBufferTLVReader & tlvReader, ParsedSigma2Resume & outParsedSigma2Resume);
320+
307321
/**
308322
* @brief Encodes a Sigma2 message into TLV format and allocates a buffer for it, which is owned by the PacketBufferHandle
309323
* outparam.

0 commit comments

Comments
 (0)