thumb.c (1890B)
1 #include <u.h> 2 #include <libc.h> 3 #include <bio.h> 4 #include <auth.h> 5 #include <mp.h> 6 #include <libsec.h> 7 8 enum{ ThumbTab = 1<<10 }; 9 10 static void * 11 emalloc(int n) 12 { 13 void *p; 14 if(n==0) 15 n=1; 16 p = malloc(n); 17 if(p == nil){ 18 exits("out of memory"); 19 } 20 memset(p, 0, n); 21 return p; 22 } 23 24 void 25 freeThumbprints(Thumbprint *table) 26 { 27 Thumbprint *hd, *p, *q; 28 for(hd = table; hd < table+ThumbTab; hd++){ 29 for(p = hd->next; p; p = q){ 30 q = p->next; 31 free(p); 32 } 33 } 34 free(table); 35 } 36 37 int 38 okThumbprint(uchar *sum, Thumbprint *table) 39 { 40 Thumbprint *p; 41 int i = ((sum[0]<<8) + sum[1]) & (ThumbTab-1); 42 43 for(p = table[i].next; p; p = p->next) 44 if(memcmp(sum, p->sha1, SHA1dlen) == 0) 45 return 1; 46 return 0; 47 } 48 49 static void 50 loadThumbprints(char *file, Thumbprint *table, Thumbprint *crltab) 51 { 52 Thumbprint *entry; 53 Biobuf *bin; 54 char *line, *field[50]; 55 uchar sum[SHA1dlen]; 56 int i; 57 58 bin = Bopen(file, OREAD); 59 if(bin == nil) 60 return; 61 for(; (line = Brdstr(bin, '\n', 1)) != 0; free(line)){ 62 if(tokenize(line, field, nelem(field)) < 2) 63 continue; 64 if(strcmp(field[0], "#include") == 0){ 65 loadThumbprints(field[1], table, crltab); 66 continue; 67 } 68 if(strcmp(field[0], "x509") != 0 || strncmp(field[1], "sha1=", strlen("sha1=")) != 0) 69 continue; 70 field[1] += strlen("sha1="); 71 dec16(sum, sizeof(sum), field[1], strlen(field[1])); 72 if(crltab && okThumbprint(sum, crltab)) 73 continue; 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; 79 } 80 Bterm(bin); 81 } 82 83 Thumbprint * 84 initThumbprints(char *ok, char *crl) 85 { 86 Thumbprint *table, *crltab = nil; 87 88 if(crl){ 89 crltab = emalloc(ThumbTab * sizeof(*table)); 90 loadThumbprints(crl, crltab, nil); 91 } 92 table = emalloc(ThumbTab * sizeof(*table)); 93 loadThumbprints(ok, table, crltab); 94 free(crltab); 95 return table; 96 }