From 87bbf4a83a18e5f07c17b95caea01ad969d67c5d Mon Sep 17 00:00:00 2001 From: Jonathan Hui Date: Wed, 15 Feb 2017 23:10:44 -0800 Subject: [PATCH] Move PSKc generation functionality to Commissioner role. (#1327) --- include/commissioning/commissioner.h | 19 ++++++++++++++ include/openthread-types.h | 1 - include/openthread.h | 18 ------------- src/cli/README.md | 9 ------- src/cli/cli_dataset.cpp | 21 +++++---------- src/core/Makefile.am | 2 +- src/core/meshcop/commissioner.cpp | 29 +++++++++++++++++++++ src/core/meshcop/commissioner.hpp | 17 ++++++++++++ src/core/meshcop/dataset_manager_ftd.cpp | 7 +---- src/core/openthread.cpp | 12 ++++----- src/core/thread/network_data_leader_ftd.cpp | 29 --------------------- src/core/thread/network_data_leader_ftd.hpp | 16 ------------ src/core/thread/network_data_leader_mtd.hpp | 2 -- third_party/mbedtls/Makefile.am | 8 +++--- 14 files changed, 83 insertions(+), 107 deletions(-) diff --git a/include/commissioning/commissioner.h b/include/commissioning/commissioner.h index 68112191a..4374ca26a 100644 --- a/include/commissioning/commissioner.h +++ b/include/commissioning/commissioner.h @@ -222,6 +222,25 @@ OTAPI ThreadError OTCALL otSendMgmtCommissionerSet(otInstance *, const otCommiss */ OTAPI uint16_t OTCALL otCommissionerGetSessionId(otInstance *); +/** + * This method generates PSKc. + * + * PSKc is used to establish the Commissioner Session. + * + * @param[in] aInstance A pointer to an OpenThread instance. + * @param[in] aPassPhrase The commissioning passphrase. + * @param[in] aNetworkName The network name for PSKc computation. + * @param[in] aExtPanId The extended pan id for PSKc computation. + * @param[out] aPSKc A pointer to where the generated PSKc will be placed. + * + * @retval kThreadErrorNone Successfully generate PSKc. + * @retval kThreadError_InvalidArgs If any of the input arguments is invalid. + * + */ +OTAPI ThreadError OTCALL otCommissionerGeneratePSKc(otInstance *aInstance, const char *aPassPhrase, + const char *aNetworkName, const uint8_t *aExtPanId, + uint8_t *aPSKc); + /** * @} * diff --git a/include/openthread-types.h b/include/openthread-types.h index d4db4f2a1..04da1be4c 100644 --- a/include/openthread-types.h +++ b/include/openthread-types.h @@ -249,7 +249,6 @@ typedef struct otMeshLocalPrefix #define OT_COMMISSIONING_PASSPHRASE_MIN_SIZE 6 ///< Minimum size of the Commissioning Passphrase #define OT_COMMISSIONING_PASSPHRASE_MAX_SIZE 255 ///< Maximum size of the Commissioning Passphrase -#define OT_COMMISSIONING_PASSPHRASE_DEFAULT "OpenThreadPassphrase" ///< The default commissioning passphrase /** * This structure represents PSKc. diff --git a/include/openthread.h b/include/openthread.h index c53f08f95..ea5ec44a0 100644 --- a/include/openthread.h +++ b/include/openthread.h @@ -639,24 +639,6 @@ OTAPI const uint8_t *OTCALL otGetMasterKey(otInstance *aInstance, uint8_t *aKeyL */ OTAPI ThreadError OTCALL otSetMasterKey(otInstance *aInstance, const uint8_t *aKey, uint8_t aKeyLength); -/** - * This method generates PSKc. - * - * PSKc is used to establish the Commissioner Session. - * - * @param[in] aInstance A pointer to an OpenThread instance. - * @param[in] aPassPhrase The commissioning passphrase. - * @param[in] aNetworkName The network name for PSKc computation. - * @param[in] aExtPanId The extended pan id for PSKc computation. - * @param[out] aPSKc A pointer to where the generated PSKc will be placed. - * - * @retval kThreadErrorNone Successfully generate PSKc. - * @retval kThreadError_InvalidArgs If any of the input arguments is invalid. - * - */ -OTAPI ThreadError OTCALL otGeneratePSKc(otInstance *aInstance, const char *aPassPhrase, const char *aNetworkName, - const uint8_t *aExtPanId, uint8_t *aPSKc); - /** * This function returns the maximum transmit power setting in dBm. * diff --git a/src/cli/README.md b/src/cli/README.md index 7c01ce344..087c2fd65 100644 --- a/src/cli/README.md +++ b/src/cli/README.md @@ -655,15 +655,6 @@ Set pskc with hex format. 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. diff --git a/src/cli/cli_dataset.cpp b/src/cli/cli_dataset.cpp index b3100cfe8..8124d0b47 100644 --- a/src/cli/cli_dataset.cpp +++ b/src/cli/cli_dataset.cpp @@ -666,25 +666,16 @@ 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 == 1) || (argc == 3), error = kThreadError_Parse); - - if (argc == 1) - { - length = static_cast((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)); - } + VerifyOrExit(argc > 0, error = kThreadError_Parse); + length = static_cast((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; + (void)aInstance; exit: return error; diff --git a/src/core/Makefile.am b/src/core/Makefile.am index 493313423..e51d808fe 100644 --- a/src/core/Makefile.am +++ b/src/core/Makefile.am @@ -97,6 +97,7 @@ endif # OPENTHREAD_ENABLE_MAC_WHITELIST if OPENTHREAD_ENABLE_COMMISSIONER SOURCES_COMMON += \ coap/secure_coap_server.cpp \ + crypto/pbkdf2_cmac.cpp \ meshcop/announce_begin_client.cpp \ meshcop/commissioner.cpp \ meshcop/energy_scan_client.cpp \ @@ -147,7 +148,6 @@ libopenthread_ftd_a_CPPFLAGS = \ libopenthread_ftd_a_SOURCES = \ $(SOURCES_COMMON) \ - crypto/pbkdf2_cmac.cpp \ meshcop/dataset_manager_ftd.cpp \ meshcop/joiner_router.cpp \ meshcop/leader.cpp \ diff --git a/src/core/meshcop/commissioner.cpp b/src/core/meshcop/commissioner.cpp index 9bae13a51..fac81de5b 100644 --- a/src/core/meshcop/commissioner.cpp +++ b/src/core/meshcop/commissioner.cpp @@ -46,6 +46,7 @@ #include #include #include +#include #include #include #include @@ -926,5 +927,33 @@ exit: return error; } +ThreadError Commissioner::GeneratePSKc(const char *aPassPhrase, const char *aNetworkName, const uint8_t *aExtPanId, + uint8_t *aPSKc) +{ + ThreadError error = kThreadError_None; + const char *saltPrefix = "Thread"; + uint8_t salt[OT_PBKDF2_SALT_MAX_LEN]; + uint16_t saltLen = 0; + + VerifyOrExit((strlen(aPassPhrase) >= OT_COMMISSIONING_PASSPHRASE_MIN_SIZE) && + (strlen(aPassPhrase) <= OT_COMMISSIONING_PASSPHRASE_MAX_SIZE), error = kThreadError_InvalidArgs); + + memset(salt, 0, sizeof(salt)); + memcpy(salt, saltPrefix, strlen(saltPrefix)); + saltLen += static_cast(strlen(saltPrefix)); + + memcpy(salt + saltLen, aExtPanId, OT_EXT_PAN_ID_SIZE); + saltLen += OT_EXT_PAN_ID_SIZE; + + memcpy(salt + saltLen, aNetworkName, strlen(aNetworkName)); + saltLen += static_cast(strlen(aNetworkName)); + + otPbkdf2Cmac(reinterpret_cast(aPassPhrase), static_cast(strlen(aPassPhrase)), + reinterpret_cast(salt), saltLen, 16384, OT_PSKC_MAX_SIZE, aPSKc); + +exit: + return error; +} + } // namespace MeshCoP } // namespace Thread diff --git a/src/core/meshcop/commissioner.hpp b/src/core/meshcop/commissioner.hpp index 2a6e309de..22ef3aae3 100644 --- a/src/core/meshcop/commissioner.hpp +++ b/src/core/meshcop/commissioner.hpp @@ -174,6 +174,23 @@ public: ThreadError SendMgmtCommissionerSetRequest(const otCommissioningDataset &aDataset, const uint8_t *aTlvs, uint8_t aLength); + /** + * This static method generates PSKc. + * + * PSKc is used to establish the Commissioner Session. + * + * @param[in] aPassPhrase The commissioning passphrase. + * @param[in] aNetworkName The network name for PSKc computation. + * @param[in] aExtPanId The extended pan id for PSKc computation. + * @param[out] aPSKc A pointer to where the generated PSKc will be placed. + * + * @retval kThreadErrorNone Successfully generate PSKc. + * @retval kThreadError_InvalidArgs If the length of passphrase is out of range. + * + */ + static ThreadError GeneratePSKc(const char *aPassPhrase, const char *aNetworkName, const uint8_t *aExtPanId, + uint8_t *aPSKc); + AnnounceBeginClient mAnnounceBegin; EnergyScanClient mEnergyScan; PanIdQueryClient mPanIdQuery; diff --git a/src/core/meshcop/dataset_manager_ftd.cpp b/src/core/meshcop/dataset_manager_ftd.cpp index 80d8c2378..2f19cf87c 100644 --- a/src/core/meshcop/dataset_manager_ftd.cpp +++ b/src/core/meshcop/dataset_manager_ftd.cpp @@ -156,13 +156,8 @@ ThreadError ActiveDataset::GenerateLocal(void) // PSKc if (!IsTlvInitialized(Tlv::kPSKc)) { + const uint8_t pskc[OT_PSKC_MAX_SIZE] = {0}; PSKcTlv tlv; - uint8_t pskc[OT_PSKC_MAX_SIZE] = {0}; - const char password[OT_COMMISSIONING_PASSPHRASE_MAX_SIZE] = OT_COMMISSIONING_PASSPHRASE_DEFAULT; - const char *networkName = mNetif.GetMac().GetNetworkName(); - const uint8_t *extPanId = mNetif.GetMac().GetExtendedPanId(); - - mNetif.GetNetworkDataLeader().GeneratePSKc(password, networkName, extPanId, pskc); tlv.Init(); tlv.SetPSKc(pskc); mLocal.Set(tlv); diff --git a/src/core/openthread.cpp b/src/core/openthread.cpp index 0a7b5fcc1..6fec3bd06 100644 --- a/src/core/openthread.cpp +++ b/src/core/openthread.cpp @@ -270,12 +270,6 @@ ThreadError otSetMasterKey(otInstance *aInstance, const uint8_t *aKey, uint8_t a return aInstance->mThreadNetif.GetKeyManager().SetMasterKey(aKey, aKeyLength); } -ThreadError otGeneratePSKc(otInstance *aInstance, const char *aPassPhrase, const char *aNetworkName, - const uint8_t *aExtPanId, uint8_t *aPSKc) -{ - return aInstance->mThreadNetif.GetNetworkDataLeader().GeneratePSKc(aPassPhrase, aNetworkName, aExtPanId, aPSKc); -} - int8_t otGetMaxTransmitPower(otInstance *aInstance) { return aInstance->mThreadNetif.GetMac().GetMaxTransmitPower(); @@ -1821,6 +1815,12 @@ uint16_t otCommissionerGetSessionId(otInstance *aInstance) { return aInstance->mThreadNetif.GetCommissioner().GetSessionId(); } + +ThreadError otCommissionerGeneratePSKc(otInstance *aInstance, const char *aPassPhrase, const char *aNetworkName, + const uint8_t *aExtPanId, uint8_t *aPSKc) +{ + return aInstance->mThreadNetif.GetCommissioner().GeneratePSKc(aPassPhrase, aNetworkName, aExtPanId, aPSKc); +} #endif // OPENTHREAD_ENABLE_COMMISSIONER #if OPENTHREAD_ENABLE_JOINER diff --git a/src/core/thread/network_data_leader_ftd.cpp b/src/core/thread/network_data_leader_ftd.cpp index d31dd7580..479f6fbb7 100644 --- a/src/core/thread/network_data_leader_ftd.cpp +++ b/src/core/thread/network_data_leader_ftd.cpp @@ -48,7 +48,6 @@ #include #include #include -#include using Thread::Encoding::BigEndian::HostSwap16; @@ -1075,33 +1074,5 @@ void Leader::HandleTimer(void) } } -ThreadError Leader::GeneratePSKc(const char *aPassPhrase, const char *aNetworkName, const uint8_t *aExtPanId, - uint8_t *aPSKc) -{ - ThreadError error = kThreadError_None; - const char *saltPrefix = "Thread"; - uint8_t salt[OT_PBKDF2_SALT_MAX_LEN]; - uint16_t saltLen = 0; - - VerifyOrExit((strlen(aPassPhrase) >= OT_COMMISSIONING_PASSPHRASE_MIN_SIZE) && - (strlen(aPassPhrase) <= OT_COMMISSIONING_PASSPHRASE_MAX_SIZE), error = kThreadError_InvalidArgs); - - memset(salt, 0, sizeof(salt)); - memcpy(salt, saltPrefix, strlen(saltPrefix)); - saltLen += static_cast(strlen(saltPrefix)); - - memcpy(salt + saltLen, aExtPanId, OT_EXT_PAN_ID_SIZE); - saltLen += OT_EXT_PAN_ID_SIZE; - - memcpy(salt + saltLen, aNetworkName, strlen(aNetworkName)); - saltLen += static_cast(strlen(aNetworkName)); - - otPbkdf2Cmac(reinterpret_cast(aPassPhrase), static_cast(strlen(aPassPhrase)), - reinterpret_cast(salt), saltLen, 16384, OT_PSKC_MAX_SIZE, aPSKc); - -exit: - return error; -} - } // namespace NetworkData } // namespace Thread diff --git a/src/core/thread/network_data_leader_ftd.hpp b/src/core/thread/network_data_leader_ftd.hpp index d53c1e6a9..5946439af 100644 --- a/src/core/thread/network_data_leader_ftd.hpp +++ b/src/core/thread/network_data_leader_ftd.hpp @@ -140,22 +140,6 @@ public: */ ThreadError SendServerDataNotification(uint16_t aRloc16); - /** - * This method generates PSKc. - * - * PSKc is used to establish the Commissioner Session. - * - * @param[in] aPassPhrase The commissioning passphrase. - * @param[in] aNetworkName The network name for PSKc computation. - * @param[in] aExtPanId The extended pan id for PSKc computation. - * @param[out] aPSKc A pointer to where the generated PSKc will be placed. - * - * @retval kThreadErrorNone Successfully generate PSKc. - * @retval kThreadError_InvalidArgs If the length of passphrase is out of range. - * - */ - ThreadError GeneratePSKc(const char *aPassPhrase, const char *aNetworkName, const uint8_t *aExtPanId, uint8_t *aPSKc); - private: static void HandleServerData(void *aContext, otCoapHeader *aHeader, otMessage aMessage, const otMessageInfo *aMessageInfo); diff --git a/src/core/thread/network_data_leader_mtd.hpp b/src/core/thread/network_data_leader_mtd.hpp index 235eefec3..6eec4594f 100644 --- a/src/core/thread/network_data_leader_mtd.hpp +++ b/src/core/thread/network_data_leader_mtd.hpp @@ -59,8 +59,6 @@ public: void RemoveBorderRouter(uint16_t) { } ThreadError SendServerDataNotification(uint16_t) { return kThreadError_NotImplemented; } - - ThreadError GeneratePSKc(const char *, const char *, const uint8_t *, uint8_t *) { return kThreadError_NotImplemented; } }; } // namespace NetworkData diff --git a/third_party/mbedtls/Makefile.am b/third_party/mbedtls/Makefile.am index 61332df5c..9777636d8 100644 --- a/third_party/mbedtls/Makefile.am +++ b/third_party/mbedtls/Makefile.am @@ -43,10 +43,6 @@ libmbedcrypto_a_CPPFLAGS = \ libmbedcrypto_a_SOURCES = \ hardware_entropy.c \ repo/library/aes.c \ - repo/library/ccm.c \ - repo/library/cipher.c \ - repo/library/cipher_wrap.c \ - repo/library/cmac.c \ repo/library/md.c \ repo/library/md_wrap.c \ repo/library/memory_buffer_alloc.c \ @@ -57,6 +53,10 @@ libmbedcrypto_a_SOURCES = \ if OPENTHREAD_ENABLE_DTLS libmbedcrypto_a_SOURCES += \ repo/library/bignum.c \ + repo/library/ccm.c \ + repo/library/cipher.c \ + repo/library/cipher_wrap.c \ + repo/library/cmac.c \ repo/library/ctr_drbg.c \ repo/library/debug.c \ repo/library/ecjpake.c \