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