Naruto
9/7/2017 - 1:30 PM

counter128x4_inc.c

// cc -Wall -o counter128x4_inc counter128x4_inc.c
#include <stdio.h>
#include <stdint.h>
#include <memory.h>

/* increment counter (64-bit int) by 1 */
static uint8_t *ctr128_inc(uint8_t counter[16]) {
  uint32_t n=16;
  uint8_t  c;
  do {
    --n;
    c = counter[n];
    ++c;
    counter[n] = c;
    if (c) return counter;
  } while (n);

  return counter;
}

void argx4(int i, uint64_t arg4[2], uint64_t arg3[2], uint64_t arg2[2], uint64_t arg1[2]) {
  printf("%4d\n", i);
  printf("%4s: 0x%016llx 0x%016llx\n", "arg1", arg1[1], arg1[0]);
  printf("%4s: 0x%016llx 0x%016llx\n", "arg2", arg2[1], arg2[0]);
  printf("%4s: 0x%016llx 0x%016llx\n", "arg3", arg3[1], arg3[0]);
  printf("%4s: 0x%016llx 0x%016llx\n", "arg4", arg4[1], arg4[0]);
  printf("\n");
}

int main() {
  uint64_t src[2] = {0x0706050403020100L, 0x0f0e0d0c0b0a0908L};
  uint64_t dst[2];
  memcpy(dst, src, sizeof(dst));
  uint8_t *p = (uint8_t*)&dst;

  for(int i=0; i<(256/4); i++) {
    uint64_t arg1[2];
    uint64_t arg2[2];
    uint64_t arg3[2];
    uint64_t arg4[2];
    arg1[0] = *((uint64_t *)p);
    arg1[1] = *((uint64_t *)(p + 8));
    ctr128_inc(p);

    arg2[0] = *((uint64_t *)p);
    arg2[1] = *((uint64_t *)(p + 8));
    ctr128_inc(p);

    arg3[0] = *((uint64_t *)p);
    arg3[1] = *((uint64_t *)(p + 8));
    ctr128_inc(p);

    arg4[0] = *((uint64_t *)p);
    arg4[1] = *((uint64_t *)(p + 8));
    ctr128_inc(p);

    argx4(i, arg4, arg3, arg2, arg1);
  }

  return 0;
}