@@ -1485,7 +1485,7 @@ CHIP_ERROR CASESession::HandleSigma2_and_SendSigma3(System::PacketBufferHandle &
1485
1485
CHIP_ERROR CASESession::HandleSigma2 (System::PacketBufferHandle && msg)
1486
1486
{
1487
1487
MATTER_TRACE_SCOPE (" HandleSigma2" , " CASESession" );
1488
- TLVReader decryptedDataTlvReader;
1488
+ ContiguousBufferTLVReader decryptedDataTlvReader;
1489
1489
1490
1490
const uint8_t * buf = msg->Start ();
1491
1491
size_t buflen = msg->DataLength ();
@@ -1504,12 +1504,12 @@ CHIP_ERROR CASESession::HandleSigma2(System::PacketBufferHandle && msg)
1504
1504
P256PublicKey responderPublicKey;
1505
1505
1506
1506
// uint8_t responderRandom[kSigmaParamRandomNumberSize];
1507
- ByteSpan responderNOC;
1508
- ByteSpan responderICAC;
1507
+ // ByteSpan responderNOC;
1508
+ // ByteSpan responderICAC;
1509
1509
1510
1510
// uint16_t responderSessionId;
1511
1511
1512
- TLVType containerType = kTLVType_Structure ;
1512
+ // TLVType containerType = kTLVType_Structure;
1513
1513
size_t msg_r2_signed_len;
1514
1514
1515
1515
size_t msg_r2_encrypted_len = 0 ;
@@ -1521,6 +1521,7 @@ CHIP_ERROR CASESession::HandleSigma2(System::PacketBufferHandle && msg)
1521
1521
tlvReader.Init (std::move (msg));
1522
1522
1523
1523
ParsedSigma2 parsedSigma2;
1524
+ ParsedSigma2TBEData parsedSigma2TBEData;
1524
1525
1525
1526
FabricId fabricId = kUndefinedFabricId ;
1526
1527
{
@@ -1533,8 +1534,6 @@ CHIP_ERROR CASESession::HandleSigma2(System::PacketBufferHandle && msg)
1533
1534
VerifyOrExit (mEphemeralKey != nullptr , err = CHIP_ERROR_INTERNAL);
1534
1535
VerifyOrExit (buf != nullptr , err = CHIP_ERROR_MESSAGE_INCOMPLETE);
1535
1536
1536
- SuccessOrExit (err = mCommissioningHash .AddData (ByteSpan{ buf, buflen }));
1537
-
1538
1537
ParseSigma2 (tlvReader, parsedSigma2);
1539
1538
1540
1539
ChipLogDetail (SecureChannel, " Peer assigned session key ID %d" , parsedSigma2.responderSessionId );
@@ -1545,7 +1544,7 @@ CHIP_ERROR CASESession::HandleSigma2(System::PacketBufferHandle && msg)
1545
1544
memcpy (mRemotePubKey .Bytes (), parsedSigma2.responderEphPubKey .data (), mRemotePubKey .Length ());
1546
1545
1547
1546
// Generate a Shared Secret
1548
- SuccessOrExit (err = mEphemeralKey ->ECDH_derive_secret (mRemotePubKey , mSharedSecret ));
1547
+ ReturnErrorOnFailure (err = mEphemeralKey ->ECDH_derive_secret (mRemotePubKey , mSharedSecret ));
1549
1548
1550
1549
// Generate the S2K key
1551
1550
{
@@ -1554,6 +1553,9 @@ CHIP_ERROR CASESession::HandleSigma2(System::PacketBufferHandle && msg)
1554
1553
err = ConstructSaltSigma2 (ByteSpan (parsedSigma2.responderRandom ), mRemotePubKey , ByteSpan (mIPK ), saltSpan));
1555
1554
ReturnErrorOnFailure (err = DeriveSigmaKey (saltSpan, ByteSpan (kKDFSR2Info ), sr2k));
1556
1555
}
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 }));
1557
1559
1558
1560
if (parsedSigma2.responderMrpParamsPresent )
1559
1561
{
@@ -1571,27 +1573,19 @@ CHIP_ERROR CASESession::HandleSigma2(System::PacketBufferHandle && msg)
1571
1573
sr2k.KeyHandle (), kTBEData2_Nonce , kTBEDataNonceLength , parsedSigma2.msgR2Encrypted .Get ()));
1572
1574
1573
1575
decryptedDataTlvReader.Init (parsedSigma2.msgR2Encrypted .Get (), msg_r2_encrypted_len);
1574
- SuccessOrExit (err = decryptedDataTlvReader.Next (containerType, AnonymousTag ()));
1575
- SuccessOrExit (err = decryptedDataTlvReader.EnterContainer (containerType));
1576
1576
1577
- SuccessOrExit (err = decryptedDataTlvReader.Next (kTLVType_ByteString , AsTlvContextTag (TBEDataTags::kSenderNOC )));
1578
- SuccessOrExit (err = decryptedDataTlvReader.Get (responderNOC));
1577
+ ParseSigma2TBEData (decryptedDataTlvReader, parsedSigma2TBEData);
1579
1578
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 ());
1587
1580
1588
1581
// Validate responder identity located in msg_r2_encrypted
1589
1582
// Constructing responder identity
1590
1583
{
1591
1584
CompressedFabricId unused;
1592
1585
FabricId responderFabricId;
1593
1586
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,
1595
1589
responderFabricId, responderNodeId, responderPublicKey));
1596
1590
VerifyOrExit (fabricId == responderFabricId, err = CHIP_ERROR_INVALID_CASE_PARAMETER);
1597
1591
// Verify that responderNodeId (from responderNOC) matches one that was included
@@ -1600,29 +1594,23 @@ CHIP_ERROR CASESession::HandleSigma2(System::PacketBufferHandle && msg)
1600
1594
}
1601
1595
1602
1596
// 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 );
1605
1600
1606
1601
VerifyOrExit (msg_R2_Signed.Alloc (msg_r2_signed_len), err = CHIP_ERROR_NO_MEMORY);
1607
1602
1608
- SuccessOrExit (err = ConstructTBSData (responderNOC, responderICAC, ByteSpan (mRemotePubKey , mRemotePubKey .Length ()),
1603
+ SuccessOrExit (err = ConstructTBSData (parsedSigma2TBEData.responderNOC , parsedSigma2TBEData.responderICAC ,
1604
+ ByteSpan (mRemotePubKey , mRemotePubKey .Length ()),
1609
1605
ByteSpan (mEphemeralKey ->Pubkey (), mEphemeralKey ->Pubkey ().Length ()), msg_R2_Signed.Get (),
1610
1606
msg_r2_signed_len));
1611
1607
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
-
1617
1608
// 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 ));
1623
1611
1624
1612
// Retrieve peer CASE Authenticated Tags (CATs) from peer's NOC.
1625
- SuccessOrExit (err = ExtractCATsFromOpCert (responderNOC, mPeerCATs ));
1613
+ SuccessOrExit (err = ExtractCATsFromOpCert (parsedSigma2TBEData. responderNOC , mPeerCATs ));
1626
1614
1627
1615
exit :
1628
1616
if (err != CHIP_NO_ERROR)
@@ -1632,6 +1620,41 @@ CHIP_ERROR CASESession::HandleSigma2(System::PacketBufferHandle && msg)
1632
1620
return err;
1633
1621
}
1634
1622
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
+
1635
1658
CHIP_ERROR CASESession::SendSigma3a ()
1636
1659
{
1637
1660
MATTER_TRACE_SCOPE (" SendSigma3" , " CASESession" );
0 commit comments