xref: /plan9/sys/src/libsec/port/readcert.c (revision e2b0f4371e34e735d64e403b0ed53f73ead18f2c)
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