diff options
author | Taru Karttunen <taruti@taruti.net> | 2011-03-30 15:46:40 +0300 |
---|---|---|
committer | Taru Karttunen <taruti@taruti.net> | 2011-03-30 15:46:40 +0300 |
commit | e5888a1ffdae813d7575f5fb02275c6bb07e5199 (patch) | |
tree | d8d51eac403f07814b9e936eed0c9a79195e2450 /sys/src/cmd/unix/drawterm/libsec/thumb.c |
Import sources from 2011-03-30 iso image
Diffstat (limited to 'sys/src/cmd/unix/drawterm/libsec/thumb.c')
-rwxr-xr-x | sys/src/cmd/unix/drawterm/libsec/thumb.c | 97 |
1 files changed, 97 insertions, 0 deletions
diff --git a/sys/src/cmd/unix/drawterm/libsec/thumb.c b/sys/src/cmd/unix/drawterm/libsec/thumb.c new file mode 100755 index 000000000..cac95a436 --- /dev/null +++ b/sys/src/cmd/unix/drawterm/libsec/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; +} + |