Skip to content

Commit 5c9281b

Browse files
committed
Factor out ParseSigma3 and ParseSigma3TBEData
1 parent 4e033de commit 5c9281b

File tree

2 files changed

+100
-67
lines changed

2 files changed

+100
-67
lines changed

src/protocols/secure_channel/CASESession.cpp

+75-66
Original file line numberDiff line numberDiff line change
@@ -372,25 +372,6 @@ struct CASESession::SendSigma3Data
372372
P256ECDSASignature tbsData3Signature;
373373
};
374374

375-
struct CASESession::HandleSigma3Data
376-
{
377-
chip::Platform::ScopedMemoryBuffer<uint8_t> msg_R3_Signed;
378-
size_t msg_r3_signed_len;
379-
380-
ByteSpan initiatorNOC;
381-
ByteSpan initiatorICAC;
382-
383-
uint8_t rootCertBuf[kMaxCHIPCertLength];
384-
ByteSpan fabricRCAC;
385-
386-
P256ECDSASignature tbsData3Signature;
387-
388-
FabricId fabricId;
389-
NodeId initiatorNodeId;
390-
391-
ValidationContext validContext;
392-
};
393-
394375
CASESession::~CASESession()
395376
{
396377
// Let's clear out any security state stored in the object, before destroying it.
@@ -1947,18 +1928,14 @@ CHIP_ERROR CASESession::HandleSigma3a(System::PacketBufferHandle && msg)
19471928
MATTER_TRACE_SCOPE("HandleSigma3", "CASESession");
19481929
CHIP_ERROR err = CHIP_NO_ERROR;
19491930
System::PacketBufferTLVReader tlvReader;
1950-
TLV::TLVReader decryptedDataTlvReader;
1931+
TLV::ContiguousBufferTLVReader decryptedDataTlvReader;
19511932
TLV::TLVType containerType = TLV::kTLVType_Structure;
19521933

19531934
const uint8_t * buf = msg->Start();
19541935
const size_t bufLen = msg->DataLength();
19551936

1956-
constexpr size_t kCaseOverheadForFutureTbeData = 128;
1957-
1958-
chip::Platform::ScopedMemoryBuffer<uint8_t> msg_R3_Encrypted;
1959-
size_t msg_r3_encrypted_len = 0;
1960-
size_t msg_r3_encrypted_len_with_tag = 0;
1961-
size_t max_msg_r3_signed_enc_len;
1937+
Platform::ScopedMemoryBufferWithSize<uint8_t> msgR3Encrypted;
1938+
size_t msgR3EncryptedLen = 0;
19621939

19631940
AutoReleaseSessionKey sr3k(*mSessionManager->GetSessionKeystore());
19641941

@@ -1983,24 +1960,8 @@ CHIP_ERROR CASESession::HandleSigma3a(System::PacketBufferHandle && msg)
19831960
VerifyOrExit(mEphemeralKey != nullptr, err = CHIP_ERROR_INTERNAL);
19841961

19851962
tlvReader.Init(std::move(msg));
1986-
SuccessOrExit(err = tlvReader.Next(containerType, TLV::AnonymousTag()));
1987-
SuccessOrExit(err = tlvReader.EnterContainer(containerType));
1988-
1989-
// Fetch encrypted data
1990-
max_msg_r3_signed_enc_len = TLV::EstimateStructOverhead(Credentials::kMaxCHIPCertLength, Credentials::kMaxCHIPCertLength,
1991-
data.tbsData3Signature.Length(), kCaseOverheadForFutureTbeData);
19921963

1993-
SuccessOrExit(err = tlvReader.Next(TLV::kTLVType_ByteString, AsTlvContextTag(Sigma3Tags::kEncrypted3)));
1994-
1995-
msg_r3_encrypted_len_with_tag = tlvReader.GetLength();
1996-
1997-
// Validate we did not receive a buffer larger than legal
1998-
VerifyOrExit(msg_r3_encrypted_len_with_tag <= max_msg_r3_signed_enc_len, err = CHIP_ERROR_INVALID_TLV_ELEMENT);
1999-
VerifyOrExit(msg_r3_encrypted_len_with_tag > CHIP_CRYPTO_AEAD_MIC_LENGTH_BYTES, err = CHIP_ERROR_INVALID_TLV_ELEMENT);
2000-
2001-
VerifyOrExit(msg_R3_Encrypted.Alloc(msg_r3_encrypted_len_with_tag), err = CHIP_ERROR_NO_MEMORY);
2002-
SuccessOrExit(err = tlvReader.GetBytes(msg_R3_Encrypted.Get(), static_cast<uint32_t>(msg_r3_encrypted_len_with_tag)));
2003-
msg_r3_encrypted_len = msg_r3_encrypted_len_with_tag - CHIP_CRYPTO_AEAD_MIC_LENGTH_BYTES;
1964+
SuccessOrExit(err = ParseSigma3(tlvReader, msgR3Encrypted));
20041965

20051966
// Step 1
20061967
{
@@ -2012,27 +1973,17 @@ CHIP_ERROR CASESession::HandleSigma3a(System::PacketBufferHandle && msg)
20121973
SuccessOrExit(err = mCommissioningHash.AddData(ByteSpan{ buf, bufLen }));
20131974

20141975
// Step 2 - Decrypt data blob
2015-
SuccessOrExit(err = AES_CCM_decrypt(msg_R3_Encrypted.Get(), msg_r3_encrypted_len, nullptr, 0,
2016-
msg_R3_Encrypted.Get() + msg_r3_encrypted_len, CHIP_CRYPTO_AEAD_MIC_LENGTH_BYTES,
2017-
sr3k.KeyHandle(), kTBEData3_Nonce, kTBEDataNonceLength, msg_R3_Encrypted.Get()));
1976+
msgR3EncryptedLen = msgR3Encrypted.AllocatedSize() - CHIP_CRYPTO_AEAD_MIC_LENGTH_BYTES;
20181977

2019-
decryptedDataTlvReader.Init(msg_R3_Encrypted.Get(), msg_r3_encrypted_len);
2020-
containerType = TLV::kTLVType_Structure;
2021-
SuccessOrExit(err = decryptedDataTlvReader.Next(containerType, TLV::AnonymousTag()));
2022-
SuccessOrExit(err = decryptedDataTlvReader.EnterContainer(containerType));
1978+
SuccessOrExit(err = AES_CCM_decrypt(msgR3Encrypted.Get(), msgR3EncryptedLen, nullptr, 0,
1979+
msgR3Encrypted.Get() + msgR3EncryptedLen, CHIP_CRYPTO_AEAD_MIC_LENGTH_BYTES,
1980+
sr3k.KeyHandle(), kTBEData3_Nonce, kTBEDataNonceLength, msgR3Encrypted.Get()));
20231981

2024-
SuccessOrExit(err = decryptedDataTlvReader.Next(TLV::kTLVType_ByteString, AsTlvContextTag(TBEDataTags::kSenderNOC)));
2025-
SuccessOrExit(err = decryptedDataTlvReader.Get(data.initiatorNOC));
1982+
decryptedDataTlvReader.Init(msgR3Encrypted.Get(), msgR3EncryptedLen);
20261983

2027-
SuccessOrExit(err = decryptedDataTlvReader.Next());
2028-
if (decryptedDataTlvReader.GetTag() == AsTlvContextTag(TBEDataTags::kSenderICAC))
2029-
{
2030-
VerifyOrExit(decryptedDataTlvReader.GetType() == TLV::kTLVType_ByteString, err = CHIP_ERROR_WRONG_TLV_TYPE);
2031-
SuccessOrExit(err = decryptedDataTlvReader.Get(data.initiatorICAC));
2032-
SuccessOrExit(err = decryptedDataTlvReader.Next(TLV::kTLVType_ByteString, AsTlvContextTag(TBEDataTags::kSignature)));
2033-
}
1984+
SuccessOrExit(err = ParseSigma3TBEData(decryptedDataTlvReader, data));
20341985

2035-
// Step 4 - Construct Sigma3 TBS Data
1986+
// Step 3 - Construct Sigma3 TBS Data
20361987
data.msg_r3_signed_len = TLV::EstimateStructOverhead(data.initiatorNOC.size(), data.initiatorICAC.size(),
20371988
kP256_PublicKey_Length, kP256_PublicKey_Length);
20381989

@@ -2042,12 +1993,7 @@ CHIP_ERROR CASESession::HandleSigma3a(System::PacketBufferHandle && msg)
20421993
ByteSpan(mEphemeralKey->Pubkey(), mEphemeralKey->Pubkey().Length()),
20431994
data.msg_R3_Signed.Get(), data.msg_r3_signed_len));
20441995

2045-
VerifyOrExit(decryptedDataTlvReader.GetTag() == AsTlvContextTag(TBEDataTags::kSignature), err = CHIP_ERROR_INVALID_TLV_TAG);
2046-
VerifyOrExit(data.tbsData3Signature.Capacity() >= decryptedDataTlvReader.GetLength(), err = CHIP_ERROR_INVALID_TLV_ELEMENT);
2047-
data.tbsData3Signature.SetLength(decryptedDataTlvReader.GetLength());
2048-
SuccessOrExit(err = decryptedDataTlvReader.GetBytes(data.tbsData3Signature.Bytes(), data.tbsData3Signature.Length()));
2049-
2050-
// Prepare for Step 5/6
1996+
// Prepare for Step 4/5
20511997
{
20521998
MutableByteSpan fabricRCAC{ data.rootCertBuf };
20531999
SuccessOrExit(err = mFabricsTable->FetchRootCert(mFabricIndex, fabricRCAC));
@@ -2093,6 +2039,69 @@ CHIP_ERROR CASESession::HandleSigma3a(System::PacketBufferHandle && msg)
20932039
return err;
20942040
}
20952041

2042+
CHIP_ERROR CASESession::ParseSigma3(ContiguousBufferTLVReader & tlvReader,
2043+
Platform::ScopedMemoryBufferWithSize<uint8_t> & msgR3Encrypted)
2044+
{
2045+
TLVType containerType = kTLVType_Structure;
2046+
2047+
ReturnErrorOnFailure(tlvReader.Next(containerType, AnonymousTag()));
2048+
ReturnErrorOnFailure(tlvReader.EnterContainer(containerType));
2049+
2050+
// Fetch encrypted data
2051+
size_t maxMsgR3SignedEncLen;
2052+
constexpr size_t kCaseOverheadForFutureTbeData = 128;
2053+
2054+
maxMsgR3SignedEncLen = EstimateStructOverhead(Credentials::kMaxCHIPCertLength, // initiatorNOC
2055+
Credentials::kMaxCHIPCertLength, // initiatorICAC
2056+
kMax_ECDSA_Signature_Length, // signature
2057+
kCaseOverheadForFutureTbeData // extra bytes for future-proofing
2058+
);
2059+
2060+
ReturnErrorOnFailure(tlvReader.Next(kTLVType_ByteString, AsTlvContextTag(Sigma3Tags::kEncrypted3)));
2061+
2062+
size_t msgR3EncryptedLenWithTag = 0;
2063+
msgR3EncryptedLenWithTag = tlvReader.GetLength();
2064+
2065+
// Validate we did not receive a buffer larger than legal
2066+
VerifyOrReturnError(msgR3EncryptedLenWithTag <= maxMsgR3SignedEncLen, CHIP_ERROR_INVALID_TLV_ELEMENT);
2067+
VerifyOrReturnError(msgR3EncryptedLenWithTag > CHIP_CRYPTO_AEAD_MIC_LENGTH_BYTES, CHIP_ERROR_INVALID_TLV_ELEMENT);
2068+
2069+
VerifyOrReturnError(msgR3Encrypted.Alloc(msgR3EncryptedLenWithTag), CHIP_ERROR_NO_MEMORY);
2070+
ReturnErrorOnFailure(tlvReader.GetBytes(msgR3Encrypted.Get(), static_cast<uint32_t>(msgR3EncryptedLenWithTag)));
2071+
2072+
ReturnErrorOnFailure(tlvReader.ExitContainer(containerType));
2073+
2074+
return CHIP_NO_ERROR;
2075+
}
2076+
2077+
CHIP_ERROR CASESession::ParseSigma3TBEData(ContiguousBufferTLVReader & decryptedDataTlvReader, HandleSigma3Data & data)
2078+
{
2079+
2080+
TLVType containerType = kTLVType_Structure;
2081+
ReturnErrorOnFailure(decryptedDataTlvReader.Next(containerType, TLV::AnonymousTag()));
2082+
ReturnErrorOnFailure(decryptedDataTlvReader.EnterContainer(containerType));
2083+
2084+
ReturnErrorOnFailure(decryptedDataTlvReader.Next(TLV::kTLVType_ByteString, AsTlvContextTag(TBEDataTags::kSenderNOC)));
2085+
ReturnErrorOnFailure(decryptedDataTlvReader.Get(data.initiatorNOC));
2086+
2087+
ReturnErrorOnFailure(decryptedDataTlvReader.Next());
2088+
if (decryptedDataTlvReader.GetTag() == AsTlvContextTag(TBEDataTags::kSenderICAC))
2089+
{
2090+
VerifyOrReturnError(decryptedDataTlvReader.GetType() == TLV::kTLVType_ByteString, CHIP_ERROR_WRONG_TLV_TYPE);
2091+
ReturnErrorOnFailure(decryptedDataTlvReader.Get(data.initiatorICAC));
2092+
ReturnErrorOnFailure(decryptedDataTlvReader.Next(TLV::kTLVType_ByteString, AsTlvContextTag(TBEDataTags::kSignature)));
2093+
}
2094+
2095+
VerifyOrReturnError(decryptedDataTlvReader.GetTag() == AsTlvContextTag(TBEDataTags::kSignature), CHIP_ERROR_INVALID_TLV_TAG);
2096+
VerifyOrReturnError(data.tbsData3Signature.Capacity() >= decryptedDataTlvReader.GetLength(), CHIP_ERROR_INVALID_TLV_ELEMENT);
2097+
data.tbsData3Signature.SetLength(decryptedDataTlvReader.GetLength());
2098+
ReturnErrorOnFailure(decryptedDataTlvReader.GetBytes(data.tbsData3Signature.Bytes(), data.tbsData3Signature.Length()));
2099+
2100+
ReturnErrorOnFailure(decryptedDataTlvReader.ExitContainer(containerType));
2101+
2102+
return CHIP_NO_ERROR;
2103+
}
2104+
20962105
CHIP_ERROR CASESession::HandleSigma3b(HandleSigma3Data & data, bool & cancel)
20972106
{
20982107
// Step 5/6

src/protocols/secure_channel/CASESession.h

+25-1
Original file line numberDiff line numberDiff line change
@@ -279,6 +279,25 @@ class DLL_EXPORT CASESession : public Messaging::UnsolicitedMessageHandler,
279279
bool responderSessionParamStructPresent = false;
280280
};
281281

282+
struct HandleSigma3Data
283+
{
284+
chip::Platform::ScopedMemoryBuffer<uint8_t> msg_R3_Signed;
285+
size_t msg_r3_signed_len;
286+
287+
ByteSpan initiatorNOC;
288+
ByteSpan initiatorICAC;
289+
290+
uint8_t rootCertBuf[Credentials::kMaxCHIPCertLength];
291+
ByteSpan fabricRCAC;
292+
293+
Crypto::P256ECDSASignature tbsData3Signature;
294+
295+
FabricId fabricId;
296+
NodeId initiatorNodeId;
297+
298+
Credentials::ValidationContext validContext;
299+
};
300+
282301
/**
283302
* @brief Encodes a Sigma1 message into TLV format and allocates a buffer for it, which is owned by the PacketBufferHandle
284303
* outparam.
@@ -342,6 +361,11 @@ class DLL_EXPORT CASESession : public Messaging::UnsolicitedMessageHandler,
342361
**/
343362
static CHIP_ERROR EncodeSigma2Resume(System::PacketBufferHandle & outMsg, EncodeSigma2ResumeInputs & inParam);
344363

364+
static CHIP_ERROR ParseSigma3(TLV::ContiguousBufferTLVReader & tlvReader,
365+
Platform::ScopedMemoryBufferWithSize<uint8_t> & msgR3Encrypted);
366+
367+
CHIP_ERROR ParseSigma3TBEData(TLV::ContiguousBufferTLVReader & tlvReader, HandleSigma3Data & data);
368+
345369
private:
346370
friend class TestCASESession;
347371

@@ -385,7 +409,7 @@ class DLL_EXPORT CASESession : public Messaging::UnsolicitedMessageHandler,
385409
static CHIP_ERROR SendSigma3b(SendSigma3Data & data, bool & cancel);
386410
CHIP_ERROR SendSigma3c(SendSigma3Data & data, CHIP_ERROR status);
387411

388-
struct HandleSigma3Data;
412+
// struct HandleSigma3Data;
389413
CHIP_ERROR HandleSigma3a(System::PacketBufferHandle && msg);
390414
static CHIP_ERROR HandleSigma3b(HandleSigma3Data & data, bool & cancel);
391415
CHIP_ERROR HandleSigma3c(HandleSigma3Data & data, CHIP_ERROR status);

0 commit comments

Comments
 (0)