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