Security Policy feature enhancement. (#948)

* Initialize the Security Policy Tlv in Active Dataset

* Apply Security Policy configuration from Active Dataset

* Do not include NetworkMasterKey Tlv in MGMT_GET.rsp if Security Policy 'O' bit is disabled

* THCI: add startNativeCommissioner() and sendBeacons() support
This commit is contained in:
Shu Chen
2016-11-09 01:19:46 -08:00
committed by Jonathan Hui
parent f1c83f0ce3
commit 1f445bad48
5 changed files with 82 additions and 6 deletions
+2
View File
@@ -57,6 +57,8 @@ KeyManager::KeyManager(ThreadNetif &aThreadNetif):
mKeyRotationTime = kDefaultKeyRotationTime; mKeyRotationTime = kDefaultKeyRotationTime;
mKeySwitchGuardTime = kDefaultKeySwitchGuardTime; mKeySwitchGuardTime = kDefaultKeySwitchGuardTime;
mKeySwitchGuardEnabled = false; mKeySwitchGuardEnabled = false;
mSecurityPolicyFlags = 0xff;
} }
void KeyManager::Start(void) void KeyManager::Start(void)
+24
View File
@@ -251,6 +251,28 @@ public:
*/ */
void SetKeySwitchGuardTime(uint32_t aKeySwitchGuardTime) { mKeySwitchGuardTime = aKeySwitchGuardTime; } void SetKeySwitchGuardTime(uint32_t aKeySwitchGuardTime) { mKeySwitchGuardTime = aKeySwitchGuardTime; }
/**
* This method returns the Security Policy Flags.
*
* The Security Policy Flags specifies network administrator preferences for which
* security-related operations are allowed or disallowed.
*
* @returns The SecurityPolicy Flags.
*
*/
uint8_t GetSecurityPolicyFlags(void) const { return mSecurityPolicyFlags; }
/**
* This method sets the Security Policy Flags.
*
* The Security Policy Flags specifies network administrator preferences for which
* security-related operations are allowed or disallowed.
*
* @param[in] aSecurityPolicyFlags The Security Policy Flags.
*
*/
void SetSecurityPolicyFlags(uint8_t aSecurityPolicyFlags) { mSecurityPolicyFlags = aSecurityPolicyFlags; }
private: private:
enum enum
{ {
@@ -286,6 +308,8 @@ private:
uint8_t mKek[kMaxKeyLength]; uint8_t mKek[kMaxKeyLength];
uint32_t mKekFrameCounter; uint32_t mKekFrameCounter;
uint8_t mSecurityPolicyFlags;
}; };
/** /**
+32 -3
View File
@@ -132,6 +132,14 @@ ThreadError DatasetManager::ApplyConfiguration(void)
break; break;
} }
case Tlv::kSecurityPolicy:
{
const SecurityPolicyTlv *securityPolicy = static_cast<const SecurityPolicyTlv *>(cur);
mNetif.GetKeyManager().SetKeyRotation(securityPolicy->GetRotationTime());
mNetif.GetKeyManager().SetSecurityPolicyFlags(securityPolicy->GetFlags());
break;
}
default: default:
{ {
break; break;
@@ -744,12 +752,30 @@ void DatasetManager::SendGetResponse(const Coap::Header &aRequestHeader, const I
if (aLength == 0) if (aLength == 0)
{ {
SuccessOrExit(error = message->Append(mNetwork.GetBytes(), mNetwork.GetSize())); const Tlv *cur = reinterpret_cast<const Tlv *>(mNetwork.GetBytes());
const Tlv *end = reinterpret_cast<const Tlv *>(mNetwork.GetBytes() + mNetwork.GetSize());
while (cur < end)
{
if (cur->GetType() != Tlv::kNetworkMasterKey ||
(mNetif.GetKeyManager().GetSecurityPolicyFlags() & OT_SECURITY_POLICY_OBTAIN_MASTER_KEY))
{
SuccessOrExit(error = message->Append(cur, sizeof(Tlv) + cur->GetLength()));
}
cur = cur->GetNext();
}
} }
else else
{ {
for (index = 0; index < aLength; index++) for (index = 0; index < aLength; index++)
{ {
if (aTlvs[index] == Tlv::kNetworkMasterKey &&
!(mNetif.GetKeyManager().GetSecurityPolicyFlags() & OT_SECURITY_POLICY_OBTAIN_MASTER_KEY))
{
continue;
}
if ((tlv = mNetwork.Get(static_cast<Tlv::Type>(aTlvs[index]))) != NULL) if ((tlv = mNetwork.Get(static_cast<Tlv::Type>(aTlvs[index]))) != NULL)
{ {
SuccessOrExit(error = message->Append(tlv, sizeof(Tlv) + tlv->GetLength())); SuccessOrExit(error = message->Append(tlv, sizeof(Tlv) + tlv->GetLength()));
@@ -815,14 +841,12 @@ void ActiveDataset::StartLeader(void)
// Master Key // Master Key
const uint8_t *key; const uint8_t *key;
uint8_t keyLength; uint8_t keyLength;
key = mNetif.GetKeyManager().GetMasterKey(&keyLength); key = mNetif.GetKeyManager().GetMasterKey(&keyLength);
memcpy(dataset.mMasterKey.m8, key, keyLength); memcpy(dataset.mMasterKey.m8, key, keyLength);
dataset.mIsMasterKeySet = true; dataset.mIsMasterKeySet = true;
// Network Name // Network Name
const char *name; const char *name;
name = mNetif.GetMac().GetNetworkName(); name = mNetif.GetMac().GetNetworkName();
memcpy(dataset.mNetworkName.m8, name, strlen(name)); memcpy(dataset.mNetworkName.m8, name, strlen(name));
dataset.mIsNetworkNameSet = true; dataset.mIsNetworkNameSet = true;
@@ -831,6 +855,11 @@ void ActiveDataset::StartLeader(void)
dataset.mPanId = mNetif.GetMac().GetPanId(); dataset.mPanId = mNetif.GetMac().GetPanId();
dataset.mIsPanIdSet = true; dataset.mIsPanIdSet = true;
// Security Policy
dataset.mSecurityPolicy.mRotationTime = static_cast<uint16_t>(mNetif.GetKeyManager().GetKeyRotation());
dataset.mSecurityPolicy.mFlags = mNetif.GetKeyManager().GetSecurityPolicyFlags();
dataset.mIsSecurityPolicySet = true;
mLocal.Set(dataset); mLocal.Set(dataset);
} }
+10
View File
@@ -2651,6 +2651,16 @@ ThreadError Mle::SendDiscoveryResponse(const Ip6::Address &aDestination, uint16_
// Discovery Response TLV // Discovery Response TLV
discoveryResponse.Init(); discoveryResponse.Init();
discoveryResponse.SetVersion(kVersion); discoveryResponse.SetVersion(kVersion);
if (mNetif.GetKeyManager().GetSecurityPolicyFlags() & OT_SECURITY_POLICY_NATIVE_COMMISSIONING)
{
discoveryResponse.SetNativeCommissioner(true);
}
else
{
discoveryResponse.SetNativeCommissioner(false);
}
SuccessOrExit(error = message->Append(&discoveryResponse, sizeof(discoveryResponse))); SuccessOrExit(error = message->Append(&discoveryResponse, sizeof(discoveryResponse)));
// Extended PAN ID TLV // Extended PAN ID TLV
+14 -3
View File
@@ -1104,7 +1104,7 @@ class ARM(IThci):
print '%s call powerDown' % self.port print '%s call powerDown' % self.port
self.isPowerDown = True self.isPowerDown = True
self._sendline('reset') self._sendline('reset')
time.sleep(3) time.sleep(5)
self.setMAC(self.mac) self.setMAC(self.mac)
def powerUp(self): def powerUp(self):
@@ -1271,7 +1271,7 @@ class ARM(IThci):
self.setNetworkKey(self.networkKey) self.setNetworkKey(self.networkKey)
self.setMLPrefix(self.localprefix) self.setMLPrefix(self.localprefix)
self.setPSKc(self.pskc) self.setPSKc(self.pskc)
self.__setSecurityPolicy(self.securityPolicySecs) self.__setSecurityPolicy("672 onrcb")
self.__setChannelMask("0xffff") self.__setChannelMask("0xffff")
self.isWhiteListEnabled = False self.isWhiteListEnabled = False
self.isBlackListEnabled = False self.isBlackListEnabled = False
@@ -1913,7 +1913,16 @@ class ARM(IThci):
return self.__sendCommand(cmd) return self.__sendCommand(cmd)
def startNativeCommissioner(self, strPSKc='GRLpassWord'): def startNativeCommissioner(self, strPSKc='GRLpassWord'):
pass #TODO: Support the whole Native Commissioner functionality
# Currently it only aims to trigger a Discovery Request message to pass Certification test 5.8.4
print '%s call startNativeCommissioner' % self.port
self.__sendCommand('ifconfig up')
cmd = 'joiner start %s' %(strPSKc)
print cmd
if self.__sendCommand(cmd)[0] == "Done":
return True
else:
return False
def startCollapsedCommissioner(self): def startCollapsedCommissioner(self):
"""start Collapsed Commissioner """start Collapsed Commissioner
@@ -2493,6 +2502,8 @@ class ARM(IThci):
def sendBeacons(self, sAddr, xCommissionerSessionId, listChannelMask, xPanId): def sendBeacons(self, sAddr, xCommissionerSessionId, listChannelMask, xPanId):
print '%s call sendBeacons' % self.port print '%s call sendBeacons' % self.port
self._sendline('scan')
return True
def updateRouterStatus(self): def updateRouterStatus(self):
print '%s call updateRouterStatus' % self.port print '%s call updateRouterStatus' % self.port