Subversion Repositories planix.SVN

Rev

Rev 2 | Blame | Compare with Previous | Last modification | View Log | RSS feed

#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;
}