blob: 1b99334b8f8011b618c99285618fb449a8752f53 [file] [log] [blame]
/**
*
* 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 <setup_payload/CHIPAdditionalDataPayloadBuildConfig.h>
#endif
#include <lib/core/CHIPError.h>
#include <lib/support/BitFlags.h>
#include <system/TLVPacketBufferBackingStore.h>
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> 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