diff --git a/include/commissioning/commissioner.h b/include/commissioning/commissioner.h index 811c10db6..a1212327e 100644 --- a/include/commissioning/commissioner.h +++ b/include/commissioning/commissioner.h @@ -49,8 +49,13 @@ extern "C" { /** * This function enables the Thread Commissioner role. * + * @param[in] aPSKd A pointer to the PSKd. + * + * @retval kThreadError_None Successfully started the Commissioner role. + * @retval kThreadError_InvalidArgs @p aPSKd is invalid. + * */ -ThreadError otCommissionerStart(void); +ThreadError otCommissionerStart(const char *aPSKd); /** * This function disables the Thread Commissioner role. diff --git a/include/commissioning/joiner.h b/include/commissioning/joiner.h index cbb2b5394..2a8da0063 100644 --- a/include/commissioning/joiner.h +++ b/include/commissioning/joiner.h @@ -49,8 +49,13 @@ extern "C" { /** * This function enables the Thread Joiner role. * + * @param[in] aPSKd A pointer to the PSKd. + * + * @retval kThreadError_None Successfully started the Commissioner role. + * @retval kThreadError_InvalidArgs @p aPSKd is invalid. + * */ -ThreadError otJoinerStart(void); +ThreadError otJoinerStart(const char *aPSKd); /** * This function disables the Thread Joiner role. diff --git a/src/cli/cli.cpp b/src/cli/cli.cpp index 3dc440518..71ca8a8bc 100644 --- a/src/cli/cli.cpp +++ b/src/cli/cli.cpp @@ -1848,7 +1848,8 @@ void Interpreter::ProcessCommissioner(int argc, char *argv[]) if (strcmp(argv[0], "start") == 0) { - otCommissionerStart(); + VerifyOrExit(argc > 1, error = kThreadError_Parse); + otCommissionerStart(argv[1]); } else if (strcmp(argv[0], "stop") == 0) { @@ -1871,7 +1872,8 @@ void Interpreter::ProcessJoiner(int argc, char *argv[]) if (strcmp(argv[0], "start") == 0) { - otJoinerStart(); + VerifyOrExit(argc > 1, error = kThreadError_Parse); + otJoinerStart(argv[1]); } else if (strcmp(argv[0], "stop") == 0) { diff --git a/src/core/meshcop/commissioner.cpp b/src/core/meshcop/commissioner.cpp index 22591711f..57a60fe49 100644 --- a/src/core/meshcop/commissioner.cpp +++ b/src/core/meshcop/commissioner.cpp @@ -59,12 +59,14 @@ Commissioner::Commissioner(ThreadNetif &aThreadNetif): aThreadNetif.GetCoapServer().AddResource(mRelayReceive); } -ThreadError Commissioner::Start(void) +ThreadError Commissioner::Start(const char *aPSKd) { ThreadError error = kThreadError_None; VerifyOrExit(mState == kStateDisabled, error = kThreadError_InvalidState); + SuccessOrExit(error = mNetif.GetDtls().SetPsk(reinterpret_cast(aPSKd), + static_cast(strlen(aPSKd)))); SuccessOrExit(error = mSocket.Open(HandleUdpReceive, this)); mState = kStatePetition; SendPetition(); diff --git a/src/core/meshcop/commissioner.hpp b/src/core/meshcop/commissioner.hpp index 0e95a3679..3dc9948f5 100644 --- a/src/core/meshcop/commissioner.hpp +++ b/src/core/meshcop/commissioner.hpp @@ -59,10 +59,12 @@ public: /** * This method starts the Commissioner service. * + * @param[in] aPSKd A pointer to the PSKd. + * * @retval kThreadError_None Successfully started the Commissioner service. * */ - ThreadError Start(void); + ThreadError Start(const char *aPSKd); /** * This method stops the Commissioner service. diff --git a/src/core/meshcop/dtls.cpp b/src/core/meshcop/dtls.cpp index 96b571300..d4d9f15d3 100644 --- a/src/core/meshcop/dtls.cpp +++ b/src/core/meshcop/dtls.cpp @@ -105,7 +105,7 @@ ThreadError Dtls::Start(bool aClient, ReceiveHandler aReceiveHandler, SendHandle mbedtls_ssl_set_bio(&mSsl, this, &HandleMbedtlsTransmit, HandleMbedtlsReceive, NULL); mbedtls_ssl_set_timer_cb(&mSsl, this, &HandleMbedtlsSetTimer, HandleMbedtlsGetTimer); - rval = mbedtls_ssl_set_hs_ecjpake_password(&mSsl, (const unsigned char *)"threadjpaketest", 15); + rval = mbedtls_ssl_set_hs_ecjpake_password(&mSsl, mPsk, mPskLength); VerifyOrExit(rval == 0, ;); mStarted = true; @@ -129,6 +129,19 @@ ThreadError Dtls::Stop(void) return kThreadError_None; } +ThreadError Dtls::SetPsk(const uint8_t *aPsk, uint8_t aPskLength) +{ + ThreadError error = kThreadError_None; + + VerifyOrExit(aPskLength <= sizeof(mPsk), error = kThreadError_InvalidArgs); + + memcpy(mPsk, aPsk, aPskLength); + mPskLength = aPskLength; + +exit: + return error; +} + ThreadError Dtls::SetClientId(const uint8_t *aClientId, uint8_t aLength) { int rval = mbedtls_ssl_set_client_transport_id(&mSsl, aClientId, aLength); @@ -330,7 +343,7 @@ void Dtls::Process(void) else { mbedtls_ssl_session_reset(&mSsl); - mbedtls_ssl_set_hs_ecjpake_password(&mSsl, (const unsigned char *)"threadjpaketest", 15); + mbedtls_ssl_set_hs_ecjpake_password(&mSsl, mPsk, mPskLength); break; } } diff --git a/src/core/meshcop/dtls.hpp b/src/core/meshcop/dtls.hpp index c266df29b..ea355e028 100644 --- a/src/core/meshcop/dtls.hpp +++ b/src/core/meshcop/dtls.hpp @@ -104,6 +104,17 @@ public: */ ThreadError Stop(void); + /** + * This method sets the PSK. + * + * @param[in] aPSK A pointer to the PSK. + * + * @retval kThreadError_None Successfully set the PSK. + * @retval kThreadError_InvalidArgs The PSK is invalid. + * + */ + ThreadError SetPsk(const uint8_t *aPsk, uint8_t aPskLength); + /** * This method sets the Client ID used for generating the Hello Cookie. * @@ -148,6 +159,11 @@ public: ThreadError Receive(Message &aMessage, uint16_t aOffset, uint16_t aLength); private: + enum + { + kPskMaxLength = 32, + }; + static ThreadError MapError(int rval); static void HandleMbedtlsDebug(void *ctx, int level, const char *file, int line, const char *str); @@ -175,6 +191,9 @@ private: void Process(void); + uint8_t mPsk[kPskMaxLength]; + uint8_t mPskLength; + mbedtls_entropy_context mEntropy; mbedtls_ctr_drbg_context mCtrDrbg; mbedtls_ssl_context mSsl; diff --git a/src/core/meshcop/joiner.cpp b/src/core/meshcop/joiner.cpp index 09b8626a6..cc3923e58 100644 --- a/src/core/meshcop/joiner.cpp +++ b/src/core/meshcop/joiner.cpp @@ -58,9 +58,16 @@ Joiner::Joiner(ThreadNetif &aNetif): mNetif.GetCoapServer().AddResource(mJoinerEntrust); } -ThreadError Joiner::Start(void) +ThreadError Joiner::Start(const char *aPSKd) { - return mNetif.GetMle().Discover(0, 0, OT_PANID_BROADCAST, HandleDiscoverResult, this); + ThreadError error; + + SuccessOrExit(error = mNetif.GetDtls().SetPsk(reinterpret_cast(aPSKd), + static_cast(strlen(aPSKd)))); + SuccessOrExit(error = mNetif.GetMle().Discover(0, 0, OT_PANID_BROADCAST, HandleDiscoverResult, this)); + +exit: + return error; } void Joiner::HandleDiscoverResult(otActiveScanResult *aResult, void *aContext) diff --git a/src/core/meshcop/joiner.hpp b/src/core/meshcop/joiner.hpp index 579583647..c52900c83 100644 --- a/src/core/meshcop/joiner.hpp +++ b/src/core/meshcop/joiner.hpp @@ -63,10 +63,12 @@ public: /** * This method starts the Joiner service. * + * @param[in] aPSKd A pointer to the PSKd. + * * @retval kThreadError_None Successfully started the Joiner service. * */ - ThreadError Start(void); + ThreadError Start(const char *aPSKd); /** * This method stops the Joiner service. diff --git a/src/core/openthread.cpp b/src/core/openthread.cpp index e1979b918..4517c822c 100644 --- a/src/core/openthread.cpp +++ b/src/core/openthread.cpp @@ -1241,9 +1241,9 @@ ThreadError otSendPendingSet(const otOperationalDataset *aDataset, const uint8_t } #if OPENTHREAD_ENABLE_COMMISSIONER -ThreadError otCommissionerStart(void) +ThreadError otCommissionerStart(const char *aPSKd) { - return sThreadNetif->GetCommissioner().Start(); + return sThreadNetif->GetCommissioner().Start(aPSKd); } ThreadError otCommissionerStop(void) @@ -1253,9 +1253,9 @@ ThreadError otCommissionerStop(void) #endif // OPENTHREAD_ENABLE_COMMISSIONER #if OPENTHREAD_ENABLE_JOINER -ThreadError otJoinerStart(void) +ThreadError otJoinerStart(const char *aPSKd) { - return sThreadNetif->GetJoiner().Start(); + return sThreadNetif->GetJoiner().Start(aPSKd); } ThreadError otJoinerStop(void)