From fc3ae0a8367994c1564f74fa19a7850ea13023cb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E2=80=9Cwangzeyu=E2=80=9D?= <“wangzeyu38@huawei.com”> Date: Wed, 26 Jun 2024 10:32:59 +0800 Subject: [PATCH 01/12] add zip bitmap codesign MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: “wangzeyu” <“wangzeyu38@huawei.com”> --- .../com/ohos/hapsigntool/zip/EntryType.java | 26 ++++++++ .../java/com/ohos/hapsigntool/zip/Zip.java | 66 +++++++++++++++++-- .../com/ohos/hapsigntool/zip/ZipEntry.java | 10 +++ 3 files changed, 98 insertions(+), 4 deletions(-) create mode 100644 hapsigntool/hap_sign_tool_lib/src/main/java/com/ohos/hapsigntool/zip/EntryType.java diff --git a/hapsigntool/hap_sign_tool_lib/src/main/java/com/ohos/hapsigntool/zip/EntryType.java b/hapsigntool/hap_sign_tool_lib/src/main/java/com/ohos/hapsigntool/zip/EntryType.java new file mode 100644 index 00000000..136b5d61 --- /dev/null +++ b/hapsigntool/hap_sign_tool_lib/src/main/java/com/ohos/hapsigntool/zip/EntryType.java @@ -0,0 +1,26 @@ +/* + * Copyright (c) 2024-2024 Huawei Device Co., Ltd. + * 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. + */ +package com.ohos.hapsigntool.zip; + +/** + * Entry Type + * + * @since 2024/06/25 + */ +public enum EntryType { + RunnableFile, + ResourceFile, + BitMap; +} diff --git a/hapsigntool/hap_sign_tool_lib/src/main/java/com/ohos/hapsigntool/zip/Zip.java b/hapsigntool/hap_sign_tool_lib/src/main/java/com/ohos/hapsigntool/zip/Zip.java index 7ab9bdc2..6e009b3e 100644 --- a/hapsigntool/hap_sign_tool_lib/src/main/java/com/ohos/hapsigntool/zip/Zip.java +++ b/hapsigntool/hap_sign_tool_lib/src/main/java/com/ohos/hapsigntool/zip/Zip.java @@ -19,7 +19,6 @@ import com.ohos.hapsigntool.error.CustomException; import com.ohos.hapsigntool.error.ERROR; import com.ohos.hapsigntool.error.ZipException; import com.ohos.hapsigntool.utils.FileUtils; - import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; @@ -43,7 +42,7 @@ public class Zip { /** * file is uncompress file flag */ - public static final int FILE_UNCOMPRESS_METHOD_FLAG = 0; + public static final short FILE_UNCOMPRESS_METHOD_FLAG = 0; /** * max comment length @@ -64,6 +63,10 @@ public class Zip { private String file; + private int runnableNum = 0; + + private byte[] bitmap; + /** * create Zip by file * @@ -189,8 +192,13 @@ public class Zip { for (ZipEntry entry : zipEntries) { ZipEntryData zipEntryData = entry.getZipEntryData(); FileUtils.writeByteToOutFile(zipEntryData.getZipEntryHeader().toBytes(), fos); - boolean isSuccess = FileUtils.appendWriteFileByOffsetToFile(file, fos, - zipEntryData.getFileOffset(), zipEntryData.getFileSize()); + boolean isSuccess; + if (entry.getType() == EntryType.BitMap) { + isSuccess = FileUtils.writeByteToOutFile(bitmap, fos); + } else { + isSuccess = FileUtils.appendWriteFileByOffsetToFile(file, fos, + zipEntryData.getFileOffset(), zipEntryData.getFileSize()); + } if (!isSuccess) { throw new ZipException("write zip data failed"); } @@ -232,13 +240,17 @@ public class Zip { zipEntryData.getZipEntryHeader().getFileName())) { // .abc and .so file align 4096 byte. alignBytes = 4096; + entry.setType(EntryType.RunnableFile); + runnableNum++; } else if (isFirstUnRunnableFile) { // the first file after runnable file, align 4096 byte. alignBytes = 4096; isFirstUnRunnableFile = false; + entry.setType(EntryType.ResourceFile); } else { // normal file align 4 byte. alignBytes = alignment; + entry.setType(EntryType.ResourceFile); } int add = entry.alignment(alignBytes); if (add > 0) { @@ -306,6 +318,52 @@ public class Zip { eOCDOffset = offset; } + private void addBitMap(byte[] data) throws ZipException { + ZipEntry entry = new ZipEntry(); + ZipEntryData zipEntryData = new ZipEntryData(); + ZipEntryHeader zipEntryHeader = new ZipEntryHeader(); + CentralDirectory cd = new CentralDirectory(); + + cd.setVersion((short) 20); + cd.setVersionExtra((short) 20); + cd.setFlag((short) 2056); + cd.setMethod(FILE_UNCOMPRESS_METHOD_FLAG); + cd.setLastTime((short) 0); + cd.setLastDate((short) 14881); + cd.setCrc32(-279256883); + cd.setCompressedSize(data.length); + cd.setUnCompressedSize(data.length); + cd.setFileName("page.info"); + cd.setFileNameLength(9); + cd.setExtraLength(0); + cd.setCommentLength(0); + cd.setDiskNumStart(0); + cd.setInternalFile((short) 0); + cd.setExternalFile(0); + + zipEntryHeader.setVersion((short) 20); + zipEntryHeader.setFlag((short) 2056); + zipEntryHeader.setMethod(FILE_UNCOMPRESS_METHOD_FLAG); + zipEntryHeader.setLastTime((short) 0); + zipEntryHeader.setLastDate((short) 14881); + zipEntryHeader.setCrc32(0); + zipEntryHeader.setCompressedSize(data.length); + zipEntryHeader.setCompressedSize(data.length); + zipEntryHeader.setFileName("page.info"); + zipEntryHeader.setFileNameLength(9); + zipEntryHeader.setExtraData(new byte[]{}); + zipEntryHeader.setExtraLength(0); + + zipEntryData.setZipEntryHeader(zipEntryHeader); + entry.setZipEntryData(zipEntryData); + entry.setCentralDirectory(cd); + entry.alignment(4096); + zipEntries.add(runnableNum, entry); + resetOffset(); + this.bitmap = data; + resetOffset(); + } + public List getZipEntries() { return zipEntries; } diff --git a/hapsigntool/hap_sign_tool_lib/src/main/java/com/ohos/hapsigntool/zip/ZipEntry.java b/hapsigntool/hap_sign_tool_lib/src/main/java/com/ohos/hapsigntool/zip/ZipEntry.java index ff66339a..7eefd851 100644 --- a/hapsigntool/hap_sign_tool_lib/src/main/java/com/ohos/hapsigntool/zip/ZipEntry.java +++ b/hapsigntool/hap_sign_tool_lib/src/main/java/com/ohos/hapsigntool/zip/ZipEntry.java @@ -29,6 +29,8 @@ public class ZipEntry { private CentralDirectory fileEntryIncentralDirectory; + private EntryType type; + /** * alignment one entry * @@ -115,4 +117,12 @@ public class ZipEntry { public void setCentralDirectory(CentralDirectory centralDirectory) { this.fileEntryIncentralDirectory = centralDirectory; } + + public EntryType getType() { + return type; + } + + public void setType(EntryType type) { + this.type = type; + } } \ No newline at end of file -- Gitee From 4c5cc509fdb0f0733cdee56c219faeda1d2c0f0a Mon Sep 17 00:00:00 2001 From: wangzeyu Date: Fri, 28 Jun 2024 03:35:29 +0000 Subject: [PATCH 02/12] update hapsigntool/hap_sign_tool_lib/src/main/java/com/ohos/hapsigntool/zip/Zip.java. Signed-off-by: wangzeyu --- .../java/com/ohos/hapsigntool/zip/Zip.java | 76 ++++++------------- 1 file changed, 23 insertions(+), 53 deletions(-) diff --git a/hapsigntool/hap_sign_tool_lib/src/main/java/com/ohos/hapsigntool/zip/Zip.java b/hapsigntool/hap_sign_tool_lib/src/main/java/com/ohos/hapsigntool/zip/Zip.java index 6e009b3e..b2ac3ac3 100644 --- a/hapsigntool/hap_sign_tool_lib/src/main/java/com/ohos/hapsigntool/zip/Zip.java +++ b/hapsigntool/hap_sign_tool_lib/src/main/java/com/ohos/hapsigntool/zip/Zip.java @@ -19,6 +19,7 @@ import com.ohos.hapsigntool.error.CustomException; import com.ohos.hapsigntool.error.ERROR; import com.ohos.hapsigntool.error.ZipException; import com.ohos.hapsigntool.utils.FileUtils; + import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; @@ -65,8 +66,6 @@ public class Zip { private int runnableNum = 0; - private byte[] bitmap; - /** * create Zip by file * @@ -193,8 +192,10 @@ public class Zip { ZipEntryData zipEntryData = entry.getZipEntryData(); FileUtils.writeByteToOutFile(zipEntryData.getZipEntryHeader().toBytes(), fos); boolean isSuccess; - if (entry.getType() == EntryType.BitMap) { - isSuccess = FileUtils.writeByteToOutFile(bitmap, fos); + if (entry.getZipEntryData().getType() == EntryType.BitMap) { + ByteBuffer bf = ByteBuffer.wrap(entry.getZipEntryData().getData()); + bf.order(ByteOrder.LITTLE_ENDIAN); + isSuccess = FileUtils.writeByteToOutFile(bf.array(), fos); } else { isSuccess = FileUtils.appendWriteFileByOffsetToFile(file, fos, zipEntryData.getFileOffset(), zipEntryData.getFileSize()); @@ -240,19 +241,20 @@ public class Zip { zipEntryData.getZipEntryHeader().getFileName())) { // .abc and .so file align 4096 byte. alignBytes = 4096; - entry.setType(EntryType.RunnableFile); + zipEntryData.setType(EntryType.RunnableFile); runnableNum++; } else if (isFirstUnRunnableFile) { // the first file after runnable file, align 4096 byte. alignBytes = 4096; isFirstUnRunnableFile = false; - entry.setType(EntryType.ResourceFile); + zipEntryData.setType(EntryType.ResourceFile); } else { // normal file align 4 byte. alignBytes = alignment; - entry.setType(EntryType.ResourceFile); + zipEntryData.setType(EntryType.ResourceFile); } int add = entry.alignment(alignBytes); + if (add > 0) { resetOffset(); } @@ -262,6 +264,18 @@ public class Zip { } } + private void addBitMap(byte[] data) throws ZipException { + ZipEntry entry = new ZipEntry.Builder().setMethod(FILE_UNCOMPRESS_METHOD_FLAG) + .setUncompressedSize(data.length) + .setCompressedSize(data.length) + .setFileName("pages.info") + .setData(data) + .build(); + entry.alignment(4096); + zipEntries.add(runnableNum, entry); + resetOffset(); + } + /** * remove sign block */ @@ -304,6 +318,7 @@ public class Zip { long offset = 0L; long cdLength = 0L; for (ZipEntry entry : zipEntries) { + entry.updateLength(); entry.getCentralDirectory().setOffset(offset); offset += entry.getZipEntryData().getLength(); cdLength += entry.getCentralDirectory().getLength(); @@ -316,52 +331,7 @@ public class Zip { endOfCentralDirectory.setcDSize(cdLength); offset += cdLength; eOCDOffset = offset; - } - - private void addBitMap(byte[] data) throws ZipException { - ZipEntry entry = new ZipEntry(); - ZipEntryData zipEntryData = new ZipEntryData(); - ZipEntryHeader zipEntryHeader = new ZipEntryHeader(); - CentralDirectory cd = new CentralDirectory(); - - cd.setVersion((short) 20); - cd.setVersionExtra((short) 20); - cd.setFlag((short) 2056); - cd.setMethod(FILE_UNCOMPRESS_METHOD_FLAG); - cd.setLastTime((short) 0); - cd.setLastDate((short) 14881); - cd.setCrc32(-279256883); - cd.setCompressedSize(data.length); - cd.setUnCompressedSize(data.length); - cd.setFileName("page.info"); - cd.setFileNameLength(9); - cd.setExtraLength(0); - cd.setCommentLength(0); - cd.setDiskNumStart(0); - cd.setInternalFile((short) 0); - cd.setExternalFile(0); - - zipEntryHeader.setVersion((short) 20); - zipEntryHeader.setFlag((short) 2056); - zipEntryHeader.setMethod(FILE_UNCOMPRESS_METHOD_FLAG); - zipEntryHeader.setLastTime((short) 0); - zipEntryHeader.setLastDate((short) 14881); - zipEntryHeader.setCrc32(0); - zipEntryHeader.setCompressedSize(data.length); - zipEntryHeader.setCompressedSize(data.length); - zipEntryHeader.setFileName("page.info"); - zipEntryHeader.setFileNameLength(9); - zipEntryHeader.setExtraData(new byte[]{}); - zipEntryHeader.setExtraLength(0); - - zipEntryData.setZipEntryHeader(zipEntryHeader); - entry.setZipEntryData(zipEntryData); - entry.setCentralDirectory(cd); - entry.alignment(4096); - zipEntries.add(runnableNum, entry); - resetOffset(); - this.bitmap = data; - resetOffset(); + endOfCentralDirectory.setcDTotal(zipEntries.size()); } public List getZipEntries() { -- Gitee From 8e206fd203e1edc6ce77a38aafea8fa0439b14d1 Mon Sep 17 00:00:00 2001 From: wangzeyu Date: Fri, 28 Jun 2024 03:35:45 +0000 Subject: [PATCH 03/12] update hapsigntool/hap_sign_tool_lib/src/main/java/com/ohos/hapsigntool/zip/ZipEntry.java. Signed-off-by: wangzeyu --- .../com/ohos/hapsigntool/zip/ZipEntry.java | 147 +++++++++++++++++- 1 file changed, 141 insertions(+), 6 deletions(-) diff --git a/hapsigntool/hap_sign_tool_lib/src/main/java/com/ohos/hapsigntool/zip/ZipEntry.java b/hapsigntool/hap_sign_tool_lib/src/main/java/com/ohos/hapsigntool/zip/ZipEntry.java index 7eefd851..f338b300 100644 --- a/hapsigntool/hap_sign_tool_lib/src/main/java/com/ohos/hapsigntool/zip/ZipEntry.java +++ b/hapsigntool/hap_sign_tool_lib/src/main/java/com/ohos/hapsigntool/zip/ZipEntry.java @@ -18,6 +18,7 @@ package com.ohos.hapsigntool.zip; import com.ohos.hapsigntool.error.ZipException; import java.util.Arrays; +import java.util.zip.CRC32; /** * ZipEntry and CentralDirectory data @@ -29,7 +30,13 @@ public class ZipEntry { private CentralDirectory fileEntryIncentralDirectory; - private EntryType type; + /** + * updateLength + */ + public void updateLength() { + zipEntryData.updateLength(); + fileEntryIncentralDirectory.updateLength(); + } /** * alignment one entry @@ -118,11 +125,139 @@ public class ZipEntry { this.fileEntryIncentralDirectory = centralDirectory; } - public EntryType getType() { - return type; - } + public static class Builder { + private short version = 20; + + private short flag = 0; + + private short method = 0; + + private long compressedSize; + + private long unCompressedSize; + + private String fileName; + + private byte[] extraData; + + private byte[] comment; - public void setType(EntryType type) { - this.type = type; + private byte[] data; + + public Builder setVersion(short version) { + this.version = version; + return this; + } + + public Builder setFlag(short flag) { + this.flag = flag; + return this; + } + + public Builder setMethod(short method) { + this.method = method; + return this; + } + + public Builder setCompressedSize(long compressedSize) { + this.compressedSize = compressedSize; + return this; + } + + public Builder setUncompressedSize(long unCompressedSize) { + this.unCompressedSize = unCompressedSize; + return this; + } + + public Builder setFileName(String fileName) { + this.fileName = fileName; + return this; + } + + public Builder setExtraData(byte[] extraData) { + this.extraData = extraData; + return this; + } + + public Builder setComment(byte[] comment) { + this.comment = comment; + return this; + } + + public Builder setData(byte[] data) { + this.data = data; + return this; + } + + public ZipEntry build() throws ZipException { + ZipEntry entry = new ZipEntry(); + ZipEntryData zipEntryData = new ZipEntryData(); + zipEntryData.setData(data); + + ZipEntryHeader zipEntryHeader = new ZipEntryHeader(); + CentralDirectory cd = new CentralDirectory(); + + cd.setVersion(version); + cd.setVersionExtra(version); + zipEntryHeader.setVersion(version); + cd.setFlag(flag); + zipEntryHeader.setFlag(flag); + cd.setMethod(method); + zipEntryHeader.setMethod(method); + + cd.setLastTime((short) 0); + cd.setLastDate((short) 0); + zipEntryHeader.setLastTime((short) 0); + zipEntryHeader.setLastDate((short) 0); + + cd.setCrc32(-1); + zipEntryHeader.setCrc32(-1); + + cd.setCompressedSize(compressedSize); + zipEntryHeader.setCompressedSize(compressedSize); + cd.setUnCompressedSize(unCompressedSize); + zipEntryHeader.setUnCompressedSize(unCompressedSize); + + cd.setFileName(fileName); + cd.setFileNameLength(fileName.length()); + zipEntryHeader.setFileName(fileName); + zipEntryHeader.setFileNameLength(fileName.length()); + + if (extraData != null) { + cd.setExtraData(extraData); + cd.setExtraLength(extraData.length); + zipEntryHeader.setExtraData(extraData); + zipEntryHeader.setExtraLength(extraData.length); + } else { + cd.setExtraLength(0); + zipEntryHeader.setExtraLength(0); + } + if (comment != null) { + cd.setComment(comment); + cd.setCommentLength(comment.length); + } else { + cd.setCommentLength(0); + } + cd.setDiskNumStart(0); + cd.setExternalFile(0); + + cd.updateLength(); + zipEntryHeader.updateLength(); + + if (data == null) { + throw new ZipException("can not find entry data"); + } + final CRC32 c = new CRC32(); + c.update(data); + final int crc32 = new Long(c.getValue()).intValue(); + cd.setCrc32(crc32); + zipEntryHeader.setCrc32(crc32); + + zipEntryData.setZipEntryHeader(zipEntryHeader); + entry.setZipEntryData(zipEntryData); + zipEntryData.setType(EntryType.BitMap); + entry.setCentralDirectory(cd); + return entry; + } } } \ No newline at end of file -- Gitee From ab3738d37a983738d97c994c0b375c6981186e47 Mon Sep 17 00:00:00 2001 From: wangzeyu Date: Fri, 28 Jun 2024 03:35:56 +0000 Subject: [PATCH 04/12] update hapsigntool/hap_sign_tool_lib/src/main/java/com/ohos/hapsigntool/zip/CentralDirectory.java. Signed-off-by: wangzeyu --- .../java/com/ohos/hapsigntool/zip/CentralDirectory.java | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/hapsigntool/hap_sign_tool_lib/src/main/java/com/ohos/hapsigntool/zip/CentralDirectory.java b/hapsigntool/hap_sign_tool_lib/src/main/java/com/ohos/hapsigntool/zip/CentralDirectory.java index 04adc9b4..37e8d1d0 100644 --- a/hapsigntool/hap_sign_tool_lib/src/main/java/com/ohos/hapsigntool/zip/CentralDirectory.java +++ b/hapsigntool/hap_sign_tool_lib/src/main/java/com/ohos/hapsigntool/zip/CentralDirectory.java @@ -155,6 +155,13 @@ public class CentralDirectory { private int length; + /** + * updateLength + */ + public void updateLength() { + length = CD_LENGTH + fileNameLength + extraLength + commentLength; + } + /** * get Central Directory * @@ -199,7 +206,7 @@ public class CentralDirectory { bf.get(readComment); cd.setComment(readComment); } - cd.setLength(CD_LENGTH + cd.getFileNameLength() + cd.getExtraLength() + cd.getCommentLength()); + cd.updateLength(); return cd; } -- Gitee From 01c6ac44e5f986216f3b3e34c67d06966527501b Mon Sep 17 00:00:00 2001 From: wangzeyu Date: Fri, 28 Jun 2024 03:36:12 +0000 Subject: [PATCH 05/12] update hapsigntool/hap_sign_tool_lib/src/main/java/com/ohos/hapsigntool/zip/ZipEntryData.java. Signed-off-by: wangzeyu --- .../ohos/hapsigntool/zip/ZipEntryData.java | 32 +++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git a/hapsigntool/hap_sign_tool_lib/src/main/java/com/ohos/hapsigntool/zip/ZipEntryData.java b/hapsigntool/hap_sign_tool_lib/src/main/java/com/ohos/hapsigntool/zip/ZipEntryData.java index 35b19e7a..4007be31 100644 --- a/hapsigntool/hap_sign_tool_lib/src/main/java/com/ohos/hapsigntool/zip/ZipEntryData.java +++ b/hapsigntool/hap_sign_tool_lib/src/main/java/com/ohos/hapsigntool/zip/ZipEntryData.java @@ -51,6 +51,22 @@ public class ZipEntryData { return zipEntryHeader; } + private EntryType type; + + private byte[] data; + + /** + * updateLength + */ + public void updateLength() { + zipEntryHeader.updateLength(); + if (type == EntryType.BitMap) { + length = zipEntryHeader.getLength() + data.length + (dataDescriptor == null ? 0 : 16); + } else { + length = zipEntryHeader.getLength() + fileSize + (dataDescriptor == null ? 0 : 16); + } + } + /** * init zip entry by file * @@ -140,4 +156,20 @@ public class ZipEntryData { public void setLength(long length) { this.length = length; } + + public byte[] getData() { + return data; + } + + public void setData(byte[] data) { + this.data = data; + } + + public EntryType getType() { + return type; + } + + public void setType(EntryType type) { + this.type = type; + } } \ No newline at end of file -- Gitee From 9899f076514662757b5e0d90900b632ca9177ac2 Mon Sep 17 00:00:00 2001 From: wangzeyu Date: Sat, 29 Jun 2024 01:32:18 +0000 Subject: [PATCH 06/12] update hapsigntool/hap_sign_tool_lib/src/main/java/com/ohos/hapsigntool/zip/Zip.java. Signed-off-by: wangzeyu --- .../java/com/ohos/hapsigntool/zip/Zip.java | 38 +++++++++---------- 1 file changed, 17 insertions(+), 21 deletions(-) diff --git a/hapsigntool/hap_sign_tool_lib/src/main/java/com/ohos/hapsigntool/zip/Zip.java b/hapsigntool/hap_sign_tool_lib/src/main/java/com/ohos/hapsigntool/zip/Zip.java index b2ac3ac3..828543e8 100644 --- a/hapsigntool/hap_sign_tool_lib/src/main/java/com/ohos/hapsigntool/zip/Zip.java +++ b/hapsigntool/hap_sign_tool_lib/src/main/java/com/ohos/hapsigntool/zip/Zip.java @@ -64,8 +64,6 @@ public class Zip { private String file; - private int runnableNum = 0; - /** * create Zip by file * @@ -174,6 +172,12 @@ public class Zip { long fileSize = cd.getMethod() == FILE_UNCOMPRESS_METHOD_FLAG ? unCompressedSize : compressedSize; ZipEntryData zipEntryData = ZipEntryData.getZipEntry(file, offset, fileSize); + if (zipEntryData.getZipEntryHeader().getMethod() == FILE_UNCOMPRESS_METHOD_FLAG + && FileUtils.isRunnableFile(zipEntryData.getZipEntryHeader().getFileName())) { + zipEntryData.setType(EntryType.RunnableFile); + } else { + zipEntryData.setType(EntryType.ResourceFile); + } if (cDOffset - offset < zipEntryData.getLength()) { throw new ZipException("cd offset in front of entry end"); } @@ -241,20 +245,15 @@ public class Zip { zipEntryData.getZipEntryHeader().getFileName())) { // .abc and .so file align 4096 byte. alignBytes = 4096; - zipEntryData.setType(EntryType.RunnableFile); - runnableNum++; } else if (isFirstUnRunnableFile) { // the first file after runnable file, align 4096 byte. alignBytes = 4096; isFirstUnRunnableFile = false; - zipEntryData.setType(EntryType.ResourceFile); } else { // normal file align 4 byte. alignBytes = alignment; - zipEntryData.setType(EntryType.ResourceFile); } int add = entry.alignment(alignBytes); - if (add > 0) { resetOffset(); } @@ -264,16 +263,14 @@ public class Zip { } } - private void addBitMap(byte[] data) throws ZipException { + public void addBitMap(byte[] data) throws ZipException { ZipEntry entry = new ZipEntry.Builder().setMethod(FILE_UNCOMPRESS_METHOD_FLAG) .setUncompressedSize(data.length) .setCompressedSize(data.length) .setFileName("pages.info") .setData(data) .build(); - entry.alignment(4096); - zipEntries.add(runnableNum, entry); - resetOffset(); + zipEntries.add(entry); } /** @@ -288,22 +285,20 @@ public class Zip { * sort uncompress entry in the front. */ private void sort() { - // sort uncompress file (so, abc, an) - other uncompress file - compress file + // sort uncompress file (so, abc, an) - bitmap - other uncompress file - compress file zipEntries.sort((entry1, entry2) -> { + EntryType entry1Type = entry1.getZipEntryData().getType(); + EntryType entry2Type = entry2.getZipEntryData().getType(); + if (entry1Type != entry2Type) { + return entry1Type.compareTo(entry2Type); + } + short entry1Method = entry1.getZipEntryData().getZipEntryHeader().getMethod(); short entry2Method = entry2.getZipEntryData().getZipEntryHeader().getMethod(); String entry1FileName = entry1.getZipEntryData().getZipEntryHeader().getFileName(); String entry2FileName = entry2.getZipEntryData().getZipEntryHeader().getFileName(); if (entry1Method == FILE_UNCOMPRESS_METHOD_FLAG && entry2Method == FILE_UNCOMPRESS_METHOD_FLAG) { - boolean isRunnableFile1 = FileUtils.isRunnableFile(entry1FileName); - boolean isRunnableFile2 = FileUtils.isRunnableFile(entry2FileName); - if (isRunnableFile1 && isRunnableFile2) { - return entry1FileName.compareTo(entry2FileName); - } else if (isRunnableFile1) { - return -1; - } else if (isRunnableFile2) { - return 1; - } + return entry1FileName.compareTo(entry2FileName); } else if (entry1Method == FILE_UNCOMPRESS_METHOD_FLAG) { return -1; } else if (entry2Method == FILE_UNCOMPRESS_METHOD_FLAG) { @@ -332,6 +327,7 @@ public class Zip { offset += cdLength; eOCDOffset = offset; endOfCentralDirectory.setcDTotal(zipEntries.size()); + endOfCentralDirectory.setThisDiskCDNum(zipEntries.size()); } public List getZipEntries() { -- Gitee From 6a203383bcb89ff46905404db157ae503500dce4 Mon Sep 17 00:00:00 2001 From: wangzeyu Date: Sat, 29 Jun 2024 01:33:14 +0000 Subject: [PATCH 07/12] update hapsigntool/hap_sign_tool_lib/src/main/java/com/ohos/hapsigntool/zip/ZipEntry.java. Signed-off-by: wangzeyu --- .../com/ohos/hapsigntool/zip/ZipEntry.java | 35 +++++++++---------- 1 file changed, 16 insertions(+), 19 deletions(-) diff --git a/hapsigntool/hap_sign_tool_lib/src/main/java/com/ohos/hapsigntool/zip/ZipEntry.java b/hapsigntool/hap_sign_tool_lib/src/main/java/com/ohos/hapsigntool/zip/ZipEntry.java index f338b300..82d7a2fb 100644 --- a/hapsigntool/hap_sign_tool_lib/src/main/java/com/ohos/hapsigntool/zip/ZipEntry.java +++ b/hapsigntool/hap_sign_tool_lib/src/main/java/com/ohos/hapsigntool/zip/ZipEntry.java @@ -28,14 +28,14 @@ import java.util.zip.CRC32; public class ZipEntry { private ZipEntryData zipEntryData; - private CentralDirectory fileEntryIncentralDirectory; + private CentralDirectory fileEntryInCentralDirectory; /** * updateLength */ public void updateLength() { zipEntryData.updateLength(); - fileEntryIncentralDirectory.updateLength(); + fileEntryInCentralDirectory.updateLength(); } /** @@ -49,7 +49,7 @@ public class ZipEntry { // if cd extra len bigger than entry extra len, make cd and entry extra length equals int padding = calZeroPaddingLengthForEntryExtra(); int remainder = (int) ((zipEntryData.getZipEntryHeader().getLength() - + fileEntryIncentralDirectory.getOffset()) % alignNum); + + fileEntryInCentralDirectory.getOffset()) % alignNum); if (remainder == 0) { return padding; @@ -67,7 +67,7 @@ public class ZipEntry { private int calZeroPaddingLengthForEntryExtra() throws ZipException { int entryExtraLen = zipEntryData.getZipEntryHeader().getExtraLength(); - int cdExtraLen = fileEntryIncentralDirectory.getExtraLength(); + int cdExtraLen = fileEntryInCentralDirectory.getExtraLength(); if (cdExtraLen > entryExtraLen) { setEntryHeaderNewExtraLength(cdExtraLen); return cdExtraLen - entryExtraLen; @@ -80,12 +80,12 @@ public class ZipEntry { } private void setCenterDirectoryNewExtraLength(int newLength) throws ZipException { - byte[] newCDExtra = getAlignmentNewExtra(newLength, fileEntryIncentralDirectory.getExtraData()); - fileEntryIncentralDirectory.setExtraData(newCDExtra); - fileEntryIncentralDirectory.setExtraLength(newLength); - fileEntryIncentralDirectory.setLength(CentralDirectory.CD_LENGTH - + fileEntryIncentralDirectory.getFileNameLength() - + fileEntryIncentralDirectory.getExtraLength() + fileEntryIncentralDirectory.getCommentLength()); + byte[] newCDExtra = getAlignmentNewExtra(newLength, fileEntryInCentralDirectory.getExtraData()); + fileEntryInCentralDirectory.setExtraData(newCDExtra); + fileEntryInCentralDirectory.setExtraLength(newLength); + fileEntryInCentralDirectory.setLength(CentralDirectory.CD_LENGTH + + fileEntryInCentralDirectory.getFileNameLength() + + fileEntryInCentralDirectory.getExtraLength() + fileEntryInCentralDirectory.getCommentLength()); } private void setEntryHeaderNewExtraLength(int newLength) throws ZipException { @@ -118,17 +118,17 @@ public class ZipEntry { } public CentralDirectory getCentralDirectory() { - return fileEntryIncentralDirectory; + return fileEntryInCentralDirectory; } public void setCentralDirectory(CentralDirectory centralDirectory) { - this.fileEntryIncentralDirectory = centralDirectory; + this.fileEntryInCentralDirectory = centralDirectory; } public static class Builder { - private short version = 20; + private short version = 10; - private short flag = 0; + private short flag = 2048; private short method = 0; @@ -206,12 +206,9 @@ public class ZipEntry { zipEntryHeader.setMethod(method); cd.setLastTime((short) 0); - cd.setLastDate((short) 0); + cd.setLastDate((short) 20001); zipEntryHeader.setLastTime((short) 0); - zipEntryHeader.setLastDate((short) 0); - - cd.setCrc32(-1); - zipEntryHeader.setCrc32(-1); + zipEntryHeader.setLastDate((short) 20001); cd.setCompressedSize(compressedSize); zipEntryHeader.setCompressedSize(compressedSize); -- Gitee From 2bc74bd8d9e455b0b009d964aa1d4ed412a24b22 Mon Sep 17 00:00:00 2001 From: wangzeyu Date: Sat, 29 Jun 2024 01:33:50 +0000 Subject: [PATCH 08/12] update hapsigntool/hap_sign_tool_lib/src/main/java/com/ohos/hapsigntool/zip/ZipEntryHeader.java. Signed-off-by: wangzeyu --- .../java/com/ohos/hapsigntool/zip/ZipEntryHeader.java | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/hapsigntool/hap_sign_tool_lib/src/main/java/com/ohos/hapsigntool/zip/ZipEntryHeader.java b/hapsigntool/hap_sign_tool_lib/src/main/java/com/ohos/hapsigntool/zip/ZipEntryHeader.java index 7c880a6b..d020c8fa 100644 --- a/hapsigntool/hap_sign_tool_lib/src/main/java/com/ohos/hapsigntool/zip/ZipEntryHeader.java +++ b/hapsigntool/hap_sign_tool_lib/src/main/java/com/ohos/hapsigntool/zip/ZipEntryHeader.java @@ -113,6 +113,13 @@ public class ZipEntryHeader { private int length; + /** + * updateLength + */ + public void updateLength() { + length = HEADER_LENGTH + fileNameLength + extraLength; + } + /** * get Zip Entry Header * @@ -137,7 +144,7 @@ public class ZipEntryHeader { entryHeader.setUnCompressedSize(UnsignedDecimalUtil.getUnsignedInt(bf)); entryHeader.setFileNameLength(UnsignedDecimalUtil.getUnsignedShort(bf)); entryHeader.setExtraLength(UnsignedDecimalUtil.getUnsignedShort(bf)); - entryHeader.setLength(HEADER_LENGTH + entryHeader.getFileNameLength() + entryHeader.getExtraLength()); + entryHeader.updateLength(); return entryHeader; } -- Gitee From 42c79e81d9d94b6442d919adf12fa8eb00075a6a Mon Sep 17 00:00:00 2001 From: wangzeyu Date: Sat, 29 Jun 2024 01:34:08 +0000 Subject: [PATCH 09/12] update hapsigntool/hap_sign_tool_lib/src/main/java/com/ohos/hapsigntool/zip/EntryType.java. Signed-off-by: wangzeyu --- .../src/main/java/com/ohos/hapsigntool/zip/EntryType.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/hapsigntool/hap_sign_tool_lib/src/main/java/com/ohos/hapsigntool/zip/EntryType.java b/hapsigntool/hap_sign_tool_lib/src/main/java/com/ohos/hapsigntool/zip/EntryType.java index 136b5d61..46d44b13 100644 --- a/hapsigntool/hap_sign_tool_lib/src/main/java/com/ohos/hapsigntool/zip/EntryType.java +++ b/hapsigntool/hap_sign_tool_lib/src/main/java/com/ohos/hapsigntool/zip/EntryType.java @@ -21,6 +21,6 @@ package com.ohos.hapsigntool.zip; */ public enum EntryType { RunnableFile, - ResourceFile, - BitMap; + BitMap, + ResourceFile; } -- Gitee From 7fc50767c88a6e0c69dd582e04af285ded40cf19 Mon Sep 17 00:00:00 2001 From: wangzeyu Date: Sat, 29 Jun 2024 01:34:43 +0000 Subject: [PATCH 10/12] update SignProvider.java. Signed-off-by: wangzeyu --- .../hap/provider/SignProvider.java | 23 +++++++++++-------- 1 file changed, 13 insertions(+), 10 deletions(-) diff --git a/hapsigntool/hap_sign_tool_lib/src/main/java/com/ohos/hapsigntool/hap/provider/SignProvider.java b/hapsigntool/hap_sign_tool_lib/src/main/java/com/ohos/hapsigntool/hap/provider/SignProvider.java index edf3bf6e..282556a7 100644 --- a/hapsigntool/hap_sign_tool_lib/src/main/java/com/ohos/hapsigntool/hap/provider/SignProvider.java +++ b/hapsigntool/hap_sign_tool_lib/src/main/java/com/ohos/hapsigntool/hap/provider/SignProvider.java @@ -24,7 +24,6 @@ import com.ohos.hapsigntool.codesigning.exception.CodeSignException; import com.ohos.hapsigntool.codesigning.exception.FsVerityDigestException; import com.ohos.hapsigntool.codesigning.sign.CodeSigning; import com.ohos.hapsigntool.error.CustomException; -import com.ohos.hapsigntool.error.ERROR; import com.ohos.hapsigntool.hap.config.SignerConfig; import com.ohos.hapsigntool.hap.entity.SigningBlock; import com.ohos.hapsigntool.error.HapFormatException; @@ -57,9 +56,6 @@ import com.ohos.hapsigntool.zip.ZipUtils; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; -import org.bouncycastle.asn1.x500.RDN; -import org.bouncycastle.asn1.x500.X500Name; -import org.bouncycastle.asn1.x500.style.BCStyle; import org.bouncycastle.cms.CMSException; import org.bouncycastle.cms.CMSSignedData; import org.bouncycastle.jce.provider.BouncyCastleProvider; @@ -504,6 +500,7 @@ public abstract class SignProvider { private Zip copyFileAndAlignment(File input, File tmpOutput, int alignment) throws IOException, HapFormatException { Zip zip = new Zip(input); + zip.addBitMap(new byte[]{50,51,52,53,54,55,56,57}); zip.alignment(alignment); zip.removeSignBlock(); long start = System.currentTimeMillis(); @@ -566,13 +563,19 @@ public abstract class SignProvider { if (cert == null) { return ""; } - String nameStr = cert.getSubjectX500Principal().getName(); - X500Name name = new X500Name(nameStr); - RDN[] commonName = name.getRDNs(BCStyle.CN); - if (commonName.length <= 0) { - CustomException.throwException(ERROR.CERTIFICATE_ERROR, "subject without common name"); + String valueOfDN = cert.getSubjectDN().toString(); + valueOfDN = valueOfDN.replace("\"", ""); + String[] arrayDN = valueOfDN.split(","); + for (String element : arrayDN) { + if (element.trim().startsWith("CN=")) { + String[] tempArray = element.split("="); + if (tempArray.length == 2) { + return tempArray[1]; + } + return ""; + } } - return commonName[0].getFirst().getValue().toString(); + return ""; } private byte[] findProfileFromOptionalBlocks() { -- Gitee From 97f79688b34591c2893a645767352eaab9a891ec Mon Sep 17 00:00:00 2001 From: wangzeyu Date: Sat, 29 Jun 2024 01:35:22 +0000 Subject: [PATCH 11/12] update SignProvider.java. Signed-off-by: wangzeyu --- .../java/com/ohos/hapsigntool/hap/provider/SignProvider.java | 1 - 1 file changed, 1 deletion(-) diff --git a/hapsigntool/hap_sign_tool_lib/src/main/java/com/ohos/hapsigntool/hap/provider/SignProvider.java b/hapsigntool/hap_sign_tool_lib/src/main/java/com/ohos/hapsigntool/hap/provider/SignProvider.java index 282556a7..41e2a05e 100644 --- a/hapsigntool/hap_sign_tool_lib/src/main/java/com/ohos/hapsigntool/hap/provider/SignProvider.java +++ b/hapsigntool/hap_sign_tool_lib/src/main/java/com/ohos/hapsigntool/hap/provider/SignProvider.java @@ -500,7 +500,6 @@ public abstract class SignProvider { private Zip copyFileAndAlignment(File input, File tmpOutput, int alignment) throws IOException, HapFormatException { Zip zip = new Zip(input); - zip.addBitMap(new byte[]{50,51,52,53,54,55,56,57}); zip.alignment(alignment); zip.removeSignBlock(); long start = System.currentTimeMillis(); -- Gitee From 7b9696e527867c30c9baae45b10de65fb775dc16 Mon Sep 17 00:00:00 2001 From: wangzeyu Date: Sat, 29 Jun 2024 01:39:06 +0000 Subject: [PATCH 12/12] update SignProvider.java. Signed-off-by: wangzeyu --- .../hap/provider/SignProvider.java | 22 +++++++++---------- 1 file changed, 10 insertions(+), 12 deletions(-) diff --git a/hapsigntool/hap_sign_tool_lib/src/main/java/com/ohos/hapsigntool/hap/provider/SignProvider.java b/hapsigntool/hap_sign_tool_lib/src/main/java/com/ohos/hapsigntool/hap/provider/SignProvider.java index 41e2a05e..edf3bf6e 100644 --- a/hapsigntool/hap_sign_tool_lib/src/main/java/com/ohos/hapsigntool/hap/provider/SignProvider.java +++ b/hapsigntool/hap_sign_tool_lib/src/main/java/com/ohos/hapsigntool/hap/provider/SignProvider.java @@ -24,6 +24,7 @@ import com.ohos.hapsigntool.codesigning.exception.CodeSignException; import com.ohos.hapsigntool.codesigning.exception.FsVerityDigestException; import com.ohos.hapsigntool.codesigning.sign.CodeSigning; import com.ohos.hapsigntool.error.CustomException; +import com.ohos.hapsigntool.error.ERROR; import com.ohos.hapsigntool.hap.config.SignerConfig; import com.ohos.hapsigntool.hap.entity.SigningBlock; import com.ohos.hapsigntool.error.HapFormatException; @@ -56,6 +57,9 @@ import com.ohos.hapsigntool.zip.ZipUtils; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; +import org.bouncycastle.asn1.x500.RDN; +import org.bouncycastle.asn1.x500.X500Name; +import org.bouncycastle.asn1.x500.style.BCStyle; import org.bouncycastle.cms.CMSException; import org.bouncycastle.cms.CMSSignedData; import org.bouncycastle.jce.provider.BouncyCastleProvider; @@ -562,19 +566,13 @@ public abstract class SignProvider { if (cert == null) { return ""; } - String valueOfDN = cert.getSubjectDN().toString(); - valueOfDN = valueOfDN.replace("\"", ""); - String[] arrayDN = valueOfDN.split(","); - for (String element : arrayDN) { - if (element.trim().startsWith("CN=")) { - String[] tempArray = element.split("="); - if (tempArray.length == 2) { - return tempArray[1]; - } - return ""; - } + String nameStr = cert.getSubjectX500Principal().getName(); + X500Name name = new X500Name(nameStr); + RDN[] commonName = name.getRDNs(BCStyle.CN); + if (commonName.length <= 0) { + CustomException.throwException(ERROR.CERTIFICATE_ERROR, "subject without common name"); } - return ""; + return commonName[0].getFirst().getValue().toString(); } private byte[] findProfileFromOptionalBlocks() { -- Gitee