|  | /* | 
|  | * Copyright (c) 2018 Linaro Ltd | 
|  | * | 
|  | * SPDX-License-Identifier: Apache-2.0 | 
|  | */ | 
|  |  | 
|  | #ifndef ZEPHYR_INCLUDE_DATA_JWT_H_ | 
|  | #define ZEPHYR_INCLUDE_DATA_JWT_H_ | 
|  |  | 
|  | #include <zephyr/types.h> | 
|  | #include <stdbool.h> | 
|  |  | 
|  | #ifdef __cplusplus | 
|  | extern "C" { | 
|  | #endif | 
|  |  | 
|  | /** | 
|  | * @brief JSON Web Token (JWT) | 
|  | * @defgroup jwt JSON Web Token (JWT) | 
|  | * @ingroup structured_data | 
|  | * @{ | 
|  | */ | 
|  |  | 
|  | /** | 
|  | * @brief JWT data tracking. | 
|  | * | 
|  | * JSON Web Tokens contain several sections, each encoded in base-64. | 
|  | * This structure tracks the token as it is being built, including | 
|  | * limits on the amount of available space.  It should be initialized | 
|  | * with jwt_init(). | 
|  | */ | 
|  | struct jwt_builder { | 
|  | /** The base of the buffer we are writing to. */ | 
|  | char *base; | 
|  |  | 
|  | /** The place in this buffer where we are currently writing. | 
|  | */ | 
|  | char *buf; | 
|  |  | 
|  | /** The length remaining to write. */ | 
|  | size_t len; | 
|  |  | 
|  | /** | 
|  | * Flag that is set if we try to write past the end of the | 
|  | * buffer.  If set, the token is not valid. | 
|  | */ | 
|  | bool overflowed; | 
|  |  | 
|  | /* Pending bytes yet to be converted to base64. */ | 
|  | unsigned char wip[3]; | 
|  |  | 
|  | /* Number of pending bytes. */ | 
|  | int pending; | 
|  | }; | 
|  |  | 
|  | /** | 
|  | * @brief Initialize the JWT builder. | 
|  | * | 
|  | * Initialize the given JWT builder for the creation of a fresh token. | 
|  | * The buffer size should at least be as long as JWT_BUILDER_MAX_SIZE | 
|  | * returns. | 
|  | * | 
|  | * @param builder The builder to initialize. | 
|  | * @param buffer The buffer to write the token to. | 
|  | * @param buffer_size The size of this buffer.  The token will be NULL | 
|  | * terminated, which needs to be allowed for in this size. | 
|  | * | 
|  | * @retval 0 Success | 
|  | * @retval -ENOSPC Buffer is insufficient to initialize | 
|  | */ | 
|  | int jwt_init_builder(struct jwt_builder *builder, | 
|  | char *buffer, | 
|  | size_t buffer_size); | 
|  |  | 
|  | /** | 
|  | * @brief add JWT primary payload. | 
|  | */ | 
|  | int jwt_add_payload(struct jwt_builder *builder, | 
|  | int32_t exp, | 
|  | int32_t iat, | 
|  | const char *aud); | 
|  |  | 
|  | /** | 
|  | * @brief Sign the JWT token. | 
|  | */ | 
|  | int jwt_sign(struct jwt_builder *builder, | 
|  | const char *der_key, | 
|  | size_t der_key_len); | 
|  |  | 
|  |  | 
|  | static inline size_t jwt_payload_len(struct jwt_builder *builder) | 
|  | { | 
|  | return (builder->buf - builder->base); | 
|  | } | 
|  |  | 
|  | #ifdef __cplusplus | 
|  | } | 
|  | #endif | 
|  |  | 
|  | /** | 
|  | * @} | 
|  | */ | 
|  |  | 
|  | #endif /* ZEPHYR_INCLUDE_DATA_JWT_H_ */ |