xref: /plan9/sys/src/libsec/port/readcert.c (revision e2b0f4371e34e735d64e403b0ed53f73ead18f2c)
1 #include <u.h>
2 #include <libc.h>
3 #include <auth.h>
4 #include <mp.h>
5 #include <libsec.h>
6 
7 static char*
readfile(char * name)8 readfile(char *name)
9 {
10 	int fd;
11 	char *s;
12 	Dir *d;
13 
14 	fd = open(name, OREAD);
15 	if(fd < 0)
16 		return nil;
17 	if((d = dirfstat(fd)) == nil) {
18 		close(fd);
19 		return nil;
20 	}
21 	s = malloc(d->length + 1);
22 	if(s == nil || readn(fd, s, d->length) != d->length){
23 		free(s);
24 		free(d);
25 		close(fd);
26 		return nil;
27 	}
28 	close(fd);
29 	s[d->length] = '\0';
30 	free(d);
31 	return s;
32 }
33 
34 uchar*
readcert(char * filename,int * pcertlen)35 readcert(char *filename, int *pcertlen)
36 {
37 	char *pem;
38 	uchar *binary;
39 
40 	pem = readfile(filename);
41 	if(pem == nil){
42 		werrstr("can't read %s: %r", filename);
43 		return nil;
44 	}
45 	binary = decodePEM(pem, "CERTIFICATE", pcertlen, nil);
46 	free(pem);
47 	if(binary == nil){
48 		werrstr("can't parse %s", filename);
49 		return nil;
50 	}
51 	return binary;
52 }
53 
54 PEMChain *
readcertchain(char * filename)55 readcertchain(char *filename)
56 {
57 	char *chfile;
58 
59 	chfile = readfile(filename);
60 	if (chfile == nil) {
61 		werrstr("can't read %s: %r", filename);
62 		return nil;
63 	}
64 	return decodepemchain(chfile, "CERTIFICATE");
65 }
66 
67