Leaked source code of windows server 2003
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

465 lines
12 KiB

  1. //
  2. // Copyright (c) 1998-1999, Microsoft Corporation, all rights reserved
  3. //
  4. // md5.c
  5. //
  6. // IEEE1394 ARP module
  7. //
  8. //
  9. // 08/08/2000 ADube created.
  10. //
  11. // Purpose: Create a unique MAC address from 1394 EUID
  12. //
  13. //This file should use the same algorithm as nic1394 uses.
  14. //
  15. // Derived from derived from the RSA Data Security,
  16. // Inc. MD5 Message-Digest Algorithm
  17. //
  18. #include <precomp.h>
  19. #pragma hdrstop
  20. /*
  21. been defined with C compiler flags.
  22. */
  23. #ifndef PROTOTYPES
  24. #define PROTOTYPES 1
  25. #endif
  26. /* POINTER defines a generic pointer type */
  27. typedef unsigned char *POINTER;
  28. /* UINT2 defines a two byte word */
  29. typedef unsigned short int UINT2;
  30. /* UINT4 defines a four byte word */
  31. typedef unsigned long int UINT4;
  32. /* PROTO_LIST is defined depending on how PROTOTYPES is defined above.
  33. If using PROTOTYPES, then PROTO_LIST returns the list, otherwise it
  34. returns an empty list.
  35. */
  36. #if PROTOTYPES
  37. #define PROTO_LIST(list) list
  38. #else
  39. #define PROTO_LIST(list) ()
  40. #endif
  41. /* MD5 context. */
  42. typedef struct _MD5_CTX{
  43. UINT4 state[4]; /* state (ABCD) */
  44. UINT4 count[2]; /* number of bits, modulo 2^64 (lsb first) */
  45. unsigned char buffer[64]; /* input buffer */
  46. } MD5_CTX, MD_CTX;
  47. typedef ENetAddr MAC_ADDRESS, *PMAC_ADDRESS;
  48. void MD5Init PROTO_LIST ((MD5_CTX *));
  49. void MD5Update PROTO_LIST
  50. ((MD5_CTX *, unsigned char *, unsigned int));
  51. void MD5Final PROTO_LIST ((unsigned char [16], MD5_CTX *));
  52. // Constants for MD5Transform routine.
  53. #define S11 7
  54. #define S12 12
  55. #define S13 17
  56. #define S14 22
  57. #define S21 5
  58. #define S22 9
  59. #define S23 14
  60. #define S24 20
  61. #define S31 4
  62. #define S32 11
  63. #define S33 16
  64. #define S34 23
  65. #define S41 6
  66. #define S42 10
  67. #define S43 15
  68. #define S44 21
  69. static void MD5Transform PROTO_LIST ((UINT4 [4], unsigned char [64]));
  70. static void Encode PROTO_LIST
  71. ((unsigned char *, UINT4 *, unsigned int));
  72. static void Decode PROTO_LIST
  73. ((UINT4 *, unsigned char *, unsigned int));
  74. static void MD5_memcpy PROTO_LIST ((POINTER, POINTER, unsigned int));
  75. static void MD5_memset PROTO_LIST ((POINTER, int, unsigned int));
  76. static unsigned char PADDING[64] = {
  77. 0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  78. 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
  79. 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
  80. };
  81. // F, G, H and I are basic MD5 functions.
  82. #define F(x, y, z) (((x) & (y)) | ((~x) & (z)))
  83. #define G(x, y, z) (((x) & (z)) | ((y) & (~z)))
  84. #define H(x, y, z) ((x) ^ (y) ^ (z))
  85. #define I(x, y, z) ((y) ^ ((x) | (~z)))
  86. // ROTATE_LEFT rotates x left n bits.
  87. #define ROTATE_LEFT(x, n) (((x) << (n)) | ((x) >> (32-(n))))
  88. // FF, GG, HH, and II transformations for rounds 1, 2, 3, and 4.
  89. // Rotation is separate from addition to prevent recomputation.
  90. #define FF(a, b, c, d, x, s, ac) { \
  91. (a) += F ((b), (c), (d)) + (x) + (UINT4)(ac); \
  92. (a) = ROTATE_LEFT ((a), (s)); \
  93. (a) += (b); \
  94. }
  95. #define GG(a, b, c, d, x, s, ac) { \
  96. (a) += G ((b), (c), (d)) + (x) + (UINT4)(ac); \
  97. (a) = ROTATE_LEFT ((a), (s)); \
  98. (a) += (b); \
  99. }
  100. #define HH(a, b, c, d, x, s, ac) { \
  101. (a) += H ((b), (c), (d)) + (x) + (UINT4)(ac); \
  102. (a) = ROTATE_LEFT ((a), (s)); \
  103. (a) += (b); \
  104. }
  105. #define II(a, b, c, d, x, s, ac) { \
  106. (a) += I ((b), (c), (d)) + (x) + (UINT4)(ac); \
  107. (a) = ROTATE_LEFT ((a), (s)); \
  108. (a) += (b); \
  109. }
  110. // MD5 initialization. Begins an MD5 operation, writing a new context.
  111. void
  112. MD5Init (
  113. MD5_CTX *context// context
  114. )
  115. {
  116. context->count[0] = context->count[1] = 0;
  117. // Load magic initialization constants.
  118. context->state[0] = 0x67452301;
  119. context->state[1] = 0xefcdab89;
  120. context->state[2] = 0x98badcfe;
  121. context->state[3] = 0x10325476;
  122. }
  123. // MD5 block update operation. Continues an MD5 message-digest
  124. // operation, processing another message block, and updating the
  125. // context.
  126. void
  127. MD5Update (
  128. MD5_CTX *context, // context
  129. unsigned char *input, // input block
  130. unsigned int inputLen // length of input block
  131. )
  132. {
  133. unsigned int i, index, partLen;
  134. // Compute number of bytes mod 64
  135. index = (unsigned int)((context->count[0] >> 3) & 0x3F);
  136. // Update number of bits
  137. if ((context->count[0] += ((UINT4)inputLen << 3))
  138. < ((UINT4)inputLen << 3))
  139. {
  140. context->count[1]++;
  141. }
  142. context->count[1] += ((UINT4)inputLen >> 29);
  143. partLen = 64 - index;
  144. // Transform as many times as possible.
  145. if (inputLen >= partLen)
  146. {
  147. MD5_memcpy ((POINTER)&context->buffer[index],
  148. (POINTER)input,
  149. partLen);
  150. MD5Transform (context->state, context->buffer);
  151. for (i = partLen; i + 63 < inputLen; i += 64)
  152. {
  153. MD5Transform (context->state, &input[i]);
  154. }
  155. index = 0;
  156. }
  157. else
  158. {
  159. i = 0;
  160. }
  161. // Buffer remaining input
  162. MD5_memcpy
  163. ((POINTER)&context->buffer[index], (POINTER)&input[i],
  164. inputLen-i);
  165. }
  166. // MD5 finalization. Ends an MD5 message-digest operation, writing the
  167. // the message digest and zeroizing the context.
  168. void
  169. MD5Final (
  170. unsigned char digest[16], // message digest
  171. MD5_CTX *context
  172. ) // context
  173. {
  174. unsigned char bits[8];
  175. unsigned int index, padLen;
  176. // Save number of bits
  177. Encode (bits, context->count, 8);
  178. // Pad out to 56 mod 64.
  179. index = (unsigned int)((context->count[0] >> 3) & 0x3f);
  180. padLen = (index < 56) ? (56 - index) : (120 - index);
  181. MD5Update (context, PADDING, padLen);
  182. // Append length (before padding)
  183. MD5Update (context, bits, 8);
  184. // Store state in digest
  185. Encode (digest, context->state, 6);
  186. // Zeroize sensitive information.
  187. MD5_memset ((POINTER)context, 0, sizeof (*context));
  188. }
  189. // MD5 basic transformation. Transforms state based on block.
  190. static
  191. void
  192. MD5Transform (
  193. UINT4 state[4],
  194. unsigned char block[64]
  195. )
  196. {
  197. UINT4 a = state[0], b = state[1], c = state[2], d = state[3], x[16];
  198. Decode (x, block, 64);
  199. // Round 1
  200. FF (a, b, c, d, x[ 0], S11, 0xd76aa478); // 1
  201. FF (d, a, b, c, x[ 1], S12, 0xe8c7b756); // 2
  202. FF (c, d, a, b, x[ 2], S13, 0x242070db); // 3
  203. FF (b, c, d, a, x[ 3], S14, 0xc1bdceee); // 4
  204. FF (a, b, c, d, x[ 4], S11, 0xf57c0faf); // 5
  205. FF (d, a, b, c, x[ 5], S12, 0x4787c62a); // 6
  206. FF (c, d, a, b, x[ 6], S13, 0xa8304613); // 7
  207. FF (b, c, d, a, x[ 7], S14, 0xfd469501); // 8
  208. FF (a, b, c, d, x[ 8], S11, 0x698098d8); // 9
  209. FF (d, a, b, c, x[ 9], S12, 0x8b44f7af); // 10
  210. FF (c, d, a, b, x[10], S13, 0xffff5bb1); // 11
  211. FF (b, c, d, a, x[11], S14, 0x895cd7be); // 12
  212. FF (a, b, c, d, x[12], S11, 0x6b901122); // 13
  213. FF (d, a, b, c, x[13], S12, 0xfd987193); // 14
  214. FF (c, d, a, b, x[14], S13, 0xa679438e); // 15
  215. FF (b, c, d, a, x[15], S14, 0x49b40821); // 16
  216. // Round 2
  217. GG (a, b, c, d, x[ 1], S21, 0xf61e2562); // 17
  218. GG (d, a, b, c, x[ 6], S22, 0xc040b340); // 18
  219. GG (c, d, a, b, x[11], S23, 0x265e5a51); // 19
  220. GG (b, c, d, a, x[ 0], S24, 0xe9b6c7aa); // 20
  221. GG (a, b, c, d, x[ 5], S21, 0xd62f105d); // 21
  222. GG (d, a, b, c, x[10], S22, 0x2441453); // 22
  223. GG (c, d, a, b, x[15], S23, 0xd8a1e681); // 23
  224. GG (b, c, d, a, x[ 4], S24, 0xe7d3fbc8); // 24
  225. GG (a, b, c, d, x[ 9], S21, 0x21e1cde6); // 25
  226. GG (d, a, b, c, x[14], S22, 0xc33707d6); // 26
  227. GG (c, d, a, b, x[ 3], S23, 0xf4d50d87); // 27
  228. GG (b, c, d, a, x[ 8], S24, 0x455a14ed); // 28
  229. GG (a, b, c, d, x[13], S21, 0xa9e3e905); // 29
  230. GG (d, a, b, c, x[ 2], S22, 0xfcefa3f8); // 30
  231. GG (c, d, a, b, x[ 7], S23, 0x676f02d9); // 31
  232. GG (b, c, d, a, x[12], S24, 0x8d2a4c8a); // 32
  233. // Round 3
  234. HH (a, b, c, d, x[ 5], S31, 0xfffa3942); // 33
  235. HH (d, a, b, c, x[ 8], S32, 0x8771f681); // 34
  236. HH (c, d, a, b, x[11], S33, 0x6d9d6122); // 35
  237. HH (b, c, d, a, x[14], S34, 0xfde5380c); // 36
  238. HH (a, b, c, d, x[ 1], S31, 0xa4beea44); // 37
  239. HH (d, a, b, c, x[ 4], S32, 0x4bdecfa9); // 38
  240. HH (c, d, a, b, x[ 7], S33, 0xf6bb4b60); // 39
  241. HH (b, c, d, a, x[10], S34, 0xbebfbc70); // 40
  242. HH (a, b, c, d, x[13], S31, 0x289b7ec6); // 41
  243. HH (d, a, b, c, x[ 0], S32, 0xeaa127fa); // 42
  244. HH (c, d, a, b, x[ 3], S33, 0xd4ef3085); // 43
  245. HH (b, c, d, a, x[ 6], S34, 0x4881d05); // 44
  246. HH (a, b, c, d, x[ 9], S31, 0xd9d4d039); // 45
  247. HH (d, a, b, c, x[12], S32, 0xe6db99e5); // 46
  248. HH (c, d, a, b, x[15], S33, 0x1fa27cf8); // 47
  249. HH (b, c, d, a, x[ 2], S34, 0xc4ac5665); // 48
  250. // Round 4
  251. II (a, b, c, d, x[ 0], S41, 0xf4292244); // 49
  252. II (d, a, b, c, x[ 7], S42, 0x432aff97); // 50
  253. II (c, d, a, b, x[14], S43, 0xab9423a7); // 51
  254. II (b, c, d, a, x[ 5], S44, 0xfc93a039); // 52
  255. II (a, b, c, d, x[12], S41, 0x655b59c3); // 53
  256. II (d, a, b, c, x[ 3], S42, 0x8f0ccc92); // 54
  257. II (c, d, a, b, x[10], S43, 0xffeff47d); // 55
  258. II (b, c, d, a, x[ 1], S44, 0x85845dd1); // 56
  259. II (a, b, c, d, x[ 8], S41, 0x6fa87e4f); // 57
  260. II (d, a, b, c, x[15], S42, 0xfe2ce6e0); // 58
  261. II (c, d, a, b, x[ 6], S43, 0xa3014314); // 59
  262. II (b, c, d, a, x[13], S44, 0x4e0811a1); // 60
  263. II (a, b, c, d, x[ 4], S41, 0xf7537e82); // 61
  264. II (d, a, b, c, x[11], S42, 0xbd3af235); // 62
  265. II (c, d, a, b, x[ 2], S43, 0x2ad7d2bb); // 63
  266. II (b, c, d, a, x[ 9], S44, 0xeb86d391); // 64
  267. state[0] += a;
  268. state[1] += b;
  269. state[2] += c;
  270. state[3] += d;
  271. // Zeroize sensitive information.
  272. MD5_memset ((POINTER)x, 0, sizeof (x));
  273. }
  274. // Encodes input (UINT4) into output (unsigned char). Assumes len is
  275. // a multiple of 4.
  276. static
  277. void
  278. Encode (
  279. unsigned char *output,
  280. UINT4 *input,
  281. unsigned int len
  282. )
  283. {
  284. unsigned int i, j;
  285. for (i = 0, j = 0; j < len; i++, j += 4)
  286. {
  287. output[j] = (unsigned char)(input[i] & 0xff);
  288. output[j+1] = (unsigned char)((input[i] >> 8) & 0xff);
  289. output[j+2] = (unsigned char)((input[i] >> 16) & 0xff);
  290. output[j+3] = (unsigned char)((input[i] >> 24) & 0xff);
  291. }
  292. }
  293. // Decodes input (unsigned char) into output (UINT4). Assumes len is
  294. // a multiple of 4.
  295. static
  296. void
  297. Decode (
  298. UINT4 *output,
  299. unsigned char *input,
  300. unsigned int len
  301. )
  302. {
  303. unsigned int i, j;
  304. for (i = 0, j = 0; j < len; i++, j += 4)
  305. {
  306. output[i] = ((UINT4)input[j]) | (((UINT4)input[j+1]) << 8) |
  307. (((UINT4)input[j+2]) << 16) | (((UINT4)input[j+3]) << 24);
  308. }
  309. }
  310. // Note: Replace "for loop" with standard memcpy if possible.
  311. static
  312. void
  313. MD5_memcpy (
  314. POINTER output,
  315. POINTER input,
  316. unsigned int len
  317. )
  318. {
  319. unsigned int i;
  320. for (i = 0; i < len; i++)
  321. {
  322. output[i] = input[i];
  323. }
  324. }
  325. // Note: Replace "for loop" with standard memset if possible.
  326. static
  327. void
  328. MD5_memset (
  329. POINTER output,
  330. int value,
  331. unsigned int len
  332. )
  333. {
  334. unsigned int i;
  335. for (i = 0; i < len; i++)
  336. {
  337. ((char *)output)[i] = (char)value;
  338. }
  339. }
  340. #define ETH_IS_MULTICAST(Address) \
  341. (BOOLEAN)(((PUCHAR)(Address))[0] & ((UCHAR)0x01))
  342. VOID
  343. nicGetMacAddressFromEuid (
  344. UINT64 *pEuid,
  345. MAC_ADDRESS *pMacAddr
  346. )
  347. /*
  348. Taken directly from nic1394 and is intended to produce the same output as nic1394.
  349. This is used to create display Correct HW addr in the arp -a output.
  350. We take the Unique ID and run it through the MD5 algorithm because this is what
  351. nic1394 would have done to get the MAC address that it reports to us
  352. I have the name as nicGet.. to imply that this should be the same alogorithm as nic1394's md5
  353. algorithm
  354. */
  355. {
  356. MD_CTX context;
  357. unsigned char digest[6];
  358. unsigned int len = 8;
  359. MD5Init (&context);
  360. MD5Update (&context, (unsigned char*)pEuid, len);
  361. MD5Final (digest, &context);
  362. NdisMoveMemory (pMacAddr, digest, 6);
  363. // Set the locally administered bit
  364. // and clear the multicast bit.
  365. //
  366. // randomize the returned Mac Address
  367. // by xor ing the address with a random
  368. // 0xf22f617c91e0 (a random number)
  369. //
  370. //pMacAddr->addr[0] ^= 0x00;
  371. pMacAddr->addr[0] |= 0x2;
  372. pMacAddr->addr[0] &= 0xf2;
  373. pMacAddr->addr[1] ^= 0x2f;
  374. pMacAddr->addr[2] ^= 0x61;
  375. pMacAddr->addr[3] ^= 0x7c;
  376. pMacAddr->addr[4] ^= 0x91;
  377. pMacAddr->addr[5] ^= 0x30;
  378. }