Nano cryptocurrency C library with P2PoW/DPoW support
1.0.0
|
#include <stdint.h>
#include "mbedtls/sha256.h"
#include "mbedtls/aes.h"
#include "mbedtls/ecdsa.h"
#include "errors.h"
Go to the source code of this file.
Macros | |
#define | F_ENTROPY_TYPE_PARANOIC (uint32_t)1477682819 |
#define | F_ENTROPY_TYPE_EXCELENT (uint32_t)1476885281 |
#define | F_ENTROPY_TYPE_GOOD (uint32_t)1472531015 |
#define | F_ENTROPY_TYPE_NOT_ENOUGH (uint32_t)1471001808 |
#define | F_ENTROPY_TYPE_NOT_RECOMENDED (uint32_t)1470003345 |
#define | ENTROPY_BEGIN f_verify_system_entropy_begin(); |
#define | ENTROPY_END f_verify_system_entropy_finish(); |
#define | F_PASS_MUST_HAVE_AT_LEAST_NONE (int)0 |
#define | F_PASS_MUST_HAVE_AT_LEAST_ONE_NUMBER (int)1 |
#define | F_PASS_MUST_HAVE_AT_LEAST_ONE_SYMBOL (int)2 |
#define | F_PASS_MUST_HAVE_AT_LEAST_ONE_UPPER_CASE (int)4 |
#define | F_PASS_MUST_HAVE_AT_LEAST_ONE_LOWER_CASE (int)8 |
#define | F_PASS_IS_TOO_LONG (int)256 |
#define | F_PASS_IS_TOO_SHORT (int)512 |
#define | F_PASS_IS_OUT_OVF (int)1024 |
#define | F_GET_CH_MODE_NO_ECHO (int)(1<<16) |
#define | F_GET_CH_MODE_ANY_KEY (int)(1<<17) |
#define | CLEAR_AND_FREE(ptr, size) free(memset(ptr, 0, size)); |
Typedefs | |
typedef void(* | rnd_fn) (void *, size_t) |
typedef int(* | fn_det) (void *, unsigned char *, size_t) |
typedef enum err_ecdsa_secret_key_valid_e | ERR_ECDSA_SECRET_KEY_VALID |
typedef enum err_ecdsa_public_key_valid_e | ERR_ECDSA_PUBLIC_KEY_VALID |
Enumerations | |
enum | err_ecdsa_secret_key_valid_e { ERR_KEY_SK_SIZE_ZERO = 476, ERR_KEY_WRONG_SIZE, ERR_SK_MALLOC, ERR_SK_READ_BINARY, ERR_SK_CHECK } |
enum | err_ecdsa_public_key_valid_e { ERR_KEY_PK_SIZE_ZERO = 501, ERR_PK_MALLOC, ERR_PK_CHECK } |
Functions | |
int | f_verify_system_entropy (uint32_t, void *, size_t, int) |
int | f_pass_must_have_at_least (char *, size_t, size_t, size_t, int) |
int | f_passwd_comp_safe (char *, char *, size_t, size_t, size_t) |
char * | f_get_entropy_name (uint32_t) |
uint32_t | f_sel_to_entropy_level (int) |
int | f_str_to_hex (uint8_t *, char *) |
void | f_random_attach (rnd_fn) |
void | f_random (void *, size_t) |
int | get_console_passwd (char *, size_t) |
int | f_get_char_no_block (int) |
int | f_convert_to_long_int (unsigned long int *, char *, size_t) |
int | f_convert_to_unsigned_int (unsigned int *, char *, size_t) |
int | f_convert_to_long_int0x (unsigned long int *, char *, size_t) |
int | f_convert_to_long_int0 (unsigned long int *, char *, size_t) |
int | f_convert_to_long_int_std (unsigned long int *, char *, size_t) |
void * | f_is_random_attached () |
void | f_random_detach () |
int | f_convert_to_unsigned_int0x (unsigned int *val, char *value, size_t value_sz) |
int | f_convert_to_unsigned_int0 (unsigned int *val, char *value, size_t value_sz) |
int | f_convert_to_unsigned_int_std (unsigned int *val, char *value, size_t value_sz) |
int | f_convert_to_double (double *, const char *) |
uint32_t | crc32_init (unsigned char *, size_t, uint32_t) |
int | f_reverse (unsigned char *, size_t) |
f_md_hmac_sha512 | f_hmac_sha512 (unsigned char *, const unsigned char *, size_t, const unsigned char *, size_t) |
ERR_ECDSA_SECRET_KEY_VALID | f_ecdsa_secret_key_valid (mbedtls_ecp_group_id, unsigned char *, size_t) |
ERR_ECDSA_PUBLIC_KEY_VALID | f_ecdsa_public_key_valid (mbedtls_ecp_group_id, unsigned char *, size_t) |
f_ecdsa_key_pair_err | f_gen_ecdsa_key_pair (f_ecdsa_key_pair *, int, fn_det, void *) |
int | f_uncompress_elliptic_curve (uint8_t *, size_t, size_t *, mbedtls_ecp_group_id, uint8_t *, size_t) |
uint8_t * | f_ripemd160 (const uint8_t *, size_t) |
int | f_url_encode (char *, size_t, size_t *, uint8_t *, size_t) |
int | f_encode_to_base64_dynamic (char **, size_t *, void *, size_t) |
int | f_base64_decode_dynamic (void **, size_t *, const char *, size_t) |
int | f_base64url_encode_dynamic (void **, size_t *, void *, size_t) |
int | f_encode_to_base64 (char *, size_t, size_t *, void *, size_t) |
int | f_base64url_encode (char *, size_t, size_t *, void *, size_t) |
int | f_base64url_decode (void *, size_t, size_t *, const char *, size_t) |
int | f_url_base64_to_base64_dynamic (char **, size_t *, const char *, size_t) |
int | f_url_decode (void *, size_t, size_t *, const char *, size_t) |
This ABI is a utility for myNanoEmbedded library and sub routines are implemented here.
Definition in file f_util.h.
#define CLEAR_AND_FREE | ( | ptr, | |
size | |||
) | free(memset(ptr, 0, size)); |
#define ENTROPY_BEGIN f_verify_system_entropy_begin(); |
Begins and prepares a entropy function.
#define ENTROPY_END f_verify_system_entropy_finish(); |
#define F_ENTROPY_TYPE_EXCELENT (uint32_t)1476885281 |
#define F_ENTROPY_TYPE_GOOD (uint32_t)1472531015 |
#define F_ENTROPY_TYPE_NOT_ENOUGH (uint32_t)1471001808 |
#define F_ENTROPY_TYPE_NOT_RECOMENDED (uint32_t)1470003345 |
#define F_ENTROPY_TYPE_PARANOIC (uint32_t)1477682819 |
#define F_GET_CH_MODE_ANY_KEY (int)(1<<17) |
#define F_GET_CH_MODE_NO_ECHO (int)(1<<16) |
#define F_PASS_IS_OUT_OVF (int)1024 |
#define F_PASS_IS_TOO_SHORT (int)512 |
#define F_PASS_MUST_HAVE_AT_LEAST_NONE (int)0 |
#define F_PASS_MUST_HAVE_AT_LEAST_ONE_LOWER_CASE (int)8 |
#define F_PASS_MUST_HAVE_AT_LEAST_ONE_NUMBER (int)1 |
#define F_PASS_MUST_HAVE_AT_LEAST_ONE_SYMBOL (int)2 |
#define F_PASS_MUST_HAVE_AT_LEAST_ONE_UPPER_CASE (int)4 |
typedef enum err_ecdsa_public_key_valid_e ERR_ECDSA_PUBLIC_KEY_VALID |
Typedef of err_ecdsa_public_key_valid_e.
typedef enum err_ecdsa_secret_key_valid_e ERR_ECDSA_SECRET_KEY_VALID |
Typedef of err_ecdsa_secret_key_valid_e.
uint32_t crc32_init | ( | unsigned char * | p, |
size_t | len, | ||
uint32_t | crcinit | ||
) |
Performs a CRC32 of a given data.
[in] | p | Pointer of the data |
[in] | len | Size of data in pointer p |
[in] | crcinit | Init vector of the CRC32 |
CRC32 | hash |
int f_base64_decode_dynamic | ( | void ** | , |
size_t * | , | ||
const char * | , | ||
size_t | |||
) |
int f_base64url_decode | ( | void * | , |
size_t | , | ||
size_t * | , | ||
const char * | , | ||
size_t | |||
) |
int f_base64url_encode | ( | char * | , |
size_t | , | ||
size_t * | , | ||
void * | , | ||
size_t | |||
) |
int f_base64url_encode_dynamic | ( | void ** | , |
size_t * | , | ||
void * | , | ||
size_t | |||
) |
int f_convert_to_double | ( | double * | val, |
const char * | value | ||
) |
Convert any valid number im value and converts it to double val
[out] | val | Value converted to double |
[in] | value | Value in string to be converted |
0 | On Success, Otherwise error |
int f_convert_to_long_int | ( | unsigned long int * | val, |
char * | value, | ||
size_t | value_sz | ||
) |
Converts a string value to unsigned long int.
[out] | val | Value stored in a unsigned long int variable |
[in] | value | Input value to be parsed to unsigned long int |
[in] | value_sz | Max size allowed in value string. |
0 | On Success, Otherwise error |
int f_convert_to_long_int0 | ( | unsigned long int * | val, |
char * | value, | ||
size_t | value_sz | ||
) |
Converts a octal value in ASCII string to unsigned long int.
[out] | val | Value stored in a unsigned long int variable |
[in] | value | Input value to be parsed to unsigned long int |
[in] | value_sz | Max size allowed in value string. |
0 | On Success, Otherwise error |
int f_convert_to_long_int0x | ( | unsigned long int * | val, |
char * | value, | ||
size_t | value_sz | ||
) |
Converts a hex value in ASCII string to unsigned long int.
[out] | val | Value stored in a unsigned long int variable |
[in] | value | Input value to be parsed to unsigned long int |
[in] | value_sz | Max size allowed in value string. |
0 | On Success, Otherwise error |
int f_convert_to_long_int_std | ( | unsigned long int * | val, |
char * | value, | ||
size_t | value_sz | ||
) |
Converts a actal/decimal/hexadecimal into ASCII string to unsigned long int.
[out] | val | Value stored in a unsigned long int variable |
[in] | value | Input value to be parsed to unsigned long int
|
[in] | value_sz | Max size allowed in value string. |
0 | On Success, Otherwise error |
int f_convert_to_unsigned_int | ( | unsigned int * | val, |
char * | value, | ||
size_t | value_sz | ||
) |
Converts a string value to unsigned int.
[out] | val | Value stored in a unsigned int variable |
[in] | value | Input value to be parsed to unsigned int |
[in] | value_sz | Max size allowed in value string. |
0 | On Success, Otherwise error |
int f_convert_to_unsigned_int0 | ( | unsigned int * | val, |
char * | value, | ||
size_t | value_sz | ||
) |
Converts a octal value in ASCII string to unsigned int.
[out] | val | Value stored in a unsigned int variable |
[in] | value | Input value to be parsed to unsigned int |
[in] | value_sz | Max size allowed in value string. |
0 | On Success, Otherwise error |
int f_convert_to_unsigned_int0x | ( | unsigned int * | val, |
char * | value, | ||
size_t | value_sz | ||
) |
Converts a hex value in ASCII string to unsigned int.
[out] | val | Value stored in a unsigned int variable |
[in] | value | Input value to be parsed to unsigned int |
[in] | value_sz | Max size allowed in value string. |
0 | On Success, Otherwise error |
int f_convert_to_unsigned_int_std | ( | unsigned int * | val, |
char * | value, | ||
size_t | value_sz | ||
) |
Converts a actal/decimal/hexadecimal into ASCII string to unsigned int.
[out] | val | Value stored in a unsigned int variable |
[in] | value | Input value to be parsed to unsigned int
|
[in] | value_sz | Max size allowed in value string. |
0 | On Success, Otherwise error |
ERR_ECDSA_PUBLIC_KEY_VALID f_ecdsa_public_key_valid | ( | mbedtls_ecp_group_id | gid, |
unsigned char * | public_key, | ||
size_t | public_key_len | ||
) |
Checks is ECDSA public key is valid.
[in] | gid | Input EC group id |
[in] | public_key | Public key |
[in] | public_key_len | Size of public key |
ERROR_SUCCESS | (0) if success or non zero if error |
ERR_ECDSA_SECRET_KEY_VALID f_ecdsa_secret_key_valid | ( | mbedtls_ecp_group_id | gid, |
unsigned char * | secret_key, | ||
size_t | secret_key_len | ||
) |
Checks is ECDSA secret key is valid.
[in] | gid | Input EC group id |
[in] | secret_key | Secret key |
[in] | secret_key_len | Size of secret key |
ERROR_SUCCESS | (0) if success or non zero if error |
int f_encode_to_base64 | ( | char * | , |
size_t | , | ||
size_t * | , | ||
void * | , | ||
size_t | |||
) |
int f_encode_to_base64_dynamic | ( | char ** | , |
size_t * | , | ||
void * | , | ||
size_t | |||
) |
f_ecdsa_key_pair_err f_gen_ecdsa_key_pair | ( | f_ecdsa_key_pair * | , |
int | , | ||
fn_det | , | ||
void * | |||
) |
int f_get_char_no_block | ( | int | mode | ) |
Reads a char from console.
Waits a char and returns its value
[in] | mode | Mode and/or character to be returned
|
Example:
key | code: On Success, Negative value on error |
char * f_get_entropy_name | ( | uint32_t | val | ) |
Returns a entropy name given a index/ASCII index or entropy value.
[in] | val | Index/ASCII index or entropy value |
Return values:
f_md_hmac_sha512 f_hmac_sha512 | ( | unsigned char * | result, |
const unsigned char * | key, | ||
size_t | key_len, | ||
const unsigned char * | data, | ||
size_t | data_len | ||
) |
Calculates SHA512 HMAC.
[out] | result | Output result |
[in] | key | Pointer of the key address |
[in] | key_len | Size of key |
[in] | data | Data pointer address |
[in] | data_len | Size of data |
ERROR_SUCCESS | (0) if success or non zero if error |
void * f_is_random_attached | ( | ) |
Verifies if system random function is attached in myNanoEmbedded API.
NULL | if not attached, Otherwise returns the pointer of random number genarator function |
int f_pass_must_have_at_least | ( | char * | password, |
size_t | n, | ||
size_t | min, | ||
size_t | max, | ||
int | must_have | ||
) |
Checks if a given password has enought requirements to be parsed to a function.
[in] | password | Password string |
[in] | n | Max buffer string permitted to store password including NULL char |
[in] | min | Minimum size allowed in password string |
[in] | max | Maximum size allowed in password |
[in] | must_have | Must have a type:
|
Return values:
int f_passwd_comp_safe | ( | char * | pass1, |
char * | pass2, | ||
size_t | n, | ||
size_t | min, | ||
size_t | max | ||
) |
Compares two passwords values with safe buffer.
[in] | pass1 | First password to compare with pass2 |
[in] | pass2 | Second password to compare with pass1 |
[in] | n | Size of Maximum buffer of both pass1 and pass2 |
[in] | min | Minimun value of both pass1 and pass2 |
[in] | max | Maximum value of both pass1 and pass2 |
0 | If pass1 is equal to pass2, otherwise value is less than 0 (zero) if password does not match |
void f_random | ( | void * | random, |
size_t | random_sz | ||
) |
Random function to be called to generate a random data with random_sz
[out] | random | Random data to be parsed |
[in] | random_sz | Size of random data to be filled |
void f_random_attach | ( | rnd_fn | fn | ) |
Attachs a function to be called by f_random()
[in] | fn | A function to be called |
void f_random_detach | ( | ) |
Detaches system random numeber genarator from myNanoEmbedded API.
int f_reverse | ( | unsigned char * | val, |
size_t | val_sz | ||
) |
Reverse bytes.
[in] | val | Pointer to be reversed |
[in] | val_sz | Size of val |
ERROR_SUCCESS | (0) if success or non zero if error |
uint8_t* f_ripemd160 | ( | const uint8_t * | , |
size_t | |||
) |
uint32_t f_sel_to_entropy_level | ( | int | sel | ) |
Return a given entropy number given a number encoded ASCII or index number.
[in] | sel | ASCII or index value |
Return values:
int f_str_to_hex | ( | uint8_t * | hex_stream, |
char * | str | ||
) |
Converts a str string buffer to raw hex_stream value stream.
[out] | hex | Raw hex value |
[in] | str | String buffer terminated with NULL char |
0 | On Success, otherwise Error |
int f_uncompress_elliptic_curve | ( | uint8_t * | , |
size_t | , | ||
size_t * | , | ||
mbedtls_ecp_group_id | , | ||
uint8_t * | , | ||
size_t | |||
) |
int f_url_base64_to_base64_dynamic | ( | char ** | , |
size_t * | , | ||
const char * | , | ||
size_t | |||
) |
int f_url_decode | ( | void * | , |
size_t | , | ||
size_t * | , | ||
const char * | , | ||
size_t | |||
) |
int f_url_encode | ( | char * | , |
size_t | , | ||
size_t * | , | ||
uint8_t * | , | ||
size_t | |||
) |
int f_verify_system_entropy | ( | uint32_t | type, |
void * | rand, | ||
size_t | rand_sz, | ||
int | turn_on_wdt | ||
) |
Take a random number generator function and returns random value only if randomized data have a desired entropy value.
[in] | type | Entropy type. Entropy type values are:
|
[out] | rand | Random data with a satisfied type of entropy |
[in] | rand_sz | Size of random data output |
[in] | turn_on_wdt | For ESP32, Arduino platform and other microcontrollers only. Turns on/off WATCH DOG (0: OFF, NON ZERO: ON). For Raspberry PI and Linux native is ommited. |
This implementation is based on topic in Definition 7.12 in MIT opencourseware (7.3 A Statistical Definition of Entropy - 2005)
Many thanks to Professor Z. S. Spakovszky for this amazing topic
0 | On Success, otherwise Error |
int get_console_passwd | ( | char * | pass, |
size_t | pass_sz | ||
) |
Reads a password from console.
[out] | pass | Password to be parsed to pointer |
[in] | pass_sz | Size of buffer pass |
0 | On Success, otherwise Error |