ultimatepp/bazaar/Protect/Protect.cpp
micio f2da9caeda Bazaar/Protect : using new Cypher package instead of StreamCypher
Added Initialization Vectors handling in encryption

git-svn-id: svn://ultimatepp.org/upp/trunk@2739 f0d560ea-af0d-0410-9eb7-867de7ffcac7
2010-10-03 20:44:12 +00:00

47 lines
1.1 KiB
C++

#include "Protect.h"
#ifdef PLATFORM_POSIX
#include <sys/mman.h>
#include <unistd.h>
bool PROTECT_WRITE_ACCESS(byte *start, size_t size, bool access)
{
// round start and size to page size -- needed for mprotect
long pSize = sysconf(_SC_PAGESIZE );
long delta = (long)start % pSize;
if(delta)
{
start -= delta;
size += delta;
}
return mprotect(start, size, access ? PROT_READ | PROT_WRITE | PROT_EXEC : PROT_READ | PROT_EXEC) == 0;
}
#else
bool PROTECT_WRITE_ACCESS(byte *start, size_t size, bool access)
{
dword oldProt;
bool res = VirtualProtect(start, size, access ? PAGE_EXECUTE_READWRITE : PAGE_EXECUTE_READ, &oldProt);
return res;
}
#endif
void PROTECT_DECRYPT(byte *start, size_t size, String const &key, byte const *nonce, size_t nonceLen)
{
Snow2 snow2((byte const *)~key, key.GetCount(), nonce, nonceLen);
snow2(start, size);
}
void PROTECT_OBFUSCATE(byte *start, size_t len, byte *key, size_t keyLen)
{
String k;
for(unsigned i = 0; i < keyLen; i++)
k += *key++;
if(!PROTECT_WRITE_ACCESS(start, len, true))
return;
Snow2 snow2(k, "12345678");
snow2(start, len);
PROTECT_WRITE_ACCESS(start, len, false);
}