8 enum{ ThumbTab = 1<<10 };
11 tablehead(uchar *sum, Thumbprint *table)
13 return &table[((sum[0]<<8) + sum[1]) & (ThumbTab-1)];
17 freeThumbprints(Thumbprint *table)
19 Thumbprint *hd, *p, *q;
23 for(hd = table; hd < table+ThumbTab; hd++){
24 for(p = hd->next; p && p != hd; p = q){
33 okThumbprint(uchar *sum, Thumbprint *table)
39 hd = tablehead(sum, table);
40 for(p = hd->next; p; p = p->next){
41 if(constcmp(sum, p->sha1, SHA1dlen) == 0)
50 loadThumbprints(char *file, Thumbprint *table, Thumbprint *crltab)
52 Thumbprint *hd, *entry;
53 char *line, *field[50];
57 if(access(file, AEXIST) < 0)
58 return 0; /* not an error */
59 if((bin = Bopen(file, OREAD)) == nil)
61 for(; (line = Brdstr(bin, '\n', 1)) != nil; free(line)){
62 if(tokenize(line, field, nelem(field)) < 2)
64 if(strcmp(field[0], "#include") == 0){
65 if(loadThumbprints(field[1], table, crltab) < 0)
69 if(strcmp(field[0], "x509") != 0 || strncmp(field[1], "sha1=", 5) != 0)
72 if(dec16(sum, SHA1dlen, field[1], strlen(field[1])) != SHA1dlen){
73 werrstr("malformed x509 entry in %s: %s", file, field[1]);
76 if(crltab && okThumbprint(sum, crltab))
78 hd = tablehead(sum, table);
82 if((entry = malloc(sizeof(*entry))) == nil)
84 entry->next = hd->next;
87 memcpy(entry->sha1, sum, SHA1dlen);
98 initThumbprints(char *ok, char *crl)
100 Thumbprint *table, *crltab;
102 table = crltab = nil;
104 if((crltab = malloc(ThumbTab * sizeof(*crltab))) == nil)
106 memset(crltab, 0, ThumbTab * sizeof(*crltab));
107 if(loadThumbprints(crl, crltab, nil) < 0)
110 if((table = malloc(ThumbTab * sizeof(*table))) == nil)
112 memset(table, 0, ThumbTab * sizeof(*table));
113 if(loadThumbprints(ok, table, crltab) < 0){
114 freeThumbprints(table);
118 freeThumbprints(crltab);