ultimatepp/bazaar/CypherTest/CypherTest.cpp
micio 0c07fecd9c Bazaar/CypherTest : fixed to match changes in Cypher package
git-svn-id: svn://ultimatepp.org/upp/trunk@2761 f0d560ea-af0d-0410-9eb7-867de7ffcac7
2010-10-10 07:44:53 +00:00

165 lines
2.9 KiB
C++

#include "CypherTest.h"
#include <Cypher/Cypher.h>
CypherTest::CypherTest()
{
CtrlLayout(*this, "Cypher test");
goBtn <<= THISBACK(onGo);
cancelBtn.Cancel() <<= Breaker(0);
cypherSwitch <<= THISBACK(onCypherSwitch);
onCypherSwitch();
keyEdit <<= "AABBCCDDEEFF00112233445566778899";
splitSwitch = 0;
cypherSwitch = 0;
streamSwitch = 0;
}
void CypherTest::onCypherSwitch(void)
{
if(cypherSwitch == 0)
keyLabel.SetText("Key (16 or 32 bytes long, hex-ascii format - 0011223344) :");
else
keyLabel.SetText("Key, usually from 5 to 32 bytes long, hex-ascii format - 0011223344) :");
}
void CypherTest::onGo()
{
String hexAsciiKey = ToUpper(String(~keyEdit));
if(hexAsciiKey.GetCount() != 32 && hexAsciiKey.GetCount() != 64 && cypherSwitch == 0)
{
PromptOK("Key MUST be 16 or 32 bytes long for snow2 cypher");
return;
}
// convert key in hex bytes
String key;
for(int i = 0; i < hexAsciiKey.GetCount()-1;)
{
byte b;
char c = hexAsciiKey[i++];
if(c >= '0' && c <= '9')
b = c - '0';
else if(c >= 'A' && c <= 'F')
b = c - 'A' + 10;
else
{
PromptOK(String("Invalid hex digit '") + c + "' in key");
return;
}
b <<= 4;
c = hexAsciiKey[i++];
if(c >= '0' && c <= '9')
b += c - '0';
else if(c >= 'A' && c <= 'F')
b += c - 'A' + 10;
else
{
PromptOK(String("Invalid hex digit '") + c + "' in key");
return;
}
key.Cat(b);
}
// check source and dest file names
if(~sourceEdit == "" || ~destEdit == "")
return;
if(!FileExists(~sourceEdit))
{
PromptOK(String("File '") + sourceEdit + "' don't exists");
return;
}
if(FileExists(~destEdit))
if(!PromptYesNo(String("File '") + destEdit + "' exists&[*= OVERWRITE ?]"))
return;
// load file to encode
String s = LoadFile(~sourceEdit);
// encode it choosing requested encoder
One<Cypher> cypher;
switch(cypherSwitch)
{
// snow2 Cypher
case 0:
cypher = new Snow2;
break;
// RC4 Cypher
case 1:
cypher = new RC4;
break;
default:
PromptOK("Unsupported Cypher");
return;
}
String d;
// sets Cypher's key
cypher->SetKey(key, "12345");
if(streamSwitch == 0)
{
// buffer mode
if(splitSwitch == 0)
{
d = (*cypher)(s);
}
else
{
int len = s.GetCount();
int randMax = len / 10;
while(len)
{
int rnd = min((int)(Random(randMax) + 1), len);
String ss = s.Left(rnd);
s = s.Right(len - rnd);
len = s.GetCount();
d += (*cypher)(ss);
}
}
}
else
{
// stream mode
if(splitSwitch == 0)
{
(*cypher) << s;
(*cypher) >> d;
}
else
{
int len = s.GetCount();
int randMax = len / 10;
while(len)
{
int rnd = min((int)(Random(randMax) + 1), len);
String ss = s.Left(rnd);
s = s.Right(len - rnd);
len = s.GetCount();
(*cypher) << ss;
}
(*cypher) >> d;
}
}
// save encoded file
if(!SaveFile(~destEdit, d))
{
PromptOK("Error writing dest file!");
return;
}
PromptOK("Encoding ok!");
}
GUI_APP_MAIN
{
CypherTest().Run();
}