Aucune description

shatest.cl 6.4KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223
  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. uint tacc, wt, wtm2, wtm7, wtm15, wtm16;
  42. uint tsh1; // short
  43. uint tsh2; // short
  44. uchar uch1, uch2, uch3, uch4;
  45. uchar uch[4];
  46. //printf(get_global_id(0));
  47. uint K[64]={
  48. 0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5, 0x3956c25b, 0x59f111f1, 0x923f82a4, 0xab1c5ed5,
  49. 0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3, 0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174,
  50. 0xe49b69c1, 0xefbe4786, 0x0fc19dc6, 0x240ca1cc, 0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da,
  51. 0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7, 0xc6e00bf3, 0xd5a79147, 0x06ca6351, 0x14292967,
  52. 0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13, 0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85,
  53. 0xa2bfe8a1, 0xa81a664b, 0xc24b8b70, 0xc76c51a3, 0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070,
  54. 0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5, 0x391c0cb3, 0x4ed8aa4a, 0x5b9cca4f, 0x682e6ff3,
  55. 0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208, 0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2
  56. };
  57. msg_pad=0;
  58. ulen = data_info[2];
  59. total = ulen%64>=56?2:1 + ulen/64;
  60. //printf("ulen: %u total:%u\n", ulen, total);
  61. digest[0] = H0;
  62. digest[1] = H1;
  63. digest[2] = H2;
  64. digest[3] = H3;
  65. digest[4] = H4;
  66. digest[5] = H5;
  67. digest[6] = H6;
  68. digest[7] = H7;
  69. for(item=0; item<total; item++)
  70. {
  71. A = digest[0];
  72. B = digest[1];
  73. C = digest[2];
  74. D = digest[3];
  75. E = digest[4];
  76. F = digest[5];
  77. G = digest[6];
  78. H = digest[7];
  79. #pragma unroll
  80. for (t = 0; t < 80; t++){
  81. W[t] = 0x00000000;
  82. }
  83. msg_pad=item*64;
  84. if(ulen > msg_pad)
  85. {
  86. current_pad = (ulen-msg_pad)>64?64:(ulen-msg_pad);
  87. }
  88. else
  89. {
  90. current_pad =-1;
  91. }
  92. if(current_pad>0)
  93. {
  94. i=current_pad;
  95. stop = i/4;
  96. for (t = 0 ; t < stop+get_global_id(0) ; t++){
  97. W[t] = ((uchar) plain_key[msg_pad + t * 4]) << 24;
  98. W[t] |= ((uchar) plain_key[msg_pad + t * 4 + 1]) << 16;
  99. W[t] |= ((uchar) plain_key[msg_pad + t * 4 + 2]) << 8;
  100. W[t] |= (uchar) plain_key[msg_pad + t * 4 + 3];
  101. }
  102. mmod = i % 4;
  103. if ( mmod == 3){
  104. W[t] = ((uchar) plain_key[msg_pad + t * 4]) << 24;
  105. W[t] |= ((uchar) plain_key[msg_pad + t * 4 + 1]) << 16;
  106. W[t] |= ((uchar) plain_key[msg_pad + t * 4 + 2]) << 8;
  107. W[t] |= ((uchar) 0x80) ;
  108. } else if (mmod == 2) {
  109. W[t] = ((uchar) plain_key[msg_pad + t * 4]) << 24;
  110. W[t] |= ((uchar) plain_key[msg_pad + t * 4 + 1]) << 16;
  111. W[t] |= 0x8000 ;
  112. } else if (mmod == 1) {
  113. W[t] = ((uchar) plain_key[msg_pad + t * 4]) << 24;
  114. W[t] |= 0x800000 ;
  115. } else { //if (mmod == 0)
  116. W[t] = 0x80000000 ;
  117. }
  118. if (current_pad<56)
  119. {
  120. W[15] = ulen*8 ;
  121. }
  122. }
  123. else if(current_pad <0)
  124. {
  125. if( ulen%64==0)
  126. W[0]=0x80000000;
  127. W[15]=ulen*8;
  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]; // 64-bit
  132. // W[t] = (W[t - 2]) + W[t - 7] + (W[t - 15]) + W[t - 16]; // 64-bit
  133. // W[t] = (W[t - 2] + W[t - 7] + W[t - 15] + W[t - 16])&0xffffffff; // 64-bit
  134. // W[t] = (W[t - 2] + W[t - 7])&0xffffffff; // 64-bit
  135. // W[t] = W[t - 2]; // 64-bit // 64-bit
  136. // W[t] = 0x0 ^ W[t - 2]; // 64-bit
  137. // W[t] = (uint)W[t-2]; // 64-bit
  138. // W[t] = 0xffffffff & W[t-2] & 0xffffffff; // 64-bit
  139. // W[t] = W[t-2]>>16<<16 + W[t-2]&0x0000ffff; // 64-bit
  140. // W[t] = (uint)(W[t-2]>>16); // 64-bit
  141. // W[t] = (uint)(W[t-2]/2); // 64-bit
  142. // W[t] = (int)(W[0]); // 64-bit
  143. // W[t] = W[t] + W[t]; // 64-bit
  144. // W[t] = W[t-2]; // 64-bit
  145. // W[t] = wtm2 + wtm7 + wtm15 + wtm16; // 64-bit
  146. // W[t] = ((uchar) plain_key[msg_pad + t * 4]) << 24;
  147. // W[t] = ((uchar) uch[0]) << 24; // 64-bit
  148. // W[t] |= ((uchar) uch[1]) << 16; // 64-bit
  149. // W[t] |= ((uchar) uch[2]) << 8; // 64-bit
  150. // W[t] |= ((uchar) uch[3]) << 0; // 64-bit
  151. // wt = W[t]; // This works, but reassignment to W[t] fails as 64-bit
  152. // wtm2 = W[t-2];
  153. // wtm7 = W[t-7];
  154. // wtm15 = W[t-15];
  155. // wtm16 = W[t-16];
  156. // tacc = gamma1(wtm2) + wtm7 + gamma0(wtm15) + wtm16;
  157. W[t] = gamma1(W[t-2]) + W[t-7] + gamma0(W[t-15]) + W[t-16];
  158. T1 = H + sigma1(E) + ch(E, F, G) + K[t] + W[t];
  159. T2 = sigma0(A) + maj(A, B, C);
  160. H = G; G = F; F = E; E = D + T1; D = C; C = B; B = A; A = T1 + T2;
  161. /*
  162. tsh1 = (uint)(tacc >> 16);
  163. tsh2 = (uint)(tacc & 0xffff);
  164. uch1 = (uchar)(tsh1>>8);
  165. uch2 = (uchar)(tsh1&0xff);
  166. uch3 = (uchar)(tsh2>>8);
  167. uch4 = (uchar)(tsh2&0xff);
  168. uch[0]=(uchar)uch1;
  169. uch[1]=(uchar)uch2;
  170. uch[2]=(uchar)uch3;
  171. uch[3]=(uchar)uch4;
  172. W[t] = t;
  173. t = (uchar)uch1;
  174. W[t] = (uint)(t);
  175. W[0] = (uint)uch1;
  176. W[t] |= ((uchar)uch2) << 16;
  177. W[t] |= ((uchar)uch3) << 8;
  178. W[t] |= (uchar)uch4;
  179. tmpi = W[t-2];
  180. W[t] = tmpi;
  181. W[t] = 0xffffffff << 1;
  182. W[t-2] = W[t-2];
  183. W[t] = W[t];
  184. W[t] = W[t]&0xffffffff;
  185. */
  186. /*
  187. T1 = H + sigma1(E) + ch(E, F, G) + K[t] + W[t];
  188. T2 = sigma0(A) + maj(A, B, C);
  189. H = G; G = F; F = E; E = D + T1; D = C; C = B; B = A; A = T1 + T2;
  190. */
  191. }
  192. digest[0] += A;
  193. digest[1] += B;
  194. digest[2] += C;
  195. digest[3] += D;
  196. digest[4] += E;
  197. digest[5] += F;
  198. digest[6] += G;
  199. digest[7] += H;
  200. }
  201. }