-
Notifications
You must be signed in to change notification settings - Fork 0
/
rpu.c
122 lines (119 loc) · 3.83 KB
/
rpu.c
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
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
#include <stdio.h>
#include <string.h>
#include "rsa.h"
#include "findopt.h"
#define strswitch if ( 0 ) { }
#define streq(n) else if(!strcmp(action, n))
#define error(s) fprintf(stderr, "Error: %s\n", s)
#define errordone(s) fprintf(stderr, "Exiting: %s\n", s); exit(1)
#define require(v) if ( v[0] == 'n' && v[1] == 0 ) { errordone("Required param: " # v); }
#define fsetfp(v, d, m) if ( !(v[0] == 'n' && v[1] == 0) ) { d = fopen(v, m); checkfile(d); }
#define checkfile(v) if ( v == NULL ) { errordone("Could not open file."); }
void keyreadfile(struct key_class *dest, char *filename) {
FILE *fp = fopen(filename, "r");
checkfile(fp);
fscanf(fp, "%lld %lld", (long long*)&dest->modulus, (long long*)&dest->exponent);
//printf("%lld %lld", dest->modulus, dest->exponent);
fclose(fp);
}
// char *findopt(char *shorty, char *longy, int hasparam, int argc, char *argv[])
int main ( int argc, char **argv ) {
struct public_key_class pub[1];
struct private_key_class priv[1];
char* infile = findopt("-f", "--file", 1, argc, argv);
char* outfile = findopt("-o", "--out", 1, argc, argv);
char* keyfile = findopt("-k", "--key", 1, argc, argv);
char* privfile = findopt("-p", "--private", 1, argc, argv);
char* action = findopt(argv[0], argv[0], 1, argc, argv);
FILE *dest = stdout;
FILE *src = stdin;
fsetfp(infile, src, "r");
fsetfp(outfile, dest, "w");
if (0) { } streq("--help") {
error("Usage: rsu [gen|encrypt|decrypt|sign|verify] [-f infile] [-o outfile] [-k pubkey] [-p privkey]");
errordone("End usage.");
} streq("gen") {
require(keyfile);
require(privfile);
rsa_gen_keys(pub, priv, "primes.txt");
FILE *privf = fopen(privfile, "w");
checkfile(privf);
fprintf(privf, "%lld %lld",(long long)priv->modulus,(long long)priv->exponent);
fclose(privf);
FILE *pubf = fopen(keyfile, "w");
checkfile(pubf);
fprintf(pubf, "%lld %lld",(long long)pub->modulus,(long long)pub->exponent);
fclose(pubf);
} streq("encrypt") {
require(keyfile);
keyreadfile(pub, keyfile);
unsigned char *inbuf;
int q = 0;
inbuf = malloc(4096);
while ( 1 ) {
q = fread(&inbuf[q], 1, 4096, src);
if ( feof(src) ) { break; }
inbuf = realloc(inbuf, q + 4096);
}
//printf("%d\n", q);
long long *encrypted = rsa_encrypt(inbuf, q, pub);
checkfile(encrypted);
int p = 0;
for (p = 0; p < q; p++) {
fprintf(dest, "%lld ", (long long)encrypted[p]);
}
} streq("decrypt") {
require(privfile);
keyreadfile(priv, privfile);
long long *encrypted = malloc(sizeof(long long));
int q = 0;
while ( 1 ) {
// printf("%d\n", q);
fscanf(src, "%lld ", &encrypted[q]);
if ( feof(src) ) { break; }
q++;
encrypted = realloc(encrypted, (q+4)*sizeof(long long));
}
//printf("%lld", encrypted[0]);
unsigned char* decrypted = rsa_decrypt(encrypted, q*sizeof(long long), priv);
checkfile(decrypted);
fwrite(decrypted, 1, q, dest);
} streq("sign") {
require(privfile);
keyreadfile(pub, privfile);
unsigned char *inbuf;
int q = 0;
inbuf = malloc(4096);
while ( 1 ) {
q = fread(&inbuf[q], 1, 4096, src);
if ( feof(src) ) { break; }
inbuf = realloc(inbuf, q + 4096);
}
//printf("%d\n", q);
char *dat123 = str_crc32(inbuf, q);
//printf("Hi %s\n", dat123);
long long *encrypted = rsa_encrypt(dat123, 9, pub);
checkfile(encrypted);
int p = 0;
for (p = 0; p < 9; p++) {
fprintf(dest, "%lld ", (long long)encrypted[p]);
}
} streq("verify") {
require(keyfile);
keyreadfile(priv, keyfile);
long long *encrypted = malloc(sizeof(long long));
int q = 0;
while ( 1 ) {
// printf("%d\n", q);
fscanf(src, "%lld ", &encrypted[q]);
if ( feof(src) ) { break; }
q++;
encrypted = realloc(encrypted, (q+4)*sizeof(long long));
}
//printf("%lld", encrypted[0]);
unsigned char* decrypted = rsa_decrypt(encrypted, q*sizeof(long long), priv);
checkfile(decrypted);
fwrite(decrypted, 1, q, dest);
}
return 0;
}