/** * * Copyright (c) 2021 Project CHIP Authors * * 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 provides a utility to generate Additional Data payload and its members * (e.g. rotating device id) * */ #pragma once #if CHIP_HAVE_CONFIG_H #include #endif #include #include #include namespace chip { namespace RotatingDeviceId { static constexpr unsigned kLifetimeCounterSize = 2; static constexpr unsigned kHashSuffixLength = 16; static constexpr unsigned kMaxLength = kLifetimeCounterSize + kHashSuffixLength; static constexpr unsigned kHexMaxLength = kMaxLength * 2 + 1; } // namespace RotatingDeviceId enum class AdditionalDataFields : int8_t { NotSpecified = 0x00, RotatingDeviceId = 0x01 }; struct AdditionalDataPayloadGeneratorParams { #if CHIP_ENABLE_ROTATING_DEVICE_ID uint16_t rotatingDeviceIdLifetimeCounter; ByteSpan rotatingDeviceIdUniqueId; #endif }; class AdditionalDataPayloadGenerator { public: AdditionalDataPayloadGenerator() {} /** * Generate additional data payload (i.e. TLV encoded). * * @param params parameters needed to generate additional data payload * @param bufferHandle output buffer handle * @param additionalDataFields bitfield for what fields should be generated in the additional data * * @retval #CHIP_ERROR_INVALID_TLV_TAG * If the specified tag value is invalid or inappropriate in the context * in which the value is being written. * @retval #CHIP_ERROR_BUFFER_TOO_SMALL * If writing the value would exceed the limit on the maximum number of * bytes specified when the writer was initialized. * @retval #CHIP_ERROR_NO_MEMORY * If an attempt to allocate an output buffer failed due to lack of * memory. * @retval other Other CHIP or platform-specific errors returned by the configured * TLVBackingStore * */ CHIP_ERROR generateAdditionalDataPayload(AdditionalDataPayloadGeneratorParams & params, chip::System::PacketBufferHandle & bufferHandle, BitFlags additionalDataFields); #if CHIP_ENABLE_ROTATING_DEVICE_ID /** * Generate Rotating Device ID in Binary Format * * @param params parameters needed to generate additional data payload * @param [in,out] rotatingDeviceIdBuffer as input, the buffer to use for * the binary data. As output, will have its size set to * the actual size used upon successful generation */ CHIP_ERROR generateRotatingDeviceIdAsBinary(AdditionalDataPayloadGeneratorParams & params, MutableByteSpan & rotatingDeviceIdBuffer); /** * Generate Device Rotating ID in String Format * * @param params parameters needed to generate additional data payload * @param rotatingDeviceIdBuffer rotating device id buffer * @param rotatingDeviceIdBufferSize the current size of the supplied buffer * @param rotatingDeviceIdValueOutputSize the number of chars making up the actual value of the returned rotating device id * excluding the null terminator * * @return Returns a CHIP_ERROR on error, CHIP_NO_ERROR otherwise. * */ CHIP_ERROR generateRotatingDeviceIdAsHexString(AdditionalDataPayloadGeneratorParams & params, char * rotatingDeviceIdBuffer, size_t rotatingDeviceIdBufferSize, size_t & rotatingDeviceIdValueOutputSize); #endif }; } // namespace chip