60 static const uint32_t
T[64] = {
61 0xd76aa478, 0xe8c7b756, 0x242070db, 0xc1bdceee,
62 0xf57c0faf, 0x4787c62a, 0xa8304613, 0xfd469501,
63 0x698098d8, 0x8b44f7af, 0xffff5bb1, 0x895cd7be,
64 0x6b901122, 0xfd987193, 0xa679438e, 0x49b40821,
66 0xf61e2562, 0xc040b340, 0x265e5a51, 0xe9b6c7aa,
67 0xd62f105d, 0x02441453, 0xd8a1e681, 0xe7d3fbc8,
68 0x21e1cde6, 0xc33707d6, 0xf4d50d87, 0x455a14ed,
69 0xa9e3e905, 0xfcefa3f8, 0x676f02d9, 0x8d2a4c8a,
71 0xfffa3942, 0x8771f681, 0x6d9d6122, 0xfde5380c,
72 0xa4beea44, 0x4bdecfa9, 0xf6bb4b60, 0xbebfbc70,
73 0x289b7ec6, 0xeaa127fa, 0xd4ef3085, 0x04881d05,
74 0xd9d4d039, 0xe6db99e5, 0x1fa27cf8, 0xc4ac5665,
76 0xf4292244, 0x432aff97, 0xab9423a7, 0xfc93a039,
77 0x655b59c3, 0x8f0ccc92, 0xffeff47d, 0x85845dd1,
78 0x6fa87e4f, 0xfe2ce6e0, 0xa3014314, 0x4e0811a1,
79 0xf7537e82, 0xbd3af235, 0x2ad7d2bb, 0xeb86d391,
82 #define CORE(i, a, b, c, d) \ 84 t = S[i >> 4][i & 3]; \ 89 a += (d ^ (b & (c ^ d))) + AV_RL32(X+( i & 15));\ 91 a += ((d & b) | (~d & c)) + AV_RL32(X+((1 + 5*i) & 15));\ 94 a += (b ^ c ^ d) + AV_RL32(X+((5 + 3*i) & 15));\ 96 a += (c ^ (b | ~d)) + AV_RL32(X+(( 7*i) & 15));\ 98 a = b + (a << t | a >> (32 - t)); \ 106 uint32_t
a,
b,
c,
d, t;
108 for (n = 0; n < nblocks; n++) {
114 X = (
const uint32_t *)src + n * 16;
117 for (
i = 0;
i < 64;
i++) {
127 CORE(i, a, b, c, d); CORE((i + 1), d, a, b, c); \ 128 CORE((i + 2), c, d, a, b); CORE((i + 3), b, c, d, a) 129 #define CORE4(i) CORE2(i); CORE2((i + 4)); CORE2((i + 8)); CORE2((i + 12)) 147 ctx->
ABCD[0] = 0x10325476;
148 ctx->
ABCD[1] = 0x98badcfe;
149 ctx->
ABCD[2] = 0xefcdab89;
150 ctx->
ABCD[3] = 0x67452301;
153 #if FF_API_CRYPTO_SIZE_T 166 int cnt =
FFMIN(len, 64 - j);
167 memcpy(ctx->
block + j, src, cnt);
175 end = src + (len & ~63);
176 if (!HAVE_FAST_UNALIGNED && ((intptr_t)src & 3)) {
178 memcpy(ctx->
block, src, 64);
183 int nblocks = len / 64;
189 memcpy(ctx->
block, src, len);
198 while ((ctx->
len & 63) != 56)
203 for (i = 0; i < 4; i++)
207 #if FF_API_CRYPTO_SIZE_T static const uint32_t T[64]
static const uint8_t S[4][4]
Memory handling functions.
The reader does not expect b to be semantically here and if the code is changed by maybe adding a a division or other the signedness will almost certainly be mistaken To avoid this confusion a new type was SUINT is the C unsigned type but it holds a signed int to use the same example SUINT a
void * av_mallocz(size_t size)
Allocate a memory block with alignment suitable for all memory accesses (including vectors if availab...
void av_md5_update(AVMD5 *ctx, const uint8_t *src, int len)
Update hash value.
struct AVMD5 * av_md5_alloc(void)
Allocate an AVMD5 context.
Undefined Behavior In the C some operations are like signed integer dereferencing freed accessing outside allocated Undefined Behavior must not occur in a C it is not safe even if the output of undefined operations is unused The unsafety may seem nit picking but Optimizing compilers have in fact optimized code on the assumption that no undefined Behavior occurs Optimizing code based on wrong assumptions can and has in some cases lead to effects beyond the output of computations The signed integer overflow problem in speed critical code Code which is highly optimized and works with signed integers sometimes has the problem that often the output of the computation does not c
void av_md5_sum(uint8_t *dst, const uint8_t *src, const int len)
Hash an array of data.
static void body(uint32_t ABCD[4], const uint8_t *src, int nblocks)
void av_md5_init(AVMD5 *ctx)
Initialize MD5 hashing.
#define CORE(i, a, b, c, d)
void av_md5_final(AVMD5 *ctx, uint8_t *dst)
Finish hashing and output digest value.
Public header for MD5 hash function implementation.