<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:taxo="http://purl.org/rss/1.0/modules/taxonomy/" version="2.0">
  <channel>
    <title>LPC MicrocontrollersのトピックHelp with ECDSA Verification in LPC55S28 Bootloader (32KB Size Limit)</title>
    <link>https://community.nxp.com/t5/LPC-Microcontrollers/Help-with-ECDSA-Verification-in-LPC55S28-Bootloader-32KB-Size/m-p/2065738#M57945</link>
    <description>&lt;P class=""&gt;Hello NXP Community,&lt;/P&gt;&lt;P class=""&gt;I'm developing a secure bootloader for the LPC55S28 and have run into a significant code size issue when implementing ECDSA signature verification.&lt;/P&gt;&lt;H3&gt;Current Issue&lt;/H3&gt;&lt;P class=""&gt;My bootloader needs to verify ECDSA P-256 signatures, and it must fit within a 32KB flash region. When using mbedTLS for ECDSA verification (even with a minimal configuration that only enables ECDSA), my code size explodes from approximately 13KB to 56KB:&lt;/P&gt;&lt;LI-SPOILER&gt;Name Run address Load address Size Type&lt;BR /&gt;.text 0x0 n/a 56412 section&lt;BR /&gt;mpi_mul_hlp 0x9ae2 n/a 6388 local function&lt;BR /&gt;ecp_mod_p256 0x839c n/a 2032 local function&lt;BR /&gt;shiftleft 0x2bd0 n/a 1792 local function&lt;BR /&gt;MultprecCiosMul521_ct 0x4fdc n/a 1772 local function&lt;BR /&gt;shiftright 0x2514 n/a 1724 local function&lt;BR /&gt;double_scalar_multiplication 0x3fb4 n/a 1580 global function&lt;BR /&gt;MultprecCiosMul_ct 0x1b4c n/a 1444 local function&lt;BR /&gt;mbedtls_mpi_div_mpi 0xb69c n/a 1316 global function&lt;BR /&gt;mbedtls_mpi_inv_mod 0xbdfa n/a 1090 global function&lt;BR /&gt;precompute_double_scalar_LUT16 0x3aac n/a 1084 local function&lt;BR /&gt;invert_mod_p384 0x4884 n/a 1062 local function&lt;BR /&gt;ecp_double_jac 0x7d6c n/a 972 local function&lt;BR /&gt;ecp_add_mixed 0xac8 n/a 912 local function&lt;BR /&gt;mbedtls_ecp_muladd_restartable 0xea8 n/a 868 global function&lt;BR /&gt;Jac_addition 0x33ec n/a 776 global function&lt;BR /&gt;StrFormatPrintf 0x735c n/a 700 global function&lt;BR /&gt;invert_mod_p521 0x4d14 n/a 616 local function&lt;BR /&gt;invert_mod_p256 0x45e0 n/a 576 local function&lt;BR /&gt;verify_ecdsa_signature 0x4a4 n/a 544 local function&lt;BR /&gt;Jac_add_affine 0x36f4 n/a 536 global function&lt;BR /&gt;ecdsa_verify_restartable 0x12c0 n/a 504 local function&lt;BR /&gt;USART_Init 0x6404 n/a 460 global function&lt;BR /&gt;mbedtls_mpi_gcd 0xbc4a n/a 432 global function&lt;BR /&gt;CASPER_montadd 0x21f0 n/a 428 local function&lt;BR /&gt;hashcrypt_sha_process_message_data 0x5ddc n/a 420 local function&lt;BR /&gt;Jac_double 0x390c n/a 416 global function&lt;BR /&gt;USART_SetBaudRate 0x6650 n/a 396 global function&lt;BR /&gt;mbedtls_mpi_mul_mpi 0xb3d6 n/a 382 global function&lt;BR /&gt;CLOCK_SetFLASHAccessCyclesForFreq 0x5888 n/a 380 global function&lt;BR /&gt;__aeabi_uldivmod 0xd048 n/a 372 global function&lt;BR /&gt;mbedtls_mpi_add_abs 0x96ba n/a 366 global function&lt;BR /&gt;read_and_verify_toc 0x6c4 n/a 364 local function&lt;BR /&gt;CASPER_ECC_SECP521R1_MulAdd 0x19f4 n/a 344 global function&lt;BR /&gt;CASPER_half 0x239c n/a 340 local function&lt;BR /&gt;lowpower_set_system_voltage 0x6024 n/a 340 local function&lt;BR /&gt;mbedtls_mpi_shift_l 0x91bc n/a 330 global function&lt;BR /&gt;mbedtls_mpi_sub_abs 0x98ba n/a 326 global function&lt;BR /&gt;CASPER_ECC_SECP256R1_MulAdd 0x179c n/a 324 global function&lt;BR /&gt;DbgConsole_Init 0x2b0 n/a 312 global function&lt;BR /&gt;mbedtls_mpi_shift_r 0x9306 n/a 310 global function&lt;BR /&gt;mbedtls_mpi_cmp_mpi 0x9540 n/a 310 global function&lt;BR /&gt;__Vectors 0x0 n/a 304 global object&lt;BR /&gt;g_pfnVectors 0x0 n/a 304 global object&lt;BR /&gt;CASPER_ECC_SECP384R1_MulAdd 0x18e0 n/a 276 global function&lt;BR /&gt;HAL_UartInitCommon 0x68cc n/a 272 local function&lt;BR /&gt;mbedtls_mpi_cmp_abs 0x943c n/a 260 global function&lt;BR /&gt;CASPER_montsub 0x20f0 n/a 256 local function&lt;BR /&gt;CASPER_MEMCPY 0x14e0 n/a 252 global function&lt;BR /&gt;fseek 0x6d50 n/a 248 global function&lt;BR /&gt;ecp_normalize_jac 0x7c78 n/a 244 local function&lt;BR /&gt;hashcrypt_sha_finalize 0xc5e2 n/a 238 local function&lt;BR /&gt;lowpower_set_dcdc_power_profile 0x6178 n/a 236 local function&lt;BR /&gt;mbedtls_mpi_copy 0x8cf6 n/a 210 global function&lt;BR /&gt;ecp_modp 0x9f8 n/a 208 local function&lt;BR /&gt;HASHCRYPT_SHA_Update 0xc7ac n/a 208 global function&lt;BR /&gt;precompute_double_scalar_LUT4 0x3ee8 n/a 204 local function&lt;BR /&gt;mbedtls_ecp_point_read_binary 0x930 n/a 200 global function&lt;BR /&gt;malloc 0x6b2c n/a 200 global function&lt;BR /&gt;mbedtls_mpi_write_binary 0x90f4 n/a 200 global function&lt;BR /&gt;ConvertRadixNumToString 0x7208 n/a 194 local function&lt;BR /&gt;HASHCRYPT_SHA_Finish 0xc87c n/a 184 global function&lt;BR /&gt;mbedtls_int_div_int 0xb5e8 n/a 180 local function&lt;BR /&gt;mbedtls_ecp_fix_negative 0x82f0 n/a 172 local function&lt;BR /&gt;lowpower_set_voltage_for_process 0xc934 n/a 170 local function&lt;BR /&gt;Jac_toAffine 0x3348 n/a 164 global function&lt;BR /&gt;HASHCRYPT_DriverIRQHandler 0x5f80 n/a 164 global function&lt;BR /&gt;ecp_group_load 0x81c2 n/a 162 local function&lt;BR /&gt;CLOCK_AttachClk 0x56e8 n/a 160 global function&lt;BR /&gt;add_sub_mpi 0x9a00 n/a 156 local function&lt;BR /&gt;mbedtls_ecp_group_free 0x7966 n/a 152 global function&lt;BR /&gt;lowpower_get_part_process_corner 0x6264 n/a 148 local function&lt;BR /&gt;mbedtls_mpi_mul_int 0xb554 n/a 148 global function&lt;BR /&gt;derive_mpi 0xc23c n/a 148 local function&lt;BR /&gt;mpi_sub_hlp 0x9828 n/a 146 local function&lt;BR /&gt;casper_select 0x15dc n/a 144 local function&lt;BR /&gt;hashcrypt_get_data 0xc454 n/a 144 local function&lt;BR /&gt;USART_WriteBlocking 0x67dc n/a 140 global function&lt;BR /&gt;PrintGetPrecision 0x6fba n/a 140 local function&lt;BR /&gt;mbedtls_mpi_mod_mpi 0xbbc0 n/a 138 global function&lt;BR /&gt;mbedtls_ecp_group_load 0x1238 n/a 136 global function&lt;BR /&gt;main 0x8ac n/a 132 global function&lt;BR /&gt;mbedtls_mpi_grow 0x8c1c n/a 132 global function&lt;BR /&gt;CLOCK_SetClkDiv 0x5788 n/a 128 global function&lt;BR /&gt;CLOCK_SetupFROClocking 0x5808 n/a 128 global function&lt;BR /&gt;USART_GetDefaultConfig 0x65d0 n/a 128 global function&lt;BR /&gt;mbedtls_ecp_group_init 0x7888 n/a 126 global function&lt;BR /&gt;jump_to_application 0x830 n/a 124 local function&lt;BR /&gt;mbedtls_mpi_read_binary 0x907a n/a 122 global function&lt;BR /&gt;CASPER_ecc_init 0x166c n/a 120 global function&lt;BR /&gt;multiply_casper 0x32d0 n/a 120 local function&lt;BR /&gt;_initio 0x6bf4 n/a 120 global function&lt;BR /&gt;FLEXCOMM_SetPeriph 0xc3e0 n/a 116 local function&lt;BR /&gt;CASPER_ECC_equal 0x16e4 n/a 112 global function&lt;BR /&gt;_Cwritebuf 0x6ca8 n/a 108 global function&lt;BR /&gt;hashcrypt_sha_one_block 0xc576 n/a 108 local function&lt;BR /&gt;PrintGetWidth 0x6f50 n/a 106 local function&lt;BR /&gt;DbgConsole_Vprintf 0x3e8 n/a 104 global function&lt;BR /&gt;toMontgomery_ECC_P384 0x4cac n/a 104 local function&lt;BR /&gt;mbedtls_mpi_bitlen 0x8f30 n/a 104 global function&lt;BR /&gt;_fdopen 0xcee2 n/a 104 global function&lt;BR /&gt;DbgConsole_PrintCallback 0x6ebe n/a 102 local function&lt;BR /&gt;mbedtls_mpi_lsb 0x8e88 n/a 102 global function&lt;BR /&gt;mpi_bigendian_to_host 0x9014 n/a 102 local function&lt;BR /&gt;ResetISR 0x180 n/a 100 global function&lt;BR /&gt;toMontgomery_ECC_P256 0x4820 n/a 100 local function&lt;BR /&gt;SystemInit 0x6868 n/a 100 weak function&lt;BR /&gt;HAL_UartSendBlocking 0x69dc n/a 100 global function&lt;BR /&gt;FLEXCOMM_PeripheralIsPresent 0xc37c n/a 100 local function&lt;BR /&gt;mbedtls_ecp_copy 0x7a48 n/a 98 global function&lt;BR /&gt;toMontgomery_ECC_P521 0x4f7c n/a 96 local function&lt;BR /&gt;RESET_ClearPeripheralReset 0x63a4 n/a 96 global function&lt;BR /&gt;mbedtls_mpi_sub_mod 0x7b64 n/a 96 local function&lt;BR /&gt;SerialManager_Init 0xcb56 n/a 96 global function&lt;BR /&gt;SerialManager_OpenReadHandle 0xcc06 n/a 96 global function&lt;BR /&gt;reverse_array 0x8138 n/a 94 local function&lt;BR /&gt;HASHCRYPT_SHA 0xc6fe n/a 94 global function&lt;BR /&gt;FLEXCOMM0_DriverIRQHandler 0x5aa0 n/a 92 global function&lt;BR /&gt;FLEXCOMM1_DriverIRQHandler 0x5afc n/a 92 global function&lt;BR /&gt;FLEXCOMM2_DriverIRQHandler 0x5b58 n/a 92 global function&lt;BR /&gt;FLEXCOMM3_DriverIRQHandler 0x5bb4 n/a 92 global function&lt;BR /&gt;FLEXCOMM4_DriverIRQHandler 0x5c10 n/a 92 global function&lt;BR /&gt;FLEXCOMM5_DriverIRQHandler 0x5c6c n/a 92 global function&lt;BR /&gt;FLEXCOMM6_DriverIRQHandler 0x5cc8 n/a 92 global function&lt;BR /&gt;FLEXCOMM7_DriverIRQHandler 0x5d24 n/a 92 global function&lt;BR /&gt;FLEXCOMM8_DriverIRQHandler 0x5d80 n/a 92 global function&lt;BR /&gt;RESET_SetPeripheralReset 0x6348 n/a 92 global function&lt;BR /&gt;mbedtls_mpi_add_mod 0x7bc4 n/a 92 local function&lt;BR /&gt;mbedtls_mpi_lset 0x8dea n/a 92 global function&lt;BR /&gt;BOARD_BootClockFROHF96M 0x6a98 n/a 88 global function&lt;BR /&gt;mbedtls_mpi_shift_l_mod 0x7c20 n/a 88 local function&lt;BR /&gt;fclose 0xcf9c n/a 88 global function&lt;BR /&gt;mbedtls_mpi_resize_clear 0x8ca0 n/a 86 local function&lt;BR /&gt;DbgConsole_SendDataReliable 0x25c n/a 84 global function&lt;BR /&gt;calculate_sha256 0x450 n/a 84 local function&lt;BR /&gt;mbedtls_ecp_set_zero 0x7aaa n/a 82 global function&lt;BR /&gt;_fflush 0xcf4a n/a 82 global function&lt;BR /&gt;ecp_add 0xe58 n/a 80 global function&lt;BR /&gt;FLEXCOMM_Init 0x5a50 n/a 80 global function&lt;BR /&gt;POWER_SetVoltageForFreq 0x62f8 n/a 80 global function&lt;BR /&gt;HASHCRYPT_SHA_Init 0xc75c n/a 80 global function&lt;BR /&gt;SerialManager_OpenWriteHandle 0xcbb6 n/a 80 global function&lt;BR /&gt;calloc 0xcdc6 n/a 80 global function&lt;BR /&gt;strlen 0xce54 n/a 78 global function&lt;BR /&gt;FLEXCOMM_GetInstance 0x5a04 n/a 76 global function&lt;BR /&gt;mbedtls_mpi_free 0x8bd0 n/a 76 global function&lt;BR /&gt;CASPER_ECC_equal_to_zero 0x1754 n/a 72 global function&lt;BR /&gt;mpi_uint_bigendian_to_host_c 0x8fb4 n/a 72 local function&lt;BR /&gt;add32 0x8264 n/a 70 local function&lt;BR /&gt;sub32 0x82aa n/a 70 local function&lt;BR /&gt;ftell 0x6e48 n/a 68 global function&lt;BR /&gt;PrintOutputdifFobpu 0x70aa n/a 68 local function&lt;BR /&gt;PrintOutputxX 0x70ee n/a 68 local function&lt;BR /&gt;mbedtls_mpi_cmp_int 0x9676 n/a 68 global function&lt;BR /&gt;SerialManager_Write 0xcb12 n/a 68 local function&lt;BR /&gt;mbedtls_mpi_get_bit 0x8e46 n/a 66 global function&lt;BR /&gt;mbedtls_clz 0x8eee n/a 66 local function&lt;BR /&gt;PrintGetRadixFromobpu 0x71c8 n/a 64 local function&lt;BR /&gt;mbedtls_mpi_mul_mod 0x7b24 n/a 64 local function&lt;BR /&gt;_deferredlazyseek 0xcea2 n/a 64 global function&lt;BR /&gt;_do_fflush 0xd008 n/a 64 global function&lt;BR /&gt;toc_verification_key 0xda84 n/a 64 local object&lt;BR /&gt;PrintFilterLengthFlag 0x718a n/a 62 local function&lt;BR /&gt;Serial_UartInit 0xcc86 n/a 62 global function&lt;BR /&gt;setvbuf 0xce16 n/a 62 global function&lt;BR /&gt;BOARD_InitDEBUG_UARTPins 0x6af0 n/a 60 global function&lt;BR /&gt;_sbrk 0x6c6c n/a 60 global function&lt;BR /&gt;fflush 0x6d14 n/a 60 global function&lt;BR /&gt;hashcrypt_sha_check_input_args 0xc53a n/a 60 local function&lt;BR /&gt;BOARD_InitDebugConsole 0x6a40 n/a 56 global function&lt;BR /&gt;PrintIsobpu 0x7046 n/a 56 local function&lt;BR /&gt;USART_EnableContinuousSCLK 0xc9fa n/a 56 local function&lt;BR /&gt;SerialManager_StartWriting 0xcada n/a 56 local function&lt;BR /&gt;Serial_UartWrite 0xccc4 n/a 56 global function&lt;BR /&gt;HardFault_Handler 0x77f8 n/a 54 global function&lt;BR /&gt;HAL_UartInit 0xca62 n/a 54 global function&lt;BR /&gt;mbedtls_ecp_point_free 0x7932 n/a 52 global function&lt;BR /&gt;mbedtls_ecp_keypair_free_o 0x79fe n/a 52 global function&lt;BR /&gt;__aeabi_lowlevel_memset 0xd1f2 n/a 50 global function&lt;BR /&gt;mbedtls_ecdsa_verify 0xc2e8 n/a 48 global function&lt;BR /&gt;CLOCK_EnableClock 0xc34c n/a 48 local function&lt;BR /&gt;free 0xcd96 n/a 48 global function&lt;BR /&gt;mbedtls_ecp_get_type 0x782e n/a 46 global function&lt;BR /&gt;IOCON_PinMuxSet 0xcd46 n/a 46 local function&lt;BR /&gt;__assertion_failed 0x230 n/a 44 global function&lt;BR /&gt;ecp_mpi_set1 0x120c n/a 44 local function&lt;BR /&gt;DbgConsole_Printf 0x6f24 n/a 44 global function&lt;BR /&gt;PrintIsdi 0x707e n/a 44 local function&lt;BR /&gt;PrintIsfF 0x7132 n/a 44 local function&lt;BR /&gt;PrintIsxX 0x715e n/a 44 local function&lt;BR /&gt;mbedtls_ecp_point_init 0x785c n/a 44 global function&lt;BR /&gt;mbedtls_ecp_keypair_init 0x7906 n/a 44 global function&lt;BR /&gt;ecp_mpi_load 0x8196 n/a 44 local function&lt;BR /&gt;hashcrypt_engine_init 0xc4e4 n/a 44 local function&lt;BR /&gt;hashcrypt_sha_check_input_alg 0xc510 n/a 42 local function&lt;BR /&gt;__aeabi_memcpy4 0xd1c8 n/a 42 global function&lt;BR /&gt;__aeabi_memcpy8 0xd1c8 n/a 42 global function&lt;BR /&gt;mbedtls_platform_zeroize 0x14b8 n/a 40 global function&lt;BR /&gt;mbedtls_ecp_is_zero 0x7afc n/a 40 global function&lt;BR /&gt;StrFormatExaminedi 0x72ca n/a 38 local function&lt;BR /&gt;StrFormatExaminexX 0x72f0 n/a 38 local function&lt;BR /&gt;StrFormatExamineobpu 0x7316 n/a 38 local function&lt;BR /&gt;mbedtls_mpi_init 0x8baa n/a 38 global function&lt;BR /&gt;casper_get_word 0x24f0 n/a 36 local function&lt;BR /&gt;mbedtls_mpi_sub_mpi 0x9abe n/a 36 global function&lt;BR /&gt;s_flexcommBaseAddrs 0xdbd8 n/a 36 local object&lt;BR /&gt;s_flexcommResets 0xdc10 n/a 36 local object&lt;BR /&gt;mpi_sint_abs 0x8dc8 n/a 34 local function&lt;BR /&gt;mbedtls_mpi_add_mpi 0x9a9c n/a 34 global function&lt;BR /&gt;HAL_UartGetStatus 0xca40 n/a 34 local function&lt;BR /&gt;DisableGlobalIRQ 0xca98 n/a 34 local function&lt;BR /&gt;POWER_DisablePD 0x56c8 n/a 32 local function&lt;BR /&gt;ConvertPrecisionWidthToLength 0x733c n/a 32 local function&lt;BR /&gt;EnableGlobalIRQ 0xcaba n/a 32 local function&lt;BR /&gt;SerialManager_WriteBlocking 0xcc66 n/a 32 global function&lt;BR /&gt;secp256r1_p 0xdac4 n/a 32 local object&lt;BR /&gt;secp256r1_a 0xdae4 n/a 32 local object&lt;BR /&gt;secp256r1_b 0xdb04 n/a 32 local object&lt;BR /&gt;secp256r1_gx 0xdb24 n/a 32 local object&lt;BR /&gt;secp256r1_gy 0xdb44 n/a 32 local object&lt;BR /&gt;secp256r1_n 0xdb64 n/a 32 local object&lt;BR /&gt;s_UsartAdapterBase 0xdc34 n/a 32 local object&lt;BR /&gt;data_init 0x1e8 n/a 30 global function&lt;BR /&gt;mbedtls_mpi_zeroize 0x8b8c n/a 30 local function&lt;BR /&gt;mbedtls_ecdsa_free 0xc32e n/a 30 global function&lt;BR /&gt;mbedtls_mpi_size 0x8f98 n/a 28 global function&lt;BR /&gt;RESET_PeripheralReset 0xc9de n/a 28 global function&lt;BR /&gt;fsl_assert_hook 0x6ea4 n/a 26 weak function&lt;BR /&gt;__check_heap_overflow 0x6e8c n/a 24 global function&lt;BR /&gt;mpi_uint_bigendian_to_host 0x8ffc n/a 24 local function&lt;BR /&gt;mbedtls_ecdsa_can_do 0xc2d0 n/a 24 global function&lt;BR /&gt;hashcrypt_save_running_hash 0xc6d0 n/a 24 local function&lt;BR /&gt;mbedtls_ecp_keypair_free 0x7a32 n/a 22 global function&lt;BR /&gt;mbedtls_ecdsa_init 0xc318 n/a 22 global function&lt;BR /&gt;hashcrypt_restore_running_hash 0xc6e8 n/a 22 local function&lt;BR /&gt;remove 0xcff4 n/a 20 global function&lt;BR /&gt;bss_init 0x206 n/a 18 global function&lt;BR /&gt;s_flexcommClocks 0xdbfc n/a 18 local object&lt;BR /&gt;SystemInitHook 0xca32 n/a 14 weak function&lt;BR /&gt;BOARD_InitPeripherals 0xccfc n/a 14 global function&lt;BR /&gt;__main 0xcd80 n/a 14 global function&lt;BR /&gt;BOARD_InitBootPeripherals 0xcd0a n/a 12 global function&lt;BR /&gt;BOARD_InitBootPins 0xcd74 n/a 12 global function&lt;BR /&gt;__aeabi_memcpy 0xd1be n/a 10 global function&lt;/LI-SPOILER&gt;&lt;P class=""&gt;As far as I know, the CASPER&amp;nbsp; can't perform ECDSA verification on its own - it seems to require mbedTLS as a wrapper, which brings in all the additional code.&lt;/P&gt;&lt;P class=""&gt;I've deactivated almost everything in the&amp;nbsp;ksdk_mbedtls_config.h file.&lt;BR /&gt;&lt;BR /&gt;&lt;/P&gt;&lt;H3&gt;Questions&lt;/H3&gt;&lt;OL&gt;&lt;LI&gt;Is there a way to use the CASPER hardware directly for ECDSA verification without the mbedTLS overhead?&lt;/LI&gt;&lt;LI&gt;Are there any ROM-based cryptographic functions in the LPC55S28 that could handle ECDSA verification?&lt;/LI&gt;&lt;LI&gt;Does anyone have a minimal implementation of ECDSA P-256 verification for the LPC55S28 that could fit within my 32KB constraint?&lt;/LI&gt;&lt;LI&gt;Are there alternatives to mbedTLS with a smaller footprint?&lt;/LI&gt;&lt;/OL&gt;</description>
    <pubDate>Thu, 20 Mar 2025 17:30:09 GMT</pubDate>
    <dc:creator>SegFault02</dc:creator>
    <dc:date>2025-03-20T17:30:09Z</dc:date>
    <item>
      <title>Help with ECDSA Verification in LPC55S28 Bootloader (32KB Size Limit)</title>
      <link>https://community.nxp.com/t5/LPC-Microcontrollers/Help-with-ECDSA-Verification-in-LPC55S28-Bootloader-32KB-Size/m-p/2065738#M57945</link>
      <description>&lt;P class=""&gt;Hello NXP Community,&lt;/P&gt;&lt;P class=""&gt;I'm developing a secure bootloader for the LPC55S28 and have run into a significant code size issue when implementing ECDSA signature verification.&lt;/P&gt;&lt;H3&gt;Current Issue&lt;/H3&gt;&lt;P class=""&gt;My bootloader needs to verify ECDSA P-256 signatures, and it must fit within a 32KB flash region. When using mbedTLS for ECDSA verification (even with a minimal configuration that only enables ECDSA), my code size explodes from approximately 13KB to 56KB:&lt;/P&gt;&lt;LI-SPOILER&gt;Name Run address Load address Size Type&lt;BR /&gt;.text 0x0 n/a 56412 section&lt;BR /&gt;mpi_mul_hlp 0x9ae2 n/a 6388 local function&lt;BR /&gt;ecp_mod_p256 0x839c n/a 2032 local function&lt;BR /&gt;shiftleft 0x2bd0 n/a 1792 local function&lt;BR /&gt;MultprecCiosMul521_ct 0x4fdc n/a 1772 local function&lt;BR /&gt;shiftright 0x2514 n/a 1724 local function&lt;BR /&gt;double_scalar_multiplication 0x3fb4 n/a 1580 global function&lt;BR /&gt;MultprecCiosMul_ct 0x1b4c n/a 1444 local function&lt;BR /&gt;mbedtls_mpi_div_mpi 0xb69c n/a 1316 global function&lt;BR /&gt;mbedtls_mpi_inv_mod 0xbdfa n/a 1090 global function&lt;BR /&gt;precompute_double_scalar_LUT16 0x3aac n/a 1084 local function&lt;BR /&gt;invert_mod_p384 0x4884 n/a 1062 local function&lt;BR /&gt;ecp_double_jac 0x7d6c n/a 972 local function&lt;BR /&gt;ecp_add_mixed 0xac8 n/a 912 local function&lt;BR /&gt;mbedtls_ecp_muladd_restartable 0xea8 n/a 868 global function&lt;BR /&gt;Jac_addition 0x33ec n/a 776 global function&lt;BR /&gt;StrFormatPrintf 0x735c n/a 700 global function&lt;BR /&gt;invert_mod_p521 0x4d14 n/a 616 local function&lt;BR /&gt;invert_mod_p256 0x45e0 n/a 576 local function&lt;BR /&gt;verify_ecdsa_signature 0x4a4 n/a 544 local function&lt;BR /&gt;Jac_add_affine 0x36f4 n/a 536 global function&lt;BR /&gt;ecdsa_verify_restartable 0x12c0 n/a 504 local function&lt;BR /&gt;USART_Init 0x6404 n/a 460 global function&lt;BR /&gt;mbedtls_mpi_gcd 0xbc4a n/a 432 global function&lt;BR /&gt;CASPER_montadd 0x21f0 n/a 428 local function&lt;BR /&gt;hashcrypt_sha_process_message_data 0x5ddc n/a 420 local function&lt;BR /&gt;Jac_double 0x390c n/a 416 global function&lt;BR /&gt;USART_SetBaudRate 0x6650 n/a 396 global function&lt;BR /&gt;mbedtls_mpi_mul_mpi 0xb3d6 n/a 382 global function&lt;BR /&gt;CLOCK_SetFLASHAccessCyclesForFreq 0x5888 n/a 380 global function&lt;BR /&gt;__aeabi_uldivmod 0xd048 n/a 372 global function&lt;BR /&gt;mbedtls_mpi_add_abs 0x96ba n/a 366 global function&lt;BR /&gt;read_and_verify_toc 0x6c4 n/a 364 local function&lt;BR /&gt;CASPER_ECC_SECP521R1_MulAdd 0x19f4 n/a 344 global function&lt;BR /&gt;CASPER_half 0x239c n/a 340 local function&lt;BR /&gt;lowpower_set_system_voltage 0x6024 n/a 340 local function&lt;BR /&gt;mbedtls_mpi_shift_l 0x91bc n/a 330 global function&lt;BR /&gt;mbedtls_mpi_sub_abs 0x98ba n/a 326 global function&lt;BR /&gt;CASPER_ECC_SECP256R1_MulAdd 0x179c n/a 324 global function&lt;BR /&gt;DbgConsole_Init 0x2b0 n/a 312 global function&lt;BR /&gt;mbedtls_mpi_shift_r 0x9306 n/a 310 global function&lt;BR /&gt;mbedtls_mpi_cmp_mpi 0x9540 n/a 310 global function&lt;BR /&gt;__Vectors 0x0 n/a 304 global object&lt;BR /&gt;g_pfnVectors 0x0 n/a 304 global object&lt;BR /&gt;CASPER_ECC_SECP384R1_MulAdd 0x18e0 n/a 276 global function&lt;BR /&gt;HAL_UartInitCommon 0x68cc n/a 272 local function&lt;BR /&gt;mbedtls_mpi_cmp_abs 0x943c n/a 260 global function&lt;BR /&gt;CASPER_montsub 0x20f0 n/a 256 local function&lt;BR /&gt;CASPER_MEMCPY 0x14e0 n/a 252 global function&lt;BR /&gt;fseek 0x6d50 n/a 248 global function&lt;BR /&gt;ecp_normalize_jac 0x7c78 n/a 244 local function&lt;BR /&gt;hashcrypt_sha_finalize 0xc5e2 n/a 238 local function&lt;BR /&gt;lowpower_set_dcdc_power_profile 0x6178 n/a 236 local function&lt;BR /&gt;mbedtls_mpi_copy 0x8cf6 n/a 210 global function&lt;BR /&gt;ecp_modp 0x9f8 n/a 208 local function&lt;BR /&gt;HASHCRYPT_SHA_Update 0xc7ac n/a 208 global function&lt;BR /&gt;precompute_double_scalar_LUT4 0x3ee8 n/a 204 local function&lt;BR /&gt;mbedtls_ecp_point_read_binary 0x930 n/a 200 global function&lt;BR /&gt;malloc 0x6b2c n/a 200 global function&lt;BR /&gt;mbedtls_mpi_write_binary 0x90f4 n/a 200 global function&lt;BR /&gt;ConvertRadixNumToString 0x7208 n/a 194 local function&lt;BR /&gt;HASHCRYPT_SHA_Finish 0xc87c n/a 184 global function&lt;BR /&gt;mbedtls_int_div_int 0xb5e8 n/a 180 local function&lt;BR /&gt;mbedtls_ecp_fix_negative 0x82f0 n/a 172 local function&lt;BR /&gt;lowpower_set_voltage_for_process 0xc934 n/a 170 local function&lt;BR /&gt;Jac_toAffine 0x3348 n/a 164 global function&lt;BR /&gt;HASHCRYPT_DriverIRQHandler 0x5f80 n/a 164 global function&lt;BR /&gt;ecp_group_load 0x81c2 n/a 162 local function&lt;BR /&gt;CLOCK_AttachClk 0x56e8 n/a 160 global function&lt;BR /&gt;add_sub_mpi 0x9a00 n/a 156 local function&lt;BR /&gt;mbedtls_ecp_group_free 0x7966 n/a 152 global function&lt;BR /&gt;lowpower_get_part_process_corner 0x6264 n/a 148 local function&lt;BR /&gt;mbedtls_mpi_mul_int 0xb554 n/a 148 global function&lt;BR /&gt;derive_mpi 0xc23c n/a 148 local function&lt;BR /&gt;mpi_sub_hlp 0x9828 n/a 146 local function&lt;BR /&gt;casper_select 0x15dc n/a 144 local function&lt;BR /&gt;hashcrypt_get_data 0xc454 n/a 144 local function&lt;BR /&gt;USART_WriteBlocking 0x67dc n/a 140 global function&lt;BR /&gt;PrintGetPrecision 0x6fba n/a 140 local function&lt;BR /&gt;mbedtls_mpi_mod_mpi 0xbbc0 n/a 138 global function&lt;BR /&gt;mbedtls_ecp_group_load 0x1238 n/a 136 global function&lt;BR /&gt;main 0x8ac n/a 132 global function&lt;BR /&gt;mbedtls_mpi_grow 0x8c1c n/a 132 global function&lt;BR /&gt;CLOCK_SetClkDiv 0x5788 n/a 128 global function&lt;BR /&gt;CLOCK_SetupFROClocking 0x5808 n/a 128 global function&lt;BR /&gt;USART_GetDefaultConfig 0x65d0 n/a 128 global function&lt;BR /&gt;mbedtls_ecp_group_init 0x7888 n/a 126 global function&lt;BR /&gt;jump_to_application 0x830 n/a 124 local function&lt;BR /&gt;mbedtls_mpi_read_binary 0x907a n/a 122 global function&lt;BR /&gt;CASPER_ecc_init 0x166c n/a 120 global function&lt;BR /&gt;multiply_casper 0x32d0 n/a 120 local function&lt;BR /&gt;_initio 0x6bf4 n/a 120 global function&lt;BR /&gt;FLEXCOMM_SetPeriph 0xc3e0 n/a 116 local function&lt;BR /&gt;CASPER_ECC_equal 0x16e4 n/a 112 global function&lt;BR /&gt;_Cwritebuf 0x6ca8 n/a 108 global function&lt;BR /&gt;hashcrypt_sha_one_block 0xc576 n/a 108 local function&lt;BR /&gt;PrintGetWidth 0x6f50 n/a 106 local function&lt;BR /&gt;DbgConsole_Vprintf 0x3e8 n/a 104 global function&lt;BR /&gt;toMontgomery_ECC_P384 0x4cac n/a 104 local function&lt;BR /&gt;mbedtls_mpi_bitlen 0x8f30 n/a 104 global function&lt;BR /&gt;_fdopen 0xcee2 n/a 104 global function&lt;BR /&gt;DbgConsole_PrintCallback 0x6ebe n/a 102 local function&lt;BR /&gt;mbedtls_mpi_lsb 0x8e88 n/a 102 global function&lt;BR /&gt;mpi_bigendian_to_host 0x9014 n/a 102 local function&lt;BR /&gt;ResetISR 0x180 n/a 100 global function&lt;BR /&gt;toMontgomery_ECC_P256 0x4820 n/a 100 local function&lt;BR /&gt;SystemInit 0x6868 n/a 100 weak function&lt;BR /&gt;HAL_UartSendBlocking 0x69dc n/a 100 global function&lt;BR /&gt;FLEXCOMM_PeripheralIsPresent 0xc37c n/a 100 local function&lt;BR /&gt;mbedtls_ecp_copy 0x7a48 n/a 98 global function&lt;BR /&gt;toMontgomery_ECC_P521 0x4f7c n/a 96 local function&lt;BR /&gt;RESET_ClearPeripheralReset 0x63a4 n/a 96 global function&lt;BR /&gt;mbedtls_mpi_sub_mod 0x7b64 n/a 96 local function&lt;BR /&gt;SerialManager_Init 0xcb56 n/a 96 global function&lt;BR /&gt;SerialManager_OpenReadHandle 0xcc06 n/a 96 global function&lt;BR /&gt;reverse_array 0x8138 n/a 94 local function&lt;BR /&gt;HASHCRYPT_SHA 0xc6fe n/a 94 global function&lt;BR /&gt;FLEXCOMM0_DriverIRQHandler 0x5aa0 n/a 92 global function&lt;BR /&gt;FLEXCOMM1_DriverIRQHandler 0x5afc n/a 92 global function&lt;BR /&gt;FLEXCOMM2_DriverIRQHandler 0x5b58 n/a 92 global function&lt;BR /&gt;FLEXCOMM3_DriverIRQHandler 0x5bb4 n/a 92 global function&lt;BR /&gt;FLEXCOMM4_DriverIRQHandler 0x5c10 n/a 92 global function&lt;BR /&gt;FLEXCOMM5_DriverIRQHandler 0x5c6c n/a 92 global function&lt;BR /&gt;FLEXCOMM6_DriverIRQHandler 0x5cc8 n/a 92 global function&lt;BR /&gt;FLEXCOMM7_DriverIRQHandler 0x5d24 n/a 92 global function&lt;BR /&gt;FLEXCOMM8_DriverIRQHandler 0x5d80 n/a 92 global function&lt;BR /&gt;RESET_SetPeripheralReset 0x6348 n/a 92 global function&lt;BR /&gt;mbedtls_mpi_add_mod 0x7bc4 n/a 92 local function&lt;BR /&gt;mbedtls_mpi_lset 0x8dea n/a 92 global function&lt;BR /&gt;BOARD_BootClockFROHF96M 0x6a98 n/a 88 global function&lt;BR /&gt;mbedtls_mpi_shift_l_mod 0x7c20 n/a 88 local function&lt;BR /&gt;fclose 0xcf9c n/a 88 global function&lt;BR /&gt;mbedtls_mpi_resize_clear 0x8ca0 n/a 86 local function&lt;BR /&gt;DbgConsole_SendDataReliable 0x25c n/a 84 global function&lt;BR /&gt;calculate_sha256 0x450 n/a 84 local function&lt;BR /&gt;mbedtls_ecp_set_zero 0x7aaa n/a 82 global function&lt;BR /&gt;_fflush 0xcf4a n/a 82 global function&lt;BR /&gt;ecp_add 0xe58 n/a 80 global function&lt;BR /&gt;FLEXCOMM_Init 0x5a50 n/a 80 global function&lt;BR /&gt;POWER_SetVoltageForFreq 0x62f8 n/a 80 global function&lt;BR /&gt;HASHCRYPT_SHA_Init 0xc75c n/a 80 global function&lt;BR /&gt;SerialManager_OpenWriteHandle 0xcbb6 n/a 80 global function&lt;BR /&gt;calloc 0xcdc6 n/a 80 global function&lt;BR /&gt;strlen 0xce54 n/a 78 global function&lt;BR /&gt;FLEXCOMM_GetInstance 0x5a04 n/a 76 global function&lt;BR /&gt;mbedtls_mpi_free 0x8bd0 n/a 76 global function&lt;BR /&gt;CASPER_ECC_equal_to_zero 0x1754 n/a 72 global function&lt;BR /&gt;mpi_uint_bigendian_to_host_c 0x8fb4 n/a 72 local function&lt;BR /&gt;add32 0x8264 n/a 70 local function&lt;BR /&gt;sub32 0x82aa n/a 70 local function&lt;BR /&gt;ftell 0x6e48 n/a 68 global function&lt;BR /&gt;PrintOutputdifFobpu 0x70aa n/a 68 local function&lt;BR /&gt;PrintOutputxX 0x70ee n/a 68 local function&lt;BR /&gt;mbedtls_mpi_cmp_int 0x9676 n/a 68 global function&lt;BR /&gt;SerialManager_Write 0xcb12 n/a 68 local function&lt;BR /&gt;mbedtls_mpi_get_bit 0x8e46 n/a 66 global function&lt;BR /&gt;mbedtls_clz 0x8eee n/a 66 local function&lt;BR /&gt;PrintGetRadixFromobpu 0x71c8 n/a 64 local function&lt;BR /&gt;mbedtls_mpi_mul_mod 0x7b24 n/a 64 local function&lt;BR /&gt;_deferredlazyseek 0xcea2 n/a 64 global function&lt;BR /&gt;_do_fflush 0xd008 n/a 64 global function&lt;BR /&gt;toc_verification_key 0xda84 n/a 64 local object&lt;BR /&gt;PrintFilterLengthFlag 0x718a n/a 62 local function&lt;BR /&gt;Serial_UartInit 0xcc86 n/a 62 global function&lt;BR /&gt;setvbuf 0xce16 n/a 62 global function&lt;BR /&gt;BOARD_InitDEBUG_UARTPins 0x6af0 n/a 60 global function&lt;BR /&gt;_sbrk 0x6c6c n/a 60 global function&lt;BR /&gt;fflush 0x6d14 n/a 60 global function&lt;BR /&gt;hashcrypt_sha_check_input_args 0xc53a n/a 60 local function&lt;BR /&gt;BOARD_InitDebugConsole 0x6a40 n/a 56 global function&lt;BR /&gt;PrintIsobpu 0x7046 n/a 56 local function&lt;BR /&gt;USART_EnableContinuousSCLK 0xc9fa n/a 56 local function&lt;BR /&gt;SerialManager_StartWriting 0xcada n/a 56 local function&lt;BR /&gt;Serial_UartWrite 0xccc4 n/a 56 global function&lt;BR /&gt;HardFault_Handler 0x77f8 n/a 54 global function&lt;BR /&gt;HAL_UartInit 0xca62 n/a 54 global function&lt;BR /&gt;mbedtls_ecp_point_free 0x7932 n/a 52 global function&lt;BR /&gt;mbedtls_ecp_keypair_free_o 0x79fe n/a 52 global function&lt;BR /&gt;__aeabi_lowlevel_memset 0xd1f2 n/a 50 global function&lt;BR /&gt;mbedtls_ecdsa_verify 0xc2e8 n/a 48 global function&lt;BR /&gt;CLOCK_EnableClock 0xc34c n/a 48 local function&lt;BR /&gt;free 0xcd96 n/a 48 global function&lt;BR /&gt;mbedtls_ecp_get_type 0x782e n/a 46 global function&lt;BR /&gt;IOCON_PinMuxSet 0xcd46 n/a 46 local function&lt;BR /&gt;__assertion_failed 0x230 n/a 44 global function&lt;BR /&gt;ecp_mpi_set1 0x120c n/a 44 local function&lt;BR /&gt;DbgConsole_Printf 0x6f24 n/a 44 global function&lt;BR /&gt;PrintIsdi 0x707e n/a 44 local function&lt;BR /&gt;PrintIsfF 0x7132 n/a 44 local function&lt;BR /&gt;PrintIsxX 0x715e n/a 44 local function&lt;BR /&gt;mbedtls_ecp_point_init 0x785c n/a 44 global function&lt;BR /&gt;mbedtls_ecp_keypair_init 0x7906 n/a 44 global function&lt;BR /&gt;ecp_mpi_load 0x8196 n/a 44 local function&lt;BR /&gt;hashcrypt_engine_init 0xc4e4 n/a 44 local function&lt;BR /&gt;hashcrypt_sha_check_input_alg 0xc510 n/a 42 local function&lt;BR /&gt;__aeabi_memcpy4 0xd1c8 n/a 42 global function&lt;BR /&gt;__aeabi_memcpy8 0xd1c8 n/a 42 global function&lt;BR /&gt;mbedtls_platform_zeroize 0x14b8 n/a 40 global function&lt;BR /&gt;mbedtls_ecp_is_zero 0x7afc n/a 40 global function&lt;BR /&gt;StrFormatExaminedi 0x72ca n/a 38 local function&lt;BR /&gt;StrFormatExaminexX 0x72f0 n/a 38 local function&lt;BR /&gt;StrFormatExamineobpu 0x7316 n/a 38 local function&lt;BR /&gt;mbedtls_mpi_init 0x8baa n/a 38 global function&lt;BR /&gt;casper_get_word 0x24f0 n/a 36 local function&lt;BR /&gt;mbedtls_mpi_sub_mpi 0x9abe n/a 36 global function&lt;BR /&gt;s_flexcommBaseAddrs 0xdbd8 n/a 36 local object&lt;BR /&gt;s_flexcommResets 0xdc10 n/a 36 local object&lt;BR /&gt;mpi_sint_abs 0x8dc8 n/a 34 local function&lt;BR /&gt;mbedtls_mpi_add_mpi 0x9a9c n/a 34 global function&lt;BR /&gt;HAL_UartGetStatus 0xca40 n/a 34 local function&lt;BR /&gt;DisableGlobalIRQ 0xca98 n/a 34 local function&lt;BR /&gt;POWER_DisablePD 0x56c8 n/a 32 local function&lt;BR /&gt;ConvertPrecisionWidthToLength 0x733c n/a 32 local function&lt;BR /&gt;EnableGlobalIRQ 0xcaba n/a 32 local function&lt;BR /&gt;SerialManager_WriteBlocking 0xcc66 n/a 32 global function&lt;BR /&gt;secp256r1_p 0xdac4 n/a 32 local object&lt;BR /&gt;secp256r1_a 0xdae4 n/a 32 local object&lt;BR /&gt;secp256r1_b 0xdb04 n/a 32 local object&lt;BR /&gt;secp256r1_gx 0xdb24 n/a 32 local object&lt;BR /&gt;secp256r1_gy 0xdb44 n/a 32 local object&lt;BR /&gt;secp256r1_n 0xdb64 n/a 32 local object&lt;BR /&gt;s_UsartAdapterBase 0xdc34 n/a 32 local object&lt;BR /&gt;data_init 0x1e8 n/a 30 global function&lt;BR /&gt;mbedtls_mpi_zeroize 0x8b8c n/a 30 local function&lt;BR /&gt;mbedtls_ecdsa_free 0xc32e n/a 30 global function&lt;BR /&gt;mbedtls_mpi_size 0x8f98 n/a 28 global function&lt;BR /&gt;RESET_PeripheralReset 0xc9de n/a 28 global function&lt;BR /&gt;fsl_assert_hook 0x6ea4 n/a 26 weak function&lt;BR /&gt;__check_heap_overflow 0x6e8c n/a 24 global function&lt;BR /&gt;mpi_uint_bigendian_to_host 0x8ffc n/a 24 local function&lt;BR /&gt;mbedtls_ecdsa_can_do 0xc2d0 n/a 24 global function&lt;BR /&gt;hashcrypt_save_running_hash 0xc6d0 n/a 24 local function&lt;BR /&gt;mbedtls_ecp_keypair_free 0x7a32 n/a 22 global function&lt;BR /&gt;mbedtls_ecdsa_init 0xc318 n/a 22 global function&lt;BR /&gt;hashcrypt_restore_running_hash 0xc6e8 n/a 22 local function&lt;BR /&gt;remove 0xcff4 n/a 20 global function&lt;BR /&gt;bss_init 0x206 n/a 18 global function&lt;BR /&gt;s_flexcommClocks 0xdbfc n/a 18 local object&lt;BR /&gt;SystemInitHook 0xca32 n/a 14 weak function&lt;BR /&gt;BOARD_InitPeripherals 0xccfc n/a 14 global function&lt;BR /&gt;__main 0xcd80 n/a 14 global function&lt;BR /&gt;BOARD_InitBootPeripherals 0xcd0a n/a 12 global function&lt;BR /&gt;BOARD_InitBootPins 0xcd74 n/a 12 global function&lt;BR /&gt;__aeabi_memcpy 0xd1be n/a 10 global function&lt;/LI-SPOILER&gt;&lt;P class=""&gt;As far as I know, the CASPER&amp;nbsp; can't perform ECDSA verification on its own - it seems to require mbedTLS as a wrapper, which brings in all the additional code.&lt;/P&gt;&lt;P class=""&gt;I've deactivated almost everything in the&amp;nbsp;ksdk_mbedtls_config.h file.&lt;BR /&gt;&lt;BR /&gt;&lt;/P&gt;&lt;H3&gt;Questions&lt;/H3&gt;&lt;OL&gt;&lt;LI&gt;Is there a way to use the CASPER hardware directly for ECDSA verification without the mbedTLS overhead?&lt;/LI&gt;&lt;LI&gt;Are there any ROM-based cryptographic functions in the LPC55S28 that could handle ECDSA verification?&lt;/LI&gt;&lt;LI&gt;Does anyone have a minimal implementation of ECDSA P-256 verification for the LPC55S28 that could fit within my 32KB constraint?&lt;/LI&gt;&lt;LI&gt;Are there alternatives to mbedTLS with a smaller footprint?&lt;/LI&gt;&lt;/OL&gt;</description>
      <pubDate>Thu, 20 Mar 2025 17:30:09 GMT</pubDate>
      <guid>https://community.nxp.com/t5/LPC-Microcontrollers/Help-with-ECDSA-Verification-in-LPC55S28-Bootloader-32KB-Size/m-p/2065738#M57945</guid>
      <dc:creator>SegFault02</dc:creator>
      <dc:date>2025-03-20T17:30:09Z</dc:date>
    </item>
  </channel>
</rss>

