OhGodAPet

Wolf's Educational Ethash C Example

Dec 27th, 2019
426
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 4.33 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.     printf("State at beginning of Keccakf permutation:\n0x");
  23.     for(int i = 0; i < 200; ++i) printf("%02X", ((uint8_t *)st)[i]);
  24.     printf("\n\n");
  25.     for(int i = 0; i < 24; ++i)
  26.     {
  27.         uint64_t bc[5], tmp;
  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.         //st[0] ^= bc[0]; st[5] ^= bc[0]; st[10] ^= bc[0]; st[15] ^= bc[0]; st[20] ^= bc[0];
  37.         //st[1] ^= bc[1]; st[6] ^= bc[1]; st[11] ^= bc[1]; st[16] ^= bc[1]; st[21] ^= bc[1];
  38.         //st[2] ^= bc[2]; st[7] ^= bc[2]; st[12] ^= bc[2]; st[17] ^= bc[2]; st[22] ^= bc[2];
  39.         //st[3] ^= bc[3]; st[8] ^= bc[3]; st[13] ^= bc[3]; st[18] ^= bc[3]; st[23] ^= bc[3];
  40.         //st[4] ^= bc[4]; st[9] ^= bc[4]; st[14] ^= bc[4]; st[19] ^= bc[4]; st[24] ^= bc[4];
  41.  
  42.         tmp = st[ 1] ^ bc[1];
  43.         st[ 1] = ROTL64(st[ 6] ^ bc[1], 44);
  44.         st[ 6] = ROTL64(st[ 9] ^ bc[4], 20);
  45.         st[ 9] = ROTL64(st[22] ^ bc[2], 61);
  46.         st[22] = ROTL64(st[14] ^ bc[4], 39);
  47.         st[14] = ROTL64(st[20] ^ bc[0], 18);
  48.         st[20] = ROTL64(st[ 2] ^ bc[2], 62);
  49.         st[ 2] = ROTL64(st[12] ^ bc[2], 43);
  50.         st[12] = ROTL64(st[13] ^ bc[3], 25);
  51.         st[13] = ROTL64(st[19] ^ bc[4],  8);
  52.         st[19] = ROTL64(st[23] ^ bc[3], 56);
  53.         st[23] = ROTL64(st[15] ^ bc[0], 41);
  54.         st[15] = ROTL64(st[ 4] ^ bc[4], 27);
  55.         st[ 4] = ROTL64(st[24] ^ bc[4], 14);
  56.         st[24] = ROTL64(st[21] ^ bc[1],  2);
  57.         st[21] = ROTL64(st[ 8] ^ bc[3], 55);
  58.         st[ 8] = ROTL64(st[16] ^ bc[1], 45);
  59.         st[16] = ROTL64(st[ 5] ^ bc[0], 36);
  60.         st[ 5] = ROTL64(st[ 3] ^ bc[3], 28);
  61.         st[ 3] = ROTL64(st[18] ^ bc[3], 21);
  62.         st[18] = ROTL64(st[17] ^ bc[2], 15);
  63.         st[17] = ROTL64(st[11] ^ bc[1], 10);
  64.         st[11] = ROTL64(st[ 7] ^ bc[2],  6);
  65.         st[ 7] = ROTL64(st[10] ^ bc[0],  3);
  66.         st[10] = ROTL64(  tmp,  1);
  67.  
  68.         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];
  69.         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];
  70.         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];
  71.         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];
  72.         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];
  73.  
  74.         st[0] ^= KeccakF1600RndConsts[i];
  75.     }
  76. }
  77.  
  78. int main(int argc, char **argv)
  79. {
  80.     uint64_t TestVector[25], State[25];
  81.  
  82.     for(int i = 0; i < 32; ++i) ((uint8_t *)TestVector)[i] = i;
  83.  
  84.     memcpy(State, TestVector, 32);
  85.     // Nonce
  86.     State[4] = 0xFEDCBA9876543210ULL;
  87.     // Padding part 1
  88.     State[5] = 0x0000000000000001ULL;
  89.     State[6] = 0x00ULL;
  90.     State[7] = 0x00ULL;
  91.     // Padding part 2
  92.     State[8] = 0x8000000000000000ULL;
  93.  
  94.     for(int i = 9; i < 25; ++i) State[i] = 0x00ULL;
  95.     keccakf(State);
  96.    
  97.     return(0);
  98. }
Advertisement
Add Comment
Please, Sign In to add comment