@@ -1442,7 +1442,7 @@ CHIP_ERROR CASESession::HandleSigma2Resume(System::PacketBufferHandle && msg)
1442
1442
GetRemoteSessionParameters ());
1443
1443
}
1444
1444
1445
- ChipLogDetail (SecureChannel, " Peer assigned session session ID %d" , responderSessionId);
1445
+ ChipLogDetail (SecureChannel, " Peer assigned session key ID %d" , responderSessionId);
1446
1446
SetPeerSessionId (responderSessionId);
1447
1447
1448
1448
if (mSessionResumptionStorage != nullptr )
@@ -1485,24 +1485,16 @@ 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
- CHIP_ERROR err = CHIP_NO_ERROR;
1489
- System::PacketBufferTLVReader tlvReader;
1490
- TLV::TLVReader decryptedDataTlvReader;
1491
- TLV::TLVType containerType = TLV::kTLVType_Structure ;
1488
+ TLVReader decryptedDataTlvReader;
1492
1489
1493
1490
const uint8_t * buf = msg->Start ();
1494
1491
size_t buflen = msg->DataLength ();
1495
1492
1496
1493
uint8_t msg_salt[kIPKSize + kSigmaParamRandomNumberSize + kP256_PublicKey_Length + kSHA256_Hash_Length ];
1497
1494
1498
1495
chip::Platform::ScopedMemoryBuffer<uint8_t > msg_R2_Encrypted;
1499
- size_t msg_r2_encrypted_len = 0 ;
1500
- size_t msg_r2_encrypted_len_with_tag = 0 ;
1501
1496
1502
1497
chip::Platform::ScopedMemoryBuffer<uint8_t > msg_R2_Signed;
1503
- size_t msg_r2_signed_len;
1504
- size_t max_msg_r2_signed_enc_len;
1505
- constexpr size_t kCaseOverheadForFutureTbeData = 128 ;
1506
1498
1507
1499
AutoReleaseSessionKey sr2k (*mSessionManager ->GetSessionKeystore ());
1508
1500
@@ -1511,13 +1503,24 @@ CHIP_ERROR CASESession::HandleSigma2(System::PacketBufferHandle && msg)
1511
1503
NodeId responderNodeId;
1512
1504
P256PublicKey responderPublicKey;
1513
1505
1514
- uint8_t responderRandom[kSigmaParamRandomNumberSize ];
1506
+ // uint8_t responderRandom[kSigmaParamRandomNumberSize];
1515
1507
ByteSpan responderNOC;
1516
1508
ByteSpan responderICAC;
1517
1509
1518
- uint16_t responderSessionId;
1510
+ // uint16_t responderSessionId;
1511
+
1512
+ TLVType containerType = kTLVType_Structure ;
1513
+ size_t msg_r2_signed_len;
1514
+
1515
+ size_t msg_r2_encrypted_len = 0 ;
1519
1516
1520
1517
ChipLogProgress (SecureChannel, " Received Sigma2 msg" );
1518
+ CHIP_ERROR err = CHIP_NO_ERROR;
1519
+
1520
+ System::PacketBufferTLVReader tlvReader;
1521
+ tlvReader.Init (std::move (msg));
1522
+
1523
+ ParsedSigma2 parsedSigma2;
1521
1524
1522
1525
FabricId fabricId = kUndefinedFabricId ;
1523
1526
{
@@ -1530,71 +1533,56 @@ CHIP_ERROR CASESession::HandleSigma2(System::PacketBufferHandle && msg)
1530
1533
VerifyOrExit (mEphemeralKey != nullptr , err = CHIP_ERROR_INTERNAL);
1531
1534
VerifyOrExit (buf != nullptr , err = CHIP_ERROR_MESSAGE_INCOMPLETE);
1532
1535
1533
- tlvReader.Init (std::move (msg));
1534
- SuccessOrExit (err = tlvReader.Next (containerType, TLV::AnonymousTag ()));
1535
- SuccessOrExit (err = tlvReader.EnterContainer (containerType));
1536
-
1537
- // Retrieve Responder's Random value
1538
- SuccessOrExit (err = tlvReader.Next (TLV::kTLVType_ByteString , AsTlvContextTag (Sigma2Tags::kResponderRandom )));
1539
- SuccessOrExit (err = tlvReader.GetBytes (responderRandom, sizeof (responderRandom)));
1536
+ SuccessOrExit (err = mCommissioningHash .AddData (ByteSpan{ buf, buflen }));
1540
1537
1541
- // Assign Session ID
1542
- SuccessOrExit (err = tlvReader.Next (TLV::kTLVType_UnsignedInteger , AsTlvContextTag (Sigma2Tags::kResponderSessionId )));
1543
- SuccessOrExit (err = tlvReader.Get (responderSessionId));
1538
+ ParseSigma2 (tlvReader, parsedSigma2);
1544
1539
1545
- ChipLogDetail (SecureChannel, " Peer assigned session session ID %d" , responderSessionId);
1546
- SetPeerSessionId (responderSessionId);
1540
+ ChipLogDetail (SecureChannel, " Peer assigned session key ID %d" , parsedSigma2. responderSessionId );
1541
+ SetPeerSessionId (parsedSigma2. responderSessionId );
1547
1542
1548
- // Retrieve Responder's Ephemeral Pubkey
1549
- SuccessOrExit (err = tlvReader. Next (TLV:: kTLVType_ByteString , AsTlvContextTag (Sigma2Tags:: kResponderEphPubKey )));
1550
- SuccessOrExit (err = tlvReader. GetBytes ( mRemotePubKey , static_cast < uint32_t >( mRemotePubKey .Length ()) ));
1543
+ // ParseSigma2 ensures that:
1544
+ // mRemotePubKey.Length() == responderEphPubKey.size() == kP256_PublicKey_Length.
1545
+ memcpy ( mRemotePubKey . Bytes (), parsedSigma2. responderEphPubKey . data (), mRemotePubKey .Length ());
1551
1546
1552
1547
// Generate a Shared Secret
1553
1548
SuccessOrExit (err = mEphemeralKey ->ECDH_derive_secret (mRemotePubKey , mSharedSecret ));
1554
1549
1555
1550
// Generate the S2K key
1556
1551
{
1557
1552
MutableByteSpan saltSpan (msg_salt);
1558
- SuccessOrExit (err = ConstructSaltSigma2 (ByteSpan (responderRandom), mRemotePubKey , ByteSpan (mIPK ), saltSpan));
1559
- SuccessOrExit (err = DeriveSigmaKey (saltSpan, ByteSpan (kKDFSR2Info ), sr2k));
1553
+ ReturnErrorOnFailure (
1554
+ err = ConstructSaltSigma2 (ByteSpan (parsedSigma2.responderRandom ), mRemotePubKey , ByteSpan (mIPK ), saltSpan));
1555
+ ReturnErrorOnFailure (err = DeriveSigmaKey (saltSpan, ByteSpan (kKDFSR2Info ), sr2k));
1560
1556
}
1561
1557
1562
- SuccessOrExit (err = mCommissioningHash .AddData (ByteSpan{ buf, buflen }));
1563
-
1564
- // Generate decrypted data
1565
- SuccessOrExit (err = tlvReader.Next (TLV::kTLVType_ByteString , AsTlvContextTag (Sigma2Tags::kEncrypted2 )));
1566
-
1567
- max_msg_r2_signed_enc_len =
1568
- TLV::EstimateStructOverhead (Credentials::kMaxCHIPCertLength , Credentials::kMaxCHIPCertLength , tbsData2Signature.Length (),
1569
- SessionResumptionStorage::kResumptionIdSize , kCaseOverheadForFutureTbeData );
1570
- msg_r2_encrypted_len_with_tag = tlvReader.GetLength ();
1571
-
1572
- // Validate we did not receive a buffer larger than legal
1573
- VerifyOrExit (msg_r2_encrypted_len_with_tag <= max_msg_r2_signed_enc_len, err = CHIP_ERROR_INVALID_TLV_ELEMENT);
1574
- VerifyOrExit (msg_r2_encrypted_len_with_tag > CHIP_CRYPTO_AEAD_MIC_LENGTH_BYTES, err = CHIP_ERROR_INVALID_TLV_ELEMENT);
1575
- VerifyOrExit (msg_R2_Encrypted.Alloc (msg_r2_encrypted_len_with_tag), err = CHIP_ERROR_NO_MEMORY);
1558
+ if (parsedSigma2.responderMrpParamsPresent )
1559
+ {
1560
+ SetRemoteSessionParameters (parsedSigma2.responderSessionParams );
1561
+ mExchangeCtxt .Value ()->GetSessionHandle ()->AsUnauthenticatedSession ()->SetRemoteSessionParameters (
1562
+ GetRemoteSessionParameters ());
1563
+ }
1564
+ /* *********************************************************************************************************************************
1565
+ */
1576
1566
1577
- SuccessOrExit (err = tlvReader.GetBytes (msg_R2_Encrypted.Get (), static_cast <uint32_t >(msg_r2_encrypted_len_with_tag)));
1578
- msg_r2_encrypted_len = msg_r2_encrypted_len_with_tag - CHIP_CRYPTO_AEAD_MIC_LENGTH_BYTES;
1567
+ msg_r2_encrypted_len = parsedSigma2.msgR2Encrypted .AllocatedSize () - CHIP_CRYPTO_AEAD_MIC_LENGTH_BYTES;
1579
1568
1580
- SuccessOrExit (err = AES_CCM_decrypt (msg_R2_Encrypted .Get (), msg_r2_encrypted_len, nullptr , 0 ,
1581
- msg_R2_Encrypted .Get () + msg_r2_encrypted_len, CHIP_CRYPTO_AEAD_MIC_LENGTH_BYTES,
1582
- sr2k.KeyHandle (), kTBEData2_Nonce , kTBEDataNonceLength , msg_R2_Encrypted .Get ()));
1569
+ SuccessOrExit (err = AES_CCM_decrypt (parsedSigma2. msgR2Encrypted .Get (), msg_r2_encrypted_len, nullptr , 0 ,
1570
+ parsedSigma2. msgR2Encrypted .Get () + msg_r2_encrypted_len, CHIP_CRYPTO_AEAD_MIC_LENGTH_BYTES,
1571
+ sr2k.KeyHandle (), kTBEData2_Nonce , kTBEDataNonceLength , parsedSigma2. msgR2Encrypted .Get ()));
1583
1572
1584
- decryptedDataTlvReader.Init (msg_R2_Encrypted.Get (), msg_r2_encrypted_len);
1585
- containerType = TLV::kTLVType_Structure ;
1586
- SuccessOrExit (err = decryptedDataTlvReader.Next (containerType, TLV::AnonymousTag ()));
1573
+ decryptedDataTlvReader.Init (parsedSigma2.msgR2Encrypted .Get (), msg_r2_encrypted_len);
1574
+ SuccessOrExit (err = decryptedDataTlvReader.Next (containerType, AnonymousTag ()));
1587
1575
SuccessOrExit (err = decryptedDataTlvReader.EnterContainer (containerType));
1588
1576
1589
- SuccessOrExit (err = decryptedDataTlvReader.Next (TLV:: kTLVType_ByteString , AsTlvContextTag (TBEDataTags::kSenderNOC )));
1577
+ SuccessOrExit (err = decryptedDataTlvReader.Next (kTLVType_ByteString , AsTlvContextTag (TBEDataTags::kSenderNOC )));
1590
1578
SuccessOrExit (err = decryptedDataTlvReader.Get (responderNOC));
1591
1579
1592
1580
SuccessOrExit (err = decryptedDataTlvReader.Next ());
1593
1581
if (decryptedDataTlvReader.GetTag () == AsTlvContextTag (TBEDataTags::kSenderICAC ))
1594
1582
{
1595
- VerifyOrExit (decryptedDataTlvReader.GetType () == TLV:: kTLVType_ByteString , err = CHIP_ERROR_WRONG_TLV_TYPE);
1583
+ VerifyOrExit (decryptedDataTlvReader.GetType () == kTLVType_ByteString , err = CHIP_ERROR_WRONG_TLV_TYPE);
1596
1584
SuccessOrExit (err = decryptedDataTlvReader.Get (responderICAC));
1597
- SuccessOrExit (err = decryptedDataTlvReader.Next (TLV:: kTLVType_ByteString , AsTlvContextTag (TBEDataTags::kSignature )));
1585
+ SuccessOrExit (err = decryptedDataTlvReader.Next (kTLVType_ByteString , AsTlvContextTag (TBEDataTags::kSignature )));
1598
1586
}
1599
1587
1600
1588
// Validate responder identity located in msg_r2_encrypted
@@ -1612,8 +1600,8 @@ CHIP_ERROR CASESession::HandleSigma2(System::PacketBufferHandle && msg)
1612
1600
}
1613
1601
1614
1602
// Construct msg_R2_Signed and validate the signature in msg_r2_encrypted
1615
- msg_r2_signed_len = TLV:: EstimateStructOverhead (sizeof (uint16_t ), responderNOC.size (), responderICAC.size (),
1616
- kP256_PublicKey_Length , kP256_PublicKey_Length );
1603
+ msg_r2_signed_len = EstimateStructOverhead (sizeof (uint16_t ), responderNOC.size (), responderICAC.size (), kP256_PublicKey_Length ,
1604
+ kP256_PublicKey_Length );
1617
1605
1618
1606
VerifyOrExit (msg_R2_Signed.Alloc (msg_r2_signed_len), err = CHIP_ERROR_NO_MEMORY);
1619
1607
@@ -1630,20 +1618,12 @@ CHIP_ERROR CASESession::HandleSigma2(System::PacketBufferHandle && msg)
1630
1618
SuccessOrExit (err = responderPublicKey.ECDSA_validate_msg_signature (msg_R2_Signed.Get (), msg_r2_signed_len, tbsData2Signature));
1631
1619
1632
1620
// Retrieve session resumption ID
1633
- SuccessOrExit (err = decryptedDataTlvReader.Next (TLV:: kTLVType_ByteString , AsTlvContextTag (TBEDataTags::kResumptionID )));
1621
+ SuccessOrExit (err = decryptedDataTlvReader.Next (kTLVType_ByteString , AsTlvContextTag (TBEDataTags::kResumptionID )));
1634
1622
SuccessOrExit (err = decryptedDataTlvReader.GetBytes (mNewResumptionId .data (), mNewResumptionId .size ()));
1635
1623
1636
1624
// Retrieve peer CASE Authenticated Tags (CATs) from peer's NOC.
1637
1625
SuccessOrExit (err = ExtractCATsFromOpCert (responderNOC, mPeerCATs ));
1638
1626
1639
- // Retrieve responderMRPParams if present
1640
- if (tlvReader.Next () != CHIP_END_OF_TLV)
1641
- {
1642
- SuccessOrExit (err = DecodeMRPParametersIfPresent (AsTlvContextTag (Sigma2Tags::kResponderSessionParams ), tlvReader));
1643
- mExchangeCtxt .Value ()->GetSessionHandle ()->AsUnauthenticatedSession ()->SetRemoteSessionParameters (
1644
- GetRemoteSessionParameters ());
1645
- }
1646
-
1647
1627
exit :
1648
1628
if (err != CHIP_NO_ERROR)
1649
1629
{
@@ -2378,6 +2358,73 @@ CHIP_ERROR CASESession::ParseSigma1(TLV::ContiguousBufferTLVReader & tlvReader,
2378
2358
return CHIP_NO_ERROR;
2379
2359
}
2380
2360
2361
+ CHIP_ERROR CASESession::ParseSigma2 (ContiguousBufferTLVReader & tlvReader, ParsedSigma2 & outParsedSigma2)
2362
+ {
2363
+ CHIP_ERROR err = CHIP_NO_ERROR;
2364
+ TLVType containerType = kTLVType_Structure ;
2365
+
2366
+ // FIND A SOLUTION TO THIS:
2367
+ P256ECDSASignature tbsData2Signature;
2368
+
2369
+ ReturnErrorOnFailure (err = tlvReader.Next (containerType, AnonymousTag ()));
2370
+ ReturnErrorOnFailure (err = tlvReader.EnterContainer (containerType));
2371
+
2372
+ // Retrieve Responder's Random value
2373
+ ReturnErrorOnFailure (err = tlvReader.Next (kTLVType_ByteString , AsTlvContextTag (Sigma2Tags::kResponderRandom )));
2374
+ ReturnErrorOnFailure (err = tlvReader.GetByteView (outParsedSigma2.responderRandom ));
2375
+ VerifyOrReturnError (outParsedSigma2.responderRandom .size () == kSigmaParamRandomNumberSize , CHIP_ERROR_INVALID_CASE_PARAMETER);
2376
+
2377
+ // Assign Session ID
2378
+ ReturnErrorOnFailure (err = tlvReader.Next (kTLVType_UnsignedInteger , AsTlvContextTag (Sigma2Tags::kResponderSessionId )));
2379
+ ReturnErrorOnFailure (err = tlvReader.Get (outParsedSigma2.responderSessionId ));
2380
+
2381
+ // Retrieve Responder's Ephemeral Pubkey
2382
+ ReturnErrorOnFailure (err = tlvReader.Next (kTLVType_ByteString , AsTlvContextTag (Sigma2Tags::kResponderEphPubKey )));
2383
+ ReturnErrorOnFailure (tlvReader.GetByteView (outParsedSigma2.responderEphPubKey ));
2384
+ VerifyOrReturnError (outParsedSigma2.responderEphPubKey .size () == kP256_PublicKey_Length , CHIP_ERROR_INVALID_CASE_PARAMETER);
2385
+
2386
+ // ReturnErrorOnFailure(err = tlvReader.GetBytes(mRemotePubKey, static_cast<uint32_t>(mRemotePubKey.Length())));
2387
+
2388
+ // Generate decrypted data
2389
+ ReturnErrorOnFailure (err = tlvReader.Next (kTLVType_ByteString , AsTlvContextTag (Sigma2Tags::kEncrypted2 )));
2390
+
2391
+ // TODO find a solution to this
2392
+ // size_t msg_r2_encrypted_len = 0;
2393
+
2394
+ size_t msg_r2_encrypted_len_with_tag = 0 ;
2395
+
2396
+ constexpr size_t kCaseOverheadForFutureTbeData = 128 ;
2397
+
2398
+ size_t max_msg_r2_signed_enc_len;
2399
+
2400
+ max_msg_r2_signed_enc_len =
2401
+ EstimateStructOverhead (Credentials::kMaxCHIPCertLength , Credentials::kMaxCHIPCertLength , tbsData2Signature.Length (),
2402
+ SessionResumptionStorage::kResumptionIdSize , kCaseOverheadForFutureTbeData );
2403
+ msg_r2_encrypted_len_with_tag = tlvReader.GetLength ();
2404
+
2405
+ // Validate we did not receive a buffer larger than legal
2406
+ // TODO why are comparing this to the "signed one"
2407
+ // Maybe it is signed encrypted, but is the estimation calculated well? document it
2408
+ VerifyOrReturnError (msg_r2_encrypted_len_with_tag <= max_msg_r2_signed_enc_len, err = CHIP_ERROR_INVALID_TLV_ELEMENT);
2409
+ VerifyOrReturnError (msg_r2_encrypted_len_with_tag > CHIP_CRYPTO_AEAD_MIC_LENGTH_BYTES, err = CHIP_ERROR_INVALID_TLV_ELEMENT);
2410
+ VerifyOrReturnError (outParsedSigma2.msgR2Encrypted .Alloc (msg_r2_encrypted_len_with_tag), err = CHIP_ERROR_NO_MEMORY);
2411
+
2412
+ // TODO, should I keep this as GetBytes? or should I use GetByteView for consistency and do something else?
2413
+ ReturnErrorOnFailure (
2414
+ err = tlvReader.GetBytes (outParsedSigma2.msgR2Encrypted .Get (), outParsedSigma2.msgR2Encrypted .AllocatedSize ()));
2415
+ // msg_r2_encrypted_len = msg_r2_encrypted_len_with_tag - CHIP_CRYPTO_AEAD_MIC_LENGTH_BYTES;
2416
+
2417
+ // Retrieve responderMRPParams if present
2418
+ if (tlvReader.Next () != CHIP_END_OF_TLV)
2419
+ {
2420
+ ReturnErrorOnFailure (err = DecodeMRPParametersIfPresent (AsTlvContextTag (Sigma2Tags::kResponderSessionParams ), tlvReader,
2421
+ outParsedSigma2.responderSessionParams ));
2422
+ outParsedSigma2.responderMrpParamsPresent = true ;
2423
+ }
2424
+
2425
+ return CHIP_NO_ERROR;
2426
+ }
2427
+
2381
2428
CHIP_ERROR CASESession::ValidateReceivedMessage (ExchangeContext * ec, const PayloadHeader & payloadHeader,
2382
2429
const System::PacketBufferHandle & msg)
2383
2430
{
0 commit comments