#include <stddef.h>
#include <stdint.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void addkey(uint8_t *title, uint8_t *key, uint8_t *titleend) {
uint8_t carry = 0;
for(size_t i = 0 ; i < 8 ; i++) {
uint8_t input = title + i >= titleend ? 0x00 : title[i];
uint16_t tmp = input + key[i] + carry;
carry = tmp > 0xFF ? 1 : 0;
title[i] = tmp & 0xFF;
}
}
void print_title(uint8_t *title) {
printf("{");
for(size_t i = 0 ; i < 32 ; i++) {
printf("0x%02x", title[i]);
if(i != 31)
printf(", ");
}
printf("}\n");
}
int main(int argc, char *argv[]) {
if(argc != 2) {
fprintf(stderr, "Usage: %s string\n", argv[0]);
return EXIT_FAILURE;
}
if(strlen(argv[1]) > 32) {
fprintf(stderr, "Error: the size of string to encrypt must be at most 32 bytes long\n");
return EXIT_FAILURE;
}
uint8_t title[32] = {0};
uint8_t key[] = {0x5F, 0x38, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00};
memcpy(title, argv[1], strlen(argv[1]));
print_title(title);
for(size_t k = 0 ; k < 0x20 ; k += 3) {
addkey(title + k, key, title + 0x20);
}
print_title(title);
return EXIT_SUCCESS;
}