1 /*
2 * Copyright (C) 2013 Reimar Döffinger <Reimar.Doeffinger@gmx.de>
3 *
4 * This file is part of FFmpeg.
5 *
6 * FFmpeg is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU Lesser General Public
8 * License as published by the Free Software Foundation; either
9 * version 2.1 of the License, or (at your option) any later version.
10 *
11 * FFmpeg is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * Lesser General Public License for more details.
15 *
16 * You should have received a copy of the GNU Lesser General Public
17 * License along with FFmpeg; if not, write to the Free Software
18 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
19 */
20
21 #include <assert.h>
22 #include <stddef.h>
23 #include <stdint.h>
24 #include <stdio.h>
25 #include <string.h>
27
35
41
42 // ENTRY(HASH_TYPE, HASH_NAME, HASH_SIZE)
43 #define HASHES(ENTRY) \
44 ENTRY(MD5, "MD5", 16) \
45 ENTRY(MURMUR3, "murmur3", 16) \
46 ENTRY(RIPEMD128, "RIPEMD128", 16) \
47 ENTRY(RIPEMD160, "RIPEMD160", 20) \
48 ENTRY(RIPEMD256, "RIPEMD256", 32) \
49 ENTRY(RIPEMD320, "RIPEMD320", 40) \
50 ENTRY(SHA160, "SHA160", 20) \
51 ENTRY(SHA224, "SHA224", 28) \
52 ENTRY(SHA256, "SHA256", 32) \
53 ENTRY(SHA512_224, "SHA512/224", 28) \
54 ENTRY(SHA512_256, "SHA512/256", 32) \
55 ENTRY(SHA384, "SHA384", 48) \
56 ENTRY(SHA512, "SHA512", 64) \
57 ENTRY(CRC32, "CRC32", 4) \
58 ENTRY(ADLER32, "adler32", 4) \
59
61 #define HASH_TYPE(TYPE, NAME, SIZE) TYPE,
64 };
65
72
73 #define HASH_MAX_SIZE(TYPE, NAME, SIZE) \
74 HASH_MAX_SIZE_BEFORE_ ## TYPE, \
75 HASH_MAX_SIZE_UNTIL_ ## TYPE ## _MINUS_ONE = FFMAX(SIZE, HASH_MAX_SIZE_BEFORE_ ## TYPE) - 1,
76 enum {
79 };
81
82 #define HASH_MAX_NAME_SIZE(TYPE, NAME, SIZE) \
83 HASH_MAX_NAME_SIZE_BEFORE_ ## TYPE, \
84 HASH_MAX_NAME_SIZE_UNTIL_ ## TYPE ## _MINUS_ONE = FFMAX(sizeof(NAME), HASH_MAX_NAME_SIZE_BEFORE_ ## TYPE) - 1,
85 enum {
88 };
89
90 static const struct {
94 #define HASH_DESC(TYPE, NAME, SIZE) [TYPE] = { NAME, SIZE },
96 };
97
99 {
102 }
103
105 {
107 }
108
110 {
112 }
113
115 {
121 break;
124 if (!res)
return AVERROR(ENOMEM);
129 case RIPEMD128:
130 case RIPEMD160:
131 case RIPEMD256:
133 case SHA160:
134 case SHA224:
136 case SHA512_224:
137 case SHA512_256:
138 case SHA384:
141 case ADLER32: break;
142 }
143 if (
i != ADLER32 &&
i != CRC32 && !res->
ctx) {
146 }
148 return 0;
149 }
150
152 {
167 case CRC32:
ctx->crc = UINT32_MAX;
break;
168 case ADLER32:
ctx->crc = 1;
break;
169 }
170 }
171
173 {
177 case RIPEMD128:
178 case RIPEMD160:
179 case RIPEMD256:
181 case SHA160:
182 case SHA224:
184 case SHA512_224:
185 case SHA512_256:
186 case SHA384:
190 }
191 }
192
194 {
198 case RIPEMD128:
199 case RIPEMD160:
200 case RIPEMD256:
202 case SHA160:
203 case SHA224:
205 case SHA512_224:
206 case SHA512_256:
207 case SHA384:
209 case CRC32:
AV_WB32(dst,
ctx->crc ^ UINT32_MAX);
break;
211 }
212 }
213
215 {
218
222 memset(dst + rsize, 0,
size - rsize);
223 }
224
226 {
229
233 }
234
236 {
239
246 }
247
249 {
253 }