#ifndef CRYPTOR_H #define CRYPTOR_H #include #include #include #include #include #ifdef WIN32 #include #else #include #include #endif // WIN32 #include "mbedtls/cipher.h" #include "mbedtls/ctr_drbg.h" #include "mbedtls/entropy.h" #include "mbedtls/sha256.h" #define DEF_PASSWD_LENGTH 50 #define AES_BLOCK_LENGTH 16 #define KEYCHAIN_FILE ".compasskeychain" #define PASSWORD_PROMPT "ComPASS Password: " #define PASSWORD_CONF "Confirm Password: " #define PASSWORD_ERROR "Passwords do not match..." struct PasswordSpec { PasswordSpec() { // Default Values ml = DEF_PASSWD_LENGTH; ns = nc = nn = false; } int ml; // max length bool ns; // no special chars bool nc; // no caps bool nn; // no numeric chars }; class Cryptor { public: static void encryptAndSave(std::string directory, std::string payload); static std::string loadAndDecrypt(std::string directory); static std::string createRandomPassword(PasswordSpec spec); static void rekey(); private: static bool haveKey; static unsigned char key[AES_BLOCK_LENGTH]; static void sha256(std::string str); static void generateRandom(void *output, size_t size); static std::string readPassword(bool confirm); static std::string readPassword(); static void assembleKey(bool confirm); static void assembleKey(); static std::string promptPassword(bool confirm); }; #endif // CRYPTOR_H