Nano cryptocurrency C library with P2PoW/DPoW support  1.0.0
f_util.h
Go to the documentation of this file.
1 /*
2  AUTHOR: Fábio Pereira da Silva
3  YEAR: 2019-20
4  LICENSE: MIT
5  EMAIL: fabioegel@gmail.com or fabioegel@protonmail.com
6 */
7 
13 #include <stdint.h>
14 #include "mbedtls/sha256.h"
15 #include "mbedtls/aes.h"
16 #include "mbedtls/ecdsa.h"
17 #include "errors.h"
18 
19 #ifdef __cplusplus
20 extern "C" {
21 #endif
22 
23 #ifndef F_DOC_SKIP
24 
25  #define F_LOG_MAX 8*256
26  #define LICENSE \
27 "MIT License\n\n\
28 Copyright (c) 2019 Fábio Pereira da Silva\n\n\
29 Permission is hereby granted, free of charge, to any person obtaining a copy\n\
30 of this software and associated documentation files (the \"Software\"), to deal\n\
31 in the Software without restriction, including without limitation the rights\n\
32 to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n\
33 copies of the Software, and to permit persons to whom the Software is\n\
34 furnished to do so, subject to the following conditions:\n\n\
35 The above copyright notice and this permission notice shall be included in all\n\
36 copies or substantial portions of the Software.\n\n\
37 THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n\
38 IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n\
39 FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n\
40 AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n\
41 LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n\
42 OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n\
43 SOFTWARE.\n\n\n"
44 
45 #endif
46 
47 #ifdef F_ESP32
48 
49  #define F_WDT_MAX_ENTROPY_TIME 2*120
50  #define F_WDT_PANIC true
51  #define F_WDT_MIN_TIME 20//4
52 
53 #endif
54 
72 int f_verify_system_entropy(uint32_t, void *, size_t, int);
73 
100 int f_pass_must_have_at_least(char *, size_t, size_t, size_t, int);
101 
102 #ifndef F_DOC_SKIP
103 
104 int f_verify_system_entropy_begin();
105 void f_verify_system_entropy_finish();
106 int f_file_exists(char *);
107 int f_find_str(size_t *, char *, size_t, char *);
108 int f_find_replace(char *, size_t *, size_t, char *, size_t, char *, char *);
109 int f_is_integer(char *, size_t);
110 int is_filled_with_value(uint8_t *, size_t, uint8_t);
111 
112 #endif
113 
114 //#define F_ENTROPY_TYPE_PARANOIC (uint32_t)1476682819
119 #define F_ENTROPY_TYPE_PARANOIC (uint32_t)1477682819
120 
121 //#define F_ENTROPY_TYPE_EXCELENT (uint32_t)1475885281
126 #define F_ENTROPY_TYPE_EXCELENT (uint32_t)1476885281
127 
128 //#define F_ENTROPY_TYPE_GOOD (uint32_t)1471531015
133 #define F_ENTROPY_TYPE_GOOD (uint32_t)1472531015
134 
135 //#define F_ENTROPY_TYPE_NOT_ENOUGH (uint32_t)1470001808
140 #define F_ENTROPY_TYPE_NOT_ENOUGH (uint32_t)1471001808
141 
142 //#define F_ENTROPY_TYPE_NOT_RECOMENDED (uint32_t)1469703345
147 #define F_ENTROPY_TYPE_NOT_RECOMENDED (uint32_t)1470003345
148 
154 #define ENTROPY_BEGIN f_verify_system_entropy_begin();
155 
161 #define ENTROPY_END f_verify_system_entropy_finish();
162 
167 #define F_PASS_MUST_HAVE_AT_LEAST_NONE (int)0
168 
173 #define F_PASS_MUST_HAVE_AT_LEAST_ONE_NUMBER (int)1
174 
179 #define F_PASS_MUST_HAVE_AT_LEAST_ONE_SYMBOL (int)2
180 
185 #define F_PASS_MUST_HAVE_AT_LEAST_ONE_UPPER_CASE (int)4
186 
191 #define F_PASS_MUST_HAVE_AT_LEAST_ONE_LOWER_CASE (int)8
192 
197 #define F_PASS_IS_TOO_LONG (int)256
198 
203 #define F_PASS_IS_TOO_SHORT (int)512
204 
209 #define F_PASS_IS_OUT_OVF (int)1024//768
210 
211 #ifndef F_DOC_SKIP
212 
213  #define F_PBKDF2_ITER_SZ 2*4096
214 
215 typedef enum f_pbkdf2_err_t {
216  F_PBKDF2_RESULT_OK=0,
217  F_PBKDF2_ERR_CTX=95,
218  F_PBKDF2_ERR_PKCS5,
219  F_PBKDF2_ERR_INFO_SHA
220 } f_pbkdf2_err;
221 
222 typedef enum f_aes_err {
223  F_AES_RESULT_OK=0,
224  F_AES_ERR_ENCKEY=30,
225  F_AES_ERR_DECKEY,
226  F_AES_ERR_MALLOC,
227  F_AES_UNKNOW_DIRECTION,
228  F_ERR_ENC_DECRYPT_FAILED
229 } f_aes_err;
230 
231 typedef enum f_md_hmac_sha512_t {
232  F_HMAC_SHA512_OK = 0,
233  F_HMAC_SHA512_MALLOC = 304,
234  F_HMAC_SHA512_ERR_INFO,
235  F_HMAC_SHA512_ERR_SETUP,
236  F_HMAC_SHA512_DIGEST_ERROR
237 } f_md_hmac_sha512;
239 typedef enum f_ecdsa_key_pair_err_t {
240  F_ECDSA_KEY_PAIR_OK = 0,
241  F_ECDSA_KEY_PAIR_NULL = 330,
242  F_ECDSA_KEY_PAIR_MALLOC
243 } f_ecdsa_key_pair_err;
244 
245 typedef struct f_ecdsa_key_pair_t {
246  size_t public_key_sz;
247  size_t private_key_sz;
248  mbedtls_ecdsa_context *ctx;
249  mbedtls_ecp_group_id gid;
250  unsigned char public_key[MBEDTLS_ECDSA_MAX_LEN];
251  unsigned char private_key[MBEDTLS_ECDSA_MAX_LEN];
252 } f_ecdsa_key_pair;
253 
258 enum f_encode_decode_error_t {
259  F_URL_ENCODE_OK = 0,
260  F_ENCODE_BASE64_DEST_SMALL=11300,
261  F_ENCODE_TO_BASE64_MALLOC,
262  F_BASE64_DECODE_MALLOC,
263  F_URL_ENCODE_EMPTY,
264  F_URL_ENCODE_DEST_SMALL,
265  F_BASE64_URL_DECODE_MALLOC,
266  F_BASE64_URL_DECODE_MEMORY_SMALL,
267  F_BASE64_URL_TO_BASE64_EMPTY_BASE64,
268  F_BASE64_URL_TO_BASE64_MALLOC,
269  F_URL_ENCODE_EMPTY_STRING,
270  F_URL_ENCODE_WAITING_NEXT_NIBBLE,
271  F_URL_INVALID_HEX_STRING,
272  F_URL_NO_SPACE_IN_MEMORY_BUFFER,
273  F_URL_ENCODE_INVALID_STRING
274 };
275 
276 char *fhex2strv2(char *, const void *, size_t, int);
277 int f_sha256_digest(void **, int, uint8_t *, size_t);
278 f_pbkdf2_err f_pbkdf2_hmac(unsigned char *, size_t, unsigned char *, size_t, uint8_t *);
279 f_aes_err f_aes256cipher(uint8_t *, uint8_t *, void *, size_t, void *, int);
280 
281 #endif
282 
294 int f_passwd_comp_safe(char *, char *, size_t, size_t, size_t);
295 
306 char *f_get_entropy_name(uint32_t);
307 
322 uint32_t f_sel_to_entropy_level(int);
323 
332 int f_str_to_hex(uint8_t *, char *);
333 
334 #ifndef F_ESP32
335 
340 typedef void (*rnd_fn)(void *, size_t);
341 
349 void f_random_attach(rnd_fn);
350 
359 void f_random(void *, size_t);
360 
369 int get_console_passwd(char *, size_t);
370 
375 #define F_GET_CH_MODE_NO_ECHO (int)(1<<16)
376 
381 #define F_GET_CH_MODE_ANY_KEY (int)(1<<17)
382 
398 int f_get_char_no_block(int);
399 
400 #endif
401 
412 int f_convert_to_long_int(unsigned long int *, char *, size_t);
413 
414 
425 int f_convert_to_unsigned_int(unsigned int *, char *, size_t);
426 
437 int f_convert_to_long_int0x(unsigned long int *, char *, size_t);
438 
449 int f_convert_to_long_int0(unsigned long int *, char *, size_t);
450 
464 int f_convert_to_long_int_std(unsigned long int *, char *, size_t);
465 
473 void *f_is_random_attached();
474 
481 void f_random_detach();
482 
493 int f_convert_to_unsigned_int0x(unsigned int *val, char *value, size_t value_sz);
494 
505 int f_convert_to_unsigned_int0(unsigned int *val, char *value, size_t value_sz);
506 
520 int f_convert_to_unsigned_int_std(unsigned int *val, char *value, size_t value_sz);
521 
531 int f_convert_to_double(double *, const char *);
532 
543 uint32_t crc32_init(unsigned char *, size_t, uint32_t);
544 //
545 typedef int (*fn_det)(void *, unsigned char *, size_t);
546 
556 int f_reverse(unsigned char *, size_t);
557 
570 f_md_hmac_sha512 f_hmac_sha512(unsigned char *, const unsigned char *, size_t, const unsigned char *, size_t);
571 
588 
601 
602 
613 ERR_ECDSA_SECRET_KEY_VALID
614 f_ecdsa_secret_key_valid(mbedtls_ecp_group_id, unsigned char *, size_t);
615 
626 ERR_ECDSA_PUBLIC_KEY_VALID
627 f_ecdsa_public_key_valid(mbedtls_ecp_group_id, unsigned char *, size_t);
628 
629 f_ecdsa_key_pair_err f_gen_ecdsa_key_pair(f_ecdsa_key_pair *, int, fn_det, void *);
630 int f_uncompress_elliptic_curve(uint8_t *, size_t, size_t *, mbedtls_ecp_group_id, uint8_t *, size_t);
631 uint8_t *f_ripemd160(const uint8_t *, size_t);
632 int f_url_encode(char *, size_t, size_t *, uint8_t *, size_t);
633 int f_encode_to_base64_dynamic(char **, size_t *, void *, size_t );
634 int f_base64_decode_dynamic(void **, size_t *, const char *, size_t);
635 int f_base64url_encode_dynamic(void **, size_t *, void *, size_t);
636 int f_encode_to_base64(char *, size_t, size_t *, void *, size_t);
637 int f_base64url_encode(char *, size_t, size_t *, void *, size_t);
638 int f_base64url_decode(void *, size_t, size_t *, const char *, size_t);
639 int f_url_base64_to_base64_dynamic(char **, size_t *, const char *, size_t);
640 int f_url_decode(void *, size_t, size_t *, const char *, size_t);
641 
642 #define CLEAR_AND_FREE(ptr, size) free(memset(ptr, 0, size));
643 #ifdef __cplusplus
644 }
645 #endif
int f_get_char_no_block(int)
Reads a char from console.
void f_random(void *, size_t)
Random function to be called to generate a random data with random_sz
ERR_ECDSA_SECRET_KEY_VALID f_ecdsa_secret_key_valid(mbedtls_ecp_group_id, unsigned char *, size_t)
Checks is ECDSA secret key is valid.
char * f_get_entropy_name(uint32_t)
Returns a entropy name given a index/ASCII index or entropy value.
enum err_ecdsa_secret_key_valid_e ERR_ECDSA_SECRET_KEY_VALID
Typedef of err_ecdsa_secret_key_valid_e.
void * f_is_random_attached()
Verifies if system random function is attached in myNanoEmbedded API.
int f_url_decode(void *, size_t, size_t *, const char *, size_t)
int f_convert_to_unsigned_int(unsigned int *, char *, size_t)
Converts a string value to unsigned int.
Error alloc memory for check.
Definition: f_util.h:582
int f_convert_to_long_int0(unsigned long int *, char *, size_t)
Converts a octal value in ASCII string to unsigned long int.
Error binary read.
Definition: f_util.h:599
int f_encode_to_base64_dynamic(char **, size_t *, void *, size_t)
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.
f_md_hmac_sha512 f_hmac_sha512(unsigned char *, const unsigned char *, size_t, const unsigned char *, size_t)
Calculates SHA512 HMAC.
int f_reverse(unsigned char *, size_t)
Reverse bytes.
int get_console_passwd(char *, size_t)
Reads a password from console.
f_ecdsa_key_pair_err f_gen_ecdsa_key_pair(f_ecdsa_key_pair *, int, fn_det, void *)
void f_random_attach(rnd_fn)
Attachs a function to be called by f_random()
void(* rnd_fn)(void *, size_t)
Pointer caller for random function.
Definition: f_util.h:340
int f_base64_decode_dynamic(void **, size_t *, const char *, size_t)
int f_verify_system_entropy(uint32_t, void *, size_t, int)
Take a random number generator function and returns random value only if randomized data have a desir...
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.
int f_convert_to_long_int0x(unsigned long int *, char *, size_t)
Converts a hex value in ASCII string to unsigned long int.
Error alloc memory for check.
Definition: f_util.h:597
int f_convert_to_long_int(unsigned long int *, char *, size_t)
Converts a string value to unsigned long int.
int f_base64url_encode(char *, size_t, size_t *, void *, size_t)
void f_random_detach()
Detaches system random numeber genarator from myNanoEmbedded API.
int(* fn_det)(void *, unsigned char *, size_t)
Definition: f_util.h:545
uint32_t crc32_init(unsigned char *, size_t, uint32_t)
Performs a CRC32 of a given data.
uint32_t f_sel_to_entropy_level(int)
Return a given entropy number given a number encoded ASCII or index number.
enum err_ecdsa_public_key_valid_e ERR_ECDSA_PUBLIC_KEY_VALID
Typedef of err_ecdsa_public_key_valid_e.
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.
int f_base64url_encode_dynamic(void **, size_t *, void *, size_t)
int f_uncompress_elliptic_curve(uint8_t *, size_t, size_t *, mbedtls_ecp_group_id, uint8_t *, size_t)
int f_base64url_decode(void *, size_t, size_t *, const char *, size_t)
int f_pass_must_have_at_least(char *, size_t, size_t, size_t, int)
Checks if a given password has enought requirements to be parsed to a function.
int f_convert_to_long_int_std(unsigned long int *, char *, size_t)
Converts a actal/decimal/hexadecimal into ASCII string to unsigned long int.
int f_url_encode(char *, size_t, size_t *, uint8_t *, size_t)
uint8_t * f_ripemd160(const uint8_t *, size_t)
int f_encode_to_base64(char *, size_t, size_t *, void *, size_t)
err_ecdsa_secret_key_valid_e
ECDSA secret key error checker enumerator.
Definition: f_util.h:576
int f_convert_to_double(double *, const char *)
Convert any valid number im value and converts it to double val
Secret key invalid.
Definition: f_util.h:586
Key size is zero.
Definition: f_util.h:578
int f_str_to_hex(uint8_t *, char *)
Converts a str string buffer to raw hex_stream value stream.
err_ecdsa_public_key_valid_e
ECDSA public key error checker enumerator.
Definition: f_util.h:593
Error key wrong size.
Definition: f_util.h:580
int f_passwd_comp_safe(char *, char *, size_t, size_t, size_t)
Compares two passwords values with safe buffer.
int f_url_base64_to_base64_dynamic(char **, size_t *, const char *, size_t)
ERR_ECDSA_PUBLIC_KEY_VALID f_ecdsa_public_key_valid(mbedtls_ecp_group_id, unsigned char *, size_t)
Checks is ECDSA public key is valid.
Public key size is zero.
Definition: f_util.h:595
Error binary read.
Definition: f_util.h:584