md5.c
Go to the documentation of this file.
1 /*
2  * Copyright (C) 2006 Michael Niedermayer (michaelni@gmx.at)
3  * Copyright (C) 2003-2005 by Christopher R. Hertel (crh@ubiqx.mn.org)
4  *
5  * References:
6  * IETF RFC 1321: The MD5 Message-Digest Algorithm
7  * Ron Rivest. IETF, April, 1992
8  *
9  * based on http://ubiqx.org/libcifs/source/Auth/MD5.c
10  * from Christopher R. Hertel (crh@ubiqx.mn.org)
11  * Simplified, cleaned and IMO redundant comments removed by michael.
12  *
13  * If you use gcc, then version 4.1 or later and -fomit-frame-pointer is
14  * strongly recommended.
15  *
16  * This file is part of FFmpeg.
17  *
18  * FFmpeg is free software; you can redistribute it and/or
19  * modify it under the terms of the GNU Lesser General Public
20  * License as published by the Free Software Foundation; either
21  * version 2.1 of the License, or (at your option) any later version.
22  *
23  * FFmpeg is distributed in the hope that it will be useful,
24  * but WITHOUT ANY WARRANTY; without even the implied warranty of
25  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
26  * Lesser General Public License for more details.
27  *
28  * You should have received a copy of the GNU Lesser General Public
29  * License along with FFmpeg; if not, write to the Free Software
30  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
31  */
32 
33 #include <stdint.h>
34 #include "bswap.h"
35 #include "intreadwrite.h"
36 #include "md5.h"
37 #include "mem.h"
38 
39 typedef struct AVMD5{
40  uint64_t len;
42  uint32_t ABCD[4];
43 } AVMD5;
44 
45 const int av_md5_size = sizeof(AVMD5);
46 
47 struct AVMD5 *av_md5_alloc(void)
48 {
49  return av_mallocz(sizeof(struct AVMD5));
50 }
51 
52 static const uint8_t S[4][4] = {
53  { 7, 12, 17, 22 }, /* round 1 */
54  { 5, 9, 14, 20 }, /* round 2 */
55  { 4, 11, 16, 23 }, /* round 3 */
56  { 6, 10, 15, 21 } /* round 4 */
57 };
58 
59 static const uint32_t T[64] = { // T[i]= fabs(sin(i+1)<<32)
60  0xd76aa478, 0xe8c7b756, 0x242070db, 0xc1bdceee, /* round 1 */
61  0xf57c0faf, 0x4787c62a, 0xa8304613, 0xfd469501,
62  0x698098d8, 0x8b44f7af, 0xffff5bb1, 0x895cd7be,
63  0x6b901122, 0xfd987193, 0xa679438e, 0x49b40821,
64 
65  0xf61e2562, 0xc040b340, 0x265e5a51, 0xe9b6c7aa, /* round 2 */
66  0xd62f105d, 0x02441453, 0xd8a1e681, 0xe7d3fbc8,
67  0x21e1cde6, 0xc33707d6, 0xf4d50d87, 0x455a14ed,
68  0xa9e3e905, 0xfcefa3f8, 0x676f02d9, 0x8d2a4c8a,
69 
70  0xfffa3942, 0x8771f681, 0x6d9d6122, 0xfde5380c, /* round 3 */
71  0xa4beea44, 0x4bdecfa9, 0xf6bb4b60, 0xbebfbc70,
72  0x289b7ec6, 0xeaa127fa, 0xd4ef3085, 0x04881d05,
73  0xd9d4d039, 0xe6db99e5, 0x1fa27cf8, 0xc4ac5665,
74 
75  0xf4292244, 0x432aff97, 0xab9423a7, 0xfc93a039, /* round 4 */
76  0x655b59c3, 0x8f0ccc92, 0xffeff47d, 0x85845dd1,
77  0x6fa87e4f, 0xfe2ce6e0, 0xa3014314, 0x4e0811a1,
78  0xf7537e82, 0xbd3af235, 0x2ad7d2bb, 0xeb86d391,
79 };
80 
81 #define CORE(i, a, b, c, d) do { \
82  t = S[i >> 4][i & 3]; \
83  a += T[i]; \
84  \
85  if (i < 32) { \
86  if (i < 16) a += (d ^ (b & (c ^ d))) + X[ i & 15]; \
87  else a += (c ^ (d & (c ^ b))) + X[(1 + 5*i) & 15]; \
88  } else { \
89  if (i < 48) a += (b ^ c ^ d) + X[(5 + 3*i) & 15]; \
90  else a += (c ^ (b | ~d)) + X[( 7*i) & 15]; \
91  } \
92  a = b + (a << t | a >> (32 - t)); \
93  } while (0)
94 
95 static void body(uint32_t ABCD[4], uint32_t X[16])
96 {
97  int i av_unused;
98  uint32_t t;
99  uint32_t a = ABCD[3];
100  uint32_t b = ABCD[2];
101  uint32_t c = ABCD[1];
102  uint32_t d = ABCD[0];
103 
104 #if HAVE_BIGENDIAN
105  for (i = 0; i < 16; i++)
106  X[i] = av_bswap32(X[i]);
107 #endif
108 
109 #if CONFIG_SMALL
110  for (i = 0; i < 64; i++) {
111  CORE(i, a, b, c, d);
112  t = d;
113  d = c;
114  c = b;
115  b = a;
116  a = t;
117  }
118 #else
119 #define CORE2(i) \
120  CORE( i, a,b,c,d); CORE((i+1),d,a,b,c); \
121  CORE((i+2),c,d,a,b); CORE((i+3),b,c,d,a)
122 #define CORE4(i) CORE2(i); CORE2((i+4)); CORE2((i+8)); CORE2((i+12))
123  CORE4(0); CORE4(16); CORE4(32); CORE4(48);
124 #endif
125 
126  ABCD[0] += d;
127  ABCD[1] += c;
128  ABCD[2] += b;
129  ABCD[3] += a;
130 }
131 
132 void av_md5_init(AVMD5 *ctx)
133 {
134  ctx->len = 0;
135 
136  ctx->ABCD[0] = 0x10325476;
137  ctx->ABCD[1] = 0x98badcfe;
138  ctx->ABCD[2] = 0xefcdab89;
139  ctx->ABCD[3] = 0x67452301;
140 }
141 
142 void av_md5_update(AVMD5 *ctx, const uint8_t *src, const int len)
143 {
144  int i, j;
145 
146  j = ctx->len & 63;
147  ctx->len += len;
148 
149  for (i = 0; i < len; i++) {
150  ctx->block[j++] = src[i];
151  if (j == 64) {
152  body(ctx->ABCD, (uint32_t *) ctx->block);
153  j = 0;
154  }
155  }
156 }
157 
159 {
160  int i;
161  uint64_t finalcount = av_le2ne64(ctx->len << 3);
162 
163  av_md5_update(ctx, "\200", 1);
164  while ((ctx->len & 63) != 56)
165  av_md5_update(ctx, "", 1);
166 
167  av_md5_update(ctx, (uint8_t *)&finalcount, 8);
168 
169  for (i = 0; i < 4; i++)
170  AV_WL32(dst + 4*i, ctx->ABCD[3 - i]);
171 }
172 
173 void av_md5_sum(uint8_t *dst, const uint8_t *src, const int len)
174 {
175  AVMD5 ctx;
176 
177  av_md5_init(&ctx);
178  av_md5_update(&ctx, src, len);
179  av_md5_final(&ctx, dst);
180 }
181 
182 #ifdef TEST
183 #include <stdio.h>
184 
185 static void print_md5(uint8_t *md5)
186 {
187  int i;
188  for (i = 0; i < 16; i++)
189  printf("%02x", md5[i]);
190  printf("\n");
191 }
192 
193 int main(void){
194  uint8_t md5val[16];
195  int i;
196  uint8_t in[1000];
197 
198  for (i = 0; i < 1000; i++)
199  in[i] = i * i;
200  av_md5_sum(md5val, in, 1000); print_md5(md5val);
201  av_md5_sum(md5val, in, 63); print_md5(md5val);
202  av_md5_sum(md5val, in, 64); print_md5(md5val);
203  av_md5_sum(md5val, in, 65); print_md5(md5val);
204  for (i = 0; i < 1000; i++)
205  in[i] = i % 127;
206  av_md5_sum(md5val, in, 999); print_md5(md5val);
207 
208  return 0;
209 }
210 #endif
static const uint32_t T[64]
Definition: md5.c:59
void * av_mallocz(size_t size)
Allocate a block of size bytes with alignment suitable for all memory accesses (including vectors if ...
Definition: mem.c:205
static const uint8_t S[4][4]
Definition: md5.c:52
memory handling functions
About Git write you should know how to use GIT properly Luckily Git comes with excellent documentation git help man git shows you the available git< command > help man git< command > shows information about the subcommand< command > The most comprehensive manual is the website Git Reference visit they are quite exhaustive You do not need a special username or password All you need is to provide a ssh public key to the Git server admin What follows now is a basic introduction to Git and some FFmpeg specific guidelines Read it at least if you are granted commit privileges to the FFmpeg project you are expected to be familiar with these rules I if not You can get git from etc no matter how small Every one of them has been saved from looking like a fool by this many times It s very easy for stray debug output or cosmetic modifications to slip in
Definition: git-howto.txt:5
static void body(uint32_t ABCD[4], uint32_t X[16])
Definition: md5.c:95
set threshold d
#define AV_WL32(p, darg)
Definition: intreadwrite.h:282
struct AVMD5 * av_md5_alloc(void)
Definition: md5.c:47
uint8_t
#define b
Definition: input.c:42
const int av_md5_size
Definition: md5.c:45
void av_md5_sum(uint8_t *dst, const uint8_t *src, const int len)
Definition: md5.c:173
Definition: md5.c:39
void av_md5_update(AVMD5 *ctx, const uint8_t *src, const int len)
Definition: md5.c:142
struct AVMD5 AVMD5
Sampled sinusoid X
t
Definition: genspecsines3.m:6
uint8_t block[64]
Definition: md5.c:41
#define CORE4(i)
#define av_bswap32
Definition: bfin/bswap.h:33
AVS_Value src
Definition: avisynth_c.h:523
void av_md5_init(AVMD5 *ctx)
Definition: md5.c:132
uint64_t len
Definition: md5.c:40
synthesis window for stochastic i
#define av_le2ne64(x)
Definition: bswap.h:97
byte swapping routines
#define CORE(i, a, b, c, d)
Definition: md5.c:81
void av_md5_final(AVMD5 *ctx, uint8_t *dst)
Definition: md5.c:158
uint32_t ABCD[4]
Definition: md5.c:42
static double c[64]
printf("static const uint8_t my_array[100] = {\n")
else dst[i][x+y *dst_stride[i]]
Definition: vf_mcdeint.c:160
int main(int argc, char **argv)
Definition: main.c:22
#define av_unused
Definition: attributes.h:114