URI:
       tthumb.c - plan9port - [fork] Plan 9 from user space
  HTML git clone git://src.adamsgaard.dk/plan9port
   DIR Log
   DIR Files
   DIR Refs
   DIR README
   DIR LICENSE
       ---
       tthumb.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 }