|  | /* | 
|  | * Copyright (C) 2024 BayLibre SAS | 
|  | * | 
|  | * SPDX-License-Identifier: Apache-2.0 | 
|  | */ | 
|  |  | 
|  | #include <string.h> | 
|  | #include <zephyr/types.h> | 
|  | #include <errno.h> | 
|  |  | 
|  | #include <zephyr/data/jwt.h> | 
|  | #include <zephyr/data/json.h> | 
|  |  | 
|  | #include <mbedtls/pk.h> | 
|  | #include <mbedtls/rsa.h> | 
|  | #include <mbedtls/sha256.h> | 
|  | #include <zephyr/random/random.h> | 
|  |  | 
|  | #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; | 
|  | } |