blob: c056a89a8361396e23fa4abfe231e129772eab49 [file] [log] [blame]
/*
*
* Copyright (c) 2020 Project CHIP Authors
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#pragma once
#include <optional>
#include <transport/raw/Base.h>
#include <transport/raw/PeerAddress.h>
#if CONFIG_NETWORK_LAYER_BLE
#include <ble/Ble.h>
#endif // CONFIG_NETWORK_LAYER_BLE
#include <crypto/CHIPCryptoPAL.h>
#include <lib/support/SetupDiscriminator.h>
#include <lib/support/logging/CHIPLogging.h>
#include <messaging/ReliableMessageProtocolConfig.h>
#include <protocols/secure_channel/PASESession.h>
namespace chip {
// The largest supported value for Rendezvous discriminators
const uint16_t kMaxRendezvousDiscriminatorValue = 0xFFF;
// The largest supported value for session idle interval and session active interval
inline constexpr uint32_t kMaxSessionIdleInterval = 3600000;
class RendezvousParameters
{
public:
RendezvousParameters() = default;
bool HasSetupPINCode() const { return mSetupPINCode != 0; }
uint32_t GetSetupPINCode() const { return mSetupPINCode; }
RendezvousParameters & SetSetupPINCode(uint32_t setupPINCode)
{
mSetupPINCode = setupPINCode;
return *this;
}
bool HasPeerAddress() const { return mPeerAddress.IsInitialized(); }
Transport::PeerAddress GetPeerAddress() const { return mPeerAddress; }
RendezvousParameters & SetPeerAddress(const Transport::PeerAddress & peerAddress)
{
mPeerAddress = peerAddress;
return *this;
}
// Discriminators in RendezvousParameters are always long (12-bit)
// discriminators.
bool HasDiscriminator() const { return mSetupDiscriminator.has_value(); }
// Obtains the long version of the discriminator, or 0 if short.
// WARNING: This is lossy and a bad idea to use. The correct method to use
// is GetSetupDiscriminator(). This method exists for public
// API backwards compatibility.
uint16_t GetDiscriminator() const
{
if (!mSetupDiscriminator.has_value())
{
ChipLogError(Discovery,
"Get RendezvousParameters::GetDiscriminator() called without discriminator in params (inconsistent). "
"Using value 0 to avoid crash! Ensure discriminator is set!");
return 0;
}
if (mSetupDiscriminator.value().IsShortDiscriminator())
{
ChipLogError(Discovery,
"Get RendezvousParameters::GetDiscriminator() called with SHORT discriminator (inconsistent). Using value "
"0 to avoid crash! Call GetSetupDiscriminator() to avoid loss.");
return 0;
}
return mSetupDiscriminator.value().GetLongValue();
}
std::optional<SetupDiscriminator> GetSetupDiscriminator() const
{
if (!mSetupDiscriminator.has_value())
{
ChipLogError(
Discovery,
"Get RendezvousParameters::GetSetupDiscriminator() called without discriminator in params (inconsistent).");
}
return mSetupDiscriminator;
}
RendezvousParameters & SetSetupDiscriminator(SetupDiscriminator discriminator)
{
mSetupDiscriminator = discriminator;
return *this;
}
RendezvousParameters & SetDiscriminator(uint16_t discriminator)
{
SetupDiscriminator tempDiscriminator;
tempDiscriminator.SetLongValue(discriminator);
mSetupDiscriminator = tempDiscriminator;
return *this;
}
bool HasPASEVerifier() const { return mHasPASEVerifier; }
const Crypto::Spake2pVerifier & GetPASEVerifier() const { return mPASEVerifier; }
RendezvousParameters & SetPASEVerifier(Crypto::Spake2pVerifier & verifier)
{
memmove(&mPASEVerifier, &verifier, sizeof(verifier));
mHasPASEVerifier = true;
return *this;
}
#if CONFIG_NETWORK_LAYER_BLE
bool HasBleLayer() const { return mBleLayer != nullptr; }
Ble::BleLayer * GetBleLayer() const { return mBleLayer; }
RendezvousParameters & SetBleLayer(Ble::BleLayer * value)
{
mBleLayer = value;
return *this;
}
bool HasConnectionObject() const { return mConnectionObject != BLE_CONNECTION_UNINITIALIZED; }
BLE_CONNECTION_OBJECT GetConnectionObject() const { return mConnectionObject; }
RendezvousParameters & SetConnectionObject(BLE_CONNECTION_OBJECT connObj)
{
mConnectionObject = connObj;
return *this;
}
bool HasDiscoveredObject() const { return mDiscoveredObject != BLE_CONNECTION_UNINITIALIZED; }
BLE_CONNECTION_OBJECT GetDiscoveredObject() const { return mDiscoveredObject; }
RendezvousParameters & SetDiscoveredObject(BLE_CONNECTION_OBJECT connObj)
{
mDiscoveredObject = connObj;
return *this;
}
#else
bool HasConnectionObject() const { return false; }
bool HasDiscoveredObject() const { return false; }
#endif // CONFIG_NETWORK_LAYER_BLE
bool HasMRPConfig() const { return mMRPConfig.HasValue(); }
ReliableMessageProtocolConfig GetMRPConfig() const { return mMRPConfig.ValueOr(GetDefaultMRPConfig()); }
RendezvousParameters & SetIdleInterval(System::Clock::Milliseconds32 interval)
{
if (!mMRPConfig.HasValue())
{
mMRPConfig.Emplace(GetDefaultMRPConfig());
}
mMRPConfig.Value().mIdleRetransTimeout = interval;
return *this;
}
RendezvousParameters & SetActiveInterval(System::Clock::Milliseconds32 interval)
{
if (!mMRPConfig.HasValue())
{
mMRPConfig.Emplace(GetDefaultMRPConfig());
}
mMRPConfig.Value().mActiveRetransTimeout = interval;
return *this;
}
private:
Transport::PeerAddress mPeerAddress; ///< the peer node address
uint32_t mSetupPINCode = 0; ///< the target peripheral setup PIN Code
std::optional<SetupDiscriminator> mSetupDiscriminator;
Crypto::Spake2pVerifier mPASEVerifier;
bool mHasPASEVerifier = false;
Optional<ReliableMessageProtocolConfig> mMRPConfig;
#if CONFIG_NETWORK_LAYER_BLE
Ble::BleLayer * mBleLayer = nullptr;
BLE_CONNECTION_OBJECT mConnectionObject = BLE_CONNECTION_UNINITIALIZED;
BLE_CONNECTION_OBJECT mDiscoveredObject = BLE_CONNECTION_UNINITIALIZED;
#endif // CONFIG_NETWORK_LAYER_BLE
};
} // namespace chip