| /* |
| * |
| * Copyright (c) 2013-2017 Nest Labs, Inc. |
| * All rights reserved. |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| /** |
| * @file |
| * This file defines the Fabric Provisioning Profile, used to |
| * manage membership to Weave Fabrics. |
| * |
| * The Fabric Provisioning Profile facilitates client-server operations |
| * such that the client (the controlling device) can trigger specific |
| * functionality on the server (the device undergoing provisioning), |
| * to allow it to create, join, and leave Weave Fabrics. This includes |
| * communicating Fabric configuration information such as identifiers, |
| * keys, security schemes, and related data. |
| */ |
| |
| #ifndef FABRICPROVISIONING_H_ |
| #define FABRICPROVISIONING_H_ |
| |
| #include <Weave/Support/NLDLLUtil.h> |
| #include <Weave/Core/WeaveCore.h> |
| #include <Weave/Core/WeaveServerBase.h> |
| #include <Weave/Core/WeaveEncoding.h> |
| #include <Weave/Core/WeaveTLV.h> |
| |
| /** |
| * @namespace nl::Weave::Profiles::FabricProvisioning |
| * |
| * @brief |
| * This namespace includes all interfaces within Weave for the |
| * Weave Fabric Provisioning profile, the second of the three |
| * Weave provisioning profiles. |
| */ |
| |
| namespace nl { |
| namespace Weave { |
| namespace Profiles { |
| namespace FabricProvisioning { |
| |
| using nl::Inet::IPAddress; |
| |
| /** |
| * Fabric Provisioning Status Codes |
| */ |
| enum |
| { |
| kStatusCode_AlreadyMemberOfFabric = 1, /**< The recipient is already a member of a fabric. */ |
| kStatusCode_NotMemberOfFabric = 2, /**< The recipient is not a member of a fabric. */ |
| kStatusCode_InvalidFabricConfig = 3 /**< The specified fabric configuration was invalid. */ |
| }; |
| |
| /** |
| * Fabric Provisioning Message Types |
| */ |
| enum |
| { |
| // Application/Device Messages |
| kMsgType_CreateFabric = 1, |
| kMsgType_LeaveFabric = 2, |
| kMsgType_GetFabricConfig = 3, |
| kMsgType_GetFabricConfigComplete = 4, |
| kMsgType_JoinExistingFabric = 5 |
| }; |
| |
| /** |
| * Fabric Provisioning Data Element Tags |
| */ |
| enum |
| { |
| // ---- Top-level Data Elements ---- |
| kTag_FabricConfig = 1, /**< [ structure ] Contains provisioning information for an existing fabric. |
| IMPORTANT NOTE: As a convenience to readers, all elements in a FabricConfig |
| must be encoded in numeric tag order, at all levels. */ |
| |
| // ---- Context-specific Tags for FabricConfig Structure ---- |
| kTag_FabricId = 1, /**< [ uint ] Fabric ID. */ |
| kTag_FabricKeys = 2, /**< [ array ] List of FabricKey structures. */ |
| |
| // ---- Context-specific Tags for FabricKey Structure ---- |
| kTag_FabricKeyId = 1, /**< [ uint ] Weave key ID for fabric key. */ |
| kTag_EncryptionType = 2, /**< [ uint ] Weave encryption type supported by the key. */ |
| kTag_DataKey = 3, /**< [ byte-string ] Data encryption key. */ |
| kTag_IntegrityKey = 4, /**< [ byte-string ] Data integrity key. */ |
| kTag_KeyScope = 5, /**< [ uint ] Enumerated value identifying the category of devices that can possess |
| the fabric key. */ |
| kTag_RotationScheme = 6, /**< [ uint ] Enumerated value identifying the rotation scheme for the key. */ |
| kTag_RemainingLifeTime = 7, /**< [ uint ] Remaining time (in seconds) until key expiration. Absent if lifetime |
| is indefinite or doesn't apply. */ |
| kTag_RemainingReservedTime = 8 /**< [ uint ] Remaining time (in seconds) until key is eligible for use. Absent if |
| key can be used right away. */ |
| }; |
| |
| |
| /** |
| * Delegate class for implementing additional actions corresponding to Fabric Provisioning operations. |
| */ |
| class FabricProvisioningDelegate : public WeaveServerDelegateBase |
| { |
| public: |
| /** |
| * Indicates that the device has created a new Fabric. |
| * |
| * @retval #WEAVE_NO_ERROR On success. |
| * @retval other Other Weave or platform-specific error codes indicating that an error |
| * occurred preventing the device from creating a fabric. |
| */ |
| virtual WEAVE_ERROR HandleCreateFabric(void) = 0; |
| |
| /** |
| * Indicates that the device has joined an existing Fabric. |
| * |
| * @retval #WEAVE_NO_ERROR On success. |
| * @retval other Other Weave or platform-specific error codes indicating that an error |
| * occurred preventing the device from joining the fabric. |
| */ |
| virtual WEAVE_ERROR HandleJoinExistingFabric(void) = 0; |
| |
| /** |
| * Indicates that the device has left a Fabric. |
| * |
| * @retval #WEAVE_NO_ERROR On success. |
| * @retval other Other Weave or platform-specific error codes indicating that an error |
| * occurred preventing the device from leaving the fabric. |
| */ |
| virtual WEAVE_ERROR HandleLeaveFabric(void) = 0; |
| |
| /** |
| * Indicates that the configuration of the current Weave Fabric has been |
| * requested. |
| * |
| * @retval #WEAVE_NO_ERROR On success. |
| * @retval other Other Weave or platform-specific error codes indicating that an error |
| * occurred preventing the device from returning the fabric config. |
| */ |
| virtual WEAVE_ERROR HandleGetFabricConfig(void) = 0; |
| |
| /** |
| * Enforce message-level access control for an incoming Fabric Provisioning request message. |
| * |
| * @param[in] ec The ExchangeContext over which the message was received. |
| * @param[in] msgProfileId The profile id of the received message. |
| * @param[in] msgType The message type of the received message. |
| * @param[in] msgInfo A WeaveMessageInfo structure containing information about the received message. |
| * @param[inout] result An enumerated value describing the result of access control policy evaluation for |
| * the received message. Upon entry to the method, the value represents the tentative |
| * result at the current point in the evaluation process. Upon return, the result |
| * is expected to represent the final assessment of access control policy for the |
| * message. |
| */ |
| virtual void EnforceAccessControl(ExchangeContext *ec, uint32_t msgProfileId, uint8_t msgType, |
| const WeaveMessageInfo *msgInfo, AccessControlResult& result); |
| |
| /** |
| * Called to determine if the device is currently paired to an account. |
| */ |
| // TODO: make this pure virtual when product code provides appropriate implementations. |
| virtual bool IsPairedToAccount() const; |
| }; |
| |
| |
| /** |
| * Server class for implementing the Fabric Provisioning profile. |
| */ |
| // TODO: Additional documentation detail required (i.e. expected class usage, number in the system, instantiation requirements, lifetime). |
| class NL_DLL_EXPORT FabricProvisioningServer : public WeaveServerBase |
| { |
| public: |
| FabricProvisioningServer(void); |
| |
| WEAVE_ERROR Init(WeaveExchangeManager *exchangeMgr); |
| WEAVE_ERROR Shutdown(void); |
| |
| void SetDelegate(FabricProvisioningDelegate *delegate); |
| |
| virtual WEAVE_ERROR SendSuccessResponse(void); |
| virtual WEAVE_ERROR SendStatusReport(uint32_t statusProfileId, uint16_t statusCode, WEAVE_ERROR sysError = WEAVE_NO_ERROR); |
| |
| protected: |
| FabricProvisioningDelegate *mDelegate; |
| ExchangeContext *mCurClientOp; |
| |
| private: |
| static void HandleClientRequest(ExchangeContext *ec, const IPPacketInfo *pktInfo, const WeaveMessageInfo *msgInfo, uint32_t profileId, |
| uint8_t msgType, PacketBuffer *payload); |
| |
| FabricProvisioningServer(const FabricProvisioningServer&); // not defined |
| }; |
| |
| |
| } // namespace FabricProvisioning |
| } // namespace Profiles |
| } // namespace Weave |
| } // namespace nl |
| |
| #endif /* FABRICPROVISIONING_H_ */ |