#include <stdint.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>

void encrypt(uint16_t *v) {
  uint16_t v0 = v[0], v1 = v[1], sum = 0, i; /* set up */
  uint16_t delta = 0x626f;
  uint16_t k0 = 0x7065; // "pe"
  uint16_t k1 = 0x7065; // "pe"
  uint16_t k2 = 0x7275; // "ru"
  uint16_t k3 = 0x6e73; // "ns"
  printf("v0: 0x%x, v1: 0x%x\n", v0, v1);
  for (i = 0; i < 128; i++) {
    sum += delta;
    v0 += ((v1 << 4) + k0) ^ (v1 + sum) ^ ((v1 >> 5) + k1);
    v1 += ((v0 << 4) + k2) ^ (v0 + sum) ^ ((v0 >> 5) + k3);
    //printf("Intermediate v0: 0x%x | v1: 0x%x\n", v0, v1);
  }
  printf("SUM: 0x%x\n", sum);
  printf("v0: 0x%x, v1: 0x%x\n", v0, v1);
  v[0] = v0;
  v[1] = v1;
}

int main(int argc, char *argv[]) {
  uint8_t *buf;
  uint32_t buflen, i;
  if (argc != 2) {
    printf("Usage: %s text_to_encrypt", argv[0]);
    exit(1);
  }
  buflen = strlen(argv[1]);
  buf = (uint8_t *)malloc(buflen);
  memcpy(buf, argv[1], buflen);
  for (i = 0; i < buflen; i++) {
    printf("----\n");
    encrypt((uint16_t *)&buf[i]);
  }
  printf("Result:\n");
  for (i = 0; i < buflen; i++) {
    printf("%02x", buf[i]);
  }
  printf("\n");
  return 0;
}