Add PSKc generation feature support (#1165)

* implement PBKDF2 using AES-CMAC-PRF-128

* generate PSKc using PBKDF2, AES-CMAC-PRF-128

* expand "dataset pskc" cli to input PSKc source (passphrase, network name, extended panid)
This commit is contained in:
Shu Chen
2017-02-15 19:57:33 -08:00
committed by Jonathan Hui
parent e8611291d6
commit bf21420cd0
22 changed files with 321 additions and 17 deletions
+19
View File
@@ -406,6 +406,7 @@ networkname
panid
pending
pendingtimestamp
pskc
userdata
Done
```
@@ -645,6 +646,24 @@ Set pending timestamp.
Done
```
### dataset pskc \[pskc\]
Set pskc with hex format.
```bash
> dataset pskc 67c0c203aa0b042bfb5381c47aef4d9e
Done
```
### dataset pskc \[passphrase\] \[networkname\] \[extpanid\]
Generate pskc from passphrase, network name and extended panid.
```bash
> dataset pskc OpenThreadPassphrase OpenThread dead00beef00cafe
Done
```
### dataset userdata \[size\] \[data\]
Set user specific data for the command.
+14 -6
View File
@@ -666,17 +666,25 @@ exit:
ThreadError Dataset::ProcessPSKc(otInstance *aInstance, int argc, char *argv[])
{
ThreadError error = kThreadError_None;
uint8_t extPanId[OT_EXT_PAN_ID_SIZE];
uint16_t length;
VerifyOrExit(argc > 0, error = kThreadError_Parse);
VerifyOrExit((argc == 1) || (argc == 3), 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);
if (argc == 1)
{
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);
}
else
{
VerifyOrExit(Interpreter::Hex2Bin(argv[2], extPanId, sizeof(extPanId)) >= 0, error = kThreadError_Parse);
SuccessOrExit(error = otGeneratePSKc(aInstance, argv[0], argv[1], extPanId, sDataset.mPSKc.m8));
}
sDataset.mIsPSKcSet = true;
(void)aInstance;
exit:
return error;