Skip to content
This repository has been archived by the owner on Dec 26, 2022. It is now read-only.

Commit

Permalink
feat(crypto): Implement ECDSA component
Browse files Browse the repository at this point in the history
  • Loading branch information
howjmay committed Aug 6, 2020
1 parent 94840cd commit 9fea9b1
Show file tree
Hide file tree
Showing 12 changed files with 421 additions and 145 deletions.
6 changes: 5 additions & 1 deletion common/ta_errors.c
Original file line number Diff line number Diff line change
Expand Up @@ -200,10 +200,14 @@ const char* ta_error_to_string(status_t err) {
// Crypto
case SC_CRYPTO_RAND_INIT:
return "Failed to generate random number generator";
case SC_CRYPTO_GEN_PKEY:
case SC_CRYPTO_GEN_KEY:
return "Failed to generate ECDH public key";
case SC_CRYPTO_COMPUTE_SECRET:
return "Failed to compute ECDH shared secret";
case SC_CRYPTO_HASH:
return "Failed to hash";
case SC_CRYPTO_ECDSA_SIGN:
return "Failed to sign with ECDSA";

default:
return "Unknown error.";
Expand Down
8 changes: 6 additions & 2 deletions common/ta_errors.h
Original file line number Diff line number Diff line change
Expand Up @@ -259,10 +259,14 @@ typedef enum {
// Crypto module
SC_CRYPTO_RAND_INIT = 0x01 | SC_MODULE_CRYPTO | SC_SEVERITY_FATAL,
/**< Failed to generate random number generator */
SC_CRYPTO_GEN_PKEY = 0x02 | SC_MODULE_CRYPTO | SC_SEVERITY_FATAL,
/**< Failed to generate ECDH public key */
SC_CRYPTO_GEN_KEY = 0x02 | SC_MODULE_CRYPTO | SC_SEVERITY_FATAL,
/**< Failed to generate ECDH public key, or ECDSA key pair */
SC_CRYPTO_COMPUTE_SECRET = 0x03 | SC_MODULE_CRYPTO | SC_SEVERITY_FATAL,
/**< Failed to compute ECDH shared secret */
SC_CRYPTO_HASH = 0x04 | SC_MODULE_CRYPTO | SC_SEVERITY_FATAL,
/**< Failed to hash */
SC_CRYPTO_ECDSA_SIGN = 0x05 | SC_MODULE_CRYPTO | SC_SEVERITY_FATAL,
/**< Failed to sign with ECDSA */

} status_t;

Expand Down
24 changes: 24 additions & 0 deletions crypto/BUILD
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,30 @@ cc_library(
srcs = ["ecdh.c"],
hdrs = ["ecdh.h"],
visibility = ["//visibility:public"],
deps = [
":randomness",
"//common",
"@mbedtls",
],
)

cc_library(
name = "ecdsa",
srcs = ["ecdsa.c"],
hdrs = ["ecdsa.h"],
visibility = ["//visibility:public"],
deps = [
":randomness",
"//common",
"@mbedtls",
],
)

cc_library(
name = "randomness",
srcs = ["randomness.c"],
hdrs = ["randomness.h"],
visibility = ["//visibility:public"],
deps = [
"//common",
"@mbedtls",
Expand Down
38 changes: 4 additions & 34 deletions crypto/ecdh.c
Original file line number Diff line number Diff line change
@@ -1,31 +1,6 @@
#include "ecdh.h"

#define ECDH_LOGGER "ecdh"
static logger_id_t logger_id;

void ecdh_logger_init() { logger_id = logger_helper_enable(ECDH_LOGGER, LOGGER_DEBUG, true); }

int ecdh_logger_release() {
logger_helper_release(logger_id);
return 0;
}

status_t rand_num_gen_init(mbedtls_entropy_context *entropy, mbedtls_ctr_drbg_context *ctr_drbg, char *rand_seed,
uint16_t seed_len) {
int ret = 1;
status_t sc = SC_OK;

mbedtls_ctr_drbg_init(ctr_drbg);
mbedtls_entropy_init(entropy);

if ((ret = mbedtls_ctr_drbg_seed(ctr_drbg, mbedtls_entropy_func, entropy, (const unsigned char *)rand_seed,
seed_len)) != 0) {
ta_log_error("mbedtls_ctr_drbg_seed returned %d\n", ret);
sc = SC_CRYPTO_RAND_INIT;
}

return sc;
}
#define logger_id crypto_logger_id

status_t ecdh_gen_public_key(mbedtls_ecdh_context *ctx, mbedtls_ctr_drbg_context *ctr_drbg, unsigned char *pkey) {
int ret = 1;
Expand All @@ -34,21 +9,21 @@ status_t ecdh_gen_public_key(mbedtls_ecdh_context *ctx, mbedtls_ctr_drbg_context
ret = mbedtls_ecp_group_load(&ctx->grp, MBEDTLS_ECP_DP_CURVE25519);
if (ret != 0) {
ta_log_error("mbedtls_ecp_group_load returned %d\n", ret);
sc = SC_CRYPTO_GEN_PKEY;
sc = SC_CRYPTO_GEN_KEY;
goto exit;
}

ret = mbedtls_ecdh_gen_public(&ctx->grp, &ctx->d, &ctx->Q, mbedtls_ctr_drbg_random, ctr_drbg);
if (ret != 0) {
ta_log_error("mbedtls_ecdh_gen_public returned %d\n", ret);
sc = SC_CRYPTO_GEN_PKEY;
sc = SC_CRYPTO_GEN_KEY;
goto exit;
}

ret = mbedtls_mpi_write_binary(&ctx->Q.X, pkey, SHARE_DATA_LEN);
if (ret != 0) {
ta_log_error("mbedtls_mpi_write_binary returned %d\n", ret);
sc = SC_CRYPTO_GEN_PKEY;
sc = SC_CRYPTO_GEN_KEY;
}

exit:
Expand Down Expand Up @@ -83,8 +58,3 @@ status_t ecdh_compute_shared_secret(mbedtls_ecdh_context *ctx, mbedtls_ctr_drbg_
exit:
return sc;
}

void rand_num_gen_release(mbedtls_entropy_context *entropy, mbedtls_ctr_drbg_context *ctr_drbg) {
mbedtls_ctr_drbg_free(ctr_drbg);
mbedtls_entropy_free(entropy);
}
53 changes: 4 additions & 49 deletions crypto/ecdh.h
Original file line number Diff line number Diff line change
Expand Up @@ -6,8 +6,8 @@
* "LICENSE" at the root of this distribution.
*/

#ifndef ECDH_COMMON_H
#define ECDH_COMMON_H
#ifndef ECDH_ECDH_H
#define ECDH_ECDH_H

#include "common/logger.h"
#include "common/ta_errors.h"
Expand All @@ -16,47 +16,14 @@
#include "mbedtls/ecdh.h"
#include "mbedtls/entropy.h"
#include "mbedtls/platform.h"
#include "randomness.h"

#ifdef __cplusplus
extern "C" {
#endif

#define SHARE_DATA_LEN 32

typedef struct rand_gen_s {
mbedtls_entropy_context entropy;
mbedtls_ctr_drbg_context ctr_drbg;
} rand_gen_t;

/**
* Initialize logger for ECDH
*/
void ecdh_logger_init();

/**
* Release logger
*
* @return
* - zero on success
* - EXIT_FAILURE on error
*/
int ecdh_logger_release();

/**
* @brief Initialize mbedtls random number generator
*
* @param[in] entropy Entropy contrext for randomess
* @param[in] ctr_drbg Counter-mode block-cipher-based Deterministic Random Bit Generator object
* @param[in] rand_seed Random seed for random number generator
* @param[in] seed_len The length of random seed
*
* @return
* - SC_OK on success
* - non-zero on error
*/
status_t rand_num_gen_init(mbedtls_entropy_context *entropy, mbedtls_ctr_drbg_context *ctr_drbg, char *rand_seed,
uint16_t seed_len);

/**
* @brief Initialize ECDH context and generate ECDH keypair
*
Expand Down Expand Up @@ -84,20 +51,8 @@ status_t ecdh_gen_public_key(mbedtls_ecdh_context *ctx, mbedtls_ctr_drbg_context
status_t ecdh_compute_shared_secret(mbedtls_ecdh_context *ctx, mbedtls_ctr_drbg_context *ctr_drbg,
unsigned char *input_shared_data);

/**
* @brief Release random number generator
*
* @param[in] entropy Entropy contrext for randomess
* @param[in] ctr_drbg Counter-mode block-cipher-based Deterministic Random Bit Generator object
*
* @return
* - SC_OK on success
* - non-zero on error
*/
void rand_num_gen_release(mbedtls_entropy_context *entropy, mbedtls_ctr_drbg_context *ctr_drbg);

#ifdef __cplusplus
}
#endif

#endif // ECDH_COMMON_H
#endif // ECDH_ECDH_H
48 changes: 48 additions & 0 deletions crypto/ecdsa.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
#include "ecdsa.h"

#define logger_id crypto_logger_id

static void dump_buf(char *title, unsigned char *buf, const int len) {
char dump[len + 1];
for (int i = 0; i < len; i++) {
dump[i * 2] = "0123456789ABCDEF"[buf[i] / 16];
dump[i * 2 + 1] = "0123456789ABCDEF"[buf[i] % 16];
}
ta_log_debug("%s%s\n", title, dump);
}

status_t ecdsa_gen_key_pair(mbedtls_ecdsa_context *ctx_sign, mbedtls_ctr_drbg_context *ctr_drbg) {
int ret = 1;
status_t sc = SC_OK;

if ((ret = mbedtls_ecdsa_genkey(ctx_sign, MBEDTLS_ECP_DP_SECP192R1, mbedtls_ctr_drbg_random, ctr_drbg)) != 0) {
ta_log_error("mbedtls_ecdsa_genkey returned %d\n", ret);
sc = SC_CRYPTO_GEN_KEY;
}

return sc;
}

status_t compute_sha256(unsigned char *msg, const int msg_len, unsigned char *hash) {
int ret = 1;
status_t sc = SC_OK;
if ((ret = mbedtls_sha256_ret(msg, msg_len, hash, 0)) != 0) {
ta_log_error("mbedtls_sha256_ret returned %d\n", ret);
sc = SC_CRYPTO_HASH;
}

return sc;
}

status_t ecdsa_sign_msg(mbedtls_ecdsa_context *ctx_sign, mbedtls_ctr_drbg_context *ctr_drbg, unsigned char *hash,
const uint16_t hash_len, unsigned char *sig, size_t *sig_len) {
int ret = 1;
status_t sc = SC_OK;
if ((ret = mbedtls_ecdsa_write_signature(ctx_sign, MBEDTLS_MD_SHA256, hash, hash_len, sig, sig_len,
mbedtls_ctr_drbg_random, ctr_drbg)) != 0) {
ta_log_error("mbedtls_ecdsa_write_signature returned %d\n", ret);
sc = SC_CRYPTO_ECDSA_SIGN;
}

return sc;
}
65 changes: 65 additions & 0 deletions crypto/ecdsa.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,65 @@
/*
* Copyright (C) 2020 BiiLabs Co., Ltd. and Contributors
* All Rights Reserved.
* This is free software; you can redistribute it and/or modify it under the
* terms of the MIT license. A copy of the license can be found in the file
* "LICENSE" at the root of this distribution.
*/

#include "mbedtls/config.h"
#include "mbedtls/platform.h"

#include "mbedtls/ctr_drbg.h"
#include "mbedtls/ecdsa.h"
#include "mbedtls/entropy.h"
#include "mbedtls/sha256.h"

#include <string.h>

#include "common/logger.h"
#include "common/ta_errors.h"
#include "randomness.h"

#define SHA256_LEN 32

/**
* @brief Generate ECDSA key pair
*
* @param[in] ctx_sign ECDSA context for signing
* @param[in] ctr_drbg Counter-mode block-cipher-based Deterministic Random Bit Generator object
*
* @return
* - SC_OK on success
* - non-zero on error
*/
status_t ecdsa_gen_key_pair(mbedtls_ecdsa_context *ctx_sign, mbedtls_ctr_drbg_context *ctr_drbg);

/**
* @brief Compute SHA256
*
* @param[in] msg Message is going to be hashed
* @param[in] msg_len The length of message
* @param[out] hash The output hash result
*
* @return
* - SC_OK on success
* - non-zero on error
*/
status_t compute_sha256(unsigned char *msg, const int msg_len, unsigned char *hash);

/**
* @brief Sign messega with ECDSA
*
* @param[in] ctx_sign ECDSA context for signing
* @param[in] ctr_drbg Counter-mode block-cipher-based Deterministic Random Bit Generator object
* @param[in] input The input string
* @param[in] input_len The length of input string
* @param[out] sig Output signed message
* @param[out] sig_len The length of signed message
*
* @return
* - SC_OK on success
* - non-zero on error
*/
status_t ecdsa_sign_msg(mbedtls_ecdsa_context *ctx_sign, mbedtls_ctr_drbg_context *ctr_drbg, unsigned char *input,
const uint16_t input_len, unsigned char *sig, size_t *sig_len);
33 changes: 33 additions & 0 deletions crypto/randomness.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
#include "randomness.h"

#define CRYPTO_LOGGER "crypto"
#define logger_id crypto_logger_id

void crypto_logger_init() { logger_id = logger_helper_enable(CRYPTO_LOGGER, LOGGER_DEBUG, true); }

int crypto_logger_release() {
logger_helper_release(logger_id);
return 0;
}

status_t rand_num_gen_init(mbedtls_entropy_context *entropy, mbedtls_ctr_drbg_context *ctr_drbg, char *rand_seed,
uint16_t seed_len) {
int ret = 1;
status_t sc = SC_OK;

mbedtls_ctr_drbg_init(ctr_drbg);
mbedtls_entropy_init(entropy);

if ((ret = mbedtls_ctr_drbg_seed(ctr_drbg, mbedtls_entropy_func, entropy, (const unsigned char *)rand_seed,
seed_len)) != 0) {
ta_log_error("mbedtls_ctr_drbg_seed returned %d\n", ret);
sc = SC_CRYPTO_RAND_INIT;
}

return sc;
}

void rand_num_gen_release(mbedtls_entropy_context *entropy, mbedtls_ctr_drbg_context *ctr_drbg) {
mbedtls_ctr_drbg_free(ctr_drbg);
mbedtls_entropy_free(entropy);
}
Loading

0 comments on commit 9fea9b1

Please sign in to comment.