hash-method.c revision 70ee483d320a270993b56c713e350b736edd753f
2767104d81e97a109f0aa9758792bfa1da325a97Timo Sirainen/* Copyright (c) 2010-2016 Dovecot authors, see the included COPYING file */
5ce2084ada06ade9f44fc2914c34658e9a842dc1Timo Sirainen
5ce2084ada06ade9f44fc2914c34658e9a842dc1Timo Sirainen#include "lib.h"
16f816d3f3c32ae3351834253f52ddd0212bcbf3Timo Sirainen#include "md4.h"
6789ed17e7ca4021713507baf0dcf6979bb42e0cTimo Sirainen#include "md5.h"
5ce2084ada06ade9f44fc2914c34658e9a842dc1Timo Sirainen#include "sha1.h"
5ce2084ada06ade9f44fc2914c34658e9a842dc1Timo Sirainen#include "sha2.h"
5ce2084ada06ade9f44fc2914c34658e9a842dc1Timo Sirainen#include "sha3.h"
5ce2084ada06ade9f44fc2914c34658e9a842dc1Timo Sirainen#include "hash-method.h"
5ce2084ada06ade9f44fc2914c34658e9a842dc1Timo Sirainen
5ce2084ada06ade9f44fc2914c34658e9a842dc1Timo Sirainenconst struct hash_method *hash_method_lookup(const char *name)
5ce2084ada06ade9f44fc2914c34658e9a842dc1Timo Sirainen{
5ce2084ada06ade9f44fc2914c34658e9a842dc1Timo Sirainen unsigned int i;
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen
5ce2084ada06ade9f44fc2914c34658e9a842dc1Timo Sirainen for (i = 0; hash_methods[i] != NULL; i++) {
2767104d81e97a109f0aa9758792bfa1da325a97Timo Sirainen if (strcmp(hash_methods[i]->name, name) == 0)
5ce2084ada06ade9f44fc2914c34658e9a842dc1Timo Sirainen return hash_methods[i];
3ddbbe03fe74b3ee7b1dff4e08ec706d7880d052Timo Sirainen }
3ddbbe03fe74b3ee7b1dff4e08ec706d7880d052Timo Sirainen return NULL;
3ddbbe03fe74b3ee7b1dff4e08ec706d7880d052Timo Sirainen}
4bbb027a827d27d1816b8d60c5392cfd9c79e4bdTimo Sirainen
2767104d81e97a109f0aa9758792bfa1da325a97Timo Sirainenstatic void hash_method_init_size(void *context)
2767104d81e97a109f0aa9758792bfa1da325a97Timo Sirainen{
2767104d81e97a109f0aa9758792bfa1da325a97Timo Sirainen uint64_t *ctx = context;
6789ed17e7ca4021713507baf0dcf6979bb42e0cTimo Sirainen
2767104d81e97a109f0aa9758792bfa1da325a97Timo Sirainen *ctx = 0;
6789ed17e7ca4021713507baf0dcf6979bb42e0cTimo Sirainen}
2767104d81e97a109f0aa9758792bfa1da325a97Timo Sirainen
2767104d81e97a109f0aa9758792bfa1da325a97Timo Sirainenstatic void
6789ed17e7ca4021713507baf0dcf6979bb42e0cTimo Sirainenhash_method_loop_size(void *context, const void *data ATTR_UNUSED, size_t size)
2767104d81e97a109f0aa9758792bfa1da325a97Timo Sirainen{
2767104d81e97a109f0aa9758792bfa1da325a97Timo Sirainen uint64_t *ctx = context;
2767104d81e97a109f0aa9758792bfa1da325a97Timo Sirainen
2767104d81e97a109f0aa9758792bfa1da325a97Timo Sirainen *ctx += size;
2767104d81e97a109f0aa9758792bfa1da325a97Timo Sirainen}
6789ed17e7ca4021713507baf0dcf6979bb42e0cTimo Sirainen
4b058f90f9e8a2c6b2eed275de4eb8cc5195a71dTimo Sirainenstatic void hash_method_result_size(void *context, unsigned char *result_r)
4b058f90f9e8a2c6b2eed275de4eb8cc5195a71dTimo Sirainen{
2767104d81e97a109f0aa9758792bfa1da325a97Timo Sirainen uint64_t *ctx = context;
6789ed17e7ca4021713507baf0dcf6979bb42e0cTimo Sirainen
8d80659e504ffb34bb0c6a633184fece35751b18Timo Sirainen result_r[0] = (*ctx & 0xff00000000000000ULL) >> 56;
2767104d81e97a109f0aa9758792bfa1da325a97Timo Sirainen result_r[1] = (*ctx & 0x00ff000000000000ULL) >> 48;
2767104d81e97a109f0aa9758792bfa1da325a97Timo Sirainen result_r[2] = (*ctx & 0x0000ff0000000000ULL) >> 40;
6789ed17e7ca4021713507baf0dcf6979bb42e0cTimo Sirainen result_r[3] = (*ctx & 0x000000ff00000000ULL) >> 32;
6789ed17e7ca4021713507baf0dcf6979bb42e0cTimo Sirainen result_r[4] = (*ctx & 0x00000000ff000000ULL) >> 24;
2767104d81e97a109f0aa9758792bfa1da325a97Timo Sirainen result_r[5] = (*ctx & 0x0000000000ff0000ULL) >> 16;
5ce2084ada06ade9f44fc2914c34658e9a842dc1Timo Sirainen result_r[6] = (*ctx & 0x000000000000ff00ULL) >> 8;
2767104d81e97a109f0aa9758792bfa1da325a97Timo Sirainen result_r[7] = (*ctx & 0x00000000000000ffULL);
2767104d81e97a109f0aa9758792bfa1da325a97Timo Sirainen}
2767104d81e97a109f0aa9758792bfa1da325a97Timo Sirainen
2767104d81e97a109f0aa9758792bfa1da325a97Timo Sirainenstatic const struct hash_method hash_method_size = {
2767104d81e97a109f0aa9758792bfa1da325a97Timo Sirainen "size",
2767104d81e97a109f0aa9758792bfa1da325a97Timo Sirainen sizeof(uint64_t),
2767104d81e97a109f0aa9758792bfa1da325a97Timo Sirainen sizeof(uint64_t),
2767104d81e97a109f0aa9758792bfa1da325a97Timo Sirainen
2767104d81e97a109f0aa9758792bfa1da325a97Timo Sirainen hash_method_init_size,
2767104d81e97a109f0aa9758792bfa1da325a97Timo Sirainen hash_method_loop_size,
2767104d81e97a109f0aa9758792bfa1da325a97Timo Sirainen hash_method_result_size
2767104d81e97a109f0aa9758792bfa1da325a97Timo Sirainen};
2767104d81e97a109f0aa9758792bfa1da325a97Timo Sirainen
5ce2084ada06ade9f44fc2914c34658e9a842dc1Timo Sirainenconst struct hash_method *hash_methods[] = {
5ce2084ada06ade9f44fc2914c34658e9a842dc1Timo Sirainen &hash_method_md4,
6ef7e31619edfaa17ed044b45861d106a86191efTimo Sirainen &hash_method_md5,
f1e9611e93dcb3b745c1904029084fa81644e1b3Timo Sirainen &hash_method_sha1,
5ce2084ada06ade9f44fc2914c34658e9a842dc1Timo Sirainen &hash_method_sha256,
2767104d81e97a109f0aa9758792bfa1da325a97Timo Sirainen &hash_method_sha512,
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen &hash_method_sha3_256,
4c07b08af30e1065f7022980b60474f229d8cadfTimo Sirainen &hash_method_sha3_512,
2767104d81e97a109f0aa9758792bfa1da325a97Timo Sirainen &hash_method_size,
2767104d81e97a109f0aa9758792bfa1da325a97Timo Sirainen NULL
2767104d81e97a109f0aa9758792bfa1da325a97Timo Sirainen};
2767104d81e97a109f0aa9758792bfa1da325a97Timo Sirainen