| #include <u.h> |
| #include <libc.h> |
| #include <bio.h> |
| #include <auth.h> |
| #include <mp.h> |
| #include <libsec.h> |
| |
| 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; |
| } |
| |