00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034 #include "lwip/opt.h"
00035
00036 #if PPP_SUPPORT
00037
00038 #if CHAP_SUPPORT || MD5_SUPPORT
00039
00040 #include "ppp.h"
00041 #include "pppdebug.h"
00042
00043 #include "md5.h"
00044
00045 #include <string.h>
00046
00047
00048
00049
00050
00051
00052
00053
00054
00055
00056
00057
00058
00059 static void Transform (u32_t *buf, u32_t *in);
00060
00061 static unsigned char PADDING[64] = {
00062 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
00063 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
00064 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
00065 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
00066 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
00067 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
00068 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
00069 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
00070 };
00071
00072
00073 #define F(x, y, z) (((x) & (y)) | ((~x) & (z)))
00074 #define G(x, y, z) (((x) & (z)) | ((y) & (~z)))
00075 #define H(x, y, z) ((x) ^ (y) ^ (z))
00076 #define I(x, y, z) ((y) ^ ((x) | (~z)))
00077
00078
00079 #define ROTATE_LEFT(x, n) (((x) << (n)) | ((x) >> (32-(n))))
00080
00081
00082
00083 #define FF(a, b, c, d, x, s, ac) \
00084 {(a) += F ((b), (c), (d)) + (x) + (u32_t)(ac); \
00085 (a) = ROTATE_LEFT ((a), (s)); \
00086 (a) += (b); \
00087 }
00088 #define GG(a, b, c, d, x, s, ac) \
00089 {(a) += G ((b), (c), (d)) + (x) + (u32_t)(ac); \
00090 (a) = ROTATE_LEFT ((a), (s)); \
00091 (a) += (b); \
00092 }
00093 #define HH(a, b, c, d, x, s, ac) \
00094 {(a) += H ((b), (c), (d)) + (x) + (u32_t)(ac); \
00095 (a) = ROTATE_LEFT ((a), (s)); \
00096 (a) += (b); \
00097 }
00098 #define II(a, b, c, d, x, s, ac) \
00099 {(a) += I ((b), (c), (d)) + (x) + (u32_t)(ac); \
00100 (a) = ROTATE_LEFT ((a), (s)); \
00101 (a) += (b); \
00102 }
00103
00104 #ifdef __STDC__
00105 #define UL(x) x##UL
00106 #else
00107 #ifdef WIN32
00108 #define UL(x) x##UL
00109 #else
00110 #define UL(x) x
00111 #endif
00112 #endif
00113
00114
00115
00116
00117 void
00118 MD5Init (MD5_CTX *mdContext)
00119 {
00120 mdContext->i[0] = mdContext->i[1] = (u32_t)0;
00121
00122
00123 mdContext->buf[0] = (u32_t)0x67452301UL;
00124 mdContext->buf[1] = (u32_t)0xefcdab89UL;
00125 mdContext->buf[2] = (u32_t)0x98badcfeUL;
00126 mdContext->buf[3] = (u32_t)0x10325476UL;
00127 }
00128
00129
00130
00131
00132
00133 void
00134 MD5Update(MD5_CTX *mdContext, unsigned char *inBuf, unsigned int inLen)
00135 {
00136 u32_t in[16];
00137 int mdi;
00138 unsigned int i, ii;
00139
00140 #if 0
00141 ppp_trace(LOG_INFO, "MD5Update: %u:%.*H\n", inLen, MIN(inLen, 20) * 2, inBuf);
00142 ppp_trace(LOG_INFO, "MD5Update: %u:%s\n", inLen, inBuf);
00143 #endif
00144
00145
00146 mdi = (int)((mdContext->i[0] >> 3) & 0x3F);
00147
00148
00149 if ((mdContext->i[0] + ((u32_t)inLen << 3)) < mdContext->i[0]) {
00150 mdContext->i[1]++;
00151 }
00152 mdContext->i[0] += ((u32_t)inLen << 3);
00153 mdContext->i[1] += ((u32_t)inLen >> 29);
00154
00155 while (inLen--) {
00156
00157 mdContext->in[mdi++] = *inBuf++;
00158
00159
00160 if (mdi == 0x40) {
00161 for (i = 0, ii = 0; i < 16; i++, ii += 4) {
00162 in[i] = (((u32_t)mdContext->in[ii+3]) << 24) |
00163 (((u32_t)mdContext->in[ii+2]) << 16) |
00164 (((u32_t)mdContext->in[ii+1]) << 8) |
00165 ((u32_t)mdContext->in[ii]);
00166 }
00167 Transform (mdContext->buf, in);
00168 mdi = 0;
00169 }
00170 }
00171 }
00172
00173
00174
00175
00176 void
00177 MD5Final (unsigned char hash[], MD5_CTX *mdContext)
00178 {
00179 u32_t in[16];
00180 int mdi;
00181 unsigned int i, ii;
00182 unsigned int padLen;
00183
00184
00185 in[14] = mdContext->i[0];
00186 in[15] = mdContext->i[1];
00187
00188
00189 mdi = (int)((mdContext->i[0] >> 3) & 0x3F);
00190
00191
00192 padLen = (mdi < 56) ? (56 - mdi) : (120 - mdi);
00193 MD5Update (mdContext, PADDING, padLen);
00194
00195
00196 for (i = 0, ii = 0; i < 14; i++, ii += 4) {
00197 in[i] = (((u32_t)mdContext->in[ii+3]) << 24) |
00198 (((u32_t)mdContext->in[ii+2]) << 16) |
00199 (((u32_t)mdContext->in[ii+1]) << 8) |
00200 ((u32_t)mdContext->in[ii]);
00201 }
00202 Transform (mdContext->buf, in);
00203
00204
00205 for (i = 0, ii = 0; i < 4; i++, ii += 4) {
00206 mdContext->digest[ii] = (unsigned char)(mdContext->buf[i] & 0xFF);
00207 mdContext->digest[ii+1] =
00208 (unsigned char)((mdContext->buf[i] >> 8) & 0xFF);
00209 mdContext->digest[ii+2] =
00210 (unsigned char)((mdContext->buf[i] >> 16) & 0xFF);
00211 mdContext->digest[ii+3] =
00212 (unsigned char)((mdContext->buf[i] >> 24) & 0xFF);
00213 }
00214 SMEMCPY(hash, mdContext->digest, 16);
00215 }
00216
00217
00218
00219 static void
00220 Transform (u32_t *buf, u32_t *in)
00221 {
00222 u32_t a = buf[0], b = buf[1], c = buf[2], d = buf[3];
00223
00224
00225 #define S11 7
00226 #define S12 12
00227 #define S13 17
00228 #define S14 22
00229 FF ( a, b, c, d, in[ 0], S11, UL(3614090360));
00230 FF ( d, a, b, c, in[ 1], S12, UL(3905402710));
00231 FF ( c, d, a, b, in[ 2], S13, UL( 606105819));
00232 FF ( b, c, d, a, in[ 3], S14, UL(3250441966));
00233 FF ( a, b, c, d, in[ 4], S11, UL(4118548399));
00234 FF ( d, a, b, c, in[ 5], S12, UL(1200080426));
00235 FF ( c, d, a, b, in[ 6], S13, UL(2821735955));
00236 FF ( b, c, d, a, in[ 7], S14, UL(4249261313));
00237 FF ( a, b, c, d, in[ 8], S11, UL(1770035416));
00238 FF ( d, a, b, c, in[ 9], S12, UL(2336552879));
00239 FF ( c, d, a, b, in[10], S13, UL(4294925233));
00240 FF ( b, c, d, a, in[11], S14, UL(2304563134));
00241 FF ( a, b, c, d, in[12], S11, UL(1804603682));
00242 FF ( d, a, b, c, in[13], S12, UL(4254626195));
00243 FF ( c, d, a, b, in[14], S13, UL(2792965006));
00244 FF ( b, c, d, a, in[15], S14, UL(1236535329));
00245
00246
00247 #define S21 5
00248 #define S22 9
00249 #define S23 14
00250 #define S24 20
00251 GG ( a, b, c, d, in[ 1], S21, UL(4129170786));
00252 GG ( d, a, b, c, in[ 6], S22, UL(3225465664));
00253 GG ( c, d, a, b, in[11], S23, UL( 643717713));
00254 GG ( b, c, d, a, in[ 0], S24, UL(3921069994));
00255 GG ( a, b, c, d, in[ 5], S21, UL(3593408605));
00256 GG ( d, a, b, c, in[10], S22, UL( 38016083));
00257 GG ( c, d, a, b, in[15], S23, UL(3634488961));
00258 GG ( b, c, d, a, in[ 4], S24, UL(3889429448));
00259 GG ( a, b, c, d, in[ 9], S21, UL( 568446438));
00260 GG ( d, a, b, c, in[14], S22, UL(3275163606));
00261 GG ( c, d, a, b, in[ 3], S23, UL(4107603335));
00262 GG ( b, c, d, a, in[ 8], S24, UL(1163531501));
00263 GG ( a, b, c, d, in[13], S21, UL(2850285829));
00264 GG ( d, a, b, c, in[ 2], S22, UL(4243563512));
00265 GG ( c, d, a, b, in[ 7], S23, UL(1735328473));
00266 GG ( b, c, d, a, in[12], S24, UL(2368359562));
00267
00268
00269 #define S31 4
00270 #define S32 11
00271 #define S33 16
00272 #define S34 23
00273 HH ( a, b, c, d, in[ 5], S31, UL(4294588738));
00274 HH ( d, a, b, c, in[ 8], S32, UL(2272392833));
00275 HH ( c, d, a, b, in[11], S33, UL(1839030562));
00276 HH ( b, c, d, a, in[14], S34, UL(4259657740));
00277 HH ( a, b, c, d, in[ 1], S31, UL(2763975236));
00278 HH ( d, a, b, c, in[ 4], S32, UL(1272893353));
00279 HH ( c, d, a, b, in[ 7], S33, UL(4139469664));
00280 HH ( b, c, d, a, in[10], S34, UL(3200236656));
00281 HH ( a, b, c, d, in[13], S31, UL( 681279174));
00282 HH ( d, a, b, c, in[ 0], S32, UL(3936430074));
00283 HH ( c, d, a, b, in[ 3], S33, UL(3572445317));
00284 HH ( b, c, d, a, in[ 6], S34, UL( 76029189));
00285 HH ( a, b, c, d, in[ 9], S31, UL(3654602809));
00286 HH ( d, a, b, c, in[12], S32, UL(3873151461));
00287 HH ( c, d, a, b, in[15], S33, UL( 530742520));
00288 HH ( b, c, d, a, in[ 2], S34, UL(3299628645));
00289
00290
00291 #define S41 6
00292 #define S42 10
00293 #define S43 15
00294 #define S44 21
00295 II ( a, b, c, d, in[ 0], S41, UL(4096336452));
00296 II ( d, a, b, c, in[ 7], S42, UL(1126891415));
00297 II ( c, d, a, b, in[14], S43, UL(2878612391));
00298 II ( b, c, d, a, in[ 5], S44, UL(4237533241));
00299 II ( a, b, c, d, in[12], S41, UL(1700485571));
00300 II ( d, a, b, c, in[ 3], S42, UL(2399980690));
00301 II ( c, d, a, b, in[10], S43, UL(4293915773));
00302 II ( b, c, d, a, in[ 1], S44, UL(2240044497));
00303 II ( a, b, c, d, in[ 8], S41, UL(1873313359));
00304 II ( d, a, b, c, in[15], S42, UL(4264355552));
00305 II ( c, d, a, b, in[ 6], S43, UL(2734768916));
00306 II ( b, c, d, a, in[13], S44, UL(1309151649));
00307 II ( a, b, c, d, in[ 4], S41, UL(4149444226));
00308 II ( d, a, b, c, in[11], S42, UL(3174756917));
00309 II ( c, d, a, b, in[ 2], S43, UL( 718787259));
00310 II ( b, c, d, a, in[ 9], S44, UL(3951481745));
00311
00312 buf[0] += a;
00313 buf[1] += b;
00314 buf[2] += c;
00315 buf[3] += d;
00316 }
00317
00318 #endif
00319
00320 #endif