/* * Copyright (c) 2018 Linaro Ltd * * SPDX-License-Identifier: Apache-2.0 */ #ifndef ZEPHYR_INCLUDE_DATA_JWT_H_ #define ZEPHYR_INCLUDE_DATA_JWT_H_ #include #include #ifdef __cplusplus extern "C" { #endif /** * @brief JSON Web Token (JWT) * @defgroup jwt JSON Web Token (JWT) * @ingroup json * @{ */ /** * @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_ */