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 Wed Jul 10 2013 23:48:15 for FFmpeg by
1.8.2