1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
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;
}
|