diff --git a/OAT.xml b/OAT.xml index 6334a3636e5cd703f9bcc22c7e2f05f7c06144b6..de43b3a52772cf67f1af61d8603165a9dd0837a4 100644 --- a/OAT.xml +++ b/OAT.xml @@ -50,8 +50,6 @@ - - diff --git a/README.md b/README.md new file mode 100644 index 0000000000000000000000000000000000000000..5c07fa64b6a1bd14255b8fe085303775981f76f7 --- /dev/null +++ b/README.md @@ -0,0 +1,82 @@ +# Code Signature + +## Introduction + +Code signature is a security mechanism on OpenHarmony to protect integrity of the application and verify the validity of the application source on runtime. + +The code signature component provides the following features: + +- Writing trusted code signing certificates into the kernel +- Enabling code signing for applicaitons +- Signing local code + +## Directory Structure + +``` +/base/security/code_signature +├── interfaces # APIs +│ └── innerkits # +│ ├── code_sign_utils # APIs for enabling code signing +│ ├── common # Common basic capacities +│ └── local_code_sign # APIs for local signing +├── services # Service layer +│ ├── key_enable # Certificate initialization +│ └── local_code_sign # Local signing service +├── test # Test cases +│ ├── fuzztest # Fuzz test cases +│ └── unittest # Unit test cases +└── utils # Common basic capacities +``` + +## Usage +### Available APIs + +| **API** | **Description** | +| --- | --- | +| int32_t EnforceCodeSignForApp(const EntryMap &entryPath, const std::string &signatureFile); | Enforces code signing for an hap | +| int32_t EnforceCodeSignForFile(const std::string &path, const ByteBuffer &signature); | Enforces code signing for an file | +| int32_t SignLocalCode(const std::string &filePath, ByteBuffer &signature); | Signs the local code | + +### Building + +#### Setting up the environment + +- Pull the latest code of the trunk. + +- Set up the [RK3568 default environment](https://gitee.com/openharmony/docs/blob/master/en/device-dev/quick-start/Readme-EN.md) + +#### Modify the code + +1. Pull the code signature component + +``` +cd base/security + +git clone https://gitee.com/openharmony-sig/security_code_signature.git + +mv security_code_signature code_signature +``` + +2. Modify the repositories on which the code signature component depends + +The [patches.json](patches/patches.json) file in the current repository describes the repositories and patches on which + +the code signature component depends. Install the required patches in the corresponding repositories base on the description in the file. + +#### Building + +``` +./build.sh --product-name rk3568 --ccache +``` + +### Signing Tool User Guide + +**[User Guide](https://gitee.com/openharmony/developtools_hapsigner/blob/master/codesigntool/README.md)** + +## 相关仓 + +## Repositories Involved + +**[developtools\_hapsigner](https://gitee.com/openharmony/developtools_hapsigner/blob/master/codesigntool/README.md)** + +**[third\_party\_fsverity-utils](https://gitee.com/openharmony/third_party_fsverity-utils/blob/master/README.md)** diff --git a/README_zh.md b/README_zh.md index 57c8c5386e6e584a3890e1f9c4041619922ee87a..27c54f65ecf6ed989a3f8ee7fec8efafc2b3339b 100644 --- a/README_zh.md +++ b/README_zh.md @@ -2,21 +2,17 @@ ## 简介 -代码签名部件是OpenHarmony提供的代码签名能力,对应用进行签名保护,校验应用程序来源的合法性。 +代码签名部件用于支持OpenHarmony的代码签名机制。OpenHarmony使用代码签名提供运行时应用程序的完整性保护,校验应用来源的合法性。 代码签名部件主要提供如下功能: -- 提供可信代码签名证书写入内核能力; -- 提供代码签名使能能力; -- 提供本地代码签名能力; -- 提供用于云化部署的代码签名工具SDK。 +- 提供可信代码签名证书写入内核能力 +- 提供代码签名使能能力 +- 提供本地代码签名能力 ## 目录 ``` /base/security/code_signature -├── codesigntool # 签名工具 -│ ├── code_sign_appgallery_lib # 签名工具SDK接口 -│ ├── code_sign_tool_lib # 签名工具核心能力 ├── interfaces # 接口层 │ └── innerkits # │ ├── code_sign_utils # 使能接口 @@ -34,7 +30,7 @@ ## 使用 ### 接口说明 -| **接口申明** | **接口描述** | +| **接口声明** | **接口描述** | | --- | --- | | int32_t EnforceCodeSignForApp(const EntryMap &entryPath, const std::string &signatureFile); | 对hap使能代码签名 | | int32_t EnforceCodeSignForFile(const std::string &path, const ByteBuffer &signature); | 对文件使能代码签名 | @@ -72,8 +68,10 @@ mv security_code_signature code_signature ### 签名工具使用指南 -参考测试示例:codesigntool/code\_sign\_appgallery\_lib/src/test/java/com/ohos/test/signclient/core +**[使用指南](https://gitee.com/openharmony/developtools_hapsigner/blob/master/codesigntool/README_zh.md)** ## 相关仓 +**[developtools\_hapsigner](https://gitee.com/openharmony/developtools_hapsigner/blob/master/codesigntool/README_zh.md)** + **[third\_party\_fsverity-utils](https://gitee.com/openharmony/third_party_fsverity-utils/blob/master/README_zh.md)** diff --git a/codesigntool/code_sign_appgallery_lib/pom.xml b/codesigntool/code_sign_appgallery_lib/pom.xml deleted file mode 100644 index fbdbe9a2781a608660cea8a8092f8129efe3d7ca..0000000000000000000000000000000000000000 --- a/codesigntool/code_sign_appgallery_lib/pom.xml +++ /dev/null @@ -1,80 +0,0 @@ - - - - - 4.0.0 - - - codesigntool - com.ohos.codesigntool - ${revision} - - - code_sign_appgallery_lib - - - - org.apache.logging.log4j - log4j-core - - - com.ohos.codesigntool - code_sign_tool_lib - - - junit - junit - 4.13.2 - test - - - - code_sign_appgallery_lib - - - org.apache.maven.plugins - maven-compiler-plugin - 3.7.0 - - 1.8 - 1.8 - UTF-8 - true - - -Xlint:all - - - - - org.apache.maven.plugins - maven-resources-plugin - 3.0.2 - - UTF-8 - - - - org.apache.maven.plugins - maven-jar-plugin - 2.6 - - ../outputs - - - - - diff --git a/codesigntool/code_sign_appgallery_lib/src/main/java/com/ohos/codesigntool/core/provider/RemoteCodeSignProvider.java b/codesigntool/code_sign_appgallery_lib/src/main/java/com/ohos/codesigntool/core/provider/RemoteCodeSignProvider.java deleted file mode 100644 index 633d02dadffadcb8f9105c01c297ef5d3cf51901..0000000000000000000000000000000000000000 --- a/codesigntool/code_sign_appgallery_lib/src/main/java/com/ohos/codesigntool/core/provider/RemoteCodeSignProvider.java +++ /dev/null @@ -1,45 +0,0 @@ -/* - * Copyright (c) 2023 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.codesigntool.core.provider; - -import com.ohos.codesigntool.core.config.CodeSignConfig; -import com.ohos.codesigntool.core.config.RemoteCodeSignConfig; - -import java.security.InvalidKeyException; -import java.security.cert.X509CRL; -import java.security.cert.X509Certificate; -import java.util.List; - -/** - * Remote online sign provider - * - * @since 2023/06/05 - */ -public class RemoteCodeSignProvider extends CodeSignProvider { - @Override - public X509CRL getCrl() { - return null; - } - - @Override - public CodeSignConfig createSignConfigs(List x509CertList, X509CRL crl) - throws InvalidKeyException { - CodeSignConfig signConfig = new RemoteCodeSignConfig(); - initSignConfigs(signConfig, x509CertList, crl); - signConfig.setServer(this.server); - return signConfig; - } -} \ No newline at end of file diff --git a/codesigntool/code_sign_appgallery_lib/src/main/java/com/ohos/codesigntool/core/signtool/CodeSignTool.java b/codesigntool/code_sign_appgallery_lib/src/main/java/com/ohos/codesigntool/core/signtool/CodeSignTool.java deleted file mode 100644 index f0248b44acecaf98c2b6d55adf15b38f4aa9e860..0000000000000000000000000000000000000000 --- a/codesigntool/code_sign_appgallery_lib/src/main/java/com/ohos/codesigntool/core/signtool/CodeSignTool.java +++ /dev/null @@ -1,54 +0,0 @@ -/* - * Copyright (c) 2023 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.codesigntool.core.signtool; - -import com.ohos.codesigntool.core.api.CodeSignServer; -import com.ohos.codesigntool.core.provider.CodeSignProvider; -import com.ohos.codesigntool.core.provider.RemoteCodeSignProvider; - -/** - * code signature tool, defined function to sign hap file - * - * @since 2023/06/05 - */ -public class CodeSignTool { - private static final String CODE_SIGN_TOOL_VERSION = "V1.0"; - - /** - * code-signing API for hap file. - * - * @param server sign server interface provided by the caller. - * @param params "-inputFile", "input file path", - * "-outputPath", "output signature file path", - * "-signAlg", "SHA256withECDSA", - * "-outTree" , "true/false" - * @return true, if sign successfully. - */ - public static boolean signCode(CodeSignServer server, String[] params) { - CodeSignProvider codeSignProvider = new RemoteCodeSignProvider(); - codeSignProvider.setCodeSignServer(server); - return codeSignProvider.sign(params); - } - - /** - * Get version of tool. - * - * @return version of jar. - */ - public static String getVersion() { - return CODE_SIGN_TOOL_VERSION; - } -} diff --git a/codesigntool/code_sign_appgallery_lib/src/test/java/com/ohos/test/signclient/core/api/TestCodeSignServer.java b/codesigntool/code_sign_appgallery_lib/src/test/java/com/ohos/test/signclient/core/api/TestCodeSignServer.java deleted file mode 100644 index d64662cf7d2e42faaae7341803583076ec5f68d5..0000000000000000000000000000000000000000 --- a/codesigntool/code_sign_appgallery_lib/src/test/java/com/ohos/test/signclient/core/api/TestCodeSignServer.java +++ /dev/null @@ -1,172 +0,0 @@ -/* - * Copyright (c) 2023 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.test.signclient.core.api; - -import com.google.gson.Gson; -import com.ohos.codesigntool.core.api.CodeSignServer; -import com.ohos.codesigntool.core.response.DataFromAppGallaryServer; -import com.ohos.codesigntool.core.response.DataFromSignCenterServer; -import com.ohos.codesigntool.core.utils.CertUtils; -import org.apache.logging.log4j.LogManager; -import org.apache.logging.log4j.Logger; - -import java.io.File; -import java.io.FileInputStream; -import java.io.IOException; -import java.security.InvalidAlgorithmParameterException; -import java.security.InvalidKeyException; -import java.security.KeyStore; -import java.security.KeyStoreException; -import java.security.NoSuchAlgorithmException; -import java.security.NoSuchProviderException; -import java.security.PrivateKey; -import java.security.Signature; -import java.security.SignatureException; -import java.security.UnrecoverableKeyException; -import java.security.cert.CertificateEncodingException; -import java.security.cert.CertificateException; -import java.security.cert.X509Certificate; -import java.security.spec.AlgorithmParameterSpec; -import java.util.Base64; -import java.util.List; - -/** - * class implements CodeSignServer, use in test. - * - * @since 2023/06/05 - */ -public class TestCodeSignServer implements CodeSignServer { - private static final Logger LOGGER = LogManager.getLogger(TestCodeSignServer.class); - private static final String SEPARATOR = File.separator; - private static final String KEYSTORE = - "src" + SEPARATOR + "test" + SEPARATOR + "resources" + SEPARATOR + "cs_cert" + SEPARATOR + "cstest.jks"; - private static final String CERTPATH = - "src" + SEPARATOR + "test" + SEPARATOR + "resources" + SEPARATOR + "cs_cert" + SEPARATOR + "chain.pem"; - private static final String KEYSTORE_CODE = "123456"; - private static final String KEYALIAS = "oh_code_sign_test"; - private static final String KEYALIAS_CODE = "123456"; - - private class ResponseJson extends DataFromAppGallaryServer { - ResponseJson(String code, String message, String signedData, String[] certchain, String crl) { - DataFromSignCenterServer dataFromServer = new DataFromSignCenterServer(); - dataFromServer.setSignedData(signedData); - dataFromServer.setCertchain(certchain); - dataFromServer.setCrl(crl); - setCodeSignature(code); - setMessage(message); - setDataFromSignCenterServer(dataFromServer); - } - } - - @Override - public String getSignature(byte[] data, String signatureAlg) { - List publicCertList = CertUtils.getCertChainsFromFile(CERTPATH); - if (publicCertList == null) { - LOGGER.error("public certs is null!"); - return ""; - } - String[] certchain; - try { - certchain = getCertchain(publicCertList); - } catch (CertificateEncodingException e) { - LOGGER.error("get certchain failed!", e); - return ""; - } - byte[] signData = getSignature(data, signatureAlg, null); - String code = "success"; - String message = "sign successfully"; - String signedData = null; - if (signData == null) { - code = "fail"; - message = "sign failed"; - } else { - signedData = Base64.getUrlEncoder().encodeToString(signData); - } - ResponseJson ret = new ResponseJson(code, message, signedData, certchain, ""); - String jsonObject = new Gson().toJson(ret); - LOGGER.info(jsonObject); - return jsonObject; - } - - private String[] getCertchain(List certList) - throws CertificateEncodingException { - int certListSize = certList.size(); - String[] certchain = new String[certListSize]; - for (int i = 0; i < certListSize; i++) { - StringBuilder builder = new StringBuilder(); - builder.append("-----BEGIN CERTIFICATE-----") - .append(System.lineSeparator()) - .append(Base64.getEncoder().encodeToString(certList.get(i).getEncoded())) - .append("-----END CERTIFICATE-----") - .append(System.lineSeparator()); - certchain[i] = builder.toString(); - } - return certchain; - } - - private byte[] getSignature(byte[] data, String signAlgName, AlgorithmParameterSpec algParamValue) { - LOGGER.info("Compute signature by {}", this.getClass().getName()); - byte[] signBytes = null; - try { - PrivateKey privateKey = getPrivateKeyFromKeyStore(); - if (privateKey == null) { - return signBytes; - } - signBytes = getSignature(data, signAlgName, privateKey, algParamValue); - } catch (InvalidAlgorithmParameterException - | InvalidKeyException - | NoSuchAlgorithmException - | NoSuchProviderException - | SignatureException e) { - LOGGER.error("get Signature failed!", e); - } - return signBytes; - } - - private PrivateKey getPrivateKeyFromKeyStore() { - PrivateKey privateKey = null; - try (FileInputStream fileStream = new FileInputStream(KEYSTORE)) { - KeyStore keyStore = KeyStore.getInstance("JKS"); - keyStore.load(fileStream, KEYSTORE_CODE.toCharArray()); - Object obj = keyStore.getKey(KEYALIAS, KEYALIAS_CODE.toCharArray()); - if (!(obj instanceof PrivateKey)) { - LOGGER.error("key from keystore can not be converted to PrivateKey"); - return null; - } - privateKey = (PrivateKey) obj; - } catch (CertificateException - | IOException - | KeyStoreException - | NoSuchAlgorithmException - | UnrecoverableKeyException e) { - LOGGER.error("get private key from keystore failed!", e); - } - return privateKey; - } - - private byte[] getSignature(byte[] data, String signAlgName, PrivateKey privateKey, - AlgorithmParameterSpec algParamValue) throws NoSuchProviderException, - NoSuchAlgorithmException, InvalidKeyException, - InvalidAlgorithmParameterException, SignatureException { - Signature sign = Signature.getInstance(signAlgName, "BC"); - sign.initSign(privateKey); - if (algParamValue != null) { - sign.setParameter(algParamValue); - } - sign.update(data); - return sign.sign(); - } -} \ No newline at end of file diff --git a/codesigntool/code_sign_appgallery_lib/src/test/java/com/ohos/test/signclient/core/signtool/CodeSignToolTest.java b/codesigntool/code_sign_appgallery_lib/src/test/java/com/ohos/test/signclient/core/signtool/CodeSignToolTest.java deleted file mode 100644 index f25dac2302da7c3b02a4e2f19e796f450a2f9667..0000000000000000000000000000000000000000 --- a/codesigntool/code_sign_appgallery_lib/src/test/java/com/ohos/test/signclient/core/signtool/CodeSignToolTest.java +++ /dev/null @@ -1,503 +0,0 @@ -/* - * Copyright (c) 2023 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.test.signclient.core.signtool; - -import com.ohos.codesigntool.core.signtool.CodeSignTool; -import com.ohos.codesigntool.core.utils.ParamConstants; -import com.ohos.test.signclient.core.api.TestCodeSignServer; - -import org.junit.AfterClass; -import org.junit.Assert; -import org.junit.BeforeClass; -import org.junit.Test; - -import java.io.File; -import java.io.FileOutputStream; -import java.io.IOException; -import java.math.BigInteger; -import java.nio.file.Files; -import java.util.ArrayList; -import java.util.Enumeration; -import java.util.HashMap; -import java.util.HashSet; -import java.util.List; -import java.util.Map; -import java.util.Objects; -import java.util.Random; -import java.util.Set; -import java.util.concurrent.ArrayBlockingQueue; -import java.util.concurrent.Callable; -import java.util.concurrent.CopyOnWriteArrayList; -import java.util.concurrent.CountDownLatch; -import java.util.concurrent.Future; -import java.util.concurrent.ThreadPoolExecutor; -import java.util.concurrent.TimeUnit; -import java.util.jar.JarEntry; -import java.util.jar.JarFile; -import java.util.zip.ZipEntry; -import java.util.zip.ZipOutputStream; - -/** - * CodeSignTool Tester. - * - * @since 2023/06/05 - */ -public class CodeSignToolTest { - private static final String SEPARATOR = File.separator; - private static final File TMP_DIR = new File("target"); - private static final int MIN_DATA_CHUNK_SIZE = 4096; - private static final int MAX_DATA_CHUNK_SIZE = 1024 * 1024 * 2; - private static final int MIN_ENTRY_COUNT = 1; - private static final int MAX_ENTRY_COUNT = 16; - private static final int CONCURRENT_TASK_COUNT = 10; - private static final int CONCURRENT_TASK_EXECUTE_TIME = 30; - private static final int CONCURRENT_TASK_TYPE_HAP = 1; - private static final String DEFAULT_SIGN_ALG = "SHA256withECDSA"; - private static final String TMP_UNSIGNED_FILE_PREFIX = "unsigned-"; - private static final String TMP_SIGNED_FILE_PREFIX = "signed-"; - private static final String TMP_HAP_FILE_SUFFIX = ".hap"; - private static final String OUTPUT_MERKLE_TREE = "true"; - private static final String TEST_TARGET_HAPS_BASE = - "src" + SEPARATOR + "test" + SEPARATOR + "resources" + SEPARATOR + "haps"; - private static final List MODULE_TYPES = new ArrayList<>(); - private static final String STAGE_MODULE = "STAGE"; - private static final String FA_MODULE = "FA"; - private static final List COMPRESS_NATIVE_LIB_OPTIONS = new ArrayList<>(); - private static final String TRUE_OPTION = "true"; - private static final String FALSE_OPTION = "false"; - private static final String NONE_OPTION = "none"; - private static final Map OPTIONS_AND_LIB_SIGNATURE_MAP = new HashMap<>(); - private static final String SO_SUFFIX = ".so"; - private static final String HAP_SUFFIX = ".hap"; - private static final String SIG_SUFFIX = ".sig"; - private static final String SINGLE_SIG_SUFFIX = ".fsv-sig"; - private static List tmpSources; - private static String tmpOutputPath; - - static { - MODULE_TYPES.add(STAGE_MODULE); - MODULE_TYPES.add(FA_MODULE); - COMPRESS_NATIVE_LIB_OPTIONS.add(TRUE_OPTION); - COMPRESS_NATIVE_LIB_OPTIONS.add(FALSE_OPTION); - COMPRESS_NATIVE_LIB_OPTIONS.add(NONE_OPTION); - OPTIONS_AND_LIB_SIGNATURE_MAP.put(TRUE_OPTION, true); - OPTIONS_AND_LIB_SIGNATURE_MAP.put(FALSE_OPTION, false); - OPTIONS_AND_LIB_SIGNATURE_MAP.put(NONE_OPTION, true); - } - - /** - * Init template resources container. - */ - @BeforeClass - public static void initTmpResourcesContainer() { - tmpSources = new CopyOnWriteArrayList<>(); - try { - tmpOutputPath = Files.createTempDirectory(TMP_DIR.toPath(), TMP_SIGNED_FILE_PREFIX).toString(); - } catch (IOException e) { - e.printStackTrace(); - } - } - - /** - * Clean template resources. - */ - @AfterClass - public static void cleanTmpResources() { - tmpSources.forEach(Cleanable::clean); - File dir = new File(tmpOutputPath); - File[] files = dir.listFiles(); - for (File file : files) { - file.delete(); - } - dir.delete(); - } - - /** - * Test sign hap. - * - * @throws Exception on error. - */ - @Test - public void testSignHap() throws Exception { - File unsignedHap = File.createTempFile(TMP_UNSIGNED_FILE_PREFIX, TMP_HAP_FILE_SUFFIX, TMP_DIR); - tmpSources.add(new CleanableFile(unsignedHap)); - testSignCode(unsignedHap, true); - } - - /** - * Test sign file that does not exist. - * - * @throws Exception on error. - */ - @Test - public void testInvalidInputFile() throws Exception { - Params param = new Params(); - param.addParam(ParamConstants.PARAM_BASIC_INPUT_FILE, "invalid"); - param.addParam(ParamConstants.PARAM_BASIC_OUTPUT_PATH, tmpOutputPath); - param.addParam(ParamConstants.PARAM_BASIC_SIGN_ALG, DEFAULT_SIGN_ALG); - - String[] params = param.toArray(); - TestCodeSignServer server = new TestCodeSignServer(); - Assert.assertFalse("sign nonexistent file", CodeSignTool.signCode(server, params)); - } - - /** - * Test sign and store merkle tree in ouput file. - * - * @throws Exception on error - */ - @Test - public void testSignHapAndStoreTree() throws Exception { - testSignCodeWithTree(); - } - - /** - * Test sign code on multi-thread. - * - * @throws Exception on error - */ - @Test - public void testSignCodeConcurrent() throws Exception { - executeConcurrentTask(CONCURRENT_TASK_TYPE_HAP); - } - - private void executeConcurrentTask(int taskType) throws Exception { - CountDownLatch countDownLatch = new CountDownLatch(CONCURRENT_TASK_COUNT); - ThreadPoolExecutor executor = new ThreadPoolExecutor(CONCURRENT_TASK_COUNT, - CONCURRENT_TASK_COUNT, 30, TimeUnit.SECONDS, - new ArrayBlockingQueue<>(CONCURRENT_TASK_COUNT), - new ThreadPoolExecutor.CallerRunsPolicy()); - List> futures = new ArrayList<>(CONCURRENT_TASK_COUNT); - List> tasks = new ArrayList<>(CONCURRENT_TASK_COUNT); - for (int i = 0; i < CONCURRENT_TASK_COUNT; i++) { - if (taskType == CONCURRENT_TASK_TYPE_HAP) { - tasks.add(generateSignCodeTask(countDownLatch)); - } - } - for (Callable task : tasks) { - Future future = executor.submit(task); - futures.add(future); - } - executor.shutdown(); - boolean isFinished = countDownLatch.await(CONCURRENT_TASK_EXECUTE_TIME, TimeUnit.SECONDS); - if (!isFinished) { - executor.shutdownNow(); - } - Assert.assertTrue("some task not finished in " + CONCURRENT_TASK_EXECUTE_TIME + "seconds.", isFinished); - for (Future future : futures) { - Boolean isSuccess = future.get(); - Assert.assertNotNull("task not finish or error", isSuccess); - Assert.assertTrue("task failed", isSuccess); - } - } - - private Callable generateSignCodeTask(CountDownLatch countDownLatch) throws IOException { - File inputFile = File.createTempFile(TMP_UNSIGNED_FILE_PREFIX, TMP_HAP_FILE_SUFFIX, TMP_DIR); - tmpSources.add(new CleanableFile(inputFile)); - fillHapFile(inputFile); - return new MultiSignCodeTask(inputFile, tmpOutputPath, countDownLatch); - } - - private void testSignCode(File unsignedHap, boolean fill) throws Exception { - if (fill) { - fillHapFile(unsignedHap); - } - - Params param = new Params(); - param.addParam(ParamConstants.PARAM_BASIC_INPUT_FILE, unsignedHap.getPath()); - param.addParam(ParamConstants.PARAM_BASIC_OUTPUT_PATH, tmpOutputPath); - param.addParam(ParamConstants.PARAM_BASIC_SIGN_ALG, DEFAULT_SIGN_ALG); - - String[] params = param.toArray(); - TestCodeSignServer server = new TestCodeSignServer(); - Assert.assertTrue("sign code failed", CodeSignTool.signCode(server, params)); - CodeSignVerify codeSignVerify = new CodeSignVerify(); - Assert.assertTrue("verify code failed", codeSignVerify.verifyCode( - unsignedHap.getPath(), spliceFilePath(tmpOutputPath, unsignedHap.getName()))); - } - - private static String spliceFilePath(String outputDir, String hapName) { - String outputPath = outputDir; - if (!outputPath.endsWith(File.separator)) { - outputPath += File.separator; - } - return new String(outputPath + hapName + SIG_SUFFIX); - } - - private void testSignCodeWithTree() throws Exception { - File unsignedHap = File.createTempFile(TMP_UNSIGNED_FILE_PREFIX, TMP_HAP_FILE_SUFFIX, TMP_DIR); - tmpSources.add(new CleanableFile(unsignedHap)); - - fillHapFile(unsignedHap); - - Params param = new Params(); - param.addParam(ParamConstants.PARAM_BASIC_INPUT_FILE, unsignedHap.getPath()); - param.addParam(ParamConstants.PARAM_BASIC_OUTPUT_PATH, tmpOutputPath); - param.addParam(ParamConstants.PARAM_BASIC_SIGN_ALG, DEFAULT_SIGN_ALG); - param.addParam(ParamConstants.PARAM_OUTPUT_MEKLE_TREE, OUTPUT_MERKLE_TREE); - - String[] params = param.toArray(); - TestCodeSignServer server = new TestCodeSignServer(); - Assert.assertTrue("sign code failed", CodeSignTool.signCode(server, params)); - CodeSignVerify codeSignVerify = new CodeSignVerify(); - Assert.assertTrue("verify code failed", codeSignVerify.verifyCode( - unsignedHap.getPath(), spliceFilePath(tmpOutputPath, unsignedHap.getName()))); - } - - /** - * Test sign code with option `CompressiveNativeLibs` - * - * @throws Exception an error. - */ - @Test - public void testSignHapWithLibOptions() throws Exception { - for (String module : MODULE_TYPES) { - for (String option : COMPRESS_NATIVE_LIB_OPTIONS) { - String hapPath = TEST_TARGET_HAPS_BASE + SEPARATOR + module + SEPARATOR + option + HAP_SUFFIX; - testSignCode(new File(hapPath), false); - String outFile = tmpOutputPath + SEPARATOR + option + HAP_SUFFIX + SIG_SUFFIX; - CheckNativeLibSignature check = new CheckNativeLibSignature(outFile); - Assert.assertEquals("compress libs check failed", - check.checkLibDirInSignature(), OPTIONS_AND_LIB_SIGNATURE_MAP.get(option)); - } - } - } - - /** - * Test Method: getVersion() - * - * @throws Exception on error. - */ - @Test - public void testGetVersion() throws Exception { - Assert.assertNotNull(CodeSignTool.getVersion()); - } - - /** - * Test unsupported sign algorithm - * - * @throws Exception on error. - */ - @Test - public void testUnSupportedSignAlgorithm() throws Exception { - File unsignedHap = File.createTempFile(TMP_UNSIGNED_FILE_PREFIX, TMP_HAP_FILE_SUFFIX, TMP_DIR); - tmpSources.add(new CleanableFile(unsignedHap)); - fillHapFile(unsignedHap); - Params param = new Params(); - param.addParam(ParamConstants.PARAM_BASIC_INPUT_FILE, unsignedHap.getPath()); - param.addParam(ParamConstants.PARAM_BASIC_OUTPUT_PATH, tmpOutputPath); - param.addParam(ParamConstants.PARAM_BASIC_SIGN_ALG, ParamConstants.SIG_ALGORITHM_SHA256_RSA); - String[] params = param.toArray(); - TestCodeSignServer server = new TestCodeSignServer(); - Assert.assertFalse("sign using unsupported algorithm", CodeSignTool.signCode(server, params)); - } - - private byte[] generateChunkBytes() { - Random random = new Random(); - int size = Math.max(MIN_DATA_CHUNK_SIZE, random.nextInt(MAX_DATA_CHUNK_SIZE + 1)); - byte[] bytes = new byte[size]; - random.nextBytes(bytes); - return bytes; - } - - private String generateEntryName() { - return new BigInteger(Long.SIZE, new Random()) + SO_SUFFIX; - } - - private void fillHapFile(File file) throws IOException { - try (ZipOutputStream out = new ZipOutputStream(new FileOutputStream(file))) { - Random random = new Random(); - int entryCount = Math.max(MIN_ENTRY_COUNT, random.nextInt(MAX_ENTRY_COUNT + 1)); - for (int i = 0; i < entryCount; i++) { - ZipEntry zipEntry = new ZipEntry(generateEntryName()); - out.putNextEntry(zipEntry); - out.write(generateChunkBytes()); - } - } - } - - private interface Cleanable { - /** - * Clean template resources. - */ - void clean(); - } - - private static class CheckNativeLibSignature { - - private static final String LIB_DIR_NAME = "libs"; - private static final String SO_SIG_SUFFIX = SO_SUFFIX + SINGLE_SIG_SUFFIX; - - private final File inputFile; - - public CheckNativeLibSignature(String filePath) { - inputFile = new File(filePath); - - } - - /** - * Check whether the signature file contains signature of native libs - * - * @return true if the file contains signature of native libs - */ - public boolean checkLibDirInSignature() { - try (JarFile inputJar = new JarFile(inputFile, false)) { - for (Enumeration e = inputJar.entries(); e.hasMoreElements();) { - JarEntry entry = e.nextElement(); - if (entry.getName().startsWith(LIB_DIR_NAME) && entry.getName().endsWith(SO_SIG_SUFFIX)) { - return true; - } - } - } catch (IOException e) { - e.printStackTrace(); - } - return false; - } - } - - private static class MultiSignCodeTask implements Callable { - private final File inputFile; - private final String outputPath; - private final CountDownLatch countDownLatch; - - /** - * MultiSignCodeTask constructor. - * - * @param inHap input hap file - * @param outPath signed output file path - * @param countDownLatch count down latch on multi-thread - */ - public MultiSignCodeTask(File inHap, String outPath, CountDownLatch countDownLatch) { - this.inputFile = inHap; - this.outputPath = outPath; - this.countDownLatch = countDownLatch; - } - - @Override - public Boolean call() { - try { - Params params = new Params(); - TestCodeSignServer server = new TestCodeSignServer(); - params.addParam(ParamConstants.PARAM_BASIC_INPUT_FILE, inputFile.getPath()); - params.addParam(ParamConstants.PARAM_BASIC_OUTPUT_PATH, outputPath); - params.addParam(ParamConstants.PARAM_BASIC_SIGN_ALG, DEFAULT_SIGN_ALG); - CodeSignVerify codeSignVerify = new CodeSignVerify(); - return (CodeSignTool.signCode(server, params.toArray()) & - codeSignVerify.verifyCode(inputFile.getPath(), spliceFilePath(outputPath, inputFile.getName()))); - } finally { - countDownLatch.countDown(); - } - } - } - - private static class Params { - private final Set params = new HashSet<>(); - - /** - * Add param. - * - * @param name param name - * @param value param value - */ - public void addParam(String name, String value) { - params.add(new Param(name, value)); - } - - /** - * Parse to String[] params. - * - * @return String[] params - */ - public String[] toArray() { - List paramList = new ArrayList<>(params.size()); - for (Param param : params) { - paramList.add(param.getKey()); - paramList.add(param.getValue()); - } - return paramList.toArray(new String[0]); - } - } - - private static class Param { - private static final String DEFAULT_PREFIX = "-"; - - private final String name; - private final String value; - private final String prefix; - - public Param(String name, String value) { - this(name, value, DEFAULT_PREFIX); - } - - public Param(String name, String value, String prefix) { - this.name = name; - this.value = value; - this.prefix = prefix; - } - - /** - * Get parameter key. - * - * @return parameter key - */ - public String getKey() { - return prefix + name; - } - - public String getValue() { - return value; - } - - @Override - public boolean equals(Object other) { - if (this == other) { - return true; - } - if (other == null || getClass() != other.getClass()) { - return false; - } - if (other instanceof Param) { - Param param = (Param) other; - return Objects.equals(name, param.name); - } - return false; - } - - @Override - public int hashCode() { - return Objects.hash(name); - } - } - - private static class CleanableFile implements Cleanable { - private final File file; - - public CleanableFile(File file) { - this.file = file; - } - - @Override - public void clean() { - if (file != null && file.exists() && file.isFile()) { - try { - Files.delete(file.toPath()); - } catch (IOException e) { - e.printStackTrace(); - } - } - } - } -} diff --git a/codesigntool/code_sign_appgallery_lib/src/test/java/com/ohos/test/signclient/core/signtool/CodeSignVerify.java b/codesigntool/code_sign_appgallery_lib/src/test/java/com/ohos/test/signclient/core/signtool/CodeSignVerify.java deleted file mode 100644 index 2fe646d82bbd4b1f47ce749acef491711a165095..0000000000000000000000000000000000000000 --- a/codesigntool/code_sign_appgallery_lib/src/test/java/com/ohos/test/signclient/core/signtool/CodeSignVerify.java +++ /dev/null @@ -1,176 +0,0 @@ -/* - * Copyright (c) 2023 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.test.signclient.core.signtool; - -import com.ohos.codesigntool.core.exception.FsVerityDigestException; -import com.ohos.codesigntool.core.fsverity.FsVerityGenerator; -import com.ohos.codesigntool.core.utils.CmsUtils; -import com.ohos.codesigntool.core.utils.InputStreamUtils; - -import org.apache.logging.log4j.LogManager; -import org.apache.logging.log4j.Logger; -import org.bouncycastle.cms.CMSException; - -import java.io.File; -import java.io.FileInputStream; -import java.io.InputStream; -import java.io.IOException; -import java.util.ArrayList; -import java.util.Enumeration; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.jar.JarEntry; -import java.util.jar.JarFile; - -/** - * HapSigVerify. - * - * @since 2023/07/1 - */ -public class CodeSignVerify { - private static final Logger LOGGER = LogManager.getLogger(CodeSignVerify.class); - private static final String SO_SUFFIX = ".so"; - private static final String AN_SUFFIX = ".an"; - private static final String SINGLE_SIG_SUFFIX = ".fsv-sig"; - private static final String HAP_SIGNATURE_ENTRY_NAME = "Hap"; - private static final List EXTRACTED_NATIVE_LIB_SUFFIXS = new ArrayList<>(); - private static final List EXTRACTED_SIG_SUFFIXS = new ArrayList<>(); - - static { - EXTRACTED_NATIVE_LIB_SUFFIXS.add(AN_SUFFIX); - EXTRACTED_NATIVE_LIB_SUFFIXS.add(SO_SUFFIX); - EXTRACTED_SIG_SUFFIXS.add(SINGLE_SIG_SUFFIX); - } - - private Map mapHapData = new HashMap(); - private Map mapSignData = new HashMap(); - - /** - * Verify binary files contained within the file - * - * @param hapPath input hap file path - * @param signPath input sign file path - * @return verify result - */ - public boolean verifyCode(String hapPath, String signPath) { - boolean verifyCode = false; - try { - generateMapData(new File(hapPath), false); - generateMapData(new File(signPath), true); - verifyCode = verifyMapData(); - } catch (CMSException | IOException | FsVerityDigestException e) { - LOGGER.error("verify code failed!", e); - } - return verifyCode; - } - - private void generateMapData(File file, boolean isSignFile)throws IOException, FsVerityDigestException { - if (isSignFile) { - mapSignData.clear(); - } else { - mapHapData.clear(); - try (FileInputStream inputStream = new FileInputStream(file)) { - mapHapData.put(HAP_SIGNATURE_ENTRY_NAME, - generateFsVerityDigest(inputStream, file.length())); - } - } - try (JarFile inputJar = new JarFile(file, false)) { - List entryNames = getTargetEntries(inputJar, isSignFile); - if (entryNames.isEmpty()) { - return; - } - if (isSignFile) { - generateMapSignData(entryNames, inputJar); - } else { - generateMapHapData(entryNames, inputJar); - } - } catch (IOException e) { - e.printStackTrace(); - } - } - - private void generateMapHapData(List entryNames, JarFile hap) throws IOException, FsVerityDigestException { - for (String name : entryNames) { - JarEntry inEntry = hap.getJarEntry(name); - try (InputStream inputStream = hap.getInputStream(inEntry)) { - mapHapData.put(name, generateFsVerityDigest(inputStream, inEntry.getSize())); - } - } - } - - private byte[] generateFsVerityDigest(InputStream inputStream, long size) throws FsVerityDigestException { - FsVerityGenerator fsVerityGenerator = new FsVerityGenerator(); - fsVerityGenerator.generateFsVerityDigest(inputStream, size); - return fsVerityGenerator.getFsVerityDigest(); - } - - private void generateMapSignData(List entryNames, JarFile hap) throws IOException, FsVerityDigestException { - for (String name : entryNames) { - JarEntry inEntry = hap.getJarEntry(name); - try (InputStream data = hap.getInputStream(inEntry)) { - byte[] signDigest = InputStreamUtils.toByteArray(data, (int) inEntry.getSize()); - mapSignData.put(name, signDigest); - } - } - } - - private boolean verifyMapData() throws CMSException { - for (Map.Entry entry : mapSignData.entrySet()) { - String signKey = entry.getKey(); - int index = signKey.indexOf(SINGLE_SIG_SUFFIX); - if (index == -1) { - throw new CMSException("Sign file name err:" + signKey); - } - String hapKey = signKey.substring(0, index); - boolean verifyResult = CmsUtils.verifySignDataWithUnsignedDataDigest( - mapHapData.get(hapKey), entry.getValue()); - if (!verifyResult) { - throw new CMSException("PKCS cms data did not verify"); - } - } - return true; - } - - private List getTargetEntries(JarFile file, boolean isSignFile) { - List result = new ArrayList<>(); - for (Enumeration e = file.entries(); e.hasMoreElements();) { - JarEntry entry = e.nextElement(); - if (!entry.isDirectory()) { - if (!isTargetType(entry.getName(), isSignFile)) { - continue; - } - result.add(entry.getName()); - } - } - return result; - } - - private boolean isTargetType(String entryName, boolean isSignFile) { - List stringList; - if (isSignFile) { - stringList = EXTRACTED_SIG_SUFFIXS; - } else { - stringList = EXTRACTED_NATIVE_LIB_SUFFIXS; - } - for (String suffix : stringList) { - if (entryName.endsWith(suffix)) { - return true; - } - } - return false; - } -} diff --git a/codesigntool/code_sign_appgallery_lib/src/test/resources/cs_cert/chain.pem b/codesigntool/code_sign_appgallery_lib/src/test/resources/cs_cert/chain.pem deleted file mode 100644 index 1b7875dace4f93405e14261ac80a674450e04097..0000000000000000000000000000000000000000 --- a/codesigntool/code_sign_appgallery_lib/src/test/resources/cs_cert/chain.pem +++ /dev/null @@ -1,34 +0,0 @@ ------BEGIN CERTIFICATE----- -MIIC1TCCAlugAwIBAgIUQaPZEzo/Zt+vphkwQCn1Ipd3YVYwCgYIKoZIzj0EAwIw -YzELMAkGA1UEBhMCQ04xDzANBgNVBAoMBkh1YXdlaTETMBEGA1UECwwKSHVhd2Vp -IENCRzEuMCwGA1UEAwwlSGFybW9ueU9TIENvZGUgU2lnbmF0dXJlIFJvb3QgQ0Eg -VGVzdDAeFw0yMzA0MjMxMjU1MDhaFw0zMzA0MjAxMjU1MDhaMGMxCzAJBgNVBAYT -AkNOMQ8wDQYDVQQKDAZIdWF3ZWkxEzARBgNVBAsMCkh1YXdlaSBDQkcxLjAsBgNV -BAMMJUhhcm1vbnlPUyBDb2RlIFNpZ25hdHVyZSBSb290IENBIFRlc3QwdjAQBgcq -hkjOPQIBBgUrgQQAIgNiAAQOLq0yERrODcj6ovg6vfjhnQOrbMmLZCeHycXAgUPh -zLnGOQKd9K1BNHJQVm2EKUmL/tZqkLPuvchH3eyCzRd2t5AxHTXu8JOUQofs/FFK -RzcCKLuGoWuxLGkULt3CzSmjgc8wgcwwgYkGA1UdIwSBgTB/oWekZTBjMQswCQYD -VQQGEwJDTjEPMA0GA1UECgwGSHVhd2VpMRMwEQYDVQQLDApIdWF3ZWkgQ0JHMS4w -LAYDVQQDDCVIYXJtb255T1MgQ29kZSBTaWduYXR1cmUgUm9vdCBDQSBUZXN0ghRB -o9kTOj9m36+mGTBAKfUil3dhVjAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFCei -PbomVCZZKoOG2pIn5E3XDaDQMA8GA1UdEwEB/wQFMAMBAf8wCgYIKoZIzj0EAwID -aAAwZQIwDjg7eVeyeeDuhvIDh5UvKcCwCxz/BFJx7c8zq+GyhXNkh2j1uYP8pTLG -7a28b0BdAjEAj65RKIPtjfNacJa49j/Rqu4FNSjS7oQ7akn9n7ckNGDVzuq6O4I/ -jscF0b6WoP9o ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIICjzCCAhagAwIBAgIUSblP8XU4Qo9ZjSQ8lKBTKzuIIEUwCgYIKoZIzj0EAwIw -YzELMAkGA1UEBhMCQ04xDzANBgNVBAoMBkh1YXdlaTETMBEGA1UECwwKSHVhd2Vp -IENCRzEuMCwGA1UEAwwlSGFybW9ueU9TIENvZGUgU2lnbmF0dXJlIFJvb3QgQ0Eg -VGVzdDAeFw0yMzA0MjMxMjU1MjRaFw0zMzA0MjAxMjU1MjRaMHkxCzAJBgNVBAYT -AkNOMRQwEgYDVQQKDAtPcGVuSGFybW9ueTEeMBwGA1UECwwVT3Blbkhhcm1vbnkg -Q29tbXVuaXR5MTQwMgYDVQQDDCtPcGVuSGFybW9ueSBBcHBsaWNhdGlvbiBDb2Rl -IFNpZ25hdHVyZSBUZXN0MHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEg1t25S3a+z9/ -MUtBHPnt3LI62xmF1NBmX6xbpjw+q4hGqHii1nHZ8onn6lWiX3qeLjsZsn/CfPeY -oebNXIgvkqx7fXvvB8HP6f8c85K6Dtl9PZc3qo/KRa1Qivm9I/nUo3UwczAfBgNV -HSMEGDAWgBQnoj26JlQmWSqDhtqSJ+RN1w2g0DAdBgNVHQ4EFgQUEsl6AUobaB/e -ouEnvRIiF4WxHXcwCQYDVR0TBAIwADAOBgNVHQ8BAf8EBAMCB4AwFgYDVR0lAQH/ -BAwwCgYIKwYBBQUHAwMwCgYIKoZIzj0EAwIDZwAwZAIwRAkNKX5gg+7026bP0yJE -cQaW0dEPnG6FozYY8PZ1WHZ/ZENZWVDnX55y2D3VaHQ6AjAFds6rnwwYjgX5zDC4 -J8SPp9ee5HwKQLy2Pgv3g0XDYWBS2nIRrCvxgBR/hbk+/ek= ------END CERTIFICATE----- diff --git a/codesigntool/code_sign_appgallery_lib/src/test/resources/cs_cert/cstest.jks b/codesigntool/code_sign_appgallery_lib/src/test/resources/cs_cert/cstest.jks deleted file mode 100644 index 25ad454bc1fe531784b1065c2538b4509a498ebd..0000000000000000000000000000000000000000 Binary files a/codesigntool/code_sign_appgallery_lib/src/test/resources/cs_cert/cstest.jks and /dev/null differ diff --git a/codesigntool/code_sign_appgallery_lib/src/test/resources/haps/FA/false.hap b/codesigntool/code_sign_appgallery_lib/src/test/resources/haps/FA/false.hap deleted file mode 100644 index 60eb3305f4a59cdb12c9eaec0effee3103ef98fa..0000000000000000000000000000000000000000 Binary files a/codesigntool/code_sign_appgallery_lib/src/test/resources/haps/FA/false.hap and /dev/null differ diff --git a/codesigntool/code_sign_appgallery_lib/src/test/resources/haps/FA/none.hap b/codesigntool/code_sign_appgallery_lib/src/test/resources/haps/FA/none.hap deleted file mode 100644 index 6658c74c516a9e7c29f220d2b55fe34faad60213..0000000000000000000000000000000000000000 Binary files a/codesigntool/code_sign_appgallery_lib/src/test/resources/haps/FA/none.hap and /dev/null differ diff --git a/codesigntool/code_sign_appgallery_lib/src/test/resources/haps/FA/true.hap b/codesigntool/code_sign_appgallery_lib/src/test/resources/haps/FA/true.hap deleted file mode 100644 index fe931367c2feb87b75efd4a36e4d0532f6a0abe7..0000000000000000000000000000000000000000 Binary files a/codesigntool/code_sign_appgallery_lib/src/test/resources/haps/FA/true.hap and /dev/null differ diff --git a/codesigntool/code_sign_appgallery_lib/src/test/resources/haps/STAGE/false.hap b/codesigntool/code_sign_appgallery_lib/src/test/resources/haps/STAGE/false.hap deleted file mode 100644 index 3c9ce444ba43f2e05bd1c53d3b6f2d54a6876624..0000000000000000000000000000000000000000 Binary files a/codesigntool/code_sign_appgallery_lib/src/test/resources/haps/STAGE/false.hap and /dev/null differ diff --git a/codesigntool/code_sign_appgallery_lib/src/test/resources/haps/STAGE/none.hap b/codesigntool/code_sign_appgallery_lib/src/test/resources/haps/STAGE/none.hap deleted file mode 100644 index 8814c1f87c8ceaf040d96d9b0fe72c662abc0920..0000000000000000000000000000000000000000 Binary files a/codesigntool/code_sign_appgallery_lib/src/test/resources/haps/STAGE/none.hap and /dev/null differ diff --git a/codesigntool/code_sign_appgallery_lib/src/test/resources/haps/STAGE/true.hap b/codesigntool/code_sign_appgallery_lib/src/test/resources/haps/STAGE/true.hap deleted file mode 100644 index 093c309f9a59f7f1c982f4e12f3063268f37c4c5..0000000000000000000000000000000000000000 Binary files a/codesigntool/code_sign_appgallery_lib/src/test/resources/haps/STAGE/true.hap and /dev/null differ diff --git a/codesigntool/code_sign_tool_lib/pom.xml b/codesigntool/code_sign_tool_lib/pom.xml deleted file mode 100644 index 14c3ff543c19b1c1329c9af56478744bac6503e5..0000000000000000000000000000000000000000 --- a/codesigntool/code_sign_tool_lib/pom.xml +++ /dev/null @@ -1,91 +0,0 @@ - - - - 4.0.0 - - - codesigntool - com.ohos.codesigntool - ${revision} - - code_sign_tool_lib - - - - org.bouncycastle - bcpkix-jdk15on - 1.69 - - - org.apache.logging.log4j - log4j-core - - - com.google.code.gson - gson - - - org.apache.commons - commons-lang3 - - - com.mikesamuel - json-sanitizer - - - junit - junit - 4.13.2 - test - - - - code_sign_tool_lib - - - org.apache.maven.plugins - maven-compiler-plugin - 3.7.0 - - 1.8 - 1.8 - UTF-8 - true - - -Xlint:all - - - - - org.apache.maven.plugins - maven-resources-plugin - 3.0.2 - - UTF-8 - - - - org.apache.maven.plugins - maven-jar-plugin - 2.6 - - ../outputs - - - - - diff --git a/codesigntool/code_sign_tool_lib/src/main/java/com/ohos/codesigntool/core/api/CodeSignServer.java b/codesigntool/code_sign_tool_lib/src/main/java/com/ohos/codesigntool/core/api/CodeSignServer.java deleted file mode 100644 index cbf5a031b2b4e59bda35514d346024c7f0ee536f..0000000000000000000000000000000000000000 --- a/codesigntool/code_sign_tool_lib/src/main/java/com/ohos/codesigntool/core/api/CodeSignServer.java +++ /dev/null @@ -1,32 +0,0 @@ -/* - * Copyright (c) 2023 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.codesigntool.core.api; - -/** - * sign code use remotesign online - * - * @since 2023/06/05 - */ -public interface CodeSignServer { - /** - * interface of get signature from server - * - * @param data unsigned data - * @param signatureAlg Signature Algorithms - * @return signed data - */ - String getSignature(byte[] data, String signatureAlg); -} diff --git a/codesigntool/code_sign_tool_lib/src/main/java/com/ohos/codesigntool/core/config/CodeSignConfig.java b/codesigntool/code_sign_tool_lib/src/main/java/com/ohos/codesigntool/core/config/CodeSignConfig.java deleted file mode 100644 index 500892ef285b87cf03a0777b3458ee21f5a68213..0000000000000000000000000000000000000000 --- a/codesigntool/code_sign_tool_lib/src/main/java/com/ohos/codesigntool/core/config/CodeSignConfig.java +++ /dev/null @@ -1,223 +0,0 @@ -/* - * Copyright (c) 2023 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.codesigntool.core.config; - -import com.ohos.codesigntool.core.api.CodeSignServer; -import com.ohos.codesigntool.core.response.DataFromSignCenterServer; -import com.ohos.codesigntool.core.sign.SignAlgorithm; -import com.ohos.codesigntool.core.utils.CertUtils; -import org.apache.commons.lang3.ArrayUtils; -import org.apache.commons.lang3.StringUtils; -import org.apache.logging.log4j.LogManager; -import org.apache.logging.log4j.Logger; - -import java.security.InvalidAlgorithmParameterException; -import java.security.InvalidKeyException; -import java.security.NoSuchAlgorithmException; -import java.security.NoSuchProviderException; -import java.security.PrivateKey; -import java.security.Signature; -import java.security.SignatureException; -import java.security.cert.X509CRL; -import java.security.cert.X509Certificate; -import java.security.spec.AlgorithmParameterSpec; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -/** - * Signature mode super class - * - * @since 2023/06/05 - */ -public class CodeSignConfig { - private static final Logger LOGGER = LogManager.getLogger(CodeSignConfig.class); - - /** - * list of x509 certificate used for sign hap - * - */ - private List x509CertList; - - /** - * certificate revocation list return from server - * - */ - private List x509CRLList; - - /** - * list of signature Algorithm used for sign hap - * - */ - private List signAlgList; - - /** - * map of signature param for sign hap - * - */ - private Map signParamMap = new HashMap(); - - /** - * server interface for get signature - * - */ - private CodeSignServer server = null; - - /** - * fill signature parameters - * - * @param params input paramters for sign hap - */ - public void setSignParamsMap(Map params) { - this.signParamMap = params; - } - - /** - * use signatureAlg to sigh the input data - * - * @param data unsigned data - * @param signatureAlg name of signature Algorithm - * @return signed data - */ - public byte[] getSignature(byte[] data, String signatureAlg) { - return ArrayUtils.EMPTY_BYTE_ARRAY; - } - - /** - * use signatureAlg with AlgorithmParameterSpec to sigh the input data - * - * @param data unsigned data - * @param signatureAlg name of signature Algorithm - * @param second paramters of signature Algorithm - * @return signed data - */ - public byte[] getSignature(byte[] data, String signatureAlg, AlgorithmParameterSpec second) { - return ArrayUtils.EMPTY_BYTE_ARRAY; - } - - /** - * signature function. - * - * @param data unsigned data. - * @param algName algorithm name. - * @param privateKey use to sign. - * @param second algorithm parameters. - * @return byte array of signature. - * @throws NoSuchProviderException get BC provider failed. - * @throws NoSuchAlgorithmException use error algorithm. - * @throws InvalidKeyException error key. - * @throws InvalidAlgorithmParameterException error parameters of algorithm. - * @throws SignatureException signing failed. - */ - protected byte[] getSignature(byte[] data, String algName, PrivateKey privateKey, AlgorithmParameterSpec second) - throws NoSuchProviderException, NoSuchAlgorithmException, InvalidKeyException, - InvalidAlgorithmParameterException, SignatureException { - Signature signature = Signature.getInstance(algName, "BC"); - signature.initSign(privateKey); - if (second != null) { - signature.setParameter(second); - } - signature.update(data); - return signature.sign(); - } - - /** - * refresh crl list by object of json. - * - * @param data input object of DataFromSignCenterServer. - */ - protected void refreshCrlListByResponseData(DataFromSignCenterServer data) { - String encodeCRLData = data.getCrl(); - if (isStringDataInvalid(encodeCRLData)) { - this.x509CRLList = null; - LOGGER.warn("Get CRL data is null!"); - } else { - this.x509CRLList = new ArrayList<>(); - this.x509CRLList.add(CertUtils.getX509CRLByBase64EncodedString(encodeCRLData)); - } - } - - /** - * refresh cert list by object of json. - * - * @param data input object of DataFromSignCenterServer. - * @return true, if get certificates successfully. - */ - protected boolean refreshCertListByResponseData(DataFromSignCenterServer data) { - if (data.getCertchain() == null || data.getCertchain().length == 0) { - LOGGER.error("cert chain array is empty!"); - return false; - } - - this.x509CertList = new ArrayList<>(); - for (String cert : data.getCertchain()) { - this.x509CertList.add(CertUtils.getX509CertByBase64EncodedString(cert)); - } - return true; - } - - /** - * check whether string data is invalid. - * - * @param stringData string data. - * @return true, if input is null or is empty. - */ - protected boolean isStringDataInvalid(String stringData) { - return (stringData == null) || StringUtils.isEmpty(stringData); - } - - public void setSignAlgList(List signAlgList) { - this.signAlgList = signAlgList; - } - - public List getSignAlgList() { - return signAlgList; - } - - public void setX509CertList(List x509CertList) { - this.x509CertList = x509CertList; - } - - public List getX509CertList() { - return x509CertList; - } - - public void setX509CRLList(List x509CRLList) { - this.x509CRLList = x509CRLList; - } - - public List getX509CRLList() { - return x509CRLList; - } - - public void setSignParamMap(Map signParamMap) { - this.signParamMap = signParamMap; - } - - public Map getSignParamMap() { - return signParamMap; - } - - public void setServer(CodeSignServer server) { - this.server = server; - } - - public CodeSignServer getServer() { - return server; - } -} - diff --git a/codesigntool/code_sign_tool_lib/src/main/java/com/ohos/codesigntool/core/config/RemoteCodeSignConfig.java b/codesigntool/code_sign_tool_lib/src/main/java/com/ohos/codesigntool/core/config/RemoteCodeSignConfig.java deleted file mode 100644 index d366d645ebfdd982ee4f6761956673156789749a..0000000000000000000000000000000000000000 --- a/codesigntool/code_sign_tool_lib/src/main/java/com/ohos/codesigntool/core/config/RemoteCodeSignConfig.java +++ /dev/null @@ -1,103 +0,0 @@ -/* - * Copyright (c) 2023 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.codesigntool.core.config; - -import com.google.gson.Gson; -import com.ohos.codesigntool.core.response.DataFromAppGallaryServer; -import com.ohos.codesigntool.core.response.DataFromSignCenterServer; -import org.apache.commons.lang3.ArrayUtils; -import org.apache.logging.log4j.LogManager; -import org.apache.logging.log4j.Logger; - -import java.security.spec.AlgorithmParameterSpec; -import java.util.Base64; - -/** - * Signature code by remote server online - * - * @since 2023/06/05 - */ -public class RemoteCodeSignConfig extends CodeSignConfig { - private static final Logger LOGGER = LogManager.getLogger(RemoteCodeSignConfig.class); - @Override - public byte[] getSignature(byte[] data, String signatureAlg, AlgorithmParameterSpec second) { - LOGGER.info("Compute signature by remote mode!"); - if (this.getServer() == null) { - LOGGER.error("server is null"); - return null; - } - String responseData = this.getServer().getSignature(data, signatureAlg); - byte[] signBytes = getSignFromServer(responseData); - if (signBytes != null && signBytes.length > 0) { - LOGGER.info("Get signature data success!"); - } else { - LOGGER.error("Get signature data failed!"); - return null; - } - return signBytes; - } - - /** - * parse response data from server and return the decrypted signature data. - * - * @param responseData response data from server - * @return binary data of signature - */ - public byte[] getSignFromServer(String responseData) { - if (isStringDataInvalid(responseData)) { - LOGGER.error("Get invalid response from signature server!"); - return ArrayUtils.EMPTY_BYTE_ARRAY; - } - DataFromAppGallaryServer dataFromAppGallaryServer = - new Gson().fromJson(responseData, DataFromAppGallaryServer.class); - if (dataFromAppGallaryServer == null || !isSignSuccess(dataFromAppGallaryServer)) { - LOGGER.error("ResponseJson is illegals!"); - return ArrayUtils.EMPTY_BYTE_ARRAY; - } - - DataFromSignCenterServer signCenterData = - dataFromAppGallaryServer.getDataFromSignCenterServer(); - if (signCenterData == null) { - LOGGER.error("Get response data from sign center server error!"); - return ArrayUtils.EMPTY_BYTE_ARRAY; - } - - if (!refreshCertListByResponseData(signCenterData)) { - LOGGER.error("Refresh certificate list data failed!"); - return ArrayUtils.EMPTY_BYTE_ARRAY; - } - - refreshCrlListByResponseData(signCenterData); - - String encodeSignedData = signCenterData.getSignedData(); - if (isStringDataInvalid(encodeSignedData)) { - LOGGER.error("Get signedData data error!"); - return ArrayUtils.EMPTY_BYTE_ARRAY; - } - return Base64.getUrlDecoder().decode(encodeSignedData); - } - - private boolean isSignSuccess(DataFromAppGallaryServer dataFromAppGallaryServer) { - if (!"success".equals(dataFromAppGallaryServer.getCodeSignature())) { - if (dataFromAppGallaryServer.getMessage() != null) { - LOGGER.error("Get code signature failed: {}", dataFromAppGallaryServer.getMessage()); - } - return false; - } - return true; - } - -} diff --git a/codesigntool/code_sign_tool_lib/src/main/java/com/ohos/codesigntool/core/exception/CodeSignException.java b/codesigntool/code_sign_tool_lib/src/main/java/com/ohos/codesigntool/core/exception/CodeSignException.java deleted file mode 100644 index 8f328a3406db05bbe90a13844b5c2cd6ce7ed9bb..0000000000000000000000000000000000000000 --- a/codesigntool/code_sign_tool_lib/src/main/java/com/ohos/codesigntool/core/exception/CodeSignException.java +++ /dev/null @@ -1,45 +0,0 @@ -/* - * Copyright (c) 2023 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.codesigntool.core.exception; - -/** - * CodeSign exception. - * - * @since 2023/06/05 - */ -public class CodeSignException extends Exception { - - private static final long serialVersionUID = -281871003709431259L; - - /** - * CodeSignException - * - * @param message msg - */ - public CodeSignException(String message) { - super(message); - } - - /** - * CodeSignException - * - * @param message msg - * @param cause cause - */ - public CodeSignException(String message, Throwable cause) { - super(message, cause); - } -} diff --git a/codesigntool/code_sign_tool_lib/src/main/java/com/ohos/codesigntool/core/exception/FsVerityDigestException.java b/codesigntool/code_sign_tool_lib/src/main/java/com/ohos/codesigntool/core/exception/FsVerityDigestException.java deleted file mode 100644 index 1fd13e43b5c9657fc51699c71de08560aa440fd2..0000000000000000000000000000000000000000 --- a/codesigntool/code_sign_tool_lib/src/main/java/com/ohos/codesigntool/core/exception/FsVerityDigestException.java +++ /dev/null @@ -1,34 +0,0 @@ -/* - * Copyright (c) 2023 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.codesigntool.core.exception; - -/** - * Could't compute FsVerity digest of a file - * - * @since 2023/06/05 - */ -public class FsVerityDigestException extends Exception { - - private static final long serialVersionUID = 5788641970791287892L; - - public FsVerityDigestException(String message) { - super(message); - } - - public FsVerityDigestException(String message, Throwable cause) { - super(message, cause); - } -} diff --git a/codesigntool/code_sign_tool_lib/src/main/java/com/ohos/codesigntool/core/exception/InvalidParamsException.java b/codesigntool/code_sign_tool_lib/src/main/java/com/ohos/codesigntool/core/exception/InvalidParamsException.java deleted file mode 100644 index 44caac11fef6c610266ef967f848376c3aca14ce..0000000000000000000000000000000000000000 --- a/codesigntool/code_sign_tool_lib/src/main/java/com/ohos/codesigntool/core/exception/InvalidParamsException.java +++ /dev/null @@ -1,45 +0,0 @@ -/* - * Copyright (c) 2023 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.codesigntool.core.exception; - -/** - * Exception occurs when the inputted parameters are invalid. - * - * @since 2023/06/05 - */ -public class InvalidParamsException extends Exception { - - private static final long serialVersionUID = -3379598647287693325L; - - /** - * Exception occurs when the inputted parameters are invalid. - * - * @param message msg - */ - public InvalidParamsException(String message) { - super(message); - } - - /** - * Exception occurs when the inputted parameters are invalid. - * - * @param message msg - * @param cause cause - */ - public InvalidParamsException(String message, Throwable cause) { - super(message, cause); - } -} diff --git a/codesigntool/code_sign_tool_lib/src/main/java/com/ohos/codesigntool/core/exception/MissingParamsException.java b/codesigntool/code_sign_tool_lib/src/main/java/com/ohos/codesigntool/core/exception/MissingParamsException.java deleted file mode 100644 index 15d44184460d74f10ef13a4542b658d2e820da2e..0000000000000000000000000000000000000000 --- a/codesigntool/code_sign_tool_lib/src/main/java/com/ohos/codesigntool/core/exception/MissingParamsException.java +++ /dev/null @@ -1,45 +0,0 @@ -/* - * Copyright (c) 2023 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.codesigntool.core.exception; - -/** - * Exception occurs when the required parameters are not entered. - * - * @since 2023/06/05 - */ -public class MissingParamsException extends Exception { - - private static final long serialVersionUID = -8922730964374794468L; - - /** - * Exception occurs when the required parameters are not entered. - * - * @param message msg - */ - public MissingParamsException(String message) { - super(message); - } - - /** - * Exception occurs when the required parameters are not entered. - * - * @param message msg - * @param cause cause - */ - public MissingParamsException(String message, Throwable cause) { - super(message, cause); - } -} diff --git a/codesigntool/code_sign_tool_lib/src/main/java/com/ohos/codesigntool/core/fsverity/FsVerityDescriptor.java b/codesigntool/code_sign_tool_lib/src/main/java/com/ohos/codesigntool/core/fsverity/FsVerityDescriptor.java deleted file mode 100644 index ca56058f43aa119aa4274f1dd2b5f0c5eec6926f..0000000000000000000000000000000000000000 --- a/codesigntool/code_sign_tool_lib/src/main/java/com/ohos/codesigntool/core/fsverity/FsVerityDescriptor.java +++ /dev/null @@ -1,95 +0,0 @@ -/* - * Copyright (c) 2023 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.codesigntool.core.fsverity; - -import com.ohos.codesigntool.core.exception.FsVerityDigestException; - -import java.nio.ByteBuffer; -import java.nio.ByteOrder; - -/** - * Format of FsVerity descriptor - * - * @since 2023/06/05 - */ -public class FsVerityDescriptor { - // Format - // uint8 version - // uint8 hashAlgorithm - // uint8 log2BlockSize - // uint8 saltSize - // uint8[4] 0 - // le64 dataSize - // uint8[64] rootHash - // uint8[32] salt - // uint8[144] 0 - - private static final byte VERSION = 1; - private static final int DESCRIPTOR_SIZE = 256; - private static final int ROOT_HASH_FILED_SIZE = 64; - private static final int SALT_SIZE = 32; - private static final int FIRST_RESERVED_SIZE = 4; - private static final int LAST_RESERVED_SIZE = 144; - - /** - * Get FsVerity descriptor - * - * @param fileSize size of input - * @param hashAlgorithm hash algorithm id - * @param log2BlockSize log2 of hash block size - * @param salt salt used for hash - * @param rawRootHash root hash of merkle tree - * @return bytes of descriptor - * @throws FsVerityDigestException if error - */ - public static byte[] getDescriptor(long fileSize, byte hashAlgorithm, byte log2BlockSize, - byte[] salt, byte[] rawRootHash) throws FsVerityDigestException { - ByteBuffer buffer = ByteBuffer.allocate(DESCRIPTOR_SIZE).order(ByteOrder.LITTLE_ENDIAN); - buffer.put(VERSION); - buffer.put(hashAlgorithm); - buffer.put(log2BlockSize); - if (salt == null) { - buffer.put((byte) 0); - } else if (salt.length > SALT_SIZE) { - throw new FsVerityDigestException("Salt is too long"); - } else { - buffer.put((byte) salt.length); - } - writeBytesWithSize(buffer, null, FIRST_RESERVED_SIZE); - buffer.putLong(fileSize); - writeBytesWithSize(buffer, rawRootHash, ROOT_HASH_FILED_SIZE); - writeBytesWithSize(buffer, salt, SALT_SIZE); - return buffer.array(); - } - - /** - * Write bytes to ByteBuffer with specific size - * - * @param buffer target buffer - * @param src bytes to write - * @param size size of written bytes, fill 0 if src bytes is long enough - */ - private static void writeBytesWithSize(ByteBuffer buffer, byte[] src, int size) { - if (src != null) { - if (src.length > size) { - buffer.put(src, 0, size); - } else { - buffer.put(src); - } - } - buffer.position(buffer.position() + size); - } -} diff --git a/codesigntool/code_sign_tool_lib/src/main/java/com/ohos/codesigntool/core/fsverity/FsVerityDigest.java b/codesigntool/code_sign_tool_lib/src/main/java/com/ohos/codesigntool/core/fsverity/FsVerityDigest.java deleted file mode 100644 index dcb02f078e0cc2499c8e46bee7c21c698a73d0d7..0000000000000000000000000000000000000000 --- a/codesigntool/code_sign_tool_lib/src/main/java/com/ohos/codesigntool/core/fsverity/FsVerityDigest.java +++ /dev/null @@ -1,52 +0,0 @@ -/* - * Copyright (c) 2023 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.codesigntool.core.fsverity; - -import java.nio.ByteBuffer; -import java.nio.ByteOrder; -import java.nio.charset.StandardCharsets; - -/** - * Format of FsVerity digest - * - * @since 2023/06/05 - */ -public class FsVerityDigest { - // Format - // int8[8] magic "FSVerity" - // le16 digestAlgorithm sha256 = 1, sha512 = 2 - // le16 digestSize - // uint8[] digest - private static final String FSVERITY_DIGEST_MAGIC = "FSVerity"; - private static final int DIGEST_HEADER_SIZE = 12; - - /** - * Get formatted FsVerity digest - * - * @param algoID hash algorithm id - * @param digest raw digest computed from input - * @return formatted FsVerity digest bytes - */ - public static byte[] getFsVerityDigest(byte algoID, byte[] digest) { - int size = DIGEST_HEADER_SIZE + digest.length; - ByteBuffer buffer = ByteBuffer.allocate(size).order(ByteOrder.LITTLE_ENDIAN); - buffer.put(FSVERITY_DIGEST_MAGIC.getBytes(StandardCharsets.UTF_8)); - buffer.putShort(algoID); - buffer.putShort((short) digest.length); - buffer.put(digest); - return buffer.array(); - } -} diff --git a/codesigntool/code_sign_tool_lib/src/main/java/com/ohos/codesigntool/core/fsverity/FsVerityGenerator.java b/codesigntool/code_sign_tool_lib/src/main/java/com/ohos/codesigntool/core/fsverity/FsVerityGenerator.java deleted file mode 100644 index a4ca3868542e2a86a4d02e2432b88f1e1e890873..0000000000000000000000000000000000000000 --- a/codesigntool/code_sign_tool_lib/src/main/java/com/ohos/codesigntool/core/fsverity/FsVerityGenerator.java +++ /dev/null @@ -1,112 +0,0 @@ -/* - * Copyright (c) 2023 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.codesigntool.core.fsverity; - -import com.ohos.codesigntool.core.exception.FsVerityDigestException; -import com.ohos.codesigntool.core.utils.DigestUtils; - -import java.io.IOException; -import java.io.InputStream; -import java.security.NoSuchAlgorithmException; - -/** - * FsVerity data generator supper class - * - * @since 2023/06/05 - */ -public class FsVerityGenerator { - /** - * FsVerity hash algorithm - */ - private static final FsVerityHashAlgorithm FS_VERITY_HASH_ALGORITHM = FsVerityHashAlgorithm.SHA256; - private static final byte LOG2_OF_FSVERITY_HASH_PAGE_SIZE = 12; - - /** - * salt for hashing one page - */ - protected byte[] salt = null; - - private byte[] fsVerityDigest = null; - private byte[] treeBytes = null; - - /** - * generate merkle tree of given input - * - * @param inputStream input stream for generating merkle tree - * @param size total size of input stream - * @param fsVerityHashAlgorithm hash algorithm for FsVerity - * @return merkle tree - * @throws FsVerityDigestException if error - */ - public MerkleTree generateMerkleTree(InputStream inputStream, long size, - FsVerityHashAlgorithm fsVerityHashAlgorithm) throws FsVerityDigestException { - MerkleTree merkleTree; - try { - merkleTree = new MerkleTreeBuilder().generateMerkleTree(inputStream, size, fsVerityHashAlgorithm); - } catch (IOException e) { - throw new FsVerityDigestException("IOException: " + e.getMessage()); - } catch (NoSuchAlgorithmException e) { - throw new FsVerityDigestException("Invalid algorithm:" + e.getMessage()); - } - return merkleTree; - } - - /** - * generate FsVerity digest of given input - * - * @param inputStream input stream for generating FsVerity digest - * @param size total size of input stream - * @throws FsVerityDigestException if error - */ - public void generateFsVerityDigest(InputStream inputStream, long size) - throws FsVerityDigestException { - MerkleTree merkleTree; - if (size == 0) { - merkleTree = new MerkleTree(null, null, FS_VERITY_HASH_ALGORITHM); - } else { - merkleTree = generateMerkleTree(inputStream, size, FS_VERITY_HASH_ALGORITHM); - } - byte[] fsVerityDescriptor = FsVerityDescriptor.getDescriptor(size, - FS_VERITY_HASH_ALGORITHM.getId(), LOG2_OF_FSVERITY_HASH_PAGE_SIZE, - salt, merkleTree.rootHash); - byte[] digest; - try { - digest = DigestUtils.computeDigest(fsVerityDescriptor, FS_VERITY_HASH_ALGORITHM.getHashAlgorithm()); - } catch (NoSuchAlgorithmException e) { - throw new FsVerityDigestException("Invalid algorithm" + e.getMessage(), e); - } - fsVerityDigest = FsVerityDigest.getFsVerityDigest(FS_VERITY_HASH_ALGORITHM.getId(), digest); - treeBytes = merkleTree.tree; - } - - /** - * Get FsVerity digest - * - * @return bytes of FsVerity digest - */ - public byte[] getFsVerityDigest() { - return fsVerityDigest; - } - - /** - * Get merkle tree in bytes - * - * @return bytes of merkle tree - */ - public byte[] getTreeBytes() { - return treeBytes; - } -} diff --git a/codesigntool/code_sign_tool_lib/src/main/java/com/ohos/codesigntool/core/fsverity/FsVerityHashAlgorithm.java b/codesigntool/code_sign_tool_lib/src/main/java/com/ohos/codesigntool/core/fsverity/FsVerityHashAlgorithm.java deleted file mode 100644 index f8d93bc162020d088a88ac69d61503e79269cf66..0000000000000000000000000000000000000000 --- a/codesigntool/code_sign_tool_lib/src/main/java/com/ohos/codesigntool/core/fsverity/FsVerityHashAlgorithm.java +++ /dev/null @@ -1,48 +0,0 @@ -/* - * Copyright (c) 2023 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.codesigntool.core.fsverity; - -/** - * FsVerity hash algorithm - * - * @since 2023/06/05 - */ -public enum FsVerityHashAlgorithm { - SHA256((byte) 1, "SHA-256", 256 / 8), - SHA512((byte) 2, "SHA-512", 512 / 8); - - private final byte id; - private final String hashAlgorithm; - private final int outputByteSize; - - FsVerityHashAlgorithm(byte id, String hashAlgorithm, int outputByteSize) { - this.id = id; - this.hashAlgorithm = hashAlgorithm; - this.outputByteSize = outputByteSize; - } - - public byte getId() { - return id; - } - - public String getHashAlgorithm() { - return hashAlgorithm; - } - - public int getOutputByteSize() { - return outputByteSize; - } -} diff --git a/codesigntool/code_sign_tool_lib/src/main/java/com/ohos/codesigntool/core/fsverity/MerkleTree.java b/codesigntool/code_sign_tool_lib/src/main/java/com/ohos/codesigntool/core/fsverity/MerkleTree.java deleted file mode 100644 index 544a536b3043c8489dd7264333a367d43c9d81bb..0000000000000000000000000000000000000000 --- a/codesigntool/code_sign_tool_lib/src/main/java/com/ohos/codesigntool/core/fsverity/MerkleTree.java +++ /dev/null @@ -1,44 +0,0 @@ -/* - * Copyright (c) 2023 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.codesigntool.core.fsverity; - -/** - * Merkel tree data - * - * @since 2023/06/05 - */ -public class MerkleTree { - /** - * root hash of merkle tree - */ - public final byte[] rootHash; - - /** - * content data of merkle tree - */ - public final byte[] tree; - - /** - * hash algorithm used for merkle tree - */ - public final FsVerityHashAlgorithm fsVerityHashAlgorithm; - - MerkleTree(byte[] rootHash, byte[] tree, FsVerityHashAlgorithm fsVerityHashAlgorithm) { - this.rootHash = rootHash; - this.tree = tree; - this.fsVerityHashAlgorithm = fsVerityHashAlgorithm; - } -} diff --git a/codesigntool/code_sign_tool_lib/src/main/java/com/ohos/codesigntool/core/fsverity/MerkleTreeBuilder.java b/codesigntool/code_sign_tool_lib/src/main/java/com/ohos/codesigntool/core/fsverity/MerkleTreeBuilder.java deleted file mode 100644 index b627931afcb5e44a54a89964b687348da4d7bd35..0000000000000000000000000000000000000000 --- a/codesigntool/code_sign_tool_lib/src/main/java/com/ohos/codesigntool/core/fsverity/MerkleTreeBuilder.java +++ /dev/null @@ -1,383 +0,0 @@ -/* - * Copyright (c) 2023 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.codesigntool.core.fsverity; - -import com.ohos.codesigntool.core.utils.DigestUtils; - -import org.apache.logging.log4j.LogManager; -import org.apache.logging.log4j.Logger; - -import java.io.IOException; -import java.io.InputStream; -import java.nio.ByteBuffer; -import java.security.NoSuchAlgorithmException; -import java.util.ArrayList; -import java.util.concurrent.ArrayBlockingQueue; -import java.util.concurrent.ExecutorService; -import java.util.concurrent.Phaser; -import java.util.concurrent.ThreadPoolExecutor; -import java.util.concurrent.TimeUnit; - -/** - * Merkle tree builder - * - * @since 2023/06/19 - */ -public class MerkleTreeBuilder { - private static final Logger LOGGER = LogManager.getLogger(MerkleTreeBuilder.class); - - private static final int FSVERITY_HASH_PAGE_SIZE = 4096; - - private static final long INPUTSTREAM_MAX_SIZE = 4503599627370496L; - - private static final int CHUNK_SIZE = 4096; - - private static final long MAX_READ_SIZE = 4194304L; - - private static final int MAX_PROCESSORS = 32; - - private static final int BLOCKINGQUEUE = 4; - - private static final int POOL_SIZE = Math.min(MAX_PROCESSORS, - Runtime.getRuntime().availableProcessors()); - - private String mAlgorithm = "SHA-256"; - - private final ExecutorService mPools = new ThreadPoolExecutor(POOL_SIZE, POOL_SIZE, 0L, - TimeUnit.MILLISECONDS, new ArrayBlockingQueue<>(BLOCKINGQUEUE), - new ThreadPoolExecutor.CallerRunsPolicy()); - - /** - * Turn off multitasking - */ - public void close() { - this.mPools.shutdownNow(); - } - - /** - * set algorithm - * - * @param algorithm hash algorithm - */ - private void setAlgorithm(String algorithm) { - this.mAlgorithm = algorithm; - } - - /** - * translation inputStream to ByteBuffer - * - * @param inputStream input stream for generating merkle tree - * @param size total size of input stream - * @return ByteBuffer data - * @throws IOException if error - */ - private ByteBuffer[] convertToByteBuffer(InputStream inputStream, long size) - throws IOException { - if (size == 0) { - throw new IOException("Input size is empty"); - } else if (size > INPUTSTREAM_MAX_SIZE) { - throw new IOException("Input size is too long"); - } - int count = (int) getChunkCount(size, MAX_READ_SIZE); - ByteBuffer[] byteBuffer = new ByteBuffer[count]; - long readOffset = 0L; - for (int i = 0; i < count; i++) { - long readLimit = Math.min(readOffset + MAX_READ_SIZE, size); - int readSize = (int) (readLimit - readOffset); - int fullChunkSize = (int) getFullChunkSize(readSize, CHUNK_SIZE, CHUNK_SIZE); - byteBuffer[i] = ByteBuffer.allocate(fullChunkSize); - - int offset = 0; - byte[] buffer = new byte[CHUNK_SIZE]; - int num; - int len = CHUNK_SIZE; - while ((num = inputStream.read(buffer, 0, len)) > 0) { - byteBuffer[i].put(buffer, 0, num); - offset += num; - len = Math.min(CHUNK_SIZE, fullChunkSize - offset); - if (len <= 0 || offset == readSize) { - break; - } - } - if (offset != readSize) { - throw new IOException("IOException read buffer from input error."); - } - byteBuffer[i].flip(); - readOffset += readSize; - } - return byteBuffer; - } - - /** - * split buffer by begin and end information - * - * @param buffer original buffer - * @param begin begin position - * @param end end position - * @return slice buffer - */ - private static ByteBuffer slice(ByteBuffer buffer, int begin, int end) { - ByteBuffer tempBuffer = buffer.duplicate(); - tempBuffer.position(0); - tempBuffer.limit(end); - tempBuffer.position(begin); - return tempBuffer.slice(); - } - - /** - * calculate merkle tree level and size by data size and digest size - * - * @param dataSize original data size - * @param digestSize algorithm data size - * @return level offset list,contains the offset of - * each level from the root node to the leaf node - */ - private static int[] getOffsetArrays(long dataSize, int digestSize) { - ArrayList levelSize = getLevelSize(dataSize, digestSize); - int[] levelOffset = new int[levelSize.size() + 1]; - levelOffset[0] = 0; - for (int i = 0; i < levelSize.size(); i++) { - levelOffset[i + 1] = levelOffset[i] + Math.toIntExact(levelSize.get(levelSize.size() - i - 1)); - } - return levelOffset; - } - - /** - * calculate data size list by data size and digest size - * - * @param dataSize original data size - * @param digestSize algorithm data size - * @return data size list,contains the offset of - * each level from the root node to the leaf node - */ - private static ArrayList getLevelSize(long dataSize, int digestSize) { - ArrayList levelSize = new ArrayList<>(); - long fullChunkSize = 0L; - long originalDataSize = dataSize; - do { - fullChunkSize = getFullChunkSize(originalDataSize, CHUNK_SIZE, digestSize); - long size = getFullChunkSize(fullChunkSize, CHUNK_SIZE, CHUNK_SIZE); - levelSize.add(size); - originalDataSize = fullChunkSize; - } while (fullChunkSize > CHUNK_SIZE); - return levelSize; - } - - /** - * hash data of input array - * - * @param inputBuffer original data - * @param size total size of input stream - * @param outputBuffer hash data - */ - private void transInputDataToHashData(ByteBuffer[] inputBuffer, long size, ByteBuffer outputBuffer) { - int count = inputBuffer.length; - int chunks = (int) getChunkCount(size, CHUNK_SIZE); - byte[][] hashes = new byte[chunks][]; - Phaser tasks = new Phaser(1); - for (int i = 0; i < count; i++) { - ByteBuffer buffer = inputBuffer[i]; - buffer.rewind(); - int readChunkIndex = (int) getFullChunkSize(MAX_READ_SIZE, CHUNK_SIZE, i); - runHashTask(hashes, tasks, buffer, readChunkIndex); - } - tasks.arriveAndAwaitAdvance(); - for (byte[] hash : hashes) { - outputBuffer.put(hash, 0, hash.length); - } - } - - private void runHashTask(byte[][] hashes, Phaser tasks, ByteBuffer buffer, int readChunkIndex) { - Runnable task = () -> { - int offset = 0; - int bufferSize = buffer.capacity(); - int index = readChunkIndex; - while (offset < bufferSize) { - ByteBuffer chunk = slice(buffer, offset, offset + CHUNK_SIZE); - byte[] tempByte = new byte[CHUNK_SIZE]; - chunk.get(tempByte); - try { - hashes[index++] = DigestUtils.computeDigest(tempByte, this.mAlgorithm); - } catch (NoSuchAlgorithmException e) { - throw new IllegalStateException(e); - } - offset += CHUNK_SIZE; - } - tasks.arriveAndDeregister(); - }; - tasks.register(); - this.mPools.execute(task); - } - - /** - * hash data of buffer - * - * @param inputBuffer original data - * @param outputBuffer hash data - */ - private void transInputDataToHashData(ByteBuffer inputBuffer, ByteBuffer outputBuffer) { - long size = inputBuffer.capacity(); - int chunks = (int) getChunkCount(size, CHUNK_SIZE); - byte[][] hashes = new byte[chunks][]; - Phaser tasks = new Phaser(1); - long readOffset = 0L; - int startChunkIndex = 0; - while (readOffset < size) { - long readLimit = Math.min(readOffset + MAX_READ_SIZE, size); - ByteBuffer buffer = slice(inputBuffer, (int) readOffset, (int) readLimit); - buffer.rewind(); - int readChunkIndex = startChunkIndex; - runHashTask(hashes, tasks, buffer, readChunkIndex); - int readSize = (int) (readLimit - readOffset); - startChunkIndex += (int) getChunkCount(readSize, CHUNK_SIZE); - readOffset += readSize; - } - tasks.arriveAndAwaitAdvance(); - for (byte[] hash : hashes) { - outputBuffer.put(hash, 0, hash.length); - } - } - - /** - * generate merkle tree of given input - * - * @param inputStream input stream for generating merkle tree - * @param size total size of input stream - * @param fsVerityHashAlgorithm hash algorithm for FsVerity - * @return merkle tree - * @throws NoSuchAlgorithmException if error - * @throws IOException if error - */ - public MerkleTree generateMerkleTree(InputStream inputStream, long size, - FsVerityHashAlgorithm fsVerityHashAlgorithm) throws IOException, NoSuchAlgorithmException { - setAlgorithm(fsVerityHashAlgorithm.getHashAlgorithm()); - int digestSize = fsVerityHashAlgorithm.getOutputByteSize(); - int[] offsetArrays = getOffsetArrays(size, digestSize); - ByteBuffer allHashBuffer = ByteBuffer.allocate(offsetArrays[offsetArrays.length - 1]); - generateHashDataByInputData(inputStream, size, allHashBuffer, offsetArrays, digestSize); - generateHashDataByHashData(allHashBuffer, offsetArrays, digestSize); - return getMerkleTree(allHashBuffer, size, fsVerityHashAlgorithm); - } - - /** - * translation inputBuffer arrays to hash ByteBuffer - * - * @param inputStream input stream for generating merkle tree - * @param size total size of input stream - * @param outputBuffer hash data - * @param offsetArrays level offset - * @param digestSize algorithm output byte size - * @throws IOException if error - */ - private void generateHashDataByInputData(InputStream inputStream, long size, ByteBuffer outputBuffer, - int[] offsetArrays, int digestSize) throws IOException { - int inputDataOffsetBegin = offsetArrays[offsetArrays.length - 2]; - int inputDataOffsetEnd = offsetArrays[offsetArrays.length - 1]; - long inputDataBufferSize = 0L; - ByteBuffer hashBuffer = slice(outputBuffer, inputDataOffsetBegin, inputDataOffsetEnd); - ByteBuffer[] inputBuffer = convertToByteBuffer(inputStream, size); - for (ByteBuffer tempinputBuffer : inputBuffer) { - inputDataBufferSize += tempinputBuffer.capacity(); - } - transInputDataToHashData(inputBuffer, inputDataBufferSize, hashBuffer); - dataRoundupChunkSize(hashBuffer, inputDataBufferSize, digestSize); - } - - /** - * get buffer data by level offset,transforms digest data, save in another memory - * - * @param buffer hash data - * @param offsetArrays level offset - * @param digestSize algorithm output byte size - */ - private void generateHashDataByHashData(ByteBuffer buffer, int[] offsetArrays, int digestSize) { - for (int i = offsetArrays.length - 3; i >= 0; i--) { - ByteBuffer generateHashBuffer = slice(buffer, offsetArrays[i], offsetArrays[i + 1]); - ByteBuffer originalHashBuffer = slice(buffer.asReadOnlyBuffer(), - offsetArrays[i + 1], offsetArrays[i + 2]); - transInputDataToHashData(originalHashBuffer, generateHashBuffer); - dataRoundupChunkSize(generateHashBuffer, originalHashBuffer.capacity(), digestSize); - } - } - - /** - * generate merkle tree of given input - * - * @param dataBuffer tree data memory block - * @param inputDataSize total size of input stream - * @param fsVerityHashAlgorithm hash algorithm for FsVerity - * @return merkle tree - * @throws NoSuchAlgorithmException if error - */ - private MerkleTree getMerkleTree(ByteBuffer dataBuffer, long inputDataSize, - FsVerityHashAlgorithm fsVerityHashAlgorithm) throws NoSuchAlgorithmException { - int digestSize = fsVerityHashAlgorithm.getOutputByteSize(); - dataBuffer.flip(); - byte[] rootHash = null; - byte[] tree = null; - if (inputDataSize < FSVERITY_HASH_PAGE_SIZE) { - ByteBuffer fsVerityHashPageBuffer = slice(dataBuffer, 0, digestSize); - rootHash = new byte[digestSize]; - fsVerityHashPageBuffer.get(rootHash); - } else { - tree = dataBuffer.array(); - ByteBuffer fsVerityHashPageBuffer = slice(dataBuffer.asReadOnlyBuffer(), 0, FSVERITY_HASH_PAGE_SIZE); - byte[] fsVerityHashPage = new byte[FSVERITY_HASH_PAGE_SIZE]; - fsVerityHashPageBuffer.get(fsVerityHashPage); - rootHash = DigestUtils.computeDigest(fsVerityHashPage, this.mAlgorithm); - } - return new MerkleTree(rootHash, tree, fsVerityHashAlgorithm); - } - - /** - * generate merkle tree of given input - * - * @param data original data - * @param originalDataSize data size - * @param digestSize algorithm output byte size - */ - private void dataRoundupChunkSize(ByteBuffer data, long originalDataSize, int digestSize) { - long fullChunkSize = getFullChunkSize(originalDataSize, CHUNK_SIZE, digestSize); - int diffValue = (int) (fullChunkSize % CHUNK_SIZE); - if (diffValue > 0) { - byte[] padding = new byte[CHUNK_SIZE - diffValue]; - data.put(padding, 0, padding.length); - } - } - - /** - * get mount of chucks to store data - * - * @param dataSize data size - * @param divisor split chunk size - * @return chunk count - */ - private static long getChunkCount(long dataSize, long divisor) { - return (long) Math.ceil((double) dataSize / (double) divisor); - } - - /** - * get total size of chunk to store data - * - * @param dataSize data size - * @param divisor split chunk size - * @param multiplier chunk multiplier - * @return chunk size - */ - private static long getFullChunkSize(long dataSize, long divisor, long multiplier) { - return getChunkCount(dataSize, divisor) * multiplier; - } -} diff --git a/codesigntool/code_sign_tool_lib/src/main/java/com/ohos/codesigntool/core/provider/CodeSignProvider.java b/codesigntool/code_sign_tool_lib/src/main/java/com/ohos/codesigntool/core/provider/CodeSignProvider.java deleted file mode 100644 index 0a84e28003de950cc3bb1102d35794ec71dc7b94..0000000000000000000000000000000000000000 --- a/codesigntool/code_sign_tool_lib/src/main/java/com/ohos/codesigntool/core/provider/CodeSignProvider.java +++ /dev/null @@ -1,272 +0,0 @@ -/* - * Copyright (c) 2023 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.codesigntool.core.provider; - -import com.ohos.codesigntool.core.api.CodeSignServer; -import com.ohos.codesigntool.core.config.CodeSignConfig; -import com.ohos.codesigntool.core.exception.FsVerityDigestException; -import com.ohos.codesigntool.core.exception.InvalidParamsException; -import com.ohos.codesigntool.core.exception.MissingParamsException; -import com.ohos.codesigntool.core.exception.CodeSignException; -import com.ohos.codesigntool.core.sign.SignCode; -import com.ohos.codesigntool.core.sign.SignAlgorithm; -import com.ohos.codesigntool.core.utils.CertUtils; -import com.ohos.codesigntool.core.utils.FileUtils; -import com.ohos.codesigntool.core.utils.ParamConstants; -import com.ohos.codesigntool.core.utils.ParamProcessUtil; -import com.ohos.codesigntool.core.utils.Pair; - -import org.apache.commons.lang3.StringUtils; -import org.apache.logging.log4j.LogManager; -import org.apache.logging.log4j.Logger; -import org.bouncycastle.jce.provider.BouncyCastleProvider; - -import java.io.File; -import java.io.IOException; -import java.security.InvalidKeyException; -import java.security.Security; -import java.security.cert.X509CRL; -import java.security.cert.X509Certificate; -import java.util.ArrayList; -import java.util.Collections; -import java.util.HashMap; -import java.util.HashSet; -import java.util.List; -import java.util.Map; -import java.util.Set; - -/** - * provider for code sign - * - * @since 2023/06/05 - */ -public abstract class CodeSignProvider { - private static final Logger LOGGER = LogManager.getLogger(CodeSignProvider.class); - private static final Set SIGN_ALG_SUPPORT_LIST = new HashSet<>(); - private static final Set SIGN_PARAMS_NEED_LIST = new HashSet<>(); - private static final Set SIGN_PARAMS_CHECK_LIST = new HashSet<>(); - private static final String SIGN_FILE_SUFFIX = ".sig"; - - static { - SIGN_ALG_SUPPORT_LIST.add(ParamConstants.SIG_ALGORITHM_SHA256_ECDSA); - SIGN_PARAMS_NEED_LIST.add(ParamConstants.PARAM_BASIC_SIGN_ALG); - SIGN_PARAMS_NEED_LIST.add(ParamConstants.PARAM_BASIC_INPUT_FILE); - SIGN_PARAMS_NEED_LIST.add(ParamConstants.PARAM_BASIC_OUTPUT_PATH); - SIGN_PARAMS_NEED_LIST.add(ParamConstants.PARAM_OUTPUT_MEKLE_TREE); - SIGN_PARAMS_CHECK_LIST.add(ParamConstants.PARAM_BASIC_SIGN_ALG); - SIGN_PARAMS_CHECK_LIST.add(ParamConstants.PARAM_BASIC_INPUT_FILE); - SIGN_PARAMS_CHECK_LIST.add(ParamConstants.PARAM_BASIC_OUTPUT_PATH); - if (Security.getProvider("BC") == null) { - Security.addProvider(new BouncyCastleProvider()); - } - } - - /** - * parameters input by sign - */ - protected List> inputParamsList = new ArrayList<>(); - - /** - * parameters only use in signing - */ - protected Map signParams = new HashMap<>(); - - /** - * interface of sign server - */ - protected CodeSignServer server = null; - - /** - * set interface of sign server - * - * @param server interface of sign server - */ - public void setCodeSignServer(CodeSignServer server) { - this.server = server; - } - - /** - * Get public certificate chain used to sign. - * - * @return list of x509 certificates. - */ - private List getPublicCerts() { - String publicCertPath = signParams.get(ParamConstants.PARAM_LOCAL_PUBLIC_CERT); - if (StringUtils.isEmpty(publicCertPath)) { - return Collections.emptyList(); - } - return CertUtils.getCertChainsFromFile(publicCertPath); - } - - /** - * get certificate revocation list used to sign - * - * @return certificate revocation list - */ - public abstract X509CRL getCrl(); - - - /** - * Create SignConfig by certificate chain and certificate revocation list. - * - * @param x509CertList certificate chain - * @param crl certificate revocation list - * @return Object of SignConfig - * @throws InvalidKeyException on error when the key is invalid. - */ - public CodeSignConfig createSignConfigs(List x509CertList, X509CRL crl) - throws InvalidKeyException { - CodeSignConfig signConfig = new CodeSignConfig(); - initSignConfigs(signConfig, x509CertList, crl); - return signConfig; - } - - /** - * Init SignConfig by certificate chain and certificate revocation list. - * - * @param signConfig sign Config - * @param x509CertList certificate chain - * @param crl certificate revocation list - * @throws InvalidKeyException on error when the key is invalid. - */ - public void initSignConfigs(CodeSignConfig signConfig, List x509CertList, X509CRL crl) - throws InvalidKeyException { - signConfig.setSignParamsMap(this.signParams); - signConfig.setX509CertList(x509CertList); - - List signAlgList = new ArrayList<>(); - signAlgList.add( - ParamProcessUtil.getSignAlgorithm(this.signParams.get(ParamConstants.PARAM_BASIC_SIGN_ALG))); - signConfig.setSignAlgList(signAlgList); - - if (crl != null) { - signConfig.setX509CRLList(Collections.singletonList(crl)); - } - } - - /** - * sign code - * - * @param params parameters used to sign code - * @return true, if sign successfully - */ - public boolean sign(String[] params) { - File output = null; - try { - // 1. check the parameters - checkParams(params); - // 2. get x509 certificate - List publicCerts = getPublicCerts(); - // 3. check input hap validation - File input = new File(signParams.get(ParamConstants.PARAM_BASIC_INPUT_FILE)); - FileUtils.isValid(input); - // 4. generate output file path - String outputPath = signParams.get(ParamConstants.PARAM_BASIC_OUTPUT_PATH); - if (!outputPath.endsWith(File.separator)) { - outputPath += File.separator; - } - String outputFile = outputPath + input.getName() + SIGN_FILE_SUFFIX; - output = new File(outputFile); - // 5. check whether store tree - String outTreeSwitch = signParams.get(ParamConstants.PARAM_OUTPUT_MEKLE_TREE); - boolean storeTree = (outTreeSwitch != null) && (outTreeSwitch.equals("true")); - // 6. sign code - CodeSignConfig signConfig = createSignConfigs(publicCerts, getCrl()); - SignCode signCode = new SignCode(signConfig); - signCode.signCode(input, output, storeTree); - } catch (CodeSignException | IOException | InvalidKeyException | - MissingParamsException | InvalidParamsException | FsVerityDigestException e) { - printErrorLog(e); - return false; - } - return true; - } - - private void printErrorLog(Exception exception) { - if (exception != null) { - LOGGER.error("code-sign-tool: error: {}", exception.getMessage(), exception); - } - } - - /** - * Check input parameters is valid. And put valid parameters input signParams. - * - * @param params parameters input by user. - * @throws MissingParamsException Exception occurs when the required parameters are not entered. - * @throws InvalidParamsException Exception occurs when the inputted parameters are invalid. - */ - public void checkParams(String[] params) throws MissingParamsException, InvalidParamsException { - checkRemoteSignParams(params); - } - - /** - * Check input parameters used to remotesign file is valid. And put valid parameters input signParams. - * - * @param params parameters input by user. - * @throws MissingParamsException Exception occurs when the required parameters are not entered. - * @throws InvalidParamsException Exception occurs when the inputted parameters are invalid. - */ - protected void checkRemoteSignParams(String[] params) throws InvalidParamsException, MissingParamsException { - for (int i = 0; i < params.length; i += 2) { - if (!params[i].startsWith("-")) { - continue; - } - inputParamsList.add(Pair.create(params[i].substring(1), params[i + 1])); - } - for (Pair pairParam : inputParamsList) { - if (SIGN_PARAMS_NEED_LIST.contains(pairParam.getKey())) { - signParams.put(pairParam.getKey(), pairParam.getValue()); - } - } - - checkInputParamsComplete(); - } - - /** - * Check whether the input parameters are complete - * - * @throws MissingParamsException Exception occurs when input parameters is not entered. - * @throws InvalidParamsException Exception occurs when input parameters is invalid. - */ - private void checkInputParamsComplete() - throws MissingParamsException, InvalidParamsException { - for (String param : SIGN_PARAMS_CHECK_LIST) { - if (!signParams.containsKey(param)) { - throw new MissingParamsException("Missing parameter: " + param); - } - if (param.equals(ParamConstants.PARAM_BASIC_SIGN_ALG)) { - checkSignAlg(); - } - } - } - - /** - * check signature algorithm - * - * @throws MissingParamsException Exception occurs when the name of sign algorithm is not entered. - * @throws InvalidParamsException Exception occurs when the inputted sign algorithm is invalid. - */ - private void checkSignAlg() throws MissingParamsException, InvalidParamsException { - String signAlg = signParams.get(ParamConstants.PARAM_BASIC_SIGN_ALG); - for (String supportAlg : SIGN_ALG_SUPPORT_LIST) { - if (supportAlg.equalsIgnoreCase(signAlg)) { - return; - } - } - LOGGER.error("Unsupported signature algorithm :" + signAlg); - throw new InvalidParamsException("Invalid parameter: Sign Alg"); - } -} diff --git a/codesigntool/code_sign_tool_lib/src/main/java/com/ohos/codesigntool/core/response/DataFromAppGallaryServer.java b/codesigntool/code_sign_tool_lib/src/main/java/com/ohos/codesigntool/core/response/DataFromAppGallaryServer.java deleted file mode 100644 index 58e04f9df9724bd5d6ffe336783e45021ed776ee..0000000000000000000000000000000000000000 --- a/codesigntool/code_sign_tool_lib/src/main/java/com/ohos/codesigntool/core/response/DataFromAppGallaryServer.java +++ /dev/null @@ -1,62 +0,0 @@ -/* - * Copyright (c) 2023 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.codesigntool.core.response; - -/** - * class of data from App Gallary server. - * - * @since 2023/06/05 - */ -public class DataFromAppGallaryServer { - /** - * AppGallary server signature result. - */ - private String codeSignature; - - /** - * AppGallary server message. - */ - private String message; - - /** - * json value of data from server of signcenter. - */ - private DataFromSignCenterServer dataFromSignCenterServer; - - public String getCodeSignature() { - return codeSignature; - } - - public void setCodeSignature(String codeSignature) { - this.codeSignature = codeSignature; - } - - public String getMessage() { - return message; - } - - public void setMessage(String message) { - this.message = message; - } - - public DataFromSignCenterServer getDataFromSignCenterServer() { - return dataFromSignCenterServer; - } - - public void setDataFromSignCenterServer(DataFromSignCenterServer dataFromSignCenterServer) { - this.dataFromSignCenterServer = dataFromSignCenterServer; - } -} diff --git a/codesigntool/code_sign_tool_lib/src/main/java/com/ohos/codesigntool/core/response/DataFromSignCenterServer.java b/codesigntool/code_sign_tool_lib/src/main/java/com/ohos/codesigntool/core/response/DataFromSignCenterServer.java deleted file mode 100644 index 4330b5ae1687b679571f0fcb0d4c69b133208324..0000000000000000000000000000000000000000 --- a/codesigntool/code_sign_tool_lib/src/main/java/com/ohos/codesigntool/core/response/DataFromSignCenterServer.java +++ /dev/null @@ -1,76 +0,0 @@ -/* - * Copyright (c) 2023 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.codesigntool.core.response; - -/** - * class of data from signcenter server - * - * @since 2023/06/05 - */ -public class DataFromSignCenterServer { - /** - * Signature data. - */ - private String signedData; - - /** - * Certificates chain. - */ - private String[] certchain; - - /** - * Certificate revocation list. - */ - private String crl; - - /** - * Set Certificates chain. - * - * @param certchain Giving certchain - */ - public void setCertchain(String[] certchain) { - if (certchain == null) { - this.certchain = new String[0]; - } else { - this.certchain = certchain.clone(); - } - } - - /** - * Get Certificates chain. - * - * @return Certificates chain - */ - public String[] getCertchain() { - return certchain.clone(); - } - - public void setCrl(String crl) { - this.crl = crl; - } - - public String getCrl() { - return crl; - } - - public void setSignedData(String signedData) { - this.signedData = signedData; - } - - public String getSignedData() { - return signedData; - } -} \ No newline at end of file diff --git a/codesigntool/code_sign_tool_lib/src/main/java/com/ohos/codesigntool/core/sign/BcSignedDataGenerator.java b/codesigntool/code_sign_tool_lib/src/main/java/com/ohos/codesigntool/core/sign/BcSignedDataGenerator.java deleted file mode 100644 index 9333592d8dd1ee856e37ece292fd0c9562dae151..0000000000000000000000000000000000000000 --- a/codesigntool/code_sign_tool_lib/src/main/java/com/ohos/codesigntool/core/sign/BcSignedDataGenerator.java +++ /dev/null @@ -1,260 +0,0 @@ -/* - * Copyright (c) 2023 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.codesigntool.core.sign; - -import com.ohos.codesigntool.core.config.CodeSignConfig; -import com.ohos.codesigntool.core.exception.CodeSignException; -import com.ohos.codesigntool.core.utils.CmsUtils; -import com.ohos.codesigntool.core.utils.DigestUtils; -import com.ohos.codesigntool.core.utils.Pair; - -import org.apache.logging.log4j.LogManager; -import org.apache.logging.log4j.Logger; -import org.bouncycastle.asn1.ASN1EncodableVector; -import org.bouncycastle.asn1.ASN1Encoding; -import org.bouncycastle.asn1.ASN1Integer; -import org.bouncycastle.asn1.ASN1Set; -import org.bouncycastle.asn1.BERSet; -import org.bouncycastle.asn1.DEROctetString; -import org.bouncycastle.asn1.DERSet; -import org.bouncycastle.asn1.cms.Attribute; -import org.bouncycastle.asn1.cms.Time; -import org.bouncycastle.asn1.pkcs.ContentInfo; -import org.bouncycastle.asn1.pkcs.IssuerAndSerialNumber; -import org.bouncycastle.asn1.pkcs.PKCSObjectIdentifiers; -import org.bouncycastle.asn1.pkcs.SignedData; -import org.bouncycastle.asn1.pkcs.SignerInfo; -import org.bouncycastle.cert.jcajce.JcaX509CRLHolder; -import org.bouncycastle.cert.jcajce.JcaX509CertificateHolder; -import org.bouncycastle.cms.CMSException; -import org.bouncycastle.operator.DefaultDigestAlgorithmIdentifierFinder; -import org.bouncycastle.operator.DefaultSignatureAlgorithmIdentifierFinder; -import org.bouncycastle.operator.DigestAlgorithmIdentifierFinder; -import org.bouncycastle.operator.SignatureAlgorithmIdentifierFinder; - -import java.io.IOException; -import java.security.InvalidAlgorithmParameterException; -import java.security.InvalidKeyException; -import java.security.NoSuchAlgorithmException; -import java.security.PublicKey; -import java.security.Signature; -import java.security.cert.CRLException; -import java.security.cert.CertificateEncodingException; -import java.security.cert.X509CRL; -import java.security.cert.X509Certificate; -import java.security.spec.AlgorithmParameterSpec; -import java.util.Date; -import java.util.List; - -/** - * BC implementation - * - * @since 2023/06/05 - */ -public class BcSignedDataGenerator implements SignedDataGenerator { - private static final Logger LOGGER = LogManager.getLogger(BcSignedDataGenerator.class); - private static final SignatureAlgorithmIdentifierFinder SIGN_ALG_ID_FINDER = - new DefaultSignatureAlgorithmIdentifierFinder(); - private static final DigestAlgorithmIdentifierFinder DIGEST_ALG_ID_FINDER = - new DefaultDigestAlgorithmIdentifierFinder(); - - @Override - public byte[] generateSignedData(byte[] content, CodeSignConfig signConfig) - throws CodeSignException { - if (content == null) { - throw new CodeSignException("Verity digest is null"); - } - Pair pairDigestAndSignInfo = getSignInfo(content, signConfig); - SignedData signedData = new SignedData( - new ASN1Integer(1), - pairDigestAndSignInfo.getKey(), - new ContentInfo(PKCSObjectIdentifiers.data, null), - createBerSetFromLst(signConfig.getX509CertList()), - createBerSetFromLst(signConfig.getX509CRLList()), - pairDigestAndSignInfo.getValue()); - return encodingUnsignedData(content, signedData); - } - - private Pair getSignInfo(byte[] content, CodeSignConfig signConfig) - throws CodeSignException { - ASN1EncodableVector signInfoVector = new ASN1EncodableVector(); - ASN1EncodableVector digestVector = new ASN1EncodableVector(); - for (SignAlgorithm signAlgorithm : signConfig.getSignAlgList()) { - SignerInfo signInfo = createSignInfo(signAlgorithm, content, signConfig); - signInfoVector.add(signInfo); - digestVector.add(signInfo.getDigestAlgorithm()); - LOGGER.info("Create a sign info successfully."); - } - return Pair.create(new DERSet(digestVector), new DERSet(signInfoVector)); - } - - private SignerInfo createSignInfo( - SignAlgorithm signAlgorithm, byte[] unsignedDataDigest, CodeSignConfig signConfig) - throws CodeSignException { - SecureHashAlgorithm hashAlgorithm = signAlgorithm.getSecureHashAlgorithm(); - byte[] digest = computeDigest(unsignedDataDigest, hashAlgorithm.name()); - ASN1Set authed = getPKCS9Attributes(digest); - byte[] codeAuthed = getEncoded(authed); - Pair signPair = - signAlgorithm.getSignAlgorithmAndParams().getPairSignAlgorithmAndParams(); - byte[] signBytes = signConfig.getSignature( - codeAuthed, signPair.getKey(), signPair.getValue()); - if (signBytes == null) { - throw new CodeSignException("get signature failed"); - } - if (signConfig.getX509CertList().isEmpty()) { - throw new CodeSignException("No certificates configured for sign"); - } - X509Certificate cert = signConfig.getX509CertList().get(0); - if (!verifySignFromServer(cert.getPublicKey(), signBytes, signPair, codeAuthed)) { - throw new CodeSignException("verifySignatureFromServer failed"); - } - JcaX509CertificateHolder certificateHolder = getJcaX509CertificateHolder(cert); - return new SignerInfo( - new ASN1Integer(1), - new IssuerAndSerialNumber(certificateHolder.getIssuer(), certificateHolder.getSerialNumber()), - DIGEST_ALG_ID_FINDER.find(hashAlgorithm.getHashAlgorithm()), - authed, - SIGN_ALG_ID_FINDER.find(signPair.getKey()), - new DEROctetString(signBytes), - null); - } - - private byte[] computeDigest(byte[] unsignedDataDigest, String algorithm) throws CodeSignException { - byte[] digest; - try { - digest = DigestUtils.computeDigest(unsignedDataDigest, algorithm); - } catch (NoSuchAlgorithmException e) { - throw new CodeSignException("Invalid algorithm" + e.getMessage(), e); - } - return digest; - } - - private byte[] getEncoded(ASN1Set authed) throws CodeSignException { - byte[] codeAuthed; - try { - codeAuthed = authed.getEncoded(); - } catch (IOException e) { - throw new CodeSignException("cannot encode authed", e); - } - return codeAuthed; - } - - private JcaX509CRLHolder getJcaX509CRLHolder(X509CRL crl) - throws CodeSignException { - JcaX509CRLHolder crlHolder; - try { - crlHolder = new JcaX509CRLHolder(crl); - } catch (CRLException e) { - throw new CodeSignException("Create crl failed", e); - } - return crlHolder; - } - - private JcaX509CertificateHolder getJcaX509CertificateHolder(X509Certificate cert) - throws CodeSignException { - JcaX509CertificateHolder certificateHolder; - try { - certificateHolder = new JcaX509CertificateHolder(cert); - } catch (CertificateEncodingException e) { - throw new CodeSignException("Create sign info failed", e); - } - return certificateHolder; - } - - private ASN1Set getPKCS9Attributes(byte[] digest) { - ASN1EncodableVector table = new ASN1EncodableVector(); - Attribute signingTimeAttr = new Attribute(PKCSObjectIdentifiers.pkcs_9_at_signingTime, - new DERSet(new Time(new Date()))); - Attribute contentTypeAttr = new Attribute(PKCSObjectIdentifiers.pkcs_9_at_contentType, - new DERSet(PKCSObjectIdentifiers.data)); - Attribute messageDigestAttr = new Attribute(PKCSObjectIdentifiers.pkcs_9_at_messageDigest, - new DERSet(new DEROctetString(digest))); - table.add(signingTimeAttr); - table.add(contentTypeAttr); - table.add(messageDigestAttr); - return new DERSet(table); - } - - private boolean verifySignFromServer( - PublicKey publicKey, - byte[] signBytes, - Pair signPair, - byte[] authed) - throws CodeSignException { - try { - Signature signature = Signature.getInstance(signPair.getKey()); - signature.initVerify(publicKey); - if (signPair.getValue() != null) { - signature.setParameter(signPair.getValue()); - } - signature.update(authed); - if (!signature.verify(signBytes)) { - throw new CodeSignException("Signature verify failed"); - } - return true; - } catch (InvalidKeyException | java.security.SignatureException e) { - LOGGER.error("The generated signature could not be verified " - + " using the public key in the certificate", e); - } catch (NoSuchAlgorithmException e) { - LOGGER.error("The generated signature " + signPair.getKey() - + " could not be verified using the public key in the certificate", e); - } catch (InvalidAlgorithmParameterException e) { - LOGGER.error("The generated signature " + signPair.getValue() - + " could not be verified using the public key in the certificate", e); - } - return false; - } - - private ASN1Set createBerSetFromLst(List lists) throws CodeSignException { - if (lists == null || lists.size() == 0) { - return null; - } - ASN1EncodableVector vector = new ASN1EncodableVector(); - for (Object obj : lists) { - if (obj instanceof X509CRL) { - vector.add(getJcaX509CRLHolder((X509CRL) obj).toASN1Structure()); - } else if (obj instanceof X509Certificate) { - vector.add(getJcaX509CertificateHolder((X509Certificate) obj).toASN1Structure()); - } - } - return new BERSet(vector); - } - - private byte[] encodingUnsignedData(byte[] unsignedDataDigest, SignedData signedData) throws CodeSignException { - byte[] signResult; - try { - ContentInfo contentInfo = new ContentInfo(PKCSObjectIdentifiers.signedData, signedData); - signResult = contentInfo.getEncoded(ASN1Encoding.DER); - } catch (IOException e) { - throw new CodeSignException("Failed to encode unsigned data!", e); - } - verifySignResult(unsignedDataDigest, signResult); - return signResult; - } - - private void verifySignResult(byte[] unsignedDataDigest, byte[] signResult) throws CodeSignException { - boolean result = false; - try { - result = CmsUtils.verifySignDataWithUnsignedDataDigest(unsignedDataDigest, signResult); - } catch (CMSException e) { - throw new CodeSignException("Failed to verify signed data and unsigned data digest", e); - } - if (!result) { - throw new CodeSignException("PKCS cms data did not verify"); - } - } -} diff --git a/codesigntool/code_sign_tool_lib/src/main/java/com/ohos/codesigntool/core/sign/SecureHashAlgorithm.java b/codesigntool/code_sign_tool_lib/src/main/java/com/ohos/codesigntool/core/sign/SecureHashAlgorithm.java deleted file mode 100644 index 0aaea5a363899b31e18090ba18b4c26928131af0..0000000000000000000000000000000000000000 --- a/codesigntool/code_sign_tool_lib/src/main/java/com/ohos/codesigntool/core/sign/SecureHashAlgorithm.java +++ /dev/null @@ -1,44 +0,0 @@ -/* - * Copyright (c) 2023 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.codesigntool.core.sign; - -/** - * Secure hash algorithm - * - * @since 2023/06/05 - */ -public enum SecureHashAlgorithm { - SHA256("SHA-256", 256 / 8), - SHA384("SHA-384", 384 / 8), - SHA512("SHA-512", 512 / 8); - - private final String hashAlgorithm; - - private final int digestByteSize; - - SecureHashAlgorithm(String hashAlgorithm, int digestByteSize) { - this.hashAlgorithm = hashAlgorithm; - this.digestByteSize = digestByteSize; - } - - public String getHashAlgorithm() { - return hashAlgorithm; - } - - public int getdigestByteSize() { - return digestByteSize; - } -} diff --git a/codesigntool/code_sign_tool_lib/src/main/java/com/ohos/codesigntool/core/sign/SignAlgorithm.java b/codesigntool/code_sign_tool_lib/src/main/java/com/ohos/codesigntool/core/sign/SignAlgorithm.java deleted file mode 100644 index 6b80c04e01fb203a0868cc48cfeed791af90e45c..0000000000000000000000000000000000000000 --- a/codesigntool/code_sign_tool_lib/src/main/java/com/ohos/codesigntool/core/sign/SignAlgorithm.java +++ /dev/null @@ -1,86 +0,0 @@ -/* - * Copyright (c) 2023 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.codesigntool.core.sign; - -/** - * Signature algorithm - * - * @since 2023/06/05 - */ -public enum SignAlgorithm { - RSA_PSS_WITH_SHA256(0x101, "RSA", SecureHashAlgorithm.SHA256, SignAlgorithmAndParams.SHA256_WITH_RSA_AND_MGF1), - RSA_PSS_WITH_SHA384(0x102, "RSA", SecureHashAlgorithm.SHA384, SignAlgorithmAndParams.SHA384_WITH_RSA_AND_MGF1), - RSA_PSS_WITH_SHA512(0x103, "RSA", SecureHashAlgorithm.SHA512, SignAlgorithmAndParams.SHA512_WITH_RSA_AND_MGF1), - RSA_PKCS1_V1_5_WITH_SHA256(0x104, "RSA", SecureHashAlgorithm.SHA256, SignAlgorithmAndParams.SHA256_WITH_RSA), - RSA_PKCS1_V1_5_WITH_SHA384(0x105, "RSA", SecureHashAlgorithm.SHA384, SignAlgorithmAndParams.SHA384_WITH_RSA), - RSA_PKCS1_V1_5_WITH_SHA512(0x106, "RSA", SecureHashAlgorithm.SHA512, SignAlgorithmAndParams.SHA512_WITH_RSA), - ECDSA_WITH_SHA256(0x201, "EC", SecureHashAlgorithm.SHA256, SignAlgorithmAndParams.SHA256_WITH_ECDSA), - ECDSA_WITH_SHA384(0x202, "EC", SecureHashAlgorithm.SHA384, SignAlgorithmAndParams.SHA384_WITH_ECDSA), - ECDSA_WITH_SHA512(0x203, "EC", SecureHashAlgorithm.SHA512, SignAlgorithmAndParams.SHA512_WITH_ECDSA), - DSA_WITH_SHA256(0x301, "DSA", SecureHashAlgorithm.SHA256, SignAlgorithmAndParams.SHA256_WITH_DSA), - DSA_WITH_SHA384(0x302, "DSA", SecureHashAlgorithm.SHA384, SignAlgorithmAndParams.SHA384_WITH_DSA), - DSA_WITH_SHA512(0x303, "DSA", SecureHashAlgorithm.SHA512, SignAlgorithmAndParams.SHA512_WITH_DSA); - - private final int id; - - private final String keyAlgorithm; - - private final SecureHashAlgorithm secureHashAlgorithm; - - private final SignAlgorithmAndParams signAlgorithmAndParams; - - SignAlgorithm( - int id, - String keyAlgorithm, - SecureHashAlgorithm secureHashAlgorithm, - SignAlgorithmAndParams signAlgorithmAndParams) { - this.id = id; - this.keyAlgorithm = keyAlgorithm; - this.secureHashAlgorithm = secureHashAlgorithm; - this.signAlgorithmAndParams = signAlgorithmAndParams; - } - - public String getKeyAlgorithm() { - return keyAlgorithm; - } - - public int getId() { - return id; - } - - public SignAlgorithmAndParams getSignAlgorithmAndParams() { - return signAlgorithmAndParams; - } - - public SecureHashAlgorithm getSecureHashAlgorithm() { - return secureHashAlgorithm; - } - - /** - * Find SignAlgorithm value by SignAlgorithm object ID. - * - * @param id Id of SignAlgorithm object. - * @return SignAlgorithm value - */ - public static SignAlgorithm findById(int id) { - for (SignAlgorithm signAlgorithm : SignAlgorithm.values()) { - if (id == signAlgorithm.getId()) { - return signAlgorithm; - } - } - return null; - } -} diff --git a/codesigntool/code_sign_tool_lib/src/main/java/com/ohos/codesigntool/core/sign/SignAlgorithmAndParams.java b/codesigntool/code_sign_tool_lib/src/main/java/com/ohos/codesigntool/core/sign/SignAlgorithmAndParams.java deleted file mode 100644 index 1be68a6e5bd98b6077592e31db1a71d1a15d9c36..0000000000000000000000000000000000000000 --- a/codesigntool/code_sign_tool_lib/src/main/java/com/ohos/codesigntool/core/sign/SignAlgorithmAndParams.java +++ /dev/null @@ -1,59 +0,0 @@ -/* - * Copyright (c) 2023 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.codesigntool.core.sign; - -import com.ohos.codesigntool.core.utils.Pair; -import com.ohos.codesigntool.core.utils.ParamConstants; - -import java.security.spec.AlgorithmParameterSpec; -import java.security.spec.MGF1ParameterSpec; -import java.security.spec.PSSParameterSpec; - -/** - * Signature algorithm and algorithmParameterSpec - * - * @since 2023/08/01 - */ -public enum SignAlgorithmAndParams { - SHA256_WITH_RSA_AND_MGF1( - ParamConstants.SIG_ALGORITHM_SHA256_RSA_MGF1, - new PSSParameterSpec("SHA-256", "MGF1", MGF1ParameterSpec.SHA256, 256 / 8, 1)), - SHA384_WITH_RSA_AND_MGF1( - ParamConstants.SIG_ALGORITHM_SHA384_RSA_MGF1, - new PSSParameterSpec("SHA-384", "MGF1", MGF1ParameterSpec.SHA384, 384 / 8, 1)), - SHA512_WITH_RSA_AND_MGF1( - ParamConstants.SIG_ALGORITHM_SHA512_RSA_MGF1, - new PSSParameterSpec("SHA-512", "MGF1", MGF1ParameterSpec.SHA512, 512 / 8, 1)), - SHA256_WITH_RSA(ParamConstants.SIG_ALGORITHM_SHA256_RSA, null), - SHA384_WITH_RSA(ParamConstants.SIG_ALGORITHM_SHA384_RSA, null), - SHA512_WITH_RSA(ParamConstants.SIG_ALGORITHM_SHA512_RSA, null), - SHA256_WITH_ECDSA(ParamConstants.SIG_ALGORITHM_SHA256_ECDSA, null), - SHA384_WITH_ECDSA(ParamConstants.SIG_ALGORITHM_SHA384_ECDSA, null), - SHA512_WITH_ECDSA(ParamConstants.SIG_ALGORITHM_SHA512_ECDSA, null), - SHA256_WITH_DSA(ParamConstants.SIG_ALGORITHM_SHA256_DSA, null), - SHA384_WITH_DSA(ParamConstants.SIG_ALGORITHM_SHA384_DSA, null), - SHA512_WITH_DSA(ParamConstants.SIG_ALGORITHM_SHA512_DSA, null); - - private final Pair pairSignAlgorithmAndParams; - - SignAlgorithmAndParams(String signAlgorithm, PSSParameterSpec params) { - this.pairSignAlgorithmAndParams = Pair.create(signAlgorithm, params); - } - - public Pair getPairSignAlgorithmAndParams() { - return pairSignAlgorithmAndParams; - } -} diff --git a/codesigntool/code_sign_tool_lib/src/main/java/com/ohos/codesigntool/core/sign/SignCode.java b/codesigntool/code_sign_tool_lib/src/main/java/com/ohos/codesigntool/core/sign/SignCode.java deleted file mode 100644 index 552408e1e10d2f4877768507478d1487e14518dd..0000000000000000000000000000000000000000 --- a/codesigntool/code_sign_tool_lib/src/main/java/com/ohos/codesigntool/core/sign/SignCode.java +++ /dev/null @@ -1,233 +0,0 @@ -/* - * Copyright (c) 2023 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.codesigntool.core.sign; - -import com.ohos.codesigntool.core.config.CodeSignConfig; -import com.ohos.codesigntool.core.config.RemoteCodeSignConfig; -import com.ohos.codesigntool.core.exception.FsVerityDigestException; -import com.ohos.codesigntool.core.exception.CodeSignException; -import com.ohos.codesigntool.core.fsverity.FsVerityGenerator; -import com.ohos.codesigntool.core.utils.HapUtils; - -import com.ohos.codesigntool.core.utils.Pair; -import org.apache.logging.log4j.LogManager; -import org.apache.logging.log4j.Logger; - -import java.io.File; -import java.io.FileInputStream; -import java.io.FileOutputStream; -import java.io.IOException; -import java.io.InputStream; -import java.util.ArrayList; -import java.util.Enumeration; -import java.util.List; -import java.util.jar.JarEntry; -import java.util.jar.JarFile; -import java.util.zip.ZipEntry; -import java.util.zip.ZipOutputStream; - -/** - * core functions to sign code - * - * @since 2023/06/05 - */ -public class SignCode { - private static final Logger LOGGER = LogManager.getLogger(SignCode.class); - private static final int COMPRESSION_MODE = 9; - private static final String HAP_SIGNATURE_ENTRY_NAME = "Hap"; - private static final String SIGNATURE_FILE_SUFFIX = ".fsv-sig"; - private static final String MERKLE_TREE_FILE_SUFFIX = ".fsv-tree"; - private static final String NATIVE_LIB_AN_SUFFIX = ".an"; - private static final String NATIVE_LIB_SO_SUFFIX = ".so"; - private static final List EXTRACTED_NATIVE_LIB_SUFFIXS = new ArrayList<>(); - - static { - EXTRACTED_NATIVE_LIB_SUFFIXS.add(NATIVE_LIB_AN_SUFFIX); - EXTRACTED_NATIVE_LIB_SUFFIXS.add(NATIVE_LIB_SO_SUFFIX); - } - - private final CodeSignConfig signConfig; - private long timestamp = 0L; - - /** - * provide code sign functions to sign a hap - * - * @param signConfig configuration of sign - */ - public SignCode(CodeSignConfig signConfig) { - this.signConfig = signConfig; - } - - /** - * Sign the given hap file, and pack all signature into output file - * - * @param input file to sign - * @param output returned signature file - * @param storeTree determine whether merkle tree is also output in signature file - * @throws IOException io error - * @throws FsVerityDigestException computing FsVerity digest error - * @throws CodeSignException signing error - */ - public void signCode(File input, File output, boolean storeTree) - throws IOException, FsVerityDigestException, CodeSignException { - LOGGER.info("Start to sign code."); - try (FileOutputStream outputFile = new FileOutputStream(output); - ZipOutputStream outputZip = new ZipOutputStream(outputFile)) { - timestamp = System.currentTimeMillis(); - outputZip.setLevel(COMPRESSION_MODE); - - LOGGER.debug("Sign hap."); - try (FileInputStream inputStream = new FileInputStream(input)) { - signFileAndAddToZip(inputStream, input.length(), HAP_SIGNATURE_ENTRY_NAME, outputZip, storeTree); - } - - // no need to sign native files if libs are not extracted - if (!HapUtils.checkCompressNativeLibs(input)) { - LOGGER.info("No need to sign native libs."); - return; - } - - // sign native files - try (JarFile inputJar = new JarFile(input, false)) { - List entryNames = getNativeEntriesFromHap(inputJar); - if (entryNames.isEmpty()) { - LOGGER.info("No native libs."); - return; - } - signFilesFromJar(entryNames, inputJar, outputZip, storeTree); - } - } - LOGGER.info("Sign successfully."); - } - - /** - * Sign a single file with given inputStream - * - * @param inputStream input stream - * @param fileSize file size of the target file - * @param entryName the origin entry name of file in hap - * @param outputZip output zip which packs the generated signature - * @param storeTree determine whether merkle tree is also output - * @throws IOException io error - * @throws FsVerityDigestException computing FsVerity digest error - * @throws CodeSignException signing error - */ - private void signFileAndAddToZip(InputStream inputStream, long fileSize, String entryName, - ZipOutputStream outputZip, boolean storeTree) - throws IOException, FsVerityDigestException, CodeSignException { - Pair result = signFile(inputStream, fileSize); - addEntryToZip(result.getKey(), entryName + SIGNATURE_FILE_SUFFIX, outputZip); - if (storeTree) { - addEntryToZip(result.getValue(), entryName + MERKLE_TREE_FILE_SUFFIX, outputZip); - } - - } - - private void addEntryToZip(byte[] data, String entryName, ZipOutputStream outputZip) - throws IOException { - ZipEntry entry = new ZipEntry(entryName); - entry.setTime(timestamp); - outputZip.putNextEntry(entry); - outputZip.write(data, 0, data.length); - outputZip.flush(); - } - - /** - * Get entry name of all native files in hap - * - * @param hap the given hap - * @return list of entry name - */ - private List getNativeEntriesFromHap(JarFile hap) { - List result = new ArrayList<>(); - for (Enumeration e = hap.entries(); e.hasMoreElements();) { - JarEntry entry = e.nextElement(); - if (!entry.isDirectory()) { - if (!isNativeFile(entry.getName())) { - continue; - } - result.add(entry.getName()); - } - } - return result; - } - - /** - * Check whether the entry is a native file - * - * @param entryName the name of entry - * @return true if it is a native file, and false otherwise - */ - private boolean isNativeFile(String entryName) { - for (String suffix : EXTRACTED_NATIVE_LIB_SUFFIXS) { - if (entryName.endsWith(suffix)) { - return true; - } - } - return false; - } - - /** - * Sign specific entries in a hap - * - * @param entryNames list of entries which need to be signed - * @param hap input hap - * @param outputZip output zip which packs the generated signature - * @param storeTree determine whether merkle tree is also output - * @throws IOException io error - * @throws FsVerityDigestException computing FsVerity digest error - * @throws CodeSignException signing error - */ - public void signFilesFromJar(List entryNames, JarFile hap, ZipOutputStream outputZip, boolean storeTree) - throws IOException, FsVerityDigestException, CodeSignException { - for (String name : entryNames) { - LOGGER.debug("Sign entry name = " + name); - JarEntry inEntry = hap.getJarEntry(name); - try (InputStream inputStream = hap.getInputStream(inEntry)) { - long fileSize = inEntry.getSize(); - signFileAndAddToZip(inputStream, fileSize, name, outputZip, storeTree); - } - } - } - - /** - * Sign a file from input stream - * - * @param inputStream input stream of a file - * @param fileSize size of the file - * @return pair of signature and tree - * @throws FsVerityDigestException computing FsVerity Digest error - * @throws CodeSignException signing error - */ - public Pair signFile(InputStream inputStream, long fileSize) - throws FsVerityDigestException, CodeSignException { - FsVerityGenerator fsVerityGenerator = new FsVerityGenerator(); - fsVerityGenerator.generateFsVerityDigest(inputStream, fileSize); - byte[] fsVerityDigest = fsVerityGenerator.getFsVerityDigest(); - byte[] signature = generateSignature(fsVerityDigest); - return Pair.create(signature, fsVerityGenerator.getTreeBytes()); - } - - private byte[] generateSignature(byte[] signedData) throws CodeSignException { - if (!(signConfig instanceof RemoteCodeSignConfig)) { - if (signConfig.getX509CertList().isEmpty()) { - throw new CodeSignException("No certificates configured for sign"); - } - } - return SignedDataGenerator.BC.generateSignedData(signedData, signConfig); - } - -} \ No newline at end of file diff --git a/codesigntool/code_sign_tool_lib/src/main/java/com/ohos/codesigntool/core/sign/SignedDataGenerator.java b/codesigntool/code_sign_tool_lib/src/main/java/com/ohos/codesigntool/core/sign/SignedDataGenerator.java deleted file mode 100644 index 6986b3fb5e22c3dec1d73118e850402844830044..0000000000000000000000000000000000000000 --- a/codesigntool/code_sign_tool_lib/src/main/java/com/ohos/codesigntool/core/sign/SignedDataGenerator.java +++ /dev/null @@ -1,44 +0,0 @@ -/* - * Copyright (c) 2023 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.codesigntool.core.sign; - -import com.ohos.codesigntool.core.config.CodeSignConfig; -import com.ohos.codesigntool.core.exception.CodeSignException; - -/** - * Signed data generator interface - * - * @since 2023/06/05 - */ -@FunctionalInterface -public interface SignedDataGenerator { - /** - * Creat a BcSignedDataGenerator instance - * - * @return BcSignedDataGenerator instance. - */ - SignedDataGenerator BC = new BcSignedDataGenerator(); - - /** - * Generate signature data with specific content and sign configuration. - * - * @param content unsigned file digest content. - * @param signConfig sign configurations. - * @return signed data. - * @throws CodeSignException if error. - */ - byte[] generateSignedData(byte[] content, CodeSignConfig signConfig) throws CodeSignException; -} diff --git a/codesigntool/code_sign_tool_lib/src/main/java/com/ohos/codesigntool/core/utils/CertUtils.java b/codesigntool/code_sign_tool_lib/src/main/java/com/ohos/codesigntool/core/utils/CertUtils.java deleted file mode 100644 index e746c9131754ad68dcec4ba37a6c8d10e2a1107e..0000000000000000000000000000000000000000 --- a/codesigntool/code_sign_tool_lib/src/main/java/com/ohos/codesigntool/core/utils/CertUtils.java +++ /dev/null @@ -1,193 +0,0 @@ -/* - * Copyright (c) 2023 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.codesigntool.core.utils; - -import org.apache.logging.log4j.LogManager; -import org.apache.logging.log4j.Logger; - -import javax.security.auth.x500.X500Principal; -import java.io.ByteArrayInputStream; -import java.io.File; -import java.io.FileInputStream; -import java.io.IOException; -import java.nio.charset.StandardCharsets; -import java.security.InvalidKeyException; -import java.security.NoSuchAlgorithmException; -import java.security.NoSuchProviderException; -import java.security.SignatureException; -import java.security.cert.CRL; -import java.security.cert.CRLException; -import java.security.cert.Certificate; -import java.security.cert.CertificateException; -import java.security.cert.CertificateFactory; -import java.security.cert.X509CRL; -import java.security.cert.X509Certificate; -import java.util.ArrayList; -import java.util.Base64; -import java.util.Collection; -import java.util.Collections; -import java.util.List; - -/** - * Certificate utils class - * - * @since 2023/06/05 - */ -public class CertUtils { - private static final Logger LOGGER = LogManager.getLogger(CertUtils.class); - - /** - * Get certificates chains from input file. - * - * @param certFilePath input file path - * @return list of certificate chain - */ - public static List getCertChainsFromFile(String certFilePath) { - List x509CertList = null; - try (FileInputStream fileStream = FileUtils.open(new File(certFilePath));) { - x509CertList = getX509Certificates(getX509CertificateFactory(), fileStream); - } catch (IOException e) { - LOGGER.error("Certificate file exception: " + e.getMessage()); - return Collections.emptyList(); - } - sortCertChain(x509CertList); - verifyCertChain(x509CertList); - return x509CertList; - } - - private static List getX509Certificates( - CertificateFactory certificateFactory, FileInputStream fileInputStream) { - Collection certificates = null; - try { - certificates = certificateFactory.generateCertificates(fileInputStream); - } catch (CertificateException e) { - LOGGER.error("Certificate file does not exist! " + e.getMessage()); - } - if (certificates == null || certificates.size() == 0) { - return Collections.emptyList(); - } - List x509CertList = new ArrayList<>(); - for (Certificate certificate : certificates) { - if (certificate instanceof X509Certificate) { - x509CertList.add((X509Certificate) certificate); - } - } - return x509CertList; - } - - private static void verifyCertChain(List certs) { - if (certs.size() <= 1) { - return; - } - for (int i = 1; i < certs.size(); i++) { - try { - certs.get(i - 1).verify(certs.get(i).getPublicKey()); - } catch (CertificateException | NoSuchAlgorithmException | InvalidKeyException - | NoSuchProviderException | SignatureException e) { - LOGGER.error("verify certificate chain failed! " + e.getMessage()); - } - } - } - - /** - * certificate chain reversed - * when the last certificate subject is not equal to previous certificate issuer - * - * @param certificates input certificate-chain. - */ - private static void sortCertChain(List certificates) { - int size = certificates.size(); - if (certificates == null || size <= 1) { - return; - } - X500Principal lastSubjectX500Principal = certificates.get(size - 1).getSubjectX500Principal(); - X500Principal beforeIssuerX500Principal = certificates.get(size - 2).getIssuerX500Principal(); - if (!lastSubjectX500Principal.equals(beforeIssuerX500Principal)) { - Collections.reverse(certificates); - } - } - - /** - * Get the X509Certificate object from the base64-encoded certificate string. - * - * @param encodeString base64-encoded certificate string. - * @return object of X509Certificate. - */ - public static X509Certificate getX509CertByBase64EncodedString(String encodeString) { - String header = "-----BEGIN CERTIFICATE-----" + System.lineSeparator(); - String tail = "-----END CERTIFICATE-----" + System.lineSeparator(); - byte[] certificateDatas = null; - if (encodeString.startsWith(header) && encodeString.endsWith(tail)) { - certificateDatas = encodeString.getBytes(StandardCharsets.UTF_8); - } else { - certificateDatas = Base64.getUrlDecoder().decode(encodeString); - } - return getX509Certificate(certificateDatas); - } - - /** - * Get the x509CRL object from the base64-encoded certificate string. - * - * @param encodeString base64-encoded certificate string - * @return an object of x509CRL - */ - public static X509CRL getX509CRLByBase64EncodedString(String encodeString) { - byte[] certificateDatas = Base64.getUrlDecoder().decode(encodeString); - return getX509CRL(certificateDatas); - } - - private static CertificateFactory getX509CertificateFactory() { - CertificateFactory certificateFactory = null; - try { - certificateFactory = CertificateFactory.getInstance("X.509"); - } catch (CertificateException e) { - LOGGER.error("Failed to get X509 certificateFactory ", e); - } - return certificateFactory; - } - - private static X509Certificate getX509Certificate(byte[] certificateDatas) { - CertificateFactory certificateFactory = getX509CertificateFactory(); - Certificate certificate = null; - try { - certificate = certificateFactory.generateCertificate( - new ByteArrayInputStream(certificateDatas)); - } catch (CertificateException e) { - LOGGER.error("Failed to decode base64 string as certificate", e); - } - if (!(certificate instanceof X509Certificate)) { - LOGGER.error("Cannot decode input as X509 cert"); - return null; - } - return (X509Certificate) certificate; - } - - private static X509CRL getX509CRL(byte[] certificateDatas) { - CertificateFactory certificateFactory = getX509CertificateFactory(); - CRL crl = null; - try { - crl = certificateFactory.generateCRL( - new ByteArrayInputStream(certificateDatas)); - } catch (CRLException e) { - LOGGER.error("Failed to decode base64 string as crl", e); - } - if (!(crl instanceof X509CRL)) { - LOGGER.error("Cannot decode input as X509 crl"); - return null; - } - return (X509CRL) crl; - } -} diff --git a/codesigntool/code_sign_tool_lib/src/main/java/com/ohos/codesigntool/core/utils/CmsUtils.java b/codesigntool/code_sign_tool_lib/src/main/java/com/ohos/codesigntool/core/utils/CmsUtils.java deleted file mode 100644 index 61605fae5e8d3efc492766360d5cebbc4f622ad3..0000000000000000000000000000000000000000 --- a/codesigntool/code_sign_tool_lib/src/main/java/com/ohos/codesigntool/core/utils/CmsUtils.java +++ /dev/null @@ -1,88 +0,0 @@ -/* - * Copyright (c) 2023 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.codesigntool.core.utils; - -import org.bouncycastle.cert.X509CertificateHolder; -import org.bouncycastle.cms.CMSException; -import org.bouncycastle.cms.CMSProcessableByteArray; -import org.bouncycastle.cms.CMSSignedData; -import org.bouncycastle.cms.jcajce.JcaSimpleSignerInfoVerifierBuilder; -import org.bouncycastle.jce.provider.BouncyCastleProvider; -import org.bouncycastle.operator.OperatorCreationException; - -import java.security.Security; -import java.security.cert.CertificateException; -import java.util.Collection; - -/** - * CMS utils class - * - * @since 2023/06/05 - */ -public class CmsUtils { - static { - if (Security.getProvider("BC") == null) { - Security.addProvider(new BouncyCastleProvider()); - } - } - - /** - * Private constructor - */ - private CmsUtils() { - } - - private static void isCollectionVaild(Collection collection) - throws OperatorCreationException { - if (collection == null) { - throw new OperatorCreationException("No matched cert: " + collection); - } - if (collection.size() != 1) { - throw new OperatorCreationException( - "More than one matched certs,matched certs size: " + collection.size()); - } - } - - @SuppressWarnings("unchecked") - private static boolean verifyCmsSignedData(CMSSignedData cmsSignedData) throws CMSException { - return cmsSignedData.verifySignatures(signId -> { - Collection collection = - cmsSignedData.getCertificates().getMatches(signId); - isCollectionVaild(collection); - X509CertificateHolder cert = collection.iterator().next(); - try { - return new JcaSimpleSignerInfoVerifierBuilder().setProvider("BC").build(cert); - } catch (CertificateException e) { - throw new OperatorCreationException("Verify BC signatures failed: " + e.getMessage(), e); - } - }); - } - - /** - * Verify signed data using an unsigned data digest - * - * @param unsignedDataDigest unsigned data digest - * @param signedData signed data - * @return true if verify success - * @throws CMSException if error - */ - public static boolean verifySignDataWithUnsignedDataDigest(byte[] unsignedDataDigest, byte[] signedData) - throws CMSException { - CMSSignedData cmsSignedData = new CMSSignedData( - new CMSProcessableByteArray(unsignedDataDigest), signedData); - return verifyCmsSignedData(cmsSignedData); - } -} diff --git a/codesigntool/code_sign_tool_lib/src/main/java/com/ohos/codesigntool/core/utils/DigestUtils.java b/codesigntool/code_sign_tool_lib/src/main/java/com/ohos/codesigntool/core/utils/DigestUtils.java deleted file mode 100644 index d5b54b0357a9d2d885f4e4723883795d392f2a2c..0000000000000000000000000000000000000000 --- a/codesigntool/code_sign_tool_lib/src/main/java/com/ohos/codesigntool/core/utils/DigestUtils.java +++ /dev/null @@ -1,44 +0,0 @@ -/* - * Copyright (c) 2023 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.codesigntool.core.utils; - -import org.apache.logging.log4j.LogManager; -import org.apache.logging.log4j.Logger; -import java.security.MessageDigest; -import java.security.NoSuchAlgorithmException; - -/** - * Digest util class - * - * @since 2023/06/05 - */ -public class DigestUtils { - private static final Logger LOGGER = LogManager.getLogger(DigestUtils.class); - - /** - * digest the inputContent with specific algorithm - * - * @param inputContentArray input Content Array - * @param algorithm hash algorithm - * @return the result of digest,is a byte array - * @throws NoSuchAlgorithmException if error - */ - public static byte[] computeDigest(byte[] inputContentArray, String algorithm) throws NoSuchAlgorithmException { - MessageDigest md = MessageDigest.getInstance(algorithm); - md.update(inputContentArray); - return md.digest(); - } -} diff --git a/codesigntool/code_sign_tool_lib/src/main/java/com/ohos/codesigntool/core/utils/FileUtils.java b/codesigntool/code_sign_tool_lib/src/main/java/com/ohos/codesigntool/core/utils/FileUtils.java deleted file mode 100644 index 05ab106661d0e03973a90c28f8093cfa5fc861ad..0000000000000000000000000000000000000000 --- a/codesigntool/code_sign_tool_lib/src/main/java/com/ohos/codesigntool/core/utils/FileUtils.java +++ /dev/null @@ -1,69 +0,0 @@ -/* - * Copyright (c) 2023 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.codesigntool.core.utils; - -import org.apache.logging.log4j.LogManager; -import org.apache.logging.log4j.Logger; - -import java.io.File; -import java.io.FileInputStream; -import java.io.FileNotFoundException; -import java.io.IOException; - -/** - * util function about-file - * - * @since 2023/06/05 - */ -public class FileUtils { - private static final Logger LOGGER = LogManager.getLogger(FileUtils.class); - - /** - * Check input file is valid. - * - * @param file input file. - * @throws IOException file is not valid. - */ - public static void isValid(File file) throws IOException { - if (!file.exists()) { - throw new FileNotFoundException(file + " does not exist"); - } - - if (file.isDirectory()) { - throw new IOException(file + " is a directory"); - } - - if (!file.isFile()) { - throw new IOException(file + " is not a file!"); - } - - if (!file.canRead()) { - throw new IOException(file + " cannot be read"); - } - } - - /** - * Open an inputstream of input file safely. - * - * @param file input file. - * @return file inputStream - * @throws IOException file is a directory or can not be read. - */ - public static FileInputStream open(File file) throws IOException { - isValid(file); - return new FileInputStream(file); - } -} \ No newline at end of file diff --git a/codesigntool/code_sign_tool_lib/src/main/java/com/ohos/codesigntool/core/utils/HapUtils.java b/codesigntool/code_sign_tool_lib/src/main/java/com/ohos/codesigntool/core/utils/HapUtils.java deleted file mode 100644 index b1f9bec3afe73eae9423afcd51e730d612641ff9..0000000000000000000000000000000000000000 --- a/codesigntool/code_sign_tool_lib/src/main/java/com/ohos/codesigntool/core/utils/HapUtils.java +++ /dev/null @@ -1,109 +0,0 @@ -/* - * Copyright (c) 2023 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.codesigntool.core.utils; - -import com.google.gson.JsonElement; -import com.google.gson.JsonObject; -import com.google.gson.JsonParser; -import org.apache.logging.log4j.LogManager; -import org.apache.logging.log4j.Logger; - -import java.io.File; -import java.io.IOException; -import java.io.InputStream; -import java.nio.charset.StandardCharsets; -import java.util.ArrayList; -import java.util.LinkedList; -import java.util.List; -import java.util.Map; -import java.util.Queue; -import java.util.jar.JarEntry; -import java.util.jar.JarFile; - -/** - * utility for check hap configs - * - * @since 2023/06/05 - */ -public class HapUtils { - /** - * Represents the end-of-file. - */ - private static final Logger LOGGER = LogManager.getLogger(HapUtils.class); - private static final String COMPRESS_NATIVE_LIBS_OPTION = "compressNativeLibs"; - private static final List HAP_CONFIG_FILES = new ArrayList(); - private static final String HAP_FA_CONFIG_JSON_FILE = "config.json"; - private static final String HAP_STAGE_MODULE_JSON_FILE = "module.json"; - - static { - HAP_CONFIG_FILES.add(HAP_FA_CONFIG_JSON_FILE); - HAP_CONFIG_FILES.add(HAP_STAGE_MODULE_JSON_FILE); - } - - private HapUtils() { - } - - /** - * Check configuration in hap to find out whether the native libs are compressed - * - * @param hapFile the given hap - * @return boolean value of parsing result - * @throws IOException io error - */ - public static boolean checkCompressNativeLibs(File hapFile) throws IOException { - try (JarFile inputJar = new JarFile(hapFile, false)) { - for (String configFile : HAP_CONFIG_FILES) { - JarEntry entry = inputJar.getJarEntry(configFile); - if (entry == null) { - continue; - } - try (InputStream data = inputJar.getInputStream(entry)) { - String jsonString = new String( - InputStreamUtils.toByteArray(data, (int) entry.getSize()), StandardCharsets.UTF_8); - return checkCompressNativeLibs(jsonString); - } - } - } - return true; - } - - /** - * Check whether the native libs are compressed by parsing config json - * - * @param jsonString the config json string - * @return boolean value of parsing result - */ - public static boolean checkCompressNativeLibs(String jsonString) { - JsonObject jsonObject = JsonParser.parseString(jsonString).getAsJsonObject(); - Queue queue = new LinkedList<>(); - queue.offer(jsonObject); - while (queue.size() > 0) { - JsonObject curJsonObject = queue.poll(); - JsonElement jsonElement = curJsonObject.get(COMPRESS_NATIVE_LIBS_OPTION); - if (jsonElement != null) { - return jsonElement.getAsBoolean(); - } - for (Map.Entry entry : curJsonObject.entrySet()) { - if (entry.getValue().isJsonObject()) { - queue.offer(entry.getValue().getAsJsonObject()); - } - - } - } - // default to compress native libs - return true; - } -} diff --git a/codesigntool/code_sign_tool_lib/src/main/java/com/ohos/codesigntool/core/utils/InputStreamUtils.java b/codesigntool/code_sign_tool_lib/src/main/java/com/ohos/codesigntool/core/utils/InputStreamUtils.java deleted file mode 100644 index 4ca52f3c87cd14942dfecaf775875daea2c1ad73..0000000000000000000000000000000000000000 --- a/codesigntool/code_sign_tool_lib/src/main/java/com/ohos/codesigntool/core/utils/InputStreamUtils.java +++ /dev/null @@ -1,68 +0,0 @@ -/* - * Copyright (c) 2023 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.codesigntool.core.utils; - -import org.apache.logging.log4j.LogManager; -import org.apache.logging.log4j.Logger; - -import java.io.ByteArrayOutputStream; -import java.io.InputStream; -import java.io.IOException; -import java.io.OutputStream; - -/** - * InputStream util class - * - * @since 2023/08/10 - */ -public class InputStreamUtils { - private static final Logger LOGGER = LogManager.getLogger(InputStream.class); - private static final int BUFFER_SIZE = 4096; - - /** - * get byte array by inputStream and size - * - * @param inputStream inputStream data - * @param inputStreamSize inputStream size - * @return byte array value - * @throws IOException io error - */ - public static byte[] toByteArray(InputStream inputStream, int inputStreamSize) throws IOException { - if (inputStreamSize == 0) { - return new byte[0]; - } - if (inputStreamSize < 0) { - throw new IllegalArgumentException("inputStreamSize:" + inputStreamSize + " is less than zero: "); - } - ByteArrayOutputStream output = new ByteArrayOutputStream(); - copy(inputStream, inputStreamSize, output); - return output.toByteArray(); - } - - private static int copy(InputStream inputStream, int inputStreamSize, OutputStream output) throws IOException { - byte[] buffer = new byte[BUFFER_SIZE]; - int readSize = 0; - int count = 0; - while (readSize < inputStreamSize && (readSize = inputStream.read(buffer)) != -1) { - output.write(buffer, 0, readSize); - count += readSize; - } - if (count != inputStreamSize) { - throw new IOException("read size err. readSizeCount: " + count + ", inputStreamSize: " + inputStreamSize); - } - return count; - } -} diff --git a/codesigntool/code_sign_tool_lib/src/main/java/com/ohos/codesigntool/core/utils/Pair.java b/codesigntool/code_sign_tool_lib/src/main/java/com/ohos/codesigntool/core/utils/Pair.java deleted file mode 100644 index 35401b43308e9bf7a286d439b2f225530ac09ca6..0000000000000000000000000000000000000000 --- a/codesigntool/code_sign_tool_lib/src/main/java/com/ohos/codesigntool/core/utils/Pair.java +++ /dev/null @@ -1,97 +0,0 @@ -/* - * Copyright (c) 2023 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.codesigntool.core.utils; - -/** - * Pair of two elements. - * - * @since 2023/06/05 - */ -public final class Pair { - private final Key mKey; - - private final Value mValue; - - private Pair(Key key, Value value) { - mKey = key; - mValue = value; - } - - /** - * create a pair with key and value - * - * @param key key of pair - * @param value value of pair - * @param type of key - * @param type of value - * @return a pair with key and value - */ - public static Pair create(Key key, Value value) { - return new Pair(key, value); - } - - @Override - public int hashCode() { - final int prime = 31; - int result = 1; - result = hashCode(prime, result, mKey); - return hashCode(prime, result, mValue); - } - - private int hashCode(int prime, int result, T value) { - return prime * result + ((value == null) ? 0 : value.hashCode()); - } - - /** - * get value of pair - * - * @return value of pair - */ - public Value getValue() { - return mValue; - } - - /** - * get key of pair - * - * @return key of pair - */ - public Key getKey() { - return mKey; - } - - private boolean compare(T o1, T o2) { - if (o1 == null) { - return o2 == null; - } - return o1.equals(o2); - } - - @Override - public boolean equals(Object object) { - if (this == object) { - return true; - } - if (object == null) { - return false; - } - if (!(object instanceof Pair)) { - return false; - } - Pair pair = (Pair) object; - return compare(mKey, pair.getKey()) && compare(mValue, pair.getValue()); - } -} diff --git a/codesigntool/code_sign_tool_lib/src/main/java/com/ohos/codesigntool/core/utils/ParamConstants.java b/codesigntool/code_sign_tool_lib/src/main/java/com/ohos/codesigntool/core/utils/ParamConstants.java deleted file mode 100644 index 5df3abf45c9bd873f1fe075be168ff791dc71619..0000000000000000000000000000000000000000 --- a/codesigntool/code_sign_tool_lib/src/main/java/com/ohos/codesigntool/core/utils/ParamConstants.java +++ /dev/null @@ -1,134 +0,0 @@ -/* - * Copyright (c) 2023 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.codesigntool.core.utils; - -/** - * define const parameters. - * - * @since 2023/06/05 - */ -public class ParamConstants { - - /** - * Signature Algorithm name of SHA256withECDSA - */ - public static final String SIG_ALGORITHM_SHA256_ECDSA = "SHA256withECDSA"; - - /** - * Signature Algorithm name of SHA384withECDSA - */ - public static final String SIG_ALGORITHM_SHA384_ECDSA = "SHA384withECDSA"; - - /** - * Signature Algorithm name of SHA512withECDSA - */ - public static final String SIG_ALGORITHM_SHA512_ECDSA = "SHA512withECDSA"; - - /** - * Signature Algorithm name of SHA256withRSA - */ - public static final String SIG_ALGORITHM_SHA256_RSA = "SHA256withRSA"; - - /** - * Signature Algorithm name of SHA384withRSA - */ - public static final String SIG_ALGORITHM_SHA384_RSA = "SHA384withRSA"; - - /** - * Signature Algorithm name of SHA512withRSA - */ - public static final String SIG_ALGORITHM_SHA512_RSA = "SHA512withRSA"; - - /** - * Signature Algorithm name of SHA256withRSA/PSS - */ - public static final String SIG_ALGORITHM_SHA256_RSA_PSS = "SHA256withRSA/PSS"; - - /** - * Signature Algorithm name of SHA384withRSA/PSS - */ - public static final String SIG_ALGORITHM_SHA384_RSA_PSS = "SHA384withRSA/PSS"; - - /** - * Signature Algorithm name of SHA512withRSA/PSS - */ - public static final String SIG_ALGORITHM_SHA512_RSA_PSS = "SHA512withRSA/PSS"; - - /** - * Signature Algorithm name of SHA256withRSAANDMGF1 - */ - public static final String SIG_ALGORITHM_SHA256_RSA_MGF1 = "SHA256withRSAANDMGF1"; - - /** - * Signature Algorithm name of SHA384withRSAANDMGF1 - */ - public static final String SIG_ALGORITHM_SHA384_RSA_MGF1 = "SHA384withRSAANDMGF1"; - - /** - * Signature Algorithm name of SHA512withRSAANDMGF1 - */ - public static final String SIG_ALGORITHM_SHA512_RSA_MGF1 = "SHA512withRSAANDMGF1"; - - /** - * Signature Algorithm name of SHA256withDSA - */ - public static final String SIG_ALGORITHM_SHA256_DSA = "SHA256withDSA"; - - /** - * Signature Algorithm name of SHA384withDSA - */ - public static final String SIG_ALGORITHM_SHA384_DSA = "SHA384withDSA"; - - /** - * Signature Algorithm name of SHA512withDSA - */ - public static final String SIG_ALGORITHM_SHA512_DSA = "SHA512withDSA"; - - /** - * Certificate revoke list. - */ - public static final String PARAM_BASIC_CRL = "crl"; - - /** - * Private key used in signature. - */ - public static final String PARAM_BASIC_PRIVATE_KEY = "privatekey"; - - /** - * File used to sign. - */ - public static final String PARAM_BASIC_INPUT_FILE = "inputFile"; - - /** - * Signed file. - */ - public static final String PARAM_BASIC_OUTPUT_PATH = "outputPath"; - - /** - * Algorithm name of signatures. - */ - public static final String PARAM_BASIC_SIGN_ALG = "signAlg"; - - /** - * Flag indicates whether profile is signed. - */ - public static final String PARAM_OUTPUT_MEKLE_TREE = "outTree"; - - /** - * The certificate-file path. - */ - public static final String PARAM_LOCAL_PUBLIC_CERT = "certpath"; -} diff --git a/codesigntool/code_sign_tool_lib/src/main/java/com/ohos/codesigntool/core/utils/ParamProcessUtil.java b/codesigntool/code_sign_tool_lib/src/main/java/com/ohos/codesigntool/core/utils/ParamProcessUtil.java deleted file mode 100644 index 76632fe7d1d8976469873d4904c8d491f34c6f1d..0000000000000000000000000000000000000000 --- a/codesigntool/code_sign_tool_lib/src/main/java/com/ohos/codesigntool/core/utils/ParamProcessUtil.java +++ /dev/null @@ -1,60 +0,0 @@ -/* - * Copyright (c) 2023 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.codesigntool.core.utils; - -import com.ohos.codesigntool.core.sign.SignAlgorithm; - -import org.apache.logging.log4j.LogManager; -import org.apache.logging.log4j.Logger; - -import java.util.Map; -import java.util.TreeMap; - -/** - * Utils functions for process parameters. - * - * @since 2023/06/05 - */ -public class ParamProcessUtil { - private static final Logger LOGGER = LogManager.getLogger(ParamProcessUtil.class); - private static Map mapSignAlg = - new TreeMap(String.CASE_INSENSITIVE_ORDER); - - static { - mapSignAlg.put(ParamConstants.SIG_ALGORITHM_SHA256_ECDSA, SignAlgorithm.ECDSA_WITH_SHA256); - mapSignAlg.put(ParamConstants.SIG_ALGORITHM_SHA384_ECDSA, SignAlgorithm.ECDSA_WITH_SHA384); - mapSignAlg.put(ParamConstants.SIG_ALGORITHM_SHA512_ECDSA, SignAlgorithm.ECDSA_WITH_SHA512); - mapSignAlg.put(ParamConstants.SIG_ALGORITHM_SHA256_RSA_PSS, SignAlgorithm.RSA_PSS_WITH_SHA256); - mapSignAlg.put(ParamConstants.SIG_ALGORITHM_SHA384_RSA_PSS, SignAlgorithm.RSA_PSS_WITH_SHA384); - mapSignAlg.put(ParamConstants.SIG_ALGORITHM_SHA512_RSA_PSS, SignAlgorithm.RSA_PSS_WITH_SHA512); - mapSignAlg.put(ParamConstants.SIG_ALGORITHM_SHA256_RSA_MGF1, SignAlgorithm.RSA_PSS_WITH_SHA256); - mapSignAlg.put(ParamConstants.SIG_ALGORITHM_SHA384_RSA_MGF1, SignAlgorithm.RSA_PSS_WITH_SHA384); - mapSignAlg.put(ParamConstants.SIG_ALGORITHM_SHA512_RSA_MGF1, SignAlgorithm.RSA_PSS_WITH_SHA512); - } - - /** - * Get SignAlgorithm value by algorithm name. - * - * @param signAlgorithm algorithm name. - * @return SignAlgorithm value - */ - public static SignAlgorithm getSignAlgorithm(String signAlgorithm) { - if (!mapSignAlg.containsKey(signAlgorithm)) { - throw new IllegalArgumentException("Unsupported signature algorithm: " + signAlgorithm); - } - return mapSignAlg.get(signAlgorithm); - } -} diff --git a/codesigntool/code_sign_tool_lib/src/test/java/com/ohos/codesigntool/test/MerkleTreeTest.java b/codesigntool/code_sign_tool_lib/src/test/java/com/ohos/codesigntool/test/MerkleTreeTest.java deleted file mode 100644 index ef612369675bd3da2f6bb01d8f2c2d5b5d307fe4..0000000000000000000000000000000000000000 --- a/codesigntool/code_sign_tool_lib/src/test/java/com/ohos/codesigntool/test/MerkleTreeTest.java +++ /dev/null @@ -1,151 +0,0 @@ -/* - * Copyright (c) 2023 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.codesigntool.test; - -import com.ohos.codesigntool.core.exception.FsVerityDigestException; -import com.ohos.codesigntool.core.fsverity.FsVerityHashAlgorithm; -import com.ohos.codesigntool.core.fsverity.MerkleTree; -import com.ohos.codesigntool.core.fsverity.MerkleTreeBuilder; -import com.ohos.codesigntool.core.utils.FileUtils; -import org.junit.Assert; -import org.junit.Test; - -import java.io.File; -import java.io.FileInputStream; -import java.io.IOException; -import java.security.NoSuchAlgorithmException; - -/** - * MerkleTree Hash Test. - * - * @since 2023/06/27 - */ -public class MerkleTreeTest { - private static final String SMALL_UNFULL_CHUNK_SHA256_HASH = - "e7295a358de9d164adc111e80f7e6298e9f5abe44e94f4fb181ac85267a200c6"; - - private static final String SMALL_UNFULL_CHUNK_SHA512_HASH = - "b4173cc4b36f910efac553871044ac9a211f7658cbf406711f7c1492116069f4" + - "a30f04f03a21229da1df85201e1e2aa79ce40f8e1a95d82be3d522ea43a7b02b"; - - private static final String MID_UNFULL_CHUNK_SHA256_HASH = - "bcf7182fe7de3fb2076a648f95c09891fb050d318f09ce29e4c1e91b64ae92d2"; - - private static final String MID_UNFULL_CHUNK_SHA512_HASH = - "70f766c85a3cb4adec160668e1bbba68aa7e780414e147feb74cabce0e5aab60" + - "08b7c9142a8a1392e5d39528feee666cc3b4456de11e76e8737e251f7fa66251"; - - private static final String MID_FULL_CHUNK_SHA256_HASH = - "4cba0ca57bb71fb3ab739499eb448cceaac3728edc15ce0984bb3ecadb8f43bb"; - - private static final String MID_FULL_CHUNK_SHA512_HASH = - "a623e2b24335507d35190e0dc750ad26f853ac8da75d1e0dcccca76b7634a0b0" + - "5447f45a43376d75cc032b99364f97260a563be61fbdcd68c232fd326c817af0"; - - /** - * Test check small unfull chunk data sha256 hash - * - * @throws FsVerityDigestException on error. - */ - @Test - public void testSmallUnFullChunkSha256Hash() throws FsVerityDigestException { - String path = "src/test/resources/hashtestfile/4095file"; - checkFileHash(path, SMALL_UNFULL_CHUNK_SHA256_HASH, FsVerityHashAlgorithm.SHA256); - } - - /** - * Test check mid unfull chunk data sha256 hash - * - * @throws FsVerityDigestException on error. - */ - @Test - public void testMidUnFullChunkSha256Hash() throws FsVerityDigestException { - String path = "src/test/resources/hashtestfile/1000000file"; - checkFileHash(path, MID_UNFULL_CHUNK_SHA256_HASH, FsVerityHashAlgorithm.SHA256); - } - - /** - * Test check mid full chunk data sha256 hash - * - * @throws FsVerityDigestException on error. - */ - @Test - public void testMidFullChunkSha256Hash() throws FsVerityDigestException { - String path = "src/test/resources/hashtestfile/10485760file"; - checkFileHash(path, MID_FULL_CHUNK_SHA256_HASH, FsVerityHashAlgorithm.SHA256); - } - - /** - * Test check small unfull chunk data sha512 hash - * - * @throws FsVerityDigestException on error. - */ - @Test - public void testSmallUnFullChunkSha512Hash() throws FsVerityDigestException { - String path = "src/test/resources/hashtestfile/4095file"; - checkFileHash(path, SMALL_UNFULL_CHUNK_SHA512_HASH, FsVerityHashAlgorithm.SHA512); - } - - /** - * Test check mid unfull chunk data sha512 hash - * - * @throws FsVerityDigestException on error. - */ - @Test - public void testMidUnFullChunkSha512Hash() throws FsVerityDigestException { - String path = "src/test/resources/hashtestfile/1000000file"; - checkFileHash(path, MID_UNFULL_CHUNK_SHA512_HASH, FsVerityHashAlgorithm.SHA512); - } - - /** - * Test check mid full chunk data sha512 hash - * - * @throws FsVerityDigestException on error. - */ - @Test - public void testMidFullChunkSha512Hash() throws FsVerityDigestException { - String path = "src/test/resources/hashtestfile/10485760file"; - checkFileHash(path, MID_FULL_CHUNK_SHA512_HASH, FsVerityHashAlgorithm.SHA512); - } - - private void checkFileHash(String path, String hash, FsVerityHashAlgorithm fsVerityHashAlgorithm) - throws FsVerityDigestException { - MerkleTree merkleTree; - File tempFile = new File(path); - try (FileInputStream inputStream = FileUtils.open(tempFile);) { - MerkleTreeBuilder builder = new MerkleTreeBuilder(); - merkleTree = builder.generateMerkleTree(inputStream, tempFile.length(), fsVerityHashAlgorithm); - builder.close(); - } catch (IOException | NoSuchAlgorithmException e) { - throw new FsVerityDigestException("IOException" + e.getMessage(), e); - } - String stringHash = byte2hex(merkleTree.rootHash); - Assert.assertEquals(stringHash, hash); - } - - private String byte2hex(byte[] bytes) { - StringBuilder sb = new StringBuilder(); - String tmp = null; - for (byte b : bytes) { - tmp = Integer.toHexString(0xFF & b); - if (tmp.length() == 1) { - tmp = "0" + tmp; - } - sb.append(tmp); - } - return sb.toString(); - } -} \ No newline at end of file diff --git a/codesigntool/code_sign_tool_lib/src/test/resources/hashtestfile/1000000file b/codesigntool/code_sign_tool_lib/src/test/resources/hashtestfile/1000000file deleted file mode 100644 index 03ee4904a8274847a61799cfb256545f3983938f..0000000000000000000000000000000000000000 Binary files a/codesigntool/code_sign_tool_lib/src/test/resources/hashtestfile/1000000file and /dev/null differ diff --git a/codesigntool/code_sign_tool_lib/src/test/resources/hashtestfile/10485760file b/codesigntool/code_sign_tool_lib/src/test/resources/hashtestfile/10485760file deleted file mode 100644 index b8711b2f2a73567abc4baaad24e20d9c7f301125..0000000000000000000000000000000000000000 Binary files a/codesigntool/code_sign_tool_lib/src/test/resources/hashtestfile/10485760file and /dev/null differ diff --git a/codesigntool/code_sign_tool_lib/src/test/resources/hashtestfile/4095file b/codesigntool/code_sign_tool_lib/src/test/resources/hashtestfile/4095file deleted file mode 100644 index ad9838293c55c22a7e909a80d9fb73cbc1ac4f9a..0000000000000000000000000000000000000000 Binary files a/codesigntool/code_sign_tool_lib/src/test/resources/hashtestfile/4095file and /dev/null differ diff --git a/codesigntool/pom.xml b/codesigntool/pom.xml deleted file mode 100644 index afc2a07eb3ffd8c87e254886745001ea27afea8e..0000000000000000000000000000000000000000 --- a/codesigntool/pom.xml +++ /dev/null @@ -1,110 +0,0 @@ - - - - - 4.0.0 - - com.ohos.codesigntool - codesigntool - ${revision} - pom - - - 8 - 8 - UTF-8 - 1.0.0.0 - 1.71 - - - - code_sign_tool_lib - code_sign_appgallery_lib - - - - - - org.bouncycastle - bcpkix-jdk15on - 1.69 - - - org.apache.logging.log4j - log4j-core - 2.18.0 - - - com.google.code.gson - gson - 2.9.0 - - - org.apache.commons - commons-lang3 - 3.1 - - - com.mikesamuel - json-sanitizer - 1.2.2 - - - com.ohos.codesigntool - code_sign_tool_lib - ${project.version} - - - junit - junit - 4.13.2 - test - - - - - - - - org.apache.maven.plugins - maven-clean-plugin - 3.1.0 - - false - - - outputs - false - true - - **/* - - - - findBugCheckDocument - false - true - - **/* - - - - - - - - diff --git a/patches/patches.json b/patches/patches.json index 5eff6a856b66e4190816919069b7c4fd18a5a4f2..988fe5cf69b954c07caa526a89021f9f681653ca 100644 --- a/patches/patches.json +++ b/patches/patches.json @@ -29,6 +29,11 @@ "project":"security_selinux_adapter", "path":"base/security/selinux_adapter", "pr_url":"https://gitee.com/openharmony/security_selinux_adapter/pulls/2825" + }, + { + "project":"developtools_hapsigner", + "path":"developtools/hapsigner", + "pr_url":"https://gitee.com/openharmony/developtools_hapsigner/pulls/101" } ] }