#include <stdint.h>
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/stat.h>

unsigned char *slurp_file(const char *filename, size_t *filesize) {
    struct stat st;
    uint8_t *ret = NULL;
    int fd = -1;
    stat(filename, &st);
    *filesize = st.st_size;
    if((fd = open(filename, O_RDONLY)) < 0) {
        return NULL;
    }
    ret = malloc(st.st_size+1);
    read(fd, ret, st.st_size);
    close(fd);
    return ret;
}

uint16_t T1_Decrypt(uint8_t *buffer, uint32_t length, uint16_t seed)
{
    uint32_t r, s = seed;

    for ( r = 0; r < length; r++ )
    {
      uint32_t val = buffer[r];
      uint32_t b   = (val ^ (s >> 8));
      s         = ((val + s)*52845U + 22719) & 0xFFFFU;
      buffer[r] = (uint8_t) b;
    }

    return (uint16_t)s;
}

int main(int argc, char **argv) {
    size_t ttfbufsz = 0;
    unsigned char *p, *ttfbuf = NULL;

	ttfbuf = slurp_file(argv[1],&ttfbufsz);
	if (ttfbuf==NULL) {
		write(2, "Can't open ", 11);
        write(2, argv[1], strlen(argv[1]));
        write(2, "\n", 1);
        return(1);
	}
    ttfbuf += 6; ttfbufsz -= 6;
    p = strstr(ttfbuf, "currentfile eexec");
	if (p==NULL) {
		write(1, "No charstrings in ", 18);
        write(2, argv[1], strlen(argv[1]));
        write(2, "\n", 1);
        return(1);
	}
    p += 24;
    ttfbufsz -= (size_t)(p - ttfbuf);
    T1_Decrypt(p, ttfbufsz, 55665);
	write(1, p, ttfbufsz);
    return(0);
}

