Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit c48cb5e5 authored by Sen Jiang's avatar Sen Jiang
Browse files

Switch from mincrypt to BoringSSL in applypatch and updater.

Bug: 18790686
Change-Id: I7d2136fb39b2266f5ae5be24819c617b08a6c21e
parent e3434279
Loading
Loading
Loading
Loading
+4 −4
Original line number Diff line number Diff line
@@ -21,7 +21,7 @@ LOCAL_SRC_FILES := applypatch.cpp bspatch.cpp freecache.cpp imgpatch.cpp utils.c
LOCAL_MODULE := libapplypatch
LOCAL_MODULE_TAGS := eng
LOCAL_C_INCLUDES += bootable/recovery
LOCAL_STATIC_LIBRARIES += libbase libmtdutils libmincrypt libbz libz
LOCAL_STATIC_LIBRARIES += libbase libmtdutils libcrypto_static libbz libz

include $(BUILD_STATIC_LIBRARY)

@@ -32,7 +32,7 @@ LOCAL_SRC_FILES := bspatch.cpp imgpatch.cpp utils.cpp
LOCAL_MODULE := libimgpatch
LOCAL_C_INCLUDES += bootable/recovery
LOCAL_EXPORT_C_INCLUDE_DIRS := $(LOCAL_PATH)/include
LOCAL_STATIC_LIBRARIES += libmincrypt libbz libz
LOCAL_STATIC_LIBRARIES += libcrypto_static libbz libz

include $(BUILD_STATIC_LIBRARY)

@@ -44,7 +44,7 @@ LOCAL_SRC_FILES := bspatch.cpp imgpatch.cpp utils.cpp
LOCAL_MODULE := libimgpatch
LOCAL_C_INCLUDES += bootable/recovery
LOCAL_EXPORT_C_INCLUDE_DIRS := $(LOCAL_PATH)/include
LOCAL_STATIC_LIBRARIES += libmincrypt libbz libz
LOCAL_STATIC_LIBRARIES += libcrypto_static libbz libz

include $(BUILD_HOST_STATIC_LIBRARY)
endif  # HOST_OS == linux
@@ -55,7 +55,7 @@ LOCAL_CLANG := true
LOCAL_SRC_FILES := main.cpp
LOCAL_MODULE := applypatch
LOCAL_C_INCLUDES += bootable/recovery
LOCAL_STATIC_LIBRARIES += libapplypatch libbase libmtdutils libmincrypt libbz
LOCAL_STATIC_LIBRARIES += libapplypatch libbase libmtdutils libcrypto_static libbz
LOCAL_SHARED_LIBRARIES += libz libcutils libc

include $(BUILD_EXECUTABLE)
+23 −24
Original line number Diff line number Diff line
@@ -27,7 +27,7 @@

#include <android-base/strings.h>

#include "mincrypt/sha.h"
#include "openssl/sha.h"
#include "applypatch.h"
#include "mtdutils/mtdutils.h"
#include "edify/expr.h"
@@ -41,7 +41,7 @@ static int GenerateTarget(FileContents* source_file,
                          const Value* copy_patch_value,
                          const char* source_filename,
                          const char* target_filename,
                          const uint8_t target_sha1[SHA_DIGEST_SIZE],
                          const uint8_t target_sha1[SHA_DIGEST_LENGTH],
                          size_t target_size,
                          const Value* bonus_data);

@@ -86,7 +86,7 @@ int LoadFileContents(const char* filename, FileContents* file) {
    }
    fclose(f);

    SHA_hash(file->data, file->size, file->sha1);
    SHA1(file->data, file->size, file->sha1);
    return 0;
}

@@ -181,8 +181,8 @@ static int LoadPartitionContents(const char* filename, FileContents* file) {
    }

    SHA_CTX sha_ctx;
    SHA_init(&sha_ctx);
    uint8_t parsed_sha[SHA_DIGEST_SIZE];
    SHA1_Init(&sha_ctx);
    uint8_t parsed_sha[SHA_DIGEST_LENGTH];

    // Allocate enough memory to hold the largest size.
    file->data = reinterpret_cast<unsigned char*>(malloc(size[index[pairs-1]]));
@@ -212,7 +212,7 @@ static int LoadPartitionContents(const char* filename, FileContents* file) {
                file->data = NULL;
                return -1;
            }
            SHA_update(&sha_ctx, p, read);
            SHA1_Update(&sha_ctx, p, read);
            file->size += read;
        }

@@ -220,7 +220,8 @@ static int LoadPartitionContents(const char* filename, FileContents* file) {
        // check it against this pair's expected hash.
        SHA_CTX temp_ctx;
        memcpy(&temp_ctx, &sha_ctx, sizeof(SHA_CTX));
        const uint8_t* sha_so_far = SHA_final(&temp_ctx);
        uint8_t sha_so_far[SHA_DIGEST_LENGTH];
        SHA1_Final(sha_so_far, &temp_ctx);

        if (ParseSha1(sha1sum[index[i]].c_str(), parsed_sha) != 0) {
            printf("failed to parse sha1 %s in %s\n", sha1sum[index[i]].c_str(), filename);
@@ -229,7 +230,7 @@ static int LoadPartitionContents(const char* filename, FileContents* file) {
            return -1;
        }

        if (memcmp(sha_so_far, parsed_sha, SHA_DIGEST_SIZE) == 0) {
        if (memcmp(sha_so_far, parsed_sha, SHA_DIGEST_LENGTH) == 0) {
            // we have a match.  stop reading the partition; we'll return
            // the data we've read so far.
            printf("partition read matched size %zu sha %s\n",
@@ -260,10 +261,7 @@ static int LoadPartitionContents(const char* filename, FileContents* file) {
        return -1;
    }

    const uint8_t* sha_final = SHA_final(&sha_ctx);
    for (size_t i = 0; i < SHA_DIGEST_SIZE; ++i) {
        file->sha1[i] = sha_final[i];
    }
    SHA1_Final(file->sha1, &sha_ctx);

    // Fake some stat() info.
    file->st.st_mode = 0644;
@@ -494,7 +492,7 @@ int WriteToPartition(unsigned char* data, size_t len, const char* target) {
int ParseSha1(const char* str, uint8_t* digest) {
    const char* ps = str;
    uint8_t* pd = digest;
    for (int i = 0; i < SHA_DIGEST_SIZE * 2; ++i, ++ps) {
    for (int i = 0; i < SHA_DIGEST_LENGTH * 2; ++i, ++ps) {
        int digit;
        if (*ps >= '0' && *ps <= '9') {
            digit = *ps - '0';
@@ -521,10 +519,10 @@ int ParseSha1(const char* str, uint8_t* digest) {
// found.
int FindMatchingPatch(uint8_t* sha1, char* const * const patch_sha1_str,
                      int num_patches) {
    uint8_t patch_sha1[SHA_DIGEST_SIZE];
    uint8_t patch_sha1[SHA_DIGEST_LENGTH];
    for (int i = 0; i < num_patches; ++i) {
        if (ParseSha1(patch_sha1_str[i], patch_sha1) == 0 &&
            memcmp(patch_sha1, sha1, SHA_DIGEST_SIZE) == 0) {
            memcmp(patch_sha1, sha1, SHA_DIGEST_LENGTH) == 0) {
            return i;
        }
    }
@@ -670,7 +668,7 @@ int applypatch(const char* source_filename,
        target_filename = source_filename;
    }

    uint8_t target_sha1[SHA_DIGEST_SIZE];
    uint8_t target_sha1[SHA_DIGEST_LENGTH];
    if (ParseSha1(target_sha1_str, target_sha1) != 0) {
        printf("failed to parse tgt-sha1 \"%s\"\n", target_sha1_str);
        return 1;
@@ -685,7 +683,7 @@ int applypatch(const char* source_filename,

    // We try to load the target file into the source_file object.
    if (LoadFileContents(target_filename, &source_file) == 0) {
        if (memcmp(source_file.sha1, target_sha1, SHA_DIGEST_SIZE) == 0) {
        if (memcmp(source_file.sha1, target_sha1, SHA_DIGEST_LENGTH) == 0) {
            // The early-exit case:  the patch was already applied, this file
            // has the desired hash, nothing for us to do.
            printf("already %s\n", short_sha1(target_sha1).c_str());
@@ -756,7 +754,7 @@ int applypatch_flash(const char* source_filename, const char* target_filename,
                     const char* target_sha1_str, size_t target_size) {
    printf("flash %s: ", target_filename);

    uint8_t target_sha1[SHA_DIGEST_SIZE];
    uint8_t target_sha1[SHA_DIGEST_LENGTH];
    if (ParseSha1(target_sha1_str, target_sha1) != 0) {
        printf("failed to parse tgt-sha1 \"%s\"\n", target_sha1_str);
        return 1;
@@ -777,7 +775,7 @@ int applypatch_flash(const char* source_filename, const char* target_filename,
    pieces.push_back(target_sha1_str);
    std::string fullname = android::base::Join(pieces, ':');
    if (LoadPartitionContents(fullname.c_str(), &source_file) == 0 &&
        memcmp(source_file.sha1, target_sha1, SHA_DIGEST_SIZE) == 0) {
        memcmp(source_file.sha1, target_sha1, SHA_DIGEST_LENGTH) == 0) {
        // The early-exit case: the image was already applied, this partition
        // has the desired hash, nothing for us to do.
        printf("already %s\n", short_sha1(target_sha1).c_str());
@@ -786,7 +784,7 @@ int applypatch_flash(const char* source_filename, const char* target_filename,
    }

    if (LoadFileContents(source_filename, &source_file) == 0) {
        if (memcmp(source_file.sha1, target_sha1, SHA_DIGEST_SIZE) != 0) {
        if (memcmp(source_file.sha1, target_sha1, SHA_DIGEST_LENGTH) != 0) {
            // The source doesn't have desired checksum.
            printf("source \"%s\" doesn't have expected sha1 sum\n", source_filename);
            printf("expected: %s, found: %s\n", short_sha1(target_sha1).c_str(),
@@ -812,7 +810,7 @@ static int GenerateTarget(FileContents* source_file,
                          const Value* copy_patch_value,
                          const char* source_filename,
                          const char* target_filename,
                          const uint8_t target_sha1[SHA_DIGEST_SIZE],
                          const uint8_t target_sha1[SHA_DIGEST_LENGTH],
                          size_t target_size,
                          const Value* bonus_data) {
    int retry = 1;
@@ -957,7 +955,7 @@ static int GenerateTarget(FileContents* source_file,
        char* header = patch->data;
        ssize_t header_bytes_read = patch->size;

        SHA_init(&ctx);
        SHA1_Init(&ctx);

        int result;

@@ -1001,8 +999,9 @@ static int GenerateTarget(FileContents* source_file,
        }
    } while (retry-- > 0);

    const uint8_t* current_target_sha1 = SHA_final(&ctx);
    if (memcmp(current_target_sha1, target_sha1, SHA_DIGEST_SIZE) != 0) {
    uint8_t current_target_sha1[SHA_DIGEST_LENGTH];
    SHA1_Final(current_target_sha1, &ctx);
    if (memcmp(current_target_sha1, target_sha1, SHA_DIGEST_LENGTH) != 0) {
        printf("patch did not produce expected sha1\n");
        return 1;
    } else {
+3 −3
Original line number Diff line number Diff line
@@ -18,16 +18,16 @@
#define _APPLYPATCH_H

#include <sys/stat.h>
#include "mincrypt/sha.h"
#include "openssl/sha.h"
#include "edify/expr.h"

typedef struct _Patch {
  uint8_t sha1[SHA_DIGEST_SIZE];
  uint8_t sha1[SHA_DIGEST_LENGTH];
  const char* patch_filename;
} Patch;

typedef struct _FileContents {
  uint8_t sha1[SHA_DIGEST_SIZE];
  uint8_t sha1[SHA_DIGEST_LENGTH];
  unsigned char* data;
  ssize_t size;
  struct stat st;
+2 −2
Original line number Diff line number Diff line
@@ -30,7 +30,7 @@

#include <bzlib.h>

#include "mincrypt/sha.h"
#include "openssl/sha.h"
#include "applypatch.h"

void ShowBSDiffLicense() {
@@ -114,7 +114,7 @@ int ApplyBSDiffPatch(const unsigned char* old_data, ssize_t old_size,
        printf("short write of output: %d (%s)\n", errno, strerror(errno));
        return 1;
    }
    if (ctx) SHA_update(ctx, new_data, new_size);
    if (ctx) SHA1_Update(ctx, new_data, new_size);
    free(new_data);

    return 0;
+3 −3
Original line number Diff line number Diff line
@@ -26,7 +26,7 @@
#include <string.h>

#include "zlib.h"
#include "mincrypt/sha.h"
#include "openssl/sha.h"
#include "applypatch.h"
#include "imgdiff.h"
#include "utils.h"
@@ -109,7 +109,7 @@ int ApplyImagePatch(const unsigned char* old_data, ssize_t old_size,
                printf("failed to read chunk %d raw data\n", i);
                return -1;
            }
            if (ctx) SHA_update(ctx, patch->data + pos, data_len);
            if (ctx) SHA1_Update(ctx, patch->data + pos, data_len);
            if (sink((unsigned char*)patch->data + pos,
                     data_len, token) != data_len) {
                printf("failed to write chunk %d raw data\n", i);
@@ -236,7 +236,7 @@ int ApplyImagePatch(const unsigned char* old_data, ssize_t old_size,
                           (long)have);
                    return -1;
                }
                if (ctx) SHA_update(ctx, temp_data, have);
                if (ctx) SHA1_Update(ctx, temp_data, have);
            } while (ret != Z_STREAM_END);
            deflateEnd(&strm);

Loading