diff options
author | Jakob Kaivo <jkk@ung.org> | 2020-11-12 16:09:53 -0500 |
---|---|---|
committer | Jakob Kaivo <jkk@ung.org> | 2020-11-12 16:09:53 -0500 |
commit | 86a43cdcb7882d9dadd8a3a95b74bf1e9d586556 (patch) | |
tree | 4a9ed147f54fdcd282959d166c9e9253b6236df1 | |
parent | 4601fa65349cd7b3f60619842f3585a1336bc183 (diff) |
generate key from CSD, CID, and SRC registers of SD card
-rw-r--r-- | getkey.c | 92 |
1 files changed, 92 insertions, 0 deletions
diff --git a/getkey.c b/getkey.c new file mode 100644 index 0000000..f7c6076 --- /dev/null +++ b/getkey.c @@ -0,0 +1,92 @@ +#include <ctype.h> +#include <stdio.h> +#include <string.h> +#include <stdlib.h> + +#define SCR_SIZE 8 +#define CSD_SIZE 16 +#define CID_SIZE 16 +#define KEY_SIZE 16 + +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; +} + +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 * getkey(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; +} + +int main(void) +{ + unsigned char *key = getkey("mmcblk0"); + printf("calculated:"); + for (size_t i = 0; i < KEY_SIZE; i++) { + printf(" %02hhx", key[i]); + } + printf("\n"); +} |