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