/* * Copyright (C) 2024 BayLibre SAS * * SPDX-License-Identifier: Apache-2.0 */ #include #include #include #include #include #include #include #include #include #include "jwt.h" static int csprng_wrapper(void *ctx, unsigned char *dest, size_t size) { ARG_UNUSED(ctx); return sys_csrand_get((void *)dest, size); } int jwt_sign_impl(struct jwt_builder *builder, const unsigned char *der_key, size_t der_key_len, unsigned char *sig, size_t sig_size) { int res; mbedtls_pk_context ctx; size_t sig_len_out; mbedtls_pk_init(&ctx); res = mbedtls_pk_parse_key(&ctx, der_key, der_key_len, NULL, 0, csprng_wrapper, NULL); if (res != 0) { return res; } uint8_t hash[32]; /* * The '0' indicates to mbedtls to do a SHA256, instead of * 224. */ res = mbedtls_sha256(builder->base, builder->buf - builder->base, hash, 0); if (res != 0) { return res; } res = mbedtls_pk_sign(&ctx, MBEDTLS_MD_SHA256, hash, sizeof(hash), sig, sig_size, &sig_len_out, csprng_wrapper, NULL); return res; }