Example program with HTTPServer and sensor data streaming over TCPSockets, using Donatien Garnier's Net APIs and services code on top of LWIP. Files StreamServer.h and .cpp encapsulate streaming over TCPSockets. Broadcast is done by sendToAll(), and all incoming data is echoed back to the client. Echo code can be replaced with some remote control of the streaming interface. See main() that shows how to periodically send some data to all subscribed clients. To subscribe, a client should open a socket at <mbed_ip> port 123. I used few lines in TCL code to set up a quick sink for the data. HTTP files are served on port 80 concurrently to the streaming.

Dependencies:   mbed

Committer:
iva2k
Date:
Sat Jun 12 06:01:50 2010 +0000
Revision:
0:e614f7875b60

        

Who changed what in which revision?

UserRevisionLine numberNew contents of line
iva2k 0:e614f7875b60 1 /*
iva2k 0:e614f7875b60 2 ***********************************************************************
iva2k 0:e614f7875b60 3 ** md5.c -- the source code for MD5 routines **
iva2k 0:e614f7875b60 4 ** RSA Data Security, Inc. MD5 Message-Digest Algorithm **
iva2k 0:e614f7875b60 5 ** Created: 2/17/90 RLR **
iva2k 0:e614f7875b60 6 ** Revised: 1/91 SRD,AJ,BSK,JT Reference C ver., 7/10 constant corr. **
iva2k 0:e614f7875b60 7 ***********************************************************************
iva2k 0:e614f7875b60 8 */
iva2k 0:e614f7875b60 9
iva2k 0:e614f7875b60 10 /*
iva2k 0:e614f7875b60 11 ***********************************************************************
iva2k 0:e614f7875b60 12 ** Copyright (C) 1990, RSA Data Security, Inc. All rights reserved. **
iva2k 0:e614f7875b60 13 ** **
iva2k 0:e614f7875b60 14 ** License to copy and use this software is granted provided that **
iva2k 0:e614f7875b60 15 ** it is identified as the "RSA Data Security, Inc. MD5 Message- **
iva2k 0:e614f7875b60 16 ** Digest Algorithm" in all material mentioning or referencing this **
iva2k 0:e614f7875b60 17 ** software or this function. **
iva2k 0:e614f7875b60 18 ** **
iva2k 0:e614f7875b60 19 ** License is also granted to make and use derivative works **
iva2k 0:e614f7875b60 20 ** provided that such works are identified as "derived from the RSA **
iva2k 0:e614f7875b60 21 ** Data Security, Inc. MD5 Message-Digest Algorithm" in all **
iva2k 0:e614f7875b60 22 ** material mentioning or referencing the derived work. **
iva2k 0:e614f7875b60 23 ** **
iva2k 0:e614f7875b60 24 ** RSA Data Security, Inc. makes no representations concerning **
iva2k 0:e614f7875b60 25 ** either the merchantability of this software or the suitability **
iva2k 0:e614f7875b60 26 ** of this software for any particular purpose. It is provided "as **
iva2k 0:e614f7875b60 27 ** is" without express or implied warranty of any kind. **
iva2k 0:e614f7875b60 28 ** **
iva2k 0:e614f7875b60 29 ** These notices must be retained in any copies of any part of this **
iva2k 0:e614f7875b60 30 ** documentation and/or software. **
iva2k 0:e614f7875b60 31 ***********************************************************************
iva2k 0:e614f7875b60 32 */
iva2k 0:e614f7875b60 33
iva2k 0:e614f7875b60 34 #include "lwip/opt.h"
iva2k 0:e614f7875b60 35
iva2k 0:e614f7875b60 36 #if PPP_SUPPORT /* don't build if not configured for use in lwipopts.h */
iva2k 0:e614f7875b60 37
iva2k 0:e614f7875b60 38 #if CHAP_SUPPORT || MD5_SUPPORT
iva2k 0:e614f7875b60 39
iva2k 0:e614f7875b60 40 #include "ppp.h"
iva2k 0:e614f7875b60 41 #include "pppdebug.h"
iva2k 0:e614f7875b60 42
iva2k 0:e614f7875b60 43 #include "md5.h"
iva2k 0:e614f7875b60 44
iva2k 0:e614f7875b60 45 #include <string.h>
iva2k 0:e614f7875b60 46
iva2k 0:e614f7875b60 47 /*
iva2k 0:e614f7875b60 48 ***********************************************************************
iva2k 0:e614f7875b60 49 ** Message-digest routines: **
iva2k 0:e614f7875b60 50 ** To form the message digest for a message M **
iva2k 0:e614f7875b60 51 ** (1) Initialize a context buffer mdContext using MD5Init **
iva2k 0:e614f7875b60 52 ** (2) Call MD5Update on mdContext and M **
iva2k 0:e614f7875b60 53 ** (3) Call MD5Final on mdContext **
iva2k 0:e614f7875b60 54 ** The message digest is now in mdContext->digest[0...15] **
iva2k 0:e614f7875b60 55 ***********************************************************************
iva2k 0:e614f7875b60 56 */
iva2k 0:e614f7875b60 57
iva2k 0:e614f7875b60 58 /* forward declaration */
iva2k 0:e614f7875b60 59 static void Transform (u32_t *buf, u32_t *in);
iva2k 0:e614f7875b60 60
iva2k 0:e614f7875b60 61 static unsigned char PADDING[64] = {
iva2k 0:e614f7875b60 62 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
iva2k 0:e614f7875b60 63 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
iva2k 0:e614f7875b60 64 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
iva2k 0:e614f7875b60 65 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
iva2k 0:e614f7875b60 66 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
iva2k 0:e614f7875b60 67 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
iva2k 0:e614f7875b60 68 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
iva2k 0:e614f7875b60 69 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
iva2k 0:e614f7875b60 70 };
iva2k 0:e614f7875b60 71
iva2k 0:e614f7875b60 72 /* F, G, H and I are basic MD5 functions */
iva2k 0:e614f7875b60 73 #define F(x, y, z) (((x) & (y)) | ((~x) & (z)))
iva2k 0:e614f7875b60 74 #define G(x, y, z) (((x) & (z)) | ((y) & (~z)))
iva2k 0:e614f7875b60 75 #define H(x, y, z) ((x) ^ (y) ^ (z))
iva2k 0:e614f7875b60 76 #define I(x, y, z) ((y) ^ ((x) | (~z)))
iva2k 0:e614f7875b60 77
iva2k 0:e614f7875b60 78 /* ROTATE_LEFT rotates x left n bits */
iva2k 0:e614f7875b60 79 #define ROTATE_LEFT(x, n) (((x) << (n)) | ((x) >> (32-(n))))
iva2k 0:e614f7875b60 80
iva2k 0:e614f7875b60 81 /* FF, GG, HH, and II transformations for rounds 1, 2, 3, and 4 */
iva2k 0:e614f7875b60 82 /* Rotation is separate from addition to prevent recomputation */
iva2k 0:e614f7875b60 83 #define FF(a, b, c, d, x, s, ac) \
iva2k 0:e614f7875b60 84 {(a) += F ((b), (c), (d)) + (x) + (u32_t)(ac); \
iva2k 0:e614f7875b60 85 (a) = ROTATE_LEFT ((a), (s)); \
iva2k 0:e614f7875b60 86 (a) += (b); \
iva2k 0:e614f7875b60 87 }
iva2k 0:e614f7875b60 88 #define GG(a, b, c, d, x, s, ac) \
iva2k 0:e614f7875b60 89 {(a) += G ((b), (c), (d)) + (x) + (u32_t)(ac); \
iva2k 0:e614f7875b60 90 (a) = ROTATE_LEFT ((a), (s)); \
iva2k 0:e614f7875b60 91 (a) += (b); \
iva2k 0:e614f7875b60 92 }
iva2k 0:e614f7875b60 93 #define HH(a, b, c, d, x, s, ac) \
iva2k 0:e614f7875b60 94 {(a) += H ((b), (c), (d)) + (x) + (u32_t)(ac); \
iva2k 0:e614f7875b60 95 (a) = ROTATE_LEFT ((a), (s)); \
iva2k 0:e614f7875b60 96 (a) += (b); \
iva2k 0:e614f7875b60 97 }
iva2k 0:e614f7875b60 98 #define II(a, b, c, d, x, s, ac) \
iva2k 0:e614f7875b60 99 {(a) += I ((b), (c), (d)) + (x) + (u32_t)(ac); \
iva2k 0:e614f7875b60 100 (a) = ROTATE_LEFT ((a), (s)); \
iva2k 0:e614f7875b60 101 (a) += (b); \
iva2k 0:e614f7875b60 102 }
iva2k 0:e614f7875b60 103
iva2k 0:e614f7875b60 104 #ifdef __STDC__
iva2k 0:e614f7875b60 105 #define UL(x) x##UL
iva2k 0:e614f7875b60 106 #else
iva2k 0:e614f7875b60 107 #ifdef WIN32
iva2k 0:e614f7875b60 108 #define UL(x) x##UL
iva2k 0:e614f7875b60 109 #else
iva2k 0:e614f7875b60 110 #define UL(x) x
iva2k 0:e614f7875b60 111 #endif
iva2k 0:e614f7875b60 112 #endif
iva2k 0:e614f7875b60 113
iva2k 0:e614f7875b60 114 /* The routine MD5Init initializes the message-digest context
iva2k 0:e614f7875b60 115 mdContext. All fields are set to zero.
iva2k 0:e614f7875b60 116 */
iva2k 0:e614f7875b60 117 void
iva2k 0:e614f7875b60 118 MD5Init (MD5_CTX *mdContext)
iva2k 0:e614f7875b60 119 {
iva2k 0:e614f7875b60 120 mdContext->i[0] = mdContext->i[1] = (u32_t)0;
iva2k 0:e614f7875b60 121
iva2k 0:e614f7875b60 122 /* Load magic initialization constants. */
iva2k 0:e614f7875b60 123 mdContext->buf[0] = (u32_t)0x67452301UL;
iva2k 0:e614f7875b60 124 mdContext->buf[1] = (u32_t)0xefcdab89UL;
iva2k 0:e614f7875b60 125 mdContext->buf[2] = (u32_t)0x98badcfeUL;
iva2k 0:e614f7875b60 126 mdContext->buf[3] = (u32_t)0x10325476UL;
iva2k 0:e614f7875b60 127 }
iva2k 0:e614f7875b60 128
iva2k 0:e614f7875b60 129 /* The routine MD5Update updates the message-digest context to
iva2k 0:e614f7875b60 130 account for the presence of each of the characters inBuf[0..inLen-1]
iva2k 0:e614f7875b60 131 in the message whose digest is being computed.
iva2k 0:e614f7875b60 132 */
iva2k 0:e614f7875b60 133 void
iva2k 0:e614f7875b60 134 MD5Update(MD5_CTX *mdContext, unsigned char *inBuf, unsigned int inLen)
iva2k 0:e614f7875b60 135 {
iva2k 0:e614f7875b60 136 u32_t in[16];
iva2k 0:e614f7875b60 137 int mdi;
iva2k 0:e614f7875b60 138 unsigned int i, ii;
iva2k 0:e614f7875b60 139
iva2k 0:e614f7875b60 140 #if 0
iva2k 0:e614f7875b60 141 PPPDEBUGLOG_INFO, ("MD5Update: %u:%.*H\n", inLen, MIN(inLen, 20) * 2, inBuf);
iva2k 0:e614f7875b60 142 PPPDEBUGLOG_INFO, ("MD5Update: %u:%s\n", inLen, inBuf);
iva2k 0:e614f7875b60 143 #endif
iva2k 0:e614f7875b60 144
iva2k 0:e614f7875b60 145 /* compute number of bytes mod 64 */
iva2k 0:e614f7875b60 146 mdi = (int)((mdContext->i[0] >> 3) & 0x3F);
iva2k 0:e614f7875b60 147
iva2k 0:e614f7875b60 148 /* update number of bits */
iva2k 0:e614f7875b60 149 if ((mdContext->i[0] + ((u32_t)inLen << 3)) < mdContext->i[0]) {
iva2k 0:e614f7875b60 150 mdContext->i[1]++;
iva2k 0:e614f7875b60 151 }
iva2k 0:e614f7875b60 152 mdContext->i[0] += ((u32_t)inLen << 3);
iva2k 0:e614f7875b60 153 mdContext->i[1] += ((u32_t)inLen >> 29);
iva2k 0:e614f7875b60 154
iva2k 0:e614f7875b60 155 while (inLen--) {
iva2k 0:e614f7875b60 156 /* add new character to buffer, increment mdi */
iva2k 0:e614f7875b60 157 mdContext->in[mdi++] = *inBuf++;
iva2k 0:e614f7875b60 158
iva2k 0:e614f7875b60 159 /* transform if necessary */
iva2k 0:e614f7875b60 160 if (mdi == 0x40) {
iva2k 0:e614f7875b60 161 for (i = 0, ii = 0; i < 16; i++, ii += 4) {
iva2k 0:e614f7875b60 162 in[i] = (((u32_t)mdContext->in[ii+3]) << 24) |
iva2k 0:e614f7875b60 163 (((u32_t)mdContext->in[ii+2]) << 16) |
iva2k 0:e614f7875b60 164 (((u32_t)mdContext->in[ii+1]) << 8) |
iva2k 0:e614f7875b60 165 ((u32_t)mdContext->in[ii]);
iva2k 0:e614f7875b60 166 }
iva2k 0:e614f7875b60 167 Transform (mdContext->buf, in);
iva2k 0:e614f7875b60 168 mdi = 0;
iva2k 0:e614f7875b60 169 }
iva2k 0:e614f7875b60 170 }
iva2k 0:e614f7875b60 171 }
iva2k 0:e614f7875b60 172
iva2k 0:e614f7875b60 173 /* The routine MD5Final terminates the message-digest computation and
iva2k 0:e614f7875b60 174 ends with the desired message digest in mdContext->digest[0...15].
iva2k 0:e614f7875b60 175 */
iva2k 0:e614f7875b60 176 void
iva2k 0:e614f7875b60 177 MD5Final (unsigned char hash[], MD5_CTX *mdContext)
iva2k 0:e614f7875b60 178 {
iva2k 0:e614f7875b60 179 u32_t in[16];
iva2k 0:e614f7875b60 180 int mdi;
iva2k 0:e614f7875b60 181 unsigned int i, ii;
iva2k 0:e614f7875b60 182 unsigned int padLen;
iva2k 0:e614f7875b60 183
iva2k 0:e614f7875b60 184 /* save number of bits */
iva2k 0:e614f7875b60 185 in[14] = mdContext->i[0];
iva2k 0:e614f7875b60 186 in[15] = mdContext->i[1];
iva2k 0:e614f7875b60 187
iva2k 0:e614f7875b60 188 /* compute number of bytes mod 64 */
iva2k 0:e614f7875b60 189 mdi = (int)((mdContext->i[0] >> 3) & 0x3F);
iva2k 0:e614f7875b60 190
iva2k 0:e614f7875b60 191 /* pad out to 56 mod 64 */
iva2k 0:e614f7875b60 192 padLen = (mdi < 56) ? (56 - mdi) : (120 - mdi);
iva2k 0:e614f7875b60 193 MD5Update (mdContext, PADDING, padLen);
iva2k 0:e614f7875b60 194
iva2k 0:e614f7875b60 195 /* append length in bits and transform */
iva2k 0:e614f7875b60 196 for (i = 0, ii = 0; i < 14; i++, ii += 4) {
iva2k 0:e614f7875b60 197 in[i] = (((u32_t)mdContext->in[ii+3]) << 24) |
iva2k 0:e614f7875b60 198 (((u32_t)mdContext->in[ii+2]) << 16) |
iva2k 0:e614f7875b60 199 (((u32_t)mdContext->in[ii+1]) << 8) |
iva2k 0:e614f7875b60 200 ((u32_t)mdContext->in[ii]);
iva2k 0:e614f7875b60 201 }
iva2k 0:e614f7875b60 202 Transform (mdContext->buf, in);
iva2k 0:e614f7875b60 203
iva2k 0:e614f7875b60 204 /* store buffer in digest */
iva2k 0:e614f7875b60 205 for (i = 0, ii = 0; i < 4; i++, ii += 4) {
iva2k 0:e614f7875b60 206 mdContext->digest[ii] = (unsigned char)(mdContext->buf[i] & 0xFF);
iva2k 0:e614f7875b60 207 mdContext->digest[ii+1] =
iva2k 0:e614f7875b60 208 (unsigned char)((mdContext->buf[i] >> 8) & 0xFF);
iva2k 0:e614f7875b60 209 mdContext->digest[ii+2] =
iva2k 0:e614f7875b60 210 (unsigned char)((mdContext->buf[i] >> 16) & 0xFF);
iva2k 0:e614f7875b60 211 mdContext->digest[ii+3] =
iva2k 0:e614f7875b60 212 (unsigned char)((mdContext->buf[i] >> 24) & 0xFF);
iva2k 0:e614f7875b60 213 }
iva2k 0:e614f7875b60 214 SMEMCPY(hash, mdContext->digest, 16);
iva2k 0:e614f7875b60 215 }
iva2k 0:e614f7875b60 216
iva2k 0:e614f7875b60 217 /* Basic MD5 step. Transforms buf based on in.
iva2k 0:e614f7875b60 218 */
iva2k 0:e614f7875b60 219 static void
iva2k 0:e614f7875b60 220 Transform (u32_t *buf, u32_t *in)
iva2k 0:e614f7875b60 221 {
iva2k 0:e614f7875b60 222 u32_t a = buf[0], b = buf[1], c = buf[2], d = buf[3];
iva2k 0:e614f7875b60 223
iva2k 0:e614f7875b60 224 /* Round 1 */
iva2k 0:e614f7875b60 225 #define S11 7
iva2k 0:e614f7875b60 226 #define S12 12
iva2k 0:e614f7875b60 227 #define S13 17
iva2k 0:e614f7875b60 228 #define S14 22
iva2k 0:e614f7875b60 229 FF ( a, b, c, d, in[ 0], S11, UL(3614090360)); /* 1 */
iva2k 0:e614f7875b60 230 FF ( d, a, b, c, in[ 1], S12, UL(3905402710)); /* 2 */
iva2k 0:e614f7875b60 231 FF ( c, d, a, b, in[ 2], S13, UL( 606105819)); /* 3 */
iva2k 0:e614f7875b60 232 FF ( b, c, d, a, in[ 3], S14, UL(3250441966)); /* 4 */
iva2k 0:e614f7875b60 233 FF ( a, b, c, d, in[ 4], S11, UL(4118548399)); /* 5 */
iva2k 0:e614f7875b60 234 FF ( d, a, b, c, in[ 5], S12, UL(1200080426)); /* 6 */
iva2k 0:e614f7875b60 235 FF ( c, d, a, b, in[ 6], S13, UL(2821735955)); /* 7 */
iva2k 0:e614f7875b60 236 FF ( b, c, d, a, in[ 7], S14, UL(4249261313)); /* 8 */
iva2k 0:e614f7875b60 237 FF ( a, b, c, d, in[ 8], S11, UL(1770035416)); /* 9 */
iva2k 0:e614f7875b60 238 FF ( d, a, b, c, in[ 9], S12, UL(2336552879)); /* 10 */
iva2k 0:e614f7875b60 239 FF ( c, d, a, b, in[10], S13, UL(4294925233)); /* 11 */
iva2k 0:e614f7875b60 240 FF ( b, c, d, a, in[11], S14, UL(2304563134)); /* 12 */
iva2k 0:e614f7875b60 241 FF ( a, b, c, d, in[12], S11, UL(1804603682)); /* 13 */
iva2k 0:e614f7875b60 242 FF ( d, a, b, c, in[13], S12, UL(4254626195)); /* 14 */
iva2k 0:e614f7875b60 243 FF ( c, d, a, b, in[14], S13, UL(2792965006)); /* 15 */
iva2k 0:e614f7875b60 244 FF ( b, c, d, a, in[15], S14, UL(1236535329)); /* 16 */
iva2k 0:e614f7875b60 245
iva2k 0:e614f7875b60 246 /* Round 2 */
iva2k 0:e614f7875b60 247 #define S21 5
iva2k 0:e614f7875b60 248 #define S22 9
iva2k 0:e614f7875b60 249 #define S23 14
iva2k 0:e614f7875b60 250 #define S24 20
iva2k 0:e614f7875b60 251 GG ( a, b, c, d, in[ 1], S21, UL(4129170786)); /* 17 */
iva2k 0:e614f7875b60 252 GG ( d, a, b, c, in[ 6], S22, UL(3225465664)); /* 18 */
iva2k 0:e614f7875b60 253 GG ( c, d, a, b, in[11], S23, UL( 643717713)); /* 19 */
iva2k 0:e614f7875b60 254 GG ( b, c, d, a, in[ 0], S24, UL(3921069994)); /* 20 */
iva2k 0:e614f7875b60 255 GG ( a, b, c, d, in[ 5], S21, UL(3593408605)); /* 21 */
iva2k 0:e614f7875b60 256 GG ( d, a, b, c, in[10], S22, UL( 38016083)); /* 22 */
iva2k 0:e614f7875b60 257 GG ( c, d, a, b, in[15], S23, UL(3634488961)); /* 23 */
iva2k 0:e614f7875b60 258 GG ( b, c, d, a, in[ 4], S24, UL(3889429448)); /* 24 */
iva2k 0:e614f7875b60 259 GG ( a, b, c, d, in[ 9], S21, UL( 568446438)); /* 25 */
iva2k 0:e614f7875b60 260 GG ( d, a, b, c, in[14], S22, UL(3275163606)); /* 26 */
iva2k 0:e614f7875b60 261 GG ( c, d, a, b, in[ 3], S23, UL(4107603335)); /* 27 */
iva2k 0:e614f7875b60 262 GG ( b, c, d, a, in[ 8], S24, UL(1163531501)); /* 28 */
iva2k 0:e614f7875b60 263 GG ( a, b, c, d, in[13], S21, UL(2850285829)); /* 29 */
iva2k 0:e614f7875b60 264 GG ( d, a, b, c, in[ 2], S22, UL(4243563512)); /* 30 */
iva2k 0:e614f7875b60 265 GG ( c, d, a, b, in[ 7], S23, UL(1735328473)); /* 31 */
iva2k 0:e614f7875b60 266 GG ( b, c, d, a, in[12], S24, UL(2368359562)); /* 32 */
iva2k 0:e614f7875b60 267
iva2k 0:e614f7875b60 268 /* Round 3 */
iva2k 0:e614f7875b60 269 #define S31 4
iva2k 0:e614f7875b60 270 #define S32 11
iva2k 0:e614f7875b60 271 #define S33 16
iva2k 0:e614f7875b60 272 #define S34 23
iva2k 0:e614f7875b60 273 HH ( a, b, c, d, in[ 5], S31, UL(4294588738)); /* 33 */
iva2k 0:e614f7875b60 274 HH ( d, a, b, c, in[ 8], S32, UL(2272392833)); /* 34 */
iva2k 0:e614f7875b60 275 HH ( c, d, a, b, in[11], S33, UL(1839030562)); /* 35 */
iva2k 0:e614f7875b60 276 HH ( b, c, d, a, in[14], S34, UL(4259657740)); /* 36 */
iva2k 0:e614f7875b60 277 HH ( a, b, c, d, in[ 1], S31, UL(2763975236)); /* 37 */
iva2k 0:e614f7875b60 278 HH ( d, a, b, c, in[ 4], S32, UL(1272893353)); /* 38 */
iva2k 0:e614f7875b60 279 HH ( c, d, a, b, in[ 7], S33, UL(4139469664)); /* 39 */
iva2k 0:e614f7875b60 280 HH ( b, c, d, a, in[10], S34, UL(3200236656)); /* 40 */
iva2k 0:e614f7875b60 281 HH ( a, b, c, d, in[13], S31, UL( 681279174)); /* 41 */
iva2k 0:e614f7875b60 282 HH ( d, a, b, c, in[ 0], S32, UL(3936430074)); /* 42 */
iva2k 0:e614f7875b60 283 HH ( c, d, a, b, in[ 3], S33, UL(3572445317)); /* 43 */
iva2k 0:e614f7875b60 284 HH ( b, c, d, a, in[ 6], S34, UL( 76029189)); /* 44 */
iva2k 0:e614f7875b60 285 HH ( a, b, c, d, in[ 9], S31, UL(3654602809)); /* 45 */
iva2k 0:e614f7875b60 286 HH ( d, a, b, c, in[12], S32, UL(3873151461)); /* 46 */
iva2k 0:e614f7875b60 287 HH ( c, d, a, b, in[15], S33, UL( 530742520)); /* 47 */
iva2k 0:e614f7875b60 288 HH ( b, c, d, a, in[ 2], S34, UL(3299628645)); /* 48 */
iva2k 0:e614f7875b60 289
iva2k 0:e614f7875b60 290 /* Round 4 */
iva2k 0:e614f7875b60 291 #define S41 6
iva2k 0:e614f7875b60 292 #define S42 10
iva2k 0:e614f7875b60 293 #define S43 15
iva2k 0:e614f7875b60 294 #define S44 21
iva2k 0:e614f7875b60 295 II ( a, b, c, d, in[ 0], S41, UL(4096336452)); /* 49 */
iva2k 0:e614f7875b60 296 II ( d, a, b, c, in[ 7], S42, UL(1126891415)); /* 50 */
iva2k 0:e614f7875b60 297 II ( c, d, a, b, in[14], S43, UL(2878612391)); /* 51 */
iva2k 0:e614f7875b60 298 II ( b, c, d, a, in[ 5], S44, UL(4237533241)); /* 52 */
iva2k 0:e614f7875b60 299 II ( a, b, c, d, in[12], S41, UL(1700485571)); /* 53 */
iva2k 0:e614f7875b60 300 II ( d, a, b, c, in[ 3], S42, UL(2399980690)); /* 54 */
iva2k 0:e614f7875b60 301 II ( c, d, a, b, in[10], S43, UL(4293915773)); /* 55 */
iva2k 0:e614f7875b60 302 II ( b, c, d, a, in[ 1], S44, UL(2240044497)); /* 56 */
iva2k 0:e614f7875b60 303 II ( a, b, c, d, in[ 8], S41, UL(1873313359)); /* 57 */
iva2k 0:e614f7875b60 304 II ( d, a, b, c, in[15], S42, UL(4264355552)); /* 58 */
iva2k 0:e614f7875b60 305 II ( c, d, a, b, in[ 6], S43, UL(2734768916)); /* 59 */
iva2k 0:e614f7875b60 306 II ( b, c, d, a, in[13], S44, UL(1309151649)); /* 60 */
iva2k 0:e614f7875b60 307 II ( a, b, c, d, in[ 4], S41, UL(4149444226)); /* 61 */
iva2k 0:e614f7875b60 308 II ( d, a, b, c, in[11], S42, UL(3174756917)); /* 62 */
iva2k 0:e614f7875b60 309 II ( c, d, a, b, in[ 2], S43, UL( 718787259)); /* 63 */
iva2k 0:e614f7875b60 310 II ( b, c, d, a, in[ 9], S44, UL(3951481745)); /* 64 */
iva2k 0:e614f7875b60 311
iva2k 0:e614f7875b60 312 buf[0] += a;
iva2k 0:e614f7875b60 313 buf[1] += b;
iva2k 0:e614f7875b60 314 buf[2] += c;
iva2k 0:e614f7875b60 315 buf[3] += d;
iva2k 0:e614f7875b60 316 }
iva2k 0:e614f7875b60 317
iva2k 0:e614f7875b60 318 #endif /* CHAP_SUPPORT || MD5_SUPPORT */
iva2k 0:e614f7875b60 319
iva2k 0:e614f7875b60 320 #endif /* PPP_SUPPORT */