FFmpeg
Main Page
Related Pages
Modules
Namespaces
Data Structures
Files
Examples
File List
Globals
All
Data Structures
Namespaces
Files
Functions
Variables
Typedefs
Enumerations
Enumerator
Macros
Groups
Pages
libavutil
hash.c
Go to the documentation of this file.
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
#include <stdint.h>
21
#include "
hash.h
"
22
23
#include "
adler32.h
"
24
#include "
crc.h
"
25
#include "
md5.h
"
26
#include "
murmur3.h
"
27
#include "
ripemd.h
"
28
#include "
sha.h
"
29
#include "
sha512.h
"
30
31
#include "
avstring.h
"
32
#include "
error.h
"
33
#include "
intreadwrite.h
"
34
#include "
mem.h
"
35
36
enum
hashtype
{
37
MD5
,
38
MURMUR3
,
39
RIPEMD128
,
40
RIPEMD160
,
41
RIPEMD256
,
42
RIPEMD320
,
43
SHA160
,
44
SHA224
,
45
SHA256
,
46
SHA512_224
,
47
SHA512_256
,
48
SHA384
,
49
SHA512
,
50
CRC32
,
51
ADLER32
,
52
NUM_HASHES
53
};
54
55
typedef
struct
AVHashContext
{
56
void
*
ctx
;
57
enum
hashtype
type
;
58
const
AVCRC
*
crctab
;
59
uint32_t
crc
;
60
}
AVHashContext
;
61
62
struct
{
63
const
char
*
name
;
64
int
size
;
65
}
hashdesc
[] = {
66
[
MD5
] = {
"MD5"
, 16},
67
[
MURMUR3
] = {
"murmur3"
, 16},
68
[
RIPEMD128
] = {
"RIPEMD128"
, 16},
69
[
RIPEMD160
] = {
"RIPEMD160"
, 20},
70
[
RIPEMD256
] = {
"RIPEMD256"
, 32},
71
[
RIPEMD320
] = {
"RIPEMD320"
, 40},
72
[
SHA160
] = {
"SHA160"
, 20},
73
[
SHA224
] = {
"SHA224"
, 28},
74
[
SHA256
] = {
"SHA256"
, 32},
75
[
SHA512_224
] = {
"SHA512/224"
, 28},
76
[
SHA512_256
] = {
"SHA512/256"
, 32},
77
[
SHA384
] = {
"SHA384"
, 48},
78
[
SHA512
] = {
"SHA512"
, 64},
79
[
CRC32
] = {
"CRC32"
, 4},
80
[
ADLER32
] = {
"adler32"
, 4},
81
};
82
83
const
char
*
av_hash_names
(
int
i)
84
{
85
if
(i < 0 || i >=
NUM_HASHES
)
return
NULL;
86
return
hashdesc
[i].name;
87
}
88
89
const
char
*
av_hash_get_name
(
const
AVHashContext
*ctx)
90
{
91
return
hashdesc
[ctx->
type
].name;
92
}
93
94
int
av_hash_get_size
(
const
AVHashContext
*ctx)
95
{
96
return
hashdesc
[ctx->
type
].size;
97
}
98
99
int
av_hash_alloc
(
AVHashContext
**ctx,
const
char
*
name
)
100
{
101
AVHashContext
*
res
;
102
int
i;
103
*ctx = NULL;
104
for
(i = 0; i <
NUM_HASHES
; i++)
105
if
(
av_strcasecmp
(name,
hashdesc
[i].name) == 0)
106
break
;
107
if
(i >= NUM_HASHES)
return
AVERROR
(EINVAL);
108
res =
av_mallocz
(
sizeof
(*res));
109
if
(!res)
return
AVERROR
(ENOMEM);
110
res->
type
= i;
111
switch
(i) {
112
case
MD5
: res->
ctx
=
av_md5_alloc
();
break
;
113
case
MURMUR3
: res->
ctx
=
av_murmur3_alloc
();
break
;
114
case
RIPEMD128
:
115
case
RIPEMD160
:
116
case
RIPEMD256
:
117
case
RIPEMD320
: res->
ctx
=
av_ripemd_alloc
();
break
;
118
case
SHA160
:
119
case
SHA224
:
120
case
SHA256
: res->
ctx
=
av_sha_alloc
();
break
;
121
case
SHA512_224
:
122
case
SHA512_256
:
123
case
SHA384
:
124
case
SHA512
: res->
ctx
=
av_sha512_alloc
();
break
;
125
case
CRC32
: res->
crctab
=
av_crc_get_table
(
AV_CRC_32_IEEE_LE
);
break
;
126
case
ADLER32
:
break
;
127
}
128
if
(i !=
ADLER32
&& i !=
CRC32
&& !res->
ctx
) {
129
av_free
(res);
130
return
AVERROR
(ENOMEM);
131
}
132
*ctx =
res
;
133
return
0;
134
}
135
136
void
av_hash_init
(
AVHashContext
*ctx)
137
{
138
switch
(ctx->
type
) {
139
case
MD5
:
av_md5_init
(ctx->
ctx
);
break
;
140
case
MURMUR3
:
av_murmur3_init
(ctx->
ctx
);
break
;
141
case
RIPEMD128
:
av_ripemd_init
(ctx->
ctx
, 128);
break
;
142
case
RIPEMD160
:
av_ripemd_init
(ctx->
ctx
, 160);
break
;
143
case
RIPEMD256
:
av_ripemd_init
(ctx->
ctx
, 256);
break
;
144
case
RIPEMD320
:
av_ripemd_init
(ctx->
ctx
, 320);
break
;
145
case
SHA160
:
av_sha_init
(ctx->
ctx
, 160);
break
;
146
case
SHA224
:
av_sha_init
(ctx->
ctx
, 224);
break
;
147
case
SHA256
:
av_sha_init
(ctx->
ctx
, 256);
break
;
148
case
SHA512_224
:
av_sha512_init
(ctx->
ctx
, 224);
break
;
149
case
SHA512_256
:
av_sha512_init
(ctx->
ctx
, 256);
break
;
150
case
SHA384
:
av_sha512_init
(ctx->
ctx
, 384);
break
;
151
case
SHA512
:
av_sha512_init
(ctx->
ctx
, 512);
break
;
152
case
CRC32
: ctx->
crc
= UINT32_MAX;
break
;
153
case
ADLER32
: ctx->
crc
= 1;
break
;
154
}
155
}
156
157
void
av_hash_update
(
AVHashContext
*ctx,
const
uint8_t
*
src
,
int
len
)
158
{
159
switch
(ctx->
type
) {
160
case
MD5
:
av_md5_update
(ctx->
ctx
, src, len);
break
;
161
case
MURMUR3
:
av_murmur3_update
(ctx->
ctx
, src, len);
break
;
162
case
RIPEMD128
:
163
case
RIPEMD160
:
164
case
RIPEMD256
:
165
case
RIPEMD320
:
av_ripemd_update
(ctx->
ctx
, src, len);
break
;
166
case
SHA160
:
167
case
SHA224
:
168
case
SHA256
:
av_sha_update
(ctx->
ctx
, src, len);
break
;
169
case
SHA512_224
:
170
case
SHA512_256
:
171
case
SHA384
:
172
case
SHA512
:
av_sha512_update
(ctx->
ctx
, src, len);
break
;
173
case
CRC32
: ctx->
crc
=
av_crc
(ctx->
crctab
, ctx->
crc
, src, len);
break
;
174
case
ADLER32
: ctx->
crc
=
av_adler32_update
(ctx->
crc
, src, len);
break
;
175
}
176
}
177
178
void
av_hash_final
(
AVHashContext
*ctx,
uint8_t
*dst)
179
{
180
switch
(ctx->
type
) {
181
case
MD5
:
av_md5_final
(ctx->
ctx
, dst);
break
;
182
case
MURMUR3
:
av_murmur3_final
(ctx->
ctx
, dst);
break
;
183
case
RIPEMD128
:
184
case
RIPEMD160
:
185
case
RIPEMD256
:
186
case
RIPEMD320
:
av_ripemd_final
(ctx->
ctx
, dst);
break
;
187
case
SHA160
:
188
case
SHA224
:
189
case
SHA256
:
av_sha_final
(ctx->
ctx
, dst);
break
;
190
case
SHA512_224
:
191
case
SHA512_256
:
192
case
SHA384
:
193
case
SHA512
:
av_sha512_final
(ctx->
ctx
, dst);
break
;
194
case
CRC32
:
AV_WB32
(dst, ctx->
crc
^ UINT32_MAX);
break
;
195
case
ADLER32
:
AV_WB32
(dst, ctx->
crc
);
break
;
196
}
197
}
198
199
void
av_hash_freep
(
AVHashContext
**ctx)
200
{
201
if
(*ctx)
202
av_freep
(&(*ctx)->ctx);
203
av_freep
(ctx);
204
}
Generated on Sat Jan 25 2014 19:52:06 for FFmpeg by
1.8.2