[ncp] add support in spinel/NCP to generate PSKc from pass-phrase (#4294)

This commit is contained in:
Abtin Keshavarzian
2019-11-12 18:24:11 +01:00
committed by Jonathan Hui
parent 090ed57141
commit 19695b0f8e
5 changed files with 57 additions and 0 deletions
+3
View File
@@ -936,6 +936,9 @@ bool NcpBase::HandlePropertySetForSpecialProperties(uint8_t aHeader, spinel_prop
#endif
#if OPENTHREAD_FTD && OPENTHREAD_CONFIG_COMMISSIONER_ENABLE
case SPINEL_PROP_MESHCOP_COMMISSIONER_GENERATE_PSKC:
ExitNow(aError = HandlePropertySet_SPINEL_PROP_MESHCOP_COMMISSIONER_GENERATE_PSKC(aHeader));
case SPINEL_PROP_THREAD_COMMISSIONER_ENABLED:
ExitNow(aError = HandlePropertySet_SPINEL_PROP_THREAD_COMMISSIONER_ENABLED(aHeader));
#endif
+1
View File
@@ -413,6 +413,7 @@ protected:
#endif
#if OPENTHREAD_FTD && OPENTHREAD_CONFIG_COMMISSIONER_ENABLE
otError HandlePropertySet_SPINEL_PROP_MESHCOP_COMMISSIONER_GENERATE_PSKC(uint8_t aHeader);
otError HandlePropertySet_SPINEL_PROP_THREAD_COMMISSIONER_ENABLED(uint8_t aHeader);
#endif // OPENTHREAD_FTD
+26
View File
@@ -759,6 +759,32 @@ exit:
return error;
}
otError NcpBase::HandlePropertySet_SPINEL_PROP_MESHCOP_COMMISSIONER_GENERATE_PSKC(uint8_t aHeader)
{
otError error = OT_ERROR_NONE;
const char * passPhrase;
const char * networkName;
const uint8_t *extPanIdData;
uint16_t length;
otPskc pskc;
SuccessOrExit(error = mDecoder.ReadUtf8(passPhrase));
SuccessOrExit(error = mDecoder.ReadUtf8(networkName));
SuccessOrExit(error = mDecoder.ReadDataWithLen(extPanIdData, length));
VerifyOrExit(length == sizeof(spinel_net_xpanid_t), error = OT_ERROR_PARSE);
SuccessOrExit(error = otCommissionerGeneratePskc(passPhrase, networkName,
reinterpret_cast<const otExtendedPanId *>(extPanIdData), &pskc));
SuccessOrExit(
error = mEncoder.BeginFrame(aHeader, SPINEL_CMD_PROP_VALUE_IS, SPINEL_PROP_MESHCOP_COMMISSIONER_GENERATE_PSKC));
SuccessOrExit(error = mEncoder.WriteData(pskc.m8, sizeof(pskc)));
SuccessOrExit(error = mEncoder.EndFrame());
exit:
return error;
}
// SPINEL_PROP_THREAD_COMMISSIONER_ENABLED is replaced by SPINEL_PROP_MESHCOP_COMMISSIONER_STATE. Please use the new
// property. The old property/implementation remains for backward compatibility.
+4
View File
@@ -1883,6 +1883,10 @@ const char *spinel_prop_key_to_cstr(spinel_prop_key_t prop_key)
ret = "MESHCOP_COMMISSIONER_MGMT_SET";
break;
case SPINEL_PROP_MESHCOP_COMMISSIONER_GENERATE_PSKC:
ret = "MESHCOP_COMMISSIONER_GENERATE_PSKC";
break;
case SPINEL_PROP_CHANNEL_MANAGER_NEW_CHANNEL:
ret = "CHANNEL_MANAGER_NEW_CHANNEL";
break;
+23
View File
@@ -3208,6 +3208,29 @@ typedef enum
*/
SPINEL_PROP_MESHCOP_COMMISSIONER_MGMT_SET = SPINEL_PROP_MESHCOP_EXT__BEGIN + 6,
// Thread Commissioner Generate PSKc
/** Format: `UUd` - Write only
*
* Required capability: SPINEL_CAP_THREAD_COMMISSIONER
*
* Writing to this property allows user to generate PSKc from a given commissioning pass-phrase, network name,
* extended PAN Id.
*
* Written value format is:
*
* `U` : The commissioning pass-phrase.
* `U` : Network Name.
* `d` : Extended PAN ID.
*
* The response on success would be a `VALUE_IS` command with the PSKc with format below:
*
* `D` : The PSKc
*
* On a failure a `LAST_STATUS` is emitted with the error status.
*
*/
SPINEL_PROP_MESHCOP_COMMISSIONER_GENERATE_PSKC = SPINEL_PROP_MESHCOP_EXT__BEGIN + 7,
SPINEL_PROP_MESHCOP_EXT__END = 0x1900,
SPINEL_PROP_OPENTHREAD__BEGIN = 0x1900,