md5.c File Reference

#include "md5.h"
#include <string.h>
#include <stdio.h>
#include "MALLOC.h"

Include dependency graph for md5.c:

Go to the source code of this file.

Defines

#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

char * md5_str (char *p)
char * md5_file (FILE *fp)
static void md5_process (md5_state_t *pms, const md5_byte_t *data)
void md5_init (md5_state_t *pms)
void md5_append (md5_state_t *pms, const md5_byte_t *data, int nbytes)
void md5_finish (md5_state_t *pms, md5_byte_t digest[16])


Define Documentation

#define BYTE_ORDER   0

Definition at line 64 of file md5.c.

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

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

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

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

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

#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 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 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 SET ( a,
b,
c,
d,
k,
s,
Ti   ) 

Value:

t = a + F(b,c,d) + X[k] + Ti;\
  a = ROTATE_LEFT(t, s) + b

Referenced by genset(), and md5_process().

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

Definition at line 68 of file md5.c.

Referenced by md5_process().

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

Definition at line 77 of file md5.c.

Referenced by md5_process().

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

Definition at line 78 of file md5.c.

Referenced by md5_process().

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

Definition at line 79 of file md5.c.

Referenced by md5_process().

#define T13   0x6b901122

Definition at line 80 of file md5.c.

Referenced by md5_process().

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

Definition at line 81 of file md5.c.

Referenced by md5_process().

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

Definition at line 82 of file md5.c.

Referenced by md5_process().

#define T16   0x49b40821

Definition at line 83 of file md5.c.

Referenced by md5_process().

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

Definition at line 84 of file md5.c.

Referenced by md5_process().

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

Definition at line 85 of file md5.c.

Referenced by md5_process().

#define T19   0x265e5a51

Definition at line 86 of file md5.c.

Referenced by md5_process().

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

Definition at line 69 of file md5.c.

Referenced by md5_process().

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

Definition at line 87 of file md5.c.

Referenced by md5_process().

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

Definition at line 88 of file md5.c.

Referenced by md5_process().

#define T22   0x02441453

Definition at line 89 of file md5.c.

Referenced by md5_process().

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

Definition at line 90 of file md5.c.

Referenced by md5_process().

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

Definition at line 91 of file md5.c.

Referenced by md5_process().

#define T25   0x21e1cde6

Definition at line 92 of file md5.c.

Referenced by md5_process().

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

Definition at line 93 of file md5.c.

Referenced by md5_process().

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

Definition at line 94 of file md5.c.

Referenced by md5_process().

#define T28   0x455a14ed

Definition at line 95 of file md5.c.

Referenced by md5_process().

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

Definition at line 96 of file md5.c.

Referenced by md5_process().

#define T3   0x242070db

Definition at line 70 of file md5.c.

Referenced by md5_process().

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

Definition at line 97 of file md5.c.

Referenced by md5_process().

#define T31   0x676f02d9

Definition at line 98 of file md5.c.

Referenced by md5_process().

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

Definition at line 99 of file md5.c.

Referenced by md5_process().

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

Definition at line 100 of file md5.c.

Referenced by md5_process().

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

Definition at line 101 of file md5.c.

Referenced by md5_process().

#define T35   0x6d9d6122

Definition at line 102 of file md5.c.

Referenced by md5_process().

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

Definition at line 103 of file md5.c.

Referenced by md5_process().

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

Definition at line 104 of file md5.c.

Referenced by md5_process().

#define T38   0x4bdecfa9

Definition at line 105 of file md5.c.

Referenced by md5_process().

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

Definition at line 106 of file md5.c.

Referenced by md5_process().

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

Definition at line 71 of file md5.c.

Referenced by md5_process().

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

Definition at line 107 of file md5.c.

Referenced by md5_process().

#define T41   0x289b7ec6

Definition at line 108 of file md5.c.

Referenced by md5_process().

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

Definition at line 109 of file md5.c.

Referenced by md5_process().

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

Definition at line 110 of file md5.c.

Referenced by md5_process().

#define T44   0x04881d05

Definition at line 111 of file md5.c.

Referenced by md5_process().

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

Definition at line 112 of file md5.c.

Referenced by md5_process().

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

Definition at line 113 of file md5.c.

Referenced by md5_process().

#define T47   0x1fa27cf8

Definition at line 114 of file md5.c.

Referenced by md5_process().

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

Definition at line 115 of file md5.c.

Referenced by md5_process().

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

Definition at line 116 of file md5.c.

Referenced by md5_process().

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

Definition at line 72 of file md5.c.

Referenced by md5_process().

#define T50   0x432aff97

Definition at line 117 of file md5.c.

Referenced by md5_process().

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

Definition at line 118 of file md5.c.

Referenced by md5_process().

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

Definition at line 119 of file md5.c.

Referenced by md5_process().

#define T53   0x655b59c3

Definition at line 120 of file md5.c.

Referenced by md5_process().

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

Definition at line 121 of file md5.c.

Referenced by md5_process().

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

Definition at line 122 of file md5.c.

Referenced by md5_process().

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

Definition at line 123 of file md5.c.

Referenced by md5_process().

#define T57   0x6fa87e4f

Definition at line 124 of file md5.c.

Referenced by md5_process().

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

Definition at line 125 of file md5.c.

Referenced by md5_process().

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

Definition at line 126 of file md5.c.

Referenced by md5_process().

#define T6   0x4787c62a

Definition at line 73 of file md5.c.

Referenced by md5_process().

#define T60   0x4e0811a1

Definition at line 127 of file md5.c.

Referenced by md5_process().

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

Definition at line 128 of file md5.c.

Referenced by md5_process().

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

Definition at line 129 of file md5.c.

Referenced by md5_process().

#define T63   0x2ad7d2bb

Definition at line 130 of file md5.c.

Referenced by md5_process().

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

Definition at line 131 of file md5.c.

Referenced by md5_process().

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

Definition at line 74 of file md5.c.

Referenced by md5_process().

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

Definition at line 75 of file md5.c.

Referenced by md5_process().

#define T9   0x698098d8

Definition at line 76 of file md5.c.

Referenced by md5_process().

#define T_MASK   ((md5_word_t)~0)

Definition at line 67 of file md5.c.

Referenced by md5_init().


Function Documentation

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

Definition at line 324 of file md5.c.

References md5_state_s::buf, md5_state_s::count, left, md5_process(), memcpy(), offset, and p.

Referenced by md5_file(), md5_finish(), and md5_str().

00325 {
00326     const md5_byte_t *p = data;
00327     int left = nbytes;
00328     int offset = (pms->count[0] >> 3) & 63;
00329     md5_word_t nbits = (md5_word_t)(nbytes << 3);
00330 
00331     if (nbytes <= 0)
00332         return;
00333 
00334     /* Update the message length. */
00335     pms->count[1] += nbytes >> 29;
00336     pms->count[0] += nbits;
00337     if (pms->count[0] < nbits)
00338         pms->count[1]++;
00339 
00340     /* Process an initial partial block. */
00341     if (offset) {
00342         int copy = (offset + nbytes > 64 ? 64 - offset : nbytes);
00343 
00344         memcpy(pms->buf + offset, p, copy);
00345         if (offset + copy < 64)
00346             return;
00347         p += copy;
00348         left -= copy;
00349         md5_process(pms, pms->buf);
00350     }
00351 
00352     /* Process full blocks. */
00353     for (; left >= 64; p += 64, left -= 64)
00354         md5_process(pms, p);
00355 
00356     /* Process a final partial block. */
00357     if (left)
00358         memcpy(pms->buf, p, left);
00359 }

Here is the call graph for this function:

Here is the caller graph for this function:

char* md5_file ( FILE *  fp  ) 

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

Definition at line 361 of file md5.c.

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

Referenced by md5_file(), and md5_str().

00362 {
00363     static const md5_byte_t pad[64] = {
00364         0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
00365         0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
00366         0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
00367         0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
00368     };
00369     md5_byte_t data[8];
00370     int i;
00371 
00372     /* Save the length before padding. */
00373     for (i = 0; i < 8; ++i)
00374         data[i] = (md5_byte_t)(pms->count[i >> 2] >> ((i & 3) << 3));
00375     /* Pad to 56 bytes mod 64. */
00376     md5_append(pms, pad, ((55 - (pms->count[0] >> 3)) & 63) + 1);
00377     /* Append the length. */
00378     md5_append(pms, data, 8);
00379     for (i = 0; i < 16; ++i)
00380         digest[i] = (md5_byte_t)(pms->abcd[i >> 2] >> ((i & 3) << 3));
00381 }

Here is the call graph for this function:

Here is the caller graph for this function:

void md5_init ( md5_state_t pms  ) 

Definition at line 315 of file md5.c.

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

Referenced by md5_file(), and md5_str().

00316 {
00317     pms->count[0] = pms->count[1] = 0;
00318     pms->abcd[0] = 0x67452301;
00319     pms->abcd[1] = /*0xefcdab89*/ T_MASK ^ 0x10325476;
00320     pms->abcd[2] = /*0x98badcfe*/ T_MASK ^ 0x67452301;
00321     pms->abcd[3] = 0x10325476;
00322 }

Here is the caller graph for this function:

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

Definition at line 136 of file md5.c.

References a, md5_state_s::abcd, b, i, memcpy(), SET, t, 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, T9, w, and X.

Referenced by md5_append().

00137 {
00138     md5_word_t
00139         a = pms->abcd[0], b = pms->abcd[1],
00140         c = pms->abcd[2], d = pms->abcd[3];
00141     md5_word_t t;
00142 #if BYTE_ORDER > 0
00143     /* Define storage only for big-endian CPUs. */
00144     md5_word_t X[16];
00145 #else
00146     /* Define storage for little-endian or both types of CPUs. */
00147     md5_word_t xbuf[16];
00148     const md5_word_t *X;
00149 #endif
00150     {
00151 #if BYTE_ORDER == 0
00152         /*
00153          * Determine dynamically whether this is a big-endian or
00154          * little-endian machine, since we can use a more efficient
00155          * algorithm on the latter.
00156          */
00157         static const int w = 1;
00158 
00159         if (*((const md5_byte_t *)&w)) /* dynamic little-endian */
00160 #endif
00161 #if BYTE_ORDER <= 0             /* little-endian */
00162         {
00163             /*
00164              * On little-endian machines, we can process properly aligned
00165              * data without copying it.
00166              */
00167             if (!((data - (const md5_byte_t *)0) & 3)) {
00168                 /* data are properly aligned */
00169                 X = (const md5_word_t *)data;
00170             } else {
00171                 /* not aligned */
00172                 memcpy(xbuf, data, 64);
00173                 X = xbuf;
00174             }
00175         }
00176 #endif
00177 #if BYTE_ORDER == 0
00178         else                    /* dynamic big-endian */
00179 #endif
00180 #if BYTE_ORDER >= 0             /* big-endian */
00181         {
00182             /*
00183              * On big-endian machines, we must arrange the bytes in the
00184              * right order.
00185              */
00186             const md5_byte_t *xp = data;
00187             int i;
00188 
00189 #  if BYTE_ORDER == 0
00190             X = xbuf;           /* (dynamic only) */
00191 #  else
00192 #    define xbuf X              /* (static only) */
00193 #  endif
00194             for (i = 0; i < 16; ++i, xp += 4)
00195                 xbuf[i] = xp[0] + (xp[1] << 8) + (xp[2] << 16) + (xp[3] << 24);
00196         }
00197 #endif
00198     }
00199 
00200 #define ROTATE_LEFT(x, n) (((x) << (n)) | ((x) >> (32 - (n))))
00201 
00202     /* Round 1. */
00203     /* Let [abcd k s i] denote the operation
00204        a = b + ((a + F(b,c,d) + X[k] + T[i]) <<< s). */
00205 #define F(x, y, z) (((x) & (y)) | (~(x) & (z)))
00206 #define SET(a, b, c, d, k, s, Ti)\
00207   t = a + F(b,c,d) + X[k] + Ti;\
00208   a = ROTATE_LEFT(t, s) + b
00209     /* Do the following 16 operations. */
00210     SET(a, b, c, d,  0,  7,  T1);
00211     SET(d, a, b, c,  1, 12,  T2);
00212     SET(c, d, a, b,  2, 17,  T3);
00213     SET(b, c, d, a,  3, 22,  T4);
00214     SET(a, b, c, d,  4,  7,  T5);
00215     SET(d, a, b, c,  5, 12,  T6);
00216     SET(c, d, a, b,  6, 17,  T7);
00217     SET(b, c, d, a,  7, 22,  T8);
00218     SET(a, b, c, d,  8,  7,  T9);
00219     SET(d, a, b, c,  9, 12, T10);
00220     SET(c, d, a, b, 10, 17, T11);
00221     SET(b, c, d, a, 11, 22, T12);
00222     SET(a, b, c, d, 12,  7, T13);
00223     SET(d, a, b, c, 13, 12, T14);
00224     SET(c, d, a, b, 14, 17, T15);
00225     SET(b, c, d, a, 15, 22, T16);
00226 #undef SET
00227 
00228      /* Round 2. */
00229      /* Let [abcd k s i] denote the operation
00230           a = b + ((a + G(b,c,d) + X[k] + T[i]) <<< s). */
00231 #define G(x, y, z) (((x) & (z)) | ((y) & ~(z)))
00232 #define SET(a, b, c, d, k, s, Ti)\
00233   t = a + G(b,c,d) + X[k] + Ti;\
00234   a = ROTATE_LEFT(t, s) + b
00235      /* Do the following 16 operations. */
00236     SET(a, b, c, d,  1,  5, T17);
00237     SET(d, a, b, c,  6,  9, T18);
00238     SET(c, d, a, b, 11, 14, T19);
00239     SET(b, c, d, a,  0, 20, T20);
00240     SET(a, b, c, d,  5,  5, T21);
00241     SET(d, a, b, c, 10,  9, T22);
00242     SET(c, d, a, b, 15, 14, T23);
00243     SET(b, c, d, a,  4, 20, T24);
00244     SET(a, b, c, d,  9,  5, T25);
00245     SET(d, a, b, c, 14,  9, T26);
00246     SET(c, d, a, b,  3, 14, T27);
00247     SET(b, c, d, a,  8, 20, T28);
00248     SET(a, b, c, d, 13,  5, T29);
00249     SET(d, a, b, c,  2,  9, T30);
00250     SET(c, d, a, b,  7, 14, T31);
00251     SET(b, c, d, a, 12, 20, T32);
00252 #undef SET
00253 
00254      /* Round 3. */
00255      /* Let [abcd k s t] denote the operation
00256           a = b + ((a + H(b,c,d) + X[k] + T[i]) <<< s). */
00257 #define H(x, y, z) ((x) ^ (y) ^ (z))
00258 #define SET(a, b, c, d, k, s, Ti)\
00259   t = a + H(b,c,d) + X[k] + Ti;\
00260   a = ROTATE_LEFT(t, s) + b
00261      /* Do the following 16 operations. */
00262     SET(a, b, c, d,  5,  4, T33);
00263     SET(d, a, b, c,  8, 11, T34);
00264     SET(c, d, a, b, 11, 16, T35);
00265     SET(b, c, d, a, 14, 23, T36);
00266     SET(a, b, c, d,  1,  4, T37);
00267     SET(d, a, b, c,  4, 11, T38);
00268     SET(c, d, a, b,  7, 16, T39);
00269     SET(b, c, d, a, 10, 23, T40);
00270     SET(a, b, c, d, 13,  4, T41);
00271     SET(d, a, b, c,  0, 11, T42);
00272     SET(c, d, a, b,  3, 16, T43);
00273     SET(b, c, d, a,  6, 23, T44);
00274     SET(a, b, c, d,  9,  4, T45);
00275     SET(d, a, b, c, 12, 11, T46);
00276     SET(c, d, a, b, 15, 16, T47);
00277     SET(b, c, d, a,  2, 23, T48);
00278 #undef SET
00279 
00280      /* Round 4. */
00281      /* Let [abcd k s t] denote the operation
00282           a = b + ((a + I(b,c,d) + X[k] + T[i]) <<< s). */
00283 #define I(x, y, z) ((y) ^ ((x) | ~(z)))
00284 #define SET(a, b, c, d, k, s, Ti)\
00285   t = a + I(b,c,d) + X[k] + Ti;\
00286   a = ROTATE_LEFT(t, s) + b
00287      /* Do the following 16 operations. */
00288     SET(a, b, c, d,  0,  6, T49);
00289     SET(d, a, b, c,  7, 10, T50);
00290     SET(c, d, a, b, 14, 15, T51);
00291     SET(b, c, d, a,  5, 21, T52);
00292     SET(a, b, c, d, 12,  6, T53);
00293     SET(d, a, b, c,  3, 10, T54);
00294     SET(c, d, a, b, 10, 15, T55);
00295     SET(b, c, d, a,  1, 21, T56);
00296     SET(a, b, c, d,  8,  6, T57);
00297     SET(d, a, b, c, 15, 10, T58);
00298     SET(c, d, a, b,  6, 15, T59);
00299     SET(b, c, d, a, 13, 21, T60);
00300     SET(a, b, c, d,  4,  6, T61);
00301     SET(d, a, b, c, 11, 10, T62);
00302     SET(c, d, a, b,  2, 15, T63);
00303     SET(b, c, d, a,  9, 21, T64);
00304 #undef SET
00305 
00306      /* Then perform the following additions. (That is increment each
00307         of the four registers by the value it had before this block
00308         was started.) */
00309     pms->abcd[0] += a;
00310     pms->abcd[1] += b;
00311     pms->abcd[2] += c;
00312     pms->abcd[3] += d;
00313 }

Here is the call graph for this function:

Here is the caller graph for this function:

char* md5_str ( char *  p  ) 


Generated on Sun Mar 4 15:15:23 2007 for Scilab [trunk] by  doxygen 1.5.1