Wed Jan 8 2020 09:50:15

Asterisk developer's documentation


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"

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

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

Definition at line 34 of file md5.c.

Referenced by MD5Final(), and MD5Update().

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

Definition at line 170 of file md5.c.

Referenced by MD5Transform().

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

Definition at line 171 of file md5.c.

Referenced by MD5Transform().

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

Definition at line 172 of file md5.c.

Referenced by MD5Transform().

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

Definition at line 173 of file md5.c.

Referenced by MD5Transform().

#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 176 of file md5.c.

Referenced by MD5Transform().

Function Documentation

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

Definition at line 122 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(), prov_ver_calc(), register_verify(), try_firmware(), try_load_key(), and verify_key().

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

Definition at line 59 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(), prov_ver_calc(), register_verify(), try_firmware(), try_load_key(), and verify_key().

60 {
61  ctx->buf[0] = 0x67452301;
62  ctx->buf[1] = 0xefcdab89;
63  ctx->buf[2] = 0x98badcfe;
64  ctx->buf[3] = 0x10325476;
65 
66  ctx->bits[0] = 0;
67  ctx->bits[1] = 0;
68 }
uint32_t bits[2]
Definition: md5.h:28
uint32_t buf[4]
Definition: md5.h:27
void MD5Transform ( uint32_t  buf[4],
uint32_t const  in[16] 
)

Definition at line 184 of file md5.c.

References F1, F2, F3, F4, and MD5STEP.

Referenced by MD5Final(), and MD5Update().

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

Definition at line 74 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(), prov_ver_calc(), register_verify(), try_firmware(), try_load_key(), and verify_key().

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