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

Commit a9480a6

Browse files
committed
feat(crypto): Implement ECDSA component
1 parent 94840cd commit a9480a6

File tree

12 files changed

+422
-146
lines changed

12 files changed

+422
-146
lines changed

common/ta_errors.c

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -200,10 +200,14 @@ const char* ta_error_to_string(status_t err) {
200200
// Crypto
201201
case SC_CRYPTO_RAND_INIT:
202202
return "Failed to generate random number generator";
203-
case SC_CRYPTO_GEN_PKEY:
203+
case SC_CRYPTO_GEN_KEY:
204204
return "Failed to generate ECDH public key";
205205
case SC_CRYPTO_COMPUTE_SECRET:
206206
return "Failed to compute ECDH shared secret";
207+
case SC_CRYPTO_HASH:
208+
return "Failed to hash";
209+
case SC_CRYPTO_ECDSA_SIGN:
210+
return "Failed to sign with ECDSA";
207211

208212
default:
209213
return "Unknown error.";

common/ta_errors.h

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -259,10 +259,14 @@ typedef enum {
259259
// Crypto module
260260
SC_CRYPTO_RAND_INIT = 0x01 | SC_MODULE_CRYPTO | SC_SEVERITY_FATAL,
261261
/**< Failed to generate random number generator */
262-
SC_CRYPTO_GEN_PKEY = 0x02 | SC_MODULE_CRYPTO | SC_SEVERITY_FATAL,
263-
/**< Failed to generate ECDH public key */
262+
SC_CRYPTO_GEN_KEY = 0x02 | SC_MODULE_CRYPTO | SC_SEVERITY_FATAL,
263+
/**< Failed to generate ECDH public key, or ECDSA key pair */
264264
SC_CRYPTO_COMPUTE_SECRET = 0x03 | SC_MODULE_CRYPTO | SC_SEVERITY_FATAL,
265265
/**< Failed to compute ECDH shared secret */
266+
SC_CRYPTO_HASH = 0x04 | SC_MODULE_CRYPTO | SC_SEVERITY_FATAL,
267+
/**< Failed to hash */
268+
SC_CRYPTO_ECDSA_SIGN = 0x05 | SC_MODULE_CRYPTO | SC_SEVERITY_FATAL,
269+
/**< Failed to sign with ECDSA */
266270

267271
} status_t;
268272

crypto/BUILD

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,30 @@ cc_library(
33
srcs = ["ecdh.c"],
44
hdrs = ["ecdh.h"],
55
visibility = ["//visibility:public"],
6+
deps = [
7+
":randomness",
8+
"//common",
9+
"@mbedtls",
10+
],
11+
)
12+
13+
cc_library(
14+
name = "ecdsa",
15+
srcs = ["ecdsa.c"],
16+
hdrs = ["ecdsa.h"],
17+
visibility = ["//visibility:public"],
18+
deps = [
19+
":randomness",
20+
"//common",
21+
"@mbedtls",
22+
],
23+
)
24+
25+
cc_library(
26+
name = "randomness",
27+
srcs = ["randomness.c"],
28+
hdrs = ["randomness.h"],
29+
visibility = ["//visibility:public"],
630
deps = [
731
"//common",
832
"@mbedtls",

crypto/ecdh.c

Lines changed: 4 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -1,31 +1,6 @@
11
#include "ecdh.h"
22

3-
#define ECDH_LOGGER "ecdh"
4-
static logger_id_t logger_id;
5-
6-
void ecdh_logger_init() { logger_id = logger_helper_enable(ECDH_LOGGER, LOGGER_DEBUG, true); }
7-
8-
int ecdh_logger_release() {
9-
logger_helper_release(logger_id);
10-
return 0;
11-
}
12-
13-
status_t rand_num_gen_init(mbedtls_entropy_context *entropy, mbedtls_ctr_drbg_context *ctr_drbg, char *rand_seed,
14-
uint16_t seed_len) {
15-
int ret = 1;
16-
status_t sc = SC_OK;
17-
18-
mbedtls_ctr_drbg_init(ctr_drbg);
19-
mbedtls_entropy_init(entropy);
20-
21-
if ((ret = mbedtls_ctr_drbg_seed(ctr_drbg, mbedtls_entropy_func, entropy, (const unsigned char *)rand_seed,
22-
seed_len)) != 0) {
23-
ta_log_error("mbedtls_ctr_drbg_seed returned %d\n", ret);
24-
sc = SC_CRYPTO_RAND_INIT;
25-
}
26-
27-
return sc;
28-
}
3+
#define logger_id crypto_logger_id
294

305
status_t ecdh_gen_public_key(mbedtls_ecdh_context *ctx, mbedtls_ctr_drbg_context *ctr_drbg, unsigned char *pkey) {
316
int ret = 1;
@@ -34,21 +9,21 @@ status_t ecdh_gen_public_key(mbedtls_ecdh_context *ctx, mbedtls_ctr_drbg_context
349
ret = mbedtls_ecp_group_load(&ctx->grp, MBEDTLS_ECP_DP_CURVE25519);
3510
if (ret != 0) {
3611
ta_log_error("mbedtls_ecp_group_load returned %d\n", ret);
37-
sc = SC_CRYPTO_GEN_PKEY;
12+
sc = SC_CRYPTO_GEN_KEY;
3813
goto exit;
3914
}
4015

4116
ret = mbedtls_ecdh_gen_public(&ctx->grp, &ctx->d, &ctx->Q, mbedtls_ctr_drbg_random, ctr_drbg);
4217
if (ret != 0) {
4318
ta_log_error("mbedtls_ecdh_gen_public returned %d\n", ret);
44-
sc = SC_CRYPTO_GEN_PKEY;
19+
sc = SC_CRYPTO_GEN_KEY;
4520
goto exit;
4621
}
4722

4823
ret = mbedtls_mpi_write_binary(&ctx->Q.X, pkey, SHARE_DATA_LEN);
4924
if (ret != 0) {
5025
ta_log_error("mbedtls_mpi_write_binary returned %d\n", ret);
51-
sc = SC_CRYPTO_GEN_PKEY;
26+
sc = SC_CRYPTO_GEN_KEY;
5227
}
5328

5429
exit:
@@ -83,8 +58,3 @@ status_t ecdh_compute_shared_secret(mbedtls_ecdh_context *ctx, mbedtls_ctr_drbg_
8358
exit:
8459
return sc;
8560
}
86-
87-
void rand_num_gen_release(mbedtls_entropy_context *entropy, mbedtls_ctr_drbg_context *ctr_drbg) {
88-
mbedtls_ctr_drbg_free(ctr_drbg);
89-
mbedtls_entropy_free(entropy);
90-
}

crypto/ecdh.h

Lines changed: 4 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,8 @@
66
* "LICENSE" at the root of this distribution.
77
*/
88

9-
#ifndef ECDH_COMMON_H
10-
#define ECDH_COMMON_H
9+
#ifndef ECDH_ECDH_H
10+
#define ECDH_ECDH_H
1111

1212
#include "common/logger.h"
1313
#include "common/ta_errors.h"
@@ -16,47 +16,14 @@
1616
#include "mbedtls/ecdh.h"
1717
#include "mbedtls/entropy.h"
1818
#include "mbedtls/platform.h"
19+
#include "randomness.h"
1920

2021
#ifdef __cplusplus
2122
extern "C" {
2223
#endif
2324

2425
#define SHARE_DATA_LEN 32
2526

26-
typedef struct rand_gen_s {
27-
mbedtls_entropy_context entropy;
28-
mbedtls_ctr_drbg_context ctr_drbg;
29-
} rand_gen_t;
30-
31-
/**
32-
* Initialize logger for ECDH
33-
*/
34-
void ecdh_logger_init();
35-
36-
/**
37-
* Release logger
38-
*
39-
* @return
40-
* - zero on success
41-
* - EXIT_FAILURE on error
42-
*/
43-
int ecdh_logger_release();
44-
45-
/**
46-
* @brief Initialize mbedtls random number generator
47-
*
48-
* @param[in] entropy Entropy contrext for randomess
49-
* @param[in] ctr_drbg Counter-mode block-cipher-based Deterministic Random Bit Generator object
50-
* @param[in] rand_seed Random seed for random number generator
51-
* @param[in] seed_len The length of random seed
52-
*
53-
* @return
54-
* - SC_OK on success
55-
* - non-zero on error
56-
*/
57-
status_t rand_num_gen_init(mbedtls_entropy_context *entropy, mbedtls_ctr_drbg_context *ctr_drbg, char *rand_seed,
58-
uint16_t seed_len);
59-
6027
/**
6128
* @brief Initialize ECDH context and generate ECDH keypair
6229
*
@@ -84,20 +51,8 @@ status_t ecdh_gen_public_key(mbedtls_ecdh_context *ctx, mbedtls_ctr_drbg_context
8451
status_t ecdh_compute_shared_secret(mbedtls_ecdh_context *ctx, mbedtls_ctr_drbg_context *ctr_drbg,
8552
unsigned char *input_shared_data);
8653

87-
/**
88-
* @brief Release random number generator
89-
*
90-
* @param[in] entropy Entropy contrext for randomess
91-
* @param[in] ctr_drbg Counter-mode block-cipher-based Deterministic Random Bit Generator object
92-
*
93-
* @return
94-
* - SC_OK on success
95-
* - non-zero on error
96-
*/
97-
void rand_num_gen_release(mbedtls_entropy_context *entropy, mbedtls_ctr_drbg_context *ctr_drbg);
98-
9954
#ifdef __cplusplus
10055
}
10156
#endif
10257

103-
#endif // ECDH_COMMON_H
58+
#endif // ECDH_ECDH_H

crypto/ecdsa.c

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
#include "ecdsa.h"
2+
3+
#define logger_id crypto_logger_id
4+
5+
static void dump_buf(char *title, unsigned char *buf, const int len) {
6+
char dump[len + 1];
7+
for (int i = 0; i < len; i++) {
8+
dump[i * 2] = "0123456789ABCDEF"[buf[i] / 16];
9+
dump[i * 2 + 1] = "0123456789ABCDEF"[buf[i] % 16];
10+
}
11+
ta_log_debug("%s%s\n", title, dump);
12+
}
13+
14+
status_t ecdsa_gen_key_pair(mbedtls_ecdsa_context *ctx_sign, mbedtls_ctr_drbg_context *ctr_drbg) {
15+
int ret = 1;
16+
status_t sc = SC_OK;
17+
18+
if ((ret = mbedtls_ecdsa_genkey(ctx_sign, MBEDTLS_ECP_DP_SECP192R1, mbedtls_ctr_drbg_random, ctr_drbg)) != 0) {
19+
ta_log_error("mbedtls_ecdsa_genkey returned %d\n", ret);
20+
sc = SC_CRYPTO_GEN_KEY;
21+
}
22+
23+
return sc;
24+
}
25+
26+
status_t compute_sha256(unsigned char *msg, const int msg_len, unsigned char *hash) {
27+
int ret = 1;
28+
status_t sc = SC_OK;
29+
if ((ret = mbedtls_sha256_ret(msg, msg_len, hash, 0)) != 0) {
30+
ta_log_error("mbedtls_sha256_ret returned %d\n", ret);
31+
sc = SC_CRYPTO_HASH;
32+
}
33+
34+
return sc;
35+
}
36+
37+
status_t ecdsa_sign_msg(mbedtls_ecdsa_context *ctx_sign, mbedtls_ctr_drbg_context *ctr_drbg, unsigned char *hash,
38+
const uint16_t hash_len, unsigned char *sig, size_t *sig_len) {
39+
int ret = 1;
40+
status_t sc = SC_OK;
41+
if ((ret = mbedtls_ecdsa_write_signature(ctx_sign, MBEDTLS_MD_SHA256, hash, hash_len, sig, sig_len,
42+
mbedtls_ctr_drbg_random, ctr_drbg)) != 0) {
43+
ta_log_error("mbedtls_ecdsa_write_signature returned %d\n", ret);
44+
sc = SC_CRYPTO_ECDSA_SIGN;
45+
}
46+
47+
return sc;
48+
}

crypto/ecdsa.h

Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
/*
2+
* Copyright (C) 2020 BiiLabs Co., Ltd. and Contributors
3+
* All Rights Reserved.
4+
* This is free software; you can redistribute it and/or modify it under the
5+
* terms of the MIT license. A copy of the license can be found in the file
6+
* "LICENSE" at the root of this distribution.
7+
*/
8+
9+
#include "mbedtls/config.h"
10+
#include "mbedtls/platform.h"
11+
12+
#include "mbedtls/ctr_drbg.h"
13+
#include "mbedtls/ecdsa.h"
14+
#include "mbedtls/entropy.h"
15+
#include "mbedtls/sha256.h"
16+
17+
#include <string.h>
18+
19+
#include "common/logger.h"
20+
#include "common/ta_errors.h"
21+
#include "randomness.h"
22+
23+
#define SHA256_LEN 32
24+
25+
/**
26+
* @brief Generate ECDSA key pair
27+
*
28+
* @param[in] ctx_sign ECDSA context for signing
29+
* @param[in] ctr_drbg Counter-mode block-cipher-based Deterministic Random Bit Generator object
30+
*
31+
* @return
32+
* - SC_OK on success
33+
* - non-zero on error
34+
*/
35+
status_t ecdsa_gen_key_pair(mbedtls_ecdsa_context *ctx_sign, mbedtls_ctr_drbg_context *ctr_drbg);
36+
37+
/**
38+
* @brief Compute SHA256
39+
*
40+
* @param[in] msg Message is going to be hashed
41+
* @param[in] msg_len The length of message
42+
* @param[out] hash The output hash result
43+
*
44+
* @return
45+
* - SC_OK on success
46+
* - non-zero on error
47+
*/
48+
status_t compute_sha256(unsigned char *msg, const int msg_len, unsigned char *hash);
49+
50+
/**
51+
* @brief Sign messega with ECDSA
52+
*
53+
* @param[in] ctx_sign ECDSA context for signing
54+
* @param[in] ctr_drbg Counter-mode block-cipher-based Deterministic Random Bit Generator object
55+
* @param[in] input The input string
56+
* @param[in] input_len The length of input string
57+
* @param[out] sig Output signed message
58+
* @param[out] sig_len The length of signed message
59+
*
60+
* @return
61+
* - SC_OK on success
62+
* - non-zero on error
63+
*/
64+
status_t ecdsa_sign_msg(mbedtls_ecdsa_context *ctx_sign, mbedtls_ctr_drbg_context *ctr_drbg, unsigned char *input,
65+
const uint16_t input_len, unsigned char *sig, size_t *sig_len);

crypto/randomness.c

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
#include "randomness.h"
2+
3+
#define CRYPTO_LOGGER "crypto"
4+
#define logger_id crypto_logger_id
5+
6+
void crypto_logger_init() { logger_id = logger_helper_enable(CRYPTO_LOGGER, LOGGER_DEBUG, true); }
7+
8+
int crypto_logger_release() {
9+
logger_helper_release(logger_id);
10+
return 0;
11+
}
12+
13+
status_t rand_num_gen_init(mbedtls_entropy_context *entropy, mbedtls_ctr_drbg_context *ctr_drbg, char *rand_seed,
14+
uint16_t seed_len) {
15+
int ret = 1;
16+
status_t sc = SC_OK;
17+
18+
mbedtls_ctr_drbg_init(ctr_drbg);
19+
mbedtls_entropy_init(entropy);
20+
21+
if ((ret = mbedtls_ctr_drbg_seed(ctr_drbg, mbedtls_entropy_func, entropy, (const unsigned char *)rand_seed,
22+
seed_len)) != 0) {
23+
ta_log_error("mbedtls_ctr_drbg_seed returned %d\n", ret);
24+
sc = SC_CRYPTO_RAND_INIT;
25+
}
26+
27+
return sc;
28+
}
29+
30+
void rand_num_gen_release(mbedtls_entropy_context *entropy, mbedtls_ctr_drbg_context *ctr_drbg) {
31+
mbedtls_ctr_drbg_free(ctr_drbg);
32+
mbedtls_entropy_free(entropy);
33+
}

0 commit comments

Comments
 (0)