xref: /plan9/sys/src/cmd/auth/asn12rsa.c (revision fb7f0c934c48abaed6040d054ef636408c3c522d)
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