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 67