xref: /plan9/sys/src/cmd/auth/pemdecode.c (revision 51711cb6a91a3f2a5be5c3246334b85a608f135b)
1fb7f0c93SDavid du Colombier #include <u.h>
2fb7f0c93SDavid du Colombier #include <libc.h>
3fb7f0c93SDavid du Colombier #include <bio.h>
4fb7f0c93SDavid du Colombier #include <mp.h>
5fb7f0c93SDavid du Colombier #include <libsec.h>
6fb7f0c93SDavid du Colombier 
7fb7f0c93SDavid du Colombier void
usage(void)8fb7f0c93SDavid du Colombier usage(void)
9fb7f0c93SDavid du Colombier {
10fb7f0c93SDavid du Colombier 	fprint(2, "auth/pemdecode section [file]\n");
11fb7f0c93SDavid du Colombier 	exits("usage");
12fb7f0c93SDavid du Colombier }
13fb7f0c93SDavid du Colombier 
14fb7f0c93SDavid du Colombier void
main(int argc,char ** argv)15fb7f0c93SDavid du Colombier main(int argc, char **argv)
16fb7f0c93SDavid du Colombier {
17fb7f0c93SDavid du Colombier 	char *buf;
18fb7f0c93SDavid du Colombier 	uchar *bin;
19fb7f0c93SDavid du Colombier 	int fd;
20fb7f0c93SDavid du Colombier 	long n, tot;
21fb7f0c93SDavid du Colombier 	int len;
22fb7f0c93SDavid du Colombier 	char *tag, *file;
23fb7f0c93SDavid du Colombier 
24fb7f0c93SDavid du Colombier 	ARGBEGIN{
25fb7f0c93SDavid du Colombier 	default:
26fb7f0c93SDavid du Colombier 		usage();
27fb7f0c93SDavid du Colombier 	}ARGEND
28fb7f0c93SDavid du Colombier 
29fb7f0c93SDavid du Colombier 	if(argc != 1 && argc != 2)
30fb7f0c93SDavid du Colombier 		usage();
31fb7f0c93SDavid du Colombier 
32fb7f0c93SDavid du Colombier 	tag = argv[0];
33fb7f0c93SDavid du Colombier 	if(argc == 2)
34fb7f0c93SDavid du Colombier 		file = argv[1];
35fb7f0c93SDavid du Colombier 	else
36fb7f0c93SDavid du Colombier 		file = "#d/0";
37fb7f0c93SDavid du Colombier 
38fb7f0c93SDavid du Colombier 	if((fd = open(file, OREAD)) < 0)
39fb7f0c93SDavid du Colombier 		sysfatal("open %s: %r", file);
40fb7f0c93SDavid du Colombier 	buf = nil;
41fb7f0c93SDavid du Colombier 	tot = 0;
42fb7f0c93SDavid du Colombier 	for(;;){
43fb7f0c93SDavid du Colombier 		buf = realloc(buf, tot+8192);
44fb7f0c93SDavid du Colombier 		if(buf == nil)
45fb7f0c93SDavid du Colombier 			sysfatal("realloc: %r");
46fb7f0c93SDavid du Colombier 		if((n = read(fd, buf+tot, 8192)) < 0)
47fb7f0c93SDavid du Colombier 			sysfatal("read: %r");
48fb7f0c93SDavid du Colombier 		if(n == 0)
49fb7f0c93SDavid du Colombier 			break;
50fb7f0c93SDavid du Colombier 		tot += n;
51fb7f0c93SDavid du Colombier 	}
52fb7f0c93SDavid du Colombier 	buf[tot] = 0;
53*51711cb6SDavid du Colombier 	bin = decodePEM(buf, tag, &len, nil);
54fb7f0c93SDavid du Colombier 	if(bin == nil)
55fb7f0c93SDavid du Colombier 		sysfatal("cannot extract section '%s' from pem", tag);
56fb7f0c93SDavid du Colombier 	if((n=write(1, bin, len)) != len)
57fb7f0c93SDavid du Colombier 		sysfatal("writing %d bytes got %ld: %r", len, n);
58fb7f0c93SDavid du Colombier 	exits(0);
59fb7f0c93SDavid du Colombier }
60