Dillo v3.1.1-46-g8a360e32
Loading...
Searching...
No Matches
md5.c File Reference

Independent implementation of MD5 (RFC 1321). More...

#include "md5.h"
#include <string.h>
#include <stdint.h>
Include dependency graph for md5.c:

Go to the source code of this file.

Macros

#define BYTE_ORDER   0
 
#define T_MASK   ((md5_word_t)~0)
 
#define T1   /* 0xd76aa478 */ (T_MASK ^ 0x28955b87)
 
#define T2   /* 0xe8c7b756 */ (T_MASK ^ 0x173848a9)
 
#define T3   0x242070db
 
#define T4   /* 0xc1bdceee */ (T_MASK ^ 0x3e423111)
 
#define T5   /* 0xf57c0faf */ (T_MASK ^ 0x0a83f050)
 
#define T6   0x4787c62a
 
#define T7   /* 0xa8304613 */ (T_MASK ^ 0x57cfb9ec)
 
#define T8   /* 0xfd469501 */ (T_MASK ^ 0x02b96afe)
 
#define T9   0x698098d8
 
#define T10   /* 0x8b44f7af */ (T_MASK ^ 0x74bb0850)
 
#define T11   /* 0xffff5bb1 */ (T_MASK ^ 0x0000a44e)
 
#define T12   /* 0x895cd7be */ (T_MASK ^ 0x76a32841)
 
#define T13   0x6b901122
 
#define T14   /* 0xfd987193 */ (T_MASK ^ 0x02678e6c)
 
#define T15   /* 0xa679438e */ (T_MASK ^ 0x5986bc71)
 
#define T16   0x49b40821
 
#define T17   /* 0xf61e2562 */ (T_MASK ^ 0x09e1da9d)
 
#define T18   /* 0xc040b340 */ (T_MASK ^ 0x3fbf4cbf)
 
#define T19   0x265e5a51
 
#define T20   /* 0xe9b6c7aa */ (T_MASK ^ 0x16493855)
 
#define T21   /* 0xd62f105d */ (T_MASK ^ 0x29d0efa2)
 
#define T22   0x02441453
 
#define T23   /* 0xd8a1e681 */ (T_MASK ^ 0x275e197e)
 
#define T24   /* 0xe7d3fbc8 */ (T_MASK ^ 0x182c0437)
 
#define T25   0x21e1cde6
 
#define T26   /* 0xc33707d6 */ (T_MASK ^ 0x3cc8f829)
 
#define T27   /* 0xf4d50d87 */ (T_MASK ^ 0x0b2af278)
 
#define T28   0x455a14ed
 
#define T29   /* 0xa9e3e905 */ (T_MASK ^ 0x561c16fa)
 
#define T30   /* 0xfcefa3f8 */ (T_MASK ^ 0x03105c07)
 
#define T31   0x676f02d9
 
#define T32   /* 0x8d2a4c8a */ (T_MASK ^ 0x72d5b375)
 
#define T33   /* 0xfffa3942 */ (T_MASK ^ 0x0005c6bd)
 
#define T34   /* 0x8771f681 */ (T_MASK ^ 0x788e097e)
 
#define T35   0x6d9d6122
 
#define T36   /* 0xfde5380c */ (T_MASK ^ 0x021ac7f3)
 
#define T37   /* 0xa4beea44 */ (T_MASK ^ 0x5b4115bb)
 
#define T38   0x4bdecfa9
 
#define T39   /* 0xf6bb4b60 */ (T_MASK ^ 0x0944b49f)
 
#define T40   /* 0xbebfbc70 */ (T_MASK ^ 0x4140438f)
 
#define T41   0x289b7ec6
 
#define T42   /* 0xeaa127fa */ (T_MASK ^ 0x155ed805)
 
#define T43   /* 0xd4ef3085 */ (T_MASK ^ 0x2b10cf7a)
 
#define T44   0x04881d05
 
#define T45   /* 0xd9d4d039 */ (T_MASK ^ 0x262b2fc6)
 
#define T46   /* 0xe6db99e5 */ (T_MASK ^ 0x1924661a)
 
#define T47   0x1fa27cf8
 
#define T48   /* 0xc4ac5665 */ (T_MASK ^ 0x3b53a99a)
 
#define T49   /* 0xf4292244 */ (T_MASK ^ 0x0bd6ddbb)
 
#define T50   0x432aff97
 
#define T51   /* 0xab9423a7 */ (T_MASK ^ 0x546bdc58)
 
#define T52   /* 0xfc93a039 */ (T_MASK ^ 0x036c5fc6)
 
#define T53   0x655b59c3
 
#define T54   /* 0x8f0ccc92 */ (T_MASK ^ 0x70f3336d)
 
#define T55   /* 0xffeff47d */ (T_MASK ^ 0x00100b82)
 
#define T56   /* 0x85845dd1 */ (T_MASK ^ 0x7a7ba22e)
 
#define T57   0x6fa87e4f
 
#define T58   /* 0xfe2ce6e0 */ (T_MASK ^ 0x01d3191f)
 
#define T59   /* 0xa3014314 */ (T_MASK ^ 0x5cfebceb)
 
#define T60   0x4e0811a1
 
#define T61   /* 0xf7537e82 */ (T_MASK ^ 0x08ac817d)
 
#define T62   /* 0xbd3af235 */ (T_MASK ^ 0x42c50dca)
 
#define T63   0x2ad7d2bb
 
#define T64   /* 0xeb86d391 */ (T_MASK ^ 0x14792c6e)
 
#define ROTATE_LEFT(x, n)   (((x) << (n)) | ((x) >> (32 - (n))))
 
#define F(x, y, z)   (((x) & (y)) | (~(x) & (z)))
 
#define SET(a, b, c, d, k, s, Ti)
 
#define G(x, y, z)   (((x) & (z)) | ((y) & ~(z)))
 
#define SET(a, b, c, d, k, s, Ti)
 
#define H(x, y, z)   ((x) ^ (y) ^ (z))
 
#define SET(a, b, c, d, k, s, Ti)
 
#define I(x, y, z)   ((y) ^ ((x) | ~(z)))
 
#define SET(a, b, c, d, k, s, Ti)
 

Functions

static void md5_process (md5_state_t *pms, const md5_byte_t *data)
 
void md5_init (md5_state_t *pms)
 Initialize the algorithm.
 
void md5_append (md5_state_t *pms, const md5_byte_t *data, int nbytes)
 Append a string to the message.
 
void md5_finish (md5_state_t *pms, md5_byte_t digest[16])
 Finish the message and return the digest.
 

Detailed Description

Independent implementation of MD5 (RFC 1321).

This code implements the MD5 Algorithm defined in RFC 1321, whose text is available at http://www.ietf.org/rfc/rfc1321.txt The code is derived from the text of the RFC, including the test suite (section A.5) but excluding the rest of Appendix A. It does not include any code or documentation that is identified in the RFC as being copyrighted.

The original and principal author of md5.c is L. Peter Deutsch ghost.nosp@m.@ala.nosp@m.ddin..nosp@m.com. Other authors are noted in the change history that follows (in reverse chronological order):

  • 2002-04-13 lpd Clarified derivation from RFC 1321; now handles byte order either statically or dynamically; added missing #include <string.h> in library.
  • 2002-03-11 lpd Corrected argument list for main(), and added int return type, in test program and T value program.
  • 2002-02-21 lpd Added missing #include <stdio.h> in test program.
  • 2000-07-03 lpd Patched to eliminate warnings about "constant is unsigned in ANSI C, signed in traditional"; made test program self-checking.
  • 1999-11-04 lpd Edited comments slightly for automatic TOC extraction.
  • 1999-10-18 lpd Fixed typo in header comment (ansi2knr rather than md5).
  • 1999-05-03 lpd Original version.

Definition in file md5.c.

Macro Definition Documentation

◆ BYTE_ORDER

#define BYTE_ORDER   0

Definition at line 72 of file md5.c.

◆ F

#define F (   x,
  y,
 
)    (((x) & (y)) | (~(x) & (z)))

◆ G

#define G (   x,
  y,
 
)    (((x) & (z)) | ((y) & ~(z)))

◆ H

#define H (   x,
  y,
 
)    ((x) ^ (y) ^ (z))

◆ I

#define I (   x,
  y,
 
)    ((y) ^ ((x) | ~(z)))

◆ ROTATE_LEFT

#define ROTATE_LEFT (   x,
 
)    (((x) << (n)) | ((x) >> (32 - (n))))

◆ SET [1/4]

#define SET (   a,
  b,
  c,
  d,
  k,
  s,
  Ti 
)
Value:
t = a + F(b,c,d) + X[k] + Ti;\
a = ROTATE_LEFT(t, s) + b
#define ROTATE_LEFT(x, n)
#define F(x, y, z)

◆ SET [2/4]

#define SET (   a,
  b,
  c,
  d,
  k,
  s,
  Ti 
)
Value:
t = a + G(b,c,d) + X[k] + Ti;\
a = ROTATE_LEFT(t, s) + b
#define G(x, y, z)

◆ SET [3/4]

#define SET (   a,
  b,
  c,
  d,
  k,
  s,
  Ti 
)
Value:
t = a + H(b,c,d) + X[k] + Ti;\
a = ROTATE_LEFT(t, s) + b
#define H(x, y, z)

◆ SET [4/4]

#define SET (   a,
  b,
  c,
  d,
  k,
  s,
  Ti 
)
Value:
t = a + I(b,c,d) + X[k] + Ti;\
a = ROTATE_LEFT(t, s) + b
#define I(x, y, z)

◆ T1

#define T1   /* 0xd76aa478 */ (T_MASK ^ 0x28955b87)

Definition at line 76 of file md5.c.

◆ T10

#define T10   /* 0x8b44f7af */ (T_MASK ^ 0x74bb0850)

Definition at line 85 of file md5.c.

◆ T11

#define T11   /* 0xffff5bb1 */ (T_MASK ^ 0x0000a44e)

Definition at line 86 of file md5.c.

◆ T12

#define T12   /* 0x895cd7be */ (T_MASK ^ 0x76a32841)

Definition at line 87 of file md5.c.

◆ T13

#define T13   0x6b901122

Definition at line 88 of file md5.c.

◆ T14

#define T14   /* 0xfd987193 */ (T_MASK ^ 0x02678e6c)

Definition at line 89 of file md5.c.

◆ T15

#define T15   /* 0xa679438e */ (T_MASK ^ 0x5986bc71)

Definition at line 90 of file md5.c.

◆ T16

#define T16   0x49b40821

Definition at line 91 of file md5.c.

◆ T17

#define T17   /* 0xf61e2562 */ (T_MASK ^ 0x09e1da9d)

Definition at line 92 of file md5.c.

◆ T18

#define T18   /* 0xc040b340 */ (T_MASK ^ 0x3fbf4cbf)

Definition at line 93 of file md5.c.

◆ T19

#define T19   0x265e5a51

Definition at line 94 of file md5.c.

◆ T2

#define T2   /* 0xe8c7b756 */ (T_MASK ^ 0x173848a9)

Definition at line 77 of file md5.c.

◆ T20

#define T20   /* 0xe9b6c7aa */ (T_MASK ^ 0x16493855)

Definition at line 95 of file md5.c.

◆ T21

#define T21   /* 0xd62f105d */ (T_MASK ^ 0x29d0efa2)

Definition at line 96 of file md5.c.

◆ T22

#define T22   0x02441453

Definition at line 97 of file md5.c.

◆ T23

#define T23   /* 0xd8a1e681 */ (T_MASK ^ 0x275e197e)

Definition at line 98 of file md5.c.

◆ T24

#define T24   /* 0xe7d3fbc8 */ (T_MASK ^ 0x182c0437)

Definition at line 99 of file md5.c.

◆ T25

#define T25   0x21e1cde6

Definition at line 100 of file md5.c.

◆ T26

#define T26   /* 0xc33707d6 */ (T_MASK ^ 0x3cc8f829)

Definition at line 101 of file md5.c.

◆ T27

#define T27   /* 0xf4d50d87 */ (T_MASK ^ 0x0b2af278)

Definition at line 102 of file md5.c.

◆ T28

#define T28   0x455a14ed

Definition at line 103 of file md5.c.

◆ T29

#define T29   /* 0xa9e3e905 */ (T_MASK ^ 0x561c16fa)

Definition at line 104 of file md5.c.

◆ T3

#define T3   0x242070db

Definition at line 78 of file md5.c.

◆ T30

#define T30   /* 0xfcefa3f8 */ (T_MASK ^ 0x03105c07)

Definition at line 105 of file md5.c.

◆ T31

#define T31   0x676f02d9

Definition at line 106 of file md5.c.

◆ T32

#define T32   /* 0x8d2a4c8a */ (T_MASK ^ 0x72d5b375)

Definition at line 107 of file md5.c.

◆ T33

#define T33   /* 0xfffa3942 */ (T_MASK ^ 0x0005c6bd)

Definition at line 108 of file md5.c.

◆ T34

#define T34   /* 0x8771f681 */ (T_MASK ^ 0x788e097e)

Definition at line 109 of file md5.c.

◆ T35

#define T35   0x6d9d6122

Definition at line 110 of file md5.c.

◆ T36

#define T36   /* 0xfde5380c */ (T_MASK ^ 0x021ac7f3)

Definition at line 111 of file md5.c.

◆ T37

#define T37   /* 0xa4beea44 */ (T_MASK ^ 0x5b4115bb)

Definition at line 112 of file md5.c.

◆ T38

#define T38   0x4bdecfa9

Definition at line 113 of file md5.c.

◆ T39

#define T39   /* 0xf6bb4b60 */ (T_MASK ^ 0x0944b49f)

Definition at line 114 of file md5.c.

◆ T4

#define T4   /* 0xc1bdceee */ (T_MASK ^ 0x3e423111)

Definition at line 79 of file md5.c.

◆ T40

#define T40   /* 0xbebfbc70 */ (T_MASK ^ 0x4140438f)

Definition at line 115 of file md5.c.

◆ T41

#define T41   0x289b7ec6

Definition at line 116 of file md5.c.

◆ T42

#define T42   /* 0xeaa127fa */ (T_MASK ^ 0x155ed805)

Definition at line 117 of file md5.c.

◆ T43

#define T43   /* 0xd4ef3085 */ (T_MASK ^ 0x2b10cf7a)

Definition at line 118 of file md5.c.

◆ T44

#define T44   0x04881d05

Definition at line 119 of file md5.c.

◆ T45

#define T45   /* 0xd9d4d039 */ (T_MASK ^ 0x262b2fc6)

Definition at line 120 of file md5.c.

◆ T46

#define T46   /* 0xe6db99e5 */ (T_MASK ^ 0x1924661a)

Definition at line 121 of file md5.c.

◆ T47

#define T47   0x1fa27cf8

Definition at line 122 of file md5.c.

◆ T48

#define T48   /* 0xc4ac5665 */ (T_MASK ^ 0x3b53a99a)

Definition at line 123 of file md5.c.

◆ T49

#define T49   /* 0xf4292244 */ (T_MASK ^ 0x0bd6ddbb)

Definition at line 124 of file md5.c.

◆ T5

#define T5   /* 0xf57c0faf */ (T_MASK ^ 0x0a83f050)

Definition at line 80 of file md5.c.

◆ T50

#define T50   0x432aff97

Definition at line 125 of file md5.c.

◆ T51

#define T51   /* 0xab9423a7 */ (T_MASK ^ 0x546bdc58)

Definition at line 126 of file md5.c.

◆ T52

#define T52   /* 0xfc93a039 */ (T_MASK ^ 0x036c5fc6)

Definition at line 127 of file md5.c.

◆ T53

#define T53   0x655b59c3

Definition at line 128 of file md5.c.

◆ T54

#define T54   /* 0x8f0ccc92 */ (T_MASK ^ 0x70f3336d)

Definition at line 129 of file md5.c.

◆ T55

#define T55   /* 0xffeff47d */ (T_MASK ^ 0x00100b82)

Definition at line 130 of file md5.c.

◆ T56

#define T56   /* 0x85845dd1 */ (T_MASK ^ 0x7a7ba22e)

Definition at line 131 of file md5.c.

◆ T57

#define T57   0x6fa87e4f

Definition at line 132 of file md5.c.

◆ T58

#define T58   /* 0xfe2ce6e0 */ (T_MASK ^ 0x01d3191f)

Definition at line 133 of file md5.c.

◆ T59

#define T59   /* 0xa3014314 */ (T_MASK ^ 0x5cfebceb)

Definition at line 134 of file md5.c.

◆ T6

#define T6   0x4787c62a

Definition at line 81 of file md5.c.

◆ T60

#define T60   0x4e0811a1

Definition at line 135 of file md5.c.

◆ T61

#define T61   /* 0xf7537e82 */ (T_MASK ^ 0x08ac817d)

Definition at line 136 of file md5.c.

◆ T62

#define T62   /* 0xbd3af235 */ (T_MASK ^ 0x42c50dca)

Definition at line 137 of file md5.c.

◆ T63

#define T63   0x2ad7d2bb

Definition at line 138 of file md5.c.

◆ T64

#define T64   /* 0xeb86d391 */ (T_MASK ^ 0x14792c6e)

Definition at line 139 of file md5.c.

◆ T7

#define T7   /* 0xa8304613 */ (T_MASK ^ 0x57cfb9ec)

Definition at line 82 of file md5.c.

◆ T8

#define T8   /* 0xfd469501 */ (T_MASK ^ 0x02b96afe)

Definition at line 83 of file md5.c.

◆ T9

#define T9   0x698098d8

Definition at line 84 of file md5.c.

◆ T_MASK

#define T_MASK   ((md5_word_t)~0)

Definition at line 75 of file md5.c.

Function Documentation

◆ md5_append()

void md5_append ( md5_state_t pms,
const md5_byte_t data,
int  nbytes 
)

Append a string to the message.

Definition at line 334 of file md5.c.

References md5_state_s::buf, md5_state_s::count, and md5_process().

Referenced by md5_finish(), and md5hexdigest().

◆ md5_finish()

void md5_finish ( md5_state_t pms,
md5_byte_t  digest[16] 
)

Finish the message and return the digest.

Definition at line 372 of file md5.c.

References md5_state_s::abcd, md5_state_s::count, and md5_append().

Referenced by md5hexdigest().

◆ md5_init()

void md5_init ( md5_state_t pms)

Initialize the algorithm.

Definition at line 324 of file md5.c.

References md5_state_s::abcd, md5_state_s::count, and T_MASK.

Referenced by md5hexdigest().

◆ md5_process()

static void md5_process ( md5_state_t pms,
const md5_byte_t data 
)
static

Definition at line 143 of file md5.c.

References md5_state_s::abcd, SET, T1, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T2, T20, T21, T22, T23, T24, T25, T26, T27, T28, T29, T3, T30, T31, T32, T33, T34, T35, T36, T37, T38, T39, T4, T40, T41, T42, T43, T44, T45, T46, T47, T48, T49, T5, T50, T51, T52, T53, T54, T55, T56, T57, T58, T59, T6, T60, T61, T62, T63, T64, T7, T8, and T9.

Referenced by md5_append().