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