summaryrefslogtreecommitdiff
path: root/genkey.c
diff options
context:
space:
mode:
authorJakob Kaivo <jkk@ung.org>2020-11-12 19:44:44 -0500
committerJakob Kaivo <jkk@ung.org>2020-11-12 19:44:44 -0500
commit25ef0e31af60f54f67bb5d69d1654cc94a48b8fd (patch)
tree19905af57e8ec01a4521d88c5ad6c70b9fecf621 /genkey.c
parent86a43cdcb7882d9dadd8a3a95b74bf1e9d586556 (diff)
s/getkey/genkey/
Diffstat (limited to 'genkey.c')
-rw-r--r--genkey.c83
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;
+}