diff options
Diffstat (limited to 'crypt.cpp')
-rw-r--r-- | crypt.cpp | 85 |
1 files changed, 85 insertions, 0 deletions
diff --git a/crypt.cpp b/crypt.cpp new file mode 100644 index 0000000..e72bd97 --- /dev/null +++ b/crypt.cpp @@ -0,0 +1,85 @@ +/* + * crypt.cpp + * + * + */ + +#include "crypt.h" +#define DEBUG + +/* forward declaration of variables from crypt_args.h */ +extern char *fname; +extern char *keyfname; +extern char *outfname; + +struct rsakey_t +{ + long unsigned e, d, n; +}; + +/* parse pubkey xml file */ +struct rsakey_t parse_key(FILE *file) +{ + struct rsakey_t key = { 0, 0, 0}; + + /* used for line reading */ + size_t line_sz = 80; + char *line = (char *) malloc(sizeof(char) * line_sz); + + while (getline(&line, &line_sz, file) != -1) + { + sscanf(line, "\t<dvalue>%lu</dvalue>\n", &key.d); + sscanf(line, "\t<evalue>%lu</evalue>\n", &key.e); + sscanf(line, "\t<nvalue>%lu</nvalue>\n", &key.n); + } + + free(line); + return key; +} + +int main(int argc, char **argv) +{ + if (crypt_args(argc, argv) == 0) + cout << "read arguments successfully" << endl; + +#ifdef DEBUG + printf("debug: filename = \"%s\"\n" + " key filename = \"%s\"\n" + " result filename = \"%s\"\n", + fname, keyfname, outfname); +#endif + + /* open file for reading and writing */ + FILE *fname_fl = fopen(fname, "r"); + FILE *keyfname_fl = fopen(keyfname, "r"); + FILE *outfname_fl = fopen(outfname, "w"); + if (fname_fl == NULL || keyfname_fl == NULL || outfname_fl == NULL) + { + perror("fopen"); + exit(EXIT_FAILURE); + } + + int mode = -1; + struct rsakey_t key = parse_key(keyfname_fl); + + if (key.d == 0 && key.e && key.n) + { + cout << "public key (" << key.e << ", " << key.n + << ") detected, will perform encryption" << endl; + mode = 0; + } + else if (key.e == 0 && key.d && key.n) + { + cout << "private key (" << key.d << ", " << key.n + << ") detected, will perform decryption" << endl; + mode = 1; + } + else + { + fprintf(stderr, "could not determine mode (encryption/decryption)\n"); + exit(EXIT_FAILURE); + } + + return 0; +} + |