Advertisement
Guest User

Untitled

a guest
Jan 24th, 2019
89
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 8.83 KB | None | 0 0
  1. #include "stateManager.h"
  2.  
  3. //#define JC_DEBUG
  4.  
  5. #define SAVE_FILE_LENGTH (crypto_secretbox_NONCEBYTES+crypto_secretbox_ZEROBYTES+crypto_hash_BYTES*2+sizeof(unsigned char) * 2 - crypto_secretbox_BOXZEROBYTES)
  6.  
  7. // input -> password(text), target, secret(or empty), empty, empty, empty
  8. // output -> password(binary), target, outKey, inKey, count, waitingOnAsync
  9. int manageLoginStateCheck(char **manageLoginStateArgs) {
  10. int temp;
  11.  
  12. // default 0 messages until async ratchet for new keys
  13. manageLoginStateArgs[3] = 0; // default if function fails
  14. manageLoginStateArgs[4] = malloc(sizeof(unsigned char));
  15. *manageLoginStateArgs[4] = 0;
  16. manageLoginStateArgs[5] = malloc(sizeof(unsigned char));
  17. *manageLoginStateArgs[5] = 0;
  18.  
  19. // Check which input fields are full
  20. int inputsFull[3];
  21. for (int i = 0; i < 3; ++i) {
  22. if (strcmp(manageLoginStateArgs[i], "")) {
  23. inputsFull[i] = 1;
  24. }
  25. else {
  26. inputsFull[i] = 0;
  27. }
  28. }
  29.  
  30. if (!inputsFull[0] || !inputsFull[1]) {
  31. return FIRST_TWO_FIELDS_MUST_BE_FULL;
  32. }
  33.  
  34. // Hash password and shared secret
  35. if (inputsFull[0]) {
  36. temp = replaceWithHash(manageLoginStateArgs + 0, strlen(manageLoginStateArgs[0]));
  37. if (temp) {
  38. return LOGIN_FUNCTION_ERROR;
  39. }
  40. }
  41. if (inputsFull[2]) {
  42. temp = replaceWithHash(manageLoginStateArgs + 2, strlen(manageLoginStateArgs[2]));
  43. if (temp) {
  44. return LOGIN_FUNCTION_ERROR;
  45. }
  46. }
  47.  
  48. #ifdef JC_DEBUG
  49. //printf("Sate manager - Target Name: %s\n", manageLoginStateArgs[1]);
  50. #endif
  51. // Read in save file if it exists
  52. int basePathLength = strlen(SAVE_FILE_PATH), extraPathLength = strlen(manageLoginStateArgs[1]);
  53. char saveFilePath[basePathLength + extraPathLength + 1];
  54. memcpy(saveFilePath, SAVE_FILE_PATH, basePathLength);
  55. memcpy(saveFilePath + basePathLength, manageLoginStateArgs[1], extraPathLength);
  56. saveFilePath[sizeof(saveFilePath) - 1] = 0;
  57.  
  58. char *saveFileBuffer;
  59. temp = readFileIfExists(&saveFileBuffer, saveFilePath);
  60. if (temp < 0) {
  61. free(saveFileBuffer);
  62.  
  63. #ifdef JC_DEBUG
  64. //printf("Sate manager - entered no save file block %s\n", saveFilePath);
  65. #endif
  66.  
  67. // Save file doesn't exist or it's length can't be determined or it can't be read
  68. if (inputsFull[0] + inputsFull[1] + inputsFull[2] == 3) {
  69. #ifdef JC_DEBUG
  70. //printf("Sate manager - entered all inputs ready block\n");
  71. #endif
  72.  
  73. // Ready to scene transition
  74. manageLoginStateArgs[3] = malloc(crypto_hash_BYTES);
  75. memcpy(manageLoginStateArgs[3], manageLoginStateArgs[2], crypto_hash_BYTES);
  76.  
  77. #ifdef JC_DEBUG
  78. //printf("Sate manager - entered all inputs ready block - memcpys fine\n");
  79. #endif
  80.  
  81. return GOOD_TO_GO;
  82. }
  83. else {
  84. #ifdef JC_DEBUG
  85. //printf("Sate manager - saveFilePath: %s\n", saveFilePath);
  86. #endif
  87. // All 3 fields must be filled out if no save exists
  88. return NO_SAVE_NEED_ALL_FIELDS;
  89. }
  90. }
  91.  
  92. #ifdef JC_DEBUG
  93. //printf("Sate manager - pre parse/deccrypt save file\n");
  94. #endif
  95. // Parse and decrypt save file
  96. int cryptedSaveFileLength = temp;
  97. int decryptSaveFile(const char *password, char **fileBuffer, int *length);
  98. temp = decryptSaveFile(manageLoginStateArgs[0], &saveFileBuffer, &cryptedSaveFileLength);
  99.  
  100. #ifdef JC_DEBUG
  101. //printf("Sate manager - returned from decryptSaveFile()\n");
  102. #endif
  103.  
  104. if (temp < 0) {
  105. // Failed to decrypt save state
  106. memset(saveFileBuffer, 0, temp); // UNTESTED
  107. free(saveFileBuffer);
  108. #ifdef JC_DEBUG
  109. //printf("Sate manager - post free(saveFileBuffer)\n");
  110. #endif
  111. return PASSWORD_DID_NOT_MATCH_OR_SAVE_CORRUPT;
  112. }
  113. #ifdef JC_DEBUG
  114. //printf("Sate manager - post parse/decrypt save file\n");
  115. #endif
  116.  
  117. // File buffer now contains saved state
  118. if (!inputsFull[2]) {
  119. // No new shared secret have to place loaded data into shared secret
  120. free(manageLoginStateArgs[2]);
  121.  
  122. // Parsing decrypted save file
  123. manageLoginStateArgs[2] = malloc(crypto_hash_BYTES);
  124. manageLoginStateArgs[3] = malloc(crypto_hash_BYTES);
  125.  
  126. memcpy(manageLoginStateArgs[2], saveFileBuffer, crypto_hash_BYTES);
  127. memcpy(manageLoginStateArgs[3], saveFileBuffer + crypto_hash_BYTES, crypto_hash_BYTES);
  128. memcpy(manageLoginStateArgs[4], saveFileBuffer + crypto_hash_BYTES * 2, sizeof(unsigned char));
  129. memcpy(manageLoginStateArgs[5], saveFileBuffer + crypto_hash_BYTES * 2 + sizeof(unsigned char), sizeof(unsigned char));
  130.  
  131. #ifdef JC_DEBUG
  132. //printf("\n\nSate manager - incomingKey loaded from save file: %s\n\n", manageLoginStateArgs[3]);
  133. #endif
  134. }
  135. else {
  136. #ifdef JC_DEBUG
  137. //printf("\n\nState manager - reached right place at least\n");
  138. //printf("\n\nInputsFull[2]: %x\n\n", inputsFull[2]);
  139. #endif
  140. // new secret duplicated into both incoming and outgoing keys
  141. manageLoginStateArgs[3] = malloc(crypto_hash_BYTES);
  142. memcpy(manageLoginStateArgs[3], manageLoginStateArgs[2], crypto_hash_BYTES);
  143. }
  144.  
  145. memset(saveFileBuffer, 0, cryptedSaveFileLength);
  146. free(saveFileBuffer);
  147.  
  148. #ifdef JC_DEBUG
  149. //printf("Sate manager - post argument setting\n");
  150. #endif
  151.  
  152. // Ready to scene transition
  153. return GOOD_TO_GO;
  154.  
  155. return -1;
  156. }
  157.  
  158. int readFileIfExists(char **fileBuffer, const char *filePath) {
  159. *fileBuffer = 0;
  160.  
  161. // Attempt to open file
  162. int saveFile = open(filePath, O_RDONLY);
  163. if (saveFile < 0) {
  164. #ifdef JC_DEBUG
  165. //printf("readFileIfExists - could not open file\n");
  166. //perror("Reason");
  167. #endif
  168. return -1;
  169. }
  170.  
  171. // Get file length
  172. int getFileSize(const char *fileName);
  173. int saveFileLength = getFileSize(filePath);
  174. if (saveFileLength < 0) return -1;
  175.  
  176. // Read file into buffer
  177. *fileBuffer = malloc(saveFileLength);
  178. int temp = read(saveFile, *fileBuffer, saveFileLength);
  179. if (temp < 0) {
  180. g_print("Error reading file into buffer.\nPath: %s", filePath);
  181. perror("Reason");
  182. return -1;
  183. }
  184.  
  185. return saveFileLength;
  186. }
  187.  
  188. int getFileSize(const char *fileName) {
  189. int temp;
  190.  
  191. struct stat st;
  192. temp = stat(fileName, &st);
  193. if (temp) {
  194. return -1;
  195. }
  196.  
  197. return st.st_size;
  198. }
  199.  
  200. int decryptSaveFile(const char *password, char **fileBuffer, int *saveFileLength) {
  201. // Verify save file has enough size to be used as a save file
  202. if (*saveFileLength < SAVE_FILE_LENGTH) {
  203. g_print("The save file is not the apropriate size.\n");
  204. return -1;
  205. }
  206.  
  207. #ifdef JC_DEBUG
  208. if (crypto_secretbox_KEYBYTES > crypto_hash_BYTES) {
  209. g_print("Keys are bigger than hashes, need something fancier.\n");
  210. return -1;
  211. }
  212. #endif
  213.  
  214. #ifdef JC_DEBUG
  215. //printf("save file byte size pre decryption: %d\n", *saveFileLength);
  216. #endif
  217.  
  218. unsigned char *pt;
  219. int result = secretKeyDecrypt(&pt, *fileBuffer, saveFileLength, password);
  220. if (result < 0) {
  221. free(pt);
  222. g_print("Decrypting save file verification failed.\n");
  223. return -1;
  224. }
  225.  
  226. #ifdef JC_DEBUG
  227. //printf("save file byte size post decryption: %d\n", *saveFileLength);
  228. //printf("\n\nSAVE_DATA ON LOAD: %s\n\n", pt);
  229. #endif
  230.  
  231. free(*fileBuffer);
  232. *fileBuffer = pt;
  233.  
  234. return 0;
  235. }
  236.  
  237. int stateManagerSaveState(const char *password, const char *properTarget, const char *outgoingKey, const char *incomingKey, const char *countTillRatchet, const char *waitingOnAsync) {
  238. // open save file
  239. int properTargetLength = strlen(properTarget), saveFilePathLength = strlen(SAVE_FILE_PATH);
  240. char filePath[properTargetLength + saveFilePathLength + 1];
  241. memcpy(filePath, SAVE_FILE_PATH, saveFilePathLength);
  242. memcpy(filePath + saveFilePathLength, properTarget, properTargetLength);
  243. filePath[sizeof(filePath) - 1] = 0;
  244.  
  245. int saveFile = open(filePath, O_RDWR | O_CREAT, 0666);
  246. if (saveFile < 0) {
  247. printf("Save filed could not be opened.\n");
  248. return -1;
  249. }
  250.  
  251. // load save data into a buffer
  252. unsigned char saveData[crypto_hash_BYTES * 2 + sizeof(unsigned char) * 2];
  253. memcpy(saveData, outgoingKey, crypto_hash_BYTES);
  254. int offset = crypto_hash_BYTES;
  255. memcpy(saveData + offset, incomingKey, crypto_hash_BYTES);
  256. offset += crypto_hash_BYTES;
  257. memcpy(saveData + offset, countTillRatchet, sizeof(unsigned char));
  258. offset += sizeof(unsigned char);
  259. memcpy(saveData + offset, waitingOnAsync, sizeof(unsigned char));
  260. unsigned char *encryptedSaveData;
  261. int length = sizeof(saveData);
  262.  
  263. #ifdef JC_DEBUG
  264. //memset(saveData, 65, sizeof(saveData));
  265. //printf("\n\nSAVE_DATA ON SAVE (unencrypted): %s\n\n", saveData);
  266. #endif
  267.  
  268. // encrypt the save data
  269. secretKeyEncrypt(&encryptedSaveData, saveData, &length, password);
  270.  
  271. #ifdef JC_DEBUG
  272. //printf("save file byte size post encryption: %d\n", length);
  273. #endif
  274.  
  275. // save state to disk
  276. if (write(saveFile, encryptedSaveData, length) < 0) {
  277. #ifdef JC_DEBUG
  278. printf("write() on save failed.\n");
  279. perror("Reason");
  280. #endif
  281. return -1;
  282. };
  283. if (close(saveFile) < 0) {
  284. printf("close() on save file failed.\n");
  285. return -1;
  286. };
  287.  
  288. // clean and free memory
  289. memset(saveData, 0, sizeof(saveData));
  290. memset(encryptedSaveData, 0, length);
  291. free(encryptedSaveData);
  292.  
  293. return 0;
  294. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement