iw4x-client/src/Utils/Cryptography.hpp

160 lines
3.3 KiB
C++
Raw Normal View History

2016-02-01 04:23:06 -05:00
namespace Utils
{
namespace Cryptography
{
2016-02-08 08:27:15 -05:00
class Rand
{
public:
static uint32_t GenerateInt();
2016-02-19 17:57:06 -05:00
static void Initialize();
private:
static prng_state State;
2016-02-08 08:27:15 -05:00
};
class ECDSA
{
public:
class Key
{
public:
2016-02-08 12:43:31 -05:00
Key() : KeyStorage(new ecc_key)
{
2016-02-21 13:57:56 -05:00
ZeroMemory(this->KeyStorage.get(), sizeof(*this->GetKeyPtr()));
2016-02-08 12:43:31 -05:00
};
2016-02-21 13:57:56 -05:00
Key(ecc_key* key) : Key() { if(key) std::memmove(this->GetKeyPtr(), key, sizeof(*key)); };
2016-02-08 12:43:31 -05:00
Key(ecc_key key) : Key(&key) {};
~Key()
{
if (this->KeyStorage.use_count() <= 1)
{
this->Free();
}
};
2016-02-08 08:27:15 -05:00
2016-02-08 12:43:31 -05:00
bool IsValid()
{
2016-02-21 13:57:56 -05:00
return (!Utils::MemIsSet(this->GetKeyPtr(), 0, sizeof(*this->GetKeyPtr())));
2016-02-08 12:43:31 -05:00
}
2016-02-08 08:27:15 -05:00
ecc_key* GetKeyPtr()
{
2016-02-08 12:43:31 -05:00
return this->KeyStorage.get();
2016-02-08 08:27:15 -05:00
}
std::string GetPublicKey()
{
2016-02-08 12:43:31 -05:00
uint8_t buffer[512] = { 0 };
2016-02-08 08:27:15 -05:00
DWORD length = sizeof(buffer);
if (ecc_ansi_x963_export(this->GetKeyPtr(), buffer, &length) == CRYPT_OK)
{
return std::string(reinterpret_cast<char*>(buffer), length);
}
return "";
}
2016-02-08 12:43:31 -05:00
void Set(std::string pubKeyBuffer)
{
this->Free();
2016-02-21 13:57:56 -05:00
if (ecc_ansi_x963_import(reinterpret_cast<const uint8_t*>(pubKeyBuffer.data()), pubKeyBuffer.size(), this->GetKeyPtr()) != CRYPT_OK)
2016-02-08 12:43:31 -05:00
{
2016-02-21 13:57:56 -05:00
ZeroMemory(this->KeyStorage.get(), sizeof(*this->GetKeyPtr()));
2016-02-08 12:43:31 -05:00
}
}
2016-02-21 13:57:56 -05:00
void Import(std::string key, int type = PK_PRIVATE)
{
this->Free();
if (ecc_import(reinterpret_cast<const uint8_t*>(key.data()), key.size(), this->GetKeyPtr()) != CRYPT_OK)
{
ZeroMemory(this->KeyStorage.get(), sizeof(*this->GetKeyPtr()));
}
}
std::string Export(int type = PK_PRIVATE)
{
uint8_t buffer[4096] = { 0 };
DWORD length = sizeof(buffer);
if (ecc_export(buffer, &length, type, this->GetKeyPtr()) == CRYPT_OK)
{
return std::string(reinterpret_cast<char*>(buffer), length);
}
return "";
}
2016-02-08 12:43:31 -05:00
void Free()
{
if (this->IsValid())
{
2016-02-21 13:57:56 -05:00
ecc_free(this->GetKeyPtr());
2016-02-08 12:43:31 -05:00
}
2016-02-21 13:57:56 -05:00
ZeroMemory(this->GetKeyPtr(), sizeof(*this->GetKeyPtr()));
2016-02-08 12:43:31 -05:00
}
2016-02-08 08:27:15 -05:00
private:
2016-02-08 12:43:31 -05:00
std::shared_ptr<ecc_key> KeyStorage;
2016-02-08 08:27:15 -05:00
};
static Key GenerateKey(int bits);
static std::string SignMessage(Key key, std::string message);
static bool VerifyMessage(Key key, std::string message, std::string signature);
};
2016-02-01 04:23:06 -05:00
class RSA
{
public:
class Key
{
public:
2016-02-08 12:43:31 -05:00
Key() : KeyStorage(new rsa_key)
{
2016-02-21 13:57:56 -05:00
ZeroMemory(this->KeyStorage.get(), sizeof(*this->GetKeyPtr()));
2016-02-08 12:43:31 -05:00
};
2016-02-21 13:57:56 -05:00
Key(rsa_key* key) : Key() { if (key) std::memmove(this->GetKeyPtr(), key, sizeof(*key)); };
2016-02-08 12:43:31 -05:00
Key(rsa_key key) : Key(&key) {};
~Key()
{
if (this->KeyStorage.use_count() <= 1)
{
this->Free();
}
};
2016-02-01 04:23:06 -05:00
rsa_key* GetKeyPtr()
{
2016-02-08 12:43:31 -05:00
return this->KeyStorage.get();
}
bool IsValid()
{
2016-02-21 13:57:56 -05:00
return (!Utils::MemIsSet(this->GetKeyPtr(), 0, sizeof(*this->GetKeyPtr())));
2016-02-08 12:43:31 -05:00
}
void Free()
{
if (this->IsValid())
{
2016-02-21 13:57:56 -05:00
rsa_free(this->GetKeyPtr());
2016-02-08 12:43:31 -05:00
}
2016-02-21 13:57:56 -05:00
ZeroMemory(this->GetKeyPtr(), sizeof(*this->GetKeyPtr()));
2016-02-01 04:23:06 -05:00
}
private:
2016-02-08 12:43:31 -05:00
std::shared_ptr<rsa_key> KeyStorage;
2016-02-01 04:23:06 -05:00
};
2016-02-08 08:27:15 -05:00
static Key GenerateKey(int bits);
2016-02-01 04:23:06 -05:00
static std::string SignMessage(Key key, std::string message);
static bool VerifyMessage(Key key, std::string message, std::string signature);
};
}
}