Mercurial > dovecot > core-2.2
annotate src/lib/hash-format.c @ 23007:36e01285b5b8
lib: buffer - Improve header comment for buffer_insert() and buffer_delete().
author | Stephan Bosch <stephan.bosch@dovecot.fi> |
---|---|
date | Mon, 18 Mar 2019 00:52:37 +0100 |
parents | cb108f786fb4 |
children |
rev | line source |
---|---|
22713
cb108f786fb4
Updated copyright notices to include the year 2018.
Stephan Bosch <stephan.bosch@dovecot.fi>
parents:
21390
diff
changeset
|
1 /* Copyright (c) 2010-2018 Dovecot authors, see the included COPYING file */ |
12308
22689f4ceecb
liblib: Added API for easily building hash strings based on given format string and input.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
2 |
22689f4ceecb
liblib: Added API for easily building hash strings based on given format string and input.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
3 #include "lib.h" |
22689f4ceecb
liblib: Added API for easily building hash strings based on given format string and input.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
4 #include "base64.h" |
22689f4ceecb
liblib: Added API for easily building hash strings based on given format string and input.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
5 #include "hex-binary.h" |
22689f4ceecb
liblib: Added API for easily building hash strings based on given format string and input.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
6 #include "str.h" |
22689f4ceecb
liblib: Added API for easily building hash strings based on given format string and input.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
7 #include "hash-method.h" |
22689f4ceecb
liblib: Added API for easily building hash strings based on given format string and input.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
8 #include "hash-format.h" |
22689f4ceecb
liblib: Added API for easily building hash strings based on given format string and input.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
9 |
22689f4ceecb
liblib: Added API for easily building hash strings based on given format string and input.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
10 enum hash_encoding { |
22689f4ceecb
liblib: Added API for easily building hash strings based on given format string and input.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
11 HASH_ENCODING_HEX, |
22689f4ceecb
liblib: Added API for easily building hash strings based on given format string and input.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
12 HASH_ENCODING_HEX_SHORT, |
22689f4ceecb
liblib: Added API for easily building hash strings based on given format string and input.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
13 HASH_ENCODING_BASE64 |
22689f4ceecb
liblib: Added API for easily building hash strings based on given format string and input.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
14 }; |
22689f4ceecb
liblib: Added API for easily building hash strings based on given format string and input.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
15 |
22689f4ceecb
liblib: Added API for easily building hash strings based on given format string and input.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
16 struct hash_format_list { |
22689f4ceecb
liblib: Added API for easily building hash strings based on given format string and input.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
17 struct hash_format_list *next; |
22689f4ceecb
liblib: Added API for easily building hash strings based on given format string and input.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
18 |
22689f4ceecb
liblib: Added API for easily building hash strings based on given format string and input.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
19 const struct hash_method *method; |
22689f4ceecb
liblib: Added API for easily building hash strings based on given format string and input.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
20 void *context; |
22689f4ceecb
liblib: Added API for easily building hash strings based on given format string and input.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
21 unsigned int bits; |
22689f4ceecb
liblib: Added API for easily building hash strings based on given format string and input.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
22 enum hash_encoding encoding; |
22689f4ceecb
liblib: Added API for easily building hash strings based on given format string and input.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
23 }; |
22689f4ceecb
liblib: Added API for easily building hash strings based on given format string and input.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
24 |
22689f4ceecb
liblib: Added API for easily building hash strings based on given format string and input.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
25 struct hash_format { |
22689f4ceecb
liblib: Added API for easily building hash strings based on given format string and input.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
26 pool_t pool; |
22689f4ceecb
liblib: Added API for easily building hash strings based on given format string and input.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
27 const char *str; |
22689f4ceecb
liblib: Added API for easily building hash strings based on given format string and input.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
28 |
22689f4ceecb
liblib: Added API for easily building hash strings based on given format string and input.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
29 struct hash_format_list *list, **pos; |
14695
d419c6cde162
hash-format object can now be reset to build multiple hashes.
Timo Sirainen <tss@iki.fi>
parents:
14133
diff
changeset
|
30 unsigned char *digest; |
12308
22689f4ceecb
liblib: Added API for easily building hash strings based on given format string and input.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
31 }; |
22689f4ceecb
liblib: Added API for easily building hash strings based on given format string and input.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
32 |
22689f4ceecb
liblib: Added API for easily building hash strings based on given format string and input.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
33 static int |
22689f4ceecb
liblib: Added API for easily building hash strings based on given format string and input.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
34 hash_format_parse(const char *str, unsigned int *idxp, |
22689f4ceecb
liblib: Added API for easily building hash strings based on given format string and input.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
35 const struct hash_method **method_r, |
22689f4ceecb
liblib: Added API for easily building hash strings based on given format string and input.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
36 unsigned int *bits_r, const char **error_r) |
22689f4ceecb
liblib: Added API for easily building hash strings based on given format string and input.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
37 { |
22689f4ceecb
liblib: Added API for easily building hash strings based on given format string and input.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
38 const char *name, *end, *bitsp; |
22689f4ceecb
liblib: Added API for easily building hash strings based on given format string and input.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
39 unsigned int bits, i = *idxp; |
22689f4ceecb
liblib: Added API for easily building hash strings based on given format string and input.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
40 |
22689f4ceecb
liblib: Added API for easily building hash strings based on given format string and input.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
41 /* we should have "hash_name}" or "hash_name:bits}" */ |
22689f4ceecb
liblib: Added API for easily building hash strings based on given format string and input.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
42 end = strchr(str+i, '}'); |
22689f4ceecb
liblib: Added API for easily building hash strings based on given format string and input.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
43 if (end == NULL) { |
22689f4ceecb
liblib: Added API for easily building hash strings based on given format string and input.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
44 *error_r = "Missing '}'"; |
22689f4ceecb
liblib: Added API for easily building hash strings based on given format string and input.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
45 return -1; |
22689f4ceecb
liblib: Added API for easily building hash strings based on given format string and input.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
46 } |
22689f4ceecb
liblib: Added API for easily building hash strings based on given format string and input.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
47 *idxp = end - str; |
22689f4ceecb
liblib: Added API for easily building hash strings based on given format string and input.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
48 name = t_strdup_until(str+i, end); |
22689f4ceecb
liblib: Added API for easily building hash strings based on given format string and input.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
49 |
22689f4ceecb
liblib: Added API for easily building hash strings based on given format string and input.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
50 bitsp = strchr(name, ':'); |
22689f4ceecb
liblib: Added API for easily building hash strings based on given format string and input.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
51 if (bitsp != NULL) |
22689f4ceecb
liblib: Added API for easily building hash strings based on given format string and input.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
52 name = t_strdup_until(name, bitsp++); |
22689f4ceecb
liblib: Added API for easily building hash strings based on given format string and input.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
53 |
22689f4ceecb
liblib: Added API for easily building hash strings based on given format string and input.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
54 *method_r = hash_method_lookup(name); |
22689f4ceecb
liblib: Added API for easily building hash strings based on given format string and input.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
55 if (*method_r == NULL) { |
22689f4ceecb
liblib: Added API for easily building hash strings based on given format string and input.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
56 *error_r = t_strconcat("Unknown hash method: ", name, NULL); |
22689f4ceecb
liblib: Added API for easily building hash strings based on given format string and input.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
57 return -1; |
22689f4ceecb
liblib: Added API for easily building hash strings based on given format string and input.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
58 } |
22689f4ceecb
liblib: Added API for easily building hash strings based on given format string and input.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
59 |
22689f4ceecb
liblib: Added API for easily building hash strings based on given format string and input.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
60 bits = (*method_r)->digest_size * 8; |
22689f4ceecb
liblib: Added API for easily building hash strings based on given format string and input.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
61 if (bitsp != NULL) { |
22689f4ceecb
liblib: Added API for easily building hash strings based on given format string and input.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
62 if (str_to_uint(bitsp, &bits) < 0 || |
22689f4ceecb
liblib: Added API for easily building hash strings based on given format string and input.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
63 bits == 0 || bits > (*method_r)->digest_size*8) { |
22689f4ceecb
liblib: Added API for easily building hash strings based on given format string and input.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
64 *error_r = t_strconcat("Invalid :bits number: ", |
22689f4ceecb
liblib: Added API for easily building hash strings based on given format string and input.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
65 bitsp, NULL); |
22689f4ceecb
liblib: Added API for easily building hash strings based on given format string and input.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
66 return -1; |
22689f4ceecb
liblib: Added API for easily building hash strings based on given format string and input.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
67 } |
22689f4ceecb
liblib: Added API for easily building hash strings based on given format string and input.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
68 if ((bits % 8) != 0) { |
22689f4ceecb
liblib: Added API for easily building hash strings based on given format string and input.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
69 *error_r = t_strconcat( |
22689f4ceecb
liblib: Added API for easily building hash strings based on given format string and input.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
70 "Currently :bits must be divisible by 8: ", |
22689f4ceecb
liblib: Added API for easily building hash strings based on given format string and input.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
71 bitsp, NULL); |
22689f4ceecb
liblib: Added API for easily building hash strings based on given format string and input.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
72 return -1; |
22689f4ceecb
liblib: Added API for easily building hash strings based on given format string and input.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
73 } |
22689f4ceecb
liblib: Added API for easily building hash strings based on given format string and input.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
74 } |
22689f4ceecb
liblib: Added API for easily building hash strings based on given format string and input.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
75 *bits_r = bits; |
22689f4ceecb
liblib: Added API for easily building hash strings based on given format string and input.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
76 return 0; |
22689f4ceecb
liblib: Added API for easily building hash strings based on given format string and input.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
77 } |
22689f4ceecb
liblib: Added API for easily building hash strings based on given format string and input.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
78 |
22689f4ceecb
liblib: Added API for easily building hash strings based on given format string and input.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
79 static int |
22689f4ceecb
liblib: Added API for easily building hash strings based on given format string and input.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
80 hash_format_string_analyze(struct hash_format *format, const char *str, |
22689f4ceecb
liblib: Added API for easily building hash strings based on given format string and input.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
81 const char **error_r) |
22689f4ceecb
liblib: Added API for easily building hash strings based on given format string and input.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
82 { |
22689f4ceecb
liblib: Added API for easily building hash strings based on given format string and input.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
83 struct hash_format_list *list; |
22689f4ceecb
liblib: Added API for easily building hash strings based on given format string and input.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
84 unsigned int i; |
22689f4ceecb
liblib: Added API for easily building hash strings based on given format string and input.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
85 |
22689f4ceecb
liblib: Added API for easily building hash strings based on given format string and input.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
86 for (i = 0; str[i] != '\0'; i++) { |
22689f4ceecb
liblib: Added API for easily building hash strings based on given format string and input.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
87 if (str[i] != '%') |
22689f4ceecb
liblib: Added API for easily building hash strings based on given format string and input.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
88 continue; |
22689f4ceecb
liblib: Added API for easily building hash strings based on given format string and input.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
89 i++; |
22689f4ceecb
liblib: Added API for easily building hash strings based on given format string and input.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
90 |
22689f4ceecb
liblib: Added API for easily building hash strings based on given format string and input.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
91 list = p_new(format->pool, struct hash_format_list, 1); |
22689f4ceecb
liblib: Added API for easily building hash strings based on given format string and input.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
92 list->encoding = HASH_ENCODING_HEX; |
22689f4ceecb
liblib: Added API for easily building hash strings based on given format string and input.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
93 *format->pos = list; |
22689f4ceecb
liblib: Added API for easily building hash strings based on given format string and input.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
94 format->pos = &list->next; |
22689f4ceecb
liblib: Added API for easily building hash strings based on given format string and input.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
95 |
22689f4ceecb
liblib: Added API for easily building hash strings based on given format string and input.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
96 if (str[i] == 'B') { |
22689f4ceecb
liblib: Added API for easily building hash strings based on given format string and input.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
97 list->encoding = HASH_ENCODING_BASE64; |
22689f4ceecb
liblib: Added API for easily building hash strings based on given format string and input.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
98 i++; |
22689f4ceecb
liblib: Added API for easily building hash strings based on given format string and input.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
99 } else if (str[i] == 'X') { |
22689f4ceecb
liblib: Added API for easily building hash strings based on given format string and input.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
100 list->encoding = HASH_ENCODING_HEX_SHORT; |
22689f4ceecb
liblib: Added API for easily building hash strings based on given format string and input.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
101 i++; |
22689f4ceecb
liblib: Added API for easily building hash strings based on given format string and input.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
102 } |
22689f4ceecb
liblib: Added API for easily building hash strings based on given format string and input.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
103 if (str[i++] != '{') { |
22689f4ceecb
liblib: Added API for easily building hash strings based on given format string and input.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
104 *error_r = "No '{' after '%'"; |
22689f4ceecb
liblib: Added API for easily building hash strings based on given format string and input.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
105 return -1; |
22689f4ceecb
liblib: Added API for easily building hash strings based on given format string and input.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
106 } |
22689f4ceecb
liblib: Added API for easily building hash strings based on given format string and input.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
107 if (hash_format_parse(str, &i, &list->method, |
22689f4ceecb
liblib: Added API for easily building hash strings based on given format string and input.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
108 &list->bits, error_r) < 0) |
22689f4ceecb
liblib: Added API for easily building hash strings based on given format string and input.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
109 return -1; |
22689f4ceecb
liblib: Added API for easily building hash strings based on given format string and input.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
110 list->context = p_malloc(format->pool, |
22689f4ceecb
liblib: Added API for easily building hash strings based on given format string and input.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
111 list->method->context_size); |
22689f4ceecb
liblib: Added API for easily building hash strings based on given format string and input.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
112 list->method->init(list->context); |
22689f4ceecb
liblib: Added API for easily building hash strings based on given format string and input.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
113 } |
22689f4ceecb
liblib: Added API for easily building hash strings based on given format string and input.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
114 return 0; |
22689f4ceecb
liblib: Added API for easily building hash strings based on given format string and input.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
115 } |
22689f4ceecb
liblib: Added API for easily building hash strings based on given format string and input.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
116 |
22689f4ceecb
liblib: Added API for easily building hash strings based on given format string and input.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
117 int hash_format_init(const char *format_string, struct hash_format **format_r, |
22689f4ceecb
liblib: Added API for easily building hash strings based on given format string and input.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
118 const char **error_r) |
22689f4ceecb
liblib: Added API for easily building hash strings based on given format string and input.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
119 { |
22689f4ceecb
liblib: Added API for easily building hash strings based on given format string and input.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
120 struct hash_format *format; |
22689f4ceecb
liblib: Added API for easily building hash strings based on given format string and input.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
121 pool_t pool; |
22689f4ceecb
liblib: Added API for easily building hash strings based on given format string and input.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
122 int ret; |
22689f4ceecb
liblib: Added API for easily building hash strings based on given format string and input.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
123 |
22689f4ceecb
liblib: Added API for easily building hash strings based on given format string and input.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
124 pool = pool_alloconly_create("hash format", 1024); |
22689f4ceecb
liblib: Added API for easily building hash strings based on given format string and input.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
125 format = p_new(pool, struct hash_format, 1); |
22689f4ceecb
liblib: Added API for easily building hash strings based on given format string and input.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
126 format->pool = pool; |
22689f4ceecb
liblib: Added API for easily building hash strings based on given format string and input.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
127 format->str = p_strdup(pool, format_string); |
22689f4ceecb
liblib: Added API for easily building hash strings based on given format string and input.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
128 format->pos = &format->list; |
22689f4ceecb
liblib: Added API for easily building hash strings based on given format string and input.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
129 T_BEGIN { |
22689f4ceecb
liblib: Added API for easily building hash strings based on given format string and input.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
130 ret = hash_format_string_analyze(format, format_string, |
22689f4ceecb
liblib: Added API for easily building hash strings based on given format string and input.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
131 error_r); |
22689f4ceecb
liblib: Added API for easily building hash strings based on given format string and input.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
132 if (ret < 0) |
22689f4ceecb
liblib: Added API for easily building hash strings based on given format string and input.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
133 *error_r = p_strdup(format->pool, *error_r); |
22689f4ceecb
liblib: Added API for easily building hash strings based on given format string and input.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
134 } T_END; |
22689f4ceecb
liblib: Added API for easily building hash strings based on given format string and input.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
135 if (ret < 0) { |
22689f4ceecb
liblib: Added API for easily building hash strings based on given format string and input.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
136 *error_r = t_strdup(*error_r); |
17818
4374e04f6aae
lib: hash-format - fix leak on _init() failure path
Phil Carmody <phil@dovecot.fi>
parents:
17130
diff
changeset
|
137 pool_unref(&pool); |
12308
22689f4ceecb
liblib: Added API for easily building hash strings based on given format string and input.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
138 return -1; |
22689f4ceecb
liblib: Added API for easily building hash strings based on given format string and input.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
139 } |
22689f4ceecb
liblib: Added API for easily building hash strings based on given format string and input.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
140 *format_r = format; |
22689f4ceecb
liblib: Added API for easily building hash strings based on given format string and input.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
141 return 0; |
22689f4ceecb
liblib: Added API for easily building hash strings based on given format string and input.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
142 } |
22689f4ceecb
liblib: Added API for easily building hash strings based on given format string and input.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
143 |
22689f4ceecb
liblib: Added API for easily building hash strings based on given format string and input.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
144 void hash_format_loop(struct hash_format *format, |
22689f4ceecb
liblib: Added API for easily building hash strings based on given format string and input.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
145 const void *data, size_t size) |
22689f4ceecb
liblib: Added API for easily building hash strings based on given format string and input.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
146 { |
22689f4ceecb
liblib: Added API for easily building hash strings based on given format string and input.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
147 struct hash_format_list *list; |
22689f4ceecb
liblib: Added API for easily building hash strings based on given format string and input.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
148 |
22689f4ceecb
liblib: Added API for easily building hash strings based on given format string and input.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
149 for (list = format->list; list != NULL; list = list->next) |
22689f4ceecb
liblib: Added API for easily building hash strings based on given format string and input.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
150 list->method->loop(list->context, data, size); |
22689f4ceecb
liblib: Added API for easily building hash strings based on given format string and input.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
151 } |
22689f4ceecb
liblib: Added API for easily building hash strings based on given format string and input.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
152 |
14695
d419c6cde162
hash-format object can now be reset to build multiple hashes.
Timo Sirainen <tss@iki.fi>
parents:
14133
diff
changeset
|
153 void hash_format_reset(struct hash_format *format) |
d419c6cde162
hash-format object can now be reset to build multiple hashes.
Timo Sirainen <tss@iki.fi>
parents:
14133
diff
changeset
|
154 { |
d419c6cde162
hash-format object can now be reset to build multiple hashes.
Timo Sirainen <tss@iki.fi>
parents:
14133
diff
changeset
|
155 struct hash_format_list *list; |
d419c6cde162
hash-format object can now be reset to build multiple hashes.
Timo Sirainen <tss@iki.fi>
parents:
14133
diff
changeset
|
156 |
d419c6cde162
hash-format object can now be reset to build multiple hashes.
Timo Sirainen <tss@iki.fi>
parents:
14133
diff
changeset
|
157 for (list = format->list; list != NULL; list = list->next) { |
d419c6cde162
hash-format object can now be reset to build multiple hashes.
Timo Sirainen <tss@iki.fi>
parents:
14133
diff
changeset
|
158 memset(list->context, 0, list->method->context_size); |
d419c6cde162
hash-format object can now be reset to build multiple hashes.
Timo Sirainen <tss@iki.fi>
parents:
14133
diff
changeset
|
159 list->method->init(list->context); |
d419c6cde162
hash-format object can now be reset to build multiple hashes.
Timo Sirainen <tss@iki.fi>
parents:
14133
diff
changeset
|
160 } |
d419c6cde162
hash-format object can now be reset to build multiple hashes.
Timo Sirainen <tss@iki.fi>
parents:
14133
diff
changeset
|
161 } |
d419c6cde162
hash-format object can now be reset to build multiple hashes.
Timo Sirainen <tss@iki.fi>
parents:
14133
diff
changeset
|
162 |
12308
22689f4ceecb
liblib: Added API for easily building hash strings based on given format string and input.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
163 static void |
22689f4ceecb
liblib: Added API for easily building hash strings based on given format string and input.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
164 hash_format_digest(string_t *dest, const struct hash_format_list *list, |
22689f4ceecb
liblib: Added API for easily building hash strings based on given format string and input.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
165 const unsigned char *digest) |
22689f4ceecb
liblib: Added API for easily building hash strings based on given format string and input.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
166 { |
22689f4ceecb
liblib: Added API for easily building hash strings based on given format string and input.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
167 unsigned int i, orig_len, size = list->bits / 8; |
22689f4ceecb
liblib: Added API for easily building hash strings based on given format string and input.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
168 |
22689f4ceecb
liblib: Added API for easily building hash strings based on given format string and input.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
169 i_assert(list->bits % 8 == 0); |
22689f4ceecb
liblib: Added API for easily building hash strings based on given format string and input.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
170 |
22689f4ceecb
liblib: Added API for easily building hash strings based on given format string and input.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
171 switch (list->encoding) { |
22689f4ceecb
liblib: Added API for easily building hash strings based on given format string and input.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
172 case HASH_ENCODING_HEX: |
22689f4ceecb
liblib: Added API for easily building hash strings based on given format string and input.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
173 binary_to_hex_append(dest, digest, size); |
22689f4ceecb
liblib: Added API for easily building hash strings based on given format string and input.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
174 break; |
22689f4ceecb
liblib: Added API for easily building hash strings based on given format string and input.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
175 case HASH_ENCODING_HEX_SHORT: |
22689f4ceecb
liblib: Added API for easily building hash strings based on given format string and input.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
176 orig_len = str_len(dest); |
22689f4ceecb
liblib: Added API for easily building hash strings based on given format string and input.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
177 binary_to_hex_append(dest, digest, size); |
22689f4ceecb
liblib: Added API for easily building hash strings based on given format string and input.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
178 /* drop leading zeros, except if it's the only one */ |
22689f4ceecb
liblib: Added API for easily building hash strings based on given format string and input.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
179 for (i = orig_len; i < str_len(dest); i++) { |
22689f4ceecb
liblib: Added API for easily building hash strings based on given format string and input.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
180 if (str_data(dest)[i] != '0') |
22689f4ceecb
liblib: Added API for easily building hash strings based on given format string and input.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
181 break; |
22689f4ceecb
liblib: Added API for easily building hash strings based on given format string and input.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
182 } |
22689f4ceecb
liblib: Added API for easily building hash strings based on given format string and input.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
183 if (i == str_len(dest)) i--; |
22689f4ceecb
liblib: Added API for easily building hash strings based on given format string and input.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
184 str_delete(dest, orig_len, i-orig_len); |
22689f4ceecb
liblib: Added API for easily building hash strings based on given format string and input.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
185 break; |
22689f4ceecb
liblib: Added API for easily building hash strings based on given format string and input.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
186 case HASH_ENCODING_BASE64: |
22689f4ceecb
liblib: Added API for easily building hash strings based on given format string and input.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
187 orig_len = str_len(dest); |
22689f4ceecb
liblib: Added API for easily building hash strings based on given format string and input.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
188 base64_encode(digest, size, dest); |
22689f4ceecb
liblib: Added API for easily building hash strings based on given format string and input.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
189 /* drop trailing '=' chars */ |
22689f4ceecb
liblib: Added API for easily building hash strings based on given format string and input.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
190 while (str_len(dest) > orig_len && |
22689f4ceecb
liblib: Added API for easily building hash strings based on given format string and input.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
191 str_data(dest)[str_len(dest)-1] == '=') |
22689f4ceecb
liblib: Added API for easily building hash strings based on given format string and input.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
192 str_truncate(dest, str_len(dest)-1); |
22689f4ceecb
liblib: Added API for easily building hash strings based on given format string and input.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
193 break; |
22689f4ceecb
liblib: Added API for easily building hash strings based on given format string and input.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
194 } |
22689f4ceecb
liblib: Added API for easily building hash strings based on given format string and input.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
195 } |
22689f4ceecb
liblib: Added API for easily building hash strings based on given format string and input.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
196 |
14695
d419c6cde162
hash-format object can now be reset to build multiple hashes.
Timo Sirainen <tss@iki.fi>
parents:
14133
diff
changeset
|
197 void hash_format_write(struct hash_format *format, string_t *dest) |
12308
22689f4ceecb
liblib: Added API for easily building hash strings based on given format string and input.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
198 { |
22689f4ceecb
liblib: Added API for easily building hash strings based on given format string and input.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
199 struct hash_format_list *list; |
22689f4ceecb
liblib: Added API for easily building hash strings based on given format string and input.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
200 const char *p; |
22689f4ceecb
liblib: Added API for easily building hash strings based on given format string and input.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
201 unsigned int i, max_digest_size = 0; |
22689f4ceecb
liblib: Added API for easily building hash strings based on given format string and input.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
202 |
22689f4ceecb
liblib: Added API for easily building hash strings based on given format string and input.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
203 for (list = format->list; list != NULL; list = list->next) { |
22689f4ceecb
liblib: Added API for easily building hash strings based on given format string and input.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
204 if (max_digest_size < list->method->digest_size) |
22689f4ceecb
liblib: Added API for easily building hash strings based on given format string and input.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
205 max_digest_size = list->method->digest_size; |
22689f4ceecb
liblib: Added API for easily building hash strings based on given format string and input.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
206 } |
14695
d419c6cde162
hash-format object can now be reset to build multiple hashes.
Timo Sirainen <tss@iki.fi>
parents:
14133
diff
changeset
|
207 if (format->digest == NULL) |
d419c6cde162
hash-format object can now be reset to build multiple hashes.
Timo Sirainen <tss@iki.fi>
parents:
14133
diff
changeset
|
208 format->digest = p_malloc(format->pool, max_digest_size); |
12308
22689f4ceecb
liblib: Added API for easily building hash strings based on given format string and input.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
209 |
22689f4ceecb
liblib: Added API for easily building hash strings based on given format string and input.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
210 list = format->list; |
22689f4ceecb
liblib: Added API for easily building hash strings based on given format string and input.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
211 for (i = 0; format->str[i] != '\0'; i++) { |
22689f4ceecb
liblib: Added API for easily building hash strings based on given format string and input.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
212 if (format->str[i] != '%') { |
22689f4ceecb
liblib: Added API for easily building hash strings based on given format string and input.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
213 str_append_c(dest, format->str[i]); |
22689f4ceecb
liblib: Added API for easily building hash strings based on given format string and input.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
214 continue; |
22689f4ceecb
liblib: Added API for easily building hash strings based on given format string and input.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
215 } |
22689f4ceecb
liblib: Added API for easily building hash strings based on given format string and input.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
216 |
22689f4ceecb
liblib: Added API for easily building hash strings based on given format string and input.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
217 /* we already verified that the string is ok */ |
22689f4ceecb
liblib: Added API for easily building hash strings based on given format string and input.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
218 i_assert(list != NULL); |
14695
d419c6cde162
hash-format object can now be reset to build multiple hashes.
Timo Sirainen <tss@iki.fi>
parents:
14133
diff
changeset
|
219 list->method->result(list->context, format->digest); |
d419c6cde162
hash-format object can now be reset to build multiple hashes.
Timo Sirainen <tss@iki.fi>
parents:
14133
diff
changeset
|
220 hash_format_digest(dest, list, format->digest); |
12308
22689f4ceecb
liblib: Added API for easily building hash strings based on given format string and input.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
221 list = list->next; |
22689f4ceecb
liblib: Added API for easily building hash strings based on given format string and input.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
222 |
22689f4ceecb
liblib: Added API for easily building hash strings based on given format string and input.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
223 p = strchr(format->str+i, '}'); |
22689f4ceecb
liblib: Added API for easily building hash strings based on given format string and input.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
224 i_assert(p != NULL); |
22689f4ceecb
liblib: Added API for easily building hash strings based on given format string and input.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
225 i = p - format->str; |
22689f4ceecb
liblib: Added API for easily building hash strings based on given format string and input.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
226 } |
14695
d419c6cde162
hash-format object can now be reset to build multiple hashes.
Timo Sirainen <tss@iki.fi>
parents:
14133
diff
changeset
|
227 } |
12308
22689f4ceecb
liblib: Added API for easily building hash strings based on given format string and input.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
228 |
14695
d419c6cde162
hash-format object can now be reset to build multiple hashes.
Timo Sirainen <tss@iki.fi>
parents:
14133
diff
changeset
|
229 void hash_format_deinit(struct hash_format **_format, string_t *dest) |
d419c6cde162
hash-format object can now be reset to build multiple hashes.
Timo Sirainen <tss@iki.fi>
parents:
14133
diff
changeset
|
230 { |
d419c6cde162
hash-format object can now be reset to build multiple hashes.
Timo Sirainen <tss@iki.fi>
parents:
14133
diff
changeset
|
231 struct hash_format *format = *_format; |
d419c6cde162
hash-format object can now be reset to build multiple hashes.
Timo Sirainen <tss@iki.fi>
parents:
14133
diff
changeset
|
232 |
d419c6cde162
hash-format object can now be reset to build multiple hashes.
Timo Sirainen <tss@iki.fi>
parents:
14133
diff
changeset
|
233 *_format = NULL; |
d419c6cde162
hash-format object can now be reset to build multiple hashes.
Timo Sirainen <tss@iki.fi>
parents:
14133
diff
changeset
|
234 |
d419c6cde162
hash-format object can now be reset to build multiple hashes.
Timo Sirainen <tss@iki.fi>
parents:
14133
diff
changeset
|
235 hash_format_write(format, dest); |
12308
22689f4ceecb
liblib: Added API for easily building hash strings based on given format string and input.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
236 pool_unref(&format->pool); |
22689f4ceecb
liblib: Added API for easily building hash strings based on given format string and input.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
237 } |
22689f4ceecb
liblib: Added API for easily building hash strings based on given format string and input.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
238 |
22689f4ceecb
liblib: Added API for easily building hash strings based on given format string and input.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
239 void hash_format_deinit_free(struct hash_format **_format) |
22689f4ceecb
liblib: Added API for easily building hash strings based on given format string and input.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
240 { |
22689f4ceecb
liblib: Added API for easily building hash strings based on given format string and input.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
241 struct hash_format *format = *_format; |
22689f4ceecb
liblib: Added API for easily building hash strings based on given format string and input.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
242 |
22689f4ceecb
liblib: Added API for easily building hash strings based on given format string and input.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
243 *_format = NULL; |
22689f4ceecb
liblib: Added API for easily building hash strings based on given format string and input.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
244 pool_unref(&format->pool); |
22689f4ceecb
liblib: Added API for easily building hash strings based on given format string and input.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
245 } |