]> git.lizzy.rs Git - plan9front.git/blob - sys/src/libsec/port/readcert.c
libsec: make sure Elem is zero initialized so freevalfields() wont cause accidents
[plan9front.git] / sys / src / libsec / port / readcert.c
1 #include <u.h>
2 #include <libc.h>
3 #include <auth.h>
4 #include <mp.h>
5 #include <libsec.h>
6
7 static char*
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*
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 *
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