1*fb7f0c93SDavid du Colombier #include <u.h>
2*fb7f0c93SDavid du Colombier #include <libc.h>
3*fb7f0c93SDavid du Colombier #include <bio.h>
4*fb7f0c93SDavid du Colombier #include <mp.h>
5*fb7f0c93SDavid du Colombier #include <libsec.h>
6*fb7f0c93SDavid du Colombier
7*fb7f0c93SDavid du Colombier void
usage(void)8*fb7f0c93SDavid du Colombier usage(void)
9*fb7f0c93SDavid du Colombier {
10*fb7f0c93SDavid du Colombier fprint(2, "auth/asn12rsa [-t tag] [file]\n");
11*fb7f0c93SDavid du Colombier exits("usage");
12*fb7f0c93SDavid du Colombier }
13*fb7f0c93SDavid du Colombier
14*fb7f0c93SDavid du Colombier void
main(int argc,char ** argv)15*fb7f0c93SDavid du Colombier main(int argc, char **argv)
16*fb7f0c93SDavid du Colombier {
17*fb7f0c93SDavid du Colombier char *s;
18*fb7f0c93SDavid du Colombier uchar *buf;
19*fb7f0c93SDavid du Colombier int fd;
20*fb7f0c93SDavid du Colombier long n, tot;
21*fb7f0c93SDavid du Colombier char *tag, *file;
22*fb7f0c93SDavid du Colombier RSApriv *key;
23*fb7f0c93SDavid du Colombier
24*fb7f0c93SDavid du Colombier fmtinstall('B', mpfmt);
25*fb7f0c93SDavid du Colombier
26*fb7f0c93SDavid du Colombier tag = nil;
27*fb7f0c93SDavid du Colombier ARGBEGIN{
28*fb7f0c93SDavid du Colombier case 't':
29*fb7f0c93SDavid du Colombier tag = EARGF(usage());
30*fb7f0c93SDavid du Colombier break;
31*fb7f0c93SDavid du Colombier default:
32*fb7f0c93SDavid du Colombier usage();
33*fb7f0c93SDavid du Colombier }ARGEND
34*fb7f0c93SDavid du Colombier
35*fb7f0c93SDavid du Colombier if(argc != 0 && argc != 1)
36*fb7f0c93SDavid du Colombier usage();
37*fb7f0c93SDavid du Colombier
38*fb7f0c93SDavid du Colombier if(argc == 1)
39*fb7f0c93SDavid du Colombier file = argv[0];
40*fb7f0c93SDavid du Colombier else
41*fb7f0c93SDavid du Colombier file = "#d/0";
42*fb7f0c93SDavid du Colombier
43*fb7f0c93SDavid du Colombier if((fd = open(file, OREAD)) < 0)
44*fb7f0c93SDavid du Colombier sysfatal("open %s: %r", file);
45*fb7f0c93SDavid du Colombier buf = nil;
46*fb7f0c93SDavid du Colombier tot = 0;
47*fb7f0c93SDavid du Colombier for(;;){
48*fb7f0c93SDavid du Colombier buf = realloc(buf, tot+8192);
49*fb7f0c93SDavid du Colombier if(buf == nil)
50*fb7f0c93SDavid du Colombier sysfatal("realloc: %r");
51*fb7f0c93SDavid du Colombier if((n = read(fd, buf+tot, 8192)) < 0)
52*fb7f0c93SDavid du Colombier sysfatal("read: %r");
53*fb7f0c93SDavid du Colombier if(n == 0)
54*fb7f0c93SDavid du Colombier break;
55*fb7f0c93SDavid du Colombier tot += n;
56*fb7f0c93SDavid du Colombier }
57*fb7f0c93SDavid du Colombier
58*fb7f0c93SDavid du Colombier key = asn1toRSApriv(buf, tot);
59*fb7f0c93SDavid du Colombier if(key == nil)
60*fb7f0c93SDavid du Colombier sysfatal("couldn't parse asn1 key");
61*fb7f0c93SDavid du Colombier
62*fb7f0c93SDavid du Colombier s = smprint("key proto=rsa %s%ssize=%d ek=%B !dk=%B n=%B !p=%B !q=%B !kp=%B !kq=%B !c2=%B\n",
63*fb7f0c93SDavid du Colombier tag ? tag : "", tag ? " " : "",
64*fb7f0c93SDavid du Colombier mpsignif(key->pub.n), key->pub.ek,
65*fb7f0c93SDavid du Colombier key->dk, key->pub.n, key->p, key->q,
66*fb7f0c93SDavid du Colombier key->kp, key->kq, key->c2);
67*fb7f0c93SDavid du Colombier if(s == nil)
68*fb7f0c93SDavid du Colombier sysfatal("smprint: %r");
69*fb7f0c93SDavid du Colombier write(1, s, strlen(s));
70*fb7f0c93SDavid du Colombier exits(0);
71*fb7f0c93SDavid du Colombier }
72