Add support for PSKc TLV and Security Policy TLV (#558)

* Add support for PSKc TLV and Security Policy TLV
This commit is contained in:
Lu Wang
2016-09-12 23:42:29 +08:00
committed by Jonathan Hui
parent 70e9f76623
commit 7a807e99fa
5 changed files with 187 additions and 5 deletions
+108
View File
@@ -62,6 +62,8 @@ const DatasetCommand Dataset::sCommands[] =
{ "panid", &ProcessPanId },
{ "pending", &ProcessPending },
{ "pendingtimestamp", &ProcessPendingTimestamp },
{ "pskc", &ProcessPSKc },
{ "securitypolicy", &ProcessSecurityPolicy },
};
Server *Dataset::sServer;
@@ -132,6 +134,45 @@ ThreadError Dataset::Print(otOperationalDataset &aDataset)
sServer->OutputFormat("PAN ID: 0x%04x\r\n", aDataset.mPanId);
}
if (aDataset.mIsPSKcSet)
{
sServer->OutputFormat("PSKc: ");
OutputBytes(aDataset.mPSKc.m8, sizeof(aDataset.mPSKc.m8));
sServer->OutputFormat("\r\n");
}
if (aDataset.mIsSecurityPolicySet)
{
sServer->OutputFormat("Security Policy: %d, ", aDataset.mSecurityPolicy.mRotationTime);
if (aDataset.mSecurityPolicy.mFlags & OT_SECURITY_POLICY_OBTAIN_MASTER_KEY)
{
sServer->OutputFormat("o");
}
if (aDataset.mSecurityPolicy.mFlags & OT_SECURITY_POLICY_NATIVE_COMMISSIONING)
{
sServer->OutputFormat("n");
}
if (aDataset.mSecurityPolicy.mFlags & OT_SECURITY_POLICY_ROUTERS)
{
sServer->OutputFormat("r");
}
if (aDataset.mSecurityPolicy.mFlags & OT_SECURITY_POLICY_EXTERNAL_COMMISSIONER)
{
sServer->OutputFormat("c");
}
if (aDataset.mSecurityPolicy.mFlags & OT_SECURITY_POLICY_BEACONS)
{
sServer->OutputFormat("b");
}
sServer->OutputFormat("\r\n");
}
return kThreadError_None;
}
@@ -553,5 +594,72 @@ exit:
return error;
}
ThreadError Dataset::ProcessPSKc(int argc, char *argv[])
{
ThreadError error = kThreadError_None;
uint16_t length;
VerifyOrExit(argc > 0, error = kThreadError_Parse);
length = static_cast<uint16_t>((strlen(argv[0]) + 1) / 2);
VerifyOrExit(length <= OT_PSKC_MAX_SIZE, error = kThreadError_NoBufs);
VerifyOrExit(Interpreter::Hex2Bin(argv[0], sDataset.mPSKc.m8 + OT_PSKC_MAX_SIZE - length, length)
== length, error = kThreadError_Parse);
sDataset.mIsPSKcSet = true;
exit:
return error;
}
ThreadError Dataset::ProcessSecurityPolicy(int argc, char *argv[])
{
ThreadError error = kThreadError_None;
long value;
VerifyOrExit(argc > 0, error = kThreadError_Parse);
SuccessOrExit(error = Interpreter::ParseLong(argv[0], value));
sDataset.mSecurityPolicy.mRotationTime = static_cast<uint16_t>(value);
sDataset.mSecurityPolicy.mFlags = 0;
if (argc > 1)
{
for (char *arg = argv[1]; *arg != '\0'; arg++)
{
switch (*arg)
{
case 'o':
sDataset.mSecurityPolicy.mFlags |= OT_SECURITY_POLICY_OBTAIN_MASTER_KEY;
break;
case 'n':
sDataset.mSecurityPolicy.mFlags |= OT_SECURITY_POLICY_NATIVE_COMMISSIONING;
break;
case 'r':
sDataset.mSecurityPolicy.mFlags |= OT_SECURITY_POLICY_ROUTERS;
break;
case 'c':
sDataset.mSecurityPolicy.mFlags |= OT_SECURITY_POLICY_EXTERNAL_COMMISSIONER;
break;
case 'b':
sDataset.mSecurityPolicy.mFlags |= OT_SECURITY_POLICY_BEACONS;
break;
default:
ExitNow(error = kThreadError_Parse);
}
}
}
sDataset.mIsSecurityPolicySet = true;
exit:
return error;
}
} // namespace Cli
} // namespace Thread