From 329e2581fe5bd0afdb59c1b1d715124bc82262e2 Mon Sep 17 00:00:00 2001 From: thead_admin Date: Mon, 7 Aug 2023 11:22:40 +0800 Subject: [PATCH] Linux_SDK_V1.2.1 Signed-off-by: thead_admin --- Kconfig | 2 +- Makefile | 5 +- arch/riscv/include/asm/dma-mapping.h | 1 + board/thead/light-c910/Kconfig | 37 +- board/thead/light-c910/Makefile | 1 + board/thead/light-c910/board.c | 6 +- board/thead/light-c910/boot.c | 21 +- board/thead/light-c910/clock_config.c | 2 + board/thead/light-c910/light.c | 4 +- board/thead/light-c910/lpddr-regu/ddr_regu.c | 15 +- .../lpddr4/include/ddr_common_func.h | 2 +- .../light-c910/lpddr4/src/ddr_common_func.c | 2 +- board/thead/light-c910/sec_check.c | 171 ++++--- board/thead/light-c910/secimg_load.c | 212 ++++++++ board/thead/light-c910/spl.c | 16 +- board/thead/light-c910/sys_clk.c | 6 +- cmd/Kconfig | 6 + cmd/Makefile | 1 + cmd/avb.c | 4 + cmd/bootandroid.c | 453 ++++++++++++++++++ common/avb_verify.c | 77 ++- common/splash.c | 2 +- configs/light_a_val_android_defconfig | 115 +++++ configs/light_a_val_sec_defconfig | 1 + configs/light_ant_ref_defconfig | 3 +- configs/light_b_product_android_defconfig | 117 +++++ configs/light_beagle_android_defconfig | 111 +++++ configs/light_lpi4a_android_defconfig | 111 +++++ drivers/fastboot/Kconfig | 2 +- drivers/fastboot/fb_common.c | 4 + drivers/fastboot/fb_getvar.c | 19 + drivers/mmc/sdhci.c | 4 +- drivers/usb/dwc3/ep0.c | 5 +- include/asm/arch | 1 + include/configs/light-c910.h | 12 +- include/xbc.h | 1 + lib/Kconfig | 14 + lib/Makefile | 2 + lib/libavb/avb_rsa.c | 96 +++- lib/libavb/avb_sha.h | 13 + lib/libavb/avb_sha256.c | 38 ++ lib/libavb/avb_sha512.c | 38 ++ lib/libxbc/COPYING | 170 +++++++ lib/libxbc/Makefile | 14 + lib/libxbc/libxbc.c | 104 ++++ lib/libxbc/libxbc.h | 54 +++ lib/sec_library/include/aes.h | 20 +- lib/sec_library/include/common.h | 2 + lib/sec_library/include/core/README.txt | 0 lib/sec_library/include/core/cmsis/ARMCM0.h | 0 .../include/core/cmsis/cmsis_compiler.h | 0 .../include/core/cmsis/cmsis_gcc.h | 0 .../include/core/cmsis/cmsis_version.h | 0 lib/sec_library/include/core/cmsis/core_cm0.h | 0 lib/sec_library/include/core/cmsis/csi_core.h | 0 .../include/core/cmsis/system_ARMCM0.h | 0 lib/sec_library/include/core/core_801.h | 0 lib/sec_library/include/core/core_802.h | 0 lib/sec_library/include/core/core_803.h | 0 lib/sec_library/include/core/core_804.h | 0 lib/sec_library/include/core/core_805.h | 0 lib/sec_library/include/core/core_807.h | 0 lib/sec_library/include/core/core_810.h | 0 lib/sec_library/include/core/core_ck610.h | 0 lib/sec_library/include/core/core_ck801.h | 0 lib/sec_library/include/core/core_ck802.h | 0 lib/sec_library/include/core/core_ck803.h | 0 lib/sec_library/include/core/core_ck807.h | 0 lib/sec_library/include/core/core_ck810.h | 0 lib/sec_library/include/core/core_rv32.h | 0 lib/sec_library/include/core/core_rv64.h | 0 lib/sec_library/include/core/csi_gcc.h | 0 lib/sec_library/include/core/csi_rv32_gcc.h | 0 lib/sec_library/include/core/csi_rv64_gcc.h | 0 lib/sec_library/include/csi_core.h | 0 lib/sec_library/include/csi_efuse_api.h | 6 +- lib/sec_library/include/csi_sec_img_verify.h | 2 + lib/sec_library/include/curve25519.h | 86 ++++ lib/sec_library/include/des.h | 20 +- lib/sec_library/include/dev_tag.h | 0 lib/sec_library/include/device_types.h | 0 lib/sec_library/include/dsa.h | 178 +++++++ lib/sec_library/include/ecc.h | 26 +- lib/sec_library/include/ecdh.h | 2 +- lib/sec_library/include/kdf.h | 0 lib/sec_library/include/keyram.h | 0 lib/sec_library/include/list.h | 2 + lib/sec_library/include/rambus.h | 0 lib/sec_library/include/rng.h | 10 +- lib/sec_library/include/rsa.h | 105 +++- lib/sec_library/include/sec_crypto_aes.h | 16 +- lib/sec_library/include/sec_crypto_common.h | 5 +- .../include/sec_crypto_curve25519.h | 95 ++++ lib/sec_library/include/sec_crypto_des.h | 14 +- lib/sec_library/include/sec_crypto_dsa.h | 109 +++++ lib/sec_library/include/sec_crypto_ecc.h | 24 +- lib/sec_library/include/sec_crypto_ecdh.h | 2 +- lib/sec_library/include/sec_crypto_kdf.h | 0 lib/sec_library/include/sec_crypto_mac.h | 0 lib/sec_library/include/sec_crypto_rng.h | 10 +- lib/sec_library/include/sec_crypto_rsa.h | 75 +-- lib/sec_library/include/sec_crypto_sha.h | 42 +- lib/sec_library/include/sec_crypto_sm2.h | 24 +- lib/sec_library/include/sec_crypto_sm4.h | 15 +- lib/sec_library/include/sec_include_config.h | 0 lib/sec_library/include/sec_library.h | 4 + lib/sec_library/include/sha.h | 58 ++- lib/sec_library/include/sm2.h | 26 +- lib/sec_library/include/sm3.h | 28 +- lib/sec_library/include/sm4.h | 41 +- lib/sec_library/include/soc.h | 0 lib/sec_library/include/sys_clk.h | 0 lib/sec_library/libsec_library.a | Bin 8958940 -> 7272834 bytes run.sh | 2 +- 114 files changed, 2798 insertions(+), 346 deletions(-) create mode 100644 board/thead/light-c910/secimg_load.c create mode 100644 cmd/bootandroid.c create mode 100644 configs/light_a_val_android_defconfig create mode 100644 configs/light_b_product_android_defconfig create mode 100644 configs/light_beagle_android_defconfig create mode 100644 configs/light_lpi4a_android_defconfig create mode 120000 include/asm/arch create mode 100644 include/xbc.h create mode 100644 lib/libxbc/COPYING create mode 100644 lib/libxbc/Makefile create mode 100644 lib/libxbc/libxbc.c create mode 100644 lib/libxbc/libxbc.h mode change 100755 => 100644 lib/sec_library/include/aes.h mode change 100755 => 100644 lib/sec_library/include/common.h mode change 100755 => 100644 lib/sec_library/include/core/README.txt mode change 100755 => 100644 lib/sec_library/include/core/cmsis/ARMCM0.h mode change 100755 => 100644 lib/sec_library/include/core/cmsis/cmsis_compiler.h mode change 100755 => 100644 lib/sec_library/include/core/cmsis/cmsis_gcc.h mode change 100755 => 100644 lib/sec_library/include/core/cmsis/cmsis_version.h mode change 100755 => 100644 lib/sec_library/include/core/cmsis/core_cm0.h mode change 100755 => 100644 lib/sec_library/include/core/cmsis/csi_core.h mode change 100755 => 100644 lib/sec_library/include/core/cmsis/system_ARMCM0.h mode change 100755 => 100644 lib/sec_library/include/core/core_801.h mode change 100755 => 100644 lib/sec_library/include/core/core_802.h mode change 100755 => 100644 lib/sec_library/include/core/core_803.h mode change 100755 => 100644 lib/sec_library/include/core/core_804.h mode change 100755 => 100644 lib/sec_library/include/core/core_805.h mode change 100755 => 100644 lib/sec_library/include/core/core_807.h mode change 100755 => 100644 lib/sec_library/include/core/core_810.h mode change 100755 => 100644 lib/sec_library/include/core/core_ck610.h mode change 100755 => 100644 lib/sec_library/include/core/core_ck801.h mode change 100755 => 100644 lib/sec_library/include/core/core_ck802.h mode change 100755 => 100644 lib/sec_library/include/core/core_ck803.h mode change 100755 => 100644 lib/sec_library/include/core/core_ck807.h mode change 100755 => 100644 lib/sec_library/include/core/core_ck810.h mode change 100755 => 100644 lib/sec_library/include/core/core_rv32.h mode change 100755 => 100644 lib/sec_library/include/core/core_rv64.h mode change 100755 => 100644 lib/sec_library/include/core/csi_gcc.h mode change 100755 => 100644 lib/sec_library/include/core/csi_rv32_gcc.h mode change 100755 => 100644 lib/sec_library/include/core/csi_rv64_gcc.h mode change 100755 => 100644 lib/sec_library/include/csi_core.h mode change 100755 => 100644 lib/sec_library/include/csi_sec_img_verify.h create mode 100644 lib/sec_library/include/curve25519.h mode change 100755 => 100644 lib/sec_library/include/dev_tag.h mode change 100755 => 100644 lib/sec_library/include/device_types.h create mode 100644 lib/sec_library/include/dsa.h mode change 100755 => 100644 lib/sec_library/include/ecc.h mode change 100755 => 100644 lib/sec_library/include/ecdh.h mode change 100755 => 100644 lib/sec_library/include/kdf.h mode change 100755 => 100644 lib/sec_library/include/keyram.h mode change 100755 => 100644 lib/sec_library/include/list.h mode change 100755 => 100644 lib/sec_library/include/rambus.h mode change 100755 => 100644 lib/sec_library/include/rng.h mode change 100755 => 100644 lib/sec_library/include/rsa.h mode change 100755 => 100644 lib/sec_library/include/sec_crypto_common.h create mode 100644 lib/sec_library/include/sec_crypto_curve25519.h create mode 100644 lib/sec_library/include/sec_crypto_dsa.h mode change 100755 => 100644 lib/sec_library/include/sec_crypto_ecc.h mode change 100755 => 100644 lib/sec_library/include/sec_crypto_ecdh.h mode change 100755 => 100644 lib/sec_library/include/sec_crypto_kdf.h mode change 100755 => 100644 lib/sec_library/include/sec_crypto_mac.h mode change 100755 => 100644 lib/sec_library/include/sec_include_config.h mode change 100755 => 100644 lib/sec_library/include/sha.h mode change 100755 => 100644 lib/sec_library/include/sm2.h mode change 100755 => 100644 lib/sec_library/include/sm3.h mode change 100755 => 100644 lib/sec_library/include/sm4.h mode change 100755 => 100644 lib/sec_library/include/soc.h mode change 100755 => 100644 lib/sec_library/include/sys_clk.h mode change 100755 => 100644 lib/sec_library/libsec_library.a diff --git a/Kconfig b/Kconfig index 92fc4fc1..604d50a6 100644 --- a/Kconfig +++ b/Kconfig @@ -302,7 +302,7 @@ menu "Boot images" config ANDROID_BOOT_IMAGE bool "Enable support for Android Boot Images" - default y if FASTBOOT + default n if FASTBOOT help This enables support for booting images which use the Android image format header. diff --git a/Makefile b/Makefile index bdc6f369..ae2fd85c 100644 --- a/Makefile +++ b/Makefile @@ -219,7 +219,7 @@ endif ifeq ($(KBUILD_SRC),) # building in the source tree - srctree := . + srctree := $(shell pwd) else ifeq ($(KBUILD_SRC)/,$(dir $(CURDIR))) # building in a subdirectory of the source tree @@ -726,6 +726,7 @@ UBOOTINCLUDE := \ $(if $(CONFIG_HAS_THUMB2),, \ -I$(srctree)/arch/$(ARCH)/thumb1/include),) \ -I$(srctree)/arch/$(ARCH)/include \ + $(if $(CONFIG_TARGET_LIGHT_C910), -I$(srctree)/lib/sec_library/include) \ -include $(srctree)/include/linux/kconfig.h NOSTDINC_FLAGS += -nostdinc -isystem $(shell $(CC) -print-file-name=include) @@ -811,7 +812,7 @@ PLATFORM_LIBGCC := -L $(shell dirname `$(CC) $(c_flags) -print-libgcc-file-name` endif PLATFORM_LIBS += $(PLATFORM_LIBGCC) ifeq ($(CONFIG_TARGET_LIGHT_C910),y) -PLATFORM_LIBS += -L $(shell pwd)/lib/sec_library -lsec_library +PLATFORM_LIBS += -L $(srctree)/lib/sec_library -lsec_library endif ifdef CONFIG_CC_COVERAGE diff --git a/arch/riscv/include/asm/dma-mapping.h b/arch/riscv/include/asm/dma-mapping.h index 39b2c06c..384bf1ae 100644 --- a/arch/riscv/include/asm/dma-mapping.h +++ b/arch/riscv/include/asm/dma-mapping.h @@ -10,6 +10,7 @@ #define __ASM_RISCV_DMA_MAPPING_H #include +#include "common.h" #define dma_mapping_error(x, y) 0 diff --git a/board/thead/light-c910/Kconfig b/board/thead/light-c910/Kconfig index 26907eae..5dd65f43 100644 --- a/board/thead/light-c910/Kconfig +++ b/board/thead/light-c910/Kconfig @@ -34,22 +34,53 @@ config SYS_BOARD config SYS_CONFIG_NAME default "light-c910" +config LIGHT_BOOT_FORCE_SEQ + bool "light boot force sequence" + default n + config LIGHT_SEC_UPGRADE bool "light secure upgrade" default n +config LIGHT_ANDROID_BOOT_IMAGE_VAL_A + bool "light board-a android image" + default n + +config AVB_USE_OEM_KEY + bool "AVB signature with OEM key" + default n + +config AVB_ROLLBACK_ENABLE + bool "AVB rollback index in RPMB" + default n + +config AVB_HW_ENGINE_ENABLE + bool "AVB Hardware cryptographic engine enable" + default n + +config LIGHT_ANDROID_BOOT_IMAGE_VAL_B + bool "light board-b android image" + default n + +config LIGHT_ANDROID_BOOT_IMAGE_VAL_LPI4A + bool "light board-lpi4a android image" + default n + config LIGHT_SEC_BOOT_WITH_VERIFY_VAL_A bool "light board-a security boot with verification" default n config LIGHT_SEC_BOOT_WITH_VERIFY_VAL_B - bool "light board-b security boot with verification" + bool "light board-b security boot with verification" + default n config LIGHT_SEC_BOOT_WITH_VERIFY_ANT_REF - bool "light ant ref security boot with verification" + bool "light ant ref security boot with verification" + default n config LIGHT_SEC_BOOT_WITH_VERIFY_LPI4A - bool "light lpi4a security boot with verification" + bool "light lpi4a security boot with verification" + default n config TARGET_LIGHT_FPGA_FM_C910 bool "light fullmask FPGA board" diff --git a/board/thead/light-c910/Makefile b/board/thead/light-c910/Makefile index 3847a0b8..21e9649b 100644 --- a/board/thead/light-c910/Makefile +++ b/board/thead/light-c910/Makefile @@ -68,4 +68,5 @@ endif obj-y += light-sv/pll_io_test.o obj-y += light-sv/adc_test.o obj-y += version_rollback.o +obj-$(CONFIG_AVB_VERIFY) += secimg_load.o endif diff --git a/board/thead/light-c910/board.c b/board/thead/light-c910/board.c index fa3ecc52..b02b0e95 100644 --- a/board/thead/light-c910/board.c +++ b/board/thead/light-c910/board.c @@ -50,9 +50,9 @@ int g_dnl_board_usb_cable_connected(void) #define C906_RST_ADDR_L 0xfffff48048 #define C906_RST_ADDR_H 0xfffff4804C -#define C906_START_ADDRESS_L 0xc0000000 -#define C906_START_ADDRESS_H 0xff -#define C910_C906_START_ADDRESS 0xffc0000000 +#define C906_START_ADDRESS_L 0x32000000 +#define C906_START_ADDRESS_H 0x00 +#define C910_C906_START_ADDRESS 0x0032000000 #define C906_CPR_IPCG_ADDRESS 0xFFCB000010 #define C906_IOCTL_GPIO_SEL_ADDRESS 0xFFCB01D000 #define C906_IOCTL_AF_SELH_ADDRESS 0xFFCB01D008 diff --git a/board/thead/light-c910/boot.c b/board/thead/light-c910/boot.c index 1922638d..24f3776f 100644 --- a/board/thead/light-c910/boot.c +++ b/board/thead/light-c910/boot.c @@ -42,6 +42,7 @@ static unsigned int upgrade_image_version = 0; #define RPMB_EMMC_CID_SIZE 16 #define RPMB_CID_PRV_OFFSET 9 #define RPMB_CID_CRC_OFFSET 15 +#ifdef LIGHT_KDF_RPMB_KEY static int tee_rpmb_key_gen(uint8_t* key, uint32_t * length) { uint32_t data[RPMB_EMMC_CID_SIZE / 4]; @@ -107,17 +108,17 @@ func_exit: return ret; } +#endif int csi_rpmb_write_access_key(void) { +#ifdef LIGHT_KDF_RPMB_KEY unsigned long *temp_rpmb_key_addr = NULL; char runcmd[64] = {0}; uint8_t blkdata[256] = {0}; __attribute__((__aligned__(8))) uint8_t kdf_rpmb_key[32]; - uint32_t kdf_rpmb_key_length = 0; + uint32_t kdf_rpmb_key_length = 0; int ret = 0; - -#ifdef LIGHT_KDF_RPMB_KEY /* Step1: retrive RPMB key from KDF function */ ret = tee_rpmb_key_gen(kdf_rpmb_key, &kdf_rpmb_key_length); if (ret != 0) { @@ -294,7 +295,7 @@ int csi_uboot_get_image_version(unsigned int *ver) unsigned int ver_x = 0; int ret = 0; - ret = csi_efuse_api_int(); + ret = csi_efuse_api_init(); if (ret) { printf("efuse api init fail \n"); return -1; @@ -320,7 +321,6 @@ int csi_uboot_set_image_version(unsigned int ver) //TODO unsigned long long uboot_ver = 0; unsigned char ver_x = (ver & 0xff00) >> 8; - char ver_str[32] = {0}; uboot_ver = env_get_hex("uboot_version", 0xffffffffffffffff); @@ -343,7 +343,7 @@ int csi_uboot_set_image_version(unsigned int ver) return 0; } - ret = csi_efuse_api_int(); + ret = csi_efuse_api_init(); if (ret) { printf("efuse api init fail \n"); return -1; @@ -411,6 +411,9 @@ int check_image_version_rule(unsigned int new_ver, unsigned int cur_ver) cur_ver_x = (cur_ver & 0xFF00) >> 8; cur_ver_y = cur_ver & 0xFF; + (void)new_ver_y; + (void)cur_ver_y; + /* Ensure image version must be less than expected version */ if (new_ver_x < cur_ver_x) { return -1; @@ -588,10 +591,8 @@ int light_secboot(int argc, char * const argv[]) int ret = 0; unsigned long tf_addr = LIGHT_TF_FW_ADDR; unsigned long tee_addr = LIGHT_TEE_FW_ADDR; - unsigned long kernel_addr = LIGHT_KERNEL_ADDR; unsigned int tf_image_size = 0; unsigned int tee_image_size = 0; - unsigned int kernel_image_size = 0; printf("\n\n"); printf("Now, we start to verify all trust firmware before boot kernel !\n"); @@ -759,7 +760,7 @@ void sec_upgrade_thread(void) } else { image_buffer = image_malloc_buffer; } - memcpy(image_buffer, temp_addr, upgrade_file_size); + memcpy(image_buffer, (void*)temp_addr, upgrade_file_size); /* STEP 2: verify its authentiticy here */ sprintf(runcmd, "vimage 0x%p tf", (void *)temp_addr); @@ -820,7 +821,7 @@ _upgrade_tf_exit: } else { image_buffer = image_malloc_buffer; } - memcpy(image_buffer, temp_addr, upgrade_file_size); + memcpy(image_buffer, (void*)temp_addr, upgrade_file_size); /* STEP 2: verify its authentiticy here */ sprintf(runcmd, "vimage 0x%p tee", (void *)temp_addr); diff --git a/board/thead/light-c910/clock_config.c b/board/thead/light-c910/clock_config.c index e1b52190..50036fb4 100644 --- a/board/thead/light-c910/clock_config.c +++ b/board/thead/light-c910/clock_config.c @@ -1146,6 +1146,7 @@ void ap_mipi_dsi1_clk_endisable(bool en) writel(cfg1, (void __iomem *)AP_DPU1_PLL_CFG1); } +#if defined (CONFIG_TARGET_LIGHT_FM_C910_VAL_ANT_DISCRETE) || defined (CONFIG_TARGET_LIGHT_FM_C910_BEAGLE) || defined (CONFIG_TARGET_LIGHT_FM_C910_B_REF) || defined (CONFIG_TARGET_LIGHT_FM_C910_VAL_ANT_REF) || defined (CONFIG_TARGET_LIGHT_FM_C910_B_POWER) || defined (CONFIG_TARGET_LIGHT_FM_C910_VAL_B) || defined (CONFIG_TARGET_LIGHT_FM_C910_LPI4A) static void ap_multimedia_div_num_set(enum multimedia_div_type type, unsigned int div_num) { unsigned long div_reg; @@ -1209,6 +1210,7 @@ static void ap_multimedia_div_num_set(enum multimedia_div_type type, unsigned in div_cfg |= div_en; writel(div_cfg, (void __iomem *)div_reg); } +#endif int clk_config(void) { diff --git a/board/thead/light-c910/light.c b/board/thead/light-c910/light.c index 76e12bec..edd9307c 100644 --- a/board/thead/light-c910/light.c +++ b/board/thead/light-c910/light.c @@ -913,14 +913,14 @@ static void light_iopin_init(void) light_pin_cfg(GPIO1_2,PIN_SPEED_NORMAL,PIN_PN,2); light_pin_cfg(GPIO1_3,PIN_SPEED_NORMAL,PIN_PN,2); light_pin_cfg(GPIO1_4,PIN_SPEED_NORMAL,PIN_PN,2); -#ifndef defined (CONFIG_TARGET_LIGHT_FM_C910_B_POWER) +#if ! defined (CONFIG_TARGET_LIGHT_FM_C910_B_POWER) light_pin_cfg(GPIO1_9,PIN_SPEED_NORMAL,PIN_PN,2); //soc_vdd18_lcd0_en_reg --backup regulator #else light_pin_cfg(GPIO1_9,PIN_SPEED_NORMAL,PIN_PU,2); //soc_vdd18_lcd0_en_reg #endif light_pin_cfg(GPIO1_10,PIN_SPEED_NORMAL,PIN_PN,2);//soc_lcd0_bias_en_reg light_pin_cfg(GPIO1_11,PIN_SPEED_NORMAL,PIN_PN,2); -#ifndef defined (CONFIG_TARGET_LIGHT_FM_C910_B_POWER) +#if ! defined (CONFIG_TARGET_LIGHT_FM_C910_B_POWER) light_pin_cfg(GPIO1_12,PIN_SPEED_NORMAL,PIN_PN,2);//reg_tp_pwr_en --touch pannel #else light_pin_cfg(GPIO1_12,PIN_SPEED_NORMAL,PIN_PU,2);//reg_tp_pwr_en --touch pannel diff --git a/board/thead/light-c910/lpddr-regu/ddr_regu.c b/board/thead/light-c910/lpddr-regu/ddr_regu.c index 868af141..72d1f815 100644 --- a/board/thead/light-c910/lpddr-regu/ddr_regu.c +++ b/board/thead/light-c910/lpddr-regu/ddr_regu.c @@ -165,6 +165,7 @@ static const struct regulator_t g_apcpu_regu_id_list[] = { } }; #else +#if defined (CONFIG_TARGET_LIGHT_FM_C910_VAL_B) /** * board for EB064A10/EB064A11 * @@ -183,6 +184,7 @@ static const struct regulator_t g_regu_id_list[] = { REGU_ID_DEF(IIC_IDX_AONIIC,DDR_VDD_REGU_1V1,0x5A,0xA7,0,1,CONFIG_DDR_REGU_1V1,800000,1500000,20000,0), } }; +#endif static const struct regulator_t g_apcpu_regu_id_list[] = { { @@ -236,7 +238,7 @@ static int wait_iic_receive(dw_iic_regs_t *iic_base, uint32_t wait_data_num, uin } -unsigned long soc_get_iic_freq(uint32_t idx) +static unsigned long soc_get_iic_freq(uint32_t idx) { if (idx == IIC_IDX_AONIIC){ return 49152000U; @@ -651,6 +653,7 @@ int32_t csi_iic_mem_receive_sr(csi_iic_t *iic, uint32_t devaddr, uint16_t memadd return read_count; } +#if defined (CONFIG_TARGET_LIGHT_FM_C910_VAL_A) ||defined (CONFIG_TARGET_LIGHT_FM_C910_VAL_B) static int pmic_read_reg_sr(csi_iic_t *iic_handle,uint16_t dev_addr,uint32_t offset, uint32_t *val) { int32_t num; @@ -662,6 +665,7 @@ static int pmic_read_reg_sr(csi_iic_t *iic_handle,uint16_t dev_addr,uint32_t off *val = temp[0]; return 0; } +#endif static int pmic_write_reg(csi_iic_t *iic_handle,uint16_t dev_addr,uint32_t offset, uint32_t val) { @@ -688,6 +692,7 @@ static int pmic_write_reg(csi_iic_t *iic_handle,uint16_t dev_addr,uint32_t offse return 0; } +#if !defined (CONFIG_TARGET_LIGHT_FM_C910_VAL_A) && !defined (CONFIG_TARGET_LIGHT_FM_C910_VAL_B) static int pmic_read_reg(csi_iic_t *iic_handle,uint16_t dev_addr,uint32_t offset, uint32_t *val) { int32_t num; @@ -716,6 +721,7 @@ static int pmic_read_reg(csi_iic_t *iic_handle,uint16_t dev_addr,uint32_t offset *val = temp[0]; return 0; } +#endif static int _pmic_ddr_regu_init(uint32_t idx) { @@ -818,13 +824,14 @@ int pmic_ddr_regu_init(void) int pmic_ddr_set_voltage(void) { int ret = 0; + +#if 0 //currently,no need to modify ddr regulator voltage uint32_t val = 0; uint32_t regu_num = ARRAY_SIZE(g_regu_id_list); uint32_t i; struct regulator_t *pregu; csi_iic_t *dev_handle; -#if 0 //currently,no need to modify ddr regulator voltage pregu = (struct regulator_t*)g_regu_id_list; for (i = 0; i < regu_num; i++, pregu++) { if (pregu->regu_vol_target < pregu->regu_vol_min || pregu->regu_vol_target > pregu->regu_vol_max) @@ -838,6 +845,10 @@ int pmic_ddr_set_voltage(void) #endif #if defined (CONFIG_TARGET_LIGHT_FM_C910_VAL_B) + uint32_t val = 0; + struct regulator_t *pregu; + csi_iic_t *dev_handle; + /*enable lcd0_en ldo*/ pregu = (struct regulator_t*)&g_regu_id_list[LCD0_EN]; dev_handle = pmic_get_iic_handle(pregu->iic_id); diff --git a/board/thead/light-c910/lpddr4/include/ddr_common_func.h b/board/thead/light-c910/lpddr4/include/ddr_common_func.h index 670477b5..de600b32 100644 --- a/board/thead/light-c910/lpddr4/include/ddr_common_func.h +++ b/board/thead/light-c910/lpddr4/include/ddr_common_func.h @@ -48,5 +48,5 @@ void ctrl_init(int rank_num, int speed); void addrmap(int rank_num, enum DDR_BITWIDTH bits); void ctrl_en(enum DDR_BITWIDTH bits); void enable_auto_refresh(void); - +void lpddr4_auto_selref(void); #endif // DDR_COMMON_FUNCE_H diff --git a/board/thead/light-c910/lpddr4/src/ddr_common_func.c b/board/thead/light-c910/lpddr4/src/ddr_common_func.c index 55155eb4..40276f6e 100644 --- a/board/thead/light-c910/lpddr4/src/ddr_common_func.c +++ b/board/thead/light-c910/lpddr4/src/ddr_common_func.c @@ -1132,7 +1132,7 @@ void ddr_soc_pll_disable () { printf("DDR SOC PLL PowerDown \n"); #endif } -void lpddr4_auto_selref() +void lpddr4_auto_selref(void) { ddr_sysreg_wr(DDR_CFG1,0xa0000); //remove core clock after xx wr(SWCTL,0); diff --git a/board/thead/light-c910/sec_check.c b/board/thead/light-c910/sec_check.c index 29a3ca56..af44ec9b 100644 --- a/board/thead/light-c910/sec_check.c +++ b/board/thead/light-c910/sec_check.c @@ -12,7 +12,7 @@ #include #include "../../../lib/sec_library/include/csi_sec_img_verify.h" -extern int csi_efuse_api_int(void); +extern int csi_efuse_api_init(void); extern int csi_efuse_api_unint(void); extern int csi_efuse_read_raw(uint32_t addr, void *data, uint32_t cnt); extern int csi_efuse_write_raw(uint32_t addr, const void *data, uint32_t cnt); @@ -35,7 +35,7 @@ int csi_sec_init(void) char *version; /* Initialize eFuse module */ - ret = csi_efuse_api_int(); + ret = csi_efuse_api_init(); if (ret) { printf("efuse init faild[%d]\n", ret); goto exit; @@ -62,7 +62,7 @@ void designware_get_mac_from_fuse(unsigned char *mac) int ret; /* Initialize eFuse module */ - ret = csi_efuse_api_int(); + ret = csi_efuse_api_init(); if (ret) { printf("efuse init faild[%d]\n", ret); return; @@ -75,6 +75,87 @@ void designware_get_mac_from_fuse(unsigned char *mac) } } +#if CONFIG_IS_ENABLED(LIGHT_SEC_BOOT_WITH_VERIFY_VAL_A) || CONFIG_IS_ENABLED(LIGHT_SEC_BOOT_WITH_VERIFY_VAL_B) || CONFIG_IS_ENABLED(LIGHT_SEC_BOOT_WITH_VERIFY_ANT_REF) || CONFIG_IS_ENABLED(LIGHT_SEC_BOOT_WITH_VERIFY_LPI4A) +/* Secure function for image verificaiton here */ +int get_image_version(unsigned long img_src_addr) +{ + img_header_t *img = (img_header_t *)img_src_addr; + uint8_t magiccode[4] = {0}; + + magiccode[3] = img->magic_num & 0xff; + magiccode[2] = (img->magic_num & 0xff00) >> 8; + magiccode[1] = (img->magic_num & 0xff0000) >> 16; + magiccode[0] = (img->magic_num & 0xff000000) >> 24; + if (memcmp(header_magic, magiccode, 4) == 0) { + return -1; + } + + return img->image_version; +} + +int get_image_size(unsigned long img_src_addr) +{ + img_header_t *img = (img_header_t *)img_src_addr; + uint8_t magiccode[4] = {0}; + + magiccode[3] = img->magic_num & 0xff; + magiccode[2] = (img->magic_num & 0xff00) >> 8; + magiccode[1] = (img->magic_num & 0xff0000) >> 16; + magiccode[0] = (img->magic_num & 0xff000000) >> 24; + if (memcmp(header_magic, magiccode, 4) == 0) { + return -1; + } + + return img->image_size; +} + +void dump_image_header_info(long addr) +{ + img_header_t *phead = (img_header_t *)addr; + + printf("\n---------------------------------------------\n"); + printf("entry point: 0x%x\n", phead->entry_point); + printf("image size: %d Bytes\n", phead->image_size); + printf("head version: 0x%x\n", phead->head_version); + printf("image version: 0x%x\n", phead->image_version); + printf("image checksum: 0x%x\n", phead->image_checksum); + printf("image run addr: 0x%llx\n", phead->image_run_addr); + printf("image offset: 0x%x\n", phead->image_offset); + printf("image digest scheme: %d\n", phead->digest_scheme); + printf("image sign scheme: %d\n", phead->signature_scheme); + printf("image encrypt type: %d\n", phead->encrypt_type); + printf("\n---------------------------------------------\n"); +} + +int verify_customer_image(img_type_t type, long addr) +{ + int ret; + + /* Double check image number */ + if (image_have_head(addr) == 0) + return -1; + + /* Dump image header information here */ + dump_image_header_info(addr); + + /* Call customer image verification function */ + if ((type == T_TF) || (type == T_TEE) || (type == T_KRLIMG)) { + ret = csi_sec_custom_image_verify(addr, UBOOT_STAGE_ADDR); + if (ret) { + printf("Image(%d) is verified fail, Please go to check!\n\n", type); + return ret; + } + } else if (type == T_UBOOT) { + ret = csi_sec_uboot_image_verify(addr, addr - PUBKEY_HEADER_SIZE); + if (ret) { + printf("Image(%s) is verified fail, Please go to check!\n\n", "uboot"); + return ret; + } + } + + return 0; +} +#else static int strtou32(const char *str, unsigned int base, u32 *result) { char *ep; @@ -110,7 +191,7 @@ static int do_fuse(cmd_tbl_t *cmdtp, int flag, int argc, char *const argv[]) int ret, i; /* Initialize eFuse module */ - ret = csi_efuse_api_int(); + ret = csi_efuse_api_init(); if (ret) { printf("efuse init faild[%d]\n", ret); goto err; @@ -180,88 +261,6 @@ err: return CMD_RET_FAILURE; } -#if CONFIG_IS_ENABLED(LIGHT_SEC_BOOT_WITH_VERIFY_VAL_A) || CONFIG_IS_ENABLED(LIGHT_SEC_BOOT_WITH_VERIFY_VAL_B) || CONFIG_IS_ENABLED(LIGHT_SEC_BOOT_WITH_VERIFY_ANT_REF) || CONFIG_IS_ENABLED(LIGHT_SEC_BOOT_WITH_VERIFY_LPI4A) -/* Secure function for image verificaiton here */ -int get_image_version(unsigned long img_src_addr) -{ - img_header_t *img = (img_header_t *)img_src_addr; - uint8_t magiccode[4] = {0}; - - magiccode[3] = img->magic_num & 0xff; - magiccode[2] = (img->magic_num & 0xff00) >> 8; - magiccode[1] = (img->magic_num & 0xff0000) >> 16; - magiccode[0] = (img->magic_num & 0xff000000) >> 24; - if (memcmp(header_magic, magiccode, 4) == 0) { - return -1; - } - - return img->image_version; -} - -int get_image_size(unsigned long img_src_addr) -{ - img_header_t *img = (img_header_t *)img_src_addr; - uint8_t magiccode[4] = {0}; - - magiccode[3] = img->magic_num & 0xff; - magiccode[2] = (img->magic_num & 0xff00) >> 8; - magiccode[1] = (img->magic_num & 0xff0000) >> 16; - magiccode[0] = (img->magic_num & 0xff000000) >> 24; - if (memcmp(header_magic, magiccode, 4) == 0) { - return -1; - } - - return img->image_size; -} - -void dump_image_header_info(long addr) -{ - img_header_t *phead = (img_header_t *)addr; - - printf("\n---------------------------------------------\n"); - printf("entry point: 0x%x\n", phead->entry_point); - printf("image size: %d Bytes\n", phead->image_size); - printf("head version: 0x%x\n", phead->head_version); - printf("image version: 0x%x\n", phead->image_version); - printf("image checksum: 0x%x\n", phead->image_checksum); - printf("image run addr: 0x%llx\n", phead->image_run_addr); - printf("image offset: 0x%x\n", phead->image_offset); - printf("image digest scheme: %d\n", phead->digest_scheme); - printf("image sign scheme: %d\n", phead->signature_scheme); - printf("image encrypt type: %d\n", phead->encrypt_type); - printf("\n---------------------------------------------\n"); -} - -int verify_customer_image(img_type_t type, long addr) -{ - int ret; - const char *image_name = ""; - - /* Double check image number */ - if (image_have_head(addr) == 0) - return -1; - - /* Dump image header information here */ - dump_image_header_info(addr); - - /* Call customer image verification function */ - if ((type == T_TF) || (type == T_TEE) || (type == T_KRLIMG)) { - ret = csi_sec_custom_image_verify(addr, UBOOT_STAGE_ADDR); - if (ret) { - printf("Image(%d) is verified fail, Please go to check!\n\n", type); - return ret; - } - } else if (type == T_UBOOT) { - ret = csi_sec_uboot_image_verify(addr, addr - PUBKEY_HEADER_SIZE); - if (ret) { - printf("Image(%s) is verified fail, Please go to check!\n\n", "uboot"); - return ret; - } - } - - return 0; -} -#else U_BOOT_CMD( efuse, CONFIG_SYS_MAXARGS, 0, do_fuse, "eFuse sub-system", diff --git a/board/thead/light-c910/secimg_load.c b/board/thead/light-c910/secimg_load.c new file mode 100644 index 00000000..f5f1111e --- /dev/null +++ b/board/thead/light-c910/secimg_load.c @@ -0,0 +1,212 @@ +/* + * (C) Copyright 2018, Linaro Limited + * + * SPDX-License-Identifier: GPL-2.0+ + */ +#include +#include +#include +#include +#include "sec_library.h" + +#define ENV_SECIMG_LOAD "sec_m_load" +#define VAL_SECIMG_LOAD "ext4load mmc 0:7 $tf_addr trust_firmware.bin; ext4load mmc 0:7 $tee_addr tee.bin" + +#define RPMB_BLOCK_SIZE 256 +#define RPMB_ROLLBACK_BLOCK_START 1 + +#ifndef LIGHT_KDF_RPMB_KEYs +static const unsigned char emmc_rpmb_key_sample[32] = {0x33, 0x22, 0x11, 0x00, 0x77, 0x66, 0x55, 0x44, \ + 0xbb, 0xaa, 0x99, 0x88, 0xff, 0xee, 0xdd, 0xcc, \ + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, \ + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff}; +#endif + +extern int sprintf(char *buf, const char *fmt, ...); + +static int get_rpmb_key(uint8_t key[32]) +{ +#ifndef LIGHT_KDF_RPMB_KEY + memcpy(key, emmc_rpmb_key_sample, sizeof(emmc_rpmb_key_sample)); + + return 0; +#else + uint32_t kdf_rpmb_key_length = 0; + int ret = 0; + ret = csi_kdf_gen_hmac_key(key, &kdf_rpmb_key_length); + if (ret != 0) { + return -1; + } + + return 0; +#endif +} + +static int get_image_file_size(unsigned long img_src_addr) +{ + img_header_t *img = (img_header_t *)img_src_addr; + uint8_t magiccode[4] = {0}; + + magiccode[3] = img->magic_num & 0xff; + magiccode[2] = (img->magic_num & 0xff00) >> 8; + magiccode[1] = (img->magic_num & 0xff0000) >> 16; + magiccode[0] = (img->magic_num & 0xff000000) >> 24; + if (memcmp(header_magic, magiccode, 4) == 0) { + return -1; + } + + return img->image_size; +} + +static int verify_and_load_image(unsigned long image_addr_src, unsigned long image_addr_dst) +{ + int ret = 0; + unsigned int image_size = 0; + + if (image_have_head(image_addr_src) == 1) { + ret = csi_sec_init(); + if (ret != 0) { + return -1; + } + + ret = csi_sec_custom_image_verify(image_addr_src, UBOOT_STAGE_ADDR); + if (ret != 0) { + printf("image verify error\r\n"); + return -2; + } + + image_size = get_image_file_size(image_addr_src); + if (image_size < 0) { + printf("image get size error\r\n"); + return -3; + } + + memmove((void *)image_addr_dst, (const void *)(image_addr_src + HEADER_SIZE), image_size); + } else { + printf("in secure mode but image has no header\r\n"); + return -4; + } + + return 0; +} + +int verify_and_load_tee_tf_image(void) +{ + int ret = 0; + + ret = verify_and_load_image(LIGHT_TF_FW_TMP_ADDR, LIGHT_TF_FW_ADDR); + if (ret != 0) { + printf("verify tf image failed\r\n"); + return ret; + } + printf("verify trust firmware image success\r\n"); + + ret = verify_and_load_image(LIGHT_TEE_FW_ADDR, LIGHT_TEE_FW_ADDR); + if (ret != 0) { + printf("verify tee image failed\r\n"); + return ret; + } + printf("verify tee image success\r\n"); + + return 0; +} + +/* In order to use common bootloader for both secure boot and non-secure boot, + we only know the boot type through reading the sec_boot field in efuse. Due to + the efuse is only accessed in lifecycle(DEV/OEM/PRO/RMP), we ensure it must be + non-secure boot in lifecycle(INIT) */ +bool get_system_boot_type(void) +{ + bool btype = false; /* false: non-secure boot | true: secure boot */ + int lc = 0; + sboot_st_t sb_flag = SECURE_BOOT_DIS; + int ret = 0; + + ret = csi_efuse_get_lc(&lc); + /* 0: LC_INIT, 1: LC_DEV, 2: LC_OEM, 3: LC_PRO */ + if ((ret == 0) && (lc != 0)) { + csi_efuse_api_init(); + + /* Check platform secure boot enable ? */ + ret = csi_efuse_get_secure_boot_st(&sb_flag); + if ((ret == 0) && (sb_flag == SECURE_BOOT_EN)) + btype = true; + + csi_efuse_api_uninit(); + } + + return btype; +} + +int sec_read_rollback_index(size_t rollback_index_slot, uint64_t *out_rollback_index) +{ + char runcmd[64] = {0}; + unsigned char blkdata[RPMB_BLOCK_SIZE]; + size_t rpmb_block = (rollback_index_slot * sizeof(uint64_t)) / RPMB_BLOCK_SIZE + RPMB_ROLLBACK_BLOCK_START; + size_t rpmb_offset = (rollback_index_slot * sizeof(uint64_t)) % RPMB_BLOCK_SIZE; + + sprintf(runcmd, "mmc rpmb read 0x%lx %ld 1", (unsigned long)blkdata, rpmb_block); + if(run_command(runcmd, 0)) { + printf("read_rollback_index failed, mmc read error\r\n"); + return -1; + } + + *out_rollback_index = *(uint64_t*)(blkdata + rpmb_offset); + return 0; +} + +int sec_write_rollback_index(size_t rollback_index_slot, uint64_t rollback_index) +{ + char runcmd[64] = {0}; + unsigned char blkdata[RPMB_BLOCK_SIZE]; + size_t rpmb_block = (rollback_index_slot * sizeof(uint64_t)) / RPMB_BLOCK_SIZE + RPMB_ROLLBACK_BLOCK_START; + size_t rpmb_offset = (rollback_index_slot * sizeof(uint64_t)) % RPMB_BLOCK_SIZE; + uint8_t rpmb_key[32]; + + sprintf(runcmd, "mmc rpmb read 0x%lx %ld 1", (unsigned long)blkdata, rpmb_block); + if(run_command(runcmd, 0)) { + printf("read_rollback_index failed, mmc read error\r\n"); + return -1; + } + + *(uint64_t*)(blkdata + rpmb_offset) = rollback_index; + + if (get_rpmb_key(rpmb_key) != 0) { + return -2; + } + + sprintf(runcmd, "mmc rpmb write 0x%lx %ld 1 0x%lx", (unsigned long)blkdata, rpmb_block, (unsigned long)rpmb_key); + if(run_command(runcmd, 0)) { + printf("read_rollback_index failed, mmc write error\r\n"); + return -3; + } + + return 0; +} + +static int do_secimg_load(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) +{ + bool sb_enable = false; + const char *secimgs_load_str = VAL_SECIMG_LOAD; + int ret = -1; + sb_enable = get_system_boot_type(); + if (sb_enable) { + /* By default, the value for ENV-SEC-M-LOAD is always to load opensbi image. + * if secure boot is enable, we force to change the value to load tee image. + * but Never to save it in volatile-RAM + */ + ret = env_set(ENV_SECIMG_LOAD, secimgs_load_str); + if (ret != 0) { + printf("Rewrite ENV (%s) fails\n", ENV_SECIMG_LOAD); + return CMD_RET_FAILURE; + } + } + + return CMD_RET_SUCCESS; +} + +U_BOOT_CMD( + secimg_load, 1, 1, do_secimg_load, + "Runtime-load secure image if secure system is enable", + NULL +); diff --git a/board/thead/light-c910/spl.c b/board/thead/light-c910/spl.c index 8c868046..530c8cbf 100644 --- a/board/thead/light-c910/spl.c +++ b/board/thead/light-c910/spl.c @@ -48,6 +48,7 @@ static struct light_reset_list light_post_reset_lists[] = { {0x00000002, 0xFFEF528000}, /* VO sys_reg: GPU rst */ {0x00000003, 0xFFEF528000}, /* VO sys_reg: GPU rst */ {0x00000007, 0xFFFF529004}, /* VO sys_reg: DPU rst */ + {0x07FFFF18, 0xFFCB000014}, /* Audio sys_reg: DMA rst */ }; static void light_pre_reset_config(void) @@ -399,9 +400,20 @@ void board_init_f(ulong dummy) light_board_init_r(NULL, 0); } +static uint32_t get_custom_boot_seq(void) +{ + /* boot media definition */ + /* BOOT_DEVICE_MMC1 - boot from eMMC or SD card */ + /* BOOT_DEVICE_NAND - boot from nand flash */ + /* BOOT_DEVICE_SPI - boot from spi flash */ + /* TODO: user can decide the boot media according their own configuration */ + return BOOT_DEVICE_MMC1; +} + void board_boot_order(u32 *spl_boot_list) { #define SOC_OM_ADDRBASE 0xffef018010 +#if CONFIG_IS_ENABLED(LIGHT_BOOT_FORCE_SEQ) switch (readl((void *)SOC_OM_ADDRBASE) & 0x7) { case 0: case 1: @@ -428,6 +440,8 @@ void board_boot_order(u32 *spl_boot_list) default: spl_boot_list[0] = BOOT_DEVICE_NONE; } - +#else + spl_boot_list[0] = get_custom_boot_seq(); +#endif cpu_performance_enable(); } diff --git a/board/thead/light-c910/sys_clk.c b/board/thead/light-c910/sys_clk.c index c18fdb2c..8c237790 100644 --- a/board/thead/light-c910/sys_clk.c +++ b/board/thead/light-c910/sys_clk.c @@ -43,9 +43,9 @@ void cpu_clk_config(uint32_t cpu_freq) udelay(11); /* config bus: cpu clk ratio to 1:1 */ - writel((readl(LIGHT_APCLK_ADDRBASE + 0x100) & (~(0x7<<8))) | (0x0<<8), (void *)(LIGHT_APCLK_ADDRBASE + 0x100)); // ratio=0 - writel(readl(LIGHT_APCLK_ADDRBASE + 0x100) & (~(0x1<<11)), (void *)(LIGHT_APCLK_ADDRBASE + 0x100)); // sync=0 - writel(readl(LIGHT_APCLK_ADDRBASE + 0x100) | (0x1<<11), (void *)(LIGHT_APCLK_ADDRBASE + 0x100)); // sync=1 + writel((readl((const volatile void __iomem *)(LIGHT_APCLK_ADDRBASE + 0x100)) & (~(0x7<<8))) | (0x0<<8), (void *)(LIGHT_APCLK_ADDRBASE + 0x100)); // ratio=0 + writel(readl((const volatile void __iomem *)(LIGHT_APCLK_ADDRBASE + 0x100)) & (~(0x1<<11)), (void *)(LIGHT_APCLK_ADDRBASE + 0x100)); // sync=0 + writel(readl((const volatile void __iomem *)(LIGHT_APCLK_ADDRBASE + 0x100)) | (0x1<<11), (void *)(LIGHT_APCLK_ADDRBASE + 0x100)); // sync=1 /* switch c910_cclk to cpu_pll1_foutpostdiv */ tmp = readl((void *)LIGHT_APCLK_ADDRBASE + 0x100); diff --git a/cmd/Kconfig b/cmd/Kconfig index c4d21149..6a9b556f 100644 --- a/cmd/Kconfig +++ b/cmd/Kconfig @@ -263,6 +263,12 @@ config CMD_BOOTI help Boot an AArch64 Linux Kernel image from memory. +config CMD_BOOTANDROID + bool "bootandroid" + default n + help + Boot an android image from mmc. + config BOOTM_LINUX bool "Support booting Linux OS images" depends on CMD_BOOTM || CMD_BOOTZ || CMD_BOOTI diff --git a/cmd/Makefile b/cmd/Makefile index 914a4380..766a2aa7 100644 --- a/cmd/Makefile +++ b/cmd/Makefile @@ -175,6 +175,7 @@ obj-$(CONFIG_CMD_REGULATOR) += regulator.o obj-$(CONFIG_CMD_BLOB) += blob.o # Android Verified Boot 2.0 +obj-$(CONFIG_CMD_BOOTANDROID) += bootandroid.o obj-$(CONFIG_CMD_AVB) += avb.o obj-$(CONFIG_DDR_SCAN) += ddrscan.o diff --git a/cmd/avb.c b/cmd/avb.c index a4de5c40..d4e470d3 100644 --- a/cmd/avb.c +++ b/cmd/avb.c @@ -312,6 +312,10 @@ int do_avb_verify_part(cmd_tbl_t *cmdtp, int flag, printf("Unknown error occurred\n"); } +#ifdef CONFIG_ANDROID_BOOT_IMAGE + if (out_data) + avb_slot_verify_data_free(out_data); +#endif return res; } diff --git a/cmd/bootandroid.c b/cmd/bootandroid.c new file mode 100644 index 00000000..48fa21fb --- /dev/null +++ b/cmd/bootandroid.c @@ -0,0 +1,453 @@ + +/* + * (C) Copyright 2018, Linaro Limited + * + * SPDX-License-Identifier: GPL-2.0+ + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#define ENV_KERNEL_ADDR "kernel_addr" +#define ENV_RAMDISK_ADDR "ramdisk_addr" +#define ENV_DTB_ADDR "dtb_addr" +#define DEFAULT_KERNEL_ADDR 0x00200800 +#define DEFAULT_RAMDISK_ADDR 0x02000000 +#define DEFAULT_DTB_ADDR 0x01f00000 +#define ENV_RAMDISK_SIZE "ramdisk_size" +#define MISC_PARTITION "misc" +#define RECOVERY_PARTITION "recovery" +#define BOOT_PARTITION "boot" +#define VENDOR_BOOT_PARTITION "vendor_boot" + +#define BOOTDEV_DEFAULT 0 +#define BCB_BOOTONCE "bootonce-bootloader" +#define BCB_BOOTRECOVERY "boot-recovery" + + +/* + * Knowing secure boot is enable or disable dependents on + * special data field in efuse and efuse control register. + */ +extern bool get_system_boot_type(void); +/* + * The suffix for partition name is from the value of ENV_BOOTAB + */ +static const char *slot_name_suffix = NULL;; + +/* + * BOOT IMAGE HEADER V3/V4 PAGESIZE + * Source code:system/tools/mkbootimg/unpack_bootimg.py + */ +#define BOOT_IMAGE_HEADER_V3_PAGESIZE 4096 + +static struct AvbOps *avb_ops = NULL; +static struct bootloader_message* s_bcb = NULL; + +/* + *format 4 chars/bytes to a int number + */ +static int byteToInt(uint8_t* data,int offset) +{ + return data[offset+0] + (data[offset+1] << 8) + (data[offset+2] << 16) + (data[offset+3] << 24); +} + +static int get_number_of_pages(int image_size, int page_size) +{ + return (image_size + page_size - 1) / page_size; +} + +/** + * header_version >=3,get dtb data from vendor_boot.img ,else boot.img. + * + * header_version = 4,get bootconfig data from vendor_boot.img , + * and append bootconfig to the end of ramdisk(initrd) + * doc:https://www.kernel.org/doc/html/next/translations/zh_CN/admin-guide/bootconfig.html#initrd + */ +static int prepare_data_from_vendor_boot(struct andr_img_hdr *hdr, int dtb_start, uint8_t** buf_bootconfig, int* vendor_bootconfig_size) +{ + int ret; + disk_partition_t part_info; + uint8_t* vendor_boot_data = NULL; + struct blk_desc *dev_desc = blk_get_dev("mmc", CONFIG_FASTBOOT_FLASH_MMC_DEV); + char vb_part_name[32] = {0}; + + if (hdr == NULL) { + printf("invalid hdr\n"); + return -1; + } + + /* if the vendor boot partition name is beyond 32B, arise error */ + if ((32 - strlen(VENDOR_BOOT_PARTITION)) < 2) + return -1; + memcpy(vb_part_name, VENDOR_BOOT_PARTITION, strlen(VENDOR_BOOT_PARTITION)); + strcat(vb_part_name, slot_name_suffix); + + printf("blk_get_dev %s\n", vb_part_name); + if (!dev_desc || dev_desc->type == DEV_TYPE_UNKNOWN) { + printf("MMC err: invalid mmc device\n"); + return -1; + } + /* Get boot partition info */ + ret = part_get_info_by_name(dev_desc, vb_part_name, &part_info); + if (ret < 0) { + printf("MMC err: cannot find %s partition\n", vb_part_name); + return -1; + } + + vendor_boot_data = avb_malloc(part_info.size * part_info.blksz); + if (vendor_boot_data == NULL) { + printf("vendor boot data malloc fail \n"); + return -1; + } + ret = blk_dread(dev_desc, part_info.start, part_info.size, vendor_boot_data); + // vendor_boot.img + //* +------------------------+ + //* | vendor boot header | o pages + //* +------------------------+ + //* | vendor ramdisk section | p pages + //* +------------------------+ + //* | dtb | q pages + //* +------------------------+ + //* | vendor ramdisk table | r pages + //* +------------------------+ + //* | bootconfig | s pages + //* +------------------------+ + //* o = (2124 + page_size - 1) / page_size + //* p = (vendor_ramdisk_size + page_size - 1) / page_size + //* q = (dtb_size + page_size - 1) / page_size + //* r = (vendor_ramdisk_table_size + page_size - 1) / page_size + //* s = (vendor_bootconfig_size + page_size - 1) / page_size + + // see system/tools/mkbootimg/unpack_bootimg.py + // info.boot_magic = unpack('8s', args.boot_img.read(8))[0].decode() + // info.header_version = unpack('I', args.boot_img.read(4))[0] + // info.page_size = unpack('I', args.boot_img.read(4))[0] + // info.kernel_load_address = unpack('I', args.boot_img.read(4))[0] + // info.ramdisk_load_address = unpack('I', args.boot_img.read(4))[0] + // info.vendor_ramdisk_size = unpack('I', args.boot_img.read(4))[0] + // info.cmdline = cstr(unpack('2048s', args.boot_img.read(2048))[0].decode()) + // info.tags_load_address = unpack('I', args.boot_img.read(4))[0] + // info.product_name = cstr(unpack('16s', args.boot_img.read(16))[0].decode()) + // info.header_size = unpack('I', args.boot_img.read(4))[0] + // info.dtb_size = unpack('I', args.boot_img.read(4))[0] + // info.dtb_load_address = unpack('Q', args.boot_img.read(8))[0] + // info.vendor_ramdisk_table_size = unpack('I', args.boot_img.read(4))[0] + // vendor_ramdisk_table_entry_num = unpack('I', args.boot_img.read(4))[0] + // vendor_ramdisk_table_entry_size = unpack('I', args.boot_img.read(4))[0] + // info.vendor_bootconfig_size = unpack('I', args.boot_img.read(4))[0] + // num_vendor_ramdisk_table_pages = get_number_of_pages( + // info.vendor_ramdisk_table_size, page_size) + // vendor_ramdisk_table_offset = page_size * ( + // num_boot_header_pages + num_boot_ramdisk_pages + num_boot_dtb_pages) + // bootconfig_offset = page_size * (num_boot_header_pages + // + num_boot_ramdisk_pages + num_boot_dtb_pages + // + num_vendor_ramdisk_table_pages) + + int vendor_boot_pagesize = byteToInt(vendor_boot_data,12);//offset 12 + int vendor_ramdisk_size = byteToInt(vendor_boot_data,24);//offset 24 + int dtb_size = byteToInt(vendor_boot_data,2100);//offset 2100 + int o = (2124 + vendor_boot_pagesize - 1) / vendor_boot_pagesize; + int p = (vendor_ramdisk_size + vendor_boot_pagesize - 1) / vendor_boot_pagesize; + int dtb_offset = vendor_boot_pagesize * (o + p); + + hdr->dtb_size= dtb_size; + memcpy((void *)(uint64_t)dtb_start, vendor_boot_data + dtb_offset, hdr->dtb_size); + + int q=(hdr->dtb_size + vendor_boot_pagesize - 1) / vendor_boot_pagesize; + int vendor_ramdisk_table_size=byteToInt(vendor_boot_data,2112);//offset 2112 + + int r=(vendor_ramdisk_table_size + vendor_boot_pagesize - 1) / vendor_boot_pagesize; + *vendor_bootconfig_size=byteToInt(vendor_boot_data,2124);//offset 2124 + + *buf_bootconfig = avb_malloc(*vendor_bootconfig_size); + if (*buf_bootconfig == NULL) { + printf("vendor bootconfig malloc fail\n"); + if (vendor_boot_data != NULL) + avb_free(vendor_boot_data); + return -1; + } + int bootconfig_offset=vendor_boot_pagesize * (o + p + q + r); + memcpy(*buf_bootconfig, vendor_boot_data + bootconfig_offset, *vendor_bootconfig_size); + + if (vendor_boot_data != NULL) + avb_free(vendor_boot_data); + + return 0; +} + +static void prepare_loaded_parttion_data(const uint8_t* data) +{ + struct andr_img_hdr *hdr = (struct andr_img_hdr *)map_sysmem((phys_addr_t)data, 0); + + if (IMAGE_FORMAT_ANDROID == genimg_get_format(hdr)) { + int dtb_start = env_get_hex(ENV_DTB_ADDR, DEFAULT_DTB_ADDR); + uint8_t* buf_bootconfig = NULL; + int size_bootconfig=0; + + printf("Boot image header_version:%d\n", hdr->header_version); + if (hdr->header_version >= 3) { + // see system/tools/mkbootimg/unpack_bootimg.py + hdr->kernel_size = byteToInt((uint8_t *)data, 8); + hdr->ramdisk_size = byteToInt((uint8_t *)data, 12); + hdr->page_size = BOOT_IMAGE_HEADER_V3_PAGESIZE; + prepare_data_from_vendor_boot(hdr,dtb_start,&buf_bootconfig,&size_bootconfig); + } + + int kernel_start = env_get_hex(ENV_KERNEL_ADDR, DEFAULT_KERNEL_ADDR); + int ramdisk_start = env_get_hex(ENV_RAMDISK_ADDR, DEFAULT_RAMDISK_ADDR); + // see system/tools/mkbootimg/unpack_bootimg.py + int page_size = hdr->page_size; + int num_header_pages = 1; + int num_kernel_pages = get_number_of_pages(hdr->kernel_size, page_size); + int num_ramdisk_pages = get_number_of_pages(hdr->ramdisk_size, page_size); + int kernel_offset = page_size * num_header_pages; + int ramdisk_offset = page_size * (num_header_pages + num_kernel_pages); + int dtb_offset = page_size * (num_header_pages + num_kernel_pages + num_ramdisk_pages); + + printf("Boot image kernel_start:%x, kernel_offset:%x, kernel_size:%d\n", kernel_start, kernel_offset, hdr->kernel_size); + printf("Boot image ramdisk_start:%x, ramdisk_offset:%x, ramdisk_size:%d\n", ramdisk_start, ramdisk_offset, hdr->ramdisk_size); + printf("Boot image page_size:%d\n", hdr->page_size); + printf("dtb_offset:%x, dtb_size:%d\n", dtb_offset, hdr->dtb_size); + + if (kernel_start + hdr->kernel_size > ramdisk_start || kernel_start + hdr->kernel_size > dtb_start) { + printf("boot.img kernel space and ramdis space are overlaped !!!\n"); + } else { + memcpy((void *)(uint64_t)kernel_start, data + kernel_offset, hdr->kernel_size); + memcpy((void *)(uint64_t)ramdisk_start, data + ramdisk_offset, hdr->ramdisk_size); + if( hdr->header_version < 3) { + //set ramdisk size for bootm + env_set_hex(ENV_RAMDISK_SIZE, hdr->ramdisk_size); + memcpy((void *)(uint64_t)dtb_start, data + dtb_offset, hdr->dtb_size); + } else { + //get bootconfig form vendor_boot.img and append bootconfig to ramdisk + char* bootconfig_params=(char*)buf_bootconfig; + int ret = addBootConfigParameters(bootconfig_params, size_bootconfig, + ramdisk_start + hdr->ramdisk_size , 0); + if (ret == -1) { + printf("Bootconfig Err: add BootConfig Parameters error!!!\n"); + } else { + printf("ramdisk size is updated to new value is:%d\n",hdr->ramdisk_size + ret); + //set ramdisk size for bootm + env_set_hex(ENV_RAMDISK_SIZE, hdr->ramdisk_size + ret); + } + } + } + if (buf_bootconfig != NULL) { + avb_free(buf_bootconfig); + } + } + unmap_sysmem(hdr); +} + +static int prepare_boot_data(const AvbSlotVerifyData *out_data) +{ + int res = CMD_RET_FAILURE; + int i = 0; + int num_loaded_partition = out_data->num_loaded_partitions; + + printf("@@@@ prepare loaded partition (%d) data start\n", num_loaded_partition); + for (i = 0; i < num_loaded_partition; i++) { + const AvbPartitionData *loaded_partition = &out_data->loaded_partitions[i]; + + if (loaded_partition->partition_name != NULL) { + printf("partition_name=%s, data_size=%ld\n", \ + loaded_partition->partition_name, loaded_partition->data_size); + prepare_loaded_parttion_data(loaded_partition->data); + } + } + return res; +} + +static void prepare_partition_data(const char *name) +{ + int ret = 0; + disk_partition_t part_info; + struct blk_desc *dev_desc = blk_get_dev("mmc", CONFIG_FASTBOOT_FLASH_MMC_DEV); + uint8_t *data = NULL; + + printf("prepare_partition_data %s\n", name); + if (!dev_desc || dev_desc->type == DEV_TYPE_UNKNOWN) { + printf("MMC err: invalid mmc device\n"); + return; + } + /* Get boot partition info */ + ret = part_get_info_by_name(dev_desc, name, &part_info); + if (ret < 0) { + printf("MMC err: cannot find %s partition\n", name); + return; + } + + data = avb_malloc(part_info.size * part_info.blksz); + if (data == NULL) { + printf("avb malloc(%ldKB) fails\n", part_info.size * part_info.blksz / 1024); + return; + } + + ret = blk_dread(dev_desc, part_info.start, part_info.size, data); + prepare_loaded_parttion_data(data); + + printf("prepare_partition_data %s, read=%d, start:%lx, size:%ld, blksize:%lx\n", \ + name, ret, part_info.start, part_info.size, part_info.blksz); + + avb_free(data); +} + +static void clear_bcb(void) +{ + int ret; + disk_partition_t part_info; + struct blk_desc *dev_desc = blk_get_dev("mmc", CONFIG_FASTBOOT_FLASH_MMC_DEV); + + //bcb clear and store + memset(s_bcb, 0, sizeof(struct bootloader_message)); + + if (!dev_desc || dev_desc->type == DEV_TYPE_UNKNOWN) { + printf("BootAndriod bcb err: invalid mmc device\n"); + return; + } + /* Get boot partition info */ + ret = part_get_info_by_name(dev_desc, MISC_PARTITION, &part_info); + if (ret < 0) { + printf("BootAndriod bcb err: cannot find misc partition\n"); + return; + } + + ret = blk_dwrite(dev_desc, part_info.start, part_info.size, s_bcb); + printf("BootAndriod bcb info :clear_bcb write=%d, %ld,%ld,%ld\n", ret, part_info.start, part_info.size, part_info.blksz); +} + +static int do_andriod_bcb_business(struct AvbOps *avb_ops, struct bootloader_message* s_bcb) +{ + AvbIOResult ret = AVB_IO_RESULT_OK; + size_t bytes_read = 0; + int res = CMD_RET_FAILURE; + + s_bcb = avb_malloc(sizeof(struct bootloader_message)); + if (s_bcb == NULL) { + printf("BootAndriod Err: Failed to initialize bcb\n"); + goto _bcb_err; + } + + ret = avb_ops->read_from_partition(avb_ops, + MISC_PARTITION, + 0, + sizeof(struct bootloader_message), + s_bcb, + &bytes_read); + if (ret != AVB_IO_RESULT_OK) { + printf("BootAndriod Err: Bcb read failed\n"); + goto _bcb_err; + } + + /* Enter into fastboot mode if bcb string is bootonce or bootrecovery */ + if (0 == strncmp(s_bcb->command, BCB_BOOTONCE, strlen(BCB_BOOTONCE))|| \ + 0 == strncmp(s_bcb->command, BCB_BOOTRECOVERY, strlen(BCB_BOOTRECOVERY))) { + printf("BootAndriod Info: Bcb read %ld bytes, %s\n", bytes_read, s_bcb->command); + printf("BootAndriod Info: Enter fastboot mode\n"); + clear_bcb(); + run_command("fastboot usb 0", 0); + } + + res = CMD_RET_SUCCESS; + +_bcb_err: + if (s_bcb != NULL) + avb_free(s_bcb); + + return res; +} + +static const char *get_boot_partition_name_suffix(void) +{ +#if defined (CONFIG_ANDROID_AB) + char *slot_suffix = "_a"; +#else + char *slot_suffix = ""; +#endif + + char *tmp = NULL; + tmp = env_get("boot_ab"); + if (tmp != NULL) + slot_suffix = tmp; + + return slot_suffix; +} + +static int do_bootandroid(struct cmd_tbl_s *cmdtp, int flag, int argc, + char * const argv[]) { + + const char * const requested_partitions[] = {"vbmeta", "boot", "vbmeta_system", NULL}; + AvbSlotVerifyResult slot_result = AVB_SLOT_VERIFY_RESULT_OK; + AvbSlotVerifyData *slot_data = NULL; + AvbIOResult ret = AVB_IO_RESULT_OK; + AvbSlotVerifyFlags slotflags = AVB_SLOT_VERIFY_FLAGS_NONE; + AvbHashtreeErrorMode htflags = AVB_HASHTREE_ERROR_MODE_RESTART_AND_INVALIDATE; + int res = CMD_RET_FAILURE; + + /* Retieve boot partition 's name suffix */ + slot_name_suffix = get_boot_partition_name_suffix(); + + /* Start with slot verification in secure boot */ + if (get_system_boot_type()) { + + avb_ops = avb_ops_alloc(BOOTDEV_DEFAULT); + if (avb_ops == NULL) { + goto _ba_err; + } + + res = do_andriod_bcb_business(avb_ops, s_bcb); + if (res != CMD_RET_SUCCESS) { + goto _ba_err; + } + + /* Verify boot partition requested in vbmeta.img */ + slot_result = avb_slot_verify(avb_ops, + requested_partitions, + slot_name_suffix, + slotflags, + htflags, + &slot_data); + + if (slot_result == AVB_SLOT_VERIFY_RESULT_OK) { + printf("BootAndriod Info: Request Partition are verified successfully\n"); + printf("BootAndriod cmdline: slot_data.cmdline:%s\n", slot_data->cmdline); + prepare_boot_data(slot_data); + if (ret == 0) { + if (slot_data != NULL) + avb_slot_verify_data_free(slot_data); + } + } else { + /* In case of avb slot verification failure, Force system reset */ + run_command("reset", 0); + } +_ba_err: + if (avb_ops) + avb_ops_free(avb_ops); + + } else { + /* Go to load BOOT partition directly in non-secure boot */ + char bp_name[32] = {0}; + + strcat(bp_name, BOOT_PARTITION); + strcat(bp_name, slot_name_suffix); + prepare_partition_data(bp_name); + } + + return res; +} + +U_BOOT_CMD( + bootandroid, 2, 1, do_bootandroid, + "bootandroid - boot android bootimg from device\n", + "mmc0 | mmc1 | mmc2 | mmcX]\n " + "- boot application image stored in storage device like mmc\n" +); + diff --git a/common/avb_verify.c b/common/avb_verify.c index a2b73962..890a3d6f 100644 --- a/common/avb_verify.c +++ b/common/avb_verify.c @@ -14,6 +14,48 @@ #include #include +#ifdef CONFIG_AVB_ROLLBACK_ENABLE +extern int sec_write_rollback_index(size_t rollback_index_slot, uint64_t rollback_index); +extern int sec_read_rollback_index(size_t rollback_index_slot, uint64_t *out_rollback_index); +#endif + +#if defined (CONFIG_AVB_USE_OEM_KEY) +static const unsigned char avb_root_oem_pub[520] = { + 0x00,0x00,0x08,0x00,0x11,0x70,0xEA,0xC9,0xC2,0xAD,0x66,0x2A,0x57,0x2A,0x89,0x68, + 0x8B,0x40,0x33,0xF2,0xEA,0x22,0xD7,0x3E,0x31,0x5F,0x9D,0xB8,0xD1,0x16,0x5C,0x22, + 0xC3,0xFE,0xE6,0x35,0x3F,0x96,0x6D,0xD8,0x1A,0x11,0xE9,0x53,0x90,0x88,0xA9,0xCE, + 0xA7,0x33,0xB2,0x16,0x60,0x18,0xBE,0x23,0xCC,0x5C,0xAB,0x29,0x0E,0x7B,0x35,0x16, + 0xB0,0x59,0x3A,0x2F,0x62,0xF1,0x9B,0x39,0x0A,0x21,0x00,0xFE,0x75,0xEB,0x00,0xDF, + 0x17,0xAF,0x44,0x11,0x42,0x4E,0x4C,0x7C,0xA6,0xDC,0xC5,0xAD,0xB3,0x7C,0xC3,0xB1, + 0x52,0xAD,0x0C,0xEF,0x73,0x69,0x7E,0xFC,0xF9,0x12,0xA7,0x5C,0x60,0x47,0xEF,0x8F, + 0xC7,0x9D,0xD9,0x62,0xF5,0x0E,0x62,0xBB,0x3E,0x80,0x23,0xFA,0x19,0x4C,0x0A,0xD6, + 0xE0,0xA7,0x0E,0x65,0xEA,0xD5,0xB8,0xA9,0xF2,0xA3,0xDA,0x18,0xBE,0x5D,0x4B,0x37, + 0x91,0xBA,0xDB,0x0D,0x50,0x7E,0xEE,0x52,0xDF,0x90,0xE6,0xFC,0x8F,0xB8,0x24,0x2A, + 0x2B,0xBE,0xA6,0xC9,0x5B,0x89,0x3E,0xE8,0x24,0xBD,0x6A,0x03,0x31,0x6C,0xFC,0x4A, + 0xBA,0x6B,0xEE,0x08,0xAE,0x33,0x6E,0xC0,0x64,0x87,0xC1,0x35,0x65,0x42,0x34,0xE5, + 0xF8,0x3B,0x82,0x36,0xE9,0xFA,0x23,0xD7,0x12,0xC5,0x7B,0x27,0x16,0xB0,0xC7,0x40, + 0x5A,0xA4,0x8A,0x56,0xA4,0x54,0x0F,0xD9,0xA7,0x25,0x25,0xE3,0x7F,0x72,0x6E,0x4B, + 0x63,0x1B,0x05,0xFE,0x4E,0x1F,0x1D,0x05,0xDD,0x91,0xA7,0xBF,0xA4,0x90,0xDA,0x7D, + 0x0F,0xB6,0xFC,0x5D,0x8E,0xFB,0xE2,0xF7,0x5F,0x76,0xFA,0xD5,0x12,0xEC,0x87,0xD6, + 0x07,0xA0,0xAC,0xB6,0xE6,0xBA,0xB0,0x87,0xBA,0x51,0xD7,0x6C,0x19,0xC0,0x2C,0xA5, + 0x2C,0x08,0x52,0x2A,0x63,0x18,0x10,0x94,0xEA,0x5C,0x13,0xBF,0x42,0x8E,0x12,0xB6, + 0x7D,0x34,0xD9,0x1C,0x42,0xBC,0xCE,0x44,0x8A,0x13,0x5B,0x93,0x6F,0x34,0x41,0xA1, + 0xA3,0xD3,0x2E,0xF4,0xD3,0x28,0xAD,0x8F,0x8B,0x89,0x9D,0x42,0x43,0xD6,0xBF,0xDE, + 0x9F,0xBD,0x32,0x06,0xE3,0x67,0xD3,0x14,0x2F,0x4C,0xE7,0x6B,0x9A,0xD9,0x04,0xFA, + 0x4B,0x46,0x88,0xE7,0x04,0xAA,0x56,0xFF,0xBF,0x89,0x1D,0xFD,0x32,0xDF,0x47,0xC0, + 0x34,0x0D,0x25,0x8C,0xF6,0xE1,0x5E,0xA9,0x3C,0x30,0x3A,0x53,0x0C,0xDB,0xAD,0x8E, + 0x01,0xCB,0x46,0xE0,0xF5,0x97,0x2D,0xB8,0xF8,0x29,0xC3,0x19,0x4C,0x05,0x8B,0x74, + 0xE0,0xA6,0x3B,0x3C,0x96,0x4F,0x91,0x74,0x62,0xAA,0x50,0x0F,0x11,0x30,0x59,0xAE, + 0x7A,0x80,0xD3,0xAC,0xB3,0xDB,0x24,0x3A,0x79,0xD4,0xDB,0x79,0x10,0x63,0x27,0xD0, + 0x6B,0xF9,0xA3,0xF4,0x27,0x24,0x89,0x0C,0xAC,0x31,0x15,0x08,0x10,0x59,0x08,0x2D, + 0x00,0x3D,0xD8,0xD6,0x3B,0x91,0xC8,0x55,0xCF,0x28,0x3A,0xFB,0xD7,0xF7,0xF7,0x9D, + 0x41,0xBD,0x3E,0xD1,0x77,0xA3,0xF6,0xFA,0x33,0x05,0x5A,0x36,0xCE,0xB9,0x02,0x12, + 0x10,0xEB,0xCA,0xA7,0x3C,0xC8,0x5D,0xCD,0x33,0xD9,0xFA,0x16,0xD4,0x52,0x12,0xB6, + 0x35,0xD5,0x84,0x53,0xC4,0x21,0xDC,0x72,0x2F,0xF9,0x1E,0x59,0x0A,0xCD,0x7D,0x89, + 0xD4,0xCF,0x8E,0x2E,0x09,0x36,0xF5,0x12,0x35,0x43,0x64,0x6C,0xD1,0x70,0xBF,0x67, + 0x3A,0x54,0x72,0x84,0xF3,0xF1,0x4A,0x6A +}; +#else static const unsigned char avb_root_pub[1032] = { 0x0, 0x0, 0x10, 0x0, 0x55, 0xd9, 0x4, 0xad, 0xd8, 0x4, 0xaf, 0xe3, 0xd3, 0x84, 0x6c, 0x7e, 0xd, 0x89, 0x3d, 0xc2, @@ -120,7 +162,7 @@ static const unsigned char avb_root_pub[1032] = { 0xe1, 0x74, 0xa1, 0xa3, 0x99, 0xa0, 0x85, 0x9e, 0xf1, 0xac, 0xd8, 0x7e, }; - +#endif /** * ============================================================================ * Boot states support (GREEN, YELLOW, ORANGE, RED) and dm_verity @@ -590,6 +632,19 @@ static AvbIOResult validate_vbmeta_public_key(AvbOps *ops, public_key_metadata_length, bool *out_key_is_trusted) { +#if defined (CONFIG_AVB_USE_OEM_KEY) + if (!public_key_length || !public_key_data || !out_key_is_trusted) + return AVB_IO_RESULT_ERROR_IO; + + *out_key_is_trusted = false; + if (public_key_length != sizeof(avb_root_oem_pub)) + return AVB_IO_RESULT_ERROR_IO; + + if (memcmp(avb_root_oem_pub, public_key_data, public_key_length) == 0) + *out_key_is_trusted = true; + + return AVB_IO_RESULT_OK; +#else if (!public_key_length || !public_key_data || !out_key_is_trusted) return AVB_IO_RESULT_ERROR_IO; @@ -601,6 +656,7 @@ static AvbIOResult validate_vbmeta_public_key(AvbOps *ops, *out_key_is_trusted = true; return AVB_IO_RESULT_OK; +#endif } #ifdef CONFIG_OPTEE_TA_AVB @@ -681,8 +737,15 @@ static AvbIOResult read_rollback_index(AvbOps *ops, size_t rollback_index_slot, u64 *out_rollback_index) { +#ifdef CONFIG_AVB_ROLLBACK_ENABLE + if (sec_read_rollback_index(rollback_index_slot, out_rollback_index) != 0) { + return AVB_IO_RESULT_ERROR_IO; + } + + return AVB_IO_RESULT_OK; +#else #ifndef CONFIG_OPTEE_TA_AVB - /* For now we always return 0 as the stored rollback index. */ + /* For now we always return 0 as the stored rollback index. */ printf("%s not supported yet\n", __func__); if (out_rollback_index) @@ -708,8 +771,10 @@ static AvbIOResult read_rollback_index(AvbOps *ops, *out_rollback_index = (u64)param[1].u.value.a << 32 | (u32)param[1].u.value.b; + return AVB_IO_RESULT_OK; #endif +#endif } /** @@ -727,6 +792,13 @@ static AvbIOResult write_rollback_index(AvbOps *ops, size_t rollback_index_slot, u64 rollback_index) { +#ifdef CONFIG_AVB_ROLLBACK_ENABLE + if (sec_write_rollback_index(rollback_index_slot, rollback_index) != 0) { + return AVB_IO_RESULT_ERROR_IO; + } + + return AVB_IO_RESULT_OK; +#else #ifndef CONFIG_OPTEE_TA_AVB /* For now this is a no-op. */ printf("%s not supported yet\n", __func__); @@ -748,6 +820,7 @@ static AvbIOResult write_rollback_index(AvbOps *ops, return invoke_func(ops->user_data, TA_AVB_CMD_WRITE_ROLLBACK_INDEX, ARRAY_SIZE(param), param); #endif +#endif } /** diff --git a/common/splash.c b/common/splash.c index e7d84772..62c6d05f 100644 --- a/common/splash.c +++ b/common/splash.c @@ -71,7 +71,7 @@ static int splash_video_logo_load(void) return -EFAULT; } - memcpy((void *)bmp_load_addr, bmp_logo_bitmap, + memcpy((void *)(u64)bmp_load_addr, bmp_logo_bitmap, ARRAY_SIZE(bmp_logo_bitmap)); return 0; diff --git a/configs/light_a_val_android_defconfig b/configs/light_a_val_android_defconfig new file mode 100644 index 00000000..81489ac8 --- /dev/null +++ b/configs/light_a_val_android_defconfig @@ -0,0 +1,115 @@ +CONFIG_RISCV=y +CONFIG_SPL_MMC_SUPPORT=y +CONFIG_ENV_SIZE=0x20000 +CONFIG_ENV_OFFSET=0xe0000 +CONFIG_NR_DRAM_BANKS=8 +CONFIG_SPL=y +CONFIG_SMP=y +CONFIG_TARGET_LIGHT_C910=y +CONFIG_ARCH_RV64I=y +CONFIG_DISTRO_DEFAULTS=y +CONFIG_BUILD_TARGET="u-boot-with-spl.bin" +CONFIG_DISPLAY_CPUINFO=y +CONFIG_DISPLAY_BOARDINFO=y +# CONFIG_SPL_LEGACY_IMAGE_SUPPORT is not set +CONFIG_SPL_RAM_SUPPORT=y +CONFIG_SPL_RAM_DEVICE=y +CONFIG_SYS_PROMPT="C910 Light# " +CONFIG_DDR_LP4X_3733_SINGLERANK=y +# CONFIG_DDR_LP4_3733_DUALRANK is not set +CONFIG_DDR_BOARD_CONFIG=y +CONFIG_CMD_BOOT_SLAVE=y +CONFIG_CMD_ERASEENV=y +CONFIG_CMD_GPT=y +CONFIG_CMD_MTD=y +CONFIG_CMD_EXT4_WRITE=y +CONFIG_CMD_SPI=y +CONFIG_CMD_I2C=y +CONFIG_CMD_MEMTEST=y +CONFIG_DDR_SCAN=y +CONFIG_DDR_PRBS_TEST=n +# CONFIG_DOS_PARTITION is not set +# CONFIG_ISO_PARTITION is not set +CONFIG_PARTITION_TYPE_GUID=y +CONFIG_OF_EMBED=y +CONFIG_DEFAULT_DEVICE_TREE="light-a-val" +CONFIG_ENV_IS_IN_MMC=y +CONFIG_SYS_RELOC_GD_ENV_ADDR=y +CONFIG_SPL_CLK=y +CONFIG_USB_FUNCTION_FASTBOOT=y +CONFIG_UDP_FUNCTION_FASTBOOT=y +CONFIG_FASTBOOT_BUF_ADDR=0x10000000 +CONFIG_FASTBOOT_FLASH=y +CONFIG_FASTBOOT_FLASH_MMC_DEV=0 +CONFIG_FASTBOOT_CMD_OEM_FORMAT=y +CONFIG_DM_GPIO=y +CONFIG_DM_I2C=y +CONFIG_SYS_I2C_DW=y +CONFIG_DWAPB_GPIO=y +# CONFIG_MMC_SPI is not set +CONFIG_MMC_VERBOSE=y +CONFIG_SUPPORT_EMMC_BOOT=y +CONFIG_MMC_IO_VOLTAGE=y +CONFIG_MMC_UHS_SUPPORT=y +CONFIG_MMC_HS400_SUPPORT=y +CONFIG_MMC_DW=y +CONFIG_MMC_DW_SNPS=y +CONFIG_MMC_SDHCI=y +CONFIG_MMC_SDHCI_SNPS=y +CONFIG_MMC_SDHCI_SDMA=y +CONFIG_CMD_MMC=y +CONFIG_CMD_MMC_RPMB=y +CONFIG_SUPPORT_EMMC_RPMB=y +CONFIG_DM_MTD=y +CONFIG_MTD_SPI_NAND=y +CONFIG_SPI_FLASH_WINBOND=y +CONFIG_ETH_DESIGNWARE=y +CONFIG_PHY_REALTEK=y +CONFIG_RTL8211E_PINE64_GIGABIT_FIX=y +CONFIG_RTL8211X_PHY_FORCE_MASTER=y +CONFIG_RTL8211F_PHY_FORCE_EEE_RXC_ON=y +CONFIG_SYS_NS16550=y +CONFIG_SPI=y +CONFIG_DESIGNWARE_SPI=y +CONFIG_DESIGNWARE_QSPI=y +CONFIG_USB=y +CONFIG_USB_DWC3=y +CONFIG_USB_GADGET=y +CONFIG_USB_GADGET_MANUFACTURER="U-Boot-THEAD" +CONFIG_USB_GADGET_VENDOR_NUM=0x1234 +CONFIG_USB_GADGET_PRODUCT_NUM=0x8888 +# CONFIG_SPL_USE_TINY_PRINTF is not set +# CONFIG_EFI_LOADER is not set +# CONFIG_LIGHT_SEC_BOOT_WITH_VERIFY_VAL_A=y +# CONFIG_LIGHT_SEC_UPGRADE=y +CONFIG_BOARD_LATE_INIT=y +CONFIG_ENV_VARS_UBOOT_RUNTIME_CONFIG=y +CONFIG_DM_VIDEO=y +CONFIG_PHY=y +CONFIG_REGMAP=y +CONFIG_SYSCON=y +CONFIG_CMD_BMP=y +CONFIG_VIDEO_BRIDGE=y +CONFIG_DM_PCA953X=y +CONFIG_VIDEO_VS_DPU=y +CONFIG_VIDEO_LCD_ILITEK_ILI9881C=y +CONFIG_VIDEO_DW_DSI_LIGHT=y +CONFIG_VIDEO_DW_DPHY=y +CONFIG_VIDEO_DW_DSI_HOST=y +CONFIG_SYS_WHITE_ON_BLACK=y +CONFIG_PMIC_VOL_INIT=y +CONFIG_DDR_REGU_0V6=600000 +CONFIG_DDR_REGU_0V8=800000 +CONFIG_DDR_REGU_1V1=1100000 +CONFIG_LIGHT_ANDROID_BOOT_IMAGE_VAL_A=y +# CONFIG_AVB_USE_OEM_KEY is not set +# CONFIG_AVB_ROLLBACK_ENABLE is not set +# CONFIG_AVB_HW_ENGINE_ENABLE is not set +CONFIG_ANDROID_BOOT_IMAGE=y +CONFIG_LIBAVB=y +CONFIG_AVB_VERIFY=y +CONFIG_CMD_AVB=y +CONFIG_CMD_BOOTANDROID=y +CONFIG_ANDROID_AB=y +CONFIG_CMD_AB_SELECT=y +CONFIG_XBC=y diff --git a/configs/light_a_val_sec_defconfig b/configs/light_a_val_sec_defconfig index ca0bf66c..d3af2ada 100644 --- a/configs/light_a_val_sec_defconfig +++ b/configs/light_a_val_sec_defconfig @@ -82,6 +82,7 @@ CONFIG_USB_GADGET_PRODUCT_NUM=0x8888 # CONFIG_EFI_LOADER is not set CONFIG_LIGHT_SEC_BOOT_WITH_VERIFY_VAL_A=y CONFIG_LIGHT_SEC_UPGRADE=y +# CONFIG_LIGHT_BOOT_FORCE_SEQ is not set CONFIG_BOARD_LATE_INIT=y CONFIG_ENV_VARS_UBOOT_RUNTIME_CONFIG=y CONFIG_DM_VIDEO=y diff --git a/configs/light_ant_ref_defconfig b/configs/light_ant_ref_defconfig index b3d4e9d2..236e7c29 100644 --- a/configs/light_ant_ref_defconfig +++ b/configs/light_ant_ref_defconfig @@ -82,7 +82,8 @@ CONFIG_USB_GADGET_VENDOR_NUM=0x1234 CONFIG_USB_GADGET_PRODUCT_NUM=0x8888 # CONFIG_SPL_USE_TINY_PRINTF is not set # CONFIG_EFI_LOADER is not set -# CONFIG_LIGHT_SEC_BOOT is not set +CONFIG_LIGHT_SEC_BOOT_WITH_VERIFY_ANT_REF=y +CONFIG_LIGHT_SEC_UPGRADE=y CONFIG_BOARD_LATE_INIT=y CONFIG_ENV_VARS_UBOOT_RUNTIME_CONFIG=y CONFIG_DM_VIDEO=y diff --git a/configs/light_b_product_android_defconfig b/configs/light_b_product_android_defconfig new file mode 100644 index 00000000..80a20f3f --- /dev/null +++ b/configs/light_b_product_android_defconfig @@ -0,0 +1,117 @@ +CONFIG_RISCV=y +CONFIG_SPL_MMC_SUPPORT=y +CONFIG_ENV_SIZE=0x20000 +CONFIG_ENV_OFFSET=0xe0000 +CONFIG_NR_DRAM_BANKS=8 +CONFIG_SPL=y +CONFIG_SMP=y +CONFIG_TARGET_LIGHT_C910=y +CONFIG_TARGET_LIGHT_FM_C910_VAL_B=y +CONFIG_ARCH_RV64I=y +CONFIG_DISTRO_DEFAULTS=y +CONFIG_BUILD_TARGET="u-boot-with-spl.bin" +CONFIG_DISPLAY_CPUINFO=y +CONFIG_DISPLAY_BOARDINFO=y +# CONFIG_SPL_LEGACY_IMAGE_SUPPORT is not set +CONFIG_SPL_RAM_SUPPORT=y +CONFIG_SPL_RAM_DEVICE=y +CONFIG_SYS_PROMPT="C910 Light# " +CONFIG_DDR_LP4X_3200_SINGLERANK=y +CONFIG_DDR_H32_MODE=y +# CONFIG_DDR_LP4_3733_DUALRANK is not set +CONFIG_DDR_BOARD_CONFIG=y +CONFIG_CMD_BOOT_SLAVE=y +CONFIG_CMD_ERASEENV=y +CONFIG_CMD_GPT=y +CONFIG_CMD_MTD=y +CONFIG_CMD_EXT4_WRITE=y +CONFIG_CMD_SPI=y +CONFIG_CMD_I2C=y +CONFIG_CMD_MEMTEST=y +CONFIG_CMD_TIME=y +CONFIG_DDR_SCAN=y +CONFIG_DDR_PRBS_TEST=n +# CONFIG_DOS_PARTITION is not set +# CONFIG_ISO_PARTITION is not set +CONFIG_PARTITION_TYPE_GUID=y +CONFIG_OF_EMBED=y +CONFIG_DEFAULT_DEVICE_TREE="light-b-product" +CONFIG_ENV_IS_IN_MMC=y +CONFIG_SYS_RELOC_GD_ENV_ADDR=y +CONFIG_SPL_CLK=y +CONFIG_USB_FUNCTION_FASTBOOT=y +CONFIG_UDP_FUNCTION_FASTBOOT=y +CONFIG_FASTBOOT_BUF_ADDR=0x10000000 +CONFIG_FASTBOOT_FLASH=y +CONFIG_FASTBOOT_FLASH_MMC_DEV=0 +CONFIG_FASTBOOT_CMD_OEM_FORMAT=y +CONFIG_DM_GPIO=y +CONFIG_DM_I2C=y +CONFIG_SYS_I2C_DW=y +CONFIG_DWAPB_GPIO=y +# CONFIG_MMC_SPI is not set +CONFIG_MMC_VERBOSE=y +CONFIG_SUPPORT_EMMC_BOOT=y +CONFIG_MMC_IO_VOLTAGE=y +CONFIG_MMC_UHS_SUPPORT=y +CONFIG_MMC_HS400_SUPPORT=y +CONFIG_MMC_DW=y +CONFIG_MMC_DW_SNPS=y +CONFIG_MMC_SDHCI=y +CONFIG_MMC_SDHCI_SNPS=y +CONFIG_MMC_SDHCI_SDMA=y +CONFIG_CMD_MMC=y +CONFIG_CMD_MMC_RPMB=y +CONFIG_SUPPORT_EMMC_RPMB=y +CONFIG_DM_MTD=y +CONFIG_MTD_SPI_NAND=y +CONFIG_SPI_FLASH_WINBOND=y +CONFIG_ETH_DESIGNWARE=y +CONFIG_PHY_REALTEK=y +CONFIG_RTL8211E_PINE64_GIGABIT_FIX=y +CONFIG_RTL8211X_PHY_FORCE_MASTER=y +CONFIG_RTL8211F_PHY_FORCE_EEE_RXC_ON=y +CONFIG_SYS_NS16550=y +CONFIG_SPI=y +CONFIG_DESIGNWARE_SPI=y +CONFIG_DESIGNWARE_QSPI=y +CONFIG_USB=y +CONFIG_USB_DWC3=y +CONFIG_USB_GADGET=y +CONFIG_USB_GADGET_MANUFACTURER="U-Boot-THEAD" +CONFIG_USB_GADGET_VENDOR_NUM=0x1234 +CONFIG_USB_GADGET_PRODUCT_NUM=0x8888 +# CONFIG_SPL_USE_TINY_PRINTF is not set +# CONFIG_EFI_LOADER is not set +# CONFIG_LIGHT_SEC_BOOT_WITH_VERIFY_VAL_A=y +# CONFIG_LIGHT_SEC_UPGRADE=y +CONFIG_BOARD_LATE_INIT=y +CONFIG_ENV_VARS_UBOOT_RUNTIME_CONFIG=y +CONFIG_DM_VIDEO=y +CONFIG_PHY=y +CONFIG_REGMAP=y +CONFIG_SYSCON=y +CONFIG_CMD_BMP=y +CONFIG_VIDEO_BRIDGE=y +CONFIG_DM_PCA953X=y +CONFIG_VIDEO_VS_DPU=y +CONFIG_VIDEO_LCD_ILITEK_ILI9881C=y +CONFIG_VIDEO_DW_DSI_LIGHT=y +CONFIG_VIDEO_DW_DPHY=y +CONFIG_VIDEO_DW_DSI_HOST=y +CONFIG_SYS_WHITE_ON_BLACK=y +CONFIG_SYS_TEXT_BASE=0x7b000000 +CONFIG_PMIC_VOL_INIT=y +CONFIG_DDR_REGU_0V6=600000 +CONFIG_DDR_REGU_0V8=800000 +CONFIG_DDR_REGU_1V1=1100000 +CONFIG_LIGHT_ANDROID_BOOT_IMAGE_VAL_B=y +CONFIG_AVB_USE_OEM_KEY=y +CONFIG_ANDROID_BOOT_IMAGE=y +CONFIG_LIBAVB=y +CONFIG_AVB_VERIFY=y +CONFIG_CMD_AVB=y +CONFIG_CMD_BOOTANDROID=y +CONFIG_ANDROID_AB=y +CONFIG_CMD_AB_SELECT=y +CONFIG_XBC=y diff --git a/configs/light_beagle_android_defconfig b/configs/light_beagle_android_defconfig new file mode 100644 index 00000000..69bdae33 --- /dev/null +++ b/configs/light_beagle_android_defconfig @@ -0,0 +1,111 @@ +CONFIG_RISCV=y +CONFIG_SPL_MMC_SUPPORT=y +CONFIG_ENV_SIZE=0x20000 +CONFIG_ENV_OFFSET=0xe0000 +CONFIG_NR_DRAM_BANKS=8 +CONFIG_SPL=y +CONFIG_SMP=y +CONFIG_TARGET_LIGHT_C910=y +CONFIG_TARGET_LIGHT_FM_C910_BEAGLE=y +CONFIG_ARCH_RV64I=y +CONFIG_DISTRO_DEFAULTS=y +CONFIG_BUILD_TARGET="u-boot-with-spl.bin" +CONFIG_DISPLAY_CPUINFO=y +CONFIG_DISPLAY_BOARDINFO=y +# CONFIG_SPL_LEGACY_IMAGE_SUPPORT is not set +CONFIG_SPL_RAM_SUPPORT=y +CONFIG_SPL_RAM_DEVICE=y +CONFIG_SYS_PROMPT="C910 Light# " +CONFIG_DDR_LP4X_3733_SINGLERANK=y +# CONFIG_DDR_LP4_3733_DUALRANK is not set +CONFIG_DDR_BOARD_CONFIG=y +CONFIG_CMD_BOOT_SLAVE=y +CONFIG_CMD_ERASEENV=y +CONFIG_CMD_GPT=y +CONFIG_CMD_MTD=y +CONFIG_CMD_EXT4_WRITE=y +CONFIG_CMD_SPI=y +CONFIG_CMD_I2C=y +CONFIG_CMD_MEMTEST=y +CONFIG_DDR_SCAN=y +CONFIG_DDR_PRBS_TEST=n +# CONFIG_DOS_PARTITION is not set +# CONFIG_ISO_PARTITION is not set +CONFIG_PARTITION_TYPE_GUID=y +CONFIG_OF_EMBED=y +CONFIG_DEFAULT_DEVICE_TREE="light-a-val" +CONFIG_ENV_IS_IN_MMC=y +CONFIG_SYS_RELOC_GD_ENV_ADDR=y +CONFIG_SPL_CLK=y +CONFIG_USB_FUNCTION_FASTBOOT=y +CONFIG_UDP_FUNCTION_FASTBOOT=y +CONFIG_FASTBOOT_BUF_ADDR=0x10000000 +CONFIG_FASTBOOT_FLASH=y +CONFIG_FASTBOOT_FLASH_MMC_DEV=0 +CONFIG_FASTBOOT_CMD_OEM_FORMAT=y +CONFIG_DM_GPIO=y +CONFIG_DM_I2C=y +CONFIG_SYS_I2C_DW=y +CONFIG_DWAPB_GPIO=y +# CONFIG_MMC_SPI is not set +CONFIG_MMC_VERBOSE=y +CONFIG_SUPPORT_EMMC_BOOT=y +CONFIG_MMC_IO_VOLTAGE=y +CONFIG_MMC_UHS_SUPPORT=y +CONFIG_MMC_HS400_SUPPORT=y +CONFIG_MMC_DW=y +CONFIG_MMC_DW_SNPS=y +CONFIG_MMC_SDHCI=y +CONFIG_MMC_SDHCI_SNPS=y +CONFIG_MMC_SDHCI_SDMA=y +CONFIG_CMD_MMC=y +CONFIG_CMD_MMC_RPMB=y +CONFIG_SUPPORT_EMMC_RPMB=y +CONFIG_DM_MTD=y +CONFIG_MTD_SPI_NAND=y +CONFIG_SPI_FLASH_WINBOND=y +CONFIG_ETH_DESIGNWARE=y +CONFIG_PHY_REALTEK=y +CONFIG_RTL8211E_PINE64_GIGABIT_FIX=y +CONFIG_RTL8211X_PHY_FORCE_MASTER=y +CONFIG_RTL8211F_PHY_FORCE_EEE_RXC_ON=y +CONFIG_SYS_NS16550=y +CONFIG_SPI=y +CONFIG_DESIGNWARE_SPI=y +CONFIG_DESIGNWARE_QSPI=y +CONFIG_USB=y +CONFIG_USB_DWC3=y +CONFIG_USB_GADGET=y +CONFIG_USB_GADGET_MANUFACTURER="U-Boot-THEAD" +CONFIG_USB_GADGET_VENDOR_NUM=0x1234 +CONFIG_USB_GADGET_PRODUCT_NUM=0x8888 +# CONFIG_SPL_USE_TINY_PRINTF is not set +# CONFIG_EFI_LOADER is not set +# CONFIG_LIGHT_SEC_BOOT is not set +CONFIG_BOARD_LATE_INIT=y +CONFIG_ENV_VARS_UBOOT_RUNTIME_CONFIG=y +CONFIG_DM_VIDEO=y +CONFIG_PHY=y +CONFIG_REGMAP=y +CONFIG_SYSCON=y +CONFIG_CMD_BMP=y +CONFIG_VIDEO_BRIDGE=y +CONFIG_DM_PCA953X=y +CONFIG_VIDEO_VS_DPU=y +CONFIG_VIDEO_LCD_ILITEK_ILI9881C=y +CONFIG_VIDEO_DW_DSI_LIGHT=y +CONFIG_VIDEO_DW_DPHY=y +CONFIG_VIDEO_DW_DSI_HOST=y +CONFIG_SYS_WHITE_ON_BLACK=y +CONFIG_PMIC_VOL_INIT=y +CONFIG_DDR_REGU_0V6=600000 +CONFIG_DDR_REGU_0V8=800000 +CONFIG_DDR_REGU_1V1=1100000 +CONFIG_ANDROID_BOOT_IMAGE=y +CONFIG_LIBAVB=y +CONFIG_AVB_VERIFY=y +CONFIG_CMD_AVB=y +CONFIG_CMD_BOOTANDROID=y +CONFIG_ANDROID_AB=y +CONFIG_CMD_AB_SELECT=y +CONFIG_XBC=y diff --git a/configs/light_lpi4a_android_defconfig b/configs/light_lpi4a_android_defconfig new file mode 100644 index 00000000..67b6d488 --- /dev/null +++ b/configs/light_lpi4a_android_defconfig @@ -0,0 +1,111 @@ +CONFIG_RISCV=y +CONFIG_SPL_MMC_SUPPORT=y +CONFIG_ENV_SIZE=0x20000 +CONFIG_ENV_OFFSET=0xe0000 +CONFIG_NR_DRAM_BANKS=8 +CONFIG_SPL=y +CONFIG_SMP=y +CONFIG_TARGET_LIGHT_C910=y +CONFIG_TARGET_LIGHT_FM_C910_LPI4A=y +CONFIG_ARCH_RV64I=y +CONFIG_DISTRO_DEFAULTS=y +CONFIG_BUILD_TARGET="u-boot-with-spl.bin" +CONFIG_DISPLAY_CPUINFO=y +CONFIG_DISPLAY_BOARDINFO=y +# CONFIG_SPL_LEGACY_IMAGE_SUPPORT is not set +CONFIG_SPL_RAM_SUPPORT=y +CONFIG_SPL_RAM_DEVICE=y +CONFIG_SYS_PROMPT="C910 Light# " +CONFIG_DDR_LP4X_3733_DUALRANK=y +# CONFIG_DDR_LP4_3733_DUALRANK is not set +CONFIG_DDR_BOARD_CONFIG=y +CONFIG_CMD_BOOT_SLAVE=y +CONFIG_CMD_ERASEENV=y +CONFIG_CMD_GPT=y +CONFIG_CMD_MTD=y +CONFIG_CMD_EXT4_WRITE=y +CONFIG_CMD_SPI=y +CONFIG_CMD_I2C=y +CONFIG_CMD_MEMTEST=y +CONFIG_DDR_SCAN=y +CONFIG_DDR_PRBS_TEST=n +# CONFIG_DOS_PARTITION is not set +# CONFIG_ISO_PARTITION is not set +CONFIG_PARTITION_TYPE_GUID=y +CONFIG_OF_EMBED=y +CONFIG_DEFAULT_DEVICE_TREE="light-lpi4a" +CONFIG_ENV_IS_IN_MMC=y +CONFIG_SYS_RELOC_GD_ENV_ADDR=y +CONFIG_SPL_CLK=y +CONFIG_USB_FUNCTION_FASTBOOT=y +CONFIG_UDP_FUNCTION_FASTBOOT=y +CONFIG_FASTBOOT_BUF_ADDR=0x10000000 +CONFIG_FASTBOOT_FLASH=y +CONFIG_FASTBOOT_FLASH_MMC_DEV=0 +CONFIG_FASTBOOT_CMD_OEM_FORMAT=y +CONFIG_DM_GPIO=y +CONFIG_DM_I2C=y +CONFIG_SYS_I2C_DW=y +CONFIG_DWAPB_GPIO=y +# CONFIG_MMC_SPI is not set +CONFIG_MMC_VERBOSE=y +CONFIG_SUPPORT_EMMC_BOOT=y +CONFIG_MMC_IO_VOLTAGE=y +CONFIG_MMC_UHS_SUPPORT=y +CONFIG_MMC_HS400_SUPPORT=y +CONFIG_MMC_DW=y +CONFIG_MMC_DW_SNPS=y +CONFIG_MMC_SDHCI=y +CONFIG_MMC_SDHCI_SNPS=y +CONFIG_MMC_SDHCI_SDMA=y +CONFIG_CMD_MMC=y +CONFIG_CMD_MMC_RPMB=y +CONFIG_SUPPORT_EMMC_RPMB=y +CONFIG_DM_MTD=y +CONFIG_MTD_SPI_NAND=y +CONFIG_SPI_FLASH_WINBOND=y +CONFIG_ETH_DESIGNWARE=y +CONFIG_PHY_REALTEK=y +CONFIG_RTL8211E_PINE64_GIGABIT_FIX=y +CONFIG_RTL8211X_PHY_FORCE_MASTER=y +CONFIG_RTL8211F_PHY_FORCE_EEE_RXC_ON=y +CONFIG_SYS_NS16550=y +CONFIG_SPI=y +CONFIG_DESIGNWARE_SPI=y +CONFIG_DESIGNWARE_QSPI=y +CONFIG_USB=y +CONFIG_USB_DWC3=y +CONFIG_USB_GADGET=y +CONFIG_USB_GADGET_MANUFACTURER="U-Boot-THEAD" +CONFIG_USB_GADGET_VENDOR_NUM=0x1234 +CONFIG_USB_GADGET_PRODUCT_NUM=0x8888 +# CONFIG_SPL_USE_TINY_PRINTF is not set +# CONFIG_EFI_LOADER is not set +# CONFIG_LIGHT_SEC_BOOT is not set +CONFIG_BOARD_LATE_INIT=y +CONFIG_ENV_VARS_UBOOT_RUNTIME_CONFIG=y +CONFIG_DM_VIDEO=y +CONFIG_PHY=y +CONFIG_REGMAP=y +CONFIG_SYSCON=y +CONFIG_CMD_BMP=y +CONFIG_VIDEO_BRIDGE=y +CONFIG_DM_PCA953X=y +CONFIG_VIDEO_VS_DPU=y +CONFIG_VIDEO_LCD_ILITEK_ILI9881C=y +CONFIG_VIDEO_DW_DSI_LIGHT=y +CONFIG_VIDEO_DW_DPHY=y +CONFIG_VIDEO_DW_DSI_HOST=y +CONFIG_SYS_WHITE_ON_BLACK=y +CONFIG_PMIC_VOL_INIT=y +CONFIG_DDR_REGU_0V6=600000 +CONFIG_DDR_REGU_0V8=800000 +CONFIG_DDR_REGU_1V1=1100000 +CONFIG_ANDROID_BOOT_IMAGE=y +CONFIG_LIBAVB=y +CONFIG_AVB_VERIFY=y +CONFIG_CMD_AVB=y +CONFIG_CMD_BOOTANDROID=y +CONFIG_ANDROID_AB=y +CONFIG_CMD_AB_SELECT=y +CONFIG_XBC=y diff --git a/drivers/fastboot/Kconfig b/drivers/fastboot/Kconfig index 9f85054b..e1586b86 100644 --- a/drivers/fastboot/Kconfig +++ b/drivers/fastboot/Kconfig @@ -2,7 +2,7 @@ menu "Fastboot support" config FASTBOOT bool - imply ANDROID_BOOT_IMAGE + # imply ANDROID_BOOT_IMAGE imply CMD_FASTBOOT config USB_FUNCTION_FASTBOOT diff --git a/drivers/fastboot/fb_common.c b/drivers/fastboot/fb_common.c index f2abe781..28ce836b 100644 --- a/drivers/fastboot/fb_common.c +++ b/drivers/fastboot/fb_common.c @@ -118,7 +118,11 @@ void fastboot_boot(void) #ifdef THEAD_LIGHT_FASTBOOT char cmdbuf[32]; +#ifdef CONFIG_ANDROID_BOOT_IMAGE + sprintf(cmdbuf, "run bootcmd"); +#else sprintf(cmdbuf, "bootslave; run set_bootargs; booti %s - %s", LIGHT_KERNEL_ADDR_CMD, LIGHT_DTB_ADDR_CMD); +#endif printf("fastboot bootcmd %s\n", cmdbuf); run_command(cmdbuf, 0); diff --git a/drivers/fastboot/fb_getvar.c b/drivers/fastboot/fb_getvar.c index 95cb4341..88da5a55 100644 --- a/drivers/fastboot/fb_getvar.c +++ b/drivers/fastboot/fb_getvar.c @@ -13,6 +13,7 @@ #include static void getvar_version(char *var_parameter, char *response); +static void getvar_dynamic_partition(char *var_parameter, char *response); static void getvar_version_bootloader(char *var_parameter, char *response); static void getvar_downloadsize(char *var_parameter, char *response); static void getvar_serialno(char *var_parameter, char *response); @@ -41,6 +42,9 @@ static const struct { }, { .variable = "version-bootloader", .dispatch = getvar_version_bootloader + }, { + .variable = "dynamic-partition", + .dispatch = getvar_dynamic_partition }, { .variable = "downloadsize", .dispatch = getvar_downloadsize @@ -134,6 +138,17 @@ static void getvar_version_bootloader(char *var_parameter, char *response) fastboot_okay(U_BOOT_VERSION, response); } +static void getvar_dynamic_partition(char *var_parameter, char *response) +{ + char *part_name="super"; + + int r = getvar_get_part_info(part_name, response, NULL); + if (r >= 0) + fastboot_okay("true", response); /* part exists */ + else + fastboot_okay("false", response); +} + static void getvar_downloadsize(char *var_parameter, char *response) { fastboot_response("OKAY", response, "0x%08x", fastboot_buf_size); @@ -247,7 +262,11 @@ static void getvar_partition_size(char *part_name, char *response) static void getvar_is_userspace(char *var_parameter, char *response) { +#ifdef CONFIG_ANDROID_BOOT_IMAGE + fastboot_okay("yes", response); +#else fastboot_okay("no", response); +#endif } /** diff --git a/drivers/mmc/sdhci.c b/drivers/mmc/sdhci.c index 7b2805b0..5cc70cda 100644 --- a/drivers/mmc/sdhci.c +++ b/drivers/mmc/sdhci.c @@ -136,9 +136,9 @@ static void sdhci_prepare_dma(struct sdhci_host *host, struct mmc_data *data, unsigned char ctrl; if (data->flags == MMC_DATA_READ) - host->start_addr = (dma_addr_t)data->dest; + host->start_addr = (dma_addr_t)(u64)data->dest; else - host->start_addr = (dma_addr_t)data->src; + host->start_addr = (dma_addr_t)(u64)data->src; ctrl = sdhci_readb(host, SDHCI_HOST_CONTROL); ctrl &= ~SDHCI_CTRL_DMA_MASK; diff --git a/drivers/usb/dwc3/ep0.c b/drivers/usb/dwc3/ep0.c index e3eb5a6d..ea21f36d 100644 --- a/drivers/usb/dwc3/ep0.c +++ b/drivers/usb/dwc3/ep0.c @@ -905,7 +905,10 @@ static void dwc3_ep0_xfer_complete(struct dwc3 *dwc, dep->flags &= ~DWC3_EP_BUSY; dep->resource_index = 0; dwc->setup_packet_pending = false; - invalid_dcache_range(dwc->ctrl_req, (dmaaddr_t)dwc->ctrl_req + ROUND(sizeof(*dwc->ctrl_req), CACHELINE_SIZE)); +#ifdef CONFIG_TARGET_LIGHT_C910 + extern void invalid_dcache_range(unsigned long start, unsigned long end); + invalid_dcache_range((unsigned long)dwc->ctrl_req, (dmaaddr_t)dwc->ctrl_req + ROUND(sizeof(*dwc->ctrl_req), CACHELINE_SIZE)); +#endif switch (dwc->ep0state) { case EP0_SETUP_PHASE: diff --git a/include/asm/arch b/include/asm/arch new file mode 120000 index 00000000..bd58163c --- /dev/null +++ b/include/asm/arch @@ -0,0 +1 @@ +/home/cxx194832/ssd/u-boot/arch/riscv/include/asm/arch-c9xx \ No newline at end of file diff --git a/include/configs/light-c910.h b/include/configs/light-c910.h index 94b04897..63f99ef5 100644 --- a/include/configs/light-c910.h +++ b/include/configs/light-c910.h @@ -22,7 +22,11 @@ #define CONFIG_SYS_INIT_SP_ADDR (CONFIG_SYS_TEXT_BASE + SZ_1M) #define CONFIG_SYS_LOAD_ADDR (CONFIG_SYS_TEXT_BASE + SZ_1M) +#ifdef CONFIG_ANDROID_BOOT_IMAGE +#define CONFIG_SYS_MALLOC_LEN (128*SZ_1M) +#else #define CONFIG_SYS_MALLOC_LEN SZ_1M +#endif #define CONFIG_SYS_BOOTM_LEN SZ_64M #define CONFIG_SYS_CACHELINE_SIZE 64 @@ -59,14 +63,14 @@ #define THEAD_LIGHT_FASTBOOT 1 #define LIGHT_FW_ADDR 0x0 #define LIGHT_KERNEL_ADDR 0x200000 -#define LIGHT_DTB_ADDR 0x2400000 +#define LIGHT_DTB_ADDR 0x2800000 #define LIGHT_ROOTFS_ADDR 0x2000000 #define LIGHT_AON_FW_ADDR 0xffffef8000 #define LIGHT_TEE_FW_ADDR 0x1c000000 #define LIGHT_TF_FW_ADDR LIGHT_FW_ADDR #define LIGHT_TF_FW_TMP_ADDR 0x100000 #define LIGHT_KERNEL_ADDR_CMD "0x200000" -#define LIGHT_DTB_ADDR_CMD "0x2400000" +#define LIGHT_DTB_ADDR_CMD "0x2800000" /* trust image name string */ @@ -119,12 +123,12 @@ #define CONFIG_EXTRA_ENV_SETTINGS \ "scriptaddr=0x00500000\0" \ "pxefile_addr_r=0x00600000\0" \ - "fdt_addr_r=0x02400000\0" \ + "fdt_addr_r=0x02800000\0" \ "kernel_addr_r=0x00200000\0" \ "ramdisk_addr_r=0x06000000\0" \ "boot_conf_addr_r=0xc0000000\0" \ "aon_ram_addr=0xffffef8000\0" \ - "audio_ram_addr=0xffc0000000\0" \ + "audio_ram_addr=0x32000000\0" \ "opensbi_addr=0x0\0" \ "fwaddr=0x10000000\0" \ "splashimage=0x30000000\0" \ diff --git a/include/xbc.h b/include/xbc.h new file mode 100644 index 00000000..ff5c210d --- /dev/null +++ b/include/xbc.h @@ -0,0 +1 @@ +#include <../lib/libxbc/libxbc.h> \ No newline at end of file diff --git a/lib/Kconfig b/lib/Kconfig index 965cf7bc..683b37de 100644 --- a/lib/Kconfig +++ b/lib/Kconfig @@ -316,6 +316,20 @@ config LIBAVB endmenu +menu "Boot Configuration" + +config XBC + bool "Boot Configuration support" + depends on ANDROID_BOOT_IMAGE + default n + help + This enables support of Boot Configuration which can be used + to pass boot configuration parameters to user space. These + parameters will show up in /proc/bootconfig similar to the kernel + parameters that show up in /proc/cmdline + +endmenu + menu "Hashing Support" config SHA1 diff --git a/lib/Makefile b/lib/Makefile index 1fb650cd..1f953f31 100644 --- a/lib/Makefile +++ b/lib/Makefile @@ -68,6 +68,8 @@ obj-$(CONFIG_$(SPL_)LZ4) += lz4_wrapper.o obj-$(CONFIG_LIBAVB) += libavb/ +obj-$(CONFIG_XBC) += libxbc/ + obj-$(CONFIG_$(SPL_TPL_)OF_LIBFDT) += libfdt/ ifneq ($(CONFIG_$(SPL_TPL_)BUILD)$(CONFIG_$(SPL_TPL_)OF_PLATDATA),yy) obj-$(CONFIG_$(SPL_TPL_)OF_CONTROL) += fdtdec_common.o diff --git a/lib/libavb/avb_rsa.c b/lib/libavb/avb_rsa.c index bbf15626..1be21529 100644 --- a/lib/libavb/avb_rsa.c +++ b/lib/libavb/avb_rsa.c @@ -13,6 +13,10 @@ #include "avb_util.h" #include "avb_vbmeta_image.h" +#if defined(CONFIG_AVB_HW_ENGINE_ENABLE) +#include "sec_library.h" +#endif + typedef struct IAvbKey { unsigned int len; /* Length of n[] in number of uint32_t */ uint32_t n0inv; /* -1 / n[0] mod 2^32 */ @@ -82,7 +86,19 @@ fail: static void iavb_free_parsed_key(IAvbKey* key) { avb_free(key); } +#if defined(CONFIG_AVB_HW_ENGINE_ENABLE) +static void hw_crypto_accel_init(void) +{ + static bool init = false; + + if (!init) { + rambus_crypto_init(); + init = true; + } +} + +#else /* a[] -= mod */ static void subM(const IAvbKey* key, uint32_t* a) { int64_t A = 0; @@ -200,7 +216,7 @@ out: avb_free(aaR); } } - +#endif /* Verify a RSA PKCS1.5 signature against an expected hash. * Returns false on failure, true on success. */ @@ -212,6 +228,83 @@ bool avb_rsa_verify(const uint8_t* key, size_t hash_num_bytes, const uint8_t* padding, size_t padding_num_bytes) { +#if defined(CONFIG_AVB_HW_ENGINE_ENABLE) + IAvbKey* parsed_key = NULL; + uint8_t *nk = NULL; + uint8_t *n = NULL; + uint8_t *e = NULL; + int i; + bool success = false; + uint32_t key_bytes = 0; + sc_rsa_t rsa; + sc_rsa_context_t rsa_ctx; + + if (key == NULL || sig == NULL || hash == NULL || padding == NULL) { + avb_error("Invalid input.\n"); + goto out; + } + + parsed_key = iavb_parse_key_data(key, key_num_bytes); + if (parsed_key == NULL) { + avb_error("Error parsing key.\n"); + goto out; + } + + if (padding_num_bytes != sig_num_bytes - hash_num_bytes) { + avb_error("Padding length does not match hash and signature lengths.\n"); + goto out; + } + + key_bytes = parsed_key->len * sizeof(uint32_t); + /* Currently, we only support RSA key 2048bits and SHA256 */ + if ((key_bytes * 8 != 2048) || (hash_num_bytes * 8 != 256)) { + avb_error("Error unsupported keybits length.\n"); + goto out; + } + + nk = (uint8_t *)parsed_key->n; + n = avb_malloc(key_bytes); + if (n == NULL) { + avb_error("Error malloc n.\n"); + goto out; + } + /* Reverse modular little endian */ + for (i = 0; i < key_bytes; i++) { + n[i] = nk[key_bytes - i - 1]; + } + + e = avb_malloc(key_bytes); + if (e == NULL) { + avb_error("Error malloc e.\n"); + goto out; + } + memset(e, 0, key_bytes); + /* public exponentiation. (65537} */ + e[key_bytes-1] = 0x01; e[key_bytes-2] = 0x00; e[key_bytes-3] = 0x01; e[key_bytes-4] = 0x00; + + hw_crypto_accel_init(); + sc_rsa_init(&rsa, 0, SC_RSA_KEY_BITS_2048); + + rsa_ctx.padding_type = SC_RSA_PADDING_MODE_PKCS1; + rsa_ctx.n = n; + rsa_ctx.e = e; + rsa_ctx.hash_type = SC_RSA_HASH_TYPE_SHA256; + rsa_ctx.is_crt = SC_RSA_CRT_DISABLE; + rsa_ctx.is_hash = SC_RSA_HASH_DISABLE; + + success = sc_rsa_verify(&rsa, &rsa_ctx, (void *)hash, hash_num_bytes, (void *)sig, sig_num_bytes, SC_RSA_HASH_TYPE_SHA256); + sc_rsa_uninit(&rsa); + +out: + if (parsed_key != NULL) { + iavb_free_parsed_key(parsed_key); + } + if (e != NULL) { + avb_free(e); + } + + return success; +#else uint8_t* buf = NULL; IAvbKey* parsed_key = NULL; bool success = false; @@ -272,4 +365,5 @@ out: avb_free(buf); } return success; +#endif } diff --git a/lib/libavb/avb_sha.h b/lib/libavb/avb_sha.h index f5d02e09..7f39ff38 100644 --- a/lib/libavb/avb_sha.h +++ b/lib/libavb/avb_sha.h @@ -20,6 +20,9 @@ extern "C" { #include "avb_crypto.h" #include "avb_sysdeps.h" +#if defined(CONFIG_AVB_HW_ENGINE_ENABLE) +#include "sec_library.h" +#endif /* Block size in bytes of a SHA-256 digest. */ #define AVB_SHA256_BLOCK_SIZE 64 @@ -30,19 +33,29 @@ extern "C" { /* Data structure used for SHA-256. */ typedef struct { +#if defined(CONFIG_AVB_HW_ENGINE_ENABLE) + sc_sha_t sha_t; + sc_sha_context_t sha_context; +#else uint32_t h[8]; uint64_t tot_len; size_t len; uint8_t block[2 * AVB_SHA256_BLOCK_SIZE]; +#endif uint8_t buf[AVB_SHA256_DIGEST_SIZE]; /* Used for storing the final digest. */ } AvbSHA256Ctx; /* Data structure used for SHA-512. */ typedef struct { +#if defined(CONFIG_AVB_HW_ENGINE_ENABLE) + sc_sha_t sha_t; + sc_sha_context_t sha_context; +#else uint64_t h[8]; uint64_t tot_len; size_t len; uint8_t block[2 * AVB_SHA512_BLOCK_SIZE]; +#endif uint8_t buf[AVB_SHA512_DIGEST_SIZE]; /* Used for storing the final digest. */ } AvbSHA512Ctx; diff --git a/lib/libavb/avb_sha256.c b/lib/libavb/avb_sha256.c index 86ecca57..3d00654f 100644 --- a/lib/libavb/avb_sha256.c +++ b/lib/libavb/avb_sha256.c @@ -10,6 +10,7 @@ #include "avb_sha.h" +#if !defined(CONFIG_AVB_HW_ENGINE_ENABLE) #define SHFR(x, n) (x >> n) #define ROTR(x, n) ((x >> n) | (x << ((sizeof(x) << 3) - n))) #define ROTL(x, n) ((x << n) | (x >> ((sizeof(x) << 3) - n))) @@ -83,9 +84,19 @@ static const uint32_t sha256_k[64] = { 0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5, 0x391c0cb3, 0x4ed8aa4a, 0x5b9cca4f, 0x682e6ff3, 0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208, 0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2}; +#endif /* SHA-256 implementation */ void avb_sha256_init(AvbSHA256Ctx* ctx) { +#if defined(CONFIG_AVB_HW_ENGINE_ENABLE) + if (ctx == NULL) { + return; + } + + sc_sha_init(&ctx->sha_t, 0); + sc_sha_start(&ctx->sha_t, &ctx->sha_context, SC_SHA_MODE_256); + sc_sha_trans_config(&ctx->sha_t, &ctx->sha_context, 1); +#else #ifndef UNROLL_LOOPS int i; for (i = 0; i < 8; i++) { @@ -104,8 +115,10 @@ void avb_sha256_init(AvbSHA256Ctx* ctx) { ctx->len = 0; ctx->tot_len = 0; +#endif } +#if !defined(CONFIG_AVB_HW_ENGINE_ENABLE) static void SHA256_transform(AvbSHA256Ctx* ctx, const uint8_t* message, size_t block_nb) { @@ -304,8 +317,16 @@ static void SHA256_transform(AvbSHA256Ctx* ctx, #endif /* !UNROLL_LOOPS */ } } +#endif void avb_sha256_update(AvbSHA256Ctx* ctx, const uint8_t* data, size_t len) { +#if defined(CONFIG_AVB_HW_ENGINE_ENABLE) + if (ctx == NULL || data == NULL) { + return; + } + + sc_sha_update(&ctx->sha_t, &ctx->sha_context, data, len); +#else size_t block_nb; size_t new_len, rem_len, tmp_len; const uint8_t* shifted_data; @@ -334,9 +355,25 @@ void avb_sha256_update(AvbSHA256Ctx* ctx, const uint8_t* data, size_t len) { ctx->len = rem_len; ctx->tot_len += (block_nb + 1) << 6; +#endif } uint8_t* avb_sha256_final(AvbSHA256Ctx* ctx) { +#if defined(CONFIG_AVB_HW_ENGINE_ENABLE) + uint32_t len = 0; + uint32_t ret = 0; + + if (ctx == NULL) { + return NULL; + } + + ret = sc_sha_finish(&ctx->sha_t, &ctx->sha_context, ctx->buf, &len); + if (ret != 0) { + return NULL; + } + + return ctx->buf; +#else size_t block_nb; size_t pm_len; uint64_t len_b; @@ -372,4 +409,5 @@ uint8_t* avb_sha256_final(AvbSHA256Ctx* ctx) { #endif /* !UNROLL_LOOPS */ return ctx->buf; +#endif } diff --git a/lib/libavb/avb_sha512.c b/lib/libavb/avb_sha512.c index b19054fc..475b46fb 100644 --- a/lib/libavb/avb_sha512.c +++ b/lib/libavb/avb_sha512.c @@ -10,6 +10,7 @@ #include "avb_sha.h" +#if !defined(CONFIG_AVB_HW_ENGINE_ENABLE) #define SHFR(x, n) (x >> n) #define ROTR(x, n) ((x >> n) | (x << ((sizeof(x) << 3) - n))) #define ROTL(x, n) ((x << n) | (x >> ((sizeof(x) << 3) - n))) @@ -101,10 +102,20 @@ static const uint64_t sha512_k[80] = { 0x28db77f523047d84ULL, 0x32caab7b40c72493ULL, 0x3c9ebe0a15c9bebcULL, 0x431d67c49c100d4cULL, 0x4cc5d4becb3e42b6ULL, 0x597f299cfc657e2aULL, 0x5fcb6fab3ad6faecULL, 0x6c44198c4a475817ULL}; +#endif /* SHA-512 implementation */ void avb_sha512_init(AvbSHA512Ctx* ctx) { +#if defined(CONFIG_AVB_HW_ENGINE_ENABLE) + if (ctx == NULL) { + return; + } + + sc_sha_init(&ctx->sha_t, 0); + sc_sha_start(&ctx->sha_t, &ctx->sha_context, SC_SHA_MODE_512); + sc_sha_trans_config(&ctx->sha_t, &ctx->sha_context, 1); +#else #ifdef UNROLL_LOOPS_SHA512 ctx->h[0] = sha512_h0[0]; ctx->h[1] = sha512_h0[1]; @@ -123,8 +134,10 @@ void avb_sha512_init(AvbSHA512Ctx* ctx) { ctx->len = 0; ctx->tot_len = 0; +#endif } +#if !defined(CONFIG_AVB_HW_ENGINE_ENABLE) static void SHA512_transform(AvbSHA512Ctx* ctx, const uint8_t* message, size_t block_nb) { @@ -290,8 +303,16 @@ static void SHA512_transform(AvbSHA512Ctx* ctx, #endif /* UNROLL_LOOPS_SHA512 */ } } +#endif void avb_sha512_update(AvbSHA512Ctx* ctx, const uint8_t* data, size_t len) { +#if defined(CONFIG_AVB_HW_ENGINE_ENABLE) + if (ctx == NULL || data == NULL) { + return; + } + + sc_sha_update(&ctx->sha_t, &ctx->sha_context, data, len); +#else size_t block_nb; size_t new_len, rem_len, tmp_len; const uint8_t* shifted_data; @@ -320,9 +341,25 @@ void avb_sha512_update(AvbSHA512Ctx* ctx, const uint8_t* data, size_t len) { ctx->len = rem_len; ctx->tot_len += (block_nb + 1) << 7; +#endif } uint8_t* avb_sha512_final(AvbSHA512Ctx* ctx) { +#if defined(CONFIG_AVB_HW_ENGINE_ENABLE) + uint32_t len = 0; + uint32_t ret = 0; + + if (ctx == NULL) { + return NULL; + } + + ret = sc_sha_finish(&ctx->sha_t, &ctx->sha_context, ctx->buf, &len); + if (ret != 0) { + return NULL; + } + + return ctx->buf; +#else size_t block_nb; size_t pm_len; uint64_t len_b; @@ -358,4 +395,5 @@ uint8_t* avb_sha512_final(AvbSHA512Ctx* ctx) { #endif /* UNROLL_LOOPS_SHA512 */ return ctx->buf; +#endif } diff --git a/lib/libxbc/COPYING b/lib/libxbc/COPYING new file mode 100644 index 00000000..2909ff0d --- /dev/null +++ b/lib/libxbc/COPYING @@ -0,0 +1,170 @@ + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + 1. Definitions. + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + END OF TERMS AND CONDITIONS + APPENDIX: How to apply the Apache License to your work. + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + Copyright [yyyy] [name of copyright owner] + 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. \ No newline at end of file diff --git a/lib/libxbc/Makefile b/lib/libxbc/Makefile new file mode 100644 index 00000000..7cb3d0e9 --- /dev/null +++ b/lib/libxbc/Makefile @@ -0,0 +1,14 @@ + # Copyright (C) 2021 The Android Open Source Project + # + # Licensed under the Apache License, Version 2.0 (the "License"); + # you may not use this file except in compliance with the License. + # You may obtain a copy of the License at + # + # http://www.apache.org/licenses/LICENSE-2.0 + # + # Unless required by applicable law or agreed to in writing, software + # distributed under the License is distributed on an "AS IS" BASIS, + # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + # See the License for the specific language governing permissions and + # limitations under the License. +obj-$(CONFIG_XBC) += libxbc.o \ No newline at end of file diff --git a/lib/libxbc/libxbc.c b/lib/libxbc/libxbc.c new file mode 100644 index 00000000..1bcf3be2 --- /dev/null +++ b/lib/libxbc/libxbc.c @@ -0,0 +1,104 @@ +/* + * Copyright (C) 2021 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +#include "libxbc.h" +#define BOOTCONFIG_MAGIC "#BOOTCONFIG\n" +#define BOOTCONFIG_MAGIC_SIZE 12 +#define BOOTCONFIG_SIZE_SIZE 4 +#define BOOTCONFIG_CHECKSUM_SIZE 4 +#define BOOTCONFIG_TRAILER_SIZE BOOTCONFIG_MAGIC_SIZE + \ + BOOTCONFIG_SIZE_SIZE + \ + BOOTCONFIG_CHECKSUM_SIZE +/* + * Simple checksum for a buffer. + * + * @param addr pointer to the start of the buffer. + * @param size size of the buffer in bytes. + * @return check sum result. + */ +static uint32_t checksum(const unsigned char* const buffer, uint32_t size) { + uint32_t sum = 0; + for (uint32_t i = 0; i < size; i++) { + sum += buffer[i]; + } + return sum; +} +/* + * Check if the bootconfig trailer is present within the bootconfig section. + * + * @param bootconfig_end_addr address of the end of the bootconfig section. If + * the trailer is present, it will be directly preceding this address. + * @return true if the trailer is present, false if not. + */ +static bool isTrailerPresent(uint64_t bootconfig_end_addr) { + return !strncmp((char*)(bootconfig_end_addr - BOOTCONFIG_MAGIC_SIZE), + BOOTCONFIG_MAGIC, BOOTCONFIG_MAGIC_SIZE); +} +/* + * Add a string of boot config parameters to memory appended by the trailer. + */ +int32_t addBootConfigParameters(char* params, uint32_t params_size, + uint64_t bootconfig_start_addr, uint32_t bootconfig_size) { + if (!params || !bootconfig_start_addr) { + return -1; + } + if (params_size == 0) { + return 0; + } + int32_t applied_bytes = 0; + int32_t new_size = 0; + uint64_t end = bootconfig_start_addr + bootconfig_size; + if (isTrailerPresent(end)) { + end -= BOOTCONFIG_TRAILER_SIZE; + applied_bytes -= BOOTCONFIG_TRAILER_SIZE; + memcpy(&new_size, (void *)end, BOOTCONFIG_SIZE_SIZE); + } else { + new_size = bootconfig_size; + } + // params + memcpy((void*)end, params, params_size); + applied_bytes += params_size; + applied_bytes += addBootConfigTrailer(bootconfig_start_addr, + bootconfig_size + applied_bytes); + return applied_bytes; +} +/* + * Add boot config trailer. + */ +int32_t addBootConfigTrailer(uint64_t bootconfig_start_addr, + uint32_t bootconfig_size) { + if (!bootconfig_start_addr) { + return -1; + } + if (bootconfig_size == 0) { + return 0; + } + uint64_t end = bootconfig_start_addr + bootconfig_size; + if (isTrailerPresent(end)) { + // no need to overwrite the current trailers + return 0; + } + // size + memcpy((void *)(end), &bootconfig_size, BOOTCONFIG_SIZE_SIZE); + // checksum + uint32_t sum = + checksum((unsigned char*)bootconfig_start_addr, bootconfig_size); + memcpy((void *)(end + BOOTCONFIG_SIZE_SIZE), &sum, + BOOTCONFIG_CHECKSUM_SIZE); + // magic + memcpy((void *)(end + BOOTCONFIG_SIZE_SIZE + BOOTCONFIG_CHECKSUM_SIZE), + BOOTCONFIG_MAGIC, BOOTCONFIG_MAGIC_SIZE); + return BOOTCONFIG_TRAILER_SIZE; +} \ No newline at end of file diff --git a/lib/libxbc/libxbc.h b/lib/libxbc/libxbc.h new file mode 100644 index 00000000..e6315c30 --- /dev/null +++ b/lib/libxbc/libxbc.h @@ -0,0 +1,54 @@ +/* + * Copyright (C) 2021 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +#ifndef LIBXBC_H_ +#define LIBXBC_H_ +// memcpy and strncmp +#include +/* + * Add a string of boot config parameters to memory appended by the trailer. + * This memory needs to be immediately following the end of the ramdisks. + * The new boot config trailer will be written to the end of the entire + * parameter section(previous + new). The trailer contains a 4 byte size of the + * parameters, followed by a 4 byte checksum of the parameters, followed by a 12 + * byte magic string. + * + * @param params pointer to string of boot config parameters + * @param params_size size of params string in bytes + * @param bootconfig_start_addr address that the boot config section is starting + * at in memory. + * @param bootconfig_size size of the current bootconfig section in bytes. + * @return number of bytes added to the boot config section. -1 for error. + */ +int addBootConfigParameters(char *params, uint32_t params_size, + uint64_t bootconfig_start_addr, + uint32_t bootconfig_size); +/* + * Add the boot config trailer to the end of the boot config parameter section. + * This can be used after the vendor bootconfig section has been placed into + * memory if there are no additional parameters that need to be added. + * The new boot config trailer will be written to the end of the entire + * parameter section at (bootconfig_start_addr + bootconfig_size). + * The trailer contains a 4 byte size of the parameters, followed by a 4 byte + * checksum of the parameters, followed by a 12 byte magic string. + * + * @param bootconfig_start_addr address that the boot config section is starting + * at in memory. + * @param bootconfig_size size of the current bootconfig section in bytes. + * @return number of bytes added to the boot config section. -1 for error. + */ +int addBootConfigTrailer(uint64_t bootconfig_start_addr, + uint32_t bootconfig_size); +#endif /* LIBXBC_H_ */ \ No newline at end of file diff --git a/lib/sec_library/include/aes.h b/lib/sec_library/include/aes.h old mode 100755 new mode 100644 index 93c809d3..069767f3 --- a/lib/sec_library/include/aes.h +++ b/lib/sec_library/include/aes.h @@ -40,20 +40,20 @@ extern "C" { #define AES_DMA_DISABLE (0) /** -\brief DES data transfer mode config +\brief AES data transfer mode config */ typedef enum { - AES_SLAVE_MODE = 0U, ///< slave mode - AES_DMA_MODE, ///< dma mode + AES_SLAVE_MODE = 0U, /*slave mode*/ + AES_DMA_MODE, /*dma mode*/ } csi_aes_trans_mode_t; /** \brief AES Keylen type */ typedef enum { - AES_KEY_LEN_BITS_128 = 0, ///< 128 Data bits - AES_KEY_LEN_BITS_192, ///< 192 Data bits - AES_KEY_LEN_BITS_256 ///< 256 Data bits + AES_KEY_LEN_BITS_128 = 0, /*128 Data bits*/ + AES_KEY_LEN_BITS_192, /*192 Data bits*/ + AES_KEY_LEN_BITS_256 /*256 Data bits*/ } csi_aes_key_bits_t; /** @@ -73,8 +73,8 @@ typedef enum{ \brief AES state */ typedef struct { - uint32_t busy : 1; ///< Calculate busy flag - uint32_t error : 1; ///< Calculate error flag + uint32_t busy : 1; /*Calculate busy flag*/ + uint32_t error : 1; /*Calculate error flag*/ } csi_aes_state_t; /** @@ -82,7 +82,7 @@ typedef struct { */ typedef struct { uint32_t key_len_byte; - uint8_t key[32]; ///< Data block being processed + uint8_t key[32]; /*Data block being processed*/ uint32_t sca; uint32_t is_kdf; uint32_t is_dma; @@ -350,7 +350,7 @@ void csi_aes_disable_pm(csi_aes_t *aes); \param[in] mode \ref csi_des_trans_mode_t \return None */ -void csi_aes_trans_config(csi_aes_t *aes, csi_aes_trans_mode_t mode); +csi_error_t csi_aes_trans_config(csi_aes_t *aes, csi_aes_trans_mode_t mode); #ifdef __cplusplus } diff --git a/lib/sec_library/include/common.h b/lib/sec_library/include/common.h old mode 100755 new mode 100644 index efd5b4a6..15eb6899 --- a/lib/sec_library/include/common.h +++ b/lib/sec_library/include/common.h @@ -134,6 +134,8 @@ typedef struct { csi_error_t target_get(csi_dev_tag_t dev_tag, uint32_t idx, csi_dev_t *dev); csi_error_t target_get_optimal_dma_channel(void *dma_list, uint32_t ctrl_num, csi_dev_t *parent_dev, void *ch_info); +// void mdelay(uint32_t ms); +// void udelay(uint32_t us); void msleep(uint32_t ms); #ifdef __cplusplus diff --git a/lib/sec_library/include/core/README.txt b/lib/sec_library/include/core/README.txt old mode 100755 new mode 100644 diff --git a/lib/sec_library/include/core/cmsis/ARMCM0.h b/lib/sec_library/include/core/cmsis/ARMCM0.h old mode 100755 new mode 100644 diff --git a/lib/sec_library/include/core/cmsis/cmsis_compiler.h b/lib/sec_library/include/core/cmsis/cmsis_compiler.h old mode 100755 new mode 100644 diff --git a/lib/sec_library/include/core/cmsis/cmsis_gcc.h b/lib/sec_library/include/core/cmsis/cmsis_gcc.h old mode 100755 new mode 100644 diff --git a/lib/sec_library/include/core/cmsis/cmsis_version.h b/lib/sec_library/include/core/cmsis/cmsis_version.h old mode 100755 new mode 100644 diff --git a/lib/sec_library/include/core/cmsis/core_cm0.h b/lib/sec_library/include/core/cmsis/core_cm0.h old mode 100755 new mode 100644 diff --git a/lib/sec_library/include/core/cmsis/csi_core.h b/lib/sec_library/include/core/cmsis/csi_core.h old mode 100755 new mode 100644 diff --git a/lib/sec_library/include/core/cmsis/system_ARMCM0.h b/lib/sec_library/include/core/cmsis/system_ARMCM0.h old mode 100755 new mode 100644 diff --git a/lib/sec_library/include/core/core_801.h b/lib/sec_library/include/core/core_801.h old mode 100755 new mode 100644 diff --git a/lib/sec_library/include/core/core_802.h b/lib/sec_library/include/core/core_802.h old mode 100755 new mode 100644 diff --git a/lib/sec_library/include/core/core_803.h b/lib/sec_library/include/core/core_803.h old mode 100755 new mode 100644 diff --git a/lib/sec_library/include/core/core_804.h b/lib/sec_library/include/core/core_804.h old mode 100755 new mode 100644 diff --git a/lib/sec_library/include/core/core_805.h b/lib/sec_library/include/core/core_805.h old mode 100755 new mode 100644 diff --git a/lib/sec_library/include/core/core_807.h b/lib/sec_library/include/core/core_807.h old mode 100755 new mode 100644 diff --git a/lib/sec_library/include/core/core_810.h b/lib/sec_library/include/core/core_810.h old mode 100755 new mode 100644 diff --git a/lib/sec_library/include/core/core_ck610.h b/lib/sec_library/include/core/core_ck610.h old mode 100755 new mode 100644 diff --git a/lib/sec_library/include/core/core_ck801.h b/lib/sec_library/include/core/core_ck801.h old mode 100755 new mode 100644 diff --git a/lib/sec_library/include/core/core_ck802.h b/lib/sec_library/include/core/core_ck802.h old mode 100755 new mode 100644 diff --git a/lib/sec_library/include/core/core_ck803.h b/lib/sec_library/include/core/core_ck803.h old mode 100755 new mode 100644 diff --git a/lib/sec_library/include/core/core_ck807.h b/lib/sec_library/include/core/core_ck807.h old mode 100755 new mode 100644 diff --git a/lib/sec_library/include/core/core_ck810.h b/lib/sec_library/include/core/core_ck810.h old mode 100755 new mode 100644 diff --git a/lib/sec_library/include/core/core_rv32.h b/lib/sec_library/include/core/core_rv32.h old mode 100755 new mode 100644 diff --git a/lib/sec_library/include/core/core_rv64.h b/lib/sec_library/include/core/core_rv64.h old mode 100755 new mode 100644 diff --git a/lib/sec_library/include/core/csi_gcc.h b/lib/sec_library/include/core/csi_gcc.h old mode 100755 new mode 100644 diff --git a/lib/sec_library/include/core/csi_rv32_gcc.h b/lib/sec_library/include/core/csi_rv32_gcc.h old mode 100755 new mode 100644 diff --git a/lib/sec_library/include/core/csi_rv64_gcc.h b/lib/sec_library/include/core/csi_rv64_gcc.h old mode 100755 new mode 100644 diff --git a/lib/sec_library/include/csi_core.h b/lib/sec_library/include/csi_core.h old mode 100755 new mode 100644 diff --git a/lib/sec_library/include/csi_efuse_api.h b/lib/sec_library/include/csi_efuse_api.h index 082f9138..7600e61f 100755 --- a/lib/sec_library/include/csi_efuse_api.h +++ b/lib/sec_library/include/csi_efuse_api.h @@ -21,7 +21,7 @@ typedef enum { IMAGE_ENCRYPT_EN = ~(IMAGE_ENCRYPT_DIS), } img_encrypt_st_t; -int csi_efuse_api_int(void); +int csi_efuse_api_init(void); void csi_efuse_api_uninit(void); int csi_efuse_get_secure_boot_st(sboot_st_t *sboot_st); @@ -48,8 +48,10 @@ int csi_efuse_read_raw(uint32_t addr, void *data, uint32_t cnt); int csi_efuse_write_raw(uint32_t addr, const void *data, uint32_t cnt); +int csi_efuse_get_lc(int *lc); + #ifdef __cplusplus } #endif -#endif /* __CSI_EFUSE_API_H__ */ \ No newline at end of file +#endif /* __CSI_EFUSE_API_H__ */ diff --git a/lib/sec_library/include/csi_sec_img_verify.h b/lib/sec_library/include/csi_sec_img_verify.h old mode 100755 new mode 100644 index 9ca97cf6..f2403aaa --- a/lib/sec_library/include/csi_sec_img_verify.h +++ b/lib/sec_library/include/csi_sec_img_verify.h @@ -24,6 +24,8 @@ int csi_sec_set_boot_stage(boot_stage_t boot_stage); int csi_sec_get_lib_version(char ** p_version); +int csi_sec_library_init(void); + #ifdef __cplusplus } #endif diff --git a/lib/sec_library/include/curve25519.h b/lib/sec_library/include/curve25519.h new file mode 100644 index 00000000..e2e10b74 --- /dev/null +++ b/lib/sec_library/include/curve25519.h @@ -0,0 +1,86 @@ +/* + * Copyright (C) 2017-2022 Alibaba Group Holding Limited + */ + +/****************************************************************************** + * @file drv/curve25519.h + * @brief Header File for CURVE25519 Driver + * @version V3.3 + * @date 10.June 2022 + * @model ECC + ******************************************************************************/ + +#ifndef _DRV_CURVE25519_H_ +#define _DRV_CURVE25519_H_ + +#include +#include "common.h" + +#ifdef __cplusplus +extern "C" { +#endif + +typedef struct { + csi_dev_t dev; +} csi_curve25519_t; + +/** + \brief Initialize CURVE25519. + \param[in] idx device id + \return Error code \ref csi_error_t +*/ +csi_error_t csi_curve25519_init(void *ctx, uint32_t idx); + +/** + \brief De-initialize CURVE25519 Interface. stops operation and releases the software resources used by the interface + \param[in] curve25519 ecc handle to operate. + \return none +*/ +void csi_curve25519_uninit(void *ctx); + +/** + \brief curve25519 gen public key + \param[in] ctx ctx handle to operate. + \param[in] privkey Pointer to the A(or B) private key. + \param[out] pubkey Pointer to the A(or B) public key. + \return Error code \ref csi_error_t. +*/ +csi_error_t csi_curve25519_gen_pubkey(void *ctx, const uint8_t privkey[32], uint8_t pubkey[32]); + +/** + \brief curve25519 gen key pair + \param[in] ctx ctx handle to operate. + \param[out] privkey Pointer to the A(or B) private key. + \param[out] pubkey Pointer to the A(or B) public key. + \return Error code \ref csi_error_t. +*/ +csi_error_t csi_curve25519_gen_keypair(void *ctx, uint8_t privkey[32], uint8_t pubkey[32]); + +/** + \brief curve25519 check key pair + \param[in] ctx ctx handle to operate. + \param[in] privkey Pointer to the B(or A) private key. + \param[in] pubkey Pointer to the A(or B) public key. + \param[out] sk Pointer to the share key. + \param[out] sk_len Pointer to the share key length byte. + \return Error code \ref csi_error_t. +*/ +csi_error_t csi_curve25519_check_keypair(void *ctx, const uint8_t privkey[32], const uint8_t pubkey[32]); + +/** + \brief curve25519 check key pair + \param[in] ctx ctx handle to operate. + \param[in] privkey Pointer to the B(or A) private key. + \param[in] pubkey Pointer to the A(or B) public key. + \param[out] sk Pointer to the share key. + \param[out] sk_len Pointer to the share key length byte. + \return Error code \ref csi_error_t. +*/ +csi_error_t csi_curve25519_calc_secret(void *ctx, const uint8_t privkey[32], const uint8_t pubkey[32], uint8_t sk[32], uint32_t *sk_len); + + +#ifdef __cplusplus +} +#endif + +#endif \ No newline at end of file diff --git a/lib/sec_library/include/des.h b/lib/sec_library/include/des.h index feb87959..cce79367 100755 --- a/lib/sec_library/include/des.h +++ b/lib/sec_library/include/des.h @@ -25,17 +25,17 @@ extern "C" { \brief DES data transfer mode config */ typedef enum { - DES_SLAVE_MODE = 0U, ///< slave mode - DES_DMA_MODE, ///< dma mode + DES_SLAVE_MODE = 0U, /*slave mode*/ + DES_DMA_MODE, /*dma mode*/ } csi_des_trans_mode_t; /** \brief DES key-len-bits type */ typedef enum { - DES_KEY_LEN_BITS_64 = 0, ///< 64 Data bits - DES_KEY_LEN_BITS_128, ///< 128 Data bits - DES_KEY_LEN_BITS_192, ///< 192 Data bits + DES_KEY_LEN_BITS_64 = 0, /*64 Data bits*/ + DES_KEY_LEN_BITS_128, /*128 Data bits*/ + DES_KEY_LEN_BITS_192, /*192 Data bits*/ } csi_des_key_bits_t; typedef enum{ @@ -51,7 +51,7 @@ typedef enum{ #define DES_KEY_LEN_BYTES_24 (24) #define DES_KEY_LEN_BYTES_8 (8) -#define DES_BLOCK_IV_SIZE (16) +#define DES_BLOCK_IV_SIZE (8) #define DES_BLOCK_CRYPTO_SIZE (8) #define TDES_BLOCK_CRYPTO_SIZE (16) @@ -65,8 +65,8 @@ typedef enum{ \brief DES State */ typedef struct { - uint32_t busy : 1; ///< Calculate busy flag - uint32_t error : 1; ///< Calculate error flag + uint32_t busy : 1; /*Calculate busy flag*/ + uint32_t error : 1; /*Calculate error flag*/ } csi_des_state_t; /** @@ -74,7 +74,7 @@ typedef struct { */ typedef struct { uint32_t key_len_byte; - uint8_t key[32]; ///< Data block being processed + uint8_t key[32]; /*Data block being processed*/ uint32_t sca; uint32_t is_kdf; uint32_t is_dma; @@ -212,7 +212,7 @@ csi_error_t csi_tdes_cbc_decrypt(csi_des_t *des, void *in, void *out, uint32_t s \param[in] mode \ref csi_des_trans_mode_t \return None */ -void csi_des_trans_config(csi_des_t *des, csi_des_trans_mode_t mode); +csi_error_t csi_des_trans_config(csi_des_t *des, csi_des_trans_mode_t mode); #ifdef __cplusplus } diff --git a/lib/sec_library/include/dev_tag.h b/lib/sec_library/include/dev_tag.h old mode 100755 new mode 100644 diff --git a/lib/sec_library/include/device_types.h b/lib/sec_library/include/device_types.h old mode 100755 new mode 100644 diff --git a/lib/sec_library/include/dsa.h b/lib/sec_library/include/dsa.h new file mode 100644 index 00000000..34f6c6a9 --- /dev/null +++ b/lib/sec_library/include/dsa.h @@ -0,0 +1,178 @@ +/* + * Copyright (C) 2017-2022 Alibaba Group Holding Limited + */ + +/****************************************************************************** + * @file drv/ecc.h + * @brief Header File for ECC Driver + * @version V3.3 + * @date 30. May 2022 + * @model ECC + ******************************************************************************/ + +#ifndef _DRV_DSA_H_ +#define _DRV_DSA_H_ + +#include +#include "common.h" + +#ifdef __cplusplus +extern "C" { +#endif + + +#define CSI_DSA_SHA1_PUBKEY_LEN (128) +#define CSI_DSA_SHA1_PRIVKEY_LEN (20) +#define CSI_DSA_SHA1_RK_LEN (20) /*random*/ +#define CSI_DSA_SHA1_SIGNATURE_LEN (40) +#define CSI_DSA_SHA1_DIGEST_LEN (20) + +#define CSI_DSA_SHA256_PUBKEY_LEN (256) +#define CSI_DSA_SHA256_PRIVKEY_LEN (32) +#define CSI_DSA_SHA256_RK_LEN (32) /*random*/ +#define CSI_DSA_SHA256_SIGNATURE_LEN (64) +#define CSI_DSA_SHA256_DIGEST_LEN (32) + +#define CSI_DSA_SHA224_PUBKEY_LEN (256) +#define CSI_DSA_SHA224_PRIVKEY_LEN (28) +#define CSI_DSA_SHA224_RK_LEN (28) /*random*/ +#define CSI_DSA_SHA224_SIGNATURE_LEN (56) +#define CSI_DSA_SHA224_DIGEST_LEN (28) + +#define CSI_DSA_SHA1_SHIFT_BYTES (1*4) +#define CSI_DSA_SHA224_SHIFT_BYTES (1*4) + +#define DSA_SHA1_GROUP_P_G_BYTES (128) +#define DSA_SHA1_GROUP_PARAM_WORDS (76) +#define DSA_SHA1_GROUP_N_BYTES (20) +#define DSA_SHA1_A_LEN_WORDS (0x20) +#define DSA_SHA1_B_LEN_WORDS (0x05) + +#define DSA_SHA256_GROUP_P_G_BYTES (256) +#define DSA_SHA256_GROUP_PARAM_WORDS (140) +#define DSA_SHA256_GROUP_N_BYTES (32) +#define DSA_SHA256_A_LEN_WORDS (0x40) +#define DSA_SHA256_B_LEN_WORDS (0x08) + +#define DSA_SHA224_GROUP_P_G_BYTES (256) +#define DSA_SHA224_GROUP_PARAM_WORDS (140) +#define DSA_SHA224_GROUP_N_BYTES (28) +#define DSA_SHA224_A_LEN_WORDS (0x40) +#define DSA_SHA224_B_LEN_WORDS (0x07) + + +/** +\brief DSA sha type +*/ +typedef enum { + DSA_SHA1 = 0, + DSA_SHA224, + DSA_SHA256, + DSA_SHA_TYPE_MAX, +} dsa_sha_type; + +/** +\brief DSA group param +*/ +typedef struct { + dsa_sha_type type; + uint32_t *group; + uint32_t words; + uint32_t offset; +} csi_dsa_group_t; + +/** +\brief DSA g param +*/ +typedef struct { + dsa_sha_type type; + uint8_t *p; + uint8_t *g; + uint8_t *n; +} csi_dsa_gpn_t; + +typedef enum{ + CSI_DSA_SHA1_SIGN = 0, + CSI_DSA_SHA1_VERIFY, + CSI_DSA_SHA224_SIGN, + CSI_DSA_SHA224_VERIFY, + CSI_DSA_SHA256_SIGN, + CSI_DSA_SHA256_VERIFY, + CSI_DSA_FUN_MAX, +}dsa_fun_type; + +typedef struct { + dsa_fun_type type; + uint32_t dsa_pka_a_offset; + uint32_t dsa_pka_b_offset; + uint32_t dsa_pka_c_offset; + uint32_t dsa_pka_d_offset; + uint32_t dsa_pka_r_offset; + uint32_t dsa_pka_s_offset; + uint32_t dsa_pka_function; + uint32_t dsa_pka_A_len; + uint32_t dsa_pka_B_len; +} csi_dsa_pka_offset_t; + +/** +\brief ECC handle +*/ +typedef struct { + csi_dev_t dev; + dsa_sha_type sha_type; +} csi_dsa_t; + +/** + \brief Initialize ECC. + \param[in] idx device id + \return Error code \ref csi_error_t +*/ +csi_error_t csi_dsa_init(csi_dsa_t *dsa, uint32_t idx); + +/** + \brief De-initialize ECC Interface. stops operation and releases the software resources used by the interface + \param[in] ecc ecc handle to operate. + \return none +*/ +void csi_dsa_uninit(csi_dsa_t *dsa); + +/** + \brief config dsa sha type + \param[in] ecc ECC handle to operate. + \param[in] type \ref dsa_sha_type. +*/ +csi_error_t csi_dsa_config(csi_dsa_t *dsa, dsa_sha_type type); +/** + \brief dsa gen key pairs + \param[in] ecc dsa handle to operate. + \param[out] privkey Pointer to the private key + \param[out] pubkey Pointer to the public key + \return Error code \ref csi_error_t +*/ +csi_error_t csi_dsa_gen_keypairs(csi_dsa_t *dsa, uint8_t *prikey, uint8_t *pubkey); + +/** + \brief dsa sign + \param[in] ecc dsa handle to operate. + \param[in] d Pointer to the digest. + \param[out] privkey Pointer to the private key + \param[out] s Pointer to the signature + \return Error code \ref csi_error_t +*/ +csi_error_t csi_dsa_sign(csi_dsa_t *dsa, uint8_t *d, uint8_t *prikey, uint8_t *s); + +/** + \brief dsa verify + \param[in] ecc ecc handle to operate. + \param[in] d Pointer to the digest. + \param[out] privkey Pointer to the private key + \param[out] s Pointer to the signature + \return verify result +*/ +bool csi_dsa_verify(csi_dsa_t *dsa, uint8_t *d, uint8_t *pubkey, uint8_t *s); + +#ifdef __cplusplus +} +#endif + +#endif \ No newline at end of file diff --git a/lib/sec_library/include/ecc.h b/lib/sec_library/include/ecc.h old mode 100755 new mode 100644 index 58540647..f2054d5c --- a/lib/sec_library/include/ecc.h +++ b/lib/sec_library/include/ecc.h @@ -23,7 +23,7 @@ extern "C" { #define CSI_ECC_PUBKEY_LEN (65-1) #define CSI_ECC_PRIVKEY_LEN (32) #define CSI_ECC_PUBKEYTMP_LEN (65) -#define CSI_ECC_RK_LEN (24) //random +#define CSI_ECC_RK_LEN (32) /*random*/ #define CSI_ECC_SIGNATURE_LEN (64) #define CSI_ECC_DIGEST_LEN (32) @@ -31,7 +31,7 @@ extern "C" { #define ECC_PRIME_CURVE_P_BYTES (70) typedef struct { - uint32_t ecc_curve : 1; ///< supports 256bits curve + uint32_t ecc_curve : 1; /*supports 256bits curve*/ } ecc_capabilities_t; /** @@ -46,8 +46,8 @@ typedef enum { \brief ECC endian mode */ typedef enum { - ECC_ENDIAN_LITTLE = 0, ///< Little Endian - ECC_ENDIAN_BIG ///< Big Endian + ECC_ENDIAN_LITTLE = 0, /*Little Endian*/ + ECC_ENDIAN_BIG /*Big Endian*/ } ecc_endian_mode_e; /** @@ -64,12 +64,12 @@ typedef enum { ECC_Role_Sponsor = 0, ECC_Role_Responsor } ecc_exchange_role_e; /****** ECC Event *****/ typedef enum { - ECC_EVENT_MAKE_KEY_COMPLETE = 0, ///< Make key completed - ECC_EVENT_ENCRYPT_COMPLETE, ///< Encrypt completed - ECC_EVENT_DECRYPT_COMPLETE, ///< Decrypt completed - ECC_EVENT_SIGN_COMPLETE, ///< Sign completed - ECC_EVENT_VERIFY_COMPLETE, ///< Verify completed - ECC_EVENT_EXCHANGE_KEY_COMPLETE, ///< Exchange key completed + ECC_EVENT_MAKE_KEY_COMPLETE = 0, /*Make key completed*/ + ECC_EVENT_ENCRYPT_COMPLETE, /*Encrypt completed*/ + ECC_EVENT_DECRYPT_COMPLETE, /*Decrypt completed*/ + ECC_EVENT_SIGN_COMPLETE, /*Sign completed*/ + ECC_EVENT_VERIFY_COMPLETE, /*Verify completed*/ + ECC_EVENT_EXCHANGE_KEY_COMPLETE, /*Exchange key completed*/ } ecc_event_e; /** @@ -93,7 +93,7 @@ typedef struct { \brief ECC status */ typedef struct { - uint32_t busy : 1; ///< Calculate busy flag + uint32_t busy : 1; /*Calculate busy flag*/ } csi_ecc_state_t; /** @@ -107,7 +107,7 @@ typedef struct { ecc_prime_curve_type type; } csi_ecc_t; -///< Pointer to \ref csi_ecc_callback_t : ECC Event call back. +/*Pointer to \ref csi_ecc_callback_t : ECC Event call back.*/ typedef void (*csi_ecc_callback_t)(ecc_event_e event); /** @@ -300,7 +300,7 @@ csi_error_t csi_ecc_enable_pm(csi_ecc_t *ecc); void csi_ecc_disable_pm(csi_ecc_t *ecc); #ifdef __cplusplus -extern "C" { +} #endif #endif \ No newline at end of file diff --git a/lib/sec_library/include/ecdh.h b/lib/sec_library/include/ecdh.h old mode 100755 new mode 100644 index cf1db702..91f2c2ed --- a/lib/sec_library/include/ecdh.h +++ b/lib/sec_library/include/ecdh.h @@ -37,7 +37,7 @@ extern "C" { csi_error_t csi_ecdh_calc_secret(csi_ecc_t *ecc, uint8_t privkey[32], uint8_t pubkey[65], uint8_t shareKey[32], uint32_t *len); #ifdef __cplusplus -extern "C" { +} #endif #endif \ No newline at end of file diff --git a/lib/sec_library/include/kdf.h b/lib/sec_library/include/kdf.h old mode 100755 new mode 100644 diff --git a/lib/sec_library/include/keyram.h b/lib/sec_library/include/keyram.h old mode 100755 new mode 100644 diff --git a/lib/sec_library/include/list.h b/lib/sec_library/include/list.h old mode 100755 new mode 100644 index 80028214..e19ce66b --- a/lib/sec_library/include/list.h +++ b/lib/sec_library/include/list.h @@ -168,8 +168,10 @@ static inline int dlist_empty(const dlist_t *head) \param[in] member The name of the variable within the struct \return None */ +#ifndef list_entry #define list_entry(ptr, type, member) \ aos_container_of(ptr, type, member) +#endif /** diff --git a/lib/sec_library/include/rambus.h b/lib/sec_library/include/rambus.h old mode 100755 new mode 100644 diff --git a/lib/sec_library/include/rng.h b/lib/sec_library/include/rng.h old mode 100755 new mode 100644 index 1b9a911b..39edcfd1 --- a/lib/sec_library/include/rng.h +++ b/lib/sec_library/include/rng.h @@ -22,16 +22,10 @@ extern "C" { /** \brief Get data from the TNG engine \param[out] Data Pointer to buffer with data get from TNG - \param[in] Num Number of data items,uinit in uint32 + \param[in] Size Size of data items,uinit in uint32 \return Error code \ref csi_error_t */ -csi_error_t csi_rng_get_multi_word(uint32_t *data, uint32_t num); - -/** - \brief Get data from the TNG engine - \return Error code \ref csi_error_t -*/ -csi_error_t csi_rng_get_single_word(uint32_t* data); +csi_error_t csi_rng_get_random_bytes(uint8_t *data, uint32_t size); #ifdef __cplusplus } diff --git a/lib/sec_library/include/rsa.h b/lib/sec_library/include/rsa.h old mode 100755 new mode 100644 index 7c842663..e7ee13c4 --- a/lib/sec_library/include/rsa.h +++ b/lib/sec_library/include/rsa.h @@ -40,24 +40,52 @@ extern "C" { #define RSA_SHA384_OID_LEN (6 + 9 + 4) #define RSA_SHA512_OID_LEN (6 + 9 + 4) +#define RSA_192_A_LEN_WORDS (0x03) +#define RSA_192_B_LEN_WORDS (0x03) +#define RSA_192_D_LEN_WORDS (0x18) + +#define RSA_256_A_LEN_WORDS (0x04) +#define RSA_256_B_LEN_WORDS (0x04) +#define RSA_256_D_LEN_WORDS (0x20) + +#define RSA_512_A_LEN_WORDS (0x08) +#define RSA_512_B_LEN_WORDS (0x08) +#define RSA_512_D_LEN_WORDS (0x40) + +#define RSA_1024_A_LEN_WORDS (0x10) +#define RSA_1024_B_LEN_WORDS (0x10) +#define RSA_1024_D_LEN_WORDS (0x80) + +#define RSA_2048_A_LEN_WORDS (0x20) +#define RSA_2048_B_LEN_WORDS (0x20) +#define RSA_2048_D_LEN_WORDS (0x100) + +#define RSA_3072_A_LEN_WORDS (0x30) +#define RSA_3072_B_LEN_WORDS (0x30) +#define RSA_3072_D_LEN_WORDS (0x180) + +#define RSA_4096_A_LEN_WORDS (0x40) +#define RSA_4096_B_LEN_WORDS (0x40) +#define RSA_4096_D_LEN_WORDS (0x200) + /*----- RSA Control Codes: Mode Parameters: Key Bits -----*/ typedef enum { - RSA_KEY_BITS_192 = 0, ///< 192 Key bits - RSA_KEY_BITS_256, ///< 256 Key bits - RSA_KEY_BITS_512, ///< 512 Key bits - RSA_KEY_BITS_1024, ///< 1024 Key bits - RSA_KEY_BITS_2048, ///< 2048 Key bits - RSA_KEY_BITS_3072, ///< 3072 Key bits - RSA_KEY_BITS_4096 ///< 4096 Key bits + RSA_KEY_BITS_192 = 0, /*192 Key bits*/ + RSA_KEY_BITS_256, /*256 Key bits*/ + RSA_KEY_BITS_512, /*512 Key bits*/ + RSA_KEY_BITS_1024, /*1024 Key bits*/ + RSA_KEY_BITS_2048, /*2048 Key bits*/ + RSA_KEY_BITS_3072, /*3072 Key bits*/ + RSA_KEY_BITS_4096 /*4096 Key bits*/ } csi_rsa_key_bits_t; typedef enum { - RSA_PADDING_MODE_NO = 0, ///< RSA NO Padding Mode - RSA_PADDING_MODE_PKCS1, ///< RSA PKCS1 Padding Mode - RSA_PADDING_MODE_PKCS1_OAEP, ///< RSA PKCS1 OAEP Padding Mode - RSA_PADDING_MODE_SSLV23, ///< RSA SSLV23 Padding Mode - RSA_PADDING_MODE_X931, ///< RSA X931 Padding Mode - RSA_PADDING_MODE_PSS ///< RSA PSS Padding Mode + RSA_PADDING_MODE_NO = 0, /*RSA NO Padding Mode*/ + RSA_PADDING_MODE_PKCS1, /*RSA PKCS1 Padding Mode*/ + RSA_PADDING_MODE_PKCS1_OAEP, /*RSA PKCS1 OAEP Padding Mode*/ + RSA_PADDING_MODE_SSLV23, /*RSA SSLV23 Padding Mode*/ + RSA_PADDING_MODE_X931, /*RSA X931 Padding Mode*/ + RSA_PADDING_MODE_PSS /*RSA PSS Padding Mode*/ } csi_rsa_padding_type_t; typedef enum { @@ -69,6 +97,30 @@ typedef enum { RSA_HASH_TYPE_SHA512 } csi_rsa_hash_type_t; +typedef enum { + RSA_CRT_DISABLE = 0, + RSA_CRT_ENABLE = 1, +} csi_rsa_crt_t; + +typedef enum { + RSA_HASH_DISABLE = 0, + RSA_HASH_ENABLE = 1, +} csi_rsa_hash_t; + +typedef struct { + csi_rsa_key_bits_t type; + uint32_t rsa_pka_dp_offset; + uint32_t rsa_pka_dq_offset; + uint32_t rsa_pka_p_offset; + uint32_t rsa_pka_q_offset; + uint32_t rsa_pka_qinv_offset; + uint32_t rsa_pka_m_offset; + uint32_t rsa_pka_r_offset; + uint32_t rsa_pka_A_len; + uint32_t rsa_pka_B_len; + uint32_t rsa_pka_D_len; +} csi_rsa_pka_offset_t; + typedef struct { csi_rsa_hash_type_t hash_type; uint32_t oid_len; @@ -76,19 +128,26 @@ typedef struct { }RSA_OID; typedef struct { - void *n; ///< Pointer to the public modulus - void *e; ///< Pointer to the public exponent - void *d; ///< Pointer to the private exponent - csi_rsa_key_bits_t key_bits; ///< RSA KEY BITS - csi_rsa_padding_type_t padding_type; ///< RSA PADDING TYPE + void *n; /*Pointer to the public modulus*/ + void *e; /*Pointer to the public exponent*/ + void *d; /*Pointer to the private exponent*/ + void *p; + void *q; + void *dp; + void *dq; + void *qinv; + csi_rsa_crt_t is_crt; + csi_rsa_hash_t is_hash; + csi_rsa_key_bits_t key_bits; /*RSA KEY BITS*/ + csi_rsa_padding_type_t padding_type; /*RSA PADDING TYPE*/ } csi_rsa_context_t; /** \brief RSA State */ typedef struct { - uint8_t busy : 1; ///< Calculate busy flag - uint8_t error : 1; ///< Calculate error flag + uint8_t busy : 1; /*Calculate busy flag*/ + uint8_t error : 1; /*Calculate error flag*/ } csi_rsa_state_t; typedef struct { @@ -113,13 +172,13 @@ typedef struct { /****** RSA Event *****/ typedef enum { - RSA_EVENT_COMPLETE = 0, ///< rsa event completed + RSA_EVENT_COMPLETE = 0, /*rsa event completed*/ RSA_EVENT_VERIFY_SUCCESS, RSA_EVENT_VERIFY_FAILED, - RSA_EVENT_ERROR, ///< error event + RSA_EVENT_ERROR, /*error event*/ } csi_rsa_event_t; -typedef void (*csi_rsa_callback_t)(csi_rsa_t *rsa, csi_rsa_event_t event, void *arg); ///< Pointer to \ref csi_rsa_callback_t : RSA Event call back. +typedef void (*csi_rsa_callback_t)(csi_rsa_t *rsa, csi_rsa_event_t event, void *arg); /*Pointer to \ref csi_rsa_callback_t : RSA Event call back.*/ /** \brief Initialize RSA Interface. 1. Initializes the resources needed for the RSA interface 2.registers event callback function diff --git a/lib/sec_library/include/sec_crypto_aes.h b/lib/sec_library/include/sec_crypto_aes.h index 0e5714b1..a4b4f2c0 100755 --- a/lib/sec_library/include/sec_crypto_aes.h +++ b/lib/sec_library/include/sec_crypto_aes.h @@ -35,17 +35,17 @@ extern "C" { \brief AES data transfer mode config */ typedef enum { - SC_AES_SLAVE_MODE = 0U, ///< slave mode - SC_AES_DMA_MODE, ///< dma mode + SC_AES_SLAVE_MODE = 0U, /*slave mode*/ + SC_AES_DMA_MODE, /*dma mode*/ } sc_aes_trans_mode_t; /** \brief AES key-len-bits type */ typedef enum { - SC_AES_KEY_LEN_BITS_128 = 0U, ///< 128 Data bits - SC_AES_KEY_LEN_BITS_192, ///< 192 Data bits - SC_AES_KEY_LEN_BITS_256 ///< 256 Data bits + SC_AES_KEY_LEN_BITS_128 = 0U, /*128 Data bits*/ + SC_AES_KEY_LEN_BITS_192, /*192 Data bits*/ + SC_AES_KEY_LEN_BITS_256 /*256 Data bits*/ } sc_aes_key_bits_t; /** @@ -60,7 +60,6 @@ typedef struct { #endif #ifdef CONFIG_CSI_V2 csi_aes_t csi_aes; - //unsigned char sc_ctx[SC_AES_CTX_SIZE]; #endif #endif #if defined(CONFIG_TEE_CA) @@ -70,10 +69,9 @@ typedef struct { #if defined(CONFIG_SEC_CRYPTO_AES_SW) sc_mbedtls_aes_context aes_ctx; #endif - //void *ctx; } sc_aes_t; -// Function documentation +/*Function documentation*/ /** \brief Initialize AES Interface. Initializes the resources needed for the AES interface \param[in] aes operate handle @@ -311,7 +309,7 @@ uint32_t sc_aes_ccm_decrypt(sc_aes_t *aes, void *in, void *out,uint32_t size, ui /** \brief Aes data transfer config */ -void sc_aes_trans_config(sc_aes_t *aes, sc_aes_trans_mode_t mode) ; +uint32_t sc_aes_trans_config(sc_aes_t *aes, sc_aes_trans_mode_t mode) ; #ifdef __cplusplus } diff --git a/lib/sec_library/include/sec_crypto_common.h b/lib/sec_library/include/sec_crypto_common.h old mode 100755 new mode 100644 index f95322fd..e3e484eb --- a/lib/sec_library/include/sec_crypto_common.h +++ b/lib/sec_library/include/sec_crypto_common.h @@ -20,7 +20,10 @@ #include "sec_crypto_sha.h" #include "sec_crypto_sm2.h" #include "sec_crypto_sm4.h" - +#include "sec_crypto_des.h" +#include "sec_crypto_dsa.h" +#include "sec_crypto_ecc.h" +#include "sec_crypto_ecdh.h" #define SC_lOG(...) #endif diff --git a/lib/sec_library/include/sec_crypto_curve25519.h b/lib/sec_library/include/sec_crypto_curve25519.h new file mode 100644 index 00000000..d8ef3658 --- /dev/null +++ b/lib/sec_library/include/sec_crypto_curve25519.h @@ -0,0 +1,95 @@ +/* + * Copyright (C) 2017-2022 Alibaba Group Holding Limited + */ +/****************************************************************************** + * @file sec_crypto_curve25519.h + * @brief Header File for curve25519( a state-of-the-art Diffie-Hellman function) + * @version V3.3 + * @date 10. June 2022 + * @model ecdh + ******************************************************************************/ +#ifndef _SC_CURVE25519_H_ +#define _SC_CURVE25519_H_ +#include "sec_include_config.h" + +#define CONFIG_SEC_CRYPTO_CURVE25519 + +#ifdef CONFIG_SEC_CRYPTO_CURVE25519 + +#ifdef __cplusplus +extern "C" { +#endif + +#ifdef SEC_LIB_VERSION +#include "drv/curve25519.h" +#include "sec_crypto_curve25519.h" +#else +#include "curve25519.h" +#include "sec_crypto_curve25519.h" +#endif + +typedef struct { +#ifdef CONFIG_CSI_V2 + csi_curve25519_t ctx; +#endif +} sc_curve25519_t; + +/** + \brief Initialize CURVE25519. + \param[in] idx device id + \return Error code \ref csi_error_t +*/ +csi_error_t sc_curve25519_init(void *ctx, uint32_t idx); + +/** + \brief De-initialize CURVE25519 Interface. stops operation and releases the software resources used by the interface + \param[in] curve25519 ecc handle to operate. + \return none +*/ +void sc_curve25519_uninit(void *ctx); + +/** + \brief curve25519 gen public key + \param[in] ctx ctx handle to operate. + \param[in] privkey Pointer to the A(or B) private key. + \param[out] pubkey Pointer to the A(or B) public key. + \return \ref uint32_t. +*/ +uint32_t sc_curve25519_gen_pubkey(void *ctx, const uint8_t privkey[32], uint8_t pubkey[32]); + +/** + \brief curve25519 gen key pair + \param[in] ctx ctx handle to operate. + \param[out] privkey Pointer to the A(or B) private key. + \param[out] pubkey Pointer to the A(or B) public key. + \return \ref uint32_t. +*/ +uint32_t sc_curve25519_gen_keypair(void *ctx, uint8_t privkey[32], uint8_t pubkey[32]); + +/** + \brief curve25519 check key pair + \param[in] ctx ctx handle to operate. + \param[in] privkey Pointer to the A(or B) private key. + \param[in] pubkey Pointer to the A(or B) public key. + \return \ref uint32_t. +*/ +uint32_t sc_curve25519_check_keypair(void *ctx, const uint8_t privkey[32], const uint8_t pubkey[32]); + +/** + \brief curve25519 check key pair + \param[in] ctx ctx handle to operate. + \param[in] privkey Pointer to the B(or A) private key. + \param[in] pubkey Pointer to the A(or B) public key. + \param[out] sk Pointer to the share key. + \param[out] sk_len Pointer to the share key length byte. + \return \ref uint32_t. +*/ +uint32_t sc_curve25519_calc_secret(void *ctx, const uint8_t privkey[32], const uint8_t pubkey[32], uint8_t sk[32], uint32_t *sk_len); + +#ifdef __cplusplus +} +#endif + +#endif + +#endif /* _SC_CURVE15519_H_ */ diff --git a/lib/sec_library/include/sec_crypto_des.h b/lib/sec_library/include/sec_crypto_des.h index 0b077412..9cfe2de5 100755 --- a/lib/sec_library/include/sec_crypto_des.h +++ b/lib/sec_library/include/sec_crypto_des.h @@ -35,17 +35,17 @@ extern "C" { \brief DES data transfer mode config */ typedef enum { - SC_DES_SLAVE_MODE = 0U, ///< slave mode - SC_DES_DMA_MODE, ///< dma mode + SC_DES_SLAVE_MODE = 0U, /*slave mode*/ + SC_DES_DMA_MODE, /*dma mode*/ } sc_des_trans_mode_t; /** \brief DES key-len-bits type */ typedef enum { - SC_DES_KEY_LEN_BITS_64 = 0U, ///< 64 Data bits - SC_DES_KEY_LEN_BITS_128, ///< 128 Data bits - SC_TDES_KEY_LEN_BITS_192, ///< 192 Data bits + SC_DES_KEY_LEN_BITS_64 = 0U, /*64 Data bits*/ + SC_TDES_KEY_LEN_BITS_128, /*128 Data bits*/ + SC_TDES_KEY_LEN_BITS_192, /*192 Data bits*/ } sc_des_key_bits_t; /** @@ -60,7 +60,6 @@ typedef struct { #endif #ifdef CONFIG_CSI_V2 csi_des_t csi_des; - //unsigned char sc_ctx[SC_DES_CTX_SIZE]; #endif #endif #if defined(CONFIG_TEE_CA) @@ -70,7 +69,6 @@ typedef struct { #if defined(CONFIG_SEC_CRYPTO_DES_SW) sc_mbedtls_des_context des_ctx; #endif - //void *ctx; } sc_des_t; // Function documentation @@ -196,7 +194,7 @@ uint32_t sc_tdes_cbc_decrypt(sc_des_t *des, void *in, void *out, uint32_t size, \param[in] mode \ref sc_des_trans_mode_t \return None */ -void sc_des_trans_config(sc_des_t *des, sc_des_trans_mode_t mode) ; +uint32_t sc_des_trans_config(sc_des_t *des, sc_des_trans_mode_t mode) ; #ifdef __cplusplus } diff --git a/lib/sec_library/include/sec_crypto_dsa.h b/lib/sec_library/include/sec_crypto_dsa.h new file mode 100644 index 00000000..b28139a0 --- /dev/null +++ b/lib/sec_library/include/sec_crypto_dsa.h @@ -0,0 +1,109 @@ +/* + * Copyright (C) 2017-2022 Alibaba Group Holding Limited + */ +/****************************************************************************** + * @file sec_crypt_dsa.h + * @brief Header File for DSA + * @version V3.3 + * @date 05. Dec 2022 + * @model dsa + ******************************************************************************/ +#ifndef _SC_DSA_H_ +#define _SC_DSA_H_ +#include "sec_include_config.h" + +#define CONFIG_SEC_CRYPTO_DSA + +#ifdef CONFIG_SEC_CRYPTO_DSA + +#ifdef __cplusplus +extern "C" { +#endif + +#ifdef SEC_LIB_VERSION +#include "drv/dsa.h" +#else +#include "dsa.h" +#endif + +typedef enum{ + SC_DSA_SHA1 = 0, + SC_DSA_SHA224, + SC_DSA_SHA256, + SC_DSA_SHA_MAX, +}sc_dsa_sha_type; + +/** +\brief DSA status +*/ +typedef struct { + uint32_t busy : 1; /*Calculate busy flag*/ +} sc_dsa_state_t; + +typedef struct { +#ifdef CONFIG_CSI_V2 + csi_dsa_t dsa; +#endif +} sc_dsa_t; + +/** + \brief Initialize DSA. + \param[in] dsa dsa handle to operate. + \param[in] idx device id + \return \ref uint32_t +*/ +uint32_t sc_dsa_init(sc_dsa_t *dsa, uint32_t idx); + +/** + \brief De-initialize ECC Interface. stops operation and releases the + software resources used by the interface \param[in] dsa dsa handle to + operate. \return none +*/ +void sc_dsa_uninit(sc_dsa_t *dsa); + +/** + \brief Initialize DSA. + \param[in] dsa dsa handle to operate. + \param[in] idx device id + \return \ref uint32_t +*/ +uint32_t sc_dsa_config(sc_dsa_t *dsa, sc_dsa_sha_type type); + +/** + \brief dsa gen key pairs + \param[in] dsa dsa handle to operate. + \param[out] privkey Pointer to the private key + \param[out] pubkey Pointer to the public key + \return Error code \ref csi_error_t +*/ +uint32_t sc_dsa_gen_keypairs(sc_dsa_t *dsa, uint8_t *prikey, uint8_t *pubkey); + +/** + \brief dsa sign + \param[in] dsa dsa handle to operate. + \param[in] d Pointer to the digest. + \param[out] privkey Pointer to the private key + \param[out] s Pointer to the signature + \return \ref uint32_t +*/ +uint32_t sc_dsa_sign(sc_dsa_t *dsa, uint8_t *d, uint8_t *prikey, uint8_t *s); + +/** + \brief dsa verify + \param[in] dsa dsa handle to operate. + \param[in] d Pointer to the digest. + \param[out] privkey Pointer to the private key + \param[out] s Pointer to the signature + \return verify result +*/ +bool sc_dsa_verify(sc_dsa_t *dsa, uint8_t *d, uint8_t *pubkey, uint8_t *s); + + +#ifdef __cplusplus +} +#endif + +#endif + +#endif /* _SC_ECC_H_ */ + diff --git a/lib/sec_library/include/sec_crypto_ecc.h b/lib/sec_library/include/sec_crypto_ecc.h old mode 100755 new mode 100644 index 04fae214..30d90531 --- a/lib/sec_library/include/sec_crypto_ecc.h +++ b/lib/sec_library/include/sec_crypto_ecc.h @@ -39,8 +39,8 @@ typedef enum { } sc_ecc_cipher_order_e; typedef enum { - SC_ECC_ENDIAN_LITTLE = 0, ///< Little Endian - SC_ECC_ENDIAN_BIG ///< Big Endian + SC_ECC_ENDIAN_LITTLE = 0, /*Little Endian*/ + SC_ECC_ENDIAN_BIG /*Big Endian*/ } sc_ecc_endian_mode_e; /** @@ -50,23 +50,23 @@ typedef enum { SC_ECC_Role_Sponsor = 0, SC_ECC_Role_Responsor } sc_ecc_exchange_ /****** ECC Event *****/ typedef enum { - SC_ECC_EVENT_MAKE_KEY_COMPLETE = 0, ///< Make key completed - SC_ECC_EVENT_ENCRYPT_COMPLETE, ///< Encrypt completed - SC_ECC_EVENT_DECRYPT_COMPLETE, ///< Decrypt completed - SC_ECC_EVENT_SIGN_COMPLETE, ///< Sign completed - SC_ECC_EVENT_VERIFY_COMPLETE, ///< Verify completed - SC_ECC_EVENT_EXCHANGE_KEY_COMPLETE, ///< Exchange key completed + SC_ECC_EVENT_MAKE_KEY_COMPLETE = 0, /*Make key completed*/ + SC_ECC_EVENT_ENCRYPT_COMPLETE, /*Encrypt completed*/ + SC_ECC_EVENT_DECRYPT_COMPLETE, /*Decrypt completed*/ + SC_ECC_EVENT_SIGN_COMPLETE, /*Sign completed*/ + SC_ECC_EVENT_VERIFY_COMPLETE, /*Verify completed*/ + SC_ECC_EVENT_EXCHANGE_KEY_COMPLETE, /*Exchange key completed*/ } sc_ecc_event_e; typedef struct { - uint32_t ecc_curve : 1; ///< supports 256bits curve + uint32_t ecc_curve : 1; /*supports 256bits curve*/ } sc_ecc_capabilities_t; /** \brief ECC status */ typedef struct { - uint32_t busy : 1; ///< Calculate busy flag + uint32_t busy : 1; /*Calculate busy flag*/ } sc_ecc_state_t; typedef struct { @@ -75,7 +75,7 @@ typedef struct { #endif } sc_ecc_t; -///< Pointer to \ref sc_ecc_callback_t : ECC Event call back. +/*Pointer to \ref sc_ecc_callback_t : ECC Event call back.*/ typedef void (*sc_ecc_callback_t)(sc_ecc_event_e event); /** @@ -256,7 +256,7 @@ uint32_t sc_ecc_getE(sc_ecc_t *ecc, uint8_t *m, uint32_t len, uint8_t z[32], uint32_t sc_ecc_get_state(sc_ecc_t *ecc, sc_ecc_state_t *state); #ifdef __cplusplus -extern "C" { +} #endif #endif diff --git a/lib/sec_library/include/sec_crypto_ecdh.h b/lib/sec_library/include/sec_crypto_ecdh.h old mode 100755 new mode 100644 index 83f52f8c..73020250 --- a/lib/sec_library/include/sec_crypto_ecdh.h +++ b/lib/sec_library/include/sec_crypto_ecdh.h @@ -45,7 +45,7 @@ uint32_t sc_ecdh_calc_secret(sc_ecc_t *ecc, uint8_t privkey[32], uint32_t *len, sc_ecc_curve_type type) ; #ifdef __cplusplus -extern "C" { +} #endif #endif diff --git a/lib/sec_library/include/sec_crypto_kdf.h b/lib/sec_library/include/sec_crypto_kdf.h old mode 100755 new mode 100644 diff --git a/lib/sec_library/include/sec_crypto_mac.h b/lib/sec_library/include/sec_crypto_mac.h old mode 100755 new mode 100644 diff --git a/lib/sec_library/include/sec_crypto_rng.h b/lib/sec_library/include/sec_crypto_rng.h index c133b0dc..fd79f184 100755 --- a/lib/sec_library/include/sec_crypto_rng.h +++ b/lib/sec_library/include/sec_crypto_rng.h @@ -23,16 +23,10 @@ extern "C" { /** \brief Get data from the TRNG engine \param[out] data Pointer to buffer with data get from TRNG - \param[in] num Number of data items in bytes + \param[in] size Size of data items in bytes \return error code */ -uint32_t sc_rng_get_multi_byte(uint8_t *data, uint32_t num); - -/** - \brief Get data from the TRNG engine - \return error code -*/ -uint32_t sc_rng_get_single_word(uint32_t *data); +uint32_t sc_rng_get_random_bytes(uint8_t *data, uint32_t size); #ifdef __cplusplus } diff --git a/lib/sec_library/include/sec_crypto_rsa.h b/lib/sec_library/include/sec_crypto_rsa.h index b08a8f0c..1e8d4b7b 100755 --- a/lib/sec_library/include/sec_crypto_rsa.h +++ b/lib/sec_library/include/sec_crypto_rsa.h @@ -40,26 +40,26 @@ extern "C" { #include "sec_crypto_errcode.h" -//TODO Del this file after updating to sc2.0 +/*TODO Del this file after updating to sc2.0*/ /*----- RSA Control Codes: Mode Parameters: Key Bits -----*/ typedef enum { - SC_RSA_KEY_BITS_192 = 0, ///< 192 Key bits - SC_RSA_KEY_BITS_256, ///< 256 Key bits - SC_RSA_KEY_BITS_512, ///< 512 Key bits - SC_RSA_KEY_BITS_1024, ///< 1024 Key bits - SC_RSA_KEY_BITS_2048, ///< 2048 Key bits - SC_RSA_KEY_BITS_3072, ///< 3072 Key bits - SC_RSA_KEY_BITS_4096 ///< 4096 Key bits + SC_RSA_KEY_BITS_192 = 0, /*192 Key bits*/ + SC_RSA_KEY_BITS_256, /*256 Key bits*/ + SC_RSA_KEY_BITS_512, /*512 Key bits*/ + SC_RSA_KEY_BITS_1024, /*1024 Key bits*/ + SC_RSA_KEY_BITS_2048, /*2048 Key bits*/ + SC_RSA_KEY_BITS_3072, /*3072 Key bits*/ + SC_RSA_KEY_BITS_4096 /*4096 Key bits*/ } sc_rsa_key_bits_t; typedef enum { - SC_RSA_PADDING_MODE_NO = 0, ///< RSA NO Padding Mode - SC_RSA_PADDING_MODE_PKCS1, ///< RSA PKCS1 Padding Mode - SC_RSA_PADDING_MODE_PKCS1_OAEP, ///< RSA PKCS1 OAEP Padding Mode - SC_RSA_PADDING_MODE_SSLV23, ///< RSA SSLV23 Padding Mode - SC_RSA_PADDING_MODE_X931, ///< RSA X931 Padding Mode - SC_RSA_PADDING_MODE_PSS ///< RSA PSS Padding Mode + SC_RSA_PADDING_MODE_NO = 0, /*RSA NO Padding Mode*/ + SC_RSA_PADDING_MODE_PKCS1, /*RSA PKCS1 Padding Mode*/ + SC_RSA_PADDING_MODE_PKCS1_OAEP, /*RSA PKCS1 OAEP Padding Mode*/ + SC_RSA_PADDING_MODE_SSLV23, /*RSA SSLV23 Padding Mode*/ + SC_RSA_PADDING_MODE_X931, /*RSA X931 Padding Mode*/ + SC_RSA_PADDING_MODE_PSS /*RSA PSS Padding Mode*/ } sc_rsa_padding_type_t; typedef enum { @@ -71,25 +71,40 @@ typedef enum { SC_RSA_HASH_TYPE_SHA512 } sc_rsa_hash_type_t; +typedef enum { + SC_RSA_CRT_DISABLE = 0, + SC_RSA_CRT_ENABLE, +} sc_rsa_crt_t; + +typedef enum { + SC_RSA_HASH_DISABLE = 0, + SC_RSA_HASH_ENABLE, +} sc_rsa_hash_t; + + +/* the private key is the quintuplet(p, q, qinv, dp, dq) with CRT */ typedef struct { -// #if (defined(CONFIG_SYSTEM_SECURE) && defined(CONFIG_CSI_V2)) -// csi_rsa_context_t rsa_ctx; -// #else - void * n; ///< Pointer to the public modulus - void * e; ///< Pointer to the public exponent - void * d; ///< Pointer to the private exponent - sc_rsa_key_bits_t key_bits; ///< RSA KEY BITS - sc_rsa_padding_type_t padding_type; ///< RSA PADDING TYPE - sc_rsa_hash_type_t hash_type; -// #endif + void * n; /*Pointer to the public modulus*/ + void * e; /*Pointer to the public exponent*/ + void * d; /*Pointer to the private exponent*/ + void * p; /*Pointer to the private key param p with CRT*/ + void * q; /*Pointer to the private key param q with CRT*/ + void * dp; /*Pointer to the private key param dp with CRT*/ + void * dq; /*Pointer to the private key param dq with CRT*/ + void * qinv; /*Pointer to the private key param qinv with CRT*/ + sc_rsa_crt_t is_crt; /*Enable RSA with CRT*/ + sc_rsa_hash_t is_hash; /*Enable RSA with HASH*/ + sc_rsa_key_bits_t key_bits; /*RSA KEY BITS*/ + sc_rsa_padding_type_t padding_type; /*RSA PADDING TYPE*/ + sc_rsa_hash_type_t hash_type; } sc_rsa_context_t; /** \brief RSA State */ typedef struct { - uint8_t busy : 1; ///< Calculate busy flag - uint8_t error : 1; ///< Calculate error flag + uint8_t busy : 1; /*Calculate busy flag*/ + uint8_t error : 1; /*Calculate error flag*/ } sc_rsa_state_t; typedef struct { @@ -109,17 +124,17 @@ typedef struct { /****** RSA Event *****/ typedef enum { - SC_RSA_EVENT_COMPLETE = 0, ///< rsa event completed + SC_RSA_EVENT_COMPLETE = 0, /*rsa event completed*/ SC_RSA_EVENT_VERIFY_SUCCESS, SC_RSA_EVENT_VERIFY_FAILED, - SC_RSA_EVENT_ERROR, ///< error event + SC_RSA_EVENT_ERROR, /*error event*/ } sc_rsa_event_t; typedef void (*sc_rsa_callback_t)( sc_rsa_t *rsa, sc_rsa_event_t event, - void *arg); ///< Pointer to \ref sc_rsa_callback_t : RSA Event call back. + void *arg); /*Pointer to \ref sc_rsa_callback_t : RSA Event call back.*/ -// Function documentation +/*Function documentation*/ /** \brief Initialize RSA Interface. 1. Initializes the resources needed for the RSA interface 2.registers event callback function diff --git a/lib/sec_library/include/sec_crypto_sha.h b/lib/sec_library/include/sec_crypto_sha.h index 3d45103c..6a3e2037 100755 --- a/lib/sec_library/include/sec_crypto_sha.h +++ b/lib/sec_library/include/sec_crypto_sha.h @@ -41,16 +41,24 @@ extern "C" { #endif +/** +\brief SHA data transfer mode config +*/ +typedef enum { + SC_SHA_SLAVE_MODE = 0U, /*slave mode*/ + SC_SHA_DMA_MODE, /*dma mode*/ +} sc_sha_trans_mode_t; + /*----- SHA Control Codes: Mode -----*/ typedef enum { - SC_SHA_MODE_SHA1 = 1U, ///< SHA_1 mode - SC_SHA_MODE_256, ///< SHA_256 mode - SC_SHA_MODE_224, ///< SHA_224 mode - SC_SHA_MODE_512, ///< SHA_512 mode - SC_SHA_MODE_384, ///< SHA_384 mode - SC_SHA_MODE_512_256, ///< SHA_512_256 mode - SC_SHA_MODE_512_224, ///< SHA_512_224 mode - SC_SHA_MODE_MD5, ///< MD5 mode + SC_SHA_MODE_SHA1 = 1U, /*SHA_1 mode*/ + SC_SHA_MODE_256, /*SHA_256 mode*/ + SC_SHA_MODE_224, /*SHA_224 mode*/ + SC_SHA_MODE_512, /*SHA_512 mode*/ + SC_SHA_MODE_384, /*SHA_384 mode*/ + SC_SHA_MODE_512_256, /*SHA_512_256 mode*/ + SC_SHA_MODE_512_224, /*SHA_512_224 mode*/ + SC_SHA_MODE_MD5, /*MD5 mode*/ SC_SM3_MODE, } sc_sha_mode_t; @@ -58,8 +66,8 @@ typedef enum { \brief SHA State */ typedef struct { - uint32_t busy : 1; ///< calculate busy flag - uint32_t error : 1; ///< calculate error flag + uint32_t busy : 1; /*calculate busy flag*/ + uint32_t error : 1; /*calculate error flag*/ } sc_sha_state_t; typedef struct { @@ -81,13 +89,13 @@ uint8_t ctx[SHA_CONTEXT_SIZE]; sc_mbedtls_sha1_context sha1_ctx; sc_mbedtls_sha256_context sha2_ctx; #endif - sc_sha_mode_t mode; ///< sha mode + sc_sha_mode_t mode; /*sha mode*/ } sc_sha_context_t; /****** SHA Event *****/ typedef enum { - SC_SHA_EVENT_COMPLETE = 0U, ///< calculate completed - SC_SHA_EVENT_ERROR ///< calculate error + SC_SHA_EVENT_COMPLETE = 0U, /*calculate completed*/ + SC_SHA_EVENT_ERROR /*calculate error*/ } sc_sha_event_t; typedef struct sc_sha { @@ -95,7 +103,7 @@ typedef struct sc_sha { #ifdef CONFIG_CSI_V1 sha_handle_t handle; sc_sha_context_t ctx; - sc_sha_mode_t mode; ///< sha mode + sc_sha_mode_t mode; /*sha mode*/ #endif /* CONFIG_CSI_V1 */ #ifdef CONFIG_CSI_V2 csi_sha_t csi_sha; @@ -199,6 +207,12 @@ uint32_t sc_sha_digest(sc_sha_t *sha, uint32_t idx, sc_sha_context_t *context, s \return error code \ref uint32_t */ uint32_t sc_sha_get_state(sc_sha_t *sha,sc_sha_context_t *context); + +/** + \brief Sha data transfer config +*/ +uint32_t sc_sha_trans_config(sc_sha_t *sha, sc_sha_context_t *context, sc_sha_trans_mode_t mode); + #ifdef __cplusplus } #endif diff --git a/lib/sec_library/include/sec_crypto_sm2.h b/lib/sec_library/include/sec_crypto_sm2.h index db04880b..aaaa5399 100755 --- a/lib/sec_library/include/sec_crypto_sm2.h +++ b/lib/sec_library/include/sec_crypto_sm2.h @@ -26,7 +26,7 @@ extern "C" { typedef struct { - uint32_t sm2_curve : 1; ///< supports 256bits curve + uint32_t sm2_curve : 1; /*supports 256bits curve*/ } sc_sm2_capabilities_t; /** @@ -38,15 +38,15 @@ typedef enum { } sc_sm2_cipher_order_e; typedef enum { - SC_SM2_ENDIAN_LITTLE = 0, ///< Little Endian - SC_SM2_ENDIAN_BIG ///< Big Endian + SC_SM2_ENDIAN_LITTLE = 0, /*Little Endian*/ + SC_SM2_ENDIAN_BIG /*Big Endian*/ } sc_sm2_endian_mode_e; /** \brief SM2 status */ typedef struct { - uint32_t busy : 1; ///< Calculate busy flag + uint32_t busy : 1; /*Calculate busy flag*/ } sc_sm2_state_t; /** @@ -56,12 +56,12 @@ typedef enum { SC_SM2_Role_Sponsor = 0, SC_SM2_Role_Responsor } sc_sm2_exchange_ /****** SM2 Event *****/ typedef enum { - SC_SM2_EVENT_MAKE_KEY_COMPLETE = 0, ///< Make key completed - SC_SM2_EVENT_ENCRYPT_COMPLETE, ///< Encrypt completed - SC_SM2_EVENT_DECRYPT_COMPLETE, ///< Decrypt completed - SC_SM2_EVENT_SIGN_COMPLETE, ///< Sign completed - SC_SM2_EVENT_VERIFY_COMPLETE, ///< Verify completed - SC_SM2_EVENT_EXCHANGE_KEY_COMPLETE, ///< Exchange key completed + SC_SM2_EVENT_MAKE_KEY_COMPLETE = 0, /*Make key completed*/ + SC_SM2_EVENT_ENCRYPT_COMPLETE, /*Encrypt completed*/ + SC_SM2_EVENT_DECRYPT_COMPLETE, /*Decrypt completed*/ + SC_SM2_EVENT_SIGN_COMPLETE, /*Sign completed*/ + SC_SM2_EVENT_VERIFY_COMPLETE, /*Verify completed*/ + SC_SM2_EVENT_EXCHANGE_KEY_COMPLETE, /*Exchange key completed*/ } sc_sm2_event_e; typedef struct { @@ -70,7 +70,7 @@ typedef struct { #endif } sc_sm2_t; -///< Pointer to \ref sc_sm2_callback_t : SM2 Event call back. +/*Pointer to \ref sc_sm2_callback_t : SM2 Event call back.*/ typedef void (*sc_sm2_callback_t)(sc_sm2_event_e event); /** @@ -239,7 +239,7 @@ uint32_t sc_sm2_getE(sc_sm2_t *sm2, uint8_t *m, uint32_t len, uint8_t z[32], uin uint32_t sc_sm2_get_state(sc_sm2_t *sm2, sc_sm2_state_t *state); #ifdef __cplusplus -extern "C" { +} #endif #endif diff --git a/lib/sec_library/include/sec_crypto_sm4.h b/lib/sec_library/include/sec_crypto_sm4.h index 408fa078..4307bd89 100755 --- a/lib/sec_library/include/sec_crypto_sm4.h +++ b/lib/sec_library/include/sec_crypto_sm4.h @@ -25,6 +25,14 @@ extern "C" { #endif +/** +\brief SM4 data transfer mode config +*/ +typedef enum { + SC_SM4_SLAVE_MODE = 0U, /*slave mode*/ + SC_SM4_DMA_MODE, /*dma mode*/ +} sc_sm4_trans_mode_t; + /** \brief SM4 Ctrl Block */ @@ -49,6 +57,11 @@ uint32_t sc_sm4_init(sc_sm4_t *sm4, uint32_t idx); */ void sc_sm4_uninit(sc_sm4_t *sm4); +/** + \brief Sm4 data transfer config +*/ +uint32_t sc_sm4_trans_config(sc_sm4_t *sm4, sc_sm4_trans_mode_t mode); + /** \brief Set encrypt key \param[in] sm4 handle to operate @@ -234,7 +247,7 @@ uint32_t sc_sm4_ctr_decrypt(sc_sm4_t *sm4, uint8_t *in, uint8_t *out, uint32_t size, uint8_t nonce_counter[16]); #ifdef __cplusplus -extern "C" { +} #endif #endif /* _SC_SM4_H_ */ diff --git a/lib/sec_library/include/sec_include_config.h b/lib/sec_library/include/sec_include_config.h old mode 100755 new mode 100644 diff --git a/lib/sec_library/include/sec_library.h b/lib/sec_library/include/sec_library.h index 7bdf25a4..0f4ad615 100755 --- a/lib/sec_library/include/sec_library.h +++ b/lib/sec_library/include/sec_library.h @@ -23,6 +23,10 @@ #include "sec_crypto_kdf.h" #include "csi_efuse_api.h" #include "csi_efuse_api.h" +#include "sec_crypto_des.h" +#include "sec_crypto_dsa.h" +#include "sec_crypto_ecc.h" +#include "sec_crypto_ecdh.h" #include "csi_sec_img_verify.h" /* NOTE add more header */ diff --git a/lib/sec_library/include/sha.h b/lib/sec_library/include/sha.h old mode 100755 new mode 100644 index 33e8baad..8cd0c70b --- a/lib/sec_library/include/sha.h +++ b/lib/sec_library/include/sha.h @@ -42,49 +42,58 @@ extern "C" { #define CSI_MD5_NEW_MODE (0x00000003) #define CSI_SHA1_NEW_MODE (0x00000005) +/** +\brief SHA data transfer mode config +*/ +typedef enum { + SHA_SLAVE_MODE = 0U, /*slave mode*/ + SHA_DMA_MODE, /*dma mode*/ +} csi_sha_trans_mode_t; + /****** SHA mode ******/ typedef enum { - SHA_MODE_SHA1 = 1U, ///< SHA_1 mode - SHA_MODE_256, ///< SHA_256 mode - SHA_MODE_224, ///< SHA_224 mode - SHA_MODE_512, ///< SHA_512 mode - SHA_MODE_384, ///< SHA_384 mode - SHA_MODE_512_256, ///< SHA_512_256 mode - SHA_MODE_512_224, ///< SHA_512_224 mode - SHA_MODE_MD5 ///< MD5 mode + SHA_MODE_SHA1 = 1U, /*SHA_1 mode*/ + SHA_MODE_256, /*SHA_256 mode*/ + SHA_MODE_224, /*SHA_224 mode*/ + SHA_MODE_512, /*SHA_512 mode*/ + SHA_MODE_384, /*SHA_384 mode*/ + SHA_MODE_512_256, /*SHA_512_256 mode*/ + SHA_MODE_512_224, /*SHA_512_224 mode*/ + SHA_MODE_MD5 /*MD5 mode*/ } csi_sha_mode_t; /****** SHA State ******/ typedef struct { - uint32_t busy : 1; ///< Calculate busy flag - uint32_t error : 1; ///< Calculate error flag + uint32_t busy : 1; /*Calculate busy flag*/ + uint32_t error : 1; /*Calculate error flag*/ } csi_sha_state_t; typedef struct { - csi_sha_mode_t mode; ///< SHA mode - uint32_t total[2]; ///< Number of bytes processed - uint32_t state[16]; ///< Intermediate digest state - uint8_t buffer[128]; ///< Data block being processed - uint8_t result[64]; ///< Data block has processed + csi_sha_mode_t mode; /*SHA mode*/ + uint32_t total[2]; /*Number of bytes processed*/ + uint32_t state[16]; /*Intermediate digest state*/ + uint8_t buffer[128]; /*Data block being processed*/ + uint8_t result[64]; /*Data block has processed*/ uint32_t process_len; uint32_t digest_len; + uint32_t is_dma; } csi_sha_context_t; /****** SHA Event ******/ typedef enum { - SHA_EVENT_COMPLETE = 0U, ///< Calculate completed + SHA_EVENT_COMPLETE = 0U, /*Calculate completed*/ SHA_EVENT_UPDATE, SHA_EVENT_START, - SHA_EVENT_ERROR ///< Calculate error + SHA_EVENT_ERROR /*Calculate error*/ } csi_sha_event_t; typedef struct csi_sha csi_sha_t; struct csi_sha { - csi_dev_t dev; ///< SHA hw-device info - void (*callback)(csi_sha_t *sha, csi_sha_event_t event, void *arg); ///< SHA event callback for user - void *arg; ///< SHA custom designed param passed to evt_cb - csi_sha_state_t state; ///< SHA state + csi_dev_t dev; /*SHA hw-device info*/ + void (*callback)(csi_sha_t *sha, csi_sha_event_t event, void *arg); /*SHA event callback for user*/ + void *arg; /*SHA custom designed param passed to evt_cb*/ + csi_sha_state_t state; /*SHA state*/ void *priv; }; @@ -180,6 +189,13 @@ csi_error_t csi_sha_enable_pm(csi_sha_t *sha); */ void csi_sha_disable_pm(csi_sha_t *sha); +/** + \brief Config SHA data transfer mode + \param[in] mode \ref csi_des_trans_mode_t + \return None +*/ +csi_error_t csi_sha_trans_config(csi_sha_t *sha, csi_sha_context_t *context, csi_sha_trans_mode_t mode); + #ifdef __cplusplus } #endif diff --git a/lib/sec_library/include/sm2.h b/lib/sec_library/include/sm2.h old mode 100755 new mode 100644 index f5a6834c..b9fd2f06 --- a/lib/sec_library/include/sm2.h +++ b/lib/sec_library/include/sm2.h @@ -23,7 +23,7 @@ extern "C" { #define CSI_SM2_PUBKEY_LEN (65-1) #define CSI_SM2_PRIVKEY_LEN (32) #define CSI_SM2_PUBKEYTMP_LEN (65) -#define CSI_SM2_RK_LEN (32) //random +#define CSI_SM2_RK_LEN (32) /*random*/ #define CSI_SM2_SIGNATURE_LEN (64) #define CSI_SM2_DIGEST_LEN (32) @@ -31,7 +31,7 @@ extern "C" { #define SM2_PRIME_CURVE_N_BYTES (32) typedef struct { - uint32_t sm2_curve : 1; ///< supports 256bits curve + uint32_t sm2_curve : 1; /*supports 256bits curve*/ } sm2_capabilities_t; /** @@ -43,15 +43,15 @@ typedef enum { } sm2_cipher_order_e; typedef enum { - SM2_ENDIAN_LITTLE = 0, ///< Little Endian - SM2_ENDIAN_BIG ///< Big Endian + SM2_ENDIAN_LITTLE = 0, /*Little Endian*/ + SM2_ENDIAN_BIG /*Big Endian*/ } sm2_endian_mode_e; /** \brief SM2 status */ typedef struct { - uint32_t busy : 1; ///< Calculate busy flag + uint32_t busy : 1; /*Calculate busy flag*/ } csi_sm2_state_t; /** @@ -61,12 +61,12 @@ typedef enum { SM2_Role_Sponsor = 0, SM2_Role_Responsor } sm2_exchange_role_e; /****** SM2 Event *****/ typedef enum { - SM2_EVENT_MAKE_KEY_COMPLETE = 0, ///< Make key completed - SM2_EVENT_ENCRYPT_COMPLETE, ///< Encrypt completed - SM2_EVENT_DECRYPT_COMPLETE, ///< Decrypt completed - SM2_EVENT_SIGN_COMPLETE, ///< Sign completed - SM2_EVENT_VERIFY_COMPLETE, ///< Verify completed - SM2_EVENT_EXCHANGE_KEY_COMPLETE, ///< Exchange key completed + SM2_EVENT_MAKE_KEY_COMPLETE = 0, /*Make key completed*/ + SM2_EVENT_ENCRYPT_COMPLETE, /*Encrypt completed*/ + SM2_EVENT_DECRYPT_COMPLETE, /*Decrypt completed*/ + SM2_EVENT_SIGN_COMPLETE, /*Sign completed*/ + SM2_EVENT_VERIFY_COMPLETE, /*Verify completed*/ + SM2_EVENT_EXCHANGE_KEY_COMPLETE, /*Exchange key completed*/ } sm2_event_e; typedef struct { @@ -77,7 +77,7 @@ typedef struct { void * prim; } csi_sm2_t; -///< Pointer to \ref csi_sm2_callback_t : SM2 Event call back. +/*Pointer to \ref csi_sm2_callback_t : SM2 Event call back.*/ typedef void (*csi_sm2_callback_t)(sm2_event_e event); /** @@ -263,7 +263,7 @@ csi_error_t csi_sm2_enable_pm(csi_sm2_t *sm2); void csi_sm2_disable_pm(csi_sm2_t *sm2); #ifdef __cplusplus -extern "C" { +} #endif #endif \ No newline at end of file diff --git a/lib/sec_library/include/sm3.h b/lib/sec_library/include/sm3.h old mode 100755 new mode 100644 index e86ee261..3b6f1614 --- a/lib/sec_library/include/sm3.h +++ b/lib/sec_library/include/sm3.h @@ -24,39 +24,39 @@ extern "C" { #define SM3_DIGEST_OUT_SIZE (32) typedef struct { - uint32_t total[2]; ///< Number of bytes processed - uint32_t state[16]; ///< Intermediate digest state - uint8_t buffer[SM3_DATAIN_BLOCK_SIZE]; ///< Data block beingprocessed - uint8_t result[SM3_DIGEST_OUT_SIZE]; ///< Data block has processed + uint32_t total[2]; /*Number of bytes processed*/ + uint32_t state[16]; /*Intermediate digest state*/ + uint8_t buffer[SM3_DATAIN_BLOCK_SIZE]; /*Data block beingprocessed*/ + uint8_t result[SM3_DIGEST_OUT_SIZE]; /*Data block has processed*/ } csi_sm3_context_t; /****** SM3 State ******/ typedef struct { - uint32_t busy : 1; ///< Calculate busy flag - uint32_t error : 1; ///< Calculate error flag + uint32_t busy : 1; /*Calculate busy flag*/ + uint32_t error : 1; /*Calculate error flag*/ } csi_sm3_state_t; /****** SM3 Event ******/ typedef enum { - SM3_EVENT_COMPLETE = 0U, ///< Calculate completed + SM3_EVENT_COMPLETE = 0U, /*Calculate completed*/ SM3_EVENT_UPDATE, SM3_EVENT_START, - SM3_EVENT_ERROR ///< Calculate error + SM3_EVENT_ERROR /*Calculate error*/ } csi_sm3_event_t; typedef struct csi_sm3_t csi_sm3_t; struct csi_sm3_t { - csi_dev_t dev; ///< SM3 hw-device info + csi_dev_t dev; /*SM3 hw-device info*/ void (*callback)(csi_sm3_t *sm3, csi_sm3_event_t event, - void *arg); ///< SM3 event callback for user - void * arg; ///< SM3 custom designed param passed to evt_cb - csi_sm3_state_t state; ///< SM3 state + void *arg); /*SM3 event callback for user*/ + void * arg; /*SM3 custom designed param passed to evt_cb*/ + csi_sm3_state_t state; /*SM3 state*/ void * priv; }; -// Function documentation +/*Function documentation*/ /** \brief Initialize SM3 Interface. Initializes the resources needed for the SM3 interface @@ -150,7 +150,7 @@ csi_error_t csi_sm3_enable_pm(csi_sm3_t *sm3); void csi_sm3_disable_pm(csi_sm3_t *sm3); #ifdef __cplusplus -extern "C" { +} #endif #endif //_DRV_SM3_H \ No newline at end of file diff --git a/lib/sec_library/include/sm4.h b/lib/sec_library/include/sm4.h old mode 100755 new mode 100644 index ae7b15a3..a0e8f9a5 --- a/lib/sec_library/include/sm4.h +++ b/lib/sec_library/include/sm4.h @@ -24,7 +24,28 @@ extern "C" { #define SM4_KEY_LEN_BYTES_24 (24) #define SM4_KEY_LEN_BYTES_16 (16) -#define SM4_IV_LEN_BYTES_16 (16) +#define SM4_KEY_128_BITS (0x08) +#define SM4_KEY_192_BITS (0x10) +#define SM4_KEY_256_BITS (0x18) + +#define SM4_IV_LEN_BYTES_16 (16) +#define SM4_BLOCK_CRYPTO_SIZE (16) + +#define SM4_DIR_ENCRYPT (1) +#define SM4_DIR_DECRYPT (0) + +/** +\brief SM4 data transfer mode config +*/ +typedef enum { + SM4_SLAVE_MODE = 0U, /*slave mode*/ + SM4_DMA_MODE, /*dma mode*/ +} csi_sm4_trans_mode_t; + +typedef enum{ + SM4_MODE_ECB = 0, + SM4_MODE_CBC = 0x20000020, +} csi_sm4_mode_t; typedef enum { SM4_KEY_LEN_BITS_128 = 0, /*128 Data bits*/ @@ -32,14 +53,15 @@ typedef enum { } csi_sm4_key_bits_t; typedef struct { - uint32_t busy : 1; ///< Calculate busy flag - uint32_t error : 1; ///< Calculate error flag + uint32_t busy : 1; /*Calculate busy flag*/ + uint32_t error : 1; /*Calculate error flag*/ } csi_sm4_state_t; typedef struct { uint32_t key_len_byte; - uint8_t key[32]; ///< Data block being processed + uint8_t key[32]; /*Data block being processed*/ uint32_t sca; + uint32_t is_dma; } csi_sm4_context_t; /** @@ -53,7 +75,7 @@ typedef struct { uint32_t is_kdf; } csi_sm4_t; -// Function documentation +/*Function documentation*/ /** \brief Initialize sm4 Interface. Initializes the resources needed for the sm4 interface \param[in] sm4 operate handle @@ -69,6 +91,13 @@ csi_error_t csi_sm4_init(csi_sm4_t *sm4, uint32_t idx); */ void csi_sm4_uninit(csi_sm4_t *sm4); +/** + \brief Config SM4 data transfer mode + \param[in] mode \ref csi_sm4_trans_mode_t + \return error code \ref csi_error_t +*/ +csi_error_t csi_sm4_trans_config(csi_sm4_t *aes, csi_sm4_trans_mode_t mode); + /** \brief Set encrypt key \param[in] sm4 handle to operate @@ -266,7 +295,7 @@ csi_error_t csi_sm4_enable_pm(csi_sm4_t *sm4); void csi_sm4_disable_pm(csi_sm4_t *sm4); #ifdef __cplusplus -extern "C" { +} #endif #endif // _DRV_SM4_H_ diff --git a/lib/sec_library/include/soc.h b/lib/sec_library/include/soc.h old mode 100755 new mode 100644 diff --git a/lib/sec_library/include/sys_clk.h b/lib/sec_library/include/sys_clk.h old mode 100755 new mode 100644 diff --git a/lib/sec_library/libsec_library.a b/lib/sec_library/libsec_library.a old mode 100755 new mode 100644 index c61537c011b7f7a20f0abd5b139258f119fd3259..019298c7fad24420a785337b3d8f70e920d49edc GIT binary patch literal 7272834 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 `E?M!db~UT!XJ#U9`DZd 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

y+=7@Tnf3Qe-ALLp4kDw}GIaj!;#?+rg(2s=q+~ zUoTYdH&@k~uZV{$oC$=xh8oRxscqxn8OH4Sq$Uq`rjokA%t(R^j6reU7uyFXkF zo#|bhcB$t3;^etyR}Zc^FsF{oG+%G{0{uy%Ky|p+=mO0*=j3`qEqz>}`L>*zhATDS zcc-Rdq2@aihV_#~BUCA_(tMYnnubN1@0nB6uvqhHtxu^GOElk*Q`1nZ`D#y1!*!bP zrEoPk+w}^~7l8TSNoq2@cD+XPjXt@aP%Yv{&3Ap+8eG>kZqoeQxrPvTK%P~jSm&d7 z?KUo@+U=S@38o4I>cIstc@b+6_Y-W*V=@~zlt*X4Ti}h8! zCzu{wXDGFp^!^d12e+FE!Mmwcm`n%f@IB#VB*c-gvx=o1J+_|CS84c!{(RV*qI{L+ z5-F;>d$ie*^Hn~d6Z6&jOy|=^IlF9qve{)Xct!}zf9(5*`V1nxg5mV?XYClx{PTVS^~d=;9KXxu%u<(v~114 zHU(;L6egVIxM=M?*)k*TldQ9!S{SDJ;VCjpX`-}nBr*%?Zc)iW>} zNv94?^L67+gs;P~X3Fn$&+{!|%UB9Nb6}lwu>?kewV|4SAmmJ$ZIrRtIGBhBvapxK z85GuiX*W?z+{v8{F$C(XwqK#pP)|#2%-sm70T#$IKU`s*XuIJB)^gwp zhtY1%pzTITxV0U+lEs&}ne#TKhvt8=0~Fyj+|e}#y{B@UGLifB8@i(#p!vV-czQyW z1$s{uzHnX60uf+#Om{Q4j+Rt=fXuR?=G)AqwE zpLR2x%7qob)>o|Rh~*8xmdh_dM#==fZX>R_TEM!pvH^1A0uDbEHX1XXE6or#j)94z zaF!|0`fv+b`~{t3!?=FL`CNUr5IJsHH1fiTj@tR5(B6pYT%Xi_7__&86shKLKXFkV zBJ>=H*Z9>=rW{BYDKgU@$ixQ&nY2d~8ue|5B>vb(CT*Aca)iFeK3}h#kg-w8wkz=O5?ginC|L!lqW(gOcHZU7)3@hj(-0>aO4gU+$?X zc+t1~)D*nrdnH^2?$0!z^A8v0&*P7$7e)_g4If%zD!(E2Ub!&wF8G7sB32LLswiKn z&6GqebB=_Cx6N`rd6d8f?zJY;_}}3gEu}cACZ-ld%rT;M)iy!&u&@LZ;!7d$_EHq)jg7`BtS?v3E2WoGAI z^CkW)xF(0ybn;*5%hj5jHp71vWbW`K@D2z0?p?ln19szofF0l3{fGzf<9UvC%Pal& z!yt7!E^^<4U#Bv1pUM6D)kbdjs=C_u8Tabv_ws9e-QaHI6ck+Rt2i|U*ZKZ(Y6@2P zj+~l;mA;-mPALZ0`>IY&!41B@otlDGzN4q6V70Gr+9}0gjc@L$DY((MC0qsh^opn5 z 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

;ecb{cE(WHw1S~TTNM9w6J40H1s z?DUZULb~X5*krWBtz&b`06aD`1%BlK?BtC0X2ZNnCff}2>H%0#M8-f+W05gRmb!76 zd~u|32PwjxRKttLM+@O|q&t|_7xP6J$+Cot=bWtK5@HTqTQ(G3!$lq%=MKdq-P-oj z#d5!TD2{H{wm;MU@}YQuS=;tsJO&GyHA7X*roksUW-Z&rkggl5julb4H^2{8xdDF{ zBPEiVFje}b_G)?*FiJ2$IGxHWG0O1OqRxl7_ zBBQa@FvkzX?v^oFI50t3zuU<=g2H;7;YBg|=!`ke+4`5jkVE6R69eShNy?NFL8fL0FIyo)DN*4|Z!f60Pdr=Y^#hYc!OoKVgAj3+Y zk}x%4asux9z2<2N36PYK2~f;fU<^-yi#(A?f)iyw5QGOC#XgKm32A0RLbyO;5|f++ zlYu1DoSBAF$s@sLE)?xo$S62%NXaozPgIVKNt~IMYW9a{zM(V`%cc4_9jeqH%g;tc0@@7AK$r45ayKm^UZ^a0sJ9+8>et+$ukEh6)S> zkK4T7gqF+~J`cNMy$Lg$ZKaSgTxGz(0Z9WnaQeXJz{Wcv$K+K=7nak(_mFpRc=M{j zp~roP!;iNMJR*vR;pj-!h=$4H;#j>gTmXTwIRs4OLWK!Z{%L`Jsou*nzq~DaIeOxtX+$4--R=<;5iOPqa=ofWXjQ7TTRW- z^RasQ(7qXZ#Pukl5SUEZLpg0iq zf{yYIVY19#&;g33pk2rzP;HQ2%46i&0>R-BcC4OF+@WAJ_WVZTP&iB5{BZKk3Da$u zMzs!k446}EOO!ONlv5x%M~z<4C3L%^jd43sx8T@IwpeO{V$vqe)c(8t+gspcm^oR- z{V@A7&3`2)!CK6-aX)uuYjYsCsq?(Xn$|9OI4!rMqa(K?P*>g5SleFH-jxfFp0%~M zz@1VJZtrRfw&uc3&fNCe+|>m+g+^mbT~lX$Ah)KYIlBR$pKGiOVemv-=NjW^jKTfY zT=*}@RkHQ%tB*<`q7u?ufI8a)x$@%_6juJhYxmekEOqz+3EX9;NsyKt(7%%PS?Y<+&p z9|~VNi$Hj3O3Nat&P*SChf4^=Dan3REJnbIWHG_&jG&SIeo8e|JW(M@ek)ECNn;4F zTY}XtC5gwiq|YHOQ1?rBT(sgWD>6S+B1M&eHk&Ruu?kT>`z;@4s0Ij?Fs;d=0F*3? zESYE}O27(=tx|#=H~=F%bsYAosE<=_p4Q{M|FHMhN`1>Kw(tc&u{8-#p=ODdQQ`wn zB{4zOQALU@$k(VY$v*g?!9%7nNqsv=!W3U}hx&!(I8|y7#II|O?}G+XK~A;tTbGJz z5zN#vDcun%!H1M7D-up&Wd=zNB>JuMa7UDpJvBhW5tR|aC^)XV;aqsnCi)^9K(rV& z6Dd~+>j{EHVS{PERUYz0*z@)7N!TZ8iP#rOb&6D9hTpnaAc<7#3|V0efOwH%3v%jf zevrw7QPiCRLq>D29KV%-22^|vvBn8|sz)h6R5lzKGccdpDioILfbk_OW)js1azu~G z5`67b2PO!@QFcLVd%YpQPB3r&+-YSC7R;=yAYdkpu#GiMjTZ)twx*i8z{=L9`arwN zoISg&qGWdU%*yHo3riN3867KI+k@%&dEB%GGpnmA7gWugH+TNRvguS{!NRI(XH-|t zFRiF9TU1uLP|z06oKrTpYM}uSY^P7l&xgo>T6oMU_aQ| z5;(PPaz5tO)Ha^l)K*j&L2GKg0JGZbR-W3vx~Q{xgF{7w0Qlg4K1DELiUQ5*6iBO#-?Cn3+$|D4+P** z@|JoyF~P2=W%dPiD{I;%6Hi%n!E9)znhr^U;^Nu!?6!7z7QHUmN=&FvAQ;GQ>1=As zZfk{x3bbd7&sM?w3R$AFqoyH%Mmt;Tf{m>$*>FC_Ei&*ESH8cZaZR8;yP*xT+8Uus z=(arb8ZgIbs_8PC1I=}9UDW*ZODd<&ol`x(tYmt1+5Gu)=Nr@Isd)y}tqIQ1#`I2j zo*#@=H+L8{b-~V>CZiL)oCI0b)t%!DNT_6fMb#YWKT@HuqRcIU^D{6TTWcU;G_^u& zi4_I}IMM-kpCxs{jH-px=Ps_So?AY9E`@^lD7dpld>BkD`E7)t5o~P6_J>a(WX7Di zm2*pHF03vunK|2NgXuzWg@`0sr(kniHGUXUU0q&PIc?$0xs}z`MrTV$V?#@zJ{@~a zHHZ8d8^85};X1Q&QOWF?)2ru|%rBV}anG4E9 zMW_=>>TB8{CaYyOe2Hc{e)R|?;fW3SUXkj7`Qav@lCnf;)q=Ajz820uyLvVZ2=ndU zsx}mDpI?BHB}a`2_gF8Lz?d|T`xpwT(8B|AfC`OabI&N7&kIzSwzf7YyH%AuOL{Gb zB^ZMu>N0z7WkvP;NIo8bqB(G8DxPY91101K9wU=v+(*<#TA5z5utXetXOo%8hbu4y z=bmA#6o;bGfg`Rg$D^G}*5TK+M9@x~fA%~I#iO}yfH5U}?P9w~p}D_&l&VhH!Hy+= zN~S}Ph(sj*>Yu)4FhwKZ5Baw;@l1y*&! zfnPme9;hM~Wt$K}-$pYkrcIlYKK886nwDT=AbT=A>m@FwvM1!g$)qs70WQ<((i`gP z(icJ`Ky1ONzNjFlC?`L=8NQ~~2-(@fk(~VW((Hn~g7JApd6Q10GZ9{h;q zYt1B&F&#mNr8N0o&%DdMoBiL4-5!5!;&sW_r>ygM9*=*t^oi0ZOP?$KL+SISFOh>{R(9QRJuVbqd;;&F!~_=hh1!!GzgU2run^K6SAm*kj?TYPpTa{0P= zN~Da~6L$a{ad?_QTcq9pJGj@ye>WWGO?*-HP39n^74Cfgino0yO7We~Yw_ayecXiN zJD=C$jT}y9{o|6nWe36UYb{9POzl^VT(ZBE;!kyQQ}Uw6fF6ye1y_TVoy9XAA#d{Ax*~T^B~JeiQwW+xj^jrJitxH&l5bkvgCu* z41wPz6no+U>j=CJ_TUlK5SAQD;dxx2UBT~~iF`Z0S?GlE!4W#}NT;^kDE9664!}(# zjE5D`AN_0x@6!`HcKl(X6UO1Wq|jm+14C(*_>D-|@#g_I8K2L*E!(V7s#&2o)F^d@ zb1%YqmN6{6!%|lGiw6wFb~qtoU+q}(YXNFEw6){|`=NbI$oT_&n^e0+Ch-^+S+bbK z<82SxNj%YZM@`}|?{d^172yl_M?b$D5KMlQaDRNpR!vFT^%*~R!5`D`Lt@`&tkm## z2rty|_X*d>$-{)t)A*kfj&aSG&&7_rK!R-CBk`uOo~ z_vd)RXK4IP!h;$vzfzMFdbhF4&L+M-e<&baKaWo&e7_Q)?J0!o^(rA;KmV2!-mU4J zA#gn!;2j$RA8A~s@#_fxwRX$;e8SK4M;4Ip(hPm!DwMfF@a^N(Hqx1^>C1Oojx@Tp zL;icj{~rzCN%(dR|1sfjYPa<9X*~nR$;FiXSO& z{E_f1jsG{oZ_w<%N%$EW{tv>B*K|H1e4obuittUE|M>17Y=?cCPCvrawf-GU_(fX1 zP9S`thL0iK()`IK{2|RBd>0VvV?`f~|itl_f1M;a%K{IE_n z@yj&34TNiM()(RU8sozfB6R`r4`_Z~O8Ae&HeBd3!pCWTUPJhaTKnHX_&|;SJ;J{w zwqgAr5?-TK;C~3mcPH^>7vcZX+F>{0hc&yuCS1MiNNGJoID8o^V)-NCPip#qBm5?f z|0dz}5i06;Lq;0en$9Q0zfr@#BK!i)fBF9Zk(xSu=S=WM8ZDa6V8X{}B~BomzgHM3 zV+h}`>EsgrkcLkrJVC=xC;Vx#4I8fz`}X@F6WQoLN61pUx)4|{GKpX zq~!U`ejo2W;?LLk9~0iL;hz((&tokSeKkzs_(@gR(6 z5`K@yKS|)4I20=&T)$44EbyVmb(&5w;h$)D1>uXtHtbKO*dJ+3(Z*ZJ8)*#I;^bW7 z&(rV~g!A`jqZK)h3^mki7nJ2r!5?ZQYgJxL_$3;?LEt{)4kbWacwG!ELygxo{#N2Y zr}6Q!+${h*%~fiJmIr_M^Mhse8z4-&3lhyI;#eH{3Z@U5Eu5yEfNaQuP~wzGcy8$h!0Z6+>-=Ufa+6uMz)4P3J9v+s{+)6CSJaKM{DmEe^jVT=!qTEiB$RSJO!pChgBfq!B({ z;~z)3t}{~L`e+O9WD&T}(A#GM;rekgm2iFDSR(KwW3}eb48ryCYA)gWe0~w(`nb1@ zaQ(iwd?8JeakXameB$flUOV9rYWyz3b$_}E->>m6BV6|fX_ld%6=Y${(2o{{XUPOx zUk&;xY+oh6>w-Vzf%n{ zKOcVXV>bThBQg!m7Kjy+3q=Zxj2GpRHy-82qp|U*Q-~Sx}b1_|%u&w@}X+Mp(s5tUw0E~>bo96bOK-G>c&0UJ`sTEHIJ%vUm`lTSkV zq?Aum`J|OkVxloXMzjuYNxgvdL=ypCKzaqFS3r6Nq*p+C1>{x%`BgxAqFF&lv>k3$ zMM+OIHsYiwnjH5@Z#?OZCq2;{kS{t8x1?97T8{iHB)vlNuaNW#l@94np!!ar_M1R@ z6G(3Y=}p4?@={UF@-nfRyE;4e|o2k0fNd1;y0 zESfC>5;n>fa=_+9YP*SKWg<1uL~4+U#Gi;hA)jh85#5+pJ`;CgLwmAIMXW>bp(Jcj z2|Azl&>n!Y$wYL+o-9`+nIgoY0F{%?IzhIpXh_JD#YF%>!%I!ke2^#i#DM^L$OH!w zgbg|Y8`*7=DB=WqQreNNEBz7C4xNZi02@gVF%5KC9ntWxC%uy%iy;Uw5|M?aEpdE- zl(a9#BG{9K#W4vTB$;Bo0Z&m9Hs}IuWVOXu15D|V7-8gSjXwp2#Y@YOUs{TlDJ_$0 z5s{@bU`l1cz#huOp4gO%F%<$v6etxHg*~hW1QR+5dy{Qn(4+5+Mfq*Ah;NwTmqY0r zruw(s=o_}-Z~w`H>>JbkE3K|y%cO7U()VL&(xR?Q@X49qvwIi{*FUeCMCFkG9OElo z=d1ZU^40I^p@hP9zPgUY`#~=wkrs6wi8|a*h3h)%`UB@^uP71NuAp=_Z2!b?b=`^j z_;O&iC|uW9*Q2P;GRk+UIN*vUG zf$ho(Oh3otqiJt~rey>a6I{#MUV>|zq(zv;e(%3${-R@@i-zbfnpHmv^ z^$?|Tqj25sBgDaa@z0bLuJa!wzTR#M*ZGe#{g)_>8-?rq-w-Daw!GaGuJaEQAKQn= zr-xz^+jBp0a08bKVnKcRtbp8CxUTP&+2Z%R`8^DU>wKky?fEK|#f`#s{s7{j|8Gzl zH&`AQZ083=O0E>H>kKCj=D)`H3fK9gh?54}m)Y^FaGjq+eDw28O5>)G(&*=2O5;Z1 zy3Qoxpq~dQjT?pQ{8Na7`UfeE8-?rqV&b6w>y*Y#F{O3>48qf3%i~SqI=`0q7+1W% za9qO$+vh!zk}KZ7|6urWl*W2J>VWHZk0%b+>k#8BT<2#HM{hTU>-;RH{}$6%xXxGc zkOo}dZVK1=vq%&9FR^%2xXxcld~DD6DUF*Yl-Ao#;kwSb#K(4fo6@*ZxXxGotGAoN zb^Z#{ME$>08aE2p`R5TQ4Ys`96t45t`4r>r11gJ~Zc1bOd`M~BTuEufKcX~lzD4Q& zu!UPRp+(`k-CKx(I)_7S!`MM-^yg!S@1(S@uW()eUgD$vKbelY4~Omlhy$+csPh`O z|2vGYaGkF-_5M}3&VP(FQU6`0uW+6JIC0Wo%llX1I{#_Le}x?v3fK8+?xDxSUr7h? zPbiHWHCCWM{4+p>>-wrMkpCCvkHU5SmuLhQwEK}r$(5hdDDf%76B&Ml;p)kF9WB4qF4`;agEklGxFr0pBRD`m8_FCFo%5+X({91;mGrW=EBN;BAKbG~) zVEAUn&t&*D3?Iet>li+o;Wsl}^##`8`wSn$_&;R0e0E&cS3a*S{XCKJf6Dms2NWb9 zfBO^{+?>Stk1|}v0P>z>xO_GpQMjgKcn;I~lHs`wPxHuf2<0(+Jj3%DuAYlTNW~s1 zlr#Q##$P}Z*CF8Z(uqT87`l%mF=vK z5!Anv>GNk8?`QZFrt>p~Pi6RChM&T4{B2KM5IU9N&l8TD$B;nFA;wq7EM|Sc_@^_S zBaDydsXWqAzg2;MZ~2F#HjrELS%%djk z+=P~AGkh`QFJ<^y3|G(HBXl;yS26w)hOcAzISk*%aCJ^Ze{Ny;GRFTA!_Q^-!wj!x z_#TGyapt##W4rwV4bt)w!SO@D&VK&sU;94Gh17@mDfjK0hSwa{uLXLK5fq zliwj7lxSo+^0^!t=RB_B>EaowydMV=j()1SF(eK7+>F#YkLjPv_~$dcjNwfTU%>1( zGkh(>TNr*h!?~Z^nf^X>kd~h^ek;>?nDN^f{ws#BV)*k+r=8({V|WL{@%a*5u-$?T zw_*h>@J@y&Fnl$`(+EfC0)~%d_!@>!W;$IAFJbtF3}4Rhix|F&;RmJ5Vl97CQr2rP z!>?idwM^%3hCjggj}VU3iy8kh7yK!PU&8p$y5O%c{8GmMs|$XJ;oXe?jtl-zhOcA% z&s=bPT{kXBUC;QjE_i>2t7{M}k8jGx1tmD1&hU*)f0PTJ!|)!)FL1$yQCML-^LZ~- zSKynN&HyTae2x!i_+^ZLq6?nS@XHzhR2RIA;d~xm%ka%iN8O)9Kd)eTC*yPcVuo*F z{4FlHx?h3%IKRSodgAh3#^?A>hF{6_f8v6xF&XuFegDY#yuRwb1oE$9`syCCj(^B> zczs0xLLTxt9!r{t^LnMZ;KLZs{a4pSsB<;*Q(ZeCuCBEqDQw{u@vV%n=4^=b_Ed8i z#QA()or@9Q#&py%i}<$~u3`i6?F?7f`-or5@b6F>am9h8aR-Fq2+J=6Iu!?{0y zU^uVuUtRDw7|z?_FvGb&pEI2Im-?QZ-ahzSy13wm`;+T}Ph|KFWDCoey5O@I&fB@l z1z*PS8=3w}7rc$(H!=Q24Cn2m?i*nCw;5l3Ul8$|8NQS0@b-DY1^*?(Z(%x5Fr2r; zvkd3)_9upO{|_)+#VWSH`d%YubN}Ht0K|egkN=?z=l+ajIQOTJ;oKkf{cP0d@vpv5 zsr%Ewba*_sGo0&R$Z#Id>U)8xzmT=_cNqV>48PL_{|Upt$M}!9;Eyx>R>qg#|CGlO z$6sOmD#lmeUqt`E&+xApAFpfV+32gU;@R~w$NMvU2h$nhf{$kS4;X*E3qFuoeW>a@EBsIeDJ85P+T^{rz# zudn*PtX^OB-V4OJ|KDOd9RD`Mf6Dy7i{adV^?hj6zn}3RVSMiY;|%A=i~9a9>O8=7 z-e!CrZ|eRD@;UwmN-d_sGE$6Gx8BmA!<0RO}1$B766plKaUkv-Wpw9WMzB2?Wb($P-)ZzSj#7CVX z#y^Yc@Og#8QHS%1F8o=}bYdw3_4hEG_sgRUAHw*LF`T#C=?quxgZjT>crnx2%W%~` z$lu3s-VTp5T-6u(zh-zF(|>~DYZ(3{!@C*&8-`!b@ZU0gE5n~+_>Bzz9mDTsIFH+h z7|!E-55swUKEZGv&(AWP$Kgv1=W)BA;XK|BF`UQe`wZuC^(n)79IC#?exX}Fg84kP zNe1l2Q(4?7JPXpC{|e(LFuuZ(&vgzkzItW`izyuWT<0yuPevjw3P(QI`GE2H+cOo8 ze6I5u4*`k)O`+4UC`RfFqyl zT*>&EjIVIybDirLAJ6@2Q8@Csj=B$n8lx2%whBi+*OBi*lQuC=Eec1B>!=?pNBuF1 z3|oaGpX)rx{2$Bs3Pd4%!RJ##FkaO88H#~FVd5@}I5^0|(B-xB(Nk|M)a;mGGY zFERa-8DHVZ=Q^)4zIvt+izyuWT<2}Z&p{$B3P(QI`H1mz6&bb)M?Tm2obmG*U*X8- zIv%=zk^#8-YyyiZ9Qj-)p79HiNQ=Ue&vnumf4m~YR^iC!I>Q;iknt6ce6BN^@h338 z!jaE)au~me@fD7It|Q+=Cy$qjjIVIybDd(QKZ)@bj(n~o-&-g3Co{gnkRLKG#wAAu%3KVSI%npX;n-`lm6z!jaE)Rx$qRjIVIybDb{6FJ^p& zBcJQ6WBd}vS2*&E8GZ%hmpb6c=Q>w2{?m-FaO88H8;S1$yqxjxU^*2JIO=e|d{3W@ zlV=!T;mGGY4>G&68DHIx%>ZnU1CBbJ{}l7HlJOOee6FMJ>!SW###cDg(IKqsQcTfe>USQ9Qj;FzL!wO)e^>6IP$rUdcF?z&tZIpBcJPxWBxB? ze1#*Q>*O*1GR9Xp^0`hCc!pM;*@pF5~~6@fD7Iu5$;o+rs!iV>+!4IO=fzZpLq8e1#*Q>pa2us~BJ5$mcrG zGJXf+D;)V;N4}p?9*;rBS2*&y&g)FSlkpXfe6I5k#$V0&3P(QIIl}lCFuuZ(&vh)H zBw;+SVSI%npX($tei!2_9Qj;lDC1wm_zFip*U4o3wT!QDn^d_zFjUH^T!=f4u{ae6FLO z*G2sejIVIybDfKs{zk@EIP$s96^!4*_zFip*SVhYH!;4#kn%<0~BbT<7T^K!XFKC79Qj;lG}FJ9@fD7Iu5%LOU&r_gM?TjnWc=$HU*X8-I;S%J z4UDgFAjDI8JD;)V;XC~v{#P|wFKG&Jc_}^xHg(IKqoW=MzGrq!+&voScJ>~Iu z3*##s`CO-g>3@gu6^?wa)6DqaWqgGrpX>wV9Qj=5PR8HK z_zFip*OBitmF@XM##cD_b*#3d>hfvxB+gOIDQ+gC^r#awb0ptABh*JdHQyE|3qXA1|_)<#i z{wyaP{VAg~ZdOtn{h2{&+$el3q&Z*B?R9-MXGZ-qP=J)R(x}h*>fAa3 z@I}PIjlv5dJ)hy~T!Zbi+yTe-;W{dobpP+Avgp66J3#L@Mi zARP6ZDUF+FDUJHd2acmY=f6RGY@Z7$jT?ny`?NFM$m!^64%XDdHrOt=D^)5OSQ9jI z>T7~EMow)YADZ;R`^TV zm~q$lvteCwLL#A8wTh}Kf3(-MQpKyQ%d0AA6c3@^cR zg5gzqq7}oh*n@ru)OI#h*VNXw2UbU9H?`J9?ANr{v@`^;yRakpJ5?hfe66Zdg|0Jl z>ROwd11-?wEv>;oPDN!^c1N(L?)->CE81(Cp;UWgN8Re2nqaWKv9>b^wvKrj1`2pg z_%)?sZC~x;al)68u!H3-4nn$E+gH2D<;xh@iG}~KTmEDyi<$-S&zEA_8N@+Iqb*#N zAB!oi*I$iIUPTn8JG~n-{ieWu{@UQHv^AO&nKoh$CC1f`R z^7x{+KaTrO_UA2^rShmS+K+*M-9C=rXi9HC_3Td~h`?dki^yOe)TRZwk#hl^hR8Ni(UzoS;r zjTG#3SkQl*59t1XM3^4`2gwj>^F`l}1OL!Py}Wwwf$D#yq3o;u(Ntcq*ANm+Rz%wB zaK*^2 zTI*bVrrF8=d)LSk`!VQYLI1HYbpP=gMqLy68)@Kf!yUHhTzvM@$^O<&vQRe_K>K*E z)9vqvd|eYu9wz%KTBf#Z{0RUj`ze>B3Va4Y?T_|Hz`t()BPg$HVmU8$@Dc6ApmX1I zvEO|Ks(`)Wa*Os)zxI%JN4h?J0;^*$j1fSZxsBi^6L1T z0QqpJ>tSjP!2+=0{DLpKueeVpIL&CI^3UP~2bQt$|9c?o_HlTjp$2K8rFfxC&Qt{` zN4K8}xKsJDbhDvCb51W0^U~VRj_Qt;H94)h>FMeDMUy5LOeh*ZJ`d7)d3;?|SeTw( zkUt@RVi6G2m&adPHoM$oh80bCBVBkeR25?eeTfe9iUnK@pViMZ0`2YTqdQJcA6*}B zbguf%r)hDfC*#$fpFe&0u8lbx@7s*OMYX-hXTUvN@2sApgZ|g?4&|HOaA#`8h=XbV ztucx*7?^23pSXjG`OQ^#Esw8%BUs+GvukF}`tF{Jx~ugo-135-M&ep7L~iMZ)64#oJ;6 zyUt#<^PMX;?s)$ERrr4A5AJMxqrSXxXJeXw zf4puzP%{`hx&eB7%i~9i6MlVo&$gH?i!Lk1`WzVi)|XJ9^usMX+x$VP5rBG|ss48| z4rLuodL8QH(G`_9%~h{0FRkBE?}HNeY)tcaTkFckZB)4#n|Ai3`O+=5KYqfkM#5;H z@xiX4@22?yr(PONeW1LQI%=;Z)qilrt7-mcZG5GBan+9HCFc6>b>QoM>#g0;XCMC> z`u=_E$ga%0_NAC*`*tP0UXq&TPx0wC{RfrGj^)i&sIsbReK-2I$HrA2t?x#k()?|S z=Dr@V*`27XD$REn?^u3X531f+@}2T`7Z3A)^3{PiAO8}6vuXP#zp>@lk1u@ihV_?y zzalf^Q4R&9D`$Dy4E zf3v^x^AT@AoAr0|thwrq<>mD|>-~+db&VFiCt9!nqr2BZx%d0Ox@+9VG@s!u*qrvy zkF6~a_}A7Q-f2LrdvmV;Xtc3(%LA`p+|PKwUs74!jkhQ7?8&-5q5A<39CP0Bz6XmB z%)0f<1o)O6GVtHZiZgo3hWXz3s_v`X6NmX8|Elhb+Y?8Y)g|ssTvc^o*n|J{t;kH@ zyQXL6Z+bGv7UpO4oc7L?Lq(y!f%2)_eNQHaqyDvq(uN%?ZoXlnkvZycOJ0#f@IRjN{Mu(TGrY#lmwAohd)Hk%eeZy0fiqzEo}Pw%F-!Nz<9AP9 zSaaGoAyj?Kb z3_R_{`xbBh2iBse{5L&eYe|nnoVi-Nxaudrl*eY~*u#05>E1Ozc_4q)tPfzcGc%54 zeLQaCeH-V$h2u@m6|;Jj&r=Sbw%`9n<+~4VR#CW0<_RQ!73&*AvpTmcbPasA-!m&JH9iw>t`-s)X*dqw7s z!!4W3LEW>XCwzt&`l?xW=PvMWh+C~LuFBqZm4o8G3e=LSToGbuNYx8-c5f49zKveQ zDlfLjqC47 zFM4Omp>q$8fTLpnaJTktuG+cWU;kRLv};F~=fc;{D?NY5`8A>Vd4Kq;yYAZz_D3A( zj{Dr2;xoo=ffyWdATIv1qRnR62hVM&*y7p#=3pb!`!CPNvJE@;rPOV|-m_uMbU3p1 zd0+k2x(c%*W7GWb8G3q}zxep(cb67#IB9Rn!r+ZGjPN_fay~*(I#rl|KM{dUY{N(}N`^~!$ ziL|k5H`ez1zr8vB$X5@)@`^{6dAetQ&%>Ku@jQ5i(#P>FJ>9JzF0Q)$ms@tluYKgE zsc~nQtlJ${QRPh-joZ>6g>iImO2V#~wLb^uk>U}%7hbWZLcCz~j5^>= z`0SRFqzZ_TJAJ8j-EYPYtf;&8O=EkUVQr|`?Ae~M*DIswh{wXd`eLu)`>yOI|JrqB z=Z1R8g0{YSQ=##}x0e>L%Sw922hsJ{o+Y99x@)8FcQDG1cB{!33rFn!VCJe_dbwA3 zB|I3ncDrwH;-Ziij@Fs!Q_OW`;qw7{i_vk!^Th+Q zg#Q%y9{~SD;2)p&NQeJX@IMy*Plo?I_%DS2N$`IP{1?OjboieE|FhwL9{ewa|FhtK zDf};o|9bde3I9#--v<9d_+JD6YvCV1QGpAr>iWixn%bs7bsK%~r0_sX1RUbS#|Z6s zf4IF?6mM>=4^-E+wybDuknN(%*9YM9hLzQIHBC*m_`!q1;d2H@JP03jbTB2w?`&yo zX#|66U+#tX8v?;<@F^IO=0m&{K|w=$ez>>@!A75^{V(RxXzYWys_d+RKNW#h1l8?3zGmS zV~Xo+YZ9it0esDfQDR^^3mWXLg=?JCIOT8+TK0g(otnvQ?Ru-;= zKuk;OPeSRo)Y~B)6XQkmu|t#bu9m#9AlBryYyz?NiZ%X-BnXRjj9ABtb(~noi?w_~ zV4_GTiFLAA_Y>DEsA=bx> z^$B8~F4iN(8h^qPzEmgHqr`f&SZ9g#7_lBJ)+dVfII%uStWOr}Y_ZM}>s+zU6YG4j zE)eVSVqGZK6O0(2cODpxD^JE3Cks%14f#@W-}n--zF4f+iuFZeeWC25xJnCqLiAVM zq9Kn$THLQ564w@c99--tV1?pVrHM$$q}}$kKLYB>j7@B;Ut`2|&~BV02h$FS+<3X$ zIS_B;doojuBr^+A$+$B5#ij^-3W)f;av(#|ijuEYw4;a^k~-bO zR~V;y<4fb7hJ^TBAbwgh#;eyn!IMeIbV7~?gi4lKw?cumA!d9SF&=x&M8&e>zoZo`vs6Qti4R`FSAl<`-#? zSX)%&EbGTW5}^{mWXL;^7NIgJeraqOpo#VH>300G5f4BNg&O7D#2U!*WDZHJX>Ty% ztB=Rt_hhEaS}q@f9pT9wD|c%sHxEJupE6DsEA&hTO-k&3NT&#EgXBnJ6`9GKfogNz zG6q947}gZiYJhzBgKo=8LGug9Rufbb4fUBxOooWS!%_1L(>d69q1?`x~IQkp{Wtln@&%Xsa}6h zvZ0N+C*)G6XPk2B_;&bFJo5riDi&KS9DFv?!4s516#n5W--UmuA^b} zfJ!kYF<|*pVvH2+TjUw2x@9CZ_e7648nJK&uFOd~FgXll3dR)AK#V$bg{Xf!sIwRv zg%n({i>e`%-NVQTas6ZAadgQ|=rR)VZA8aiW@JFnnR#K>4`7tLN3uMdK=&NaWw2iA zSp(~H&HOMCO~2Z!X((pJpXCV`$%necLruWj-n9pUs}qRWgHBj$o-#o$b_4kx{vJKn z3iZ%GsEDwMhiXdf_r;-)W1omnY(f#C$%a)6X$p#r-hv_r#w!^V8J_IOpvdr)MFvHN zX9?1ANyn9$;W-bD<022bQT(7Q11{^)C=WWUS0R)fEvkeXqDlh{YXYRHO8d-S1_cW~ z9F}spJ0dW$t+B;0 ze`6-254cFiZ^H~3`cIiM^y~W!{UvZ3h$i$gs5eWlXCuWEY*bW3)Kv3h0K@MgNl#Ko z${Hghb2c6h8$`h#_G$xEf7eZYnWqa1oQsiZvylN)eQ@8!M(lbO?4d3?7Hkf?`S z1(3JK#&dH8{lA;BRUPq=TIRvy&+a}R{V&Nf{FKGcU*SU(y}?6Nv^=$+98RcFAgFN) zLgCxgTliiLzRK`zGP5F&$R_i&$Ro1JT!iy2Tx7JigrikPS}R4`*&@=u3)<|E%$hh_ z7UpZS+e~@|!gtIv${cg1N|aGzY@;gYtgy~Z8V--R9D~AUGwIxD6;9M^VP0V-?dZMq zIIMBF8isQ{zGWsI>|G};VfSLYnKZUvudNWB7dM+p=k>1Bn-{m3N%!<#Iyx_IGn3x$ zU8grMZa0$(Q@(+=__3L^x_6zh7tVcpkD2sPv23@v2j{ zIVn6zK*l)9fU`b`%CovBwmXtj8REdqKyivAIjfYVL`TXIIO~3!C^$-=BW4jxJ+bL9 z@Re5Vp0S-zZMP8olxRi@$yj(on<>Hx6G*X^C z)!ECGn!bPbUdDO+DKmYO2KG7<_BDc)o4yN=O<{%^_lsjwIK%XPd29-^O6>wE3TK+WD~?TJzUh1F*c29+zGQfKFRFGp zaWx!Vd@;{56VAla*HXrq%PAqpsat6;|87Wlw#|ljqUlpUl!H0EZ+o;(I4e|}z88*7 zVY%rW3{T`n)exZ*DxQ3&L8)k_7gOPR*BZ%{cLY4^*@fD5FwAxHTx&f%3mh^u3T7TZ zipY*nwD2ksFZq_iI!r~M{@SZg;zqN+>-M&%mXV@D#k?KN(NL=2>D4 z$j8&Lcg_B!@39aqfN1W5QW$R-Y3$M*W13H=@u<0hs4_IWm=GQ{5As~AOFwG<7Lgsl z-wzhdLYz?+hL0I>0Dz_N0f4jKWpGb1>i8F*WT3ZVa(aR>1#a{~EBvaL`(2AcT!!wi z^6=onh4yEw(3hdSFLW!*Y5q9XaZr6K=}qt^s%||+7cl>nG!CA4@1?LD;6t|)3}+vn zNjkrGnedd!S>U;(yN^xag`{_nP2i=Z9O$NAS|VJ9sAJ_+>}m6QIZB$(K)KT-G8sq2 z)9c}bd-M7;a5Ow!jC|Lhje}LO7}ahPp-_w?+PC}Rh*k`v+0EicW{D8FWx(G+P{he$ zNU*y`@Wx*VO3W28+Rw1iw76Z1OaZ1D)6ZCI#+SB~2& zbJS2P^H)y8Pr-1J!F^sRxWzbqet$krH>Ik=a-41!wX?Quy)^nG;R@de=}~s!RDFtr zZkikW6+mt6vz)OJ6C7*Xm6wKx6ddE0K`FN}t~gA^Q|mR7>T(G$M#Zjh37if*MB?K5 z+@gUk|ENYS8f=YHQ&e+_^T&tF;3BqAe0;d%M0HzJG=4K=u<$yHPY*q@ODXVBLj>Mn z!$LzeY|iOr*c=KsNTok>@{~U^vgS<9qMNFP_zA5!=M1$!O&mLOMWo437B%M~=H=4+ zJV&(HnISi)_TuJ`LvBtDeLf@IoErLghW6`blG~zLwYf)>p26u?_F|rMFP6YuQnp%N zx@t9HPW$|Bx@rjV8E_Vqa-a2y)+h+S_}Y}8c&R&HlS1t@qL+5cfC++hY{Y2gSRp=( zVU8HDj(s^$oDdo)gyRJ`%LpGZ;AyxA|Jt|T>EXi(-8Mljbov(`)_Gzlg-`#d0|m2V z3-DeX9&`8s2L&;DB7!*4u&_F1=!mCkfN9}yBF1)4)#M#Mm0nbI1`s5^xBv&`5>eu; z{yywOaeD9+3^B3#)~=95!6{*h@sm+P7Aq9RidP$+3B&${Lgl!!Ua|(6)SAfV03ZUocvMP#ohK%3H`Yf59 zLGXO=1X0B-IpTbf$Bxh_hPQj*RVU%Ep(XYoFgv`L)MUo+-DWd}ag#4iniJ;s<1%rV zB^hR_IXXEl!Ac&MT;)$S=bI^hI7~(v2??hG2<@L`%uIvOAS4!^bQxq=$x{-hCQMGi z9RCDCi1C`IB_seMb4rH6p>q-;zL1*|C>rKNGzpWH|0q!6m4gGFq( zkj0Ulj4ouL3!IS|0f6;UN)Br~8jffqYlN9Ed^juNY~Nzh3S)dmej4hHEu_SWNSbd} z`NO1f39t*d{d1surO7dgT4heg;us9sBOrnGl*Qqd@R3I0elePaN0_h#yrEs#1$PTb z9pcWWKAxIG#3XuKNIen)CQ$o?fFf!R34s1YG>aZi5(yYpCyTm6)|5~`0o!JLDyu+( zY_(HZ8xeGBr2FZjbx-4d!<7a18m=O^&oJO}k6~&N=~P5OPU9spbf&Wy#O^NR-bi1{ zdGAT6g4`2P2In7gfOco*gd%KAB0g|8D~H0TScUKzImYRUrzBohoGbzZS`QvCkHkO> zUdtVc0b*Osh<7!MY_IW=x#W8~(}Ac{JVv_?8GylOl97uOFOmUslwmcXA(uF)mp3R;U=FpQ-(sYZCe%dN%FLiblkeyPeLzb~-t49Y-!^YDoPKT7!2;;=l zwHz7~d)_{t+Y3f{WY`Nv8Orv8wytpwQoW#4J2(zOQ4@6wQMaN4(TsSjqOL6Vk7eNg z&l!bmaqTwLMM>0~%He2sj*p`t*6K#w6m3L@lZykS%R3EZPMAX+eY3Q$Z{X{f)Egra z-jfculjJk+wo`-7HY0v@MC5*xkZ#VYxt*}6#`EY-e9rQ=lY12Bd#8a8uylJR?UOer zo?gx&2JpbKpH-qJ+ATzR`f(UL|5JuUxAE_5o*$jU!wGX}a|bBOlKfs z-LFB{oNjwYNwil!$|;)}@k@k4<`^e|4vJA+W*)^AaFq94qE@uG-MKo1O>(a75Hcfv zWiixt$3WEWnznb)!V6zNGOHb2sn*LLBT<)gIGh|In;(v>CAz%6?+`^gB^`d0uD`q# zk1ZZFK&DO_YZ`;nTrSX$zJzYmVgBj>*-P1u#whCNAnbVQXd5CNSay$Wqu19f6@~EE zqS(SnSAnzop=ho*&e99&`(9(sp>OPZK2J9yZzPgWG?J7^~H zT)1u^a^GY0Js$(V@A!s1y2I>KC`yl3_9+xy8y$-HC9}xJp}imH-~lV_dUj>C}jFP_`#jnD0FN?tlgbcqL7Kkox~_~Y%?I;9XQ0& zqtJ=QpT2cqBrcBTIP5#dqB_LlQ&ak^+P^bcq54~+xfj=GW5Wo$HJU5l{64D>F8zB4 z{is|@vHEm8ssLECweJ(!H+g$7nvRR=CaU8V?;dz;Hga*f;@blLxJ*67qa!bxB9-rjM!lYjPgzoqx3mKM}0Zyhu?C(*cfh$)uYAj^^5Yd z(q6Dyhn%nNbXIg%UJfj~ki*r2twa6rqt+K28McOtm3X03lRB4hQ_}r%I?8?EL&0d9 z69BJuhF#cBux{Vsh|npq@XO24D6#hrcgwlomZLKr4q}}$AY|rRue|t$_e|LuL9y;1 z-WyBTcDMPNN1DCIJ*bea`MF|V|ZM-Jy}x3SDN>4uBI`!BI|lB1#% z(O!Amoo95#K7)2fan5_G%Ut*p2mI(%Vx_vn#L!+1+bs_?Wq%snUa-%B*y+pwz3`O% zmWJP01Fd17RvjHXR;py$Z-cq%>y>iy*a`E2w+?gOqoBqJg-m->Kn6^w9Wv~`Ms;r> zs%cT5$D-HhisBwMPRXGgW80#bc=u@%r_@qRO{u#aB1CT$hcOA`*=YcZB7VRAEbp82 z%eew}3%21B3p(8~uo3NAQ4Venw-$6Qr}L2095`B@u74~&{(q}w(OdiZ#i0wLCjR@| z(xsQvbx)$@>E(_k8XV>Vc6r;e6ZJvnOw=tnokN^3dpY}H1yA$5uk+l#q!%4gS954? zhgQUzJB`2&b2KNS-Keb-9G<*)ZtkdwcB4@aiGE`}oVT2A$+_cBGd{ZmwiA{^>+7YQ zLMQ4rkdsvVv`kJfGaROuZY82|%Vkmpu=D*z$0?X@$l>O+PH~^LsGMLF^BG$#>t^ip z8MhmWIO_=>)r~}t@y*Qz`>Y5|${pr{C&P86{DLFAu;RbVe_PF=t-0_{x7_yH+|~Ix6O3b(3eI9P(7=&rX|=I$ex^+m)%fTm)+FZ(zzykLQZ~O zPGNQfv_oC?nn^{~MTOam3UZ2a^0S*en}Usi1G8aeFeg73(z#GFx4p5WZZ+^aTh4E3 zy`Y7Z8d^GYL8~AqPdOLzOPD&gde*nER&wzBi=y%Hw<&Yr&Ghgan1R)eb%E;k3vyQC z2?pDwx*a@(T?=;MS1@s}8hn=s{IX(pQ2T02Rdi+)s?qJgLM5cVPk|3nOUqSRGS;Iu>1iytpMritcRt#>v9$%bQ zi78nVFXoIFj6}b5%@^mlIt0>>A$|BOs}A1XE6ho8-^t4Q2?Puan-JCTrH~2mBgy)m ztOMA$wKezyLy2zy@2Kkl@L5*4GQ1de;e{g0FV-$;UtgU=-6g!0wtUd0($P>*h+P7q z;}X##xE2&!vyXkKuBZbv-VYrcFHY9W3(7A`ORRZ(2`WNa2Y;XGh#uZA9R>wa6#T;0 zj0pP?=rI!xR|kK`5;Ilcfr^lejMg~GlEHWZ?r6~}w0+4uT1DteF(;Su!Y*kBg|xyv z?vJzSO!Y~Mg>Ms^t4 zl*dXU%W-P1--%w5T`1#KwGi2Z4j0wMpCpBb!5s=|kzv_zNtdorSrMvKR`O+8i6>I) z(&*ykqScmAHNU>uxto$27KHkGM#$oho0~eV{2>KS~N%q+t~W}qqbPcM~&9^@q|A} zDB}+rbru!ty{GtbBK&gdQD3&~Cwc0oV@I67!+q(sMEWk_tuIFwknL#7^43e@T;a8R zBLwvhNhP_kao3dBE6V+k(?}r-Nnv&7v((7)doj*X>GwqBk+;{%2#+|^CtE__*UyR- z%?U9k#NkJ)eO8ZX0;ocg^||byfh>Hb6a7NRO%e)tz1AVJY27630rD4x+@_GlZ=E|+QKwKP<)};LoW!N{^h`-oEb!wz-h{NMBIw=*W0pch+eOweoG>lc|&BV z`>eP0f}z8}XGu{CXW1sP%6VT{)NgIqRo@M(eoN1LFQg>fMa^blDB7xXKMdm2qUU`a&bva-`)4?Bv!3@!IPY>j@6&MJWqRI`aNZ_8@3U}TkDm9r$a9-a z!4VWbNm2^JInmlKkH%1NC9Aorm25u@Hir*`Py09wAj}5&t*7KPQ3NoBF--D?qcR)x z|11s$892TZ)Nzbs;BE5g@c4#Vl7y3Kc{s3{E=cZ>CPavc(IT9Z^aMoJv1J>36x-HD zG(;;m;;he@ui{YJ6wW)M=Uo=g`&7@{Ed5ef3D6`sg{WHI4sjTOoVNn>qItfj%aWwmh)MRTI zV&z3(9L)q(8z4R0Voxw_Jk44U2@P=y{vvA(y5qZ`lA}2h0M%KpZxWJRJ97Vw& zaZ(UA_cC4Tt%wQ#JH4IiQIoEGWzV5uYG9cZZZZ^0JSm4f3fBk4oCGM}z^PrRsHo@H zz{(A7!wD1pgeoc`;e09Q3By#}s5206g5wFGU^~N!A_Vyg%xBcZxh;n$3c2 zC+Mzx3}auCY{$8{Ba_+Tq~KckBNe9a=zM)f_va^JU!RW50~hbpGa-nf>JoOV0|nmE z`Sp0D?Ii2xVbl8}^T4l%^-SrPguhY0ei>;y$@*2;^e-awz^}b}ru0j~->6^rN7_!Z zo(h}(X=EPw^*cRN`X%9L{mP(&U>IG{MRjcaDAJcC>xHl@cj;oK=Ofm_8Y#j^wMHCHJ~?-mhnyN+AXg0_YQ+0r8rxtjQkEdu+i1xz ze?(2dWj^A`woE~kH05nU>OGin$gwVT6`*ci`Qp{s1c*F|3{i-h(W^6%FLd53l77Q< zOgN3hgs4ckH=&HMNG+bM2ywbcgH=viI7ezhjvOXKzQXKWA|pk3i1VAcp+u82U%Z^P z}>KfHlGu8b*v$nB(XIboY%y1D2J*&QqFN*|nBrCCH(qMV$3jaGp>i}GI6 zamw!msxfqmoZs4f3i;7XT|@0Cd)VHxp}0ttr#jz2Y7uCA8C#*ghrT{TR1=08sSAj_ zRUJaWCwV)Nmy*4jrAm#X(rMJ#BV1!iMVBlP?gC8too+jL>9x2I^%HqB!ouilRE_*C z+AMOrFxq^4N)~NXAENyleU&15;;gAkbO)3O_K#?Z@~bCEVTdJ5Hnx7rO0aKWXTv8}`{Y(sA#qH*|EV4g0zF4`r>HqrGMTeb<$Wb_X-(|A$-eAHyCJZDik~qhq5~OSJU=xAvNJEl+y| z|Ikj?In@otc*gj*XbbY)OWnTM8_7Nv^;vsB!J2SqD4T%057}aoN5@;4J6guS`jNyx zpIC5%9asIf1DU(WKx&0=M9zD8b za{fWCwsJ{DNu4VxnRNL05hbH1@lU<|PpV7G=2zEM99!q7)%*GVPr>V4dF8B%+PV_@ zgNc;w&@mE1}}K5tBxjOgPw0nKZJvWZZf^x1j)q(NhV<6{Y3< za}#p$cH>M7YUYaXz7l7l9Wp1>2z z{F4VWO3UWD8TB(~R>TWhS5sPDOYLE1T(LlMKwoFV9NMOQzlNFP&|2LVZ(;0 zUrrnGjke;}r$q<#psng#XLpzEdbd}*gl^3~xRyR?{zh2x?XmSz{N;Jo?e)b^w- zHNN&sq6V+Cjqpt`YTn!`YiG}|smn=d1)6`{6wXhLV&v43<0qGlEH0is)eB3jD$7g!mY7xH*KO34 z@gpXWo-n?ogfsZ9I3>S$GB32GgdY^CtS*scb@S^=tNc8LlL~lKL?xOu+0URePnsBY z2D01o4(B_H!?k!5M~@#j<*tg96QaopYbR~YZ-B|8C&oJpU)o89Psndv>K*OpO7LABjrnG8SNo_?{yq^7XM~{w{ zTH<@U0&PTTJz$jZ>{rr5Uh;UBJYiH>TS85_reapfjMCbM6)K(_6~cGS3$+X-6$||{ zWWK^GYHH@!=&Dl#qIOHIKWakr7erlRLx1Dq8DJ(WUq~xZ9B}RXicu zaDKNbt#u8pmwP+kMn>e1C>mKZV)WE}7qxHd+_YIAInRfp^CypVGb^jAobJ8; z@K91-I!0f@xnUmYjkLF{tU0Enx;`qtZ!rzc&37pN zn8WR}q1K>srua=nn~E#a_fsQ_r;eU9L5^3vt0&B*-KIY@MfF?go3@`}@DSfMYgaX5 z+@!*T<9jx>g2|)DjhrxLvOZ+SEo1cfsrh3^7nV%S_q7>cw{e97bsP9yrce%%(Xpkd zw7T3M&wOv>yFhMo^gTM_JF0=%98jaZA@_}N1n?DeXkpaf=$e$)B_06O%PVX3*eUI3 z)F|z#8k*b0eCK;B+GIML^u}}&;dgRfkpk&i|K+2Pwezd$>ni70*ZPMK{X>W)^)u$r z_lH}3aC5PnT3S_K!7XBlUv>XTuL>-^)Kb$$GCqqH^(@w59G%I5a* zyJ}rUS>1ez^y^bmSJ9`szN)Ivg89BtSJd?J$DXpee(^J-IqGXmXI0Qb>#NJCUi=s8G#6rz)Y5fi7B96F)+;OJzIcE;$KG-ATI ziDO6l{zMwe$jQ-RnV5u)D6mzU2@wdKUyP<=J;Uj8Z43f`8|i!7q< zK#%QJ6*Hq9aKfbG672(ODr)^RtZtm|3`dV2887CfvH4SFv<}XKM-)dLy3fC;v@$xY ztFQHcv310VVL5xj^Rqel>}(D{JDcMlF3p)de}0wUaFx|Lfk$X_3i{;s%kAH9P`@F) zq$&Dyd)LDM|GWQWxJFAGwQTJ6Crt4vXtlCY!K$6coUy~1J6_QIu#*~BHGin!iGn8! zUMzU2pp`4oztC5hVqT(xRtpNw+_C749aimhLG!66HJ;x5iGqis*{8O0MLQpj*?jyy z!8|#mPHIf0m>~s-7Tzup-#y?3t=bfv)R=Na^M~RJTeb0}9rIA3|I?@R`CnVk?BqQl$>lUxv@OIfu+r?MxnLCcTu*Kw)8eh=7@p{-cTcQ;VFE^)1 zmm6Pde1nF!=fq;2?}FwRwz#O(#ceKW8_)1k!IpxT3$_-#@-ON)+75GQGw|nsWqDLf zvb4e{|4YmB+v8uv{a3epKKoo zdg^|=Dg9Pc!bi(b=b!jdZ;R-^tLFqfb-&uwg}iql&;N9{=ZRWxAl=nc_2^7PYc9rzlM|f zr(+2Id(>{}$4`l$|Fow*|7=FTYMJoSayC!U_h{?>=}v>jw-4m$n5K6P#D_d}J8vCm|E*o>_TM_t{#z&A z-_-T(YsyKZ8E%&(jpG0Po_ag(66jZVaXCpPrSfMcX;l9IexAC0W(L}4W}yE}-&>d( z()vk#K9Ct`SDAr!mFZIVhhZON%0r_WZr3E$a;Cn|lj+j+sb&e9|FD4Dw~lFix^B;B zG*7x-9w=wJJ|~bTU9S%0N!M!vdF*uxg=M%b6YX5Sm&V}R8$}^eJtxQi|J_sX?^*ow zIIKLahgOLGyL#Jzr#|n>3iJG7xL8oNtO%wv4Q$o67Z#I`m#WL z$d?D=Lw-&mKIEzI!)LjWUl_G6fPXhi~z`qLkw`uwhf%tU&mq4D7+aI0laU@;esZrvBHBY+UCXgpx zZyU&yuD1*1N!Qy4@^nhm_Xx!2r0HD)@#%W^K%R8HcOXx?-Y<|R)27ivxMm^(zB;LcTE&AM)D*@y`Z4 z^>tqd_hKM^+aKiGKVrHJmyM(RJ?dxv=Xi6o23r1*w+O_y3HV+C?;Y^e{a&^k5{OUN zhXwNF{Xt$B$TRj2@*@Lzssp|(;HmqQY`4b5(`bgd-HxM84L4o*?4-3Sn>!SjB()BTcJn8!QK%U}&PfgQP-#^KAAy0ju zB-@32L7+V8`qDt2bUpR`lWdo+r@r5k?NZ-w$#&-i${+I7_dWb^Dv)Pwntp8{K3%^p zkSAT=6v&gV-yO(vZ@?c+)1MB+hkQ#QKIB^i@u}~_WV_b`@#*>pfjsH@CxJZa`WJyb zA^$B9AM(cLL9{M>8j$UF3U~|S6rSNaC!Rd`u_({~b*+bXriT8Nr@l|s*>w!$$qjhw z`$e7Ipg?@;>y*weT^}FFKlKmtqXT(T->2#vcs?ZTsjsIx2cEn5<9tD2y=v0*69Vxe zUlxcD`SL(~>ic7zUC7S~^24R zg#7M6{QUvn9PrfF#hu*~f%vBb{&t$aJrJMzI=8d?C=mZg`B#Db-=^t51mb@Q_-|=? zn?{K<=y4}qPklY!*`>Z-4twhB=*}+nb#(gPJ+QtZ-zyNmf0~{bh!1%|AU@=y0`Wxw zPkp`I*@b*!AWz6=1mZ)!Fc2T|)Yr3}UC2{kw{~`^uTML>6@l`k{<(Z-7xK#kc|xB0 z=jol@+CZMv*K3_!>g%=i{n5a3L;h4CKICr(;zRy+ApX5S$Uh6@Nqs%l*@gUDlZSfQ z47uvT9=8jRMF0MG@*S`+{=1el3}iE%5u--2&IG-2(47NZ%)#EwAf!*dOFG0(sK) z*?~N%uUoqXu3N*tFpxi8KQ@qONx+w;>B|D~>H6|Oo{*mvh+mPWr@n6O<}ME8xiU>p zeVyCQT^q=guCEW|Nqt?}&4qk(AkU)#e=Oin1pKK#$Wvd>c5@+rGqBv$*T3Cd$hQUZ z{1R~2C~<=JV>_hjy9MGyp89&Kn+y3qf&Bf_^!)?zAy0ih)y;+6UT0D5X1E@SmF&m5 zu>9vd_4!+m!0%c22>hOP`kwmyt%uvo)R5Ls>hrfAf#0L-;ra#gr0YWhdD8XN&k^-- zV*>d@J~j|PKH#a(PkOl2=O%%-qb~;~a&VUba_tE;^4%_76Bu+;M-(aIvTm z@b7p0J=y7er4hs@=1IOvkM3V5dq>U_cYL!(hU*U{iN5ys@h*iA;5_kod=pSc($%SR zg`CI!wAJzb)nWTk?uqL) zI4OP==SlV}I8WRY>v>30o*Ow&vfssd;+~jiXi}cXI8U-a&w1jG_boDJ99?+4Y2fF%&D_x`<9CK0ItqyLv~;$lk+)9jaU)ND&r;-> zf!}Aza@!jv7AT7E;HY23PvqIoK0gzAXJ_vxN8TlPf6QKwMDab`G+e0v9(nR{Kl0?` zY2*i+ESjfD;J#mzq#kH*ZqGXe^BiENM9XdBE)4kP#`|&pCQ0pKfcR1qKSX?^@%_ao z8qX6iH(n?{$9Po!rh(r_3%`GLs>xHt`IFyYI!=7HiI0}s%;9+eg{bdl;)^*?v!r%) zsCeq@wVea+8QwW*xkqxI(EB07??uGp85Oyd^CZ8|aHe?t2p_HBT=C{+eHVz^_Es<6 z-NZ-r);jRs(blewiC@BbLhqy7B~Wj>B-PuAoG0}Dx6GvFM&-;*x_(*CdGIJ26YtluxlN4{3lwdatfZgkZsu}kC7rqaRlG1UjeAPGt?}o? z?R|zV;M0@dt4J?4krR=811H?Wb0Jqsg;ays?QtQGAf` zQ^l){pDk{m>povR^!!OjQ=Tq7-Z^l;EBqYG22-9(c)6XE?w4L6KG`gHowzN}_2Tx* z`xfyHCeNMXwtv1)+}6WG;vbnjkBi&q-<}blVb=F0@rA};6VEgLj`&)$-1o)XnD|e{ z?Q=L^i`(agz86pZTuqn2aj;8L|Mn~ANsiChfePLwa9tLD9-ymP-!44f&Ak`!&x|+Y z<#tPYUcI%rJ>T9{+_tN1aeon?@aZDHB0-(&DQ=G=eZ=k0-TI5~X7Udex9#~r@i)zK zqx$I)=%0He_0J#EMwKUYLk}>`Hcfm%+IkCC@nXCuVLJ zuQqAd~@-GOg*#}A8*RvQG5@RC)%z>?j~M-d}42j?_}CTu6P?$ z&SB!sO?e8$^W&-c+Zgd}%@ZdSi(iz;Zkl-1-^VA;5Rckd+~vlwwEu_2k1&4% z<0cW^z$C(aOmEl&Jxj`%O8oHgRn`D1*hCE~}MdN^70nC%{|PmwDz`BzE& zC-Kz$ZH;);AIB%I6<=%eY!L5e+U;%PUzvKiSNvuk#`8ZczRBc&O1#$elP`*YWc+pU zOL-X2zg_$@STuL6LhnzDWKS^|M9p5mOIsB|bWDiqF(h z{7F-wuHw=Cl6ZV?@wZHTu6QqVTo@+4yD5KxcwIa-e;Xsdw`p&a#7{Eob%gl7Jd7tR z6MxzGT=AGGPp$Ytrd=H;{;=uCP7#mpH^i5Fws?iv?iYyfYWyP~>hl<@`Y6*Tqxww`h4q zE~>xy#2+NyK4{X2%Tbi{`yI{2bIp2XiuX6$v6J}Arv7_~kBJwBzx5SgV%BT0c>E{- z(TsWGSDAJ)TD;h7mtyf2rkx)lzQi1l%EhlV<(Vh`ky-9S@s1|`MDbpx-p&xe)Wn}J z{-mj&HR92J6Q8(Fe3+^K8^!0D^}SQPB@g3y9u!|>{Ba)d6%Uke&xz-lDX*~S8Fg+O zdy#w5)bq!Z$DR*=E%Ekw$e-AICgpF;`$_W84V$y)C0$=_=}(e1_Ri-xnWh{0qtRfT@S?*^_^Nc{$^Twx% zH#7Zq8GDg?&3Ki>7Z|UX_(`TcoFMVXnfTM$yCmJ`IZyJuYTC(a_T=}3M8~1z=OWh2 za_=z9y;XcSJ`Tq#?_TkGL4t$BW!-lYeLSJU7|Ix8w27Nk8B3B)&GjNdDGc-2VJxA8~u1d4RZW z=lhFKH~U4Qc%AXF;+Gqb)~B$fcdv?-uSs#c$WyRx#x|y zWzTl@{R17v?fvtvlIJ^@q zd2XwT&l3OHc#e1%e8AK1YrVt^jpwpwyW7lmA11!Zc!A`ZWAYp zne5p~&$m=d{I4c{k$9JOi5(?DL%*eD)wymfmz=*;-45_D|uF$JU58nVf+s9 z*Ns0Q{;ToF*t4Bo?z7_deF9r0PdD?();r<{8UILpp7F26R~r9`Jv-_5up0AmBHJCA zSpBZKc(w7i;>(P86klb$tGNAnWpDA{Onk0*U$ec2iI*EM5MN__jQG>Wi^YF4K8?M| ztuyE6W$ej+KXI=3c9W-;JpUTJQ__RAE{!J7AfcUHq@mTuySIP5(IiG)4;o)|Ix&M zAU@ChVEzm7b;iFFf6e%B;sed8;EsHLko@-nTZvaEuCCjSJmN`+VIA;x%S}IgLHf z-D=irg~Z=)%5$;!X5&|ie{1|&@gI!e%%11AnB{H~|K9k6;=6ZBO!Sy|p7Cedvz%S- zR`FjF)3~=K&rFl&1M#zre<8ln_;=zj8UKylcN(VtcjWWSENAb-w_?w8KbkzdiSJ<^ z?b}1V(DvyAV{p1j<_;`Vy;K*@8i$x|eLtMNm`w;G=&{-g2e{65Rs<<8}J|2(j% zw_3^5+1y}VDn7#asp7MZuMj`m_$BPg%l(tMy&rX*Kou2$SbM@ma<{7eCv0bp4a(ZZ`hAl&6!~E=~FRA8oaJ6L`Fn7DmV4EBAIbBj$umeivs>c&9w&i8iVrn@op_1y z=zc+-JK6X>Ql8$4>D^}WSB*a*{)zGD#S2XNUlpHje4F@2;~$AXYy2zrBKN4d|NJAn zIcfK0YsA<2$-n>Dj6Kh-H}%j~ym^nr70VW{G~QkO3FCdld+wQ-XOQ@M;|GerYrIIj zqxq5OA>w7mr-}b;yo|lb?Plt&iaq)7pw)>lODw)yD*2DwD{;c9;#V4v?&IXS?Zz*W z_$Iv)^IRp%U6IIcz4$8Q8zoPv$#akRa^nw+Z!rEh@n?*0VegRi`@e6BUu??rp5*z5 z$@95*mf69+6CZB;ck$`QcjEgy9g^P1)kb`cDNlR$Ja?MO6W!;^b2k|8E%7fH?=SwX z@%;nKEfgPM$}?6x&-i5VV&g}Omm4n^-)Ou_{8{65>_u+)PKgtaXXnaJm~g82!UT2h zT=qQIaqq+l7l|)1euemB#{VqdcAvyNH?e2BiHYp)6u0&BfaDot^88i2+W0f#7aD(A z{4V2fv1dBF-1jB^EffE_c%wdvEAUV8p2mL_A7i`;-?z$4`u*{i;zuW@ce}FZxdkTA z?&233?;(D#@jl{j86U`=ne_YJ!^Lg;94UD+`X&~1ocLbGr-+X?ew6qz#w*w}lm3oC zbRRa;%}HFWtCu{Nm^{ae-*5a>@$JUX6>qX{;sP#WPhRd7;?;@a?$45EZS0X55yl$40m6!=eY+>dHyM$ z(=Ty`U&K!|p27EF^W5&S#Q5gyMec+|c9|0Yo{8_Md2$nH=pvqHd@u2DjPJ|d#MLCG zaf8K=HGZJvxw3!agi+!T8y_eBk?|?wI}b?Aa};}%q`yZ{A%1^ixSJ<=VkS?$_z}jB z7eB%HsgmF97Vd2E@n*T_i?1-gTKq=ie_}6kM>kHKu%4YS<`O1s6wgUe=k8|Db9b2X zZO^$H(W{Tbu08y((_&VH@5=uIk1|to*z??|L5UOg62I1XKk=OgC&mvEpKLsjy=7AQ z4`MHJ-!xCmGm+hNRzBn~adY@})7kUfH-i)N%$9h&-RB4LEMzZo7n$djPGoPEnB0$@ zE^d#@=dt_ef`%l{a*6mI#{VRqIW#f;I`Mkrx3D*J=Ca9c5-&_l;~o&7Z2VF7BKNbo zK6*y{U2`3}Rs1Ux|Bm=>riwliKilN_TKrbyKZ)ONjz<~oso+I!h{@kV{26no+Ex5_ z<9moVGEJ+e_<3fz{lt5l^&KjHsp&Tg#LZ=~J6L?j9TGRdWbt;UoJWbDWA=-g?51)0 zl-1&^64Sed?EX0)(|%46?=~!PhSS7X8($&ba=*m*i^W$Mzf$~B_tZX8yCf|Gwpex_>E@2I6!=k z*^dqq|I)-y6klkLQ-`ygn+CpgrQ&=zgwj^BC%;GZ81cOzmcA|)H|$Ol=gj~U&lES8 z`|f;kd)&E{y@xZa<*pXD=Ly$~o6}x*t2h*ezuqIBV@gt2NB5qDg-QnVIoA^@kZ;e-q+vgsS5zjHl)5YRXnLH{>;@=oQ zNqmD@-!sMS`((}+Uug1NDt?>stHn2({MU}{e7o^V@$ZZuBX0ZW#o~j^ zc0WnnzMtw$al1dBFTTa(xm4V~&+2ON&8D2!i$7}oR`I8d-y?3@`9tFNIQXQvJr2Gg zZvU>tYvNEjw%=GUZqKW45kJi2xl7$_-@k}oZv1g^ z+peAyf6>IhBL2Kt?mObPfBsN>wTb^y-0m0Oi_bLizl$$5-gFOwEN7oAn|Wa`~>kIj2|lgi}4b1XY$Vyx6hHz z7jI+Y7m3?`^+a*|oZ;!>_Pppk@lGcHCF1ruz(0w1HSyPp+vnnL5$|o{?-K84{4e76 zIjhIT?Q=)ZiElG`USaQ$)E~Yh{u553j>@5tCT=qg;8UJMBTbUt6E#=d z?$0-Xrzg|7mU81n?wI5|6KS&@!e=Ld@jqOk=FLL zKyID*UNjj#H{{Sr^3Q*76Sw=tD-Hu!ALp^?@}?_Ygf+}6*t;ycl7@Oe3hMp`Dd z^S8up`QI0}<@sFPCrkKzn?s{5lin-)v$)OExJwjYNCWsZ6K@MfU)zW`H=ZTl&-fnV zwx8@FzQ2jzNBjWe{n^bADSXT@aobMv*_$QRbCI|$=LB(E&Z*+2IPNHMKFq_!@<5)s z;>ZeO)YW+ru*Urb+8{y7+XHXNCA|;}?mqG=90bVYf~^$4uBDZm*ke6+gqo z-!0zJ_+P}w7=KLM9`~OSxAnh8+#bK)5MOBWZx>%?{9|!@J@S?K(I)|POzsH_E(@ix~x{4oWytnu?{F4R?^=?93x(C@)wJ* zHa<<`8zoMdA#SfL=ZJ4k40ko+&l_J7@RP+KHt}bPKWcoH_!Gw0h}-3^4fqCed!P0; z@ztgt?iIJ!`wz2sa95i0JSD!(_>1Bn7=NAJ|9t_o-0kA_y6+S5925VI_;}+#i5DAh z+>Hv7?WP)UF23A&Tk$iDcNDkx-@1z5ZQ^^2+xOn&irf2dRLTrDng&Uq40mvn5oEY= zNj}WyZr|>*5c|Xn#{4h@Ttqg`6jT+}uaXb}D=Pxw28>YuMxGOMS&} zV~?Mw<%mDUo+)Fl;qQ9A#m+x8;A#4PpikNPB7pr{*=|3vcWKC@$Klr9sUG}9`4ma~ z9_;a_bF`o9$KF%J8~!d?0ek%UgdB~iDV;Z?zP6-xc4^--S2KgYl+;v|mY0-Q&Z?-b zbA8A5%TZrcQ(0Fb6Z%%x)|B?`r;`@c%rC2`tt}~^S8A!Ys&rw6&yzoXMA3xeehuGZ zgI!6aL(QwB9miJ5fq68Ps?6DlEIf|yAcFF~wd;ym#ZY67aWvat{zeNLM5zW*F@{j8!IWhv*$|p{2+cNx;)YO`q4X`*k8miZiS?s-V*UBw zel%;WA7zfkSh&H(c)eqO+tJi$E?QiyA1x);k5fi<*pHSG>rV@gaUI3Dbg}-C^IZKo z0~a_pfR{3WWdP5`^%UbOi*W_V2JpOGyRiYhEUxny*Gg7T2or>J0A*-#;Yo;D`ZBUKbnb3=I5ma`hjGkJbsMU#t*1?en4gQ16nyh;LSio zT5%dmBHjQru7#3ZzDJ7UBuz~7NcLPQ7B_uAKev7wO3891U#{fKm3+K!P@LrB-NcV` zW1*pxkM|rJmwen5Xk7C3mwf%DeElUKHxnPnjev%dZ-A^XHy3g#A2$#hmwdd3(YWN} zM&`%4fzeR%@h(c^Qa;{2XWpjprO>Cwqo8byvJfX zgCyoXg=Ub%L!_WXB#!qpKYggI_)tmA`w+RT_)y8mT@ShB8!Gv@AMze`Jp4s6#<)Xb zk(G~e2g4#+qwa@A^2Yi};;65pN%4I~GdJut4ZBUle&dgL(GJtF=lH|Dh-TKECZ>B$ zOm~}@?l&>rabmjX#B|q*>An-=MmMS;m+NNK$Y?lr(&SuiRWaVZrjG5eTPMc*8O=h) zq*-W4vv9-YFSLPZ7TEw%|4p+H&@43M$cA~TQL@mg`gysVr>f)KnC7J|K=aa&B6&aK zFIqdir?Y4^@jlNYZ6-PpknnEEUucu?mxhk4p;Wpo-6vz*SxoiEV4BGfxy{j#)`*5$ z{AhZAZZ5Psl#*A60%&z;VYE6lab8=zg*o3qeB+ur*xEG z({er1EDg2PP&wQq@+4hx?GvNpBTu4o^B1aH{-RYHFEI5SzA(H5Kja>ghEb(NRqn^R z(b14LIt?kMA94>yL#a&dkz$;PR*DutD@8+Jh8XuX{6#7x#=Q**Zz29dHC#}T%Z`7kd{RKM+`sV`T_X1e6iZnszh>k9jzhH*;Qo$< zV+-OtEB8V)g*!n0qU*{XpwG|ys?X0uj?fZthsdJq9JL8QkJKp-IYOJeZuwm9_Gl7s z*QsM;e0=jm-tIJ{g3yq*B@Jn@G?doQC%V3Mb3OYZR}~Fu*?!19ISpx?x(eQHe5>c< zop1F#^d;Z}G7V+D_<&5~vR3iFK(>k=nPYs4LXlGSdWeorYyAY?dkP9-+Bxb@#K&x! zE{o)2HjUFFDW3PSk(e`xpujs1{diQ*(U9V(ZfO3fO~|ky#z!ANUo`aNl0O>y zammX=$`iGd821=HA6F3#siFEjJft{jxY~i}uF2cX$MgF7cwKMZQT2eOyC?6R6i@X* z@lr3mt^IO%U!|dT4tz#WGjN6Z8Dv{Ump?u-I@RDWk}EpZpn15G{5;YoqpK$lrRwA_ z4U?oIctxpT4F%9Iyvx!&x~s-`SM|%`%JB1OrNsEughQnv#dKGVaigVqqyn^}V!G?b z_%xqq)+O^UOY=w_Xk|v{FciwWFn`fH;9ZvHkvh-{j?QT~RO^7xX;`EVxbkUz8VaCa z8oFjaDEdBw_f6kt@Q`xov9aNNA-bC6Nm1L*)gCm)7Y;my7R+C0L6nwD;?wE`zLuZ} zzL?-I+Vk@<&d(EdsUxEyM`-2i-rKOZMm+@06YU-ioo-C~))-%OP!`>zqbu8~W3_kU zZR~p~?w$RRYlMch1^keY0yLyjaIZw`LcJ0XeXpeJ#(e-UN;jVNz%jm*;Yqr&_+o~o zVRqd(ywB4ly`YI!f>txy>!Tq@Xyx&>4vSV6U+vI5ytRCF>XP~LheLIr;R_%Z*=*c& zeQRiF!hElTBKVq!zvz;=6ZXrA8n-`FXgD>|l4!Ra<9?ZE=Em&jp(MU;xt?f9I|dD@ ztTd!JKjZ@XAs2(T0dGv&1{6R?23Zw73~Ni#Q)E7p_`Qfv^!y&7Cw$sWw3TQh;Y(AB zmrB!3%O`Gr4RphDfqfjeW}jDEwH`)wE9;d3U$RoX^cp<$`E-->7N>EkUEZt|FFl5? zmv;NSkttrv$(OVg&lT*;BlV(Nm=6y=UbiQ2&Z%SdiZ!N}%+XFl6-*1J3Z|i-Q8#Wh zCZ(j6;jJR$vf*VGDH@lkAi4tcHN^*cpHN!AwtdY{rxJcWYIM)k52)H{;d*N%ruS5$6Azw5<=`(=0{)^^rZ-ZeTZ}wO*QTLb z8g^N|n-ZOxP_W)liS8q^P+jpCYBc;sYK0Gbel;5oe^RRry_z)ih8{~Al=en^Zs{8o zR}XanQeAq$<$DHxD>s}WQ+|r4m8N*vn%ZpjSle)ROw04@*^9GY2^(99!7jphbJ!)Q_cd0(J7Y7#W0BGZr(Q5=oaP{$>ooPPJ` zV=~24RnU-1>xX=`L-Wxp(~$DhkTyH5Ta+hiaekb46hD;H|6D%xqdZaGTwZ62)A?zA zXgn%!E}tsXxaOthQa+i^r<#;6^8S1UN7JMAj*h=Hzia|N+oAH(@@W{YS1z9t`#9d? zX(;)*8TvThXf%}i=Ib3F$K!sed9)t5Lm-#+4KJco(KPsUJQD`f)zi(NO9`x`JFj)_Iq9 z72WuvdZ6t^Ls~u!qqZHBdW&v7`2Ln#Fb$*ij_&N!cvPO~s88cjd7_&QG#;&2bgO~J zqxFhzVEA!qN731b(@P8i){pnS4CX;0Ce0Lm-vlJ8K_ zxYRG-fTR4fePut3PQJ)xyKt97+8$Ot&)b)>q|Y#PAh#kAAS6}Pqar%2QB-t?6%Sy%T6i#u5{tD=W@sG7e#AG zOO%T8gQ;VqwT@c8G(h&K^svUz3e%0`oICQX93 ztX~#Yh95|~i&jMTN;yZB9$d~irKR$Y>gS^h^8;E%Kaf@s)s*ZTvMb0QpogKTqUB(v z$FiuRLCuQ`J%)T04KG$_EY_ zkMcwZ47!4)mGQ2_=-kiWI~H#kaz1|_ml}tUZx~8`x%i6i`upj!e$icj8t?DsRm>|} zu-GlAsjRM>Nzc42Dy^(5sjVxmtFLuswUzuNO=Wdu9Yxkw)VaFSnpqWfCI0`0$@SG7 zpwV^y=iap?W%H|NR?cdODXpt3Et_3ZR$5gxqqJ;pgO^t%x;(oxZ+>}&P2mew0}EYH zURqbtkf)wUOG;}OSC=*5Okb|r*$tyqZd$YWTou)&GpZ^|7R+miDX*+m^3N8vljn=* zHAoj`=)*>FH?N6v`W!k9w?n+Tjo(vJ(vw#Q?-b9kZsYq&2tEJx5#%2vPUUeZY|TtkA-?rxAD^@KRu)OG33|hVaY!M zUn24JI?YePPZOu*j)Uc@+vV!>%T)iLL7odGkF9@on`gDeQ~i7ZdDLzE<&YoiU){!E z1^GXO{OUIT8i~*JL#%&w8-KIJ+xmPM{Bu}tTXDM|soVVed_C3A7m!EY#`9yVK9