Без опису

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176
  1. #ifndef uint32_t
  2. #define uint32_t unsigned int
  3. #endif
  4. #define H0 0x6a09e667
  5. #define H1 0xbb67ae85
  6. #define H2 0x3c6ef372
  7. #define H3 0xa54ff53a
  8. #define H4 0x510e527f
  9. #define H5 0x9b05688c
  10. #define H6 0x1f83d9ab
  11. #define H7 0x5be0cd19
  12. uint rotr(uint x, int n) {
  13. if (n < 32) return (x >> n) | (x << (32 - n));
  14. return x;
  15. }
  16. uint ch(uint x, uint y, uint z) {
  17. return (x & y) ^ (~x & z);
  18. }
  19. uint maj(uint x, uint y, uint z) {
  20. return (x & y) ^ (x & z) ^ (y & z);
  21. }
  22. uint sigma0(uint x) {
  23. return rotr(x, 2) ^ rotr(x, 13) ^ rotr(x, 22);
  24. }
  25. uint sigma1(uint x) {
  26. return rotr(x, 6) ^ rotr(x, 11) ^ rotr(x, 25);
  27. }
  28. uint gamma0(uint x) {
  29. return rotr(x, 7) ^ rotr(x, 18) ^ (x >> 3);
  30. }
  31. uint gamma1(uint x) {
  32. return rotr(x, 17) ^ rotr(x, 19) ^ (x >> 10);
  33. }
  34. __kernel void sha256_crypt_kernel(__global uint *data_info,__global char *plain_key, __global uint *digest){
  35. int t, gid, msg_pad;
  36. int stop, mmod;
  37. uint i, ulen, item, total;
  38. uint W[80], temp, A,B,C,D,E,F,G,H,T1,T2;
  39. uint num_keys = data_info[1];
  40. int current_pad;
  41. //printf(get_global_id(0));
  42. uint K[64]={
  43. 0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5, 0x3956c25b, 0x59f111f1, 0x923f82a4, 0xab1c5ed5,
  44. 0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3, 0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174,
  45. 0xe49b69c1, 0xefbe4786, 0x0fc19dc6, 0x240ca1cc, 0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da,
  46. 0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7, 0xc6e00bf3, 0xd5a79147, 0x06ca6351, 0x14292967,
  47. 0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13, 0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85,
  48. 0xa2bfe8a1, 0xa81a664b, 0xc24b8b70, 0xc76c51a3, 0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070,
  49. 0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5, 0x391c0cb3, 0x4ed8aa4a, 0x5b9cca4f, 0x682e6ff3,
  50. 0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208, 0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2
  51. };
  52. msg_pad=0;
  53. ulen = data_info[2];
  54. total = ulen%64>=56?2:1 + ulen/64;
  55. //printf("ulen: %u total:%u\n", ulen, total);
  56. digest[0] = H0;
  57. digest[1] = H1;
  58. digest[2] = H2;
  59. digest[3] = H3;
  60. digest[4] = H4;
  61. digest[5] = H5;
  62. digest[6] = H6;
  63. digest[7] = H7;
  64. for(item=0; item<total; item++)
  65. {
  66. A = digest[0];
  67. B = digest[1];
  68. C = digest[2];
  69. D = digest[3];
  70. E = digest[4];
  71. F = digest[5];
  72. G = digest[6];
  73. H = digest[7];
  74. #pragma unroll
  75. for (t = 0; t < 80; t++){
  76. W[t] = 0x00000000;
  77. }
  78. msg_pad=item*64;
  79. if(ulen > msg_pad)
  80. {
  81. current_pad = (ulen-msg_pad)>64?64:(ulen-msg_pad);
  82. }
  83. else
  84. {
  85. current_pad =-1;
  86. }
  87. // printf("current_pad: %d\n",current_pad);
  88. if(current_pad>0)
  89. {
  90. i=current_pad;
  91. stop = i/4;
  92. // printf("i:%d, stop: %d msg_pad:%d\n",i,stop, msg_pad);
  93. for (t = 0 ; t < stop+get_global_id(0) ; t++){
  94. W[t] = ((uchar) plain_key[msg_pad + t * 4]) << 24;
  95. W[t] |= ((uchar) plain_key[msg_pad + t * 4 + 1]) << 16;
  96. W[t] |= ((uchar) plain_key[msg_pad + t * 4 + 2]) << 8;
  97. W[t] |= (uchar) plain_key[msg_pad + t * 4 + 3];
  98. // printf("W[%u]: %u\n",t,W[t]);
  99. }
  100. mmod = i % 4;
  101. if ( mmod == 3){
  102. W[t] = ((uchar) plain_key[msg_pad + t * 4]) << 24;
  103. W[t] |= ((uchar) plain_key[msg_pad + t * 4 + 1]) << 16;
  104. W[t] |= ((uchar) plain_key[msg_pad + t * 4 + 2]) << 8;
  105. W[t] |= ((uchar) 0x80) ;
  106. } else if (mmod == 2) {
  107. W[t] = ((uchar) plain_key[msg_pad + t * 4]) << 24;
  108. W[t] |= ((uchar) plain_key[msg_pad + t * 4 + 1]) << 16;
  109. W[t] |= 0x8000 ;
  110. } else if (mmod == 1) {
  111. W[t] = ((uchar) plain_key[msg_pad + t * 4]) << 24;
  112. W[t] |= 0x800000 ;
  113. } else /*if (mmod == 0)*/ {
  114. W[t] = 0x80000000 ;
  115. }
  116. if (current_pad<56)
  117. {
  118. W[15] = ulen*8 ;
  119. // printf("ulen avlue 2 :w[15] :%u\n", W[15]);
  120. }
  121. }
  122. else if(current_pad <0)
  123. {
  124. if( ulen%64==0)
  125. W[0]=0x80000000;
  126. W[15]=ulen*8;
  127. //printf("ulen avlue 3 :w[15] :%u\n", W[15]);
  128. }
  129. for (t = 0; t < 64; t++) {
  130. if (t >= 16)
  131. W[t] = gamma1(W[t - 2]) + W[t - 7] + gamma0(W[t - 15]) + W[t - 16];
  132. T1 = H + sigma1(E) + ch(E, F, G) + K[t] + W[t];
  133. T2 = sigma0(A) + maj(A, B, C);
  134. H = G; G = F; F = E; E = D + T1; D = C; C = B; B = A; A = T1 + T2;
  135. }
  136. digest[0] += A;
  137. digest[1] += B;
  138. digest[2] += C;
  139. digest[3] += D;
  140. digest[4] += E;
  141. digest[5] += F;
  142. digest[6] += G;
  143. digest[7] += H;
  144. }
  145. // printf("hi");
  146. }