Blob


1 #include <u.h>
2 #include <libc.h>
3 #include <bio.h>
4 #include <auth.h>
5 #include <mp.h>
6 #include <libsec.h>
8 enum{ ThumbTab = 1<<10 };
10 static void *
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 }
24 void
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 }
37 int
38 okThumbprint(uchar *sum, Thumbprint *table)
39 {
40 Thumbprint *p;
41 int i = ((sum[0]<<8) + sum[1]) & (ThumbTab-1);
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 }
49 static void
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;
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 }
83 Thumbprint *
84 initThumbprints(char *ok, char *crl)
85 {
86 Thumbprint *table, *crltab = nil;
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 }