Skip to content

Commit

Permalink
twrpDigest refactor
Browse files Browse the repository at this point in the history
This patch is to refactor twrpDigest using polymorphism
and inheritance to use the same call patterns for creating and
reading a digest. Now a library.
Use SHA2 from libcrypto. SHA2 is default if device has libcrypto.

Change string MD5 everywhere to use digest or Digest instead. Updated
string tags to digest. Translation will be required.

Switch out digest code into a driver class from partitionmanager.

SHA2 is better for digest creation due to decreased collision space
compared to MD5 and SHA1.

See https://en.wikipedia.org/wiki/SHA-2

Change-Id: I74b5546789990b12aa4ce2e389d25f80a3fe213f
  • Loading branch information
bigbiff authored and Dees-Troy committed Jun 17, 2017
1 parent 92e2531 commit 56cf564
Show file tree
Hide file tree
Showing 60 changed files with 2,364 additions and 2,091 deletions.
19 changes: 9 additions & 10 deletions Android.mk
Original file line number Diff line number Diff line change
Expand Up @@ -51,18 +51,15 @@ LOCAL_SRC_FILES := \
fixContexts.cpp \
twrpTar.cpp \
exclude.cpp \
twrpDigest.cpp \
digest/md5.c \
find_file.cpp \
infomanager.cpp

LOCAL_SRC_FILES += \
infomanager.cpp \
data.cpp \
partition.cpp \
partitionmanager.cpp \
progresstracking.cpp \
twinstall.cpp \
twrp-functions.cpp \
twrpDigestDriver.cpp \
openrecoveryscript.cpp \
tarWrite.c

Expand Down Expand Up @@ -112,20 +109,23 @@ LOCAL_C_INCLUDES += \
system/core/libsparse \
external/zlib

LOCAL_C_INCLUDES += bionic external/openssl/include
LOCAL_C_INCLUDES += bionic
ifeq ($(shell test $(PLATFORM_SDK_VERSION) -lt 23; echo $$?),0)
LOCAL_C_INCLUDES += external/stlport/stlport
LOCAL_C_INCLUDES += external/stlport/stlport external/openssl/include
else
LOCAL_C_INCLUDES += external/boringssl/include
endif

LOCAL_STATIC_LIBRARIES :=
LOCAL_SHARED_LIBRARIES :=

LOCAL_STATIC_LIBRARIES += libguitwrp
LOCAL_SHARED_LIBRARIES += libaosprecovery libz libc libcutils libstdc++ libtar libblkid libminuitwrp libminadbd libmtdutils libminzip libtwadbbu libbootloader_message
LOCAL_SHARED_LIBRARIES += libcrecovery
LOCAL_SHARED_LIBRARIES += libcrecovery libtwadbbu libtwrpdigest

ifeq ($(shell test $(PLATFORM_SDK_VERSION) -lt 23; echo $$?),0)
LOCAL_SHARED_LIBRARIES += libstlport
LOCAL_CFLAGS += -DTW_NO_SHA2_LIBRARY
endif
ifeq ($(shell test $(PLATFORM_SDK_VERSION) -lt 24; echo $$?),0)
LOCAL_SHARED_LIBRARIES += libmincrypttwrp
Expand Down Expand Up @@ -159,10 +159,8 @@ ifeq ($(TARGET_USERIMAGES_USE_EXT4), true)
#LOCAL_STATIC_LIBRARIES += liblz4
endif
endif

LOCAL_C_INCLUDES += external/libselinux/include
LOCAL_SHARED_LIBRARIES += libselinux
LOCAL_CFLAGS += -g
ifneq ($(TARGET_USERIMAGES_USE_EXT4), true)
LOCAL_CFLAGS += -DUSE_EXT4
LOCAL_C_INCLUDES += system/extras/ext4_utils
Expand Down Expand Up @@ -682,6 +680,7 @@ include $(commands_recovery_local_path)/injecttwrp/Android.mk \
$(commands_recovery_local_path)/simg2img/Android.mk \
$(commands_recovery_local_path)/adbbu/Android.mk \
$(commands_recovery_local_path)/libpixelflinger/Android.mk \
$(commands_recovery_local_path)/twrpDigest/Android.mk \
$(commands_recovery_local_path)/attr/Android.mk

ifeq ($(shell test $(PLATFORM_SDK_VERSION) -lt 24; echo $$?),0)
Expand Down
7 changes: 3 additions & 4 deletions adbbu/Android.mk
Original file line number Diff line number Diff line change
Expand Up @@ -2,10 +2,9 @@ LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)

LOCAL_SRC_FILES:= \
twrpback.cpp \
../twrpDigest.cpp \
../digest/md5.c
LOCAL_SHARED_LIBRARIES += libstdc++ libz libselinux
twrpback.cpp

LOCAL_SHARED_LIBRARIES += libstdc++ libz libtwrpdigest
ifeq ($(shell test $(PLATFORM_SDK_VERSION) -lt 23; echo $$?),0)
LOCAL_C_INCLUDES += external/stlport/stlport
LOCAL_SHARED_LIBRARIES += libstlport
Expand Down
38 changes: 15 additions & 23 deletions adbbu/twrpback.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -34,9 +34,8 @@

#include "twadbstream.h"
#include "twrpback.hpp"
#include "../variables.h"
#include "../twcommon.h"
#include "../twrpDigest.hpp"
#include "../twrpDigest/twrpDigest.hpp"
#include "../twrpDigest/twrpMD5.hpp"

twrpback::twrpback(void) {
read_fd = 0;
Expand Down Expand Up @@ -94,7 +93,7 @@ void twrpback::close_restore_fds() {
}

int twrpback::backup(std::string command) {
twrpDigest adb_md5;
twrpMD5 digest;
bool breakloop = false;
int bytes = 0, errctr = 0;
char result[MAX_ADB_READ];
Expand Down Expand Up @@ -215,8 +214,7 @@ int twrpback::backup(std::string command) {
struct twfilehdr twimghdr;

adblogwrite("Writing TWIMG\n");
adb_md5.initMD5();

digest.init();
memset(&twimghdr, 0, sizeof(twimghdr));
memcpy(&twimghdr, cmd, sizeof(cmd));
md5fnsize = twimghdr.size;
Expand All @@ -234,7 +232,7 @@ int twrpback::backup(std::string command) {
struct twfilehdr twfilehdr;

adblogwrite("Writing TWFN\n");
adb_md5.initMD5();
digest.init();

ADBSTRUCT_STATIC_ASSERT(sizeof(twfilehdr) == MAX_ADB_READ);

Expand Down Expand Up @@ -269,8 +267,7 @@ int twrpback::backup(std::string command) {
totalbytes += bytes;
char *writeresult = new char [bytes];
memcpy(writeresult, result, bytes);
if (adb_md5.updateMD5stream((unsigned char *) writeresult, bytes) == -1)
adblogwrite("failed to update md5 stream\n");
digest.update((unsigned char *) writeresult, bytes);
if (fwrite(writeresult, 1, bytes, adbd_fp) != bytes) {
adblogwrite("Error writing backup data to adbd\n");
close_backup_fds();
Expand All @@ -290,18 +287,16 @@ int twrpback::backup(std::string command) {
close_backup_fds();
return -1;
}
if (adb_md5.updateMD5stream((unsigned char *) padding, sizeof(padding)) == -1)
adblogwrite("failed to update md5 stream\n");
digest.update((unsigned char *) padding, sizeof(padding));
fflush(adbd_fp);
totalbytes = 0;
}

AdbBackupFileTrailer md5trailer;

memset(&md5trailer, 0, sizeof(md5trailer));
adb_md5.finalizeMD5stream();

std::string md5string = adb_md5.createMD5string();
std::string md5string = digest.return_digest_string();

strncpy(md5trailer.start_of_trailer, TWRP, sizeof(md5trailer.start_of_trailer));
strncpy(md5trailer.type, MD5TRAILER, sizeof(md5trailer.type));
Expand Down Expand Up @@ -350,8 +345,7 @@ int twrpback::backup(std::string command) {
char *writeresult = new char [bytes];
memcpy(writeresult, result, bytes);

if (adb_md5.updateMD5stream((unsigned char *) writeresult, bytes) == -1)
adblogwrite("failed to update md5 stream\n");
digest.update((unsigned char *) writeresult, bytes);

totalbytes += bytes;
dataChunkBytes += bytes;
Expand Down Expand Up @@ -399,7 +393,8 @@ int twrpback::backup(std::string command) {
}

int twrpback::restore(void) {
twrpDigest adb_md5;
twrpMD5 digest;
char cmd[MAX_ADB_READ];
char result[MAX_ADB_READ];
struct AdbBackupControlType structcmd;
int adb_control_twrp_fd, errctr = 0;
Expand Down Expand Up @@ -591,8 +586,8 @@ int twrpback::restore(void) {
struct twfilehdr twimghdr;
uint32_t crc, twimghdrcrc;

digest.init();
totalbytes -= sizeof(result);
adb_md5.initMD5();
adblogwrite("Restoring TWIMG\n");
memset(&twimghdr, 0, sizeof(twimghdr));
memcpy(&twimghdr, result, sizeof(result));
Expand Down Expand Up @@ -623,9 +618,9 @@ int twrpback::restore(void) {
else if (cmdtype == TWFN) {
struct twfilehdr twfilehdr;
uint32_t crc, twfilehdrcrc;
digest.init();

totalbytes -= sizeof(result);
adb_md5.initMD5();
adblogwrite("Restoring TWFN\n");
memset(&twfilehdr, 0, sizeof(twfilehdr));
memcpy(&twfilehdr, result, sizeof(result));
Expand Down Expand Up @@ -703,15 +698,13 @@ int twrpback::restore(void) {
close_restore_fds();
return -1;
}
adblogwrite("md5 finalize stream\n");
adb_md5.finalizeMD5stream();

AdbBackupFileTrailer md5;

memset(&md5, 0, sizeof(md5));
strncpy(md5.start_of_trailer, TWRP, sizeof(md5.start_of_trailer));
strncpy(md5.type, TWMD5, sizeof(md5.type));
std::string md5string = adb_md5.createMD5string();
std::string md5string = digest.return_digest_string();
strncpy(md5.md5, md5string.c_str(), sizeof(md5.md5));

adblogwrite("Sending MD5Check\n");
Expand All @@ -726,8 +719,7 @@ int twrpback::restore(void) {
break;
}
}
if (adb_md5.updateMD5stream((unsigned char*)result, sizeof(result)) == -1)
adblogwrite("failed to update md5 stream\n");
digest.update((unsigned char*)result, sizeof(result));
dataChunkBytes += readbytes;

if (write(adb_write_fd, result, sizeof(result)) < 0) {
Expand Down
14 changes: 11 additions & 3 deletions data.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -679,14 +679,14 @@ void DataManager::SetDefaultValues()

mPersist.SetValue(TW_INSTALL_REBOOT_VAR, "0");
mPersist.SetValue(TW_SIGNED_ZIP_VERIFY_VAR, "0");
mPersist.SetValue(TW_FORCE_MD5_CHECK_VAR, "0");
mPersist.SetValue(TW_DISABLE_FREE_SPACE_VAR, "0");
mPersist.SetValue(TW_FORCE_DIGEST_CHECK_VAR, "0");
mPersist.SetValue(TW_USE_COMPRESSION_VAR, "0");
mPersist.SetValue(TW_TIME_ZONE_VAR, "CST6CDT,M3.2.0,M11.1.0");
mPersist.SetValue(TW_GUI_SORT_ORDER, "1");
mPersist.SetValue(TW_RM_RF_VAR, "0");
mPersist.SetValue(TW_SKIP_MD5_CHECK_VAR, "0");
mPersist.SetValue(TW_SKIP_MD5_GENERATE_VAR, "0");
mPersist.SetValue(TW_SKIP_DIGEST_CHECK_VAR, "0");
mPersist.SetValue(TW_SKIP_DIGEST_GENERATE_VAR, "0");
mPersist.SetValue(TW_SDEXT_SIZE, "0");
mPersist.SetValue(TW_SWAP_SIZE, "0");
mPersist.SetValue(TW_SDPART_FILE_SYSTEM, "ext3");
Expand All @@ -708,6 +708,14 @@ void DataManager::SetDefaultValues()
mData.SetValue("tw_background_thread_running", "0");
mData.SetValue(TW_RESTORE_FILE_DATE, "0");
mPersist.SetValue("tw_military_time", "0");

#ifdef TW_INCLUDE_CRYPTO
mConst.SetValue(TW_USE_SHA2, "1");
mConst.SetValue(TW_NO_SHA2, "0");
#else
mConst.SetValue(TW_NO_SHA2, "1");
#endif

#ifdef TW_NO_SCREEN_TIMEOUT
mConst.SetValue("tw_screen_timeout_secs", "0");
mConst.SetValue("tw_no_screen_timeout", "1");
Expand Down
2 changes: 1 addition & 1 deletion gui/pages.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -52,7 +52,7 @@ extern "C" {
#include "blanktimer.hpp"

// version 2 requires theme to handle power button as action togglebacklight
#define TW_THEME_VERSION 2
#define TW_THEME_VERSION 3

#define TW_THEME_VER_ERR -2

Expand Down
16 changes: 8 additions & 8 deletions gui/theme/common/landscape.xml
Original file line number Diff line number Diff line change
Expand Up @@ -1676,8 +1676,8 @@

<checkbox>
<placement x="%col1_x_right%" y="%row7a_y%"/>
<text>{@skip_md5_backup_chk=Skip MD5 generation during backup}</text>
<data variable="tw_skip_md5_generate"/>
<text>{@skip_digest_backup_chk=Skip Digest generation during backup}</text>
<data variable="tw_skip_digest_generate"/>
</checkbox>

<checkbox>
Expand Down Expand Up @@ -2272,8 +2272,8 @@

<checkbox>
<placement x="%col1_x_right%" y="%row6_y%"/>
<text>{@restore_enable_md5_chk=Enable MD5 Verification of Backup Files}</text>
<data variable="tw_skip_md5_check"/>
<text>{@restore_enable_digest_chk=Enable Digest Verification of Backup Files}</text>
<data variable="tw_skip_digest_check"/>
</checkbox>

<button style="main_button_half_width">
Expand Down Expand Up @@ -2866,11 +2866,11 @@
<listitem name="{@disable_backup_space_chk=Disable free space check before backup}">
<data variable="tw_disable_free_space"/>
</listitem>
<listitem name="{@skip_md5_backup_chk=Skip MD5 generation during backup}">
<data variable="tw_skip_md5_generate"/>
<listitem name="{@skip_digest_backup_chk=Skip Digest generation during backup}">
<data variable="tw_skip_digest_generate"/>
</listitem>
<listitem name="{@restore_enable_md5_chk=Enable MD5 verification of backup files}">
<data variable="tw_skip_md5_check"/>
<listitem name="{@restore_enable_digest_chk=Enable Digest verification of backup files}">
<data variable="tw_skip_digest_check"/>
</listitem>
<listitem name="{@use24clock_chk=Use 24-hour clock}">
<data variable="tw_military_time"/>
Expand Down
36 changes: 18 additions & 18 deletions gui/theme/common/languages/cz.xml
Original file line number Diff line number Diff line change
Expand Up @@ -199,7 +199,7 @@
<string name="enc_disabled">zakázané - pro povolení zadejte heslo</string>
<string name="enc_enabled">povolené</string>
<string name="enable_backup_comp_chk">Povolit kompresi</string>
<string name="skip_md5_backup_chk">Vynechat generovaní MD5 během zálohy</string>
<string name="skip_digest_backup_chk" version="2">Vynechat generovaní Digest během zálohy</string>
<string name="disable_backup_space_chk">Nekontrolovat volné místo</string>
<string name="refresh_sizes_btn">Obnovit velikosti</string>
<string name="swipe_backup">Potáhnout pro zálohu</string>
Expand Down Expand Up @@ -232,7 +232,7 @@
<string name="restore_try_decrypt_s">Pokus o dešifrovaní</string>
<string name="restore_backup_date">Záloha hotová %tw_restore_file_date%</string>
<string name="restore_sel_part">Vybrat oddíl pro obnovu:</string>
<string name="restore_enable_md5_chk">Povolit kontrolu MD5 na zálohovaných souborech</string>
<string name="restore_enable_digest_chk" version="2">Povolit kontrolu Digest na zálohovaných souborech</string>
<string name="restore_complete">Obnova dokočená</string>
<string name="swipe_restore">Potáhnout pro obnovu</string>
<string name="swipe_restore_s"> Obnovit</string>
Expand Down Expand Up @@ -458,11 +458,11 @@
<string name="mtp_crash">MTP selhalo, MTP nebude spuštěné při startu.</string>
<string name="decrypt_success">Úspešně dešifrované s přednastaveným heslem.</string>
<string name="unable_to_decrypt">Nelze dešifrovat s přednastaveným heslem. Možná budete muset naformátovat Data.</string>
<string name="generating_md51">Generuje se MD5</string>
<string name="generating_md52"> *Generuje se Md5...</string>
<string name="md5_created"> *MD5 vygenerované.</string>
<string name="md5_error"> * chyba MD5!</string>
<string name="md5_compute_error"> * chyba při výpočtu MD5.</string>
<string name="generating_digest1" version="2">Generuje se Digest</string>
<string name="generating_digest2" version="2"> *Generuje se Digest...</string>
<string name="digest_created" version="2"> *Digest vygenerované.</string>
<string name="digest_error" version="2"> * chyba Digest!</string>
<string name="digest_compute_error" version="2"> * chyba při výpočtu Digest.</string>
<string name="current_date">(Aktuální datum)</string>
<string name="auto_generate">(Generovat automaticky)</string>
<string name="unable_to_locate_partition">Nelze najít oddíl \'{1}\' pro výpočet zálohy.</string>
Expand All @@ -481,8 +481,8 @@
<string name="backup_completed">[ZÁLOHA DOKONČENÁ ZA {1} SEKUND]</string>
<string name="restore_started">[ZAČÁTEK OBNOVY]</string>
<string name="restore_folder">Obnovit adresář: \'{1}\'</string>
<string name="verifying_md5">Kontrolování MD5</string>
<string name="skip_md5">Vynechání kontroly MD5 na základě uživatelského nastavení.</string>
<string name="verifying_digest" version="2">Kontrolování Digest</string>
<string name="skip_digest" version="2">Vynechání kontroly Digest na základě uživatelského nastavení.</string>
<string name="calc_restore">Počítání detailů obnovy...</string>
<string name="restore_read_only">Nelze obnovit {1} -- připojené jen na čtení.</string>
<string name="restore_unable_locate">Nelze najít oddíl \'{1}\' pro obnovu.</string>
Expand Down Expand Up @@ -540,9 +540,9 @@
<string name="cannot_resize">Nelze natáhnout {1}.</string>
<string name="repair_resize">Opravování {1} před natáhnutím.</string>
<string name="unable_resize">Nelze natáhnout {1}.</string>
<string name="no_md5_found">Soubor MD5 se nenašel pro \'{1}\'. Prosím zvolte Vypnout kontrolu MD5 během obnovy.</string>
<string name="md5_fail_match">MD5 neodpovídá souboru \'{1}\'.</string>
<string name="md5_matched">MD5 matched for '{1}'.</string>
<string name="no_digest_found" version="2">Soubor Digest se nenašel pro \'{1}\'. Prosím zvolte Vypnout kontrolu Digest během obnovy.</string>
<string name="digest_fail_match" version="2">Digest neodpovídá souboru \'{1}\'.</string>
<string name="digest_matched" version="2">Digest matched for '{1}'.</string>
<string name="fail_decrypt_tar">Nelze dešifrovat soubor tar \'{1}\'</string>
<string name="format_data_msg">Měli by jste restartovat recovery aby jste mohli znova používat /data.</string>
<string name="format_data_err">Nelze formátovat pro zrušení šifrování.</string>
Expand All @@ -563,7 +563,7 @@
<string name="backup_folder_set">Adresář záloh nastavený na: \'{1}\'</string>
<string name="locate_backup_err">Zálohu \'{1}\' nelze najít</string>
<string name="set_restore_opt">Nastavení možností obnovy: \'{1}\':</string>
<string name="md5_check_skip">Vynechání kontroly MD5 zapnuté</string>
<string name="digest_check_skip" version="2">Vynechání kontroly Digest zapnuté</string>
<string name="ors_encrypt_restore_err">Nelze použít OpenRecoveryScript na obnovu zašifrované zálohy.</string>
<string name="mounting">Připojení</string>
<string name="unmounting">Odpojení</string>
Expand All @@ -584,23 +584,23 @@
<string name="installing_zip">Instalace zip souboru \'{1}\'</string>
<string name="select_backup_opt">Nastavení možností zálohy:</string>
<string name="comprossion_on">Komprese zapnutá</string>
<string name="md5_off">Generovaní MD5 vypnuté</string>
<string name="digest_off" version="2">Generovaní Digest vypnuté</string>
<string name="backup_fail">Zálohování selhalo</string>
<string name="backup_clean">Zálohování selhalo. Čistění adresáře záloh.</string>
<string name="running_recovery_commands">Spouštění příkazů recovery</string>
<string name="recovery_commands_complete">Příkazy recovery dokončeno</string>
<string name="running_ors">Spouštění OpenRecoveryScript</string>
<string name="ors_complete">OpenRecoveryScript dokončený</string>
<string name="no_updater_binary">Nelze nájít \'{1}\' v souboru zip.</string>
<string name="check_for_md5">Kontrola MD5 souboru...</string>
<string name="check_for_digest" version="2">Kontrola Digest souboru...</string>
<string name="fail_sysmap">Nelze namapovat soubor \'{1}\'</string>
<string name="verify_zip_sig">Ověřování podpisu zip souboru...</string>
<string name="verify_zip_fail">Ověřování podpisu zip souboru selhalo!</string>
<string name="verify_zip_done">Podpis souboru zip úspešně ověřený.</string>
<string name="zip_corrupt">Soubor zip je poškozený!</string>
<string name="no_md5">Vynechání kontroly MD5: soubor s MD5 nenalezen</string>
<string name="md5_fail">MD5 nesedí</string>
<string name="md5_match">MD5 sedí</string>
<string name="no_digest" version="2">Vynechání kontroly Digest: soubor s Digest nenalezen</string>
<string name="digest_fail" version="2">Digest nesedí</string>
<string name="digest_match" version="2">Digest sedí</string>
<string name="pid_signal">Proces {1} skončil se signálem: {2}</string>
<string name="pid_error">Proces {1} skončil s CHYBOU: {2}</string>
<string name="install_dumlock">Instalování HTC Dumlock do systému...</string>
Expand Down
Loading

0 comments on commit 56cf564

Please sign in to comment.