[key-manager] add Kek class (#4674)

This commit adds a class `Kek` to store Key Encryption Key
This commit is contained in:
Abtin Keshavarzian
2020-03-12 08:41:00 -07:00
committed by GitHub
parent 08c7113336
commit dc2f9edcb7
6 changed files with 80 additions and 19 deletions
+2 -2
View File
@@ -922,7 +922,7 @@ void Mac::ProcessTransmitSecurity(TxFrame &aFrame, bool aProcessAesCcm)
switch (keyIdMode) switch (keyIdMode)
{ {
case Frame::kKeyIdMode0: case Frame::kKeyIdMode0:
aFrame.SetAesKey(keyManager.GetKek()); aFrame.SetAesKey(keyManager.GetKek().GetKey());
extAddress = &GetExtAddress(); extAddress = &GetExtAddress();
if (!aFrame.IsARetransmission()) if (!aFrame.IsARetransmission())
@@ -1414,7 +1414,7 @@ otError Mac::ProcessReceiveSecurity(RxFrame &aFrame, const Address &aSrcAddr, Ne
switch (keyIdMode) switch (keyIdMode)
{ {
case Frame::kKeyIdMode0: case Frame::kKeyIdMode0:
macKey = keyManager.GetKek(); macKey = keyManager.GetKek().GetKey();
VerifyOrExit(macKey != NULL); VerifyOrExit(macKey != NULL);
extAddress = &aSrcAddr.GetExtended(); extAddress = &aSrcAddr.GetExtended();
break; break;
+2 -2
View File
@@ -1029,8 +1029,8 @@ otError Commissioner::SendRelayTransmit(Message &aMessage, const Ip6::MessageInf
if (aMessage.GetSubType() == Message::kSubTypeJoinerFinalizeResponse) if (aMessage.GetSubType() == Message::kSubTypeJoinerFinalizeResponse)
{ {
SuccessOrExit(error = Tlv::AppendTlv(*message, Tlv::kJoinerRouterKek, Get<KeyManager>().GetKek(), SuccessOrExit(
KeyManager::kMaxKeyLength)); error = Tlv::AppendTlv(*message, Tlv::kJoinerRouterKek, Get<KeyManager>().GetKek().GetKey(), Kek::kSize));
} }
tlv.SetType(Tlv::kJoinerDtlsEncapsulation); tlv.SetType(Tlv::kJoinerDtlsEncapsulation);
+5 -6
View File
@@ -190,7 +190,7 @@ void JoinerRouter::HandleRelayTransmit(Coap::Message &aMessage, const Ip6::Messa
otError error; otError error;
uint16_t joinerPort; uint16_t joinerPort;
uint8_t joinerIid[Ip6::Address::kInterfaceIdentifierSize]; uint8_t joinerIid[Ip6::Address::kInterfaceIdentifierSize];
uint8_t kek[KeyManager::kMaxKeyLength]; Kek kek;
uint16_t offset; uint16_t offset;
uint16_t length; uint16_t length;
Message * message = NULL; Message * message = NULL;
@@ -218,7 +218,7 @@ void JoinerRouter::HandleRelayTransmit(Coap::Message &aMessage, const Ip6::Messa
SuccessOrExit(error = mSocket.SendTo(*message, messageInfo)); SuccessOrExit(error = mSocket.SendTo(*message, messageInfo));
if (Tlv::ReadTlv(aMessage, Tlv::kJoinerRouterKek, kek, sizeof(kek)) == OT_ERROR_NONE) if (Tlv::ReadTlv(aMessage, Tlv::kJoinerRouterKek, &kek, sizeof(kek)) == OT_ERROR_NONE)
{ {
otLogInfoMeshCoP("Received kek"); otLogInfoMeshCoP("Received kek");
@@ -232,7 +232,7 @@ exit:
} }
} }
otError JoinerRouter::DelaySendingJoinerEntrust(const Ip6::MessageInfo &aMessageInfo, const uint8_t *aKek) otError JoinerRouter::DelaySendingJoinerEntrust(const Ip6::MessageInfo &aMessageInfo, const Kek &aKek)
{ {
otError error = OT_ERROR_NONE; otError error = OT_ERROR_NONE;
Message * message = Get<MessagePool>().New(Message::kTypeOther, 0); Message * message = Get<MessagePool>().New(Message::kTypeOther, 0);
@@ -243,7 +243,7 @@ otError JoinerRouter::DelaySendingJoinerEntrust(const Ip6::MessageInfo &aMessage
metadata.mMessageInfo = aMessageInfo; metadata.mMessageInfo = aMessageInfo;
metadata.mMessageInfo.SetPeerPort(kCoapUdpPort); metadata.mMessageInfo.SetPeerPort(kCoapUdpPort);
metadata.mSendTime = TimerMilli::GetNow() + kJoinerEntrustTxDelay; metadata.mSendTime = TimerMilli::GetNow() + kJoinerEntrustTxDelay;
memcpy(metadata.mKek, aKek, sizeof(metadata.mKek)); metadata.mKek = aKek;
SuccessOrExit(error = metadata.AppendTo(*message)); SuccessOrExit(error = metadata.AppendTo(*message));
@@ -288,8 +288,7 @@ void JoinerRouter::SendDelayedJoinerEntrust(void)
// change (i.e., retransmission). Otherweise, we wait for Joiner // change (i.e., retransmission). Otherweise, we wait for Joiner
// Entrust Response before handling any other pending delayed // Entrust Response before handling any other pending delayed
// Jointer Entrust message. // Jointer Entrust message.
VerifyOrExit(!mExpectJoinEntRsp || VerifyOrExit(!mExpectJoinEntRsp || (Get<KeyManager>().GetKek() == metadata.mKek));
memcmp(Get<KeyManager>().GetKek(), metadata.mKek, KeyManager::kMaxKeyLength) == 0);
if (TimerMilli::GetNow() < metadata.mSendTime) if (TimerMilli::GetNow() < metadata.mSendTime)
{ {
+4 -4
View File
@@ -89,9 +89,9 @@ private:
otError AppendTo(Message &aMessage) { return aMessage.Append(this, sizeof(*this)); } otError AppendTo(Message &aMessage) { return aMessage.Append(this, sizeof(*this)); }
void ReadFrom(const Message &aMessage); void ReadFrom(const Message &aMessage);
Ip6::MessageInfo mMessageInfo; // Message info of the message to send. Ip6::MessageInfo mMessageInfo; // Message info of the message to send.
TimeMilli mSendTime; // Time when the message shall be sent. TimeMilli mSendTime; // Time when the message shall be sent.
uint8_t mKek[KeyManager::kMaxKeyLength]; // KEK used by MAC layer to encode this message. Kek mKek; // KEK used by MAC layer to encode this message.
}; };
static void HandleStateChanged(Notifier::Callback &aCallback, otChangedFlags aFlags); static void HandleStateChanged(Notifier::Callback &aCallback, otChangedFlags aFlags);
@@ -112,7 +112,7 @@ private:
static void HandleTimer(Timer &aTimer); static void HandleTimer(Timer &aTimer);
void HandleTimer(void); void HandleTimer(void);
otError DelaySendingJoinerEntrust(const Ip6::MessageInfo &aMessageInfo, const uint8_t *aKek); otError DelaySendingJoinerEntrust(const Ip6::MessageInfo &aMessageInfo, const Kek &aKek);
void SendDelayedJoinerEntrust(void); void SendDelayedJoinerEntrust(void);
otError SendJoinerEntrust(const Ip6::MessageInfo &aMessageInfo); otError SendJoinerEntrust(const Ip6::MessageInfo &aMessageInfo);
Coap::Message *PrepareJoinerEntrustMessage(void); Coap::Message *PrepareJoinerEntrustMessage(void);
+7 -1
View File
@@ -218,9 +218,15 @@ void KeyManager::IncrementMleFrameCounter(void)
} }
} }
void KeyManager::SetKek(const Kek &aKek)
{
mKek = aKek;
mKekFrameCounter = 0;
}
void KeyManager::SetKek(const uint8_t *aKek) void KeyManager::SetKek(const uint8_t *aKek)
{ {
memcpy(mKek, aKek, sizeof(mKek)); memcpy(mKek.m8, aKek, sizeof(mKek));
mKekFrameCounter = 0; mKekFrameCounter = 0;
} }
+60 -4
View File
@@ -137,6 +137,55 @@ public:
} OT_TOOL_PACKED_END; } OT_TOOL_PACKED_END;
/**
*
* This class represents a Key Encryption Key (KEK).
*
*/
class Kek
{
friend class KeyManager;
public:
enum
{
kSize = 16, // KEK size in bytes.
};
/**
* This method returns the KEK.
*
* @returns A pointer to buffer containing the KEK.
*
*/
const uint8_t *GetKey(void) const { return m8; }
/**
* This method evaluates whether or not two KEKs match.
*
* @param[in] aOther The KEK to compare.
*
* @retval TRUE If the KEKs match.
* @retval FALSE If the KEKs do not match.
*
*/
bool operator==(const Kek &aOther) const { return memcmp(m8, aOther.m8, sizeof(Kek)) == 0; }
/**
* This method evaluates whether or not the KEK match.
*
* @param[in] aOther The KEK to compare.
*
* @retval TRUE If the KEK do not match.
* @retval FALSE If the KEK match.
*
*/
bool operator!=(const Kek &aOther) const { return !(*this == aOther); }
private:
uint8_t m8[kSize]; ///< Buffer containing the KEK.
};
/** /**
* This class defines Thread Key Manager. * This class defines Thread Key Manager.
* *
@@ -146,8 +195,7 @@ class KeyManager : public InstanceLocator
public: public:
enum enum
{ {
kMaxKeyLength = 16, kNonceSize = 13, ///< Size of IEEE 802.15.4 Nonce (bytes).
kNonceSize = 13, ///< Size of IEEE 802.15.4 Nonce (bytes).
}; };
/** /**
@@ -336,7 +384,15 @@ public:
* @returns A pointer to the KEK. * @returns A pointer to the KEK.
* *
*/ */
const uint8_t *GetKek(void) const { return mKek; } const Kek &GetKek(void) const { return mKek; }
/**
* This method sets the KEK.
*
* @param[in] aKek A KEK.
*
*/
void SetKek(const Kek &aKek);
/** /**
* This method sets the KEK. * This method sets the KEK.
@@ -479,7 +535,7 @@ private:
#if OPENTHREAD_MTD || OPENTHREAD_FTD #if OPENTHREAD_MTD || OPENTHREAD_FTD
Pskc mPskc; Pskc mPskc;
#endif #endif
uint8_t mKek[kMaxKeyLength]; Kek mKek;
uint32_t mKekFrameCounter; uint32_t mKekFrameCounter;
uint8_t mSecurityPolicyFlags; uint8_t mSecurityPolicyFlags;