hash-format.c revision c971768955f826fb965d8ffbb13dac93c9bbead8
c014f12e8268bf37ca2997e632ad7c22b8d04a84Timo Sirainen/* Copyright (c) 2010-2014 Dovecot authors, see the included COPYING file */
c014f12e8268bf37ca2997e632ad7c22b8d04a84Timo Sirainen unsigned int bits;
c014f12e8268bf37ca2997e632ad7c22b8d04a84Timo Sirainen const char *str;
797de45dcf6e24642ab347d5033beb92034b779dTimo Sirainen unsigned char *digest;
dac0b2e5e0f38c6d95ef1a842d891480db580236Timo Sirainenhash_format_parse(const char *str, unsigned int *idxp,
c014f12e8268bf37ca2997e632ad7c22b8d04a84Timo Sirainen /* we should have "hash_name}" or "hash_name:bits}" */
35565557e05721a761132cec2ba1d93acacb6c14Timo Sirainen *error_r = t_strconcat("Unknown hash method: ", name, NULL);
c014f12e8268bf37ca2997e632ad7c22b8d04a84Timo Sirainen bits == 0 || bits > (*method_r)->digest_size*8) {
c014f12e8268bf37ca2997e632ad7c22b8d04a84Timo Sirainen *error_r = t_strconcat("Invalid :bits number: ",
c014f12e8268bf37ca2997e632ad7c22b8d04a84Timo Sirainen "Currently :bits must be divisible by 8: ",
8d59f06c9422fa49b538e23ffb06eddb23c6add2Timo Sirainenhash_format_string_analyze(struct hash_format *format, const char *str,
c014f12e8268bf37ca2997e632ad7c22b8d04a84Timo Sirainen const char **error_r)
c014f12e8268bf37ca2997e632ad7c22b8d04a84Timo Sirainen unsigned int i;
35565557e05721a761132cec2ba1d93acacb6c14Timo Sirainen list = p_new(format->pool, struct hash_format_list, 1);
35565557e05721a761132cec2ba1d93acacb6c14Timo Sirainenint hash_format_init(const char *format_string, struct hash_format **format_r,
35565557e05721a761132cec2ba1d93acacb6c14Timo Sirainen const char **error_r)
08f24237ccc177f5b3a09b24d8a725fa47e1ee32Timo Sirainen pool = pool_alloconly_create("hash format", 1024);
35565557e05721a761132cec2ba1d93acacb6c14Timo Sirainen ret = hash_format_string_analyze(format, format_string,
35565557e05721a761132cec2ba1d93acacb6c14Timo Sirainenvoid hash_format_loop(struct hash_format *format,
35565557e05721a761132cec2ba1d93acacb6c14Timo Sirainen for (list = format->list; list != NULL; list = list->next)
dcc76bb1e1bb287e3e71e6a39a7ca207fab0eaa8Timo Sirainen list->method->loop(list->context, data, size);
c014f12e8268bf37ca2997e632ad7c22b8d04a84Timo Sirainenvoid hash_format_reset(struct hash_format *format)
dba5754de32284b3149ddd5c9bb1701b05707752Timo Sirainen for (list = format->list; list != NULL; list = list->next) {
c014f12e8268bf37ca2997e632ad7c22b8d04a84Timo Sirainen memset(list->context, 0, list->method->context_size);
c014f12e8268bf37ca2997e632ad7c22b8d04a84Timo Sirainenhash_format_digest(string_t *dest, const struct hash_format_list *list,
c014f12e8268bf37ca2997e632ad7c22b8d04a84Timo Sirainen const unsigned char *digest)
c014f12e8268bf37ca2997e632ad7c22b8d04a84Timo Sirainen unsigned int i, orig_len, size = list->bits / 8;
c014f12e8268bf37ca2997e632ad7c22b8d04a84Timo Sirainen /* drop leading zeros, except if it's the only one */
c014f12e8268bf37ca2997e632ad7c22b8d04a84Timo Sirainen /* drop trailing '=' chars */
dcc76bb1e1bb287e3e71e6a39a7ca207fab0eaa8Timo Sirainenvoid hash_format_write(struct hash_format *format, string_t *dest)
c014f12e8268bf37ca2997e632ad7c22b8d04a84Timo Sirainen const char *p;
c014f12e8268bf37ca2997e632ad7c22b8d04a84Timo Sirainen unsigned int i, max_digest_size = 0;
a912d084eb8024ce35462c9fd2d50b86b13d8d33Timo Sirainen for (list = format->list; list != NULL; list = list->next) {
a912d084eb8024ce35462c9fd2d50b86b13d8d33Timo Sirainen if (max_digest_size < list->method->digest_size)