test-hash-method.c revision b0114f9348060796a29a9042af757e8f99cdd422
b0114f9348060796a29a9042af757e8f99cdd422Timo Sirainen/* Copyright (c) 2014 Dovecot authors, see the included COPYING file */
b0114f9348060796a29a9042af757e8f99cdd422Timo Sirainen
b0114f9348060796a29a9042af757e8f99cdd422Timo Sirainen#include "test-lib.h"
b0114f9348060796a29a9042af757e8f99cdd422Timo Sirainen#include "mmap-util.h"
b0114f9348060796a29a9042af757e8f99cdd422Timo Sirainen#include "hash-method.h"
b0114f9348060796a29a9042af757e8f99cdd422Timo Sirainen
b0114f9348060796a29a9042af757e8f99cdd422Timo Sirainenstatic unsigned char *buf;
b0114f9348060796a29a9042af757e8f99cdd422Timo Sirainenstatic unsigned int buf_size;
b0114f9348060796a29a9042af757e8f99cdd422Timo Sirainen
b0114f9348060796a29a9042af757e8f99cdd422Timo Sirainenstatic void test_hash_method_one(const struct hash_method *method)
b0114f9348060796a29a9042af757e8f99cdd422Timo Sirainen{
b0114f9348060796a29a9042af757e8f99cdd422Timo Sirainen unsigned char *ctx, *digest;
b0114f9348060796a29a9042af757e8f99cdd422Timo Sirainen unsigned int i;
b0114f9348060796a29a9042af757e8f99cdd422Timo Sirainen
b0114f9348060796a29a9042af757e8f99cdd422Timo Sirainen test_begin(t_strdup_printf("hash method %s", method->name));
b0114f9348060796a29a9042af757e8f99cdd422Timo Sirainen
b0114f9348060796a29a9042af757e8f99cdd422Timo Sirainen ctx = i_malloc(method->context_size);
b0114f9348060796a29a9042af757e8f99cdd422Timo Sirainen digest = i_malloc(method->digest_size);
b0114f9348060796a29a9042af757e8f99cdd422Timo Sirainen method->init(ctx);
b0114f9348060796a29a9042af757e8f99cdd422Timo Sirainen
b0114f9348060796a29a9042af757e8f99cdd422Timo Sirainen /* make sure the code doesn't try to access data past boundaries */
b0114f9348060796a29a9042af757e8f99cdd422Timo Sirainen for (i = 0; i < buf_size; i++)
b0114f9348060796a29a9042af757e8f99cdd422Timo Sirainen method->loop(ctx, buf + buf_size - i, i);
b0114f9348060796a29a9042af757e8f99cdd422Timo Sirainen method->result(ctx, digest);
b0114f9348060796a29a9042af757e8f99cdd422Timo Sirainen
b0114f9348060796a29a9042af757e8f99cdd422Timo Sirainen i_free(ctx);
b0114f9348060796a29a9042af757e8f99cdd422Timo Sirainen i_free(digest);
b0114f9348060796a29a9042af757e8f99cdd422Timo Sirainen test_end();
b0114f9348060796a29a9042af757e8f99cdd422Timo Sirainen}
b0114f9348060796a29a9042af757e8f99cdd422Timo Sirainen
b0114f9348060796a29a9042af757e8f99cdd422Timo Sirainenvoid test_hash_method(void)
b0114f9348060796a29a9042af757e8f99cdd422Timo Sirainen{
b0114f9348060796a29a9042af757e8f99cdd422Timo Sirainen unsigned int i;
b0114f9348060796a29a9042af757e8f99cdd422Timo Sirainen
b0114f9348060796a29a9042af757e8f99cdd422Timo Sirainen buf_size = mmap_get_page_size();
b0114f9348060796a29a9042af757e8f99cdd422Timo Sirainen buf = mmap(NULL, buf_size*2, PROT_READ | PROT_WRITE,
b0114f9348060796a29a9042af757e8f99cdd422Timo Sirainen MAP_ANONYMOUS | MAP_PRIVATE, -1, 0);
b0114f9348060796a29a9042af757e8f99cdd422Timo Sirainen mprotect(buf + buf_size, buf_size, PROT_NONE);
b0114f9348060796a29a9042af757e8f99cdd422Timo Sirainen memset(buf, 0, buf_size);
b0114f9348060796a29a9042af757e8f99cdd422Timo Sirainen
b0114f9348060796a29a9042af757e8f99cdd422Timo Sirainen for (i = 0; hash_methods[i] != NULL; i++)
b0114f9348060796a29a9042af757e8f99cdd422Timo Sirainen test_hash_method_one(hash_methods[i]);
b0114f9348060796a29a9042af757e8f99cdd422Timo Sirainen}