Skip to content

Commit 403d4ee

Browse files
committed
factor out Parser for decrypted Sigma2
1 parent d785361 commit 403d4ee

File tree

3 files changed

+68
-35
lines changed

3 files changed

+68
-35
lines changed

src/protocols/secure_channel/CASESession.cpp

+56-33
Original file line numberDiff line numberDiff line change
@@ -1485,7 +1485,7 @@ CHIP_ERROR CASESession::HandleSigma2_and_SendSigma3(System::PacketBufferHandle &
14851485
CHIP_ERROR CASESession::HandleSigma2(System::PacketBufferHandle && msg)
14861486
{
14871487
MATTER_TRACE_SCOPE("HandleSigma2", "CASESession");
1488-
TLVReader decryptedDataTlvReader;
1488+
ContiguousBufferTLVReader decryptedDataTlvReader;
14891489

14901490
const uint8_t * buf = msg->Start();
14911491
size_t buflen = msg->DataLength();
@@ -1504,12 +1504,12 @@ CHIP_ERROR CASESession::HandleSigma2(System::PacketBufferHandle && msg)
15041504
P256PublicKey responderPublicKey;
15051505

15061506
// uint8_t responderRandom[kSigmaParamRandomNumberSize];
1507-
ByteSpan responderNOC;
1508-
ByteSpan responderICAC;
1507+
// ByteSpan responderNOC;
1508+
// ByteSpan responderICAC;
15091509

15101510
// uint16_t responderSessionId;
15111511

1512-
TLVType containerType = kTLVType_Structure;
1512+
// TLVType containerType = kTLVType_Structure;
15131513
size_t msg_r2_signed_len;
15141514

15151515
size_t msg_r2_encrypted_len = 0;
@@ -1521,6 +1521,7 @@ CHIP_ERROR CASESession::HandleSigma2(System::PacketBufferHandle && msg)
15211521
tlvReader.Init(std::move(msg));
15221522

15231523
ParsedSigma2 parsedSigma2;
1524+
ParsedSigma2TBEData parsedSigma2TBEData;
15241525

15251526
FabricId fabricId = kUndefinedFabricId;
15261527
{
@@ -1533,8 +1534,6 @@ CHIP_ERROR CASESession::HandleSigma2(System::PacketBufferHandle && msg)
15331534
VerifyOrExit(mEphemeralKey != nullptr, err = CHIP_ERROR_INTERNAL);
15341535
VerifyOrExit(buf != nullptr, err = CHIP_ERROR_MESSAGE_INCOMPLETE);
15351536

1536-
SuccessOrExit(err = mCommissioningHash.AddData(ByteSpan{ buf, buflen }));
1537-
15381537
ParseSigma2(tlvReader, parsedSigma2);
15391538

15401539
ChipLogDetail(SecureChannel, "Peer assigned session key ID %d", parsedSigma2.responderSessionId);
@@ -1545,7 +1544,7 @@ CHIP_ERROR CASESession::HandleSigma2(System::PacketBufferHandle && msg)
15451544
memcpy(mRemotePubKey.Bytes(), parsedSigma2.responderEphPubKey.data(), mRemotePubKey.Length());
15461545

15471546
// Generate a Shared Secret
1548-
SuccessOrExit(err = mEphemeralKey->ECDH_derive_secret(mRemotePubKey, mSharedSecret));
1547+
ReturnErrorOnFailure(err = mEphemeralKey->ECDH_derive_secret(mRemotePubKey, mSharedSecret));
15491548

15501549
// Generate the S2K key
15511550
{
@@ -1554,6 +1553,9 @@ CHIP_ERROR CASESession::HandleSigma2(System::PacketBufferHandle && msg)
15541553
err = ConstructSaltSigma2(ByteSpan(parsedSigma2.responderRandom), mRemotePubKey, ByteSpan(mIPK), saltSpan));
15551554
ReturnErrorOnFailure(err = DeriveSigmaKey(saltSpan, ByteSpan(kKDFSR2Info), sr2k));
15561555
}
1556+
// TODO verify location of this
1557+
// TODO why does this trigger a fialure if i move it just after call to PArseSigma2
1558+
ReturnErrorOnFailure(err = mCommissioningHash.AddData(ByteSpan{ buf, buflen }));
15571559

15581560
if (parsedSigma2.responderMrpParamsPresent)
15591561
{
@@ -1571,27 +1573,19 @@ CHIP_ERROR CASESession::HandleSigma2(System::PacketBufferHandle && msg)
15711573
sr2k.KeyHandle(), kTBEData2_Nonce, kTBEDataNonceLength, parsedSigma2.msgR2Encrypted.Get()));
15721574

15731575
decryptedDataTlvReader.Init(parsedSigma2.msgR2Encrypted.Get(), msg_r2_encrypted_len);
1574-
SuccessOrExit(err = decryptedDataTlvReader.Next(containerType, AnonymousTag()));
1575-
SuccessOrExit(err = decryptedDataTlvReader.EnterContainer(containerType));
15761576

1577-
SuccessOrExit(err = decryptedDataTlvReader.Next(kTLVType_ByteString, AsTlvContextTag(TBEDataTags::kSenderNOC)));
1578-
SuccessOrExit(err = decryptedDataTlvReader.Get(responderNOC));
1577+
ParseSigma2TBEData(decryptedDataTlvReader, parsedSigma2TBEData);
15791578

1580-
SuccessOrExit(err = decryptedDataTlvReader.Next());
1581-
if (decryptedDataTlvReader.GetTag() == AsTlvContextTag(TBEDataTags::kSenderICAC))
1582-
{
1583-
VerifyOrExit(decryptedDataTlvReader.GetType() == kTLVType_ByteString, err = CHIP_ERROR_WRONG_TLV_TYPE);
1584-
SuccessOrExit(err = decryptedDataTlvReader.Get(responderICAC));
1585-
SuccessOrExit(err = decryptedDataTlvReader.Next(kTLVType_ByteString, AsTlvContextTag(TBEDataTags::kSignature)));
1586-
}
1579+
std::copy(parsedSigma2TBEData.resumptionId.begin(), parsedSigma2TBEData.resumptionId.end(), mNewResumptionId.begin());
15871580

15881581
// Validate responder identity located in msg_r2_encrypted
15891582
// Constructing responder identity
15901583
{
15911584
CompressedFabricId unused;
15921585
FabricId responderFabricId;
15931586
SuccessOrExit(err = SetEffectiveTime());
1594-
SuccessOrExit(err = mFabricsTable->VerifyCredentials(mFabricIndex, responderNOC, responderICAC, mValidContext, unused,
1587+
SuccessOrExit(err = mFabricsTable->VerifyCredentials(mFabricIndex, parsedSigma2TBEData.responderNOC,
1588+
parsedSigma2TBEData.responderICAC, mValidContext, unused,
15951589
responderFabricId, responderNodeId, responderPublicKey));
15961590
VerifyOrExit(fabricId == responderFabricId, err = CHIP_ERROR_INVALID_CASE_PARAMETER);
15971591
// Verify that responderNodeId (from responderNOC) matches one that was included
@@ -1600,29 +1594,23 @@ CHIP_ERROR CASESession::HandleSigma2(System::PacketBufferHandle && msg)
16001594
}
16011595

16021596
// Construct msg_R2_Signed and validate the signature in msg_r2_encrypted
1603-
msg_r2_signed_len = EstimateStructOverhead(sizeof(uint16_t), responderNOC.size(), responderICAC.size(), kP256_PublicKey_Length,
1604-
kP256_PublicKey_Length);
1597+
msg_r2_signed_len =
1598+
EstimateStructOverhead(sizeof(uint16_t), parsedSigma2TBEData.responderNOC.size(), parsedSigma2TBEData.responderICAC.size(),
1599+
kP256_PublicKey_Length, kP256_PublicKey_Length);
16051600

16061601
VerifyOrExit(msg_R2_Signed.Alloc(msg_r2_signed_len), err = CHIP_ERROR_NO_MEMORY);
16071602

1608-
SuccessOrExit(err = ConstructTBSData(responderNOC, responderICAC, ByteSpan(mRemotePubKey, mRemotePubKey.Length()),
1603+
SuccessOrExit(err = ConstructTBSData(parsedSigma2TBEData.responderNOC, parsedSigma2TBEData.responderICAC,
1604+
ByteSpan(mRemotePubKey, mRemotePubKey.Length()),
16091605
ByteSpan(mEphemeralKey->Pubkey(), mEphemeralKey->Pubkey().Length()), msg_R2_Signed.Get(),
16101606
msg_r2_signed_len));
16111607

1612-
VerifyOrExit(decryptedDataTlvReader.GetTag() == AsTlvContextTag(TBEDataTags::kSignature), err = CHIP_ERROR_INVALID_TLV_TAG);
1613-
VerifyOrExit(tbsData2Signature.Capacity() >= decryptedDataTlvReader.GetLength(), err = CHIP_ERROR_INVALID_TLV_ELEMENT);
1614-
tbsData2Signature.SetLength(decryptedDataTlvReader.GetLength());
1615-
SuccessOrExit(err = decryptedDataTlvReader.GetBytes(tbsData2Signature.Bytes(), tbsData2Signature.Length()));
1616-
16171608
// Validate signature
1618-
SuccessOrExit(err = responderPublicKey.ECDSA_validate_msg_signature(msg_R2_Signed.Get(), msg_r2_signed_len, tbsData2Signature));
1619-
1620-
// Retrieve session resumption ID
1621-
SuccessOrExit(err = decryptedDataTlvReader.Next(kTLVType_ByteString, AsTlvContextTag(TBEDataTags::kResumptionID)));
1622-
SuccessOrExit(err = decryptedDataTlvReader.GetBytes(mNewResumptionId.data(), mNewResumptionId.size()));
1609+
SuccessOrExit(err = responderPublicKey.ECDSA_validate_msg_signature(msg_R2_Signed.Get(), msg_r2_signed_len,
1610+
parsedSigma2TBEData.tbsData2Signature));
16231611

16241612
// Retrieve peer CASE Authenticated Tags (CATs) from peer's NOC.
1625-
SuccessOrExit(err = ExtractCATsFromOpCert(responderNOC, mPeerCATs));
1613+
SuccessOrExit(err = ExtractCATsFromOpCert(parsedSigma2TBEData.responderNOC, mPeerCATs));
16261614

16271615
exit:
16281616
if (err != CHIP_NO_ERROR)
@@ -1632,6 +1620,41 @@ CHIP_ERROR CASESession::HandleSigma2(System::PacketBufferHandle && msg)
16321620
return err;
16331621
}
16341622

1623+
CHIP_ERROR CASESession::ParseSigma2TBEData(ContiguousBufferTLVReader & decryptedDataTlvReader,
1624+
ParsedSigma2TBEData & outParsedSigma2TBE)
1625+
{
1626+
CHIP_ERROR err = CHIP_NO_ERROR;
1627+
TLVType containerType = kTLVType_Structure;
1628+
1629+
ReturnErrorOnFailure(err = decryptedDataTlvReader.Next(containerType, AnonymousTag()));
1630+
ReturnErrorOnFailure(err = decryptedDataTlvReader.EnterContainer(containerType));
1631+
1632+
ReturnErrorOnFailure(err = decryptedDataTlvReader.Next(kTLVType_ByteString, AsTlvContextTag(TBEDataTags::kSenderNOC)));
1633+
ReturnErrorOnFailure(err = decryptedDataTlvReader.GetByteView(outParsedSigma2TBE.responderNOC));
1634+
1635+
ReturnErrorOnFailure(err = decryptedDataTlvReader.Next());
1636+
if (decryptedDataTlvReader.GetTag() == AsTlvContextTag(TBEDataTags::kSenderICAC))
1637+
{
1638+
VerifyOrReturnError(decryptedDataTlvReader.GetType() == kTLVType_ByteString, err = CHIP_ERROR_WRONG_TLV_TYPE);
1639+
ReturnErrorOnFailure(err = decryptedDataTlvReader.GetByteView(outParsedSigma2TBE.responderICAC));
1640+
ReturnErrorOnFailure(err = decryptedDataTlvReader.Next(kTLVType_ByteString, AsTlvContextTag(TBEDataTags::kSignature)));
1641+
}
1642+
1643+
VerifyOrReturnError(decryptedDataTlvReader.GetTag() == AsTlvContextTag(TBEDataTags::kSignature),
1644+
err = CHIP_ERROR_INVALID_TLV_TAG);
1645+
VerifyOrReturnError(outParsedSigma2TBE.tbsData2Signature.Capacity() >= decryptedDataTlvReader.GetLength(),
1646+
err = CHIP_ERROR_INVALID_TLV_ELEMENT);
1647+
outParsedSigma2TBE.tbsData2Signature.SetLength(decryptedDataTlvReader.GetLength());
1648+
ReturnErrorOnFailure(err = decryptedDataTlvReader.GetBytes(outParsedSigma2TBE.tbsData2Signature.Bytes(),
1649+
outParsedSigma2TBE.tbsData2Signature.Length()));
1650+
1651+
// Retrieve session resumption ID
1652+
ReturnErrorOnFailure(err = decryptedDataTlvReader.Next(kTLVType_ByteString, AsTlvContextTag(TBEDataTags::kResumptionID)));
1653+
ReturnErrorOnFailure(err = decryptedDataTlvReader.GetByteView(outParsedSigma2TBE.resumptionId));
1654+
1655+
return CHIP_NO_ERROR;
1656+
}
1657+
16351658
CHIP_ERROR CASESession::SendSigma3a()
16361659
{
16371660
MATTER_TRACE_SCOPE("SendSigma3", "CASESession");

src/protocols/secure_channel/CASESession.h

+10
Original file line numberDiff line numberDiff line change
@@ -261,6 +261,15 @@ class DLL_EXPORT CASESession : public Messaging::UnsolicitedMessageHandler,
261261
bool responderMrpParamsPresent = false;
262262
SessionParameters responderSessionParams;
263263
};
264+
265+
struct ParsedSigma2TBEData
266+
{
267+
ByteSpan responderNOC;
268+
ByteSpan responderICAC;
269+
Crypto::P256ECDSASignature tbsData2Signature;
270+
ByteSpan resumptionId;
271+
};
272+
264273
/**
265274
* @brief Encodes a Sigma1 message into TLV format and allocates a buffer for it, which is owned by the PacketBufferHandle
266275
* outparam.
@@ -294,6 +303,7 @@ class DLL_EXPORT CASESession : public Messaging::UnsolicitedMessageHandler,
294303

295304
static CHIP_ERROR ParseSigma2(TLV::ContiguousBufferTLVReader & tlvReader, ParsedSigma2 & parsedMessage);
296305

306+
static CHIP_ERROR ParseSigma2TBEData(TLV::ContiguousBufferTLVReader & tlvReader, ParsedSigma2TBEData & parsedMessage);
297307
/**
298308
* @brief Encodes a Sigma2 message into TLV format and allocates a buffer for it, which is owned by the PacketBufferHandle
299309
* outparam.

src/protocols/secure_channel/tests/TestCASESession.cpp

+2-2
Original file line numberDiff line numberDiff line change
@@ -1108,8 +1108,8 @@ struct SessionResumptionTestStorage : SessionResumptionStorage
11081108
{
11091109
SessionResumptionTestStorage(CHIP_ERROR findMethodReturnCode, ScopedNodeId peerNodeId, ResumptionIdStorage * resumptionId,
11101110
Crypto::P256ECDHDerivedSecret * sharedSecret) :
1111-
mFindMethodReturnCode(findMethodReturnCode), mPeerNodeId(peerNodeId), mResumptionId(resumptionId),
1112-
mSharedSecret(sharedSecret)
1111+
mFindMethodReturnCode(findMethodReturnCode),
1112+
mPeerNodeId(peerNodeId), mResumptionId(resumptionId), mSharedSecret(sharedSecret)
11131113
{}
11141114
SessionResumptionTestStorage(CHIP_ERROR findMethodReturnCode) : mFindMethodReturnCode(findMethodReturnCode) {}
11151115
CHIP_ERROR FindByScopedNodeId(const ScopedNodeId & node, ResumptionIdStorage & resumptionId,

0 commit comments

Comments
 (0)