/*
 * demo.c
 *
 *  Created on: 22 sept. 2011
 *      Author: Daniel
 */
/*
*   Byte-oriented AES-256 implementation.
*   All lookup tables replaced with 'on the fly' calculations.
*
*   Copyright (c) 2007 Ilya O. Levin, http://www.literatecode.com
*
*   Permission to use, copy, modify, and distribute this software for any
*   purpose with or without fee is hereby granted, provided that the above
*   copyright notice and this permission notice appear in all copies.
*
*   THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
*   WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
*   MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
*   ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
*   WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
*   ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
*   OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/
#include <stdlib.h>
#include <stdio.h>
#include "aes256.h"
#include "alt_types.h"
#include <time.h>
#include <unistd.h>
#include <sys/alt_timestamp.h>
//#include <alt_timestamp.h>

#define DUMP(s, i, buf, sz)  {printf(s);                   \
                              for (i = 0; i < (sz);i++)    \
                                  printf("%02x ", buf[i]); \
                              printf("\n");}
//#define CPUID __asm __emit 0fh __asm __emit 0a2h
//#define RDTSC __asm __emit 0fh __asm __emit 031h

/*unsigned __int64 dtime(){
    unsigned cycles_low, cycles_high;

    __asm {
        pushad
        CPUID
        RDTSC
        mov cycles_high, edx
        mov cycles_low, eax
        popad
        }
      return ((unsigned __int64)cycles_high << 32) | cycles_low;
  }
*/
alt_u32 num_ticks ;
alt_u32 t1, t2, overhead;

int main (int argc, char *argv[])
{
  double  texe;
    aes256_context ctx;
    uint8_t key[32];
    uint8_t buf[16], i;

  t1=alt_timestamp_start();
overhead = alt_timestamp() - t1;

    /* put a test vector */
    for (i = 0; i < sizeof(buf);i++) buf[i] = i * 16 + i;
    for (i = 0; i < sizeof(key);i++) key[i] = i;

    DUMP("txt: ", i, buf, sizeof(buf));
    DUMP("key: ", i, key, sizeof(key));
    printf("---\n");

    aes256_init(&ctx, key);
t1=alt_timestamp();
    aes256_encrypt_ecb(&ctx, buf);
t2=alt_timestamp();
 texe=t2-t1 -overhead;
  printf ("encrypt tex= %f  \n \n", (double) (texe));

    DUMP("enc: ", i, buf, sizeof(buf));
    printf("tst: 8e a2 b7 ca 51 67 45 bf ea fc 49 90 4b 49 60 89\n");

    aes256_init(&ctx, key);
t1=alt_timestamp();
    aes256_decrypt_ecb(&ctx, buf);
t2=alt_timestamp();
 texe=t2-t1 -overhead;
  printf ("decrypt tex=%f  \n \n", (double) (texe));
    DUMP("dec: ", i, buf, sizeof(buf));

    aes256_done(&ctx);

    return 0;
} /* main */

