added crypt+sign support

This commit is contained in:
git@daemon.de
2014-01-27 16:12:43 +01:00
parent 038439bbfb
commit 770d8cb234
6 changed files with 137 additions and 38 deletions

View File

@@ -22,7 +22,7 @@
#include "encryption.h"
int pcpdecrypt(char *id, int useid, char *infile, char *outfile, char *passwd) {
int pcpdecrypt(char *id, int useid, char *infile, char *outfile, char *passwd, int verify) {
FILE *in = NULL;
FILE *out = NULL;
pcp_key_t *secret = NULL;
@@ -113,13 +113,15 @@ int pcpdecrypt(char *id, int useid, char *infile, char *outfile, char *passwd) {
}
if(symkey == NULL)
dlen = pcp_decrypt_file(in, out, secret, NULL);
dlen = pcp_decrypt_file(in, out, secret, NULL, verify);
else
dlen = pcp_decrypt_file(in, out, NULL, symkey);
dlen = pcp_decrypt_file(in, out, NULL, symkey, verify);
if(dlen > 0) {
fprintf(stderr, "Decrypted %d bytes successfully\n",
(int)dlen);
if(verify)
fprintf(stderr, "Decrypted and Verified %ld bytes successfully\n", dlen);
else
fprintf(stderr, "Decrypted %ld bytes successfully\n", dlen);
return 0;
}
@@ -130,7 +132,7 @@ int pcpdecrypt(char *id, int useid, char *infile, char *outfile, char *passwd) {
int pcpencrypt(char *id, char *infile, char *outfile, char *passwd, plist_t *recipient) {
int pcpencrypt(char *id, char *infile, char *outfile, char *passwd, plist_t *recipient, int signcrypt) {
FILE *in = NULL;
FILE *out = NULL;
pcp_pubkey_t *pubhash = NULL; // FIXME: add free()
@@ -259,9 +261,9 @@ int pcpencrypt(char *id, char *infile, char *outfile, char *passwd, plist_t *rec
size_t clen = 0;
if(self == 1)
clen = pcp_encrypt_file_sym(in, out, symkey, 0);
clen = pcp_encrypt_file_sym(in, out, symkey, 0, NULL);
else
clen = pcp_encrypt_file(in, out, secret, pubhash);
clen = pcp_encrypt_file(in, out, secret, pubhash, signcrypt);
if(clen > 0) {
if(id == NULL && recipient == NULL)
@@ -277,6 +279,8 @@ int pcpencrypt(char *id, char *infile, char *outfile, char *passwd, plist_t *rec
free(t);
free(cur);
}
if(signcrypt)
fprintf(stderr, "Signed encrypted file successfully\n");
return 0;
}

View File

@@ -36,7 +36,7 @@
#include "keyhash.h"
#include "plist.h"
int pcpdecrypt(char *id, int useid, char *infile, char *outfile, char *passwd);
int pcpencrypt(char *id, char *infile, char *outfile, char *passwd, plist_t *recipient);
int pcpdecrypt(char *id, int useid, char *infile, char *outfile, char *passwd, int verify);
int pcpencrypt(char *id, char *infile, char *outfile, char *passwd, plist_t *recipient, int signcrypt);
#endif // _HAVE_ENCRYPTION_H

View File

@@ -44,7 +44,7 @@ char *default_vault() {
}
int main (int argc, char **argv) {
int opt, mode, usevault, useid, userec, lo, armor, detach;
int opt, mode, usevault, useid, userec, lo, armor, detach, signcrypt;
char *vaultfile = default_vault();
char *outfile = NULL;
char *infile = NULL;
@@ -65,6 +65,7 @@ int main (int argc, char **argv) {
lo = 0;
armor = 0;
detach = 0;
signcrypt = 0;
static struct option longopts[] = {
// generics
@@ -103,12 +104,12 @@ int main (int argc, char **argv) {
// signing
{ "sign", no_argument, NULL, 'g' },
{ "check-signature", required_argument, NULL, 'c' },
{ "check-signature", optional_argument, NULL, 'c' },
{ "detach", no_argument, NULL, 'a' },
{ NULL, 0, NULL, 0 }
};
while ((opt = getopt_long(argc, argv, "klV:vdehsO:i:I:pSPRtEx:DzZr:gc:yma",
while ((opt = getopt_long(argc, argv, "klV:vdehsO:i:I:pSPRtEx:DzZr:gc::yma",
longopts, NULL)) != -1) {
switch (opt) {
@@ -183,8 +184,10 @@ int main (int argc, char **argv) {
break;
case 'c':
mode += PCP_MODE_VERIFY;
sigfile = ucmalloc(strlen(optarg)+1);
strncpy(sigfile, optarg, strlen(optarg)+1);
if(optarg) {
sigfile = ucmalloc(strlen(optarg)+1);
strncpy(sigfile, optarg, strlen(optarg)+1);
}
usevault = 1;
break;
case 'y':
@@ -238,6 +241,16 @@ int main (int argc, char **argv) {
return 1;
}
if(mode == PCP_MODE_ENCRYPT + PCP_MODE_SIGN) {
mode = PCP_MODE_ENCRYPT;
signcrypt = 1;
}
if(mode == PCP_MODE_DECRYPT + PCP_MODE_VERIFY) {
mode = PCP_MODE_DECRYPT;
signcrypt = 1;
}
sodium_init(); // FIXME: better called from the lib?
if(mode == PCP_MODE_ENCRYPT && useid == 0 && userec == 0) {
@@ -345,11 +358,11 @@ int main (int argc, char **argv) {
if(useid == 1 && userec == 0) {
// one dst, FIXME: make id a list as well
id = pcp_normalize_id(keyid);
pcpencrypt(id, infile, outfile, xpass, NULL);
pcpencrypt(id, infile, outfile, xpass, NULL, signcrypt);
}
else if(useid == 0 && userec == 1) {
// multiple dst
pcpencrypt(NULL, infile, outfile, xpass, recipient);
pcpencrypt(NULL, infile, outfile, xpass, recipient, signcrypt);
}
else {
// -i and -r specified
@@ -368,12 +381,12 @@ int main (int argc, char **argv) {
if(useid) {
id = pcp_normalize_id(keyid);
if(id != NULL) {
pcpdecrypt(id, useid, infile, outfile, xpass);
pcpdecrypt(id, useid, infile, outfile, xpass, signcrypt);
free(id);
}
}
else {
pcpdecrypt(NULL, useid, infile, outfile, xpass);
pcpdecrypt(NULL, useid, infile, outfile, xpass, signcrypt);
}
if(xpass != NULL)
free(xpass);
@@ -422,7 +435,7 @@ int main (int argc, char **argv) {
break;
case PCP_MODE_ENCRYPT_ME:
pcpencrypt(NULL, infile, outfile, xpass, NULL);
pcpencrypt(NULL, infile, outfile, xpass, NULL, 0);
break;
case PCP_MODE_TEXT: