19a747e4fSDavid du Colombier #include <u.h>
29a747e4fSDavid du Colombier #include <libc.h>
39a747e4fSDavid du Colombier #include <auth.h>
49a747e4fSDavid du Colombier #include <mp.h>
59a747e4fSDavid du Colombier #include <libsec.h>
69a747e4fSDavid du Colombier
79a747e4fSDavid du Colombier static char*
readfile(char * name)89a747e4fSDavid du Colombier readfile(char *name)
99a747e4fSDavid du Colombier {
109a747e4fSDavid du Colombier int fd;
119a747e4fSDavid du Colombier char *s;
129a747e4fSDavid du Colombier Dir *d;
139a747e4fSDavid du Colombier
149a747e4fSDavid du Colombier fd = open(name, OREAD);
159a747e4fSDavid du Colombier if(fd < 0)
169a747e4fSDavid du Colombier return nil;
17*e2b0f437SDavid du Colombier if((d = dirfstat(fd)) == nil) {
18*e2b0f437SDavid du Colombier close(fd);
199a747e4fSDavid du Colombier return nil;
20*e2b0f437SDavid du Colombier }
219a747e4fSDavid du Colombier s = malloc(d->length + 1);
229a747e4fSDavid du Colombier if(s == nil || readn(fd, s, d->length) != d->length){
239a747e4fSDavid du Colombier free(s);
249a747e4fSDavid du Colombier free(d);
259a747e4fSDavid du Colombier close(fd);
269a747e4fSDavid du Colombier return nil;
279a747e4fSDavid du Colombier }
289a747e4fSDavid du Colombier close(fd);
299a747e4fSDavid du Colombier s[d->length] = '\0';
309a747e4fSDavid du Colombier free(d);
319a747e4fSDavid du Colombier return s;
329a747e4fSDavid du Colombier }
339a747e4fSDavid du Colombier
349a747e4fSDavid du Colombier uchar*
readcert(char * filename,int * pcertlen)359a747e4fSDavid du Colombier readcert(char *filename, int *pcertlen)
369a747e4fSDavid du Colombier {
379a747e4fSDavid du Colombier char *pem;
389a747e4fSDavid du Colombier uchar *binary;
399a747e4fSDavid du Colombier
409a747e4fSDavid du Colombier pem = readfile(filename);
419a747e4fSDavid du Colombier if(pem == nil){
42*e2b0f437SDavid du Colombier werrstr("can't read %s: %r", filename);
439a747e4fSDavid du Colombier return nil;
449a747e4fSDavid du Colombier }
4551711cb6SDavid du Colombier binary = decodePEM(pem, "CERTIFICATE", pcertlen, nil);
469a747e4fSDavid du Colombier free(pem);
479a747e4fSDavid du Colombier if(binary == nil){
489a747e4fSDavid du Colombier werrstr("can't parse %s", filename);
499a747e4fSDavid du Colombier return nil;
509a747e4fSDavid du Colombier }
519a747e4fSDavid du Colombier return binary;
529a747e4fSDavid du Colombier }
539a747e4fSDavid du Colombier
5451711cb6SDavid du Colombier PEMChain *
readcertchain(char * filename)5551711cb6SDavid du Colombier readcertchain(char *filename)
5651711cb6SDavid du Colombier {
5751711cb6SDavid du Colombier char *chfile;
5851711cb6SDavid du Colombier
5951711cb6SDavid du Colombier chfile = readfile(filename);
6051711cb6SDavid du Colombier if (chfile == nil) {
61*e2b0f437SDavid du Colombier werrstr("can't read %s: %r", filename);
6251711cb6SDavid du Colombier return nil;
6351711cb6SDavid du Colombier }
64*e2b0f437SDavid du Colombier return decodepemchain(chfile, "CERTIFICATE");
6551711cb6SDavid du Colombier }
6651711cb6SDavid du Colombier
67