Blame


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