-
Notifications
You must be signed in to change notification settings - Fork 8
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Signed-off-by: Shaka Huang <[email protected]>
- Loading branch information
Showing
28 changed files
with
5,124 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,29 @@ | ||
CC = gcc | ||
AR = ar rcs | ||
RM = rm -f | ||
|
||
CFLAGS = -O3 | ||
LDFLAGS = -Wl | ||
|
||
all: libmincrypt.a mkbootimg unpackbootimg | ||
|
||
libmincrypt.a: | ||
make -C libmincrypt | ||
|
||
mkbootimg: mkbootimg.o | ||
$(CC) -o $@ $^ -L. -lmincrypt $(LDFLAGS) | ||
|
||
mkbootimg.o: mkbootimg.c | ||
$(CC) -o $@ $(CFLAGS) -c $< | ||
|
||
unpackbootimg: unpackbootimg.o | ||
$(CC) -o $@ $^ $(LDFLAGS) | ||
|
||
unpackbootimg.o: unpackbootimg.c | ||
$(CC) -o $@ $(CFLAGS) -c $< | ||
|
||
clean: | ||
$(RM) mkbootimg mkbootimg.o unpackbootimg unpackbootimg.o | ||
$(RM) libmincrypt.a | ||
make -C libmincrypt clean | ||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,2 +1,17 @@ | ||
# ZenFone2-boot-tools | ||
Pack and unpack boot.img or recovery.img of ZenFone2 | ||
source code from: | ||
* https://android.googlesource.com/platform/system/core/mkbootimg | ||
* https://android.googlesource.com/platform/system/core/libmincrypt | ||
* https://android.googlesource.com/platform/system/core/include/mincrypt | ||
|
||
# unpack boot.img or recovery.img | ||
$ unpackbootimg -i boot.img | ||
|
||
# pack boot.img or recovery.img | ||
$ mkbootimg --kernel boot.img-zImage \ | ||
--ramdisk boot.img-ramdisk.gz \ | ||
--cmdline "$(cat boot.img-cmdline)" \ | ||
--second boot.img-second \ | ||
--signature boot.img-signature \ | ||
-o boot.img |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,102 @@ | ||
/* tools/mkbootimg/bootimg.h | ||
** | ||
** Copyright 2007, The Android Open Source Project | ||
** | ||
** Licensed under the Apache License, Version 2.0 (the "License"); | ||
** you may not use this file except in compliance with the License. | ||
** You may obtain a copy of the License at | ||
** | ||
** http://www.apache.org/licenses/LICENSE-2.0 | ||
** | ||
** Unless required by applicable law or agreed to in writing, software | ||
** distributed under the License is distributed on an "AS IS" BASIS, | ||
** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||
** See the License for the specific language governing permissions and | ||
** limitations under the License. | ||
*/ | ||
|
||
#ifndef _BOOT_IMAGE_H_ | ||
#define _BOOT_IMAGE_H_ | ||
|
||
typedef struct boot_img_hdr boot_img_hdr; | ||
|
||
#define BOOT_MAGIC "ANDROID!" | ||
#define BOOT_MAGIC_SIZE 8 | ||
#define BOOT_NAME_SIZE 16 | ||
#define BOOT_ARGS_SIZE 512 | ||
#define BOOT_EXTRA_ARGS_SIZE 1024 | ||
|
||
struct boot_img_hdr | ||
{ | ||
unsigned char magic[BOOT_MAGIC_SIZE]; | ||
|
||
unsigned kernel_size; /* size in bytes */ | ||
unsigned kernel_addr; /* physical load addr */ | ||
|
||
unsigned ramdisk_size; /* size in bytes */ | ||
unsigned ramdisk_addr; /* physical load addr */ | ||
|
||
unsigned second_size; /* size in bytes */ | ||
unsigned second_addr; /* physical load addr */ | ||
|
||
unsigned tags_addr; /* physical addr for kernel tags */ | ||
unsigned page_size; /* flash page size we assume */ | ||
unsigned unused[2]; /* future expansion: should be 0 */ | ||
|
||
unsigned char name[BOOT_NAME_SIZE]; /* asciiz product name */ | ||
|
||
unsigned char cmdline[BOOT_ARGS_SIZE]; | ||
|
||
unsigned id[8]; /* timestamp / checksum / sha1 / etc */ | ||
|
||
/* Supplemental command line data; kept here to maintain | ||
* binary compatibility with older versions of mkbootimg */ | ||
unsigned char extra_cmdline[BOOT_EXTRA_ARGS_SIZE]; | ||
}; | ||
|
||
/* | ||
** +-----------------+ | ||
** | boot header | 1 page | ||
** +-----------------+ | ||
** | kernel | n pages | ||
** +-----------------+ | ||
** | ramdisk | m pages | ||
** +-----------------+ | ||
** | second stage | o pages | ||
** +-----------------+ | ||
** | ||
** n = (kernel_size + page_size - 1) / page_size | ||
** m = (ramdisk_size + page_size - 1) / page_size | ||
** o = (second_size + page_size - 1) / page_size | ||
** | ||
** 0. all entities are page_size aligned in flash | ||
** 1. kernel and ramdisk are required (size != 0) | ||
** 2. second is optional (second_size == 0 -> no second) | ||
** 3. load each element (kernel, ramdisk, second) at | ||
** the specified physical address (kernel_addr, etc) | ||
** 4. prepare tags at tag_addr. kernel_args[] is | ||
** appended to the kernel commandline in the tags. | ||
** 5. r0 = 0, r1 = MACHINE_TYPE, r2 = tags_addr | ||
** 6. if second_size != 0: jump to second_addr | ||
** else: jump to kernel_addr | ||
*/ | ||
|
||
#if 0 | ||
typedef struct ptentry ptentry; | ||
|
||
struct ptentry { | ||
char name[16]; /* asciiz partition name */ | ||
unsigned start; /* starting block number */ | ||
unsigned length; /* length in blocks */ | ||
unsigned flags; /* set to zero */ | ||
}; | ||
|
||
/* MSM Partition Table ATAG | ||
** | ||
** length: 2 + 7 * n | ||
** atag: 0x4d534d70 | ||
** <ptentry> x n | ||
*/ | ||
#endif | ||
|
||
#endif |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,18 @@ | ||
# Copyright 2008 The Android Open Source Project | ||
# | ||
LOCAL_PATH := $(call my-dir) | ||
|
||
include $(CLEAR_VARS) | ||
LOCAL_MODULE := libmincrypt | ||
LOCAL_SRC_FILES := dsa_sig.c p256.c p256_ec.c p256_ecdsa.c rsa.c sha.c sha256.c | ||
LOCAL_CFLAGS := -Wall -Werror | ||
include $(BUILD_STATIC_LIBRARY) | ||
|
||
include $(CLEAR_VARS) | ||
LOCAL_MODULE := libmincrypt | ||
LOCAL_SRC_FILES := dsa_sig.c p256.c p256_ec.c p256_ecdsa.c rsa.c sha.c sha256.c | ||
LOCAL_CFLAGS := -Wall -Werror | ||
include $(BUILD_HOST_STATIC_LIBRARY) | ||
|
||
include $(LOCAL_PATH)/tools/Android.mk \ | ||
$(LOCAL_PATH)/test/Android.mk |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,21 @@ | ||
CC = gcc | ||
AR = ar rcs | ||
RM = rm -f | ||
CP = cp | ||
|
||
CFLAGS = -O3 | ||
LIB = libmincrypt.a | ||
LIB_OBJS = rsa.o sha.o sha256.o | ||
INC = -I.. | ||
|
||
all:$(LIB) | ||
|
||
clean: | ||
$(RM) $(LIB_OBJS) $(LIB) | ||
|
||
$(LIB): $(LIB_OBJS) | ||
$(AR) $@ $^ | ||
$(CP) $@ .. | ||
|
||
%.o: %.c | ||
$(CC) -o $@ $(CFLAGS) -c $< $(INC) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,23 @@ | ||
Copyright 2008, The Android Open Source Project | ||
|
||
Redistribution and use in source and binary forms, with or without | ||
modification, are permitted provided that the following conditions are met: | ||
* Redistributions of source code must retain the above copyright | ||
notice, this list of conditions and the following disclaimer. | ||
* Redistributions in binary form must reproduce the above copyright | ||
notice, this list of conditions and the following disclaimer in the | ||
documentation and/or other materials provided with the distribution. | ||
* Neither the name of Google Inc. nor the names of its contributors may | ||
be used to endorse or promote products derived from this software | ||
without specific prior written permission. | ||
|
||
THIS SOFTWARE IS PROVIDED BY Google Inc. ``AS IS'' AND ANY EXPRESS OR | ||
IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF | ||
MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO | ||
EVENT SHALL Google Inc. BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, | ||
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, | ||
PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; | ||
OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, | ||
WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR | ||
OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF | ||
ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,126 @@ | ||
/* | ||
* Copyright 2013 The Android Open Source Project | ||
* | ||
* Redistribution and use in source and binary forms, with or without | ||
* modification, are permitted provided that the following conditions are met: | ||
* * Redistributions of source code must retain the above copyright | ||
* notice, this list of conditions and the following disclaimer. | ||
* * Redistributions in binary form must reproduce the above copyright | ||
* notice, this list of conditions and the following disclaimer in the | ||
* documentation and/or other materials provided with the distribution. | ||
* * Neither the name of Google Inc. nor the names of its contributors may | ||
* be used to endorse or promote products derived from this software | ||
* without specific prior written permission. | ||
* | ||
* THIS SOFTWARE IS PROVIDED BY Google Inc. ``AS IS'' AND ANY EXPRESS OR | ||
* IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF | ||
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO | ||
* EVENT SHALL Google Inc. BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, | ||
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, | ||
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; | ||
* OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, | ||
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR | ||
* OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF | ||
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | ||
*/ | ||
|
||
#include <string.h> | ||
|
||
#include "mincrypt/dsa_sig.h" | ||
#include "mincrypt/p256.h" | ||
|
||
/** | ||
* Trims off the leading zero bytes and copy it to a buffer aligning it to the end. | ||
*/ | ||
static inline int trim_to_p256_bytes(unsigned char dst[P256_NBYTES], unsigned char *src, | ||
int src_len) { | ||
int dst_offset; | ||
while (*src == '\0' && src_len > 0) { | ||
src++; | ||
src_len--; | ||
} | ||
if (src_len > P256_NBYTES || src_len < 1) { | ||
return 0; | ||
} | ||
dst_offset = P256_NBYTES - src_len; | ||
memset(dst, 0, dst_offset); | ||
memcpy(dst + dst_offset, src, src_len); | ||
return 1; | ||
} | ||
|
||
/** | ||
* Unpacks the ASN.1 DSA signature sequence. | ||
*/ | ||
int dsa_sig_unpack(unsigned char* sig, int sig_len, p256_int* r_int, p256_int* s_int) { | ||
/* | ||
* Structure is: | ||
* 0x30 0xNN SEQUENCE + s_length | ||
* 0x02 0xNN INTEGER + r_length | ||
* 0xAA 0xBB .. r_length bytes of "r" (offset 4) | ||
* 0x02 0xNN INTEGER + s_length | ||
* 0xMM 0xNN .. s_length bytes of "s" (offset 6 + r_len) | ||
*/ | ||
int seq_len; | ||
unsigned char r_bytes[P256_NBYTES]; | ||
unsigned char s_bytes[P256_NBYTES]; | ||
int r_len; | ||
int s_len; | ||
|
||
memset(r_bytes, 0, sizeof(r_bytes)); | ||
memset(s_bytes, 0, sizeof(s_bytes)); | ||
|
||
/* | ||
* Must have at least: | ||
* 2 bytes sequence header and length | ||
* 2 bytes R integer header and length | ||
* 1 byte of R | ||
* 2 bytes S integer header and length | ||
* 1 byte of S | ||
* | ||
* 8 bytes total | ||
*/ | ||
if (sig_len < 8 || sig[0] != 0x30 || sig[2] != 0x02) { | ||
return 0; | ||
} | ||
|
||
seq_len = sig[1]; | ||
if ((seq_len <= 0) || (seq_len + 2 != sig_len)) { | ||
return 0; | ||
} | ||
|
||
r_len = sig[3]; | ||
/* | ||
* Must have at least: | ||
* 2 bytes for R header and length | ||
* 2 bytes S integer header and length | ||
* 1 byte of S | ||
*/ | ||
if ((r_len < 1) || (r_len > seq_len - 5) || (sig[4 + r_len] != 0x02)) { | ||
return 0; | ||
} | ||
s_len = sig[5 + r_len]; | ||
|
||
/** | ||
* Must have: | ||
* 2 bytes for R header and length | ||
* r_len bytes for R | ||
* 2 bytes S integer header and length | ||
*/ | ||
if ((s_len < 1) || (s_len != seq_len - 4 - r_len)) { | ||
return 0; | ||
} | ||
|
||
/* | ||
* ASN.1 encoded integers are zero-padded for positive integers. Make sure we have | ||
* a correctly-sized buffer and that the resulting integer isn't too large. | ||
*/ | ||
if (!trim_to_p256_bytes(r_bytes, &sig[4], r_len) | ||
|| !trim_to_p256_bytes(s_bytes, &sig[6 + r_len], s_len)) { | ||
return 0; | ||
} | ||
|
||
p256_from_bin(r_bytes, r_int); | ||
p256_from_bin(s_bytes, s_int); | ||
|
||
return 1; | ||
} |
Oops, something went wrong.