Asterisk - The Open Source Telephony Project  18.5.0
Macros | Functions
md5.c File Reference

MD5 checksum routines used for authentication. Not covered by GPL, but in the public domain as per the copyright below. More...

#include "asterisk.h"
#include "asterisk/endian.h"
#include "asterisk/md5.h"
Include dependency graph for md5.c:

Go to the source code of this file.

Macros

#define byteReverse(buf, len)   /* Nothing */
 
#define F1(x, y, z)   (z ^ (x & (y ^ z)))
 
#define F2(x, y, z)   F1(z, x, y)
 
#define F3(x, y, z)   (x ^ y ^ z)
 
#define F4(x, y, z)   (y ^ (x | ~z))
 
#define MD5STEP(f, w, x, y, z, data, s)   ( w += f(x, y, z) + data, w = w<<s | w>>(32-s), w += x )
 

Functions

void MD5Final (unsigned char digest[16], struct MD5Context *ctx)
 
void MD5Init (struct MD5Context *ctx)
 
void MD5Transform (uint32_t buf[4], uint32_t const in[16])
 
void MD5Update (struct MD5Context *ctx, unsigned char const *buf, unsigned len)
 

Detailed Description

MD5 checksum routines used for authentication. Not covered by GPL, but in the public domain as per the copyright below.

Definition in file md5.c.

Macro Definition Documentation

◆ byteReverse

#define byteReverse (   buf,
  len 
)    /* Nothing */

Definition at line 32 of file md5.c.

Referenced by MD5Final(), and MD5Update().

◆ F1

#define F1 (   x,
  y,
 
)    (z ^ (x & (y ^ z)))

Definition at line 168 of file md5.c.

Referenced by MD5Transform().

◆ F2

#define F2 (   x,
  y,
 
)    F1(z, x, y)

Definition at line 169 of file md5.c.

Referenced by MD5Transform().

◆ F3

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

Definition at line 170 of file md5.c.

Referenced by MD5Transform().

◆ F4

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

Definition at line 171 of file md5.c.

Referenced by MD5Transform().

◆ MD5STEP

#define MD5STEP (   f,
  w,
  x,
  y,
  z,
  data,
 
)    ( w += f(x, y, z) + data, w = w<<s | w>>(32-s), w += x )

Definition at line 174 of file md5.c.

Referenced by MD5Transform().

Function Documentation

◆ MD5Final()

void MD5Final ( unsigned char  digest[16],
struct MD5Context ctx 
)

Definition at line 120 of file md5.c.

References MD5Context::bits, MD5Context::buf, byteReverse, MD5Context::in, and MD5Transform().

Referenced by ast_md5_hash(), authenticate(), authenticate_verify(), decrypt_frame(), festival_exec(), iax2_key_rotate(), manager_login(), prov_ver_calc(), register_verify(), try_firmware(), try_load_key(), and verify_key().

121 {
122  unsigned count;
123  unsigned char *p;
124  uint32_t *in_buf;
125 
126  /* Compute number of bytes mod 64 */
127  count = (ctx->bits[0] >> 3) & 0x3F;
128 
129  /* Set the first char of padding to 0x80. This is safe since there is
130  always at least one byte free */
131  p = ctx->in + count;
132  *p++ = 0x80;
133 
134  /* Bytes of padding needed to make 64 bytes */
135  count = 64 - 1 - count;
136 
137  /* Pad out to 56 mod 64 */
138  if (count < 8) {
139  /* Two lots of padding: Pad the first block to 64 bytes */
140  memset(p, 0, count);
141  byteReverse(ctx->in, 16);
142  MD5Transform(ctx->buf, (uint32_t *) ctx->in);
143 
144  /* Now fill the next block with 56 bytes */
145  memset(ctx->in, 0, 56);
146  } else {
147  /* Pad block to 56 bytes */
148  memset(p, 0, count - 8);
149  }
150  byteReverse(ctx->in, 14);
151 
152  /* Append length in bits and transform */
153  in_buf = (uint32_t *) ctx->in;
154  in_buf[14] = ctx->bits[0];
155  in_buf[15] = ctx->bits[1];
156 
157  MD5Transform(ctx->buf, (uint32_t *) ctx->in);
158  byteReverse((unsigned char *) ctx->buf, 4);
159  memcpy(digest, ctx->buf, 16);
160  memset(ctx, 0, sizeof(*ctx)); /* In case it's sensitive */
161 }
#define byteReverse(buf, len)
Definition: md5.c:32
uint32_t bits[2]
Definition: md5.h:28
unsigned char in[64]
Definition: md5.h:30
void MD5Transform(uint32_t buf[4], uint32_t const in[16])
Definition: md5.c:182
uint32_t buf[4]
Definition: md5.h:27

◆ MD5Init()

void MD5Init ( struct MD5Context ctx)

Definition at line 57 of file md5.c.

References MD5Context::bits, and MD5Context::buf.

Referenced by ast_md5_hash(), authenticate(), authenticate_verify(), decrypt_frame(), festival_exec(), iax2_key_rotate(), manager_login(), prov_ver_calc(), register_verify(), try_firmware(), try_load_key(), and verify_key().

58 {
59  ctx->buf[0] = 0x67452301;
60  ctx->buf[1] = 0xefcdab89;
61  ctx->buf[2] = 0x98badcfe;
62  ctx->buf[3] = 0x10325476;
63 
64  ctx->bits[0] = 0;
65  ctx->bits[1] = 0;
66 }
uint32_t bits[2]
Definition: md5.h:28
uint32_t buf[4]
Definition: md5.h:27

◆ MD5Transform()

void MD5Transform ( uint32_t  buf[4],
uint32_t const  in[16] 
)

Definition at line 182 of file md5.c.

References a, b, c, d, F1, F2, F3, F4, and MD5STEP.

Referenced by MD5Final(), and MD5Update().

183 {
184  register uint32_t a, b, c, d;
185 
186  a = buf[0];
187  b = buf[1];
188  c = buf[2];
189  d = buf[3];
190 
191  MD5STEP(F1, a, b, c, d, in[0] + 0xd76aa478, 7);
192  MD5STEP(F1, d, a, b, c, in[1] + 0xe8c7b756, 12);
193  MD5STEP(F1, c, d, a, b, in[2] + 0x242070db, 17);
194  MD5STEP(F1, b, c, d, a, in[3] + 0xc1bdceee, 22);
195  MD5STEP(F1, a, b, c, d, in[4] + 0xf57c0faf, 7);
196  MD5STEP(F1, d, a, b, c, in[5] + 0x4787c62a, 12);
197  MD5STEP(F1, c, d, a, b, in[6] + 0xa8304613, 17);
198  MD5STEP(F1, b, c, d, a, in[7] + 0xfd469501, 22);
199  MD5STEP(F1, a, b, c, d, in[8] + 0x698098d8, 7);
200  MD5STEP(F1, d, a, b, c, in[9] + 0x8b44f7af, 12);
201  MD5STEP(F1, c, d, a, b, in[10] + 0xffff5bb1, 17);
202  MD5STEP(F1, b, c, d, a, in[11] + 0x895cd7be, 22);
203  MD5STEP(F1, a, b, c, d, in[12] + 0x6b901122, 7);
204  MD5STEP(F1, d, a, b, c, in[13] + 0xfd987193, 12);
205  MD5STEP(F1, c, d, a, b, in[14] + 0xa679438e, 17);
206  MD5STEP(F1, b, c, d, a, in[15] + 0x49b40821, 22);
207 
208  MD5STEP(F2, a, b, c, d, in[1] + 0xf61e2562, 5);
209  MD5STEP(F2, d, a, b, c, in[6] + 0xc040b340, 9);
210  MD5STEP(F2, c, d, a, b, in[11] + 0x265e5a51, 14);
211  MD5STEP(F2, b, c, d, a, in[0] + 0xe9b6c7aa, 20);
212  MD5STEP(F2, a, b, c, d, in[5] + 0xd62f105d, 5);
213  MD5STEP(F2, d, a, b, c, in[10] + 0x02441453, 9);
214  MD5STEP(F2, c, d, a, b, in[15] + 0xd8a1e681, 14);
215  MD5STEP(F2, b, c, d, a, in[4] + 0xe7d3fbc8, 20);
216  MD5STEP(F2, a, b, c, d, in[9] + 0x21e1cde6, 5);
217  MD5STEP(F2, d, a, b, c, in[14] + 0xc33707d6, 9);
218  MD5STEP(F2, c, d, a, b, in[3] + 0xf4d50d87, 14);
219  MD5STEP(F2, b, c, d, a, in[8] + 0x455a14ed, 20);
220  MD5STEP(F2, a, b, c, d, in[13] + 0xa9e3e905, 5);
221  MD5STEP(F2, d, a, b, c, in[2] + 0xfcefa3f8, 9);
222  MD5STEP(F2, c, d, a, b, in[7] + 0x676f02d9, 14);
223  MD5STEP(F2, b, c, d, a, in[12] + 0x8d2a4c8a, 20);
224 
225  MD5STEP(F3, a, b, c, d, in[5] + 0xfffa3942, 4);
226  MD5STEP(F3, d, a, b, c, in[8] + 0x8771f681, 11);
227  MD5STEP(F3, c, d, a, b, in[11] + 0x6d9d6122, 16);
228  MD5STEP(F3, b, c, d, a, in[14] + 0xfde5380c, 23);
229  MD5STEP(F3, a, b, c, d, in[1] + 0xa4beea44, 4);
230  MD5STEP(F3, d, a, b, c, in[4] + 0x4bdecfa9, 11);
231  MD5STEP(F3, c, d, a, b, in[7] + 0xf6bb4b60, 16);
232  MD5STEP(F3, b, c, d, a, in[10] + 0xbebfbc70, 23);
233  MD5STEP(F3, a, b, c, d, in[13] + 0x289b7ec6, 4);
234  MD5STEP(F3, d, a, b, c, in[0] + 0xeaa127fa, 11);
235  MD5STEP(F3, c, d, a, b, in[3] + 0xd4ef3085, 16);
236  MD5STEP(F3, b, c, d, a, in[6] + 0x04881d05, 23);
237  MD5STEP(F3, a, b, c, d, in[9] + 0xd9d4d039, 4);
238  MD5STEP(F3, d, a, b, c, in[12] + 0xe6db99e5, 11);
239  MD5STEP(F3, c, d, a, b, in[15] + 0x1fa27cf8, 16);
240  MD5STEP(F3, b, c, d, a, in[2] + 0xc4ac5665, 23);
241 
242  MD5STEP(F4, a, b, c, d, in[0] + 0xf4292244, 6);
243  MD5STEP(F4, d, a, b, c, in[7] + 0x432aff97, 10);
244  MD5STEP(F4, c, d, a, b, in[14] + 0xab9423a7, 15);
245  MD5STEP(F4, b, c, d, a, in[5] + 0xfc93a039, 21);
246  MD5STEP(F4, a, b, c, d, in[12] + 0x655b59c3, 6);
247  MD5STEP(F4, d, a, b, c, in[3] + 0x8f0ccc92, 10);
248  MD5STEP(F4, c, d, a, b, in[10] + 0xffeff47d, 15);
249  MD5STEP(F4, b, c, d, a, in[1] + 0x85845dd1, 21);
250  MD5STEP(F4, a, b, c, d, in[8] + 0x6fa87e4f, 6);
251  MD5STEP(F4, d, a, b, c, in[15] + 0xfe2ce6e0, 10);
252  MD5STEP(F4, c, d, a, b, in[6] + 0xa3014314, 15);
253  MD5STEP(F4, b, c, d, a, in[13] + 0x4e0811a1, 21);
254  MD5STEP(F4, a, b, c, d, in[4] + 0xf7537e82, 6);
255  MD5STEP(F4, d, a, b, c, in[11] + 0xbd3af235, 10);
256  MD5STEP(F4, c, d, a, b, in[2] + 0x2ad7d2bb, 15);
257  MD5STEP(F4, b, c, d, a, in[9] + 0xeb86d391, 21);
258 
259  buf[0] += a;
260  buf[1] += b;
261  buf[2] += c;
262  buf[3] += d;
263 }
#define F2(x, y, z)
Definition: md5.c:169
#define F1(x, y, z)
Definition: md5.c:168
char buf[BUFSIZE]
Definition: eagi_proxy.c:66
static struct test_val d
static struct test_val c
#define MD5STEP(f, w, x, y, z, data, s)
Definition: md5.c:174
#define F3(x, y, z)
Definition: md5.c:170
FILE * in
Definition: utils/frame.c:33
#define F4(x, y, z)
Definition: md5.c:171
static struct test_val b
static struct test_val a

◆ MD5Update()

void MD5Update ( struct MD5Context ctx,
unsigned char const *  buf,
unsigned  len 
)

Definition at line 72 of file md5.c.

References MD5Context::bits, MD5Context::buf, byteReverse, if(), MD5Context::in, and MD5Transform().

Referenced by ast_md5_hash(), authenticate(), authenticate_verify(), decrypt_frame(), festival_exec(), iax2_key_rotate(), manager_login(), prov_ver_calc(), register_verify(), try_firmware(), try_load_key(), and verify_key().

73 {
74  uint32_t t;
75 
76  /* Update bitcount */
77 
78  t = ctx->bits[0];
79  if ((ctx->bits[0] = t + ((uint32_t) len << 3)) < t)
80  ctx->bits[1]++; /* Carry from low to high */
81  ctx->bits[1] += len >> 29;
82 
83  t = (t >> 3) & 0x3f; /* Bytes already in shsInfo->data */
84 
85  /* Handle any leading odd-sized chunks */
86 
87  if (t) {
88  unsigned char *p = (unsigned char *) ctx->in + t;
89 
90  t = 64 - t;
91  if (len < t) {
92  memcpy(p, buf, len);
93  return;
94  }
95  memcpy(p, buf, t);
96  byteReverse(ctx->in, 16);
97  MD5Transform(ctx->buf, (uint32_t *) ctx->in);
98  buf += t;
99  len -= t;
100  }
101  /* Process data in 64-byte chunks */
102 
103  while (len >= 64) {
104  memcpy(ctx->in, buf, 64);
105  byteReverse(ctx->in, 16);
106  MD5Transform(ctx->buf, (uint32_t *) ctx->in);
107  buf += 64;
108  len -= 64;
109  }
110 
111  /* Handle any remaining bytes of data. */
112 
113  memcpy(ctx->in, buf, len);
114 }
#define byteReverse(buf, len)
Definition: md5.c:32
uint32_t bits[2]
Definition: md5.h:28
char buf[BUFSIZE]
Definition: eagi_proxy.c:66
if(!yyg->yy_init)
Definition: ast_expr2f.c:868
unsigned char in[64]
Definition: md5.h:30
void MD5Transform(uint32_t buf[4], uint32_t const in[16])
Definition: md5.c:182
static int len(struct ast_channel *chan, const char *cmd, char *data, char *buf, size_t buflen)
uint32_t buf[4]
Definition: md5.h:27