CommissionerMain.cpp 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427
  1. /*
  2. *
  3. * Copyright (c) 2021-2022 Project CHIP Authors
  4. * All rights reserved.
  5. *
  6. * Licensed under the Apache License, Version 2.0 (the "License");
  7. * you may not use this file except in compliance with the License.
  8. * You may obtain a copy of the License at
  9. *
  10. * http://www.apache.org/licenses/LICENSE-2.0
  11. *
  12. * Unless required by applicable law or agreed to in writing, software
  13. * distributed under the License is distributed on an "AS IS" BASIS,
  14. * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  15. * See the License for the specific language governing permissions and
  16. * limitations under the License.
  17. */
  18. #include <platform/CHIPDeviceLayer.h>
  19. #include <platform/PlatformManager.h>
  20. #if CHIP_DEVICE_CONFIG_ENABLE_BOTH_COMMISSIONER_AND_COMMISSIONEE
  21. #include <app/clusters/network-commissioning/network-commissioning.h>
  22. #include <app/server/Dnssd.h>
  23. #include <app/server/OnboardingCodesUtil.h>
  24. #include <app/server/Server.h>
  25. #include <crypto/CHIPCryptoPAL.h>
  26. #include <crypto/RawKeySessionKeystore.h>
  27. #include <lib/core/CHIPError.h>
  28. #include <lib/core/NodeId.h>
  29. #include <lib/support/logging/CHIPLogging.h>
  30. #include <credentials/DeviceAttestationConstructor.h>
  31. #include <credentials/DeviceAttestationVendorReserved.h>
  32. #include <credentials/GroupDataProviderImpl.h>
  33. #include <credentials/attestation_verifier/DacOnlyPartialAttestationVerifier.h>
  34. #include <credentials/attestation_verifier/DefaultDeviceAttestationVerifier.h>
  35. #include <credentials/attestation_verifier/DeviceAttestationVerifier.h>
  36. #include <credentials/examples/DeviceAttestationCredsExample.h>
  37. #include <lib/support/CHIPMem.h>
  38. #include <lib/support/ScopedBuffer.h>
  39. #include <lib/support/TestGroupData.h>
  40. #include <setup_payload/QRCodeSetupPayloadGenerator.h>
  41. #include <setup_payload/SetupPayload.h>
  42. #include <platform/CommissionableDataProvider.h>
  43. #include <platform/DeviceInstanceInfoProvider.h>
  44. #include <platform/DiagnosticDataProvider.h>
  45. #include <platform/TestOnlyCommissionableDataProvider.h>
  46. #include <controller/CHIPDeviceControllerFactory.h>
  47. #include <controller/ExampleOperationalCredentialsIssuer.h>
  48. #include <lib/core/CHIPPersistentStorageDelegate.h>
  49. #include <platform/KeyValueStoreManager.h>
  50. #if CHIP_CONFIG_TRANSPORT_TRACE_ENABLED
  51. #include "TraceHandlers.h"
  52. #endif // CHIP_CONFIG_TRANSPORT_TRACE_ENABLED
  53. #include <signal.h>
  54. #include "CommissionerMain.h"
  55. using namespace chip;
  56. using namespace chip::Credentials;
  57. using namespace chip::DeviceLayer;
  58. using namespace chip::Inet;
  59. using namespace chip::Transport;
  60. using namespace chip::app::Clusters;
  61. using namespace ::chip::Messaging;
  62. using namespace ::chip::Controller;
  63. class MyServerStorageDelegate : public PersistentStorageDelegate
  64. {
  65. CHIP_ERROR SyncGetKeyValue(const char * key, void * buffer, uint16_t & size) override
  66. {
  67. ChipLogProgress(AppServer, "Retrieving value from server storage.");
  68. size_t bytesRead = 0;
  69. CHIP_ERROR err = PersistedStorage::KeyValueStoreMgr().Get(key, buffer, size, &bytesRead);
  70. if (err == CHIP_NO_ERROR)
  71. {
  72. ChipLogProgress(AppServer, "Retrieved value from server storage.");
  73. }
  74. size = static_cast<uint16_t>(bytesRead);
  75. return err;
  76. }
  77. CHIP_ERROR SyncSetKeyValue(const char * key, const void * value, uint16_t size) override
  78. {
  79. ChipLogProgress(AppServer, "Stored value in server storage");
  80. return PersistedStorage::KeyValueStoreMgr().Put(key, value, size);
  81. }
  82. CHIP_ERROR SyncDeleteKeyValue(const char * key) override
  83. {
  84. ChipLogProgress(AppServer, "Delete value in server storage");
  85. return PersistedStorage::KeyValueStoreMgr().Delete(key);
  86. }
  87. };
  88. class MyCommissionerCallback : public CommissionerCallback
  89. {
  90. void ReadyForCommissioning(uint32_t pincode, uint16_t longDiscriminator, PeerAddress peerAddress) override
  91. {
  92. CommissionerPairOnNetwork(pincode, longDiscriminator, peerAddress);
  93. }
  94. };
  95. AutoCommissioner gAutoCommissioner;
  96. DeviceCommissioner gCommissioner;
  97. CommissionerDiscoveryController gCommissionerDiscoveryController;
  98. MyCommissionerCallback gCommissionerCallback;
  99. MyServerStorageDelegate gServerStorage;
  100. ExampleOperationalCredentialsIssuer gOpCredsIssuer;
  101. NodeId gLocalId = kMaxOperationalNodeId;
  102. Credentials::GroupDataProviderImpl gGroupDataProvider;
  103. Crypto::RawKeySessionKeystore gSessionKeystore;
  104. CHIP_ERROR InitCommissioner(uint16_t commissionerPort, uint16_t udcListenPort, FabricId fabricId)
  105. {
  106. Controller::FactoryInitParams factoryParams;
  107. Controller::SetupParams params;
  108. // use a different listen port for the commissioner than the default used by chip-tool.
  109. factoryParams.listenPort = commissionerPort;
  110. factoryParams.fabricIndependentStorage = &gServerStorage;
  111. factoryParams.fabricTable = &Server::GetInstance().GetFabricTable();
  112. factoryParams.sessionKeystore = &gSessionKeystore;
  113. gGroupDataProvider.SetStorageDelegate(&gServerStorage);
  114. gGroupDataProvider.SetSessionKeystore(factoryParams.sessionKeystore);
  115. ReturnErrorOnFailure(gGroupDataProvider.Init());
  116. factoryParams.groupDataProvider = &gGroupDataProvider;
  117. params.operationalCredentialsDelegate = &gOpCredsIssuer;
  118. uint16_t vendorId;
  119. DeviceLayer::GetDeviceInstanceInfoProvider()->GetVendorId(vendorId);
  120. ChipLogProgress(Support, " ----- Commissioner using vendorId 0x%04X", vendorId);
  121. params.controllerVendorId = static_cast<VendorId>(vendorId);
  122. ReturnErrorOnFailure(gOpCredsIssuer.Initialize(gServerStorage));
  123. if (fabricId != kUndefinedFabricId)
  124. {
  125. gOpCredsIssuer.SetFabricIdForNextNOCRequest(fabricId);
  126. }
  127. // No need to explicitly set the UDC port since we will use default
  128. ChipLogProgress(Support, " ----- UDC listening on port %d", udcListenPort);
  129. ReturnErrorOnFailure(gCommissioner.SetUdcListenPort(udcListenPort));
  130. // Initialize device attestation verifier
  131. // TODO: Replace testingRootStore with a AttestationTrustStore that has the necessary official PAA roots available
  132. const Credentials::AttestationTrustStore * testingRootStore = Credentials::GetTestAttestationTrustStore();
  133. SetDeviceAttestationVerifier(GetDefaultDACVerifier(testingRootStore));
  134. Platform::ScopedMemoryBuffer<uint8_t> noc;
  135. VerifyOrReturnError(noc.Alloc(Controller::kMaxCHIPDERCertLength), CHIP_ERROR_NO_MEMORY);
  136. MutableByteSpan nocSpan(noc.Get(), Controller::kMaxCHIPDERCertLength);
  137. Platform::ScopedMemoryBuffer<uint8_t> icac;
  138. VerifyOrReturnError(icac.Alloc(Controller::kMaxCHIPDERCertLength), CHIP_ERROR_NO_MEMORY);
  139. MutableByteSpan icacSpan(icac.Get(), Controller::kMaxCHIPDERCertLength);
  140. Platform::ScopedMemoryBuffer<uint8_t> rcac;
  141. VerifyOrReturnError(rcac.Alloc(Controller::kMaxCHIPDERCertLength), CHIP_ERROR_NO_MEMORY);
  142. MutableByteSpan rcacSpan(rcac.Get(), Controller::kMaxCHIPDERCertLength);
  143. Crypto::P256Keypair ephemeralKey;
  144. ReturnErrorOnFailure(ephemeralKey.Initialize(Crypto::ECPKeyTarget::ECDSA));
  145. ReturnErrorOnFailure(gOpCredsIssuer.GenerateNOCChainAfterValidation(gLocalId, /* fabricId = */ 1, chip::kUndefinedCATs,
  146. ephemeralKey.Pubkey(), rcacSpan, icacSpan, nocSpan));
  147. params.operationalKeypair = &ephemeralKey;
  148. params.controllerRCAC = rcacSpan;
  149. params.controllerICAC = icacSpan;
  150. params.controllerNOC = nocSpan;
  151. params.defaultCommissioner = &gAutoCommissioner;
  152. // assign prefered feature settings
  153. CommissioningParameters commissioningParams = gAutoCommissioner.GetCommissioningParameters();
  154. commissioningParams.SetCheckForMatchingFabric(true);
  155. gAutoCommissioner.SetCommissioningParameters(commissioningParams);
  156. auto & factory = Controller::DeviceControllerFactory::GetInstance();
  157. ReturnErrorOnFailure(factory.Init(factoryParams));
  158. ReturnErrorOnFailure(factory.SetupCommissioner(params, gCommissioner));
  159. FabricIndex fabricIndex = gCommissioner.GetFabricIndex();
  160. VerifyOrReturnError(fabricIndex != kUndefinedFabricIndex, CHIP_ERROR_INTERNAL);
  161. uint8_t compressedFabricId[sizeof(uint64_t)] = { 0 };
  162. MutableByteSpan compressedFabricIdSpan(compressedFabricId);
  163. ReturnErrorOnFailure(gCommissioner.GetCompressedFabricIdBytes(compressedFabricIdSpan));
  164. ChipLogProgress(Support,
  165. "Setting up group data for Fabric Index %u with Compressed Fabric ID:", static_cast<unsigned>(fabricIndex));
  166. ChipLogByteSpan(Support, compressedFabricIdSpan);
  167. // TODO: Once ExampleOperationalCredentialsIssuer has support, set default IPK on it as well so
  168. // that commissioned devices get the IPK set from real values rather than "test-only" internal hookups.
  169. ByteSpan defaultIpk = chip::GroupTesting::DefaultIpkValue::GetDefaultIpk();
  170. ReturnLogErrorOnFailure(
  171. chip::Credentials::SetSingleIpkEpochKey(&gGroupDataProvider, fabricIndex, defaultIpk, compressedFabricIdSpan));
  172. gCommissionerDiscoveryController.SetUserDirectedCommissioningServer(gCommissioner.GetUserDirectedCommissioningServer());
  173. gCommissionerDiscoveryController.SetCommissionerCallback(&gCommissionerCallback);
  174. // advertise operational since we are an admin
  175. app::DnssdServer::Instance().AdvertiseOperational();
  176. ChipLogProgress(Support,
  177. "InitCommissioner nodeId=0x" ChipLogFormatX64 " fabric.fabricId=0x" ChipLogFormatX64 " fabricIndex=0x%x",
  178. ChipLogValueX64(gCommissioner.GetNodeId()), ChipLogValueX64(fabricId), static_cast<unsigned>(fabricIndex));
  179. return CHIP_NO_ERROR;
  180. }
  181. void ShutdownCommissioner()
  182. {
  183. UserDirectedCommissioningServer * udcServer = gCommissioner.GetUserDirectedCommissioningServer();
  184. if (udcServer != nullptr)
  185. {
  186. udcServer->SetUserConfirmationProvider(nullptr);
  187. }
  188. gCommissioner.Shutdown();
  189. }
  190. class PairingCommand : public Controller::DevicePairingDelegate
  191. {
  192. public:
  193. PairingCommand() :
  194. mOnDeviceConnectedCallback(OnDeviceConnectedFn, this),
  195. mOnDeviceConnectionFailureCallback(OnDeviceConnectionFailureFn, this){};
  196. /////////// DevicePairingDelegate Interface /////////
  197. void OnStatusUpdate(Controller::DevicePairingDelegate::Status status) override;
  198. void OnPairingComplete(CHIP_ERROR error) override;
  199. void OnPairingDeleted(CHIP_ERROR error) override;
  200. void OnCommissioningComplete(NodeId deviceId, CHIP_ERROR error) override;
  201. void OnCommissioningStatusUpdate(PeerId peerId, CommissioningStage stageCompleted, CHIP_ERROR error) override;
  202. void OnReadCommissioningInfo(const ReadCommissioningInfo & info) override;
  203. void OnFabricCheck(NodeId matchingNodeId) override;
  204. private:
  205. #if CHIP_DEVICE_CONFIG_APP_PLATFORM_ENABLED
  206. static void OnDeviceConnectedFn(void * context, chip::Messaging::ExchangeManager & exchangeMgr,
  207. const chip::SessionHandle & sessionHandle);
  208. static void OnDeviceConnectionFailureFn(void * context, const ScopedNodeId & peerId, CHIP_ERROR error);
  209. chip::Callback::Callback<chip::OnDeviceConnected> mOnDeviceConnectedCallback;
  210. chip::Callback::Callback<chip::OnDeviceConnectionFailure> mOnDeviceConnectionFailureCallback;
  211. #endif // CHIP_DEVICE_CONFIG_APP_PLATFORM_ENABLED
  212. };
  213. PairingCommand gPairingCommand;
  214. NodeId gRemoteId = kTestDeviceNodeId;
  215. void PairingCommand::OnStatusUpdate(DevicePairingDelegate::Status status)
  216. {
  217. switch (status)
  218. {
  219. case DevicePairingDelegate::Status::SecurePairingSuccess:
  220. ChipLogProgress(AppServer, "Secure Pairing Success");
  221. break;
  222. case DevicePairingDelegate::Status::SecurePairingFailed:
  223. ChipLogError(AppServer, "Secure Pairing Failed");
  224. break;
  225. }
  226. }
  227. void PairingCommand::OnPairingComplete(CHIP_ERROR err)
  228. {
  229. if (err == CHIP_NO_ERROR)
  230. {
  231. ChipLogProgress(AppServer, "Pairing Success");
  232. }
  233. else
  234. {
  235. ChipLogProgress(AppServer, "Pairing Failure: %s", ErrorStr(err));
  236. }
  237. }
  238. void PairingCommand::OnPairingDeleted(CHIP_ERROR err)
  239. {
  240. if (err == CHIP_NO_ERROR)
  241. {
  242. ChipLogProgress(AppServer, "Pairing Deleted Success");
  243. }
  244. else
  245. {
  246. ChipLogProgress(AppServer, "Pairing Deleted Failure: %s", ErrorStr(err));
  247. }
  248. }
  249. void PairingCommand::OnCommissioningComplete(NodeId nodeId, CHIP_ERROR err)
  250. {
  251. if (err == CHIP_NO_ERROR)
  252. {
  253. #if CHIP_DEVICE_CONFIG_APP_PLATFORM_ENABLED
  254. ChipLogProgress(AppServer, "Device commissioning completed with success - getting OperationalDeviceProxy");
  255. gCommissioner.GetConnectedDevice(gAutoCommissioner.GetCommissioningParameters().GetRemoteNodeId().ValueOr(nodeId),
  256. &mOnDeviceConnectedCallback, &mOnDeviceConnectionFailureCallback);
  257. #else // CHIP_DEVICE_CONFIG_APP_PLATFORM_ENABLED
  258. ChipLogProgress(AppServer, "Device commissioning completed with success");
  259. #endif // CHIP_DEVICE_CONFIG_APP_PLATFORM_ENABLED
  260. }
  261. else
  262. {
  263. ChipLogProgress(AppServer, "Device commissioning Failure: %s", ErrorStr(err));
  264. #if CHIP_DEVICE_CONFIG_APP_PLATFORM_ENABLED
  265. CommissionerDiscoveryController * cdc = GetCommissionerDiscoveryController();
  266. if (cdc != nullptr)
  267. {
  268. cdc->CommissioningFailed(err);
  269. }
  270. #endif // CHIP_DEVICE_CONFIG_APP_PLATFORM_ENABLED
  271. }
  272. }
  273. void PairingCommand::OnCommissioningStatusUpdate(PeerId peerId, CommissioningStage stageCompleted, CHIP_ERROR error)
  274. {
  275. ChipLogProgress(AppServer, "OnCommissioningStatusUpdate - stageCompleted='%s' error='%s'", StageToString(stageCompleted),
  276. ErrorStr(error));
  277. // if we have successfully finished attestation AND this device already has a NodeId on our fabric
  278. // then stop commissioning and attempt to connect to it.
  279. if (stageCompleted == CommissioningStage::kAttestationVerification && error == CHIP_NO_ERROR &&
  280. gAutoCommissioner.GetCommissioningParameters().GetRemoteNodeId().HasValue())
  281. {
  282. gAutoCommissioner.StopCommissioning();
  283. }
  284. }
  285. void PairingCommand::OnReadCommissioningInfo(const ReadCommissioningInfo & info)
  286. {
  287. ChipLogProgress(AppServer, "OnReadCommissioningInfo - vendorId=0x%04X productId=0x%04X", info.basic.vendorId,
  288. info.basic.productId);
  289. }
  290. void PairingCommand::OnFabricCheck(NodeId matchingNodeId)
  291. {
  292. if (matchingNodeId != kUndefinedNodeId)
  293. {
  294. ChipLogProgress(AppServer, "ALREADY ON FABRIC WITH nodeId=0x" ChipLogFormatX64, ChipLogValueX64(matchingNodeId));
  295. // wait until attestation verification before cancelling so we can validate vid/pid
  296. }
  297. }
  298. #if CHIP_DEVICE_CONFIG_APP_PLATFORM_ENABLED
  299. void PairingCommand::OnDeviceConnectedFn(void * context, Messaging::ExchangeManager & exchangeMgr,
  300. const SessionHandle & sessionHandle)
  301. {
  302. ChipLogProgress(Controller, "OnDeviceConnectedFn");
  303. CommissionerDiscoveryController * cdc = GetCommissionerDiscoveryController();
  304. if (cdc != nullptr)
  305. {
  306. uint16_t vendorId = gAutoCommissioner.GetCommissioningParameters().GetRemoteVendorId().Value();
  307. uint16_t productId = gAutoCommissioner.GetCommissioningParameters().GetRemoteProductId().Value();
  308. ChipLogProgress(Support, " ----- AutoCommissioner -- Commissionee vendorId=0x%04X productId=0x%04X", vendorId, productId);
  309. cdc->CommissioningSucceeded(vendorId, productId, gRemoteId, exchangeMgr, sessionHandle);
  310. }
  311. }
  312. void PairingCommand::OnDeviceConnectionFailureFn(void * context, const ScopedNodeId & peerId, CHIP_ERROR err)
  313. {
  314. ChipLogProgress(Controller, "OnDeviceConnectionFailureFn - attempt to get OperationalDeviceProxy failed");
  315. CommissionerDiscoveryController * cdc = GetCommissionerDiscoveryController();
  316. {
  317. cdc->CommissioningFailed(err);
  318. }
  319. }
  320. #endif // CHIP_DEVICE_CONFIG_APP_PLATFORM_ENABLED
  321. CHIP_ERROR CommissionerPairOnNetwork(uint32_t pincode, uint16_t disc, Transport::PeerAddress address)
  322. {
  323. RendezvousParameters params = RendezvousParameters().SetSetupPINCode(pincode).SetDiscriminator(disc).SetPeerAddress(address);
  324. gOpCredsIssuer.GetRandomOperationalNodeId(&gRemoteId);
  325. gCommissioner.RegisterPairingDelegate(&gPairingCommand);
  326. gCommissioner.PairDevice(gRemoteId, params);
  327. return CHIP_NO_ERROR;
  328. }
  329. CHIP_ERROR CommissionerPairUDC(uint32_t pincode, size_t index)
  330. {
  331. UDCClientState * state = gCommissioner.GetUserDirectedCommissioningServer()->GetUDCClients().GetUDCClientState(index);
  332. if (state == nullptr)
  333. {
  334. ChipLogProgress(AppServer, "udc client[%ld] null \r\n", static_cast<long>(index));
  335. return CHIP_ERROR_KEY_NOT_FOUND;
  336. }
  337. else
  338. {
  339. Transport::PeerAddress peerAddress = state->GetPeerAddress();
  340. state->SetUDCClientProcessingState(UDCClientProcessingState::kCommissioningNode);
  341. return CommissionerPairOnNetwork(pincode, state->GetLongDiscriminator(), peerAddress);
  342. }
  343. }
  344. DeviceCommissioner * GetDeviceCommissioner()
  345. {
  346. return &gCommissioner;
  347. }
  348. CommissionerDiscoveryController * GetCommissionerDiscoveryController()
  349. {
  350. return &gCommissionerDiscoveryController;
  351. }
  352. #endif // CHIP_DEVICE_CONFIG_ENABLE_BOTH_COMMISSIONER_AND_COMMISSIONEE