1
0
mirror of https://github.com/Mbed-TLS/mbedtls.git synced 2025-07-29 11:41:15 +03:00

Add MBEDTLS_LMS_PRIVATE define

To enable private key operations

Signed-off-by: Raef Coles <raef.coles@arm.com>
This commit is contained in:
Raef Coles
2022-09-01 12:24:31 +01:00
parent ebd35b5b80
commit ab4f87413a
8 changed files with 104 additions and 72 deletions

View File

@ -455,6 +455,8 @@ int mbedtls_lmots_verify( mbedtls_lmots_public_t *ctx, const unsigned char *msg,
return( 0 );
}
#ifdef MBEDTLS_LMS_PRIVATE
void mbedtls_lmots_init_private( mbedtls_lmots_private_t *ctx )
{
mbedtls_platform_zeroize( ctx, sizeof( mbedtls_lmots_private_t ) ) ;
@ -716,4 +718,5 @@ int mbedtls_lmots_sign( mbedtls_lmots_private_t *ctx,
return( 0 );
}
#endif /* MBEDTLS_LMS_PRIVATE */
#endif /* MBEDTLS_LMS_C */

View File

@ -101,6 +101,7 @@ typedef struct {
Boolean values only. */
} mbedtls_lmots_public_t;
#ifdef MBEDTLS_LMS_PRIVATE
/** LMOTS private context structure.
*
* A LMOTS private key is one hash output for each of digit of the digest +
@ -124,6 +125,7 @@ typedef struct {
unsigned char MBEDTLS_PRIVATE(have_private_key); /*!< Whether the context contains a private key.
Boolean values only. */
} mbedtls_lmots_private_t;
#endif /* MBEDTLS_LMS_PRIVATE */
/**
* \brief This function converts an unsigned int into a
@ -256,6 +258,8 @@ int mbedtls_lmots_verify( mbedtls_lmots_public_t *ctx, const unsigned char *msg,
size_t msg_size, const unsigned char *sig,
size_t sig_size );
#ifdef MBEDTLS_LMS_PRIVATE
/**
* \brief This function initializes a private LMOTS context
*
@ -375,6 +379,7 @@ int mbedtls_lmots_sign( mbedtls_lmots_private_t *ctx,
void *p_rng, const unsigned char *msg, size_t msg_size,
unsigned char *sig, size_t sig_size, size_t* sig_len );
#endif /* MBEDTLS_LMS_PRIVATE */
#ifdef __cplusplus
}

View File

@ -177,74 +177,6 @@ exit:
return ret;
}
static int calculate_merkle_tree( mbedtls_lms_private_t *ctx,
unsigned char tree[MERKLE_TREE_NODE_AM][MBEDTLS_LMS_M_NODE_BYTES] )
{
unsigned int priv_key_idx;
unsigned int r_node_idx;
int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
/* First create the leaf nodes, in ascending order */
for( priv_key_idx = 0; priv_key_idx < MERKLE_TREE_INTERNAL_NODE_AM;
priv_key_idx++ )
{
r_node_idx = MERKLE_TREE_INTERNAL_NODE_AM + priv_key_idx;
ret = create_merkle_leaf_value(
ctx->params.I_key_identifier,
ctx->ots_public_keys[priv_key_idx].public_key,
r_node_idx, tree[r_node_idx] );
if( ret )
{
return( ret );
}
}
/* Then the internal nodes, in reverse order so that we can guarantee the
* parent has been created */
for( r_node_idx = MERKLE_TREE_INTERNAL_NODE_AM - 1; r_node_idx > 0;
r_node_idx-- )
{
ret = create_merkle_internal_value(
ctx->params.I_key_identifier,
tree[(r_node_idx * 2)], tree[(r_node_idx * 2 + 1)], r_node_idx, tree[r_node_idx] );
if( ret )
{
return( ret );
}
}
return( 0 );
}
static int get_merkle_path( mbedtls_lms_private_t *ctx,
unsigned int leaf_node_id,
unsigned char path[MBEDTLS_LMS_H_TREE_HEIGHT][MBEDTLS_LMS_M_NODE_BYTES] )
{
unsigned char tree[MERKLE_TREE_NODE_AM][MBEDTLS_LMS_M_NODE_BYTES];
unsigned int curr_node_id = leaf_node_id;
unsigned int adjacent_node_id;
unsigned int height;
int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
ret = calculate_merkle_tree( ctx, tree);
if( ret )
{
return( ret );
}
for( height = 0; height < MBEDTLS_LMS_H_TREE_HEIGHT; height++ )
{
adjacent_node_id = curr_node_id ^ 1;
memcpy( &path[height], &tree[adjacent_node_id], MBEDTLS_LMOTS_N_HASH_LEN );
curr_node_id >>=1;
}
return( 0 );
}
void mbedtls_lms_init_public( mbedtls_lms_public_t *ctx )
{
mbedtls_platform_zeroize( ctx, sizeof( mbedtls_lms_public_t ) ) ;
@ -409,6 +341,76 @@ int mbedtls_lms_verify( const mbedtls_lms_public_t *ctx,
return( 0 );
}
#ifdef MBEDTLS_LMS_PRIVATE
static int calculate_merkle_tree( mbedtls_lms_private_t *ctx,
unsigned char tree[MERKLE_TREE_NODE_AM][MBEDTLS_LMS_M_NODE_BYTES] )
{
unsigned int priv_key_idx;
unsigned int r_node_idx;
int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
/* First create the leaf nodes, in ascending order */
for( priv_key_idx = 0; priv_key_idx < MERKLE_TREE_INTERNAL_NODE_AM;
priv_key_idx++ )
{
r_node_idx = MERKLE_TREE_INTERNAL_NODE_AM + priv_key_idx;
ret = create_merkle_leaf_value(
ctx->params.I_key_identifier,
ctx->ots_public_keys[priv_key_idx].public_key,
r_node_idx, tree[r_node_idx] );
if( ret )
{
return( ret );
}
}
/* Then the internal nodes, in reverse order so that we can guarantee the
* parent has been created */
for( r_node_idx = MERKLE_TREE_INTERNAL_NODE_AM - 1; r_node_idx > 0;
r_node_idx-- )
{
ret = create_merkle_internal_value(
ctx->params.I_key_identifier,
tree[(r_node_idx * 2)], tree[(r_node_idx * 2 + 1)], r_node_idx, tree[r_node_idx] );
if( ret )
{
return( ret );
}
}
return( 0 );
}
static int get_merkle_path( mbedtls_lms_private_t *ctx,
unsigned int leaf_node_id,
unsigned char path[MBEDTLS_LMS_H_TREE_HEIGHT][MBEDTLS_LMS_M_NODE_BYTES] )
{
unsigned char tree[MERKLE_TREE_NODE_AM][MBEDTLS_LMS_M_NODE_BYTES];
unsigned int curr_node_id = leaf_node_id;
unsigned int adjacent_node_id;
unsigned int height;
int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED;
ret = calculate_merkle_tree( ctx, tree);
if( ret )
{
return( ret );
}
for( height = 0; height < MBEDTLS_LMS_H_TREE_HEIGHT; height++ )
{
adjacent_node_id = curr_node_id ^ 1;
memcpy( &path[height], &tree[adjacent_node_id], MBEDTLS_LMOTS_N_HASH_LEN );
curr_node_id >>=1;
}
return( 0 );
}
void mbedtls_lms_init_private( mbedtls_lms_private_t *ctx )
{
mbedtls_platform_zeroize( ctx, sizeof( mbedtls_lms_public_t ) ) ;
@ -668,4 +670,5 @@ int mbedtls_lms_sign( mbedtls_lms_private_t *ctx,
return( 0 );
}
#endif /* MBEDTLS_LMS_PRIVATE */
#endif /* MBEDTLS_LMS_C */