main.lua

Thu, 07 Apr 2022 18:11:33 +0100

author
Matthew Wild <mwild1@gmail.com>
date
Thu, 07 Apr 2022 18:11:33 +0100
changeset 0
89e39cd5a7cd
permissions
-rwxr-xr-x

Initial commit

0
89e39cd5a7cd Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1 #!/usr/bin/env lua5.3
89e39cd5a7cd Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
2
89e39cd5a7cd Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
3 local ciphers = require "openssl.cipher";
89e39cd5a7cd Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
4 local kdf = require "openssl.kdf";
89e39cd5a7cd Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
5 local zlib = require "zlib";
89e39cd5a7cd Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
6 local sqlite = require "lsqlite3";
89e39cd5a7cd Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
7
89e39cd5a7cd Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
8 local dbuffer = require "util.dbuffer";
89e39cd5a7cd Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
9
89e39cd5a7cd Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
10 local file_password = assert(arg[2], "no password specified");
89e39cd5a7cd Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
11
89e39cd5a7cd Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
12 local input_filename = assert(arg[1], "no ceb file specified");
89e39cd5a7cd Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
13 local db_filename = input_filename:gsub("%.ceb$", "")..".sqlite3";
89e39cd5a7cd Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
14
89e39cd5a7cd Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
15 local function read_header(f)
89e39cd5a7cd Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
16 local function read_int()
89e39cd5a7cd Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
17 return (">i4"):unpack(f:read(4));
89e39cd5a7cd Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
18 end
89e39cd5a7cd Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
19 local function read_short()
89e39cd5a7cd Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
20 return (">i2"):unpack(f:read(2));
89e39cd5a7cd Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
21 end
89e39cd5a7cd Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
22 local function read_long()
89e39cd5a7cd Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
23 return (">i8"):unpack(f:read(8));
89e39cd5a7cd Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
24 end
89e39cd5a7cd Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
25 local function read_string()
89e39cd5a7cd Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
26 local n = read_short();
89e39cd5a7cd Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
27 return f:read(n);
89e39cd5a7cd Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
28 end
89e39cd5a7cd Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
29
89e39cd5a7cd Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
30 return {
89e39cd5a7cd Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
31 version = read_int();
89e39cd5a7cd Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
32 app_id = read_string();
89e39cd5a7cd Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
33 jid = read_string();
89e39cd5a7cd Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
34 timestamp = math.floor(read_long()/1000);
89e39cd5a7cd Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
35 iv = f:read(12);
89e39cd5a7cd Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
36 salt = f:read(16);
89e39cd5a7cd Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
37 };
89e39cd5a7cd Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
38 end
89e39cd5a7cd Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
39
89e39cd5a7cd Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
40 local f = io.open(input_filename);
89e39cd5a7cd Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
41
89e39cd5a7cd Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
42 local header = read_header(f);
89e39cd5a7cd Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
43
89e39cd5a7cd Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
44 print("version", header.version);
89e39cd5a7cd Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
45 print("app", header.app_id);
89e39cd5a7cd Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
46 print("jid", header.jid);
89e39cd5a7cd Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
47 print("timestamp", os.date("%c", header.timestamp));
89e39cd5a7cd Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
48
89e39cd5a7cd Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
49
89e39cd5a7cd Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
50 local function generate_key(password, salt)
89e39cd5a7cd Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
51 return kdf.derive({
89e39cd5a7cd Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
52 type = "PBKDF2";
89e39cd5a7cd Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
53 md = "sha1";
89e39cd5a7cd Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
54 pass = password;
89e39cd5a7cd Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
55 salt = salt;
89e39cd5a7cd Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
56 iter = 1024;
89e39cd5a7cd Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
57 outlen = 128/8;
89e39cd5a7cd Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
58 });
89e39cd5a7cd Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
59 end
89e39cd5a7cd Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
60
89e39cd5a7cd Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
61 print("k", #(generate_key(file_password, header.salt)));
89e39cd5a7cd Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
62
89e39cd5a7cd Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
63 local decryption_key = generate_key(file_password, header.salt);
89e39cd5a7cd Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
64
89e39cd5a7cd Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
65 local cipher = ciphers.new("AES-128-GCM"):decrypt(decryption_key, header.iv);
89e39cd5a7cd Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
66
89e39cd5a7cd Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
67 local decompress = zlib.inflate();
89e39cd5a7cd Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
68
89e39cd5a7cd Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
69 local db = sqlite.open(db_filename);
89e39cd5a7cd Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
70 do
89e39cd5a7cd Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
71 local db_tables = {
89e39cd5a7cd Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
72 [[create table accounts (uuid text primary key, username text, server text, password text, display_name text, status number, status_message text, rosterversion text, options number, avatar text, keys text, hostname text, port number, resource text)]];
89e39cd5a7cd Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
73 [[create table conversations (uuid text, accountUuid text, name text, contactUuid text, contactJid text, created number, status number, mode number, attributes text)]];
89e39cd5a7cd Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
74 [[create table messages (uuid text, conversationUuid text, timeSent number, counterpart text, trueCounterpart text, body text, encryption number, status number, type number, relativeFilePath text, serverMsgId text, axolotl_fingerprint text, carbon number, edited number, read number, oob number, errorMsg text, readByMarkers text, markable number, remoteMsgId text, deleted number, bodyLanguage text)]];
89e39cd5a7cd Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
75 [[create table prekeys (account text, id text, key text)]];
89e39cd5a7cd Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
76 [[create table signed_prekeys (account text, id text, key text)]];
89e39cd5a7cd Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
77 [[create table sessions (account text, name text, device_id text, key text)]];
89e39cd5a7cd Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
78 [[create table identities (account text, name text, ownkey text, fingerprint text, certificate text, trust number, active number, last_activation number, key text)]];
89e39cd5a7cd Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
79 };
89e39cd5a7cd Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
80
89e39cd5a7cd Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
81 for _, query in ipairs(db_tables) do
89e39cd5a7cd Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
82 db:exec(query);
89e39cd5a7cd Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
83 end
89e39cd5a7cd Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
84 end
89e39cd5a7cd Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
85
89e39cd5a7cd Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
86 local buffer = dbuffer.new(1024*1024, 128);
89e39cd5a7cd Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
87
89e39cd5a7cd Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
88 repeat
89e39cd5a7cd Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
89 local enc_data = f:read(4096);
89e39cd5a7cd Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
90 if not enc_data then break; end
89e39cd5a7cd Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
91
89e39cd5a7cd Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
92 local gz_data = assert(cipher:update(enc_data));
89e39cd5a7cd Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
93
89e39cd5a7cd Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
94 local status, data, eof = pcall(decompress, gz_data);
89e39cd5a7cd Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
95 if not status then
89e39cd5a7cd Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
96 print("EE: Failed to decompress: "..tostring(data));
89e39cd5a7cd Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
97 return 1;
89e39cd5a7cd Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
98 end
89e39cd5a7cd Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
99
89e39cd5a7cd Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
100 buffer:write(data);
89e39cd5a7cd Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
101
89e39cd5a7cd Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
102 local line = buffer:read_until("\n");
89e39cd5a7cd Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
103 local query_buffer;
89e39cd5a7cd Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
104 while line do
89e39cd5a7cd Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
105 local balanced_quotes = select(2, line:gsub("'", "%0")) % 2 == 0;
89e39cd5a7cd Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
106
89e39cd5a7cd Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
107 if query_buffer then
89e39cd5a7cd Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
108 table.insert(query_buffer, line);
89e39cd5a7cd Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
109 if not balanced_quotes then
89e39cd5a7cd Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
110 db:exec(table.concat(query_buffer, "\n"));
89e39cd5a7cd Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
111 query_buffer = nil;
89e39cd5a7cd Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
112 end
89e39cd5a7cd Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
113 else
89e39cd5a7cd Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
114 if balanced_quotes then
89e39cd5a7cd Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
115 db:exec(line);
89e39cd5a7cd Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
116 else
89e39cd5a7cd Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
117 query_buffer = { line };
89e39cd5a7cd Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
118 end
89e39cd5a7cd Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
119 end
89e39cd5a7cd Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
120
89e39cd5a7cd Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
121 line = buffer:read_until("\n");
89e39cd5a7cd Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
122 end
89e39cd5a7cd Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
123 until eof
89e39cd5a7cd Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
124
89e39cd5a7cd Initial commit
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
125 print("Done");

mercurial