Asterisk - The Open Source Telephony Project GIT-master-7e7a603
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.

◆ F1

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

Definition at line 168 of file md5.c.

◆ F2

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

Definition at line 169 of file md5.c.

◆ F3

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

Definition at line 170 of file md5.c.

◆ F4

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

Definition at line 171 of file md5.c.

◆ 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.

Function Documentation

◆ MD5Final()

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

Definition at line 120 of file md5.c.

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}
void MD5Transform(uint32_t buf[4], uint32_t const in[16])
Definition: md5.c:182
#define byteReverse(buf, len)
Definition: md5.c:32
uint32_t buf[4]
Definition: md5.h:27
unsigned char in[64]
Definition: md5.h:30
uint32_t bits[2]
Definition: md5.h:28

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(), and verify_key().

◆ MD5Init()

void MD5Init ( struct MD5Context ctx)

Definition at line 57 of file md5.c.

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}

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(), and verify_key().

◆ MD5Transform()

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

Definition at line 182 of file md5.c.

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}
char buf[BUFSIZE]
Definition: eagi_proxy.c:66
#define MD5STEP(f, w, x, y, z, data, s)
Definition: md5.c:174
#define F1(x, y, z)
Definition: md5.c:168
#define F4(x, y, z)
Definition: md5.c:171
#define F3(x, y, z)
Definition: md5.c:170
#define F2(x, y, z)
Definition: md5.c:169
static struct test_val b
static struct test_val a
static struct test_val d
static struct test_val c
FILE * in
Definition: utils/frame.c:33

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

Referenced by MD5Final(), and MD5Update().

◆ MD5Update()

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

Definition at line 72 of file md5.c.

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}
if(!yyg->yy_init)
Definition: ast_expr2f.c:854
static int len(struct ast_channel *chan, const char *cmd, char *data, char *buf, size_t buflen)

References MD5Context::bits, MD5Context::buf, buf, byteReverse, if(), MD5Context::in, len(), 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(), and verify_key().