|  | #include <u.h> | 
|  | #include <libc.h> | 
|  | #include <auth.h> | 
|  | #include <mp.h> | 
|  | #include <libsec.h> | 
|  |  | 
|  | static char* | 
|  | readfile(char *name) | 
|  | { | 
|  | int fd; | 
|  | char *s; | 
|  | Dir *d; | 
|  |  | 
|  | fd = open(name, OREAD); | 
|  | if(fd < 0) | 
|  | return nil; | 
|  | if((d = dirfstat(fd)) == nil) | 
|  | return nil; | 
|  | s = malloc(d->length + 1); | 
|  | if(s == nil || readn(fd, s, d->length) != d->length){ | 
|  | free(s); | 
|  | free(d); | 
|  | close(fd); | 
|  | return nil; | 
|  | } | 
|  | close(fd); | 
|  | s[d->length] = '\0'; | 
|  | free(d); | 
|  | return s; | 
|  | } | 
|  |  | 
|  | uchar* | 
|  | readcert(char *filename, int *pcertlen) | 
|  | { | 
|  | char *pem; | 
|  | uchar *binary; | 
|  |  | 
|  | pem = readfile(filename); | 
|  | if(pem == nil){ | 
|  | werrstr("can't read %s", filename); | 
|  | return nil; | 
|  | } | 
|  | binary = decodepem(pem, "CERTIFICATE", pcertlen, nil); | 
|  | free(pem); | 
|  | if(binary == nil){ | 
|  | werrstr("can't parse %s", filename); | 
|  | return nil; | 
|  | } | 
|  | return binary; | 
|  | } | 
|  |  | 
|  |  | 
|  | PEMChain * | 
|  | readcertchain(char *filename) | 
|  | { | 
|  | char *chfile; | 
|  | PEMChain *chp; | 
|  |  | 
|  | chfile = readfile(filename); | 
|  | if (chfile == nil) { | 
|  | werrstr("can't read %s", filename); | 
|  | return nil; | 
|  | } | 
|  | chp = decodepemchain(chfile, "CERTIFICATE"); | 
|  | return chp; | 
|  | } | 
|  |  |