diff options
Diffstat (limited to 'genkey.c')
| -rw-r--r-- | genkey.c | 83 |
1 files changed, 83 insertions, 0 deletions
diff --git a/genkey.c b/genkey.c new file mode 100644 index 0000000..ef19e9e --- /dev/null +++ b/genkey.c @@ -0,0 +1,83 @@ +#include <ctype.h> +#include <stdio.h> +#include <string.h> +#include <stdlib.h> +#include "deonebook.h" + +#define SCR_SIZE 8 +#define CSD_SIZE 16 +#define CID_SIZE 16 +#define KEY_SIZE 16 + +static unsigned char twiddle(unsigned char buf[2]) +{ + unsigned char c = 0; + + if (isdigit(buf[0])) { + c = buf[0]; + } else if (isupper(buf[0])) { + c = buf[0] - 0x37; + } else if (islower(buf[0])) { + c = buf[0] - 0x57; + } + c *= 0x10; + + if (isdigit(buf[1])) { + c |= buf[1] - 0x30; + } else if (isupper(buf[1])) { + c |= buf[1] - 0x37; + } else if (islower(buf[1])) { + c |= buf[1] + 0xa9; + } + + return c; +} + +static void get_sd_register(const char *dev, const char *reg, size_t n, unsigned char buf[n]) +{ + char path[256]; + snprintf(path, sizeof(path), "/sys/block/%s/device/%s", dev, reg); + + FILE *f = fopen(path, "r"); + if (f == NULL) { + return; + } + + for (size_t i = 0; i < n; i++) { + unsigned char hex[2]; + fread(hex, 2, 1, f); + buf[i] = twiddle(hex); + } + + fclose(f); +} + +unsigned char * genkey(const char *dev) +{ + static unsigned char key[KEY_SIZE]; + const unsigned char keycode[] = "eone"; + size_t codelen = sizeof(keycode) - 1; + + unsigned char scr[SCR_SIZE] = "testtest"; + unsigned char csd[CSD_SIZE] = "testtesttesttest"; + unsigned char cid[CID_SIZE] = "testtesttesttest"; + + get_sd_register(dev, "cid", sizeof(cid), cid); + get_sd_register(dev, "csd", sizeof(csd), csd); + get_sd_register(dev, "scr", sizeof(scr), scr); + + memcpy(key, cid + 3, 10); + memcpy(key + 10, csd + 7, 3); + key[13] = scr[0]; + memcpy(key + 0xe, scr + 2, 2); + + for (size_t i = 0; i < KEY_SIZE; i++) { + if (i < codelen) { + key[i] += keycode[i]; + } else { + key[i] += i - (codelen - 1); + } + } + + return key; +} |
