xref: /plan9/sys/src/cmd/unix/drawterm/libsec/readcert.c (revision 8ccd4a6360d974db7bd7bbd4f37e7018419ea908)
1*8ccd4a63SDavid du Colombier #include <u.h>
2*8ccd4a63SDavid du Colombier #include <libc.h>
3*8ccd4a63SDavid du Colombier #include <mp.h>
4*8ccd4a63SDavid du Colombier #include <libsec.h>
5*8ccd4a63SDavid du Colombier 
6*8ccd4a63SDavid du Colombier static char*
readfile(char * name)7*8ccd4a63SDavid du Colombier readfile(char *name)
8*8ccd4a63SDavid du Colombier {
9*8ccd4a63SDavid du Colombier 	int fd;
10*8ccd4a63SDavid du Colombier 	char *s;
11*8ccd4a63SDavid du Colombier 	Dir *d;
12*8ccd4a63SDavid du Colombier 
13*8ccd4a63SDavid du Colombier 	fd = open(name, OREAD);
14*8ccd4a63SDavid du Colombier 	if(fd < 0)
15*8ccd4a63SDavid du Colombier 		return nil;
16*8ccd4a63SDavid du Colombier 	if((d = dirfstat(fd)) == nil)
17*8ccd4a63SDavid du Colombier 		return nil;
18*8ccd4a63SDavid du Colombier 	s = malloc(d->length + 1);
19*8ccd4a63SDavid du Colombier 	if(s == nil || readn(fd, s, d->length) != d->length){
20*8ccd4a63SDavid du Colombier 		free(s);
21*8ccd4a63SDavid du Colombier 		free(d);
22*8ccd4a63SDavid du Colombier 		close(fd);
23*8ccd4a63SDavid du Colombier 		return nil;
24*8ccd4a63SDavid du Colombier 	}
25*8ccd4a63SDavid du Colombier 	close(fd);
26*8ccd4a63SDavid du Colombier 	s[d->length] = '\0';
27*8ccd4a63SDavid du Colombier 	free(d);
28*8ccd4a63SDavid du Colombier 	return s;
29*8ccd4a63SDavid du Colombier }
30*8ccd4a63SDavid du Colombier 
31*8ccd4a63SDavid du Colombier uchar*
readcert(char * filename,int * pcertlen)32*8ccd4a63SDavid du Colombier readcert(char *filename, int *pcertlen)
33*8ccd4a63SDavid du Colombier {
34*8ccd4a63SDavid du Colombier 	char *pem;
35*8ccd4a63SDavid du Colombier 	uchar *binary;
36*8ccd4a63SDavid du Colombier 
37*8ccd4a63SDavid du Colombier 	pem = readfile(filename);
38*8ccd4a63SDavid du Colombier 	if(pem == nil){
39*8ccd4a63SDavid du Colombier 		werrstr("can't read %s", filename);
40*8ccd4a63SDavid du Colombier 		return nil;
41*8ccd4a63SDavid du Colombier 	}
42*8ccd4a63SDavid du Colombier 	binary = decodepem(pem, "CERTIFICATE", pcertlen);
43*8ccd4a63SDavid du Colombier 	free(pem);
44*8ccd4a63SDavid du Colombier 	if(binary == nil){
45*8ccd4a63SDavid du Colombier 		werrstr("can't parse %s", filename);
46*8ccd4a63SDavid du Colombier 		return nil;
47*8ccd4a63SDavid du Colombier 	}
48*8ccd4a63SDavid du Colombier 	return binary;
49*8ccd4a63SDavid du Colombier }
50*8ccd4a63SDavid du Colombier 
51