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