|
|
|
|
@ -7,14 +7,15 @@
|
|
|
|
|
#include <tinycrypt/ccm_mode.h> |
|
|
|
|
#include <tinycrypt/constants.h> |
|
|
|
|
#include <tinycrypt/ecc_platform_specific.h> |
|
|
|
|
#include <tinycrypt/sha256.h> |
|
|
|
|
#include <string.h> |
|
|
|
|
#include <stddef.h> |
|
|
|
|
#include <sys/types.h> |
|
|
|
|
#include <unistd.h> |
|
|
|
|
#include <sys/time.h> |
|
|
|
|
#include "crc32.h" |
|
|
|
|
#include <stdio.h> |
|
|
|
|
#include <fcntl.h> |
|
|
|
|
#include "sha256.h" |
|
|
|
|
#include "crc32.h" |
|
|
|
|
|
|
|
|
|
static const struct uECC_Curve_t *curve = NULL; |
|
|
|
|
static uint8_t sc_urandom_seed[8] = {0}; |
|
|
|
|
@ -68,9 +69,9 @@ static int sc_validate_key(const uint8_t *public_key)
|
|
|
|
|
return uECC_valid_public_key(public_key, curve); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
sc_status_t sc_generate_keypair(struct SC_MYKEYS *ctx) |
|
|
|
|
sc_status_t sc_generate_keypair(struct SC_MYKEYS *pk) |
|
|
|
|
{ |
|
|
|
|
if (!ctx) { |
|
|
|
|
if (!pk) { |
|
|
|
|
return SC_ERR_INVALID_ARG; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
@ -81,7 +82,7 @@ sc_status_t sc_generate_keypair(struct SC_MYKEYS *ctx)
|
|
|
|
|
/* Set custom RNG function */ |
|
|
|
|
uECC_set_rng(sc_rng); |
|
|
|
|
|
|
|
|
|
if (!uECC_make_key(ctx->pk->public_key, ctx->pk->private_key, curve)) { |
|
|
|
|
if (!uECC_make_key(pk->public_key, pk->private_key, curve)) { |
|
|
|
|
return SC_ERR_CRYPTO; |
|
|
|
|
} |
|
|
|
|
return SC_OK; |
|
|
|
|
@ -100,7 +101,7 @@ static int hex_to_binary(const char *hex_str, uint8_t *binary, size_t binary_len
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
sc_status_t sc_init_local_keys(struct SC_MYKEYS *mykeys, const char *public_key, const char *private_key) { |
|
|
|
|
if (!ctx || !public_key || !private_key) { |
|
|
|
|
if (!mykeys || !public_key || !private_key) { |
|
|
|
|
return SC_ERR_INVALID_ARG; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
@ -157,7 +158,10 @@ sc_status_t sc_set_peer_public_key(sc_context_t *ctx, const char *peer_public_ke
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/* Compute shared secret using ECDH */ |
|
|
|
|
if (!uECC_shared_secret(peer_public_key, ctx->private_key, |
|
|
|
|
if (!ctx->pk) { |
|
|
|
|
return SC_ERR_NOT_INITIALIZED; |
|
|
|
|
} |
|
|
|
|
if (!uECC_shared_secret(peer_public_key, ctx->pk->private_key, |
|
|
|
|
shared_secret, curve)) { |
|
|
|
|
return SC_ERR_CRYPTO; |
|
|
|
|
} |
|
|
|
|
@ -176,7 +180,7 @@ sc_status_t sc_set_peer_public_key(sc_context_t *ctx, const char *peer_public_ke
|
|
|
|
|
|
|
|
|
|
static void sc_build_nonce(uint64_t counter, uint8_t *nonce_out) |
|
|
|
|
{ |
|
|
|
|
SHA256_CTX sha_ctx; |
|
|
|
|
struct tc_sha256_state_struct sha_ctx; |
|
|
|
|
uint8_t hash[32]; |
|
|
|
|
struct timeval tv; |
|
|
|
|
uint8_t data[8 + 8 + 4]; |
|
|
|
|
@ -201,9 +205,9 @@ static void sc_build_nonce(uint64_t counter, uint8_t *nonce_out)
|
|
|
|
|
data[18] = (tv.tv_sec >> 16) & 0xFF; |
|
|
|
|
data[19] = (tv.tv_sec >> 24) & 0xFF; |
|
|
|
|
|
|
|
|
|
sha256_init(&sha_ctx); |
|
|
|
|
sha256_update(&sha_ctx, data, 20); |
|
|
|
|
sha256_final(&sha_ctx, hash); |
|
|
|
|
tc_sha256_init(&sha_ctx); |
|
|
|
|
tc_sha256_update(&sha_ctx, data, 20); |
|
|
|
|
tc_sha256_final(hash, &sha_ctx); |
|
|
|
|
|
|
|
|
|
memcpy(nonce_out, hash, SC_NONCE_SIZE); |
|
|
|
|
} |
|
|
|
|
@ -217,7 +221,6 @@ sc_status_t sc_encrypt(sc_context_t *ctx,
|
|
|
|
|
uint8_t nonce[SC_NONCE_SIZE]; |
|
|
|
|
struct tc_aes_key_sched_struct sched; |
|
|
|
|
struct tc_ccm_mode_struct ccm_state; |
|
|
|
|
TCCcmMode_t c = &ccm_state; |
|
|
|
|
size_t total_plaintext_len = plaintext_len + SC_CRC32_SIZE; |
|
|
|
|
uint8_t plaintext_with_crc[total_plaintext_len]; |
|
|
|
|
uint8_t combined_output[total_plaintext_len + SC_TAG_SIZE]; |
|
|
|
|
@ -251,7 +254,7 @@ sc_status_t sc_encrypt(sc_context_t *ctx,
|
|
|
|
|
sc_build_nonce(ctx->tx_counter, nonce); |
|
|
|
|
|
|
|
|
|
/* Configure CCM mode */ |
|
|
|
|
if (tc_ccm_config(c, &sched, nonce, SC_NONCE_SIZE, SC_TAG_SIZE) != TC_CRYPTO_SUCCESS) { |
|
|
|
|
if (tc_ccm_config(&ccm_state, &sched, nonce, SC_NONCE_SIZE, SC_TAG_SIZE) != TC_CRYPTO_SUCCESS) { |
|
|
|
|
return SC_ERR_CRYPTO; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
@ -259,7 +262,7 @@ sc_status_t sc_encrypt(sc_context_t *ctx,
|
|
|
|
|
if (tc_ccm_generation_encryption(combined_output, sizeof(combined_output), |
|
|
|
|
NULL, 0, /* no associated data */ |
|
|
|
|
plaintext_with_crc, total_plaintext_len, |
|
|
|
|
c) != TC_CRYPTO_SUCCESS) { |
|
|
|
|
&ccm_state) != TC_CRYPTO_SUCCESS) { |
|
|
|
|
return SC_ERR_CRYPTO; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|