12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697 |
- #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;
- }
|