Files
red_crypto/utils.c

99 lines
2.5 KiB
C

#include "utils.h"
void red_print_chars(uint8_t *c) {
for (uint8_t i = 0; i < 32; i++) {
if (c[i] == 0x00) break;
dprintf("%c", c[i]);
}
dprintf("\n");
};
void red_print_int(uint8_t *c, uint8_t len) {
for (uint8_t i = 0; i < len; i++) {
dprintf("%d", c[i]);
}
dprintf("\n");
};
void red_print_hex(uint8_t *h) {
for (uint8_t i = 0; i < 32; i++) {
dprintf("%x ", h[i]);
}
dprintf("\n");
};
size_t red_min_len(size_t a, size_t b) {
if (a < b)
return a;
else
return b;
}
void red_send_chars_pass(uint8_t *out) {
for (uint8_t i = 0; i < INIT_STORAGE_PASS_LEN && out[i] != 0; i++) {
send_char((char)out[i]);
}
};
uint8_t *red_init_array(uint8_t len, uint8_t val) {
uint8_t *arr = (uint8_t *)malloc(sizeof(uint8_t) * len);
for (uint8_t i = 0; i < len; i++) {
arr[i] = val;
}
return arr;
}
uint8_t **red_init_array_2d(uint8_t len_row, uint8_t len_col, uint8_t val) {
uint8_t **arr = (uint8_t **)malloc(sizeof(uint8_t *) * len_row);
for (uint8_t i = 0; i < len_row; i++) {
arr[i] = (uint8_t *)malloc(sizeof(uint8_t) * len_col);
for (uint8_t j = 0; j < len_col; j++) {
arr[i][j] = val;
}
}
return arr;
}
// count printable symbols of ASCII in string with safety check of max length
uint8_t red_strlen_printable(uint8_t *str_printable, uint8_t max_len) {
uint8_t result = 0;
while (result < max_len && *str_printable != '\0') {
result++;
str_printable++;
}
return result;
}
#ifdef USE_SHA256_KEY
// hashing string to 32byte with sha256
uint8_t *hashing_string(uint8_t *str_to_hash) {
SHA256_CTX ctx;
sha256_init(&ctx);
sha256_update(&ctx, str_to_hash, red_strlen_printable(str_to_hash, MAX_KEY_LEN));
// BYTE result_key[SHA256_BLOCK_SIZE];
BYTE *result_key = red_init_array(SHA256_BLOCK_SIZE, 0x00);
sha256_final(&ctx, result_key);
# ifdef USE_RED_CRY_DEBUG
red_print_hex(result_key);
# endif
return result_key;
}
#endif
// EEPROM utils
void red_write_to_storage(void) {
// uint8_t res = 0;
for (uint16_t raw_index = 0; raw_index < STORAGE_SIZE; raw_index++) {
// res = EEPROM_WriteDataByte(0x0000 + raw_index, enc_pass.raw[raw_index]);
EEPROM_WriteDataByte(0x0040 + raw_index, enc_pass.raw[raw_index]);
}
// return res;
}
void red_read_from_storage(void) {
for (uint16_t raw_index = 0; raw_index < STORAGE_SIZE; raw_index++) {
enc_pass.raw[raw_index] = EEPROM_ReadDataByte(0x0040 + raw_index);
}
}