source/interface/azure_iot_jws.h (36 lines of code) (raw):
/* Copyright (c) Microsoft Corporation.
* Licensed under the MIT License. */
/**
* @file
*
* @brief APIs working with JWS signatures to authenticate an ADU manifest.
*
*/
#ifndef AZURE_IOT_JWS_H
#define AZURE_IOT_JWS_H
#include <stdint.h>
#include "azure_iot_result.h"
/**
* @brief Holds the values of the root key used to verify the JWS signature.
*/
typedef struct AzureIoTJWS_RootKey
{
uint8_t * pucRootKeyId; /**< The pointer to the root key id. */
uint32_t ulRootKeyIdLength; /**< The length of the root key id. */
uint8_t * pucRootKeyN; /**< The pointer to the root key modulus. */
uint32_t ulRootKeyNLength; /**< The length of the root key modulus. */
uint8_t * pucRootKeyExponent; /**< The pointer to the root key exponent. */
uint32_t ulRootKeyExponentLength; /**< The length of the root key exponent. */
} AzureIoTJWS_RootKey_t;
#define azureiotjwsRSA3072_SIZE 384 /**< Size of the RSA 3072 key. */
#define azureiotjwsSHA256_SIZE 32 /**< Size of the SHA256 hash. */
#define azureiotjwsJWS_HEADER_SIZE 1400 /**< Size of the JWS header. */
#define azureiotjwsJWS_PAYLOAD_SIZE 60 /**< Size of the JWS payload. */
#define azureiotjwsJWK_HEADER_SIZE 48 /**< Size of the JWK header. */
#define azureiotjwsJWK_PAYLOAD_SIZE 700 /**< Size of the JWK payload. */
#define azureiotjwsSIGNATURE_SIZE 400 /**< Size of the JWS/JWK signature. */
#define azureiotjwsSIGNING_KEY_E_SIZE 10 /**< Size of the signed key exponent. */
#define azureiotjwsSIGNING_KEY_N_SIZE azureiotjwsRSA3072_SIZE /**< Size of the signing key modulus. */
#define azureiotjwsSHA_CALCULATION_SCRATCH_SIZE azureiotjwsRSA3072_SIZE + azureiotjwsSHA256_SIZE /**< Size of the sha calculation scratch space. */
/**
* @brief The minimum amount of space needed to authenticate a JWS signature.
*
* @note azureiotjwsJWS_PAYLOAD_SIZE, one azureiotjwsSIGNATURE_SIZE, and one azureiotjwsSHA256_SIZE are excluded since
* they will reuse buffer space.
*/
#define azureiotjwsSCRATCH_BUFFER_SIZE \
( azureiotjwsJWS_HEADER_SIZE + azureiotjwsJWK_HEADER_SIZE + azureiotjwsJWK_PAYLOAD_SIZE \
+ azureiotjwsSIGNATURE_SIZE + azureiotjwsSIGNING_KEY_N_SIZE + azureiotjwsSIGNING_KEY_E_SIZE \
+ azureiotjwsSHA_CALCULATION_SCRATCH_SIZE )
/**
* @brief Authenticate the manifest from ADU.
*
* @param[in] pucManifest The unescaped manifest from the ADU twin property
* (`pucUpdateManifest` from #AzureIoTADUUpdateRequest_t).
* @param[in] ulManifestLength The length of \p pucManifest.
* (`ulUpdateManifestLength` from #AzureIoTADUUpdateRequest_t).
* @param[in] pucJWS The JWS signature used to authenticate \p pucManifest.
* (`pucUpdateManifestSignature` from #AzureIoTADUUpdateRequest_t).
* @param[in] ulJWSLength The length of \p pucJWS.
* (`ulUpdateManifestSignatureLength` from #AzureIoTADUUpdateRequest_t).
* @param[in] xADURootKeys An array of root keys that may be used to verify the payload.
* @param[in] ulADURootKeysLength The length of the array of root keys.
* @param[out] pucScratchBuffer Scratch buffer space for calculations. It should be
* `azureiotjwsSCRATCH_BUFFER_SIZE` in length.
* @param[in] ulScratchBufferLength The length of \p pucScratchBuffer.
* @return AzureIoTResult_t The return value of this function.
* @retval eAzureIoTSuccess if successful.
* @retval Otherwise if failed.
*/
AzureIoTResult_t AzureIoTJWS_ManifestAuthenticate( const uint8_t * pucManifest,
uint32_t ulManifestLength,
uint8_t * pucJWS,
uint32_t ulJWSLength,
AzureIoTJWS_RootKey_t * xADURootKeys,
uint32_t ulADURootKeysLength,
uint8_t * pucScratchBuffer,
uint32_t ulScratchBufferLength );
#endif /* AZURE_IOT_JWS_H */