// Copyright (c) 2013-2015 IONU Security, Inc. All rights reserved. // // Utility functions and classes #ifndef eyeutils_h #define eyeutils_h #include #include #include "eyeconstants.h" #include "eyering.h" #ifndef LIBEYE_DLL #ifdef WIN32 # ifdef DLLEXPORT # define LIBEYE_DLL __declspec(dllexport) # else # define LIBEYE_DLL __declspec(dllimport) # endif #else #define LIBEYE_DLL #endif #endif #ifdef WIN32 #include #endif namespace sequencelogic { static const char MESSAGE_DIGEST_MD5[] = "md5"; static const char MESSAGE_DIGEST_SHA1[] = "sha1"; static const char MESSAGE_DIGEST_SHA224[] = "sha224"; static const char MESSAGE_DIGEST_SHA256[] = "sha256"; static const char MESSAGE_DIGEST_SHA384[] = "sha384"; static const char MESSAGE_DIGEST_SHA512[] = "sha512"; static const char CIPHER_AES128CBC[] = "aes128cbc"; static const char CIPHER_AES256CBC[] = "aes256cbc"; static const char CIPHER_AES256GCM[] = "aes256gcm"; // Globals, all access is protected by ionu_policy_mutex class EyeJSONObject; extern EyeJSONObject* GlobalPolicy; extern long GlobalPolicyTGIExpiration; // Default to one day typedef std::string UTF8String; // Utility functions LIBEYE_DLL bool IntToOctal (size_t value, char* buffer, size_t digits); LIBEYE_DLL size_t OctalToInt (const char* value, size_t len); LIBEYE_DLL bool BinaryToHex (const unsigned char *data, size_t len, char* hex); LIBEYE_DLL bool HexToBinary (const char* hex, unsigned char *data); LIBEYE_DLL bool HexToBinary (const char* hex, size_t bytes, unsigned char *data); LIBEYE_DLL unsigned char HexDigitToValue (const char digit); LIBEYE_DLL bool Base32Encode (const unsigned char *input, size_t len, char *output); LIBEYE_DLL size_t Base32Decode (const char* base32, unsigned char *data); LIBEYE_DLL bool Base64Encode (const unsigned char *input, size_t len, char *output); LIBEYE_DLL size_t Base64Decode (const char *input, unsigned char *output); // Format a time_t struct as ISO 8601 formatted string (20 characters) LIBEYE_DLL std::string GetISO8601Time (time_t t); // Get the current time as a long in milliseconds for timing and performance work LIBEYE_DLL long GetSystemTime (); LIBEYE_DLL bool XorKeys (const unsigned char* k1, const unsigned char* k2, unsigned char* ok, size_t len); // Safer versions of standard functions LIBEYE_DLL unsigned char* New (size_t bytes); LIBEYE_DLL char* StrDup (const char* str); LIBEYE_DLL int StrCmp (const char* str1, const char* str2); LIBEYE_DLL int StrnCmp (const char* str1, const char* str2, size_t len); LIBEYE_DLL size_t StrLen (const char* str, size_t max); LIBEYE_DLL void StrCpy (char* dst, const char* src); LIBEYE_DLL void StrCat (char* dst, const char* src); LIBEYE_DLL int MemCmp (const void* mem1, const void* mem2, size_t len); LIBEYE_DLL void MemCpy (void* dst, const void* src, size_t len); LIBEYE_DLL void MemSet (volatile void* mem, unsigned char val, size_t len); // Check string data to see if it contains any invalid coding characters LIBEYE_DLL bool IsStrAscii (const char *s, size_t len); LIBEYE_DLL bool IsStrUTF8 (const char* s, size_t len); // Internal convenience routines for performance size_t Decryptor (EVP_CIPHER_CTX* ctx, size_t len, const unsigned char* ciphertext, unsigned char* plaintext, const unsigned char* key, const unsigned char* iv); size_t Encryptor (EVP_CIPHER_CTX* ctx, size_t len, const unsigned char* plaintext, unsigned char* ciphertext, const unsigned char* key, const unsigned char* iv); // Message digest and cipher name to function pointer LIBEYE_DLL const EVP_MD* GetMessageDigester (const char *digestName); LIBEYE_DLL const EVP_CIPHER* GetCipher (const char *cipherName); // Message digest functions that return hex encoded signatures LIBEYE_DLL std::string DigestMessage (const char* digest, const unsigned char* msg, size_t len); LIBEYE_DLL std::string DigestFile (const char* digest, const std::string& filename); LIBEYE_DLL std::string HMACMessage (const unsigned char* key, size_t klen, const unsigned char* msg, size_t mlen); // Check a filename to help ensure that it is valid LIBEYE_DLL bool IsValidFilename (const char* filename); LIBEYE_DLL bool IsValidFilename (const std::string& filename); // Path utility functions LIBEYE_DLL bool IsLockFile (const std::string& filename); LIBEYE_DLL std::string Canonicalise (const std::string& path, bool lowercase = true); LIBEYE_DLL int CompareFilenames (const std::string& f1, const std::string& f2); LIBEYE_DLL std::string StripPath (const std::string& filename); LIBEYE_DLL std::string TempFilename (const std::string& filename, const std::string& suffix); // Check a filename to ensure that it is valid and can be opened for read LIBEYE_DLL bool CanReadFile (const char* filename); LIBEYE_DLL bool CanReadFile (const std::string& filename); LIBEYE_DLL std::string EncryptFilename (const std::string& filename, const Key& key); LIBEYE_DLL std::string DecryptFilename (const std::string& filename, const Key& key); LIBEYE_DLL bool CopyFiles (const std::string& src, const std::string& dst); // Rename and remove a file, clean up locks on old file LIBEYE_DLL bool RenameFile (const std::string& src, const std::string& dst); LIBEYE_DLL bool RemoveFile (const std::string& src); // Split a string into tokens LIBEYE_DLL std::vector SplitString (const std::string& value, const char separator); // Replace one or more occurances of search with target substring LIBEYE_DLL void ReplaceStringInSitu (std::string& target, const std::string& search, const std::string& replace); // Check to ensure the urn is valid - urn:sl:VAN:PMO:device:document LIBEYE_DLL bool IsValidURN (const char* urn); // Guess at the mimetype, using extension and file contents LIBEYE_DLL const std::string GuessMimeType (const std::string& filename); // Functions for password based operations // return 0 (null/empty) to 1.0 (highest strength) LIBEYE_DLL int GetRounds (const char* password); LIBEYE_DLL double PassWordStrength (const char* clearPassword); LIBEYE_DLL std::string SlowHash (const std::string& password, const std::string& key); LIBEYE_DLL bool DeriveKey (const char* password, unsigned char* key); LIBEYE_DLL bool GenerateCGKey (const char* password, unsigned char* key, unsigned char* halfkey); LIBEYE_DLL bool ValidateCGKey (const char* password, const unsigned char* key, const unsigned char* halfkey); LIBEYE_DLL bool DeriveUserKey (const char* password, unsigned char* userkey, const unsigned char* halfkey); // Random data and id/password generation utilities LIBEYE_DLL bool RandomBytes (size_t bytes, unsigned char* buffer); LIBEYE_DLL std::string RandomBase32 (size_t length); LIBEYE_DLL std::string RandomBase64 (size_t length); LIBEYE_DLL std::string RandomPassWord (size_t len, const char* charset = nullptr); // Compression functions LIBEYE_DLL bool IsGzipFile (const std::string& filename); LIBEYE_DLL bool Compress (unsigned char* dest, size_t* dest_len, const unsigned char* src, size_t src_len); LIBEYE_DLL bool Uncompress (unsigned char* dest, size_t* dest_len, const unsigned char* src, size_t src_len); // Debug utilities LIBEYE_DLL void DumpAsBinary (unsigned char* data, size_t bytes); class EyeURN { public: enum URN_FIELD { URN = 0, IONU = 1, VAN = 2, PMO = 3, DEV = 4, DOC = 5 }; LIBEYE_DLL EyeURN (const char* urn); ~EyeURN() {} LIBEYE_DLL char* GetURN(); bool IsValid() {return _isValid;} void RemoveDocument() {_doc[0] = '\0';} void RemoveDevice() {_dev[0] = '\0';} void RemovePMO() {_pmo[0] = '\0';} void RemoveVAN() {_van[0] = '\0';} private: bool _isValid; char _van[SL_URN_VAN_LEN + 1]; char _pmo[SL_URN_PMO_LEN + 1]; char _dev[SL_URN_DEV_LEN + 1]; char _doc[SL_URN_DOC_LEN + 1]; }; #ifdef WIN32 LIBEYE_DLL bool GetLogonFromToken (HANDLE hToken, LPSTR lpName, LPSTR lpDomain); LIBEYE_DLL std::string GetProcessOwner (DWORD processId); LIBEYE_DLL std::string GetProcessName (DWORD processId); #else std::string GetProcessOwner (pid_t processId); std::string GetProcessName (pid_t processId); #endif /** * Some more then common functions used in a number of places, in the Explorer integration code. */ /** * Convert from std::string to std::wstring */ LIBEYE_DLL std::wstring toWString(const std::string &str, const std::locale &loc = std::locale()); /** * Convert from std::wstring to std::string */ LIBEYE_DLL std::string toAString(const std::wstring &wstr, const std::locale &loc = std::locale()); LIBEYE_DLL std::string GetLastErrorMessage(); LIBEYE_DLL std::string GetErrorMessage(int nErrorCode); } //namespace sequencelogic #endif