xref: /plan9/sys/src/cmd/unix/drawterm/libsec/thumb.c (revision 8ccd4a6360d974db7bd7bbd4f37e7018419ea908)
1*8ccd4a63SDavid du Colombier #include <u.h>
2*8ccd4a63SDavid du Colombier #include <libc.h>
3*8ccd4a63SDavid du Colombier #include <bio.h>
4*8ccd4a63SDavid du Colombier #include <auth.h>
5*8ccd4a63SDavid du Colombier #include <mp.h>
6*8ccd4a63SDavid du Colombier #include <libsec.h>
7*8ccd4a63SDavid du Colombier 
8*8ccd4a63SDavid du Colombier enum{ ThumbTab = 1<<10 };
9*8ccd4a63SDavid du Colombier 
10*8ccd4a63SDavid du Colombier static void *
emalloc(int n)11*8ccd4a63SDavid du Colombier emalloc(int n)
12*8ccd4a63SDavid du Colombier {
13*8ccd4a63SDavid du Colombier 	void *p;
14*8ccd4a63SDavid du Colombier 	if(n==0)
15*8ccd4a63SDavid du Colombier 		n=1;
16*8ccd4a63SDavid du Colombier 	p = malloc(n);
17*8ccd4a63SDavid du Colombier 	if(p == nil){
18*8ccd4a63SDavid du Colombier 		exits("out of memory");
19*8ccd4a63SDavid du Colombier 	}
20*8ccd4a63SDavid du Colombier 	memset(p, 0, n);
21*8ccd4a63SDavid du Colombier 	return p;
22*8ccd4a63SDavid du Colombier }
23*8ccd4a63SDavid du Colombier 
24*8ccd4a63SDavid du Colombier void
freeThumbprints(Thumbprint * table)25*8ccd4a63SDavid du Colombier freeThumbprints(Thumbprint *table)
26*8ccd4a63SDavid du Colombier {
27*8ccd4a63SDavid du Colombier 	Thumbprint *hd, *p, *q;
28*8ccd4a63SDavid du Colombier 	for(hd = table; hd < table+ThumbTab; hd++){
29*8ccd4a63SDavid du Colombier 		for(p = hd->next; p; p = q){
30*8ccd4a63SDavid du Colombier 			q = p->next;
31*8ccd4a63SDavid du Colombier 			free(p);
32*8ccd4a63SDavid du Colombier 		}
33*8ccd4a63SDavid du Colombier 	}
34*8ccd4a63SDavid du Colombier 	free(table);
35*8ccd4a63SDavid du Colombier }
36*8ccd4a63SDavid du Colombier 
37*8ccd4a63SDavid du Colombier int
okThumbprint(uchar * sum,Thumbprint * table)38*8ccd4a63SDavid du Colombier okThumbprint(uchar *sum, Thumbprint *table)
39*8ccd4a63SDavid du Colombier {
40*8ccd4a63SDavid du Colombier 	Thumbprint *p;
41*8ccd4a63SDavid du Colombier 	int i = ((sum[0]<<8) + sum[1]) & (ThumbTab-1);
42*8ccd4a63SDavid du Colombier 
43*8ccd4a63SDavid du Colombier 	for(p = table[i].next; p; p = p->next)
44*8ccd4a63SDavid du Colombier 		if(memcmp(sum, p->sha1, SHA1dlen) == 0)
45*8ccd4a63SDavid du Colombier 			return 1;
46*8ccd4a63SDavid du Colombier 	return 0;
47*8ccd4a63SDavid du Colombier }
48*8ccd4a63SDavid du Colombier 
49*8ccd4a63SDavid du Colombier static void
loadThumbprints(char * file,Thumbprint * table,Thumbprint * crltab)50*8ccd4a63SDavid du Colombier loadThumbprints(char *file, Thumbprint *table, Thumbprint *crltab)
51*8ccd4a63SDavid du Colombier {
52*8ccd4a63SDavid du Colombier 	Thumbprint *entry;
53*8ccd4a63SDavid du Colombier 	Biobuf *bin;
54*8ccd4a63SDavid du Colombier 	char *line, *field[50];
55*8ccd4a63SDavid du Colombier 	uchar sum[SHA1dlen];
56*8ccd4a63SDavid du Colombier 	int i;
57*8ccd4a63SDavid du Colombier 
58*8ccd4a63SDavid du Colombier 	bin = Bopen(file, OREAD);
59*8ccd4a63SDavid du Colombier 	if(bin == nil)
60*8ccd4a63SDavid du Colombier 		return;
61*8ccd4a63SDavid du Colombier 	for(; (line = Brdstr(bin, '\n', 1)) != 0; free(line)){
62*8ccd4a63SDavid du Colombier 		if(tokenize(line, field, nelem(field)) < 2)
63*8ccd4a63SDavid du Colombier 			continue;
64*8ccd4a63SDavid du Colombier 		if(strcmp(field[0], "#include") == 0){
65*8ccd4a63SDavid du Colombier 			loadThumbprints(field[1], table, crltab);
66*8ccd4a63SDavid du Colombier 			continue;
67*8ccd4a63SDavid du Colombier 		}
68*8ccd4a63SDavid du Colombier 		if(strcmp(field[0], "x509") != 0 || strncmp(field[1], "sha1=", strlen("sha1=")) != 0)
69*8ccd4a63SDavid du Colombier 			continue;
70*8ccd4a63SDavid du Colombier 		field[1] += strlen("sha1=");
71*8ccd4a63SDavid du Colombier 		dec16(sum, sizeof(sum), field[1], strlen(field[1]));
72*8ccd4a63SDavid du Colombier 		if(crltab && okThumbprint(sum, crltab))
73*8ccd4a63SDavid du Colombier 			continue;
74*8ccd4a63SDavid du Colombier 		entry = (Thumbprint*)emalloc(sizeof(*entry));
75*8ccd4a63SDavid du Colombier 		memcpy(entry->sha1, sum, SHA1dlen);
76*8ccd4a63SDavid du Colombier 		i = ((sum[0]<<8) + sum[1]) & (ThumbTab-1);
77*8ccd4a63SDavid du Colombier 		entry->next = table[i].next;
78*8ccd4a63SDavid du Colombier 		table[i].next = entry;
79*8ccd4a63SDavid du Colombier 	}
80*8ccd4a63SDavid du Colombier 	Bterm(bin);
81*8ccd4a63SDavid du Colombier }
82*8ccd4a63SDavid du Colombier 
83*8ccd4a63SDavid du Colombier Thumbprint *
initThumbprints(char * ok,char * crl)84*8ccd4a63SDavid du Colombier initThumbprints(char *ok, char *crl)
85*8ccd4a63SDavid du Colombier {
86*8ccd4a63SDavid du Colombier 	Thumbprint *table, *crltab = nil;
87*8ccd4a63SDavid du Colombier 
88*8ccd4a63SDavid du Colombier 	if(crl){
89*8ccd4a63SDavid du Colombier 		crltab = emalloc(ThumbTab * sizeof(*table));
90*8ccd4a63SDavid du Colombier 		loadThumbprints(crl, crltab, nil);
91*8ccd4a63SDavid du Colombier 	}
92*8ccd4a63SDavid du Colombier 	table = emalloc(ThumbTab * sizeof(*table));
93*8ccd4a63SDavid du Colombier 	loadThumbprints(ok, table, crltab);
94*8ccd4a63SDavid du Colombier 	free(crltab);
95*8ccd4a63SDavid du Colombier 	return table;
96*8ccd4a63SDavid du Colombier }
97*8ccd4a63SDavid du Colombier 
98