|
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 |