summaryrefslogtreecommitdiffstats
path: root/crypt.cpp
blob: e72bd97d336f714b3d9adfca82ab48e11f308366 (plain)
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;
}