/* khichidicoll2.c
 * Generates a second preimage for Khichidi-1.
 * This code works for any IV value.
 *
 *
 * Author: Nicky Mouha
 * Date: December 15, 2008
 *
 * This code is placed in the public domain.
 */

#include <stdio.h>
#include <stdlib.h>
#include "khichidi.h"
#include "khichidi_core.h"

#define LENGTH 256

int main(int argc, char** argv) {
  int i;
  int hashbitlen = LENGTH;

  WORD val1, val2, xor_vals;
  DataLength databitlen = 64*8;

  /* hash state of the first message */
  hashState   state1;
  BitSequence hash1[LENGTH/8];
  BitSequence *hashval1 = hash1;
  BitSequence m1[64] = {0};

  /* hash state of the second message */
  hashState   state2;
  BitSequence hash2[LENGTH/8];
  BitSequence *hashval2 = hash2;
  BitSequence m2[64] = {0};

  /* hash the first message */
  Init(&state1, hashbitlen);
  Update(&state1, m1, databitlen);
  Final(&state1, hashval1);

  /* hash the second message */
  Init(&state2, hashbitlen);

  val1 = message_pre_process(0x00000000 ^ state2.H[0]);
  val2 = message_pre_process(0xFFFFFFFF ^ state2.H[0]);
  xor_vals = val1 ^ val2;

  m2[0] = 0xFF;
  m2[1] = 0xFF;
  m2[2] = 0xFF;
  m2[3] = 0xFF;

  m2[4] = xor_vals >> 24;
  m2[5] = xor_vals >> 16;
  m2[6] = xor_vals >>  8;
  m2[7] = xor_vals >>  0;

  Update(&state2, m2, databitlen);
  Final(&state2, hashval2);

  /* print the first hash value */
  for (i=0; i<LENGTH/8; ++i) {
    printf("%02x", hash1[i]);
  }
  printf("\n");

  /* print the second hash value */
  for (i=0; i<LENGTH/8; ++i) {
    printf("%02x", hash2[i]);
  }
  printf("\n");

  return 0;
}
/* Output:
 *
 * 18c8a73c4d3d64cb66064311edbd0d151a4d517c522c3d53c4af28252dff6a18
 * 18c8a73c4d3d64cb66064311edbd0d151a4d517c522c3d53c4af28252dff6a18
 *
 * using an IV containing the fractional part of pi (add this to Init()):
 *
 * state->H[ 0] = 0x243F6A88;
 * state->H[ 1] = 0x85A308D3;
 * state->H[ 2] = 0x13198A2E;
 * state->H[ 3] = 0x03707344;
 * state->H[ 4] = 0xA4093822;
 * state->H[ 5] = 0x299F31D0;
 * state->H[ 6] = 0x082EFA98;
 * state->H[ 7] = 0xEC4E6C89;
 * state->H[ 8] = 0x452821E6;
 * state->H[ 9] = 0x38D01377;
 * state->H[10] = 0xBE5466CF;
 * state->H[11] = 0x34E90C6C;
 * state->H[12] = 0xC0AC29B7;
 * state->H[13] = 0xC97C50DD;
 * state->H[14] = 0x3F84D5B5;
 * state->H[15] = 0xB5470917;
 * state->H[16] = 0x9216D5D9;
 */
