-
Notifications
You must be signed in to change notification settings - Fork 1.3k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
lib: app_jwt: add an app core jwt generator and add a sample for usage
Ref: NRFX-6688 Signed-off-by: Aymen LAOUINI <aymen.laouini@nordicsemi.no>
- Loading branch information
1 parent
1d59812
commit be3bd43
Showing
18 changed files
with
1,290 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,61 @@ | ||
.. _app_jwt: | ||
|
||
Application JWT | ||
################### | ||
|
||
The Application JWT library provides access to the `JSON Web Token (JWT)`_ generation feature from application core using signing and identity services from secure core. | ||
|
||
Configuration | ||
************* | ||
|
||
To use the library to request a JWT, complete the following steps: | ||
|
||
1. Set the following Kconfig options to enable the library: | ||
|
||
* :kconfig:option:`CONFIG_APP_JWT` | ||
* :kconfig:option:`CONFIG_APP_JWT_VERIFY_SIGNATURE` | ||
* :kconfig:option:`CONFIG_APP_JWT_PRINT_EXPORTED_PUBKEY_DER` | ||
* :kconfig:option:`CONFIG_NRF_SECURITY` | ||
* :Kconfig:option:`CONFIG_SSF_PSA_CRYPTO_SERVICE_ENABLED` | ||
* :Kconfig:option:`CONFIG_SSF_DEVICE_INFO_SERVICE_ENABLED` | ||
|
||
#. Read the device UUID (:c:func:`app_jwt_get_uuid`) | ||
#. Populate the :c:struct:`jwt_data` structure with your desired values. | ||
See `Possible structure values`_ for more information. | ||
#. Pass the structure to the function that generates JWT (:c:func:`app_jwt_generate`). | ||
|
||
If the function executes successfully, :c:member:`jwt_data.jwt_buf` will contain the JSON Web Token. | ||
|
||
Possible structure values | ||
========================= | ||
|
||
You can configure the following values in the :c:struct:`jwt_data` structure: | ||
|
||
* :c:member:`jwt_data.sec_tag` - Optional, kept for compatibility reasons. | ||
The ``sec_tag`` must contain a valid signing key. | ||
Will always be ignored, the library will use the IAK for signing. | ||
* :c:member:`jwt_data.key` - Required if ``sec_tag`` is not zero. | ||
Defines the type of key in the sec tag. | ||
Will always be ignored, the library will use the IAK for signing. | ||
* :c:member:`jwt_data.alg` - Required, always use the value JWT_ALG_TYPE_ES256. | ||
Defines the JWT signing algorithm. Currently, only ECDSA 256 is supported. | ||
* :c:member:`jwt_data.subject` - Optional. | ||
Corresponds to ``sub`` claim. | ||
Use ``NULL`` if you want to leave out this field. | ||
* :c:member:`jwt_data.audience` - Optional. | ||
Corresponds to ``aud`` claim. | ||
Use ``NULL`` if you want to leave out this field. | ||
* :c:member:`jwt_data.jwt_buf` - Required. | ||
Buffer for the generated, null-terminated, JWT string. | ||
Buffer size has to be al least 600 bytes, at most 900 bytes. | ||
The user has to provide a valid buffer, library doesn't do any allocation. | ||
* :c:member:`jwt_data.jwt_sz` - Size of JWT buffer. | ||
Required, has to be equal to the size of :c:member:`jwt_data.jwt_buf`. | ||
|
||
API documentation | ||
***************** | ||
|
||
| Header file: :file:`include/app_jwt.h` | ||
| Source file: :file:`lib/app_jwt/app_jwt.c` | ||
.. doxygengroup:: app_jwt |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,11 @@ | ||
.. _lib_app_jwt: | ||
|
||
Library Application JWT | ||
######################## | ||
|
||
.. toctree:: | ||
:maxdepth: 1 | ||
:glob: | ||
:caption: Subpages: | ||
|
||
* |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,126 @@ | ||
/* | ||
* Copyright (c) 2024 Nordic Semiconductor ASA | ||
* | ||
* SPDX-License-Identifier: LicenseRef-Nordic-5-Clause | ||
*/ | ||
|
||
#ifndef _APP_JWT_H | ||
#define _APP_JWT_H | ||
|
||
#ifdef __cplusplus | ||
extern "C" { | ||
#endif | ||
|
||
/** | ||
* @file app_jwt.h | ||
* | ||
* @brief Generate a JWT with from application core. | ||
* @defgroup app_jwt JWT generation | ||
* @{ | ||
* | ||
*/ | ||
|
||
#include <stdint.h> | ||
#include <strings.h> | ||
|
||
/** @brief Maximum size of a JWT string, could be used to allocate JWT | ||
* output buffer. | ||
*/ | ||
#define APP_JWT_STR_MAX_LEN 900 | ||
|
||
/** @brief Maximum valid duration for JWTs generated by user application */ | ||
#define APP_JWT_VALID_TIME_S_MAX (7 * 24 * 60 * 60) | ||
|
||
/** @brief Default valid duration for JWTs generated by user application */ | ||
#define APP_JWT_VALID_TIME_S_DEF (10 * 60) | ||
|
||
/** @brief UUID size in bytes */ | ||
#define APP_JWT_UUID_BYTE_SZ 16 | ||
|
||
/** @brief UUID v4 format: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx */ | ||
#define APP_JWT_UUID_V4_STR_LEN ((APP_JWT_UUID_BYTE_SZ * 2) + 4) | ||
|
||
/** @brief The type of key to be used for signing the JWT. */ | ||
enum app_jwt_key_type { | ||
JWT_KEY_TYPE_CLIENT_PRIV = 2, | ||
JWT_KEY_TYPE_ENDORSEMENT = 8, | ||
}; | ||
|
||
/**@brief JWT signing algorithm */ | ||
enum app_jwt_alg_type { | ||
JWT_ALG_TYPE_ES256 = 0, | ||
}; | ||
|
||
/** @brief JWT parameters required for JWT generation and pointer to generated JWT */ | ||
struct app_jwt_data { | ||
/** Sec tag to use for JWT signing */ | ||
unsigned int sec_tag; | ||
/** Key type in the specified sec tag */ | ||
enum app_jwt_key_type key; | ||
/** JWT signing algorithm */ | ||
enum app_jwt_alg_type alg; | ||
|
||
/** Defines how long the JWT will be valid; in seconds (from generation). | ||
* The 'iat' and 'exp' claims will be populated only if the application has a | ||
* valid date and time. | ||
*/ | ||
uint32_t validity_s; | ||
|
||
/** NULL terminated 'sub' claim; the principal that is the subject of the JWT */ | ||
const char *subject; | ||
/** NULL terminated 'aud' claim; intended recipient of the JWT */ | ||
const char *audience; | ||
|
||
/** Buffer to which the NULL terminated JWT will be copied. | ||
* It is the responsibility of the user to provide a valid buffer. | ||
* The returned JWT could be as long as 900 bytes, use the | ||
* defined size value APP_JWT_STR_MAX_LEN to create your supplied return buffer. | ||
*/ | ||
char *jwt_buf; | ||
/** Size of the user provided buffer. */ | ||
size_t jwt_sz; | ||
}; | ||
|
||
/** | ||
* @brief Generates a JWT using the supplied parameters. If successful, | ||
* the JWT string will be stored in the supplied struct. | ||
* The user is responsible for providing a valid pointer to store the JWT. | ||
* | ||
* Subject and audience fields may be NULL in which case those fields are left out | ||
* from generated JWT token. | ||
* | ||
* JWT is signed with the application identity attestation key, no matter what | ||
* value is supplied in the sec_tag. | ||
* | ||
* @param[in,out] jwt Pointer to struct containing JWT parameters and result. | ||
* | ||
* @retval 0 If the operation was successful. | ||
* Otherwise, a (negative) error code is returned. | ||
*/ | ||
int app_jwt_generate(struct app_jwt_data *const jwt); | ||
|
||
/** | ||
* @brief Gets the device UUID from the secure domain | ||
* and returns it as a NULL terminated string in the supplied buffer. | ||
* The device UUID can be used as a device identifier for cloud services and | ||
* for secure device management using the nRF Cloud Identity Service. | ||
* | ||
* UUID v4 defined by ITU-T X.667 | ISO/IEC 9834-8 has a length of 35 bytes, add | ||
* 1 byte for the atring termination character. User is expected to provide a buffer | ||
* of at least 36 bytes. | ||
* | ||
* @param[out] uuid_buffer Pointer to buffer where the device UUID string will be written to. | ||
* @param[in] uuid_buffer_size Size of the provided buffer. | ||
* | ||
* @retval 0 If the operation was successful. | ||
* Otherwise, a (negative) error code is returned. | ||
*/ | ||
int app_jwt_get_uuid(char *uuid_buffer, const size_t uuid_buffer_size); | ||
|
||
/** @} */ | ||
|
||
#ifdef __cplusplus | ||
} | ||
#endif | ||
|
||
#endif /* _APP_JWT_H */ |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,11 @@ | ||
# | ||
# Copyright (c) 2024 Nordic Semiconductor ASA | ||
# | ||
# SPDX-License-Identifier: LicenseRef-Nordic-5-Clause | ||
# | ||
|
||
zephyr_library() | ||
|
||
zephyr_library_sources( | ||
app_jwt.c | ||
) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,30 @@ | ||
# | ||
# Copyright (c) 2024 Nordic Semiconductor ASA | ||
# | ||
# SPDX-License-Identifier: LicenseRef-Nordic-5-Clause | ||
# | ||
|
||
menuconfig APP_JWT | ||
bool "Application JWT Library" | ||
depends on SSF_CLIENT && SSF_PSA_CRYPTO_SERVICE_ENABLED && SSF_DEVICE_INFO_SERVICE_ENABLED | ||
select BASE64 | ||
select CJSON_LIB | ||
# needed to print integer values in JSON | ||
select CBPRINTF_FP_SUPPORT | ||
select POSIX_API | ||
|
||
if APP_JWT | ||
|
||
config APP_JWT_VERIFY_SIGNATURE | ||
bool "Verify signature after signing" | ||
default y | ||
|
||
config APP_JWT_PRINT_EXPORTED_PUBKEY_DER | ||
bool "Print to terminal the DER formatted public key" | ||
default n | ||
|
||
module=APP_JWT | ||
module-str=User App JWT | ||
source "${ZEPHYR_BASE}/subsys/logging/Kconfig.template.log_config" | ||
|
||
endif # APP_JWT |
Oops, something went wrong.