#include #include #include #include #include #include enum{ ThumbTab = 1<<10 }; static void * emalloc(int n) { void *p; if(n==0) n=1; p = malloc(n); if(p == nil){ exits("out of memory"); } memset(p, 0, n); return p; } void freeThumbprints(Thumbprint *table) { Thumbprint *hd, *p, *q; for(hd = table; hd < table+ThumbTab; hd++){ for(p = hd->next; p; p = q){ q = p->next; free(p); } } free(table); } int okThumbprint(uchar *sum, Thumbprint *table) { Thumbprint *p; int i = ((sum[0]<<8) + sum[1]) & (ThumbTab-1); for(p = table[i].next; p; p = p->next) if(memcmp(sum, p->sha1, SHA1dlen) == 0) return 1; return 0; } static void loadThumbprints(char *file, Thumbprint *table, Thumbprint *crltab) { Thumbprint *entry; Biobuf *bin; char *line, *field[50]; uchar sum[SHA1dlen]; int i; bin = Bopen(file, OREAD); if(bin == nil) return; for(; (line = Brdstr(bin, '\n', 1)) != 0; free(line)){ if(tokenize(line, field, nelem(field)) < 2) continue; if(strcmp(field[0], "#include") == 0){ loadThumbprints(field[1], table, crltab); continue; } if(strcmp(field[0], "x509") != 0 || strncmp(field[1], "sha1=", strlen("sha1=")) != 0) continue; field[1] += strlen("sha1="); dec16(sum, sizeof(sum), field[1], strlen(field[1])); if(crltab && okThumbprint(sum, crltab)) continue; entry = (Thumbprint*)emalloc(sizeof(*entry)); memcpy(entry->sha1, sum, SHA1dlen); i = ((sum[0]<<8) + sum[1]) & (ThumbTab-1); entry->next = table[i].next; table[i].next = entry; } Bterm(bin); } Thumbprint * initThumbprints(char *ok, char *crl) { Thumbprint *table, *crltab = nil; if(crl){ crltab = emalloc(ThumbTab * sizeof(*table)); loadThumbprints(crl, crltab, nil); } table = emalloc(ThumbTab * sizeof(*table)); loadThumbprints(ok, table, crltab); free(crltab); return table; }