plan9port

fork of plan9port with libvec, libstr and libsdb
Log | Files | Refs | README | LICENSE

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 }