98 lines
1.8 KiB
C
98 lines
1.8 KiB
C
|
#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;
|
||
|
}
|
||
|
|