Advertisement
Guest User

md5_vfy

a guest
Jun 9th, 2015
300
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 7.82 KB | None | 0 0
  1. #pragma once
  2. #pragma warning(disable: 4996 4819)
  3.  
  4. //
  5. // MD5 routines (straight from Wikipedia's MD5 pseudocode description)
  6. //
  7.  
  8. //////////////////////////////////////////////////////////////////////////////
  9. /////////////       Ron Rivest's MD5 C Implementation       //////////////////
  10. //////////////////////////////////////////////////////////////////////////////
  11.  
  12. /*
  13.  **********************************************************************
  14.  ** Copyright (C) 1990, RSA Data Security, Inc. All rights reserved. **
  15.  **                                                                  **
  16.  ** License to copy and use this software is granted provided that   **
  17.  ** it is identified as the "RSA Data Security, Inc. MD5 Message     **
  18.  ** Digest Algorithm" in all material mentioning or referencing this **
  19.  ** software or this function.                                       **
  20.  **                                                                  **
  21.  ** License is also granted to make and use derivative works         **
  22.  ** provided that such works are identified as "derived from the RSA **
  23.  ** Data Security, Inc. MD5 Message Digest Algorithm" in all         **
  24.  ** material mentioning or referencing the derived work.             **
  25.  **                                                                  **
  26.  ** RSA Data Security, Inc. makes no representations concerning      **
  27.  ** either the merchantability of this software or the suitability   **
  28.  ** of this software for any particular purpose.  It is provided "as **
  29.  ** is" without express or implied warranty of any kind.             **
  30.  **                                                                  **
  31.  ** These notices must be retained in any copies of any part of this **
  32.  ** documentation and/or software.                                   **
  33.  **********************************************************************
  34.  */
  35.  
  36. #define uint unsigned int
  37.  
  38. /* F, G and H are basic MD5 functions: selection, majority, parity */
  39. #define F(x, y, z) (((x) & (y)) | ((~x) & (z)))
  40. #define G(x, y, z) (((x) & (z)) | ((y) & (~z)))
  41. #define H(x, y, z) ((x) ^ (y) ^ (z))
  42. #define I(x, y, z) ((y) ^ ((x) | (~z)))
  43.  
  44. /* ROTATE_LEFT rotates x left n bits */
  45. #define ROTATE_LEFT(x, n) (((x) << (n)) | ((x) >> (32-(n))))
  46.  
  47. /* FF, GG, HH, and II transformations for rounds 1, 2, 3, and 4 */
  48. /* Rotation is separate from addition to prevent recomputation */
  49. #define FF(a, b, c, d, x, s, ac) \
  50.   {(a) += F ((b), (c), (d)) + (x) + (uint)(ac); \
  51.    (a) = ROTATE_LEFT ((a), (s)); \
  52.    (a) += (b); \
  53.   }
  54. #define GG(a, b, c, d, x, s, ac) \
  55.   {(a) += G ((b), (c), (d)) + (x) + (uint)(ac); \
  56.    (a) = ROTATE_LEFT ((a), (s)); \
  57.    (a) += (b); \
  58.   }
  59. #define HH(a, b, c, d, x, s, ac) \
  60.   {(a) += H ((b), (c), (d)) + (x) + (uint)(ac); \
  61.    (a) = ROTATE_LEFT ((a), (s)); \
  62.    (a) += (b); \
  63.   }
  64. #define II(a, b, c, d, x, s, ac) \
  65.   {(a) += I ((b), (c), (d)) + (x) + (uint)(ac); \
  66.    (a) = ROTATE_LEFT ((a), (s)); \
  67.    (a) += (b); \
  68.   }
  69.  
  70.  
  71. /* __device__ void md5_vfy(unsigned char* data, uint length, uint *a1, uint *b1, uint *c1, uint *d1) */
  72. __device__ void md5_vfy(unsigned char* data, uint length, unsigned char* out)
  73. {
  74.  
  75.     const uint a0 = 0x67452301;
  76.     const uint b0 = 0xEFCDAB89;
  77.     const uint c0 = 0x98BADCFE;
  78.     const uint d0 = 0x10325476;
  79.  
  80.     uint a = 0;
  81.     uint b = 0;
  82.     uint c = 0;
  83.     uint d = 0;
  84.  
  85.     uint vals[14] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0};
  86.  
  87.     int i = 0;
  88.  
  89.     for(i=0; i < length; i++)
  90.     {
  91.         vals[i / 4] |= data[i] << ((i % 4) * 8);
  92.     }
  93.     vals[i / 4] |= 0x80 << ((i % 4) * 8);
  94.  
  95.     uint bitlen = length * 8;
  96.  
  97. #define in0  (vals[0])//x
  98. #define in1  (vals[1])//y
  99. #define in2  (vals[2])//z
  100. #define in3  (vals[3])
  101. #define in4  (vals[4])
  102. #define in5  (vals[5])
  103. #define in6  (vals[6])
  104. #define in7  (vals[7])
  105. #define in8  (vals[8])
  106. #define in9  (vals[9])
  107. #define in10 (vals[10])
  108. #define in11 (vals[11])
  109. #define in12 (vals[12])
  110. #define in13 (vals[13])
  111. #define in14 (bitlen) //w = bit length
  112. #define in15 (0)
  113.  
  114.     //Initialize hash value for this chunk:
  115.     a = a0;
  116.     b = b0;
  117.     c = c0;
  118.     d = d0;
  119.  
  120.  
  121.   /* Round 1 */
  122. #define S11 7
  123. #define S12 12
  124. #define S13 17
  125. #define S14 22
  126.   FF ( a, b, c, d, in0,  S11, 3614090360); /* 1 */
  127.   FF ( d, a, b, c, in1,  S12, 3905402710); /* 2 */
  128.   FF ( c, d, a, b, in2,  S13,  606105819); /* 3 */
  129.   FF ( b, c, d, a, in3,  S14, 3250441966); /* 4 */
  130.   FF ( a, b, c, d, in4,  S11, 4118548399); /* 5 */
  131.   FF ( d, a, b, c, in5,  S12, 1200080426); /* 6 */
  132.   FF ( c, d, a, b, in6,  S13, 2821735955); /* 7 */
  133.   FF ( b, c, d, a, in7,  S14, 4249261313); /* 8 */
  134.   FF ( a, b, c, d, in8,  S11, 1770035416); /* 9 */
  135.   FF ( d, a, b, c, in9,  S12, 2336552879); /* 10 */
  136.   FF ( c, d, a, b, in10, S13, 4294925233); /* 11 */
  137.   FF ( b, c, d, a, in11, S14, 2304563134); /* 12 */
  138.   FF ( a, b, c, d, in12, S11, 1804603682); /* 13 */
  139.   FF ( d, a, b, c, in13, S12, 4254626195); /* 14 */
  140.   FF ( c, d, a, b, in14, S13, 2792965006); /* 15 */
  141.   FF ( b, c, d, a, in15, S14, 1236535329); /* 16 */
  142.  
  143.   /* Round 2 */
  144. #define S21 5
  145. #define S22 9
  146. #define S23 14
  147. #define S24 20
  148.   GG ( a, b, c, d, in1, S21, 4129170786); /* 17 */
  149.   GG ( d, a, b, c, in6, S22, 3225465664); /* 18 */
  150.   GG ( c, d, a, b, in11, S23,  643717713); /* 19 */
  151.   GG ( b, c, d, a, in0, S24, 3921069994); /* 20 */
  152.   GG ( a, b, c, d, in5, S21, 3593408605); /* 21 */
  153.   GG ( d, a, b, c, in10, S22,   38016083); /* 22 */
  154.   GG ( c, d, a, b, in15, S23, 3634488961); /* 23 */
  155.   GG ( b, c, d, a, in4, S24, 3889429448); /* 24 */
  156.   GG ( a, b, c, d, in9, S21,  568446438); /* 25 */
  157.   GG ( d, a, b, c, in14, S22, 3275163606); /* 26 */
  158.   GG ( c, d, a, b, in3, S23, 4107603335); /* 27 */
  159.   GG ( b, c, d, a, in8, S24, 1163531501); /* 28 */
  160.   GG ( a, b, c, d, in13, S21, 2850285829); /* 29 */
  161.   GG ( d, a, b, c, in2, S22, 4243563512); /* 30 */
  162.   GG ( c, d, a, b, in7, S23, 1735328473); /* 31 */
  163.   GG ( b, c, d, a, in12, S24, 2368359562); /* 32 */
  164.  
  165.   /* Round 3 */
  166. #define S31 4
  167. #define S32 11
  168. #define S33 16
  169. #define S34 23
  170.   HH ( a, b, c, d, in5, S31, 4294588738); /* 33 */
  171.   HH ( d, a, b, c, in8, S32, 2272392833); /* 34 */
  172.   HH ( c, d, a, b, in11, S33, 1839030562); /* 35 */
  173.   HH ( b, c, d, a, in14, S34, 4259657740); /* 36 */
  174.   HH ( a, b, c, d, in1, S31, 2763975236); /* 37 */
  175.   HH ( d, a, b, c, in4, S32, 1272893353); /* 38 */
  176.   HH ( c, d, a, b, in7, S33, 4139469664); /* 39 */
  177.   HH ( b, c, d, a, in10, S34, 3200236656); /* 40 */
  178.   HH ( a, b, c, d, in13, S31,  681279174); /* 41 */
  179.   HH ( d, a, b, c, in0, S32, 3936430074); /* 42 */
  180.   HH ( c, d, a, b, in3, S33, 3572445317); /* 43 */
  181.   HH ( b, c, d, a, in6, S34,   76029189); /* 44 */
  182.   HH ( a, b, c, d, in9, S31, 3654602809); /* 45 */
  183.   HH ( d, a, b, c, in12, S32, 3873151461); /* 46 */
  184.   HH ( c, d, a, b, in15, S33,  530742520); /* 47 */
  185.   HH ( b, c, d, a, in2, S34, 3299628645); /* 48 */
  186.  
  187.   /* Round 4 */
  188. #define S41 6
  189. #define S42 10
  190. #define S43 15
  191. #define S44 21
  192.   II ( a, b, c, d, in0, S41, 4096336452); /* 49 */
  193.   II ( d, a, b, c, in7, S42, 1126891415); /* 50 */
  194.   II ( c, d, a, b, in14, S43, 2878612391); /* 51 */
  195.   II ( b, c, d, a, in5, S44, 4237533241); /* 52 */
  196.   II ( a, b, c, d, in12, S41, 1700485571); /* 53 */
  197.   II ( d, a, b, c, in3, S42, 2399980690); /* 54 */
  198.   II ( c, d, a, b, in10, S43, 4293915773); /* 55 */
  199.   II ( b, c, d, a, in1, S44, 2240044497); /* 56 */
  200.   II ( a, b, c, d, in8, S41, 1873313359); /* 57 */
  201.   II ( d, a, b, c, in15, S42, 4264355552); /* 58 */
  202.   II ( c, d, a, b, in6, S43, 2734768916); /* 59 */
  203.   II ( b, c, d, a, in13, S44, 1309151649); /* 60 */
  204.   II ( a, b, c, d, in4, S41, 4149444226); /* 61 */
  205.   II ( d, a, b, c, in11, S42, 3174756917); /* 62 */
  206.   II ( c, d, a, b, in2, S43,  718787259); /* 63 */
  207.   II ( b, c, d, a, in9, S44, 3951481745); /* 64 */
  208.  
  209.     a += a0;
  210.     b += b0;
  211.     c += c0;
  212.     d += d0;
  213.  
  214.     *(uint*)(out+0) = a;
  215.     *(uint*)(out+4) = b;
  216.     *(uint*)(out+8) = c;
  217.     *(uint*)(out+12) = d;
  218.  
  219.     /* *a1 = a; */
  220.     /* *b1 = b; */
  221.     /* *c1 = c; */
  222.     /* *d1 = d; */
  223. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement