git-svn-id: svn://db.shs.com.ru/pip@226 12ceb7fc-bf1f-11e4-8940-5bc7170c53b5
This commit is contained in:
100
utils/crypt_tool/main.cpp
Normal file
100
utils/crypt_tool/main.cpp
Normal file
@@ -0,0 +1,100 @@
|
||||
#include "pip.h"
|
||||
#include "picrypt.h"
|
||||
|
||||
using namespace PICoutManipulators;
|
||||
|
||||
|
||||
void usage() {
|
||||
piCout << Bold << "PIP Crypt Utility";
|
||||
piCout << Cyan << "Version" << Bold << PIPVersion() << NewLine;
|
||||
piCout << Green << Bold << "Usage:" << Default << "\"picrypt [-thr] [-g <pass>] [-o <out_file>] [{[-c <file>] [-u <file>]} {[-p <pass>] [-s <hash>] [-k <key_file>] [-x <hex_key>]}]\"" << NewLine;
|
||||
piCout << Green << Bold << "Details:";
|
||||
piCout << "-h --help " << Green << "- display this message and exit";
|
||||
piCout << "-g --genhash " << Green << "- generate hash from <pass> string";
|
||||
piCout << "-t --text " << Green << "- output in text base64";
|
||||
piCout << "-o --out <out_file> " << Green << "- write out to file <out_file>";
|
||||
piCout << "-c --crypt <file> " << Green << "- crypt file <file> using secret <pass> or <hash> or <key_file>";
|
||||
piCout << "-u --uncrypt <file> " << Green << "- uncrypt file <file> using secret <pass> or <hash> or <key_file>";
|
||||
piCout << "-p --pass <pass> " << Green << "- use secret from passphrase <pass>";
|
||||
piCout << "-s --secret <hash> " << Green << "- use secret from hash <hash>";
|
||||
piCout << "-k --key <key_file> " << Green << "- use secret from binary key_file <key_file>";
|
||||
piCout << "-x --hex [<hex_key>] " << Green << "- use secret from hex hash <hex_key> or output in text hex";
|
||||
piCout << "-r --random " << Green << "- generate random secret key";
|
||||
}
|
||||
|
||||
|
||||
int main (int argc, char * argv[]) {
|
||||
PICrypt crypt;
|
||||
PIByteArray bout;
|
||||
PICLI cli(argc, argv);
|
||||
cli.addArgument("genhash", true);
|
||||
cli.addArgument("out", true);
|
||||
cli.addArgument("crypt", true);
|
||||
cli.addArgument("uncrypt", true);
|
||||
cli.addArgument("pass", true);
|
||||
cli.addArgument("secret", true);
|
||||
cli.addArgument("key", true);
|
||||
cli.addArgument("hex", 'x', "hex", true);
|
||||
cli.addArgument("help");
|
||||
cli.addArgument("text");
|
||||
cli.addArgument("random");
|
||||
|
||||
if (!(cli.hasArgument("genhash") ||
|
||||
cli.hasArgument("crypt") ||
|
||||
cli.hasArgument("uncrypt") ||
|
||||
cli.hasArgument("random")) ||
|
||||
cli.hasArgument("help")) {
|
||||
usage();
|
||||
return 0;
|
||||
}
|
||||
|
||||
PIString out_file = cli.argumentValue("out");
|
||||
PIFile outf;
|
||||
if (!out_file.isEmpty()) {
|
||||
if (outf.open(out_file, PIIODevice::ReadWrite)) {
|
||||
outf.resize(0);
|
||||
} else piCout << "error: while open out file";
|
||||
}
|
||||
|
||||
if (cli.hasArgument("genhash")) {
|
||||
PIString s = cli.argumentValue("genhash");
|
||||
bout = crypt.hash(s);
|
||||
} else if (cli.hasArgument("random")) bout = crypt.generateKey();
|
||||
|
||||
if (cli.hasArgument("crypt") || cli.hasArgument("uncrypt")) {
|
||||
PIByteArray secret;
|
||||
if (cli.hasArgument("key")) {
|
||||
PIFile keyf(cli.argumentValue("key"), PIIODevice::ReadOnly);
|
||||
if (keyf.open()) secret = keyf.readAll();
|
||||
else piCout << "error: while open key file";
|
||||
}
|
||||
if (cli.hasArgument("pass")) secret = crypt.hash(cli.argumentValue("pass"));
|
||||
if (cli.hasArgument("secret")) secret = PIByteArray::fromBase64(cli.argumentValue("secret").toByteArray());
|
||||
if (cli.hasArgument("hex")) secret = PIByteArray::fromHex(cli.argumentValue("hex").toByteArray());
|
||||
if (secret.size() == crypt.sizeKey()) {
|
||||
PIFile inf;
|
||||
PIString in_file;
|
||||
PIByteArray bin;
|
||||
crypt.setKey(secret);
|
||||
if (cli.hasArgument("crypt")) in_file = cli.argumentValue("crypt");
|
||||
if (cli.hasArgument("uncrypt")) in_file = cli.argumentValue("uncrypt");
|
||||
if (inf.open(in_file, PIIODevice::ReadOnly)) {
|
||||
bin = inf.readAll();
|
||||
if (cli.hasArgument("crypt")) bout = crypt.crypt(bin);
|
||||
if (cli.hasArgument("uncrypt")) bout = crypt.decrypt(bin);
|
||||
} else piCout << "error: while open input file";
|
||||
} else piCout << "error: invalid secret";
|
||||
}
|
||||
|
||||
if (!bout.isEmpty()) {
|
||||
if (cli.hasArgument("text")) bout.convertToBase64();
|
||||
else if (cli.hasArgument("hex") && cli.argumentValue("hex").isEmpty()) bout = bout.toHex().toByteArray();
|
||||
if (outf.isOpened()) {
|
||||
outf.write(bout);
|
||||
outf.close();
|
||||
}
|
||||
else fwrite(bout.data(), 1, bout.size(), stdout);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user