flipbip_file.c 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144
  1. #include "flipbip_file.h"
  2. #include "../helpers/flipbip_string.h"
  3. #include "../crypto/memzero.h"
  4. #include "../crypto/rand.h"
  5. #include <storage/storage.h>
  6. #define FLIPBIP_APP_BASE_FOLDER EXT_PATH("apps_data/flipbip")
  7. // #define FLIPBIP_SETTINGS_FILE_NAME ".flipbip.dat"
  8. #define FLIPBIP_SETTINGS_FILE_NAME ".flipbip.txt"
  9. #define FLIPBIP_SETTINGS_PATH FLIPBIP_APP_BASE_FOLDER "/" FLIPBIP_SETTINGS_FILE_NAME
  10. bool flipbip_load_settings(char* settings) {
  11. Storage *fs_api = furi_record_open(RECORD_STORAGE);
  12. File* settings_file = storage_file_alloc(fs_api);
  13. if(storage_file_open(settings_file, FLIPBIP_SETTINGS_PATH, FSAM_READ, FSOM_OPEN_EXISTING)) {
  14. char chr;
  15. int i = 0;
  16. while((storage_file_read(settings_file, &chr, 1) == 1) &&
  17. !storage_file_eof(settings_file) && !isspace(chr)) {
  18. settings[i] = chr;
  19. i++;
  20. }
  21. } else {
  22. strcpy(settings, "uhoh");
  23. //memzero(settings, strlen(settings));
  24. //settings[0] = '\0';
  25. }
  26. storage_file_close(settings_file);
  27. storage_file_free(settings_file);
  28. furi_record_close(RECORD_STORAGE);
  29. // if(!strlen(settings) == 0) {
  30. // Storage* fs_api = furi_record_open(RECORD_STORAGE);
  31. // FileInfo layout_file_info;
  32. // FS_Error file_check_err = storage_common_stat(
  33. // fs_api, FLIPBIP_SETTINGS_PATH, &layout_file_info);
  34. // furi_record_close(RECORD_STORAGE);
  35. // if(file_check_err != FSE_OK) {
  36. // memzero(settings, strlen(settings));
  37. // settings[0] = '\0';
  38. // return;
  39. // }
  40. // if(layout_file_info.size != 256) {
  41. // memzero(settings, strlen(settings));
  42. // settings[0] = '\0';
  43. // }
  44. // }
  45. return true;
  46. }
  47. bool flipbip_save_settings(const char* settings, bool append) {
  48. Storage* fs_api = furi_record_open(RECORD_STORAGE);
  49. File* settings_file = storage_file_alloc(fs_api);
  50. storage_common_mkdir(fs_api, FLIPBIP_APP_BASE_FOLDER);
  51. int open_mode = FSOM_OPEN_ALWAYS;
  52. if(append) {
  53. open_mode = FSOM_OPEN_APPEND;
  54. }
  55. if(storage_file_open(settings_file, FLIPBIP_SETTINGS_PATH, FSAM_WRITE, open_mode)) {
  56. storage_file_write(
  57. settings_file,
  58. settings,
  59. strlen(settings));
  60. storage_file_write(settings_file, "\n", 1);
  61. }
  62. storage_file_close(settings_file);
  63. storage_file_free(settings_file);
  64. furi_record_close(RECORD_STORAGE);
  65. return true;
  66. }
  67. bool flipbip_load_settings_secure(char* settings) {
  68. const size_t hlen = 4;
  69. const size_t klen = 128;
  70. const size_t slen = 512;
  71. const size_t dlen = hlen + klen + slen;
  72. char *data = malloc(dlen+1);
  73. memzero(data, dlen+1);
  74. if (!flipbip_load_settings(data)) return false;
  75. // if (strncmp(data, "fb01", hlen) != 0) {
  76. // memzero(data, dlen);
  77. // free(data);
  78. // return true;
  79. // }
  80. data += hlen;
  81. uint8_t key[64];
  82. flipbip_xtob(data, key, 64);
  83. data += klen;
  84. flipbip_cipher(key, data, data);
  85. flipbip_xtob(data, (unsigned char*)settings, 256);
  86. data = data - klen - hlen;
  87. memzero(data, dlen);
  88. free(data);
  89. return true;
  90. }
  91. bool flipbip_save_settings_secure(const char* settings) {
  92. const size_t hlen = 4;
  93. const size_t klen = 128;
  94. const size_t slen = 512;
  95. const size_t dlen = hlen + klen + slen;
  96. size_t len = strlen(settings);
  97. if (len > 256) len = 256;
  98. char *data = malloc(dlen + 1);
  99. memzero(data, dlen + 1);
  100. memcpy(data, "fb01", hlen);
  101. data += hlen - 1;
  102. uint8_t key[64];
  103. random_buffer(key, 64);
  104. for (size_t i = 0; i < 64; i++) {
  105. flipbip_btox(key[i], data + (i * 2));
  106. }
  107. data += klen;
  108. for (size_t i = 0; i < len; i++) {
  109. flipbip_btox(settings[i], data + (i * 2));
  110. }
  111. flipbip_cipher(key, data, data);
  112. data = data - klen - hlen;
  113. data[dlen] = '\0';
  114. flipbip_save_settings(data, false);
  115. memzero(data, dlen);
  116. free(data);
  117. return true;
  118. }