@@ -372,25 +372,6 @@ struct CASESession::SendSigma3Data
372
372
P256ECDSASignature tbsData3Signature;
373
373
};
374
374
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
-
394
375
CASESession::~CASESession ()
395
376
{
396
377
// 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)
1947
1928
MATTER_TRACE_SCOPE (" HandleSigma3" , " CASESession" );
1948
1929
CHIP_ERROR err = CHIP_NO_ERROR;
1949
1930
System::PacketBufferTLVReader tlvReader;
1950
- TLV::TLVReader decryptedDataTlvReader;
1931
+ TLV::ContiguousBufferTLVReader decryptedDataTlvReader;
1951
1932
TLV::TLVType containerType = TLV::kTLVType_Structure ;
1952
1933
1953
1934
const uint8_t * buf = msg->Start ();
1954
1935
const size_t bufLen = msg->DataLength ();
1955
1936
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 ;
1962
1939
1963
1940
AutoReleaseSessionKey sr3k (*mSessionManager ->GetSessionKeystore ());
1964
1941
@@ -1983,24 +1960,8 @@ CHIP_ERROR CASESession::HandleSigma3a(System::PacketBufferHandle && msg)
1983
1960
VerifyOrExit (mEphemeralKey != nullptr , err = CHIP_ERROR_INTERNAL);
1984
1961
1985
1962
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 );
1992
1963
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));
2004
1965
2005
1966
// Step 1
2006
1967
{
@@ -2012,27 +1973,17 @@ CHIP_ERROR CASESession::HandleSigma3a(System::PacketBufferHandle && msg)
2012
1973
SuccessOrExit (err = mCommissioningHash .AddData (ByteSpan{ buf, bufLen }));
2013
1974
2014
1975
// 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;
2018
1977
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 ()));
2023
1981
2024
- SuccessOrExit (err = decryptedDataTlvReader.Next (TLV::kTLVType_ByteString , AsTlvContextTag (TBEDataTags::kSenderNOC )));
2025
- SuccessOrExit (err = decryptedDataTlvReader.Get (data.initiatorNOC ));
1982
+ decryptedDataTlvReader.Init (msgR3Encrypted.Get (), msgR3EncryptedLen);
2026
1983
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));
2034
1985
2035
- // Step 4 - Construct Sigma3 TBS Data
1986
+ // Step 3 - Construct Sigma3 TBS Data
2036
1987
data.msg_r3_signed_len = TLV::EstimateStructOverhead (data.initiatorNOC .size (), data.initiatorICAC .size (),
2037
1988
kP256_PublicKey_Length , kP256_PublicKey_Length );
2038
1989
@@ -2042,12 +1993,7 @@ CHIP_ERROR CASESession::HandleSigma3a(System::PacketBufferHandle && msg)
2042
1993
ByteSpan (mEphemeralKey ->Pubkey (), mEphemeralKey ->Pubkey ().Length ()),
2043
1994
data.msg_R3_Signed .Get (), data.msg_r3_signed_len ));
2044
1995
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
2051
1997
{
2052
1998
MutableByteSpan fabricRCAC{ data.rootCertBuf };
2053
1999
SuccessOrExit (err = mFabricsTable ->FetchRootCert (mFabricIndex , fabricRCAC));
@@ -2093,6 +2039,69 @@ CHIP_ERROR CASESession::HandleSigma3a(System::PacketBufferHandle && msg)
2093
2039
return err;
2094
2040
}
2095
2041
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
+
2096
2105
CHIP_ERROR CASESession::HandleSigma3b (HandleSigma3Data & data, bool & cancel)
2097
2106
{
2098
2107
// Step 5/6
0 commit comments