Warning: Attempt to read property "date" on null in /usr/local/www/websvn.planix.org/blame.php on line 247

Warning: Attempt to read property "msg" on null in /usr/local/www/websvn.planix.org/blame.php on line 247
WebSVN – planix.SVN – Blame – /os/branches/planix-v0/sys/src/libsec/port/thumb.c – Rev 2

Subversion Repositories planix.SVN

Rev

Go to most recent revision | Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
2 - 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
}
97