OhGodAPet

Wolf's Educational Ethash C Example - with zeros!

Dec 27th, 2019
412
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 5.70 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include <stdint.h>
  5.  
  6. #define ROTL64(x, y)    (((x) << (y)) | ((x) >> (64ULL - (y))))
  7.  
  8. const uint64_t KeccakF1600RndConsts[24] =
  9. {
  10.     0x0000000000000001ULL, 0x0000000000008082ULL, 0x800000000000808AULL,
  11.     0x8000000080008000ULL, 0x000000000000808BULL, 0x0000000080000001ULL,
  12.     0x8000000080008081ULL, 0x8000000000008009ULL, 0x000000000000008AULL,
  13.     0x0000000000000088ULL, 0x0000000080008009ULL, 0x000000008000000AULL,
  14.     0x000000008000808BULL, 0x800000000000008BULL, 0x8000000000008089ULL,
  15.     0x8000000000008003ULL, 0x8000000000008002ULL, 0x8000000000000080ULL,
  16.     0x000000000000800AULL, 0x800000008000000AULL, 0x8000000080008081ULL,
  17.     0x8000000000008080ULL, 0x0000000080000001ULL, 0x8000000080008008ULL
  18. };
  19.  
  20. void keccakf(uint64_t *st)
  21. {
  22.     uint64_t bc[5], tmp;
  23.     printf("State at beginning of Keccakf permutation:\n0x");
  24.     for(int i = 0; i < 200; ++i) printf("%02X", ((uint8_t *)st)[i]);
  25.     printf("\n\n");
  26.  
  27.     for(int i = 0; i < 23; ++i)
  28.     {
  29.         bc[0] = st[4] ^ st[9] ^ st[14] ^ st[19] ^ st[24] ^ ROTL64(st[1] ^ st[6] ^ st[11] ^ st[16] ^ st[21], 1);
  30.         bc[1] = st[0] ^ st[5] ^ st[10] ^ st[15] ^ st[20] ^ ROTL64(st[2] ^ st[7] ^ st[12] ^ st[17] ^ st[22], 1);
  31.         bc[2] = st[1] ^ st[6] ^ st[11] ^ st[16] ^ st[21] ^ ROTL64(st[3] ^ st[8] ^ st[13] ^ st[18] ^ st[23], 1);
  32.         bc[3] = st[2] ^ st[7] ^ st[12] ^ st[17] ^ st[22] ^ ROTL64(st[4] ^ st[9] ^ st[14] ^ st[19] ^ st[24], 1);
  33.         bc[4] = st[3] ^ st[8] ^ st[13] ^ st[18] ^ st[23] ^ ROTL64(st[0] ^ st[5] ^ st[10] ^ st[15] ^ st[20], 1);
  34.         st[0] ^= bc[0];
  35.  
  36.         tmp = st[ 1] ^ bc[1];
  37.         st[ 1] = ROTL64(st[ 6] ^ bc[1], 44);
  38.         st[ 6] = ROTL64(st[ 9] ^ bc[4], 20);
  39.         st[ 9] = ROTL64(st[22] ^ bc[2], 61);
  40.         st[22] = ROTL64(st[14] ^ bc[4], 39);
  41.         st[14] = ROTL64(st[20] ^ bc[0], 18);
  42.         st[20] = ROTL64(st[ 2] ^ bc[2], 62);
  43.         st[ 2] = ROTL64(st[12] ^ bc[2], 43);
  44.         st[12] = ROTL64(st[13] ^ bc[3], 25);
  45.         st[13] = ROTL64(st[19] ^ bc[4],  8);
  46.         st[19] = ROTL64(st[23] ^ bc[3], 56);
  47.         st[23] = ROTL64(st[15] ^ bc[0], 41);
  48.         st[15] = ROTL64(st[ 4] ^ bc[4], 27);
  49.         st[ 4] = ROTL64(st[24] ^ bc[4], 14);
  50.         st[24] = ROTL64(st[21] ^ bc[1],  2);
  51.         st[21] = ROTL64(st[ 8] ^ bc[3], 55);
  52.         st[ 8] = ROTL64(st[16] ^ bc[1], 45);
  53.         st[16] = ROTL64(st[ 5] ^ bc[0], 36);
  54.         st[ 5] = ROTL64(st[ 3] ^ bc[3], 28);
  55.         st[ 3] = ROTL64(st[18] ^ bc[3], 21);
  56.         st[18] = ROTL64(st[17] ^ bc[2], 15);
  57.         st[17] = ROTL64(st[11] ^ bc[1], 10);
  58.         st[11] = ROTL64(st[ 7] ^ bc[2],  6);
  59.         st[ 7] = ROTL64(st[10] ^ bc[0],  3);
  60.         st[10] = ROTL64(  tmp,  1);
  61.  
  62.         bc[0] = st[ 0]; bc[1] = st[ 1]; st[ 0] ^= (~bc[1]) & st[ 2]; st[ 1] ^= (~st[ 2]) & st[ 3]; st[ 2] ^= (~st[ 3]) & st[ 4]; st[ 3] ^= (~st[ 4]) & bc[0]; st[ 4] ^= (~bc[0]) & bc[1];
  63.         bc[0] = st[ 5]; bc[1] = st[ 6]; st[ 5] ^= (~bc[1]) & st[ 7]; st[ 6] ^= (~st[ 7]) & st[ 8]; st[ 7] ^= (~st[ 8]) & st[ 9]; st[ 8] ^= (~st[ 9]) & bc[0]; st[ 9] ^= (~bc[0]) & bc[1];
  64.         bc[0] = st[10]; bc[1] = st[11]; st[10] ^= (~bc[1]) & st[12]; st[11] ^= (~st[12]) & st[13]; st[12] ^= (~st[13]) & st[14]; st[13] ^= (~st[14]) & bc[0]; st[14] ^= (~bc[0]) & bc[1];
  65.         bc[0] = st[15]; bc[1] = st[16]; st[15] ^= (~bc[1]) & st[17]; st[16] ^= (~st[17]) & st[18]; st[17] ^= (~st[18]) & st[19]; st[18] ^= (~st[19]) & bc[0]; st[19] ^= (~bc[0]) & bc[1];
  66.         bc[0] = st[20]; bc[1] = st[21]; st[20] ^= (~bc[1]) & st[22]; st[21] ^= (~st[22]) & st[23]; st[22] ^= (~st[23]) & st[24]; st[23] ^= (~st[24]) & bc[0]; st[24] ^= (~bc[0]) & bc[1];
  67.  
  68.         st[0] ^= KeccakF1600RndConsts[i];
  69.     }
  70.  
  71.     bc[0] = st[4] ^ st[9] ^ st[14] ^ st[19] ^ st[24] ^ ROTL64(st[1] ^ st[6] ^ st[11] ^ st[16] ^ st[21], 1);
  72.     bc[1] = st[0] ^ st[5] ^ st[10] ^ st[15] ^ st[20] ^ ROTL64(st[2] ^ st[7] ^ st[12] ^ st[17] ^ st[22], 1);
  73.     bc[2] = st[1] ^ st[6] ^ st[11] ^ st[16] ^ st[21] ^ ROTL64(st[3] ^ st[8] ^ st[13] ^ st[18] ^ st[23], 1);
  74.     bc[3] = st[2] ^ st[7] ^ st[12] ^ st[17] ^ st[22] ^ ROTL64(st[4] ^ st[9] ^ st[14] ^ st[19] ^ st[24], 1);
  75.     bc[4] = st[3] ^ st[8] ^ st[13] ^ st[18] ^ st[23] ^ ROTL64(st[0] ^ st[5] ^ st[10] ^ st[15] ^ st[20], 1);
  76.     st[0] ^= bc[0];
  77.  
  78.     tmp = st[ 1] ^ bc[1];
  79.     st[ 1] = ROTL64(st[ 6] ^ bc[1], 44);
  80.     st[ 6] = ROTL64(st[ 9] ^ bc[4], 20);
  81.     st[ 9] = ROTL64(st[22] ^ bc[2], 61);
  82.     st[22] = ROTL64(st[14] ^ bc[4], 39);
  83.     st[14] = ROTL64(st[20] ^ bc[0], 18);
  84.     st[20] = ROTL64(st[ 2] ^ bc[2], 62);
  85.     st[ 2] = ROTL64(st[12] ^ bc[2], 43);
  86.     st[12] = ROTL64(st[13] ^ bc[3], 25);
  87.     st[13] = ROTL64(st[19] ^ bc[4],  8);
  88.     st[19] = ROTL64(st[23] ^ bc[3], 56);
  89.     st[23] = ROTL64(st[15] ^ bc[0], 41);
  90.     st[15] = ROTL64(st[ 4] ^ bc[4], 27);
  91.     st[ 4] = ROTL64(st[24] ^ bc[4], 14);
  92.     st[24] = ROTL64(st[21] ^ bc[1],  2);
  93.     st[21] = ROTL64(st[ 8] ^ bc[3], 55);
  94.     st[ 8] = ROTL64(st[16] ^ bc[1], 45);
  95.     st[16] = ROTL64(st[ 5] ^ bc[0], 36);
  96.     st[ 5] = ROTL64(st[ 3] ^ bc[3], 28);
  97.     st[ 3] = ROTL64(st[18] ^ bc[3], 21);
  98.     st[18] = ROTL64(st[17] ^ bc[2], 15);
  99.     st[17] = ROTL64(st[11] ^ bc[1], 10);
  100.     st[11] = ROTL64(st[ 7] ^ bc[2],  6);
  101.     st[ 7] = ROTL64(st[10] ^ bc[0],  3);
  102.     st[10] = ROTL64(  tmp,  1);
  103.  
  104.     bc[0] = st[ 0]; bc[1] = st[ 1]; st[ 0] ^= (~bc[1]) & st[ 2]; st[ 1] ^= (~st[ 2]) & st[ 3]; st[ 2] ^= (~st[ 3]) & st[ 4]; st[ 3] ^= (~st[ 4]) & bc[0]; st[ 4] ^= (~bc[0]) & bc[1];
  105.     bc[0] = st[ 5]; bc[1] = st[ 6]; st[ 5] ^= (~bc[1]) & st[ 7]; st[ 6] ^= (~st[ 7]) & st[ 8];
  106.     st[0] ^= KeccakF1600RndConsts[23];
  107. }
  108.  
  109. int main(int argc, char **argv)
  110. {
  111.     uint64_t TestVector[25], State[25];
  112.  
  113.     //for(int i = 0; i < 32; ++i) ((uint8_t *)TestVector)[i] = i;
  114.  
  115.     //memcpy(State, TestVector, 32);
  116.     // Nonce
  117.     //State[4] = 0xFEDCBA9876543210ULL;
  118.     memset(State, 0x00, 40);
  119.     // Padding part 1
  120.     State[5] = 0x0000000000000001ULL;
  121.     State[6] = 0x00ULL;
  122.     State[7] = 0x00ULL;
  123.     // Padding part 2
  124.     State[8] = 0x8000000000000000ULL;
  125.  
  126.     for(int i = 9; i < 25; ++i) State[i] = 0x00ULL;
  127.     keccakf(State);
  128.  
  129.     return(0);
  130. }
Advertisement
Add Comment
Please, Sign In to add comment