Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
C
cpython
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
Analytics
Analytics
Repository
Value Stream
Wiki
Wiki
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Commits
Issue Boards
Open sidebar
Kirill Smelkov
cpython
Commits
859bad00
Commit
859bad00
authored
Jul 10, 2000
by
Fred Drake
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Guido said include these in the Great ANSI-fication, so here they are!
parent
9ac81f69
Changes
2
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
216 additions
and
259 deletions
+216
-259
Modules/md5.h
Modules/md5.h
+6
-28
Modules/md5c.c
Modules/md5c.c
+210
-231
No files found.
Modules/md5.h
View file @
859bad00
...
@@ -27,18 +27,6 @@ documentation and/or software.
...
@@ -27,18 +27,6 @@ documentation and/or software.
/* GLOBAL.H - RSAREF types and constants
/* GLOBAL.H - RSAREF types and constants
*/
*/
/* PROTOTYPES should be set to one if and only if the compiler supports
function argument prototyping.
The following makes PROTOTYPES default to 0 if it has not already
been defined with C compiler flags.
*/
#ifdef HAVE_PROTOTYPES
#define PROTOTYPES 1
#endif
#ifndef PROTOTYPES
#define PROTOTYPES 0
#endif
/* POINTER defines a generic pointer type */
/* POINTER defines a generic pointer type */
typedef
unsigned
char
*
POINTER
;
typedef
unsigned
char
*
POINTER
;
...
@@ -62,22 +50,13 @@ typedef unsigned long int UINT4;
...
@@ -62,22 +50,13 @@ typedef unsigned long int UINT4;
/* Too bad if neither is */
/* Too bad if neither is */
#endif
#endif
/* PROTO_LIST is defined depending on how PROTOTYPES is defined above.
If using PROTOTYPES, then PROTO_LIST returns the list, otherwise it
returns an empty list.
*/
#if PROTOTYPES
#define PROTO_LIST(list) list
#else
#define PROTO_LIST(list) ()
#endif
/* ========== End global.h; continue md5.h ========== */
/* ========== End global.h; continue md5.h ========== */
/* MD5 context. */
/* MD5 context. */
typedef
struct
{
typedef
struct
{
UINT4
state
[
4
];
/* state (ABCD) */
UINT4
state
[
4
];
/* state (ABCD) */
UINT4
count
[
2
];
/* number of bits, modulo 2^64 (lsb first) */
UINT4
count
[
2
];
/* number of bits, modulo 2^64 (lsb first) */
unsigned
char
buffer
[
64
];
/* input buffer */
unsigned
char
buffer
[
64
];
/* input buffer */
}
MD5_CTX
;
}
MD5_CTX
;
/* Rename all exported symbols to avoid conflicts with similarly named
/* Rename all exported symbols to avoid conflicts with similarly named
...
@@ -87,7 +66,6 @@ typedef struct {
...
@@ -87,7 +66,6 @@ typedef struct {
#define MD5Update _Py_MD5Update
#define MD5Update _Py_MD5Update
#define MD5Final _Py_MD5Final
#define MD5Final _Py_MD5Final
void
MD5Init
PROTO_LIST
((
MD5_CTX
*
));
void
MD5Init
(
MD5_CTX
*
);
void
MD5Update
PROTO_LIST
void
MD5Update
(
MD5_CTX
*
,
unsigned
char
*
,
unsigned
int
);
((
MD5_CTX
*
,
unsigned
char
*
,
unsigned
int
));
void
MD5Final
(
unsigned
char
[
16
],
MD5_CTX
*
);
void
MD5Final
PROTO_LIST
((
unsigned
char
[
16
],
MD5_CTX
*
));
Modules/md5c.c
View file @
859bad00
...
@@ -26,8 +26,7 @@ documentation and/or software.
...
@@ -26,8 +26,7 @@ documentation and/or software.
#include "config.h"
#include "config.h"
#include "md5.h"
#include "md5.h"
/* Constants for MD5Transform routine.
/* Constants for MD5Transform routine. */
*/
#define S11 7
#define S11 7
#define S12 12
#define S12 12
...
@@ -46,290 +45,270 @@ documentation and/or software.
...
@@ -46,290 +45,270 @@ documentation and/or software.
#define S43 15
#define S43 15
#define S44 21
#define S44 21
static
void
MD5Transform
PROTO_LIST
((
UINT4
[
4
],
unsigned
char
[
64
]));
static
void
MD5Transform
(
UINT4
[
4
],
unsigned
char
[
64
]);
static
void
Encode
PROTO_LIST
static
void
Encode
(
unsigned
char
*
,
UINT4
*
,
unsigned
int
);
((
unsigned
char
*
,
UINT4
*
,
unsigned
int
));
static
void
Decode
(
UINT4
*
,
unsigned
char
*
,
unsigned
int
);
static
void
Decode
PROTO_LIST
static
void
MD5_memcpy
(
POINTER
,
POINTER
,
unsigned
int
);
((
UINT4
*
,
unsigned
char
*
,
unsigned
int
));
static
void
MD5_memset
(
POINTER
,
int
,
unsigned
int
);
static
void
MD5_memcpy
PROTO_LIST
((
POINTER
,
POINTER
,
unsigned
int
));
static
void
MD5_memset
PROTO_LIST
((
POINTER
,
int
,
unsigned
int
));
static
unsigned
char
PADDING
[
64
]
=
{
static
unsigned
char
PADDING
[
64
]
=
{
0x80
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0x80
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
,
0
};
};
/* F, G, H and I are basic MD5 functions.
/* F, G, H and I are basic MD5 functions. */
*/
#define F(x, y, z) (((x) & (y)) | ((~x) & (z)))
#define F(x, y, z) (((x) & (y)) | ((~x) & (z)))
#define G(x, y, z) (((x) & (z)) | ((y) & (~z)))
#define G(x, y, z) (((x) & (z)) | ((y) & (~z)))
#define H(x, y, z) ((x) ^ (y) ^ (z))
#define H(x, y, z) ((x) ^ (y) ^ (z))
#define I(x, y, z) ((y) ^ ((x) | (~z)))
#define I(x, y, z) ((y) ^ ((x) | (~z)))
/* ROTATE_LEFT rotates x left n bits.
/* ROTATE_LEFT rotates x left n bits. */
*/
#define ROTATE_LEFT(x, n) (((x) << (n)) | ((x) >> (32-(n))))
#define ROTATE_LEFT(x, n) (((x) << (n)) | ((x) >> (32-(n))))
/* FF, GG, HH, and II transformations for rounds 1, 2, 3, and 4.
/* FF, GG, HH, and II transformations for rounds 1, 2, 3, and 4.
Rotation is separate from addition to prevent recomputation.
Rotation is separate from addition to prevent recomputation.
*/
*/
#define FF(a, b, c, d, x, s, ac) { \
#define FF(a, b, c, d, x, s, ac) { \
(a) += F ((b), (c), (d)) + (x) + (UINT4)(ac); \
(a) += F ((b), (c), (d)) + (x) + (UINT4)(ac); \
(a) = ROTATE_LEFT ((a), (s)); \
(a) = ROTATE_LEFT ((a), (s)); \
(a) += (b); \
(a) += (b); \
}
}
#define GG(a, b, c, d, x, s, ac) { \
#define GG(a, b, c, d, x, s, ac) { \
(a) += G ((b), (c), (d)) + (x) + (UINT4)(ac); \
(a) += G ((b), (c), (d)) + (x) + (UINT4)(ac); \
(a) = ROTATE_LEFT ((a), (s)); \
(a) = ROTATE_LEFT ((a), (s)); \
(a) += (b); \
(a) += (b); \
}
}
#define HH(a, b, c, d, x, s, ac) { \
#define HH(a, b, c, d, x, s, ac) { \
(a) += H ((b), (c), (d)) + (x) + (UINT4)(ac); \
(a) += H ((b), (c), (d)) + (x) + (UINT4)(ac); \
(a) = ROTATE_LEFT ((a), (s)); \
(a) = ROTATE_LEFT ((a), (s)); \
(a) += (b); \
(a) += (b); \
}
}
#define II(a, b, c, d, x, s, ac) { \
#define II(a, b, c, d, x, s, ac) { \
(a) += I ((b), (c), (d)) + (x) + (UINT4)(ac); \
(a) += I ((b), (c), (d)) + (x) + (UINT4)(ac); \
(a) = ROTATE_LEFT ((a), (s)); \
(a) = ROTATE_LEFT ((a), (s)); \
(a) += (b); \
(a) += (b); \
}
}
/* MD5 initialization. Begins an MD5 operation, writing a new context.
*/
/* MD5 initialization. Begins an MD5 operation, writing a new context.
*/
void
MD5Init
(
context
)
void
MD5
_CTX
*
context
;
/* context */
MD5
Init
(
MD5_CTX
*
context
)
{
{
context
->
count
[
0
]
=
context
->
count
[
1
]
=
0
;
context
->
count
[
0
]
=
context
->
count
[
1
]
=
0
;
/* Load magic initialization constants.
/* Load magic initialization constants. */
*/
context
->
state
[
0
]
=
0x67452301
;
context
->
state
[
0
]
=
0x67452301
;
context
->
state
[
1
]
=
0xefcdab89
;
context
->
state
[
1
]
=
0xefcdab89
;
context
->
state
[
2
]
=
0x98badcfe
;
context
->
state
[
2
]
=
0x98badcfe
;
context
->
state
[
3
]
=
0x10325476
;
context
->
state
[
3
]
=
0x10325476
;
}
}
/* MD5 block update operation. Continues an MD5 message-digest
/* MD5 block update operation. Continues an MD5 message-digest
operation, processing another message block, and updating the
operation, processing another message block, and updating the
context.
context.
*/
*/
void
MD5Update
(
context
,
input
,
inputLen
)
void
MD5_CTX
*
context
;
/* context */
MD5Update
(
MD5_CTX
*
context
,
unsigned
char
*
input
,
unsigned
int
inputLen
)
unsigned
char
*
input
;
/* input block */
unsigned
int
inputLen
;
/* length of input block */
{
{
unsigned
int
i
,
index
,
partLen
;
unsigned
int
i
,
index
,
partLen
;
/* Compute number of bytes mod 64 */
/* Compute number of bytes mod 64 */
index
=
(
unsigned
int
)((
context
->
count
[
0
]
>>
3
)
&
0x3F
);
index
=
(
unsigned
int
)((
context
->
count
[
0
]
>>
3
)
&
0x3F
);
/* Update number of bits */
/* Update number of bits */
if
((
context
->
count
[
0
]
+=
((
UINT4
)
inputLen
<<
3
))
if
((
context
->
count
[
0
]
+=
((
UINT4
)
inputLen
<<
3
))
<
((
UINT4
)
inputLen
<<
3
))
<
((
UINT4
)
inputLen
<<
3
))
context
->
count
[
1
]
++
;
context
->
count
[
1
]
++
;
context
->
count
[
1
]
+=
((
UINT4
)
inputLen
>>
29
);
context
->
count
[
1
]
+=
((
UINT4
)
inputLen
>>
29
);
partLen
=
64
-
index
;
partLen
=
64
-
index
;
/* Transform as many times as possible.
/* Transform as many times as possible. */
*/
if
(
inputLen
>=
partLen
)
{
if
(
inputLen
>=
partLen
)
{
MD5_memcpy
((
POINTER
)
&
context
->
buffer
[
index
],
(
POINTER
)
input
,
partLen
);
MD5_memcpy
MD5Transform
(
context
->
state
,
context
->
buffer
);
((
POINTER
)
&
context
->
buffer
[
index
],
(
POINTER
)
input
,
partLen
);
MD5Transform
(
context
->
state
,
context
->
buffer
);
for
(
i
=
partLen
;
i
+
63
<
inputLen
;
i
+=
64
)
MD5Transform
(
context
->
state
,
&
input
[
i
]);
for
(
i
=
partLen
;
i
+
63
<
inputLen
;
i
+=
64
)
MD5Transform
(
context
->
state
,
&
input
[
i
]);
index
=
0
;
}
index
=
0
;
else
}
i
=
0
;
else
i
=
0
;
/* Buffer remaining input */
MD5_memcpy
((
POINTER
)
&
context
->
buffer
[
index
],
/* Buffer remaining input */
(
POINTER
)
&
input
[
i
],
inputLen
-
i
);
MD5_memcpy
((
POINTER
)
&
context
->
buffer
[
index
],
(
POINTER
)
&
input
[
i
],
inputLen
-
i
);
}
}
/* MD5 finalization. Ends an MD5 message-digest operation, writing the
/* MD5 finalization. Ends an MD5 message-digest operation, writing the
the message digest and zeroizing the context.
the message digest and zeroizing the context.
*/
*/
void
MD5Final
(
digest
,
context
)
void
unsigned
char
digest
[
16
];
/* message digest */
MD5Final
(
unsigned
char
digest
[
16
],
MD5_CTX
*
context
)
MD5_CTX
*
context
;
/* context */
{
{
unsigned
char
bits
[
8
];
unsigned
char
bits
[
8
];
unsigned
int
index
,
padLen
;
unsigned
int
index
,
padLen
;
/* Save number of bits */
/* Save number of bits */
Encode
(
bits
,
context
->
count
,
8
);
Encode
(
bits
,
context
->
count
,
8
);
/* Pad out to 56 mod 64.
/* Pad out to 56 mod 64. */
*/
index
=
(
unsigned
int
)((
context
->
count
[
0
]
>>
3
)
&
0x3f
);
index
=
(
unsigned
int
)((
context
->
count
[
0
]
>>
3
)
&
0x3f
);
padLen
=
(
index
<
56
)
?
(
56
-
index
)
:
(
120
-
index
);
padLen
=
(
index
<
56
)
?
(
56
-
index
)
:
(
120
-
index
);
MD5Update
(
context
,
PADDING
,
padLen
);
MD5Update
(
context
,
PADDING
,
padLen
);
/* Append length (before padding) */
/* Append length (before padding) */
MD5Update
(
context
,
bits
,
8
);
MD5Update
(
context
,
bits
,
8
);
/* Store state in digest */
/* Store state in digest */
Encode
(
digest
,
context
->
state
,
16
);
Encode
(
digest
,
context
->
state
,
16
);
/* Zeroize sensitive information.
/* Zeroize sensitive information. */
*/
MD5_memset
((
POINTER
)
context
,
0
,
sizeof
(
*
context
));
MD5_memset
((
POINTER
)
context
,
0
,
sizeof
(
*
context
));
}
}
/* MD5 basic transformation. Transforms state based on block.
*/
/* MD5 basic transformation. Transforms state based on block. */
static
void
MD5Transform
(
state
,
block
)
static
void
UINT4
state
[
4
];
MD5Transform
(
UINT4
state
[
4
],
unsigned
char
block
[
64
])
unsigned
char
block
[
64
];
{
{
UINT4
a
=
state
[
0
],
b
=
state
[
1
],
c
=
state
[
2
],
d
=
state
[
3
],
x
[
16
];
UINT4
a
=
state
[
0
],
b
=
state
[
1
],
c
=
state
[
2
],
d
=
state
[
3
],
x
[
16
];
Decode
(
x
,
block
,
64
);
Decode
(
x
,
block
,
64
);
/* Round 1 */
/* Round 1 */
FF
(
a
,
b
,
c
,
d
,
x
[
0
],
S11
,
0xd76aa478
);
/* 1 */
FF
(
a
,
b
,
c
,
d
,
x
[
0
],
S11
,
0xd76aa478
);
/* 1 */
FF
(
d
,
a
,
b
,
c
,
x
[
1
],
S12
,
0xe8c7b756
);
/* 2 */
FF
(
d
,
a
,
b
,
c
,
x
[
1
],
S12
,
0xe8c7b756
);
/* 2 */
FF
(
c
,
d
,
a
,
b
,
x
[
2
],
S13
,
0x242070db
);
/* 3 */
FF
(
c
,
d
,
a
,
b
,
x
[
2
],
S13
,
0x242070db
);
/* 3 */
FF
(
b
,
c
,
d
,
a
,
x
[
3
],
S14
,
0xc1bdceee
);
/* 4 */
FF
(
b
,
c
,
d
,
a
,
x
[
3
],
S14
,
0xc1bdceee
);
/* 4 */
FF
(
a
,
b
,
c
,
d
,
x
[
4
],
S11
,
0xf57c0faf
);
/* 5 */
FF
(
a
,
b
,
c
,
d
,
x
[
4
],
S11
,
0xf57c0faf
);
/* 5 */
FF
(
d
,
a
,
b
,
c
,
x
[
5
],
S12
,
0x4787c62a
);
/* 6 */
FF
(
d
,
a
,
b
,
c
,
x
[
5
],
S12
,
0x4787c62a
);
/* 6 */
FF
(
c
,
d
,
a
,
b
,
x
[
6
],
S13
,
0xa8304613
);
/* 7 */
FF
(
c
,
d
,
a
,
b
,
x
[
6
],
S13
,
0xa8304613
);
/* 7 */
FF
(
b
,
c
,
d
,
a
,
x
[
7
],
S14
,
0xfd469501
);
/* 8 */
FF
(
b
,
c
,
d
,
a
,
x
[
7
],
S14
,
0xfd469501
);
/* 8 */
FF
(
a
,
b
,
c
,
d
,
x
[
8
],
S11
,
0x698098d8
);
/* 9 */
FF
(
a
,
b
,
c
,
d
,
x
[
8
],
S11
,
0x698098d8
);
/* 9 */
FF
(
d
,
a
,
b
,
c
,
x
[
9
],
S12
,
0x8b44f7af
);
/* 10 */
FF
(
d
,
a
,
b
,
c
,
x
[
9
],
S12
,
0x8b44f7af
);
/* 10 */
FF
(
c
,
d
,
a
,
b
,
x
[
10
],
S13
,
0xffff5bb1
);
/* 11 */
FF
(
c
,
d
,
a
,
b
,
x
[
10
],
S13
,
0xffff5bb1
);
/* 11 */
FF
(
b
,
c
,
d
,
a
,
x
[
11
],
S14
,
0x895cd7be
);
/* 12 */
FF
(
b
,
c
,
d
,
a
,
x
[
11
],
S14
,
0x895cd7be
);
/* 12 */
FF
(
a
,
b
,
c
,
d
,
x
[
12
],
S11
,
0x6b901122
);
/* 13 */
FF
(
a
,
b
,
c
,
d
,
x
[
12
],
S11
,
0x6b901122
);
/* 13 */
FF
(
d
,
a
,
b
,
c
,
x
[
13
],
S12
,
0xfd987193
);
/* 14 */
FF
(
d
,
a
,
b
,
c
,
x
[
13
],
S12
,
0xfd987193
);
/* 14 */
FF
(
c
,
d
,
a
,
b
,
x
[
14
],
S13
,
0xa679438e
);
/* 15 */
FF
(
c
,
d
,
a
,
b
,
x
[
14
],
S13
,
0xa679438e
);
/* 15 */
FF
(
b
,
c
,
d
,
a
,
x
[
15
],
S14
,
0x49b40821
);
/* 16 */
FF
(
b
,
c
,
d
,
a
,
x
[
15
],
S14
,
0x49b40821
);
/* 16 */
/* Round 2 */
/* Round 2 */
GG
(
a
,
b
,
c
,
d
,
x
[
1
],
S21
,
0xf61e2562
);
/* 17 */
GG
(
a
,
b
,
c
,
d
,
x
[
1
],
S21
,
0xf61e2562
);
/* 17 */
GG
(
d
,
a
,
b
,
c
,
x
[
6
],
S22
,
0xc040b340
);
/* 18 */
GG
(
d
,
a
,
b
,
c
,
x
[
6
],
S22
,
0xc040b340
);
/* 18 */
GG
(
c
,
d
,
a
,
b
,
x
[
11
],
S23
,
0x265e5a51
);
/* 19 */
GG
(
c
,
d
,
a
,
b
,
x
[
11
],
S23
,
0x265e5a51
);
/* 19 */
GG
(
b
,
c
,
d
,
a
,
x
[
0
],
S24
,
0xe9b6c7aa
);
/* 20 */
GG
(
b
,
c
,
d
,
a
,
x
[
0
],
S24
,
0xe9b6c7aa
);
/* 20 */
GG
(
a
,
b
,
c
,
d
,
x
[
5
],
S21
,
0xd62f105d
);
/* 21 */
GG
(
a
,
b
,
c
,
d
,
x
[
5
],
S21
,
0xd62f105d
);
/* 21 */
GG
(
d
,
a
,
b
,
c
,
x
[
10
],
S22
,
0x2441453
);
/* 22 */
GG
(
d
,
a
,
b
,
c
,
x
[
10
],
S22
,
0x2441453
);
/* 22 */
GG
(
c
,
d
,
a
,
b
,
x
[
15
],
S23
,
0xd8a1e681
);
/* 23 */
GG
(
c
,
d
,
a
,
b
,
x
[
15
],
S23
,
0xd8a1e681
);
/* 23 */
GG
(
b
,
c
,
d
,
a
,
x
[
4
],
S24
,
0xe7d3fbc8
);
/* 24 */
GG
(
b
,
c
,
d
,
a
,
x
[
4
],
S24
,
0xe7d3fbc8
);
/* 24 */
GG
(
a
,
b
,
c
,
d
,
x
[
9
],
S21
,
0x21e1cde6
);
/* 25 */
GG
(
a
,
b
,
c
,
d
,
x
[
9
],
S21
,
0x21e1cde6
);
/* 25 */
GG
(
d
,
a
,
b
,
c
,
x
[
14
],
S22
,
0xc33707d6
);
/* 26 */
GG
(
d
,
a
,
b
,
c
,
x
[
14
],
S22
,
0xc33707d6
);
/* 26 */
GG
(
c
,
d
,
a
,
b
,
x
[
3
],
S23
,
0xf4d50d87
);
/* 27 */
GG
(
c
,
d
,
a
,
b
,
x
[
3
],
S23
,
0xf4d50d87
);
/* 27 */
GG
(
b
,
c
,
d
,
a
,
x
[
8
],
S24
,
0x455a14ed
);
/* 28 */
GG
(
b
,
c
,
d
,
a
,
x
[
8
],
S24
,
0x455a14ed
);
/* 28 */
GG
(
a
,
b
,
c
,
d
,
x
[
13
],
S21
,
0xa9e3e905
);
/* 29 */
GG
(
a
,
b
,
c
,
d
,
x
[
13
],
S21
,
0xa9e3e905
);
/* 29 */
GG
(
d
,
a
,
b
,
c
,
x
[
2
],
S22
,
0xfcefa3f8
);
/* 30 */
GG
(
d
,
a
,
b
,
c
,
x
[
2
],
S22
,
0xfcefa3f8
);
/* 30 */
GG
(
c
,
d
,
a
,
b
,
x
[
7
],
S23
,
0x676f02d9
);
/* 31 */
GG
(
c
,
d
,
a
,
b
,
x
[
7
],
S23
,
0x676f02d9
);
/* 31 */
GG
(
b
,
c
,
d
,
a
,
x
[
12
],
S24
,
0x8d2a4c8a
);
/* 32 */
GG
(
b
,
c
,
d
,
a
,
x
[
12
],
S24
,
0x8d2a4c8a
);
/* 32 */
/* Round 3 */
/* Round 3 */
HH
(
a
,
b
,
c
,
d
,
x
[
5
],
S31
,
0xfffa3942
);
/* 33 */
HH
(
a
,
b
,
c
,
d
,
x
[
5
],
S31
,
0xfffa3942
);
/* 33 */
HH
(
d
,
a
,
b
,
c
,
x
[
8
],
S32
,
0x8771f681
);
/* 34 */
HH
(
d
,
a
,
b
,
c
,
x
[
8
],
S32
,
0x8771f681
);
/* 34 */
HH
(
c
,
d
,
a
,
b
,
x
[
11
],
S33
,
0x6d9d6122
);
/* 35 */
HH
(
c
,
d
,
a
,
b
,
x
[
11
],
S33
,
0x6d9d6122
);
/* 35 */
HH
(
b
,
c
,
d
,
a
,
x
[
14
],
S34
,
0xfde5380c
);
/* 36 */
HH
(
b
,
c
,
d
,
a
,
x
[
14
],
S34
,
0xfde5380c
);
/* 36 */
HH
(
a
,
b
,
c
,
d
,
x
[
1
],
S31
,
0xa4beea44
);
/* 37 */
HH
(
a
,
b
,
c
,
d
,
x
[
1
],
S31
,
0xa4beea44
);
/* 37 */
HH
(
d
,
a
,
b
,
c
,
x
[
4
],
S32
,
0x4bdecfa9
);
/* 38 */
HH
(
d
,
a
,
b
,
c
,
x
[
4
],
S32
,
0x4bdecfa9
);
/* 38 */
HH
(
c
,
d
,
a
,
b
,
x
[
7
],
S33
,
0xf6bb4b60
);
/* 39 */
HH
(
c
,
d
,
a
,
b
,
x
[
7
],
S33
,
0xf6bb4b60
);
/* 39 */
HH
(
b
,
c
,
d
,
a
,
x
[
10
],
S34
,
0xbebfbc70
);
/* 40 */
HH
(
b
,
c
,
d
,
a
,
x
[
10
],
S34
,
0xbebfbc70
);
/* 40 */
HH
(
a
,
b
,
c
,
d
,
x
[
13
],
S31
,
0x289b7ec6
);
/* 41 */
HH
(
a
,
b
,
c
,
d
,
x
[
13
],
S31
,
0x289b7ec6
);
/* 41 */
HH
(
d
,
a
,
b
,
c
,
x
[
0
],
S32
,
0xeaa127fa
);
/* 42 */
HH
(
d
,
a
,
b
,
c
,
x
[
0
],
S32
,
0xeaa127fa
);
/* 42 */
HH
(
c
,
d
,
a
,
b
,
x
[
3
],
S33
,
0xd4ef3085
);
/* 43 */
HH
(
c
,
d
,
a
,
b
,
x
[
3
],
S33
,
0xd4ef3085
);
/* 43 */
HH
(
b
,
c
,
d
,
a
,
x
[
6
],
S34
,
0x4881d05
);
/* 44 */
HH
(
b
,
c
,
d
,
a
,
x
[
6
],
S34
,
0x4881d05
);
/* 44 */
HH
(
a
,
b
,
c
,
d
,
x
[
9
],
S31
,
0xd9d4d039
);
/* 45 */
HH
(
a
,
b
,
c
,
d
,
x
[
9
],
S31
,
0xd9d4d039
);
/* 45 */
HH
(
d
,
a
,
b
,
c
,
x
[
12
],
S32
,
0xe6db99e5
);
/* 46 */
HH
(
d
,
a
,
b
,
c
,
x
[
12
],
S32
,
0xe6db99e5
);
/* 46 */
HH
(
c
,
d
,
a
,
b
,
x
[
15
],
S33
,
0x1fa27cf8
);
/* 47 */
HH
(
c
,
d
,
a
,
b
,
x
[
15
],
S33
,
0x1fa27cf8
);
/* 47 */
HH
(
b
,
c
,
d
,
a
,
x
[
2
],
S34
,
0xc4ac5665
);
/* 48 */
HH
(
b
,
c
,
d
,
a
,
x
[
2
],
S34
,
0xc4ac5665
);
/* 48 */
/* Round 4 */
/* Round 4 */
II
(
a
,
b
,
c
,
d
,
x
[
0
],
S41
,
0xf4292244
);
/* 49 */
II
(
a
,
b
,
c
,
d
,
x
[
0
],
S41
,
0xf4292244
);
/* 49 */
II
(
d
,
a
,
b
,
c
,
x
[
7
],
S42
,
0x432aff97
);
/* 50 */
II
(
d
,
a
,
b
,
c
,
x
[
7
],
S42
,
0x432aff97
);
/* 50 */
II
(
c
,
d
,
a
,
b
,
x
[
14
],
S43
,
0xab9423a7
);
/* 51 */
II
(
c
,
d
,
a
,
b
,
x
[
14
],
S43
,
0xab9423a7
);
/* 51 */
II
(
b
,
c
,
d
,
a
,
x
[
5
],
S44
,
0xfc93a039
);
/* 52 */
II
(
b
,
c
,
d
,
a
,
x
[
5
],
S44
,
0xfc93a039
);
/* 52 */
II
(
a
,
b
,
c
,
d
,
x
[
12
],
S41
,
0x655b59c3
);
/* 53 */
II
(
a
,
b
,
c
,
d
,
x
[
12
],
S41
,
0x655b59c3
);
/* 53 */
II
(
d
,
a
,
b
,
c
,
x
[
3
],
S42
,
0x8f0ccc92
);
/* 54 */
II
(
d
,
a
,
b
,
c
,
x
[
3
],
S42
,
0x8f0ccc92
);
/* 54 */
II
(
c
,
d
,
a
,
b
,
x
[
10
],
S43
,
0xffeff47d
);
/* 55 */
II
(
c
,
d
,
a
,
b
,
x
[
10
],
S43
,
0xffeff47d
);
/* 55 */
II
(
b
,
c
,
d
,
a
,
x
[
1
],
S44
,
0x85845dd1
);
/* 56 */
II
(
b
,
c
,
d
,
a
,
x
[
1
],
S44
,
0x85845dd1
);
/* 56 */
II
(
a
,
b
,
c
,
d
,
x
[
8
],
S41
,
0x6fa87e4f
);
/* 57 */
II
(
a
,
b
,
c
,
d
,
x
[
8
],
S41
,
0x6fa87e4f
);
/* 57 */
II
(
d
,
a
,
b
,
c
,
x
[
15
],
S42
,
0xfe2ce6e0
);
/* 58 */
II
(
d
,
a
,
b
,
c
,
x
[
15
],
S42
,
0xfe2ce6e0
);
/* 58 */
II
(
c
,
d
,
a
,
b
,
x
[
6
],
S43
,
0xa3014314
);
/* 59 */
II
(
c
,
d
,
a
,
b
,
x
[
6
],
S43
,
0xa3014314
);
/* 59 */
II
(
b
,
c
,
d
,
a
,
x
[
13
],
S44
,
0x4e0811a1
);
/* 60 */
II
(
b
,
c
,
d
,
a
,
x
[
13
],
S44
,
0x4e0811a1
);
/* 60 */
II
(
a
,
b
,
c
,
d
,
x
[
4
],
S41
,
0xf7537e82
);
/* 61 */
II
(
a
,
b
,
c
,
d
,
x
[
4
],
S41
,
0xf7537e82
);
/* 61 */
II
(
d
,
a
,
b
,
c
,
x
[
11
],
S42
,
0xbd3af235
);
/* 62 */
II
(
d
,
a
,
b
,
c
,
x
[
11
],
S42
,
0xbd3af235
);
/* 62 */
II
(
c
,
d
,
a
,
b
,
x
[
2
],
S43
,
0x2ad7d2bb
);
/* 63 */
II
(
c
,
d
,
a
,
b
,
x
[
2
],
S43
,
0x2ad7d2bb
);
/* 63 */
II
(
b
,
c
,
d
,
a
,
x
[
9
],
S44
,
0xeb86d391
);
/* 64 */
II
(
b
,
c
,
d
,
a
,
x
[
9
],
S44
,
0xeb86d391
);
/* 64 */
state
[
0
]
+=
a
;
state
[
0
]
+=
a
;
state
[
1
]
+=
b
;
state
[
1
]
+=
b
;
state
[
2
]
+=
c
;
state
[
2
]
+=
c
;
state
[
3
]
+=
d
;
state
[
3
]
+=
d
;
/* Zeroize sensitive information.
/* Zeroize sensitive information. */
*/
MD5_memset
((
POINTER
)
x
,
0
,
sizeof
(
x
));
MD5_memset
((
POINTER
)
x
,
0
,
sizeof
(
x
));
}
}
/* Encodes input (UINT4) into output (unsigned char). Assumes len is
/* Encodes input (UINT4) into output (unsigned char). Assumes len is
a multiple of 4.
a multiple of 4.
*/
*/
static
void
Encode
(
output
,
input
,
len
)
static
void
unsigned
char
*
output
;
Encode
(
unsigned
char
*
output
,
UINT4
*
input
,
unsigned
int
len
)
UINT4
*
input
;
unsigned
int
len
;
{
{
unsigned
int
i
,
j
;
unsigned
int
i
,
j
;
for
(
i
=
0
,
j
=
0
;
j
<
len
;
i
++
,
j
+=
4
)
{
for
(
i
=
0
,
j
=
0
;
j
<
len
;
i
++
,
j
+=
4
)
{
output
[
j
]
=
(
unsigned
char
)(
input
[
i
]
&
0xff
);
output
[
j
]
=
(
unsigned
char
)(
input
[
i
]
&
0xff
);
output
[
j
+
1
]
=
(
unsigned
char
)((
input
[
i
]
>>
8
)
&
0xff
);
output
[
j
+
1
]
=
(
unsigned
char
)((
input
[
i
]
>>
8
)
&
0xff
);
output
[
j
+
2
]
=
(
unsigned
char
)((
input
[
i
]
>>
16
)
&
0xff
);
output
[
j
+
2
]
=
(
unsigned
char
)((
input
[
i
]
>>
16
)
&
0xff
);
output
[
j
+
3
]
=
(
unsigned
char
)((
input
[
i
]
>>
24
)
&
0xff
);
output
[
j
+
3
]
=
(
unsigned
char
)((
input
[
i
]
>>
24
)
&
0xff
);
}
}
}
}
/* Decodes input (unsigned char) into output (UINT4). Assumes len is
/* Decodes input (unsigned char) into output (UINT4). Assumes len is
a multiple of 4.
a multiple of 4.
*/
*/
static
void
Decode
(
output
,
input
,
len
)
static
void
UINT4
*
output
;
Decode
(
UINT4
*
output
,
unsigned
char
*
input
,
unsigned
int
len
)
unsigned
char
*
input
;
unsigned
int
len
;
{
{
unsigned
int
i
,
j
;
unsigned
int
i
,
j
;
for
(
i
=
0
,
j
=
0
;
j
<
len
;
i
++
,
j
+=
4
)
for
(
i
=
0
,
j
=
0
;
j
<
len
;
i
++
,
j
+=
4
)
{
output
[
i
]
=
((
UINT4
)
input
[
j
])
|
(((
UINT4
)
input
[
j
+
1
])
<<
8
)
|
output
[
i
]
=
((
UINT4
)
input
[
j
])
|
(((
UINT4
)
input
[
j
+
1
])
<<
8
)
|
(((
UINT4
)
input
[
j
+
2
])
<<
16
)
|
(((
UINT4
)
input
[
j
+
3
])
<<
24
);
(((
UINT4
)
input
[
j
+
2
])
<<
16
)
|
(((
UINT4
)
input
[
j
+
3
])
<<
24
);
}
}
}
/* Note: Replace "for loop" with standard memcpy if possible.
*/
static
void
MD5_memcpy
(
output
,
input
,
len
)
/* Note: Replace "for loop" with standard memcpy if possible. */
POINTER
output
;
static
void
POINTER
input
;
MD5_memcpy
(
POINTER
output
,
POINTER
input
,
unsigned
int
len
)
unsigned
int
len
;
{
{
unsigned
int
i
;
unsigned
int
i
;
for
(
i
=
0
;
i
<
len
;
i
++
)
for
(
i
=
0
;
i
<
len
;
i
++
)
output
[
i
]
=
input
[
i
];
output
[
i
]
=
input
[
i
];
}
}
/* Note: Replace "for loop" with standard memset if possible.
*/
/* Note: Replace "for loop" with standard memset if possible. */
static
void
MD5_memset
(
output
,
value
,
len
)
static
void
POINTER
output
;
MD5_memset
(
POINTER
output
,
int
value
,
unsigned
int
len
)
int
value
;
unsigned
int
len
;
{
{
unsigned
int
i
;
unsigned
int
i
;
for
(
i
=
0
;
i
<
len
;
i
++
)
for
(
i
=
0
;
i
<
len
;
i
++
)
((
char
*
)
output
)[
i
]
=
(
char
)
value
;
((
char
*
)
output
)[
i
]
=
(
char
)
value
;
}
}
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment