/* * Copyright (c) 2024 Project CHIP Authors * 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. */ #pragma once #include "ProvisionEncoder.h" #include "ProvisionStorage.h" #include #include #include namespace chip { namespace DeviceLayer { namespace Silabs { namespace Provision { //------------------------------------------------------------------------------ // Common //------------------------------------------------------------------------------ class Protocol { public: /** * Must hold the header plus complete argument value */ Protocol(Storage & store) : mStore(store) {} virtual ~Protocol() = default; virtual bool Execute(ByteSpan & request, MutableByteSpan & response) = 0; protected: Storage & mStore; }; //------------------------------------------------------------------------------ // Version 1 //------------------------------------------------------------------------------ #ifdef SILABS_PROVISION_PROTOCOL_V1 class Protocol1 : public Protocol { public: static constexpr size_t kVersion = 1; Protocol1(Storage & store) : Protocol(store) {} virtual bool Execute(ByteSpan & request, MutableByteSpan & response); private: CHIP_ERROR Init(Encoding::Buffer & in, Encoding::Buffer & out); CHIP_ERROR GenerateCSR(Encoding::Buffer & in, Encoding::Buffer & out); CHIP_ERROR Import(Encoding::Buffer & in, Encoding::Buffer & out); CHIP_ERROR Setup(Encoding::Buffer & in, Encoding::Buffer & out); CHIP_ERROR Read(Encoding::Buffer & in, Encoding::Buffer & out); }; #endif // SILABS_PROVISION_PROTOCOL_V1 //------------------------------------------------------------------------------ // Version 2 //------------------------------------------------------------------------------ class Protocol2 : public Protocol { public: static constexpr uint8_t kVersion = 2; // Command flags static constexpr uint16_t kResponseFlag = 0x80; // Payload flags static constexpr uint16_t kCustomIdMin = 0x0000; static constexpr uint16_t kCustomIdMax = 0x00ff; static constexpr uint16_t kKnownIdMin = 0x0100; static constexpr uint16_t kKnownIdMax = 0x01ff; static constexpr uint16_t kIdMask = 0x01ff; static constexpr uint16_t kWellKnownMask = 0x0100; static constexpr uint16_t kSizeBit = 10; static constexpr uint16_t kSizeMask = 0x0c00; static constexpr uint16_t kFeedbackMask = 0x0200; static constexpr uint16_t kTypeBit = 12; static constexpr uint16_t kTypeMask = 0xf000; // Limits static constexpr size_t kPackageSizeMax = 128; static constexpr size_t kChecksumSize = 2; static constexpr size_t kRequestHeaderSize = 4; static constexpr size_t kResponseHeaderSize = 8; static_assert(kPackageSizeMax > (kResponseHeaderSize + kChecksumSize)); Protocol2(Storage & store) : Protocol(store) {} virtual bool Execute(ByteSpan & request, MutableByteSpan & response); }; } // namespace Provision } // namespace Silabs } // namespace DeviceLayer } // namespace chip