diff options
author | rsc <devnull@localhost> | 2004-03-21 14:04:56 +0000 |
---|---|---|
committer | rsc <devnull@localhost> | 2004-03-21 14:04:56 +0000 |
commit | 0fc65b37a1e7585ca2347bf61dcb8bc3a6b146a4 (patch) | |
tree | dd9189a823998f494082adb769451f12be056566 /src/libsec/port/thumb.c | |
parent | 768206abfcf505fb034a0151bf263bc0b1f2380c (diff) | |
download | plan9port-0fc65b37a1e7585ca2347bf61dcb8bc3a6b146a4.tar.gz plan9port-0fc65b37a1e7585ca2347bf61dcb8bc3a6b146a4.tar.bz2 plan9port-0fc65b37a1e7585ca2347bf61dcb8bc3a6b146a4.zip |
Add most of libsec.
Diffstat (limited to 'src/libsec/port/thumb.c')
-rw-r--r-- | src/libsec/port/thumb.c | 97 |
1 files changed, 97 insertions, 0 deletions
diff --git a/src/libsec/port/thumb.c b/src/libsec/port/thumb.c new file mode 100644 index 00000000..cac95a43 --- /dev/null +++ b/src/libsec/port/thumb.c @@ -0,0 +1,97 @@ +#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; +} + |