8 enum{ ThumbTab = 1<<10 };
18 exits("out of memory");
25 freeThumbprints(Thumbprint *table)
27 Thumbprint *hd, *p, *q;
28 for(hd = table; hd < table+ThumbTab; hd++){
29 for(p = hd->next; p; p = q){
38 okThumbprint(uchar *sum, Thumbprint *table)
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)
50 loadThumbprints(char *file, Thumbprint *table, Thumbprint *crltab)
54 char *line, *field[50];
58 bin = Bopen(file, OREAD);
61 for(; (line = Brdstr(bin, '\n', 1)) != 0; free(line)){
62 if(tokenize(line, field, nelem(field)) < 2)
64 if(strcmp(field[0], "#include") == 0){
65 loadThumbprints(field[1], table, crltab);
68 if(strcmp(field[0], "x509") != 0 || strncmp(field[1], "sha1=", strlen("sha1=")) != 0)
70 field[1] += strlen("sha1=");
71 dec16(sum, sizeof(sum), field[1], strlen(field[1]));
72 if(crltab && okThumbprint(sum, crltab))
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;
84 initThumbprints(char *ok, char *crl)
86 Thumbprint *table, *crltab = nil;
89 crltab = emalloc(ThumbTab * sizeof(*table));
90 loadThumbprints(crl, crltab, nil);
92 table = emalloc(ThumbTab * sizeof(*table));
93 loadThumbprints(ok, table, crltab);