Add SW-only RSA PSS

pull/765/head
Brett Nicholas 2026-03-17 20:46:12 -06:00 committed by Daniele Lacamera
parent 401c034690
commit 65d84a29ec
12 changed files with 673 additions and 40 deletions

View File

@ -175,6 +175,66 @@ jobs:
run: | run: |
tools/scripts/sim-sunnyday-update.sh tools/scripts/sim-sunnyday-update.sh
- name: Cleanup to change key type
run: |
make keysclean
- name: Build wolfboot.elf (RSAPSS2048)
run: |
make clean && make test-sim-internal-flash-with-update SIGN=RSAPSS2048 SPMATH=1
- name: Run sunny day update test
run: |
tools/scripts/sim-sunnyday-update.sh
- name: Build wolfboot.elf (RSAPSS2048, WOLFBOOT_SMALL_STACK)
run: |
make clean && make test-sim-internal-flash-with-update SIGN=RSAPSS2048 WOLFBOOT_SMALL_STACK=1 SPMATH=1
- name: Run sunny day update test
run: |
tools/scripts/sim-sunnyday-update.sh
- name: Cleanup to change key type
run: |
make keysclean
- name: Build wolfboot.elf (RSAPSS3072)
run: |
make clean && make test-sim-internal-flash-with-update SIGN=RSAPSS3072 SPMATH=1
- name: Run sunny day update test
run: |
tools/scripts/sim-sunnyday-update.sh
- name: Build wolfboot.elf (RSAPSS3072, WOLFBOOT_SMALL_STACK)
run: |
make clean && make test-sim-internal-flash-with-update SIGN=RSAPSS3072 WOLFBOOT_SMALL_STACK=1 SPMATH=1
- name: Run sunny day update test
run: |
tools/scripts/sim-sunnyday-update.sh
- name: Cleanup to change key type
run: |
make keysclean
- name: Build wolfboot.elf (RSAPSS4096)
run: |
make clean && make test-sim-internal-flash-with-update SIGN=RSAPSS4096 SPMATH=1
- name: Run sunny day update test
run: |
tools/scripts/sim-sunnyday-update.sh
- name: Build wolfboot.elf (RSAPSS4096, WOLFBOOT_SMALL_STACK)
run: |
make clean && make test-sim-internal-flash-with-update SIGN=RSAPSS4096 WOLFBOOT_SMALL_STACK=1 SPMATH=1
- name: Run sunny day update test
run: |
tools/scripts/sim-sunnyday-update.sh
# 32 Bit simulator, FASTMATH # 32 Bit simulator, FASTMATH
# #
- name: make clean - name: make clean
@ -305,6 +365,66 @@ jobs:
run: | run: |
tools/scripts/sim-sunnyday-update.sh tools/scripts/sim-sunnyday-update.sh
- name: Cleanup to change key type
run: |
make keysclean
- name: Build wolfboot.elf (RSAPSS2048, FASTMATH)
run: |
make clean && make test-sim-internal-flash-with-update SIGN=RSAPSS2048 SPMATH=0
- name: Run sunny day update test
run: |
tools/scripts/sim-sunnyday-update.sh
- name: Build wolfboot.elf (RSAPSS2048, FASTMATH, WOLFBOOT_SMALL_STACK)
run: |
make clean && make test-sim-internal-flash-with-update SIGN=RSAPSS2048 WOLFBOOT_SMALL_STACK=1 SPMATH=0
- name: Run sunny day update test
run: |
tools/scripts/sim-sunnyday-update.sh
- name: Cleanup to change key type
run: |
make keysclean
- name: Build wolfboot.elf (RSAPSS3072, FASTMATH)
run: |
make clean && make test-sim-internal-flash-with-update SIGN=RSAPSS3072 SPMATH=0
- name: Run sunny day update test
run: |
tools/scripts/sim-sunnyday-update.sh
- name: Build wolfboot.elf (RSAPSS3072, FASTMATH, WOLFBOOT_SMALL_STACK)
run: |
make clean && make test-sim-internal-flash-with-update SIGN=RSAPSS3072 WOLFBOOT_SMALL_STACK=1 SPMATH=0
- name: Run sunny day update test
run: |
tools/scripts/sim-sunnyday-update.sh
- name: Cleanup to change key type
run: |
make keysclean
- name: Build wolfboot.elf (RSAPSS4096, FASTMATH)
run: |
make clean && make test-sim-internal-flash-with-update SIGN=RSAPSS4096 SPMATH=0 WOLFBOOT_HUGE_STACK=1
- name: Run sunny day update test
run: |
tools/scripts/sim-sunnyday-update.sh
- name: Build wolfboot.elf (RSAPSS4096, FASTMATH, WOLFBOOT_SMALL_STACK)
run: |
make clean && make test-sim-internal-flash-with-update SIGN=RSAPSS4096 WOLFBOOT_SMALL_STACK=1 SPMATH=0
- name: Run sunny day update test
run: |
tools/scripts/sim-sunnyday-update.sh
# 64 Bit simulator, SP_MATH # 64 Bit simulator, SP_MATH
# #
@ -460,6 +580,66 @@ jobs:
run: | run: |
tools/scripts/sim-sunnyday-update.sh tools/scripts/sim-sunnyday-update.sh
- name: Cleanup to change key type
run: |
make keysclean
- name: Build wolfboot.elf (RSAPSS2048)
run: |
make clean && make test-sim-internal-flash-with-update SIGN=RSAPSS2048 SPMATH=1
- name: Run sunny day update test
run: |
tools/scripts/sim-sunnyday-update.sh
- name: Build wolfboot.elf (RSAPSS2048, WOLFBOOT_SMALL_STACK)
run: |
make clean && make test-sim-internal-flash-with-update SIGN=RSAPSS2048 WOLFBOOT_SMALL_STACK=1 SPMATH=1
- name: Run sunny day update test
run: |
tools/scripts/sim-sunnyday-update.sh
- name: Cleanup to change key type
run: |
make keysclean
- name: Build wolfboot.elf (RSAPSS3072)
run: |
make clean && make test-sim-internal-flash-with-update SIGN=RSAPSS3072 SPMATH=1
- name: Run sunny day update test
run: |
tools/scripts/sim-sunnyday-update.sh
- name: Build wolfboot.elf (RSAPSS3072, WOLFBOOT_SMALL_STACK)
run: |
make clean && make test-sim-internal-flash-with-update SIGN=RSAPSS3072 WOLFBOOT_SMALL_STACK=1 SPMATH=1
- name: Run sunny day update test
run: |
tools/scripts/sim-sunnyday-update.sh
- name: Cleanup to change key type
run: |
make keysclean
- name: Build wolfboot.elf (RSAPSS4096)
run: |
make clean && make test-sim-internal-flash-with-update SIGN=RSAPSS4096 SPMATH=1
- name: Run sunny day update test
run: |
tools/scripts/sim-sunnyday-update.sh
- name: Build wolfboot.elf (RSAPSS4096, WOLFBOOT_SMALL_STACK)
run: |
make clean && make test-sim-internal-flash-with-update SIGN=RSAPSS4096 WOLFBOOT_SMALL_STACK=1 SPMATH=1
- name: Run sunny day update test
run: |
tools/scripts/sim-sunnyday-update.sh
# 64 Bit simulator, FASTMATH # 64 Bit simulator, FASTMATH
# #
- name: make clean - name: make clean
@ -590,6 +770,66 @@ jobs:
run: | run: |
tools/scripts/sim-sunnyday-update.sh tools/scripts/sim-sunnyday-update.sh
- name: Cleanup to change key type
run: |
make keysclean
- name: Build wolfboot.elf (RSAPSS2048, FASTMATH)
run: |
make clean && make test-sim-internal-flash-with-update SIGN=RSAPSS2048 SPMATH=0
- name: Run sunny day update test
run: |
tools/scripts/sim-sunnyday-update.sh
- name: Build wolfboot.elf (RSAPSS2048, FASTMATH, WOLFBOOT_SMALL_STACK)
run: |
make clean && make test-sim-internal-flash-with-update SIGN=RSAPSS2048 WOLFBOOT_SMALL_STACK=1 SPMATH=0
- name: Run sunny day update test
run: |
tools/scripts/sim-sunnyday-update.sh
- name: Cleanup to change key type
run: |
make keysclean
- name: Build wolfboot.elf (RSAPSS3072, FASTMATH)
run: |
make clean && make test-sim-internal-flash-with-update SIGN=RSAPSS3072 SPMATH=0
- name: Run sunny day update test
run: |
tools/scripts/sim-sunnyday-update.sh
- name: Build wolfboot.elf (RSAPSS3072, FASTMATH, WOLFBOOT_SMALL_STACK)
run: |
make clean && make test-sim-internal-flash-with-update SIGN=RSAPSS3072 WOLFBOOT_SMALL_STACK=1 SPMATH=0
- name: Run sunny day update test
run: |
tools/scripts/sim-sunnyday-update.sh
- name: Cleanup to change key type
run: |
make keysclean
- name: Build wolfboot.elf (RSAPSS4096, FASTMATH)
run: |
make clean && make test-sim-internal-flash-with-update SIGN=RSAPSS4096 SPMATH=0 WOLFBOOT_HUGE_STACK=1
- name: Run sunny day update test
run: |
tools/scripts/sim-sunnyday-update.sh
- name: Build wolfboot.elf (RSAPSS4096, FASTMATH, WOLFBOOT_SMALL_STACK)
run: |
make clean && make test-sim-internal-flash-with-update SIGN=RSAPSS4096 WOLFBOOT_SMALL_STACK=1 SPMATH=0
- name: Run sunny day update test
run: |
tools/scripts/sim-sunnyday-update.sh
- name: Run sunny day LMS update test - name: Run sunny day LMS update test
run: | run: |
tools/scripts/sim-pq-sunnyday-update.sh config/examples/sim-lms.config tools/scripts/sim-pq-sunnyday-update.sh config/examples/sim-lms.config

View File

@ -0,0 +1,21 @@
ARCH=sim
TARGET=sim
SIGN?=RSAPSS2048
HASH?=SHA256
WOLFBOOT_SMALL_STACK?=0
SPI_FLASH=0
DEBUG=1
# sizes should be multiple of system page size
WOLFBOOT_PARTITION_SIZE=0x40000
WOLFBOOT_SECTOR_SIZE=0x1000
WOLFBOOT_PARTITION_BOOT_ADDRESS=0x80000
# if on external flash, it should be multiple of system page size
WOLFBOOT_PARTITION_UPDATE_ADDRESS=0x100000
WOLFBOOT_PARTITION_SWAP_ADDRESS=0x180000
# required for keytools
WOLFBOOT_FIXED_PARTITIONS=1
# For debugging XMALLOC/XFREE
#CFLAGS_EXTRA+=-DWOLFBOOT_DEBUG_MALLOC

View File

@ -68,6 +68,11 @@ extern "C" {
defined (WOLFBOOT_SIGN_RSA4096ENC) defined (WOLFBOOT_SIGN_RSA4096ENC)
#define wolfBoot_verify_signature_primary wolfBoot_verify_signature_rsa #define wolfBoot_verify_signature_primary wolfBoot_verify_signature_rsa
#endif #endif
#if defined (WOLFBOOT_SIGN_RSAPSS2048) || \
defined (WOLFBOOT_SIGN_RSAPSS3072) || \
defined (WOLFBOOT_SIGN_RSAPSS4096)
#define wolfBoot_verify_signature_primary wolfBoot_verify_signature_rsa_pss
#endif
#if defined (WOLFBOOT_SIGN_ECC256) || \ #if defined (WOLFBOOT_SIGN_ECC256) || \
defined (WOLFBOOT_SIGN_ECC384) || \ defined (WOLFBOOT_SIGN_ECC384) || \
defined (WOLFBOOT_SIGN_ECC521) defined (WOLFBOOT_SIGN_ECC521)
@ -97,6 +102,11 @@ extern "C" {
defined (WOLFBOOT_SIGN_SECONDARY_RSA4096ENC) defined (WOLFBOOT_SIGN_SECONDARY_RSA4096ENC)
#define wolfBoot_verify_signature_secondary wolfBoot_verify_signature_rsa #define wolfBoot_verify_signature_secondary wolfBoot_verify_signature_rsa
#endif #endif
#if defined (WOLFBOOT_SIGN_SECONDARY_RSAPSS2048) || \
defined (WOLFBOOT_SIGN_SECONDARY_RSAPSS3072) || \
defined (WOLFBOOT_SIGN_SECONDARY_RSAPSS4096)
#define wolfBoot_verify_signature_secondary wolfBoot_verify_signature_rsa_pss
#endif
#if defined (WOLFBOOT_SIGN_SECONDARY_ECC256) || \ #if defined (WOLFBOOT_SIGN_SECONDARY_ECC256) || \
defined (WOLFBOOT_SIGN_SECONDARY_ECC384) || \ defined (WOLFBOOT_SIGN_SECONDARY_ECC384) || \
defined (WOLFBOOT_SIGN_SECONDARY_ECC521) defined (WOLFBOOT_SIGN_SECONDARY_ECC521)

View File

@ -40,11 +40,14 @@ extern "C" {
#define ECC_IMAGE_SIGNATURE_SIZE (132) #define ECC_IMAGE_SIGNATURE_SIZE (132)
#endif #endif
#if defined(WOLFBOOT_SIGN_RSA2048) || defined(WOLFBOOT_SIGN_SECONDARY_RSA2048) #if defined(WOLFBOOT_SIGN_RSA2048) || defined(WOLFBOOT_SIGN_SECONDARY_RSA2048) || \
defined(WOLFBOOT_SIGN_RSAPSS2048) || defined(WOLFBOOT_SIGN_SECONDARY_RSAPSS2048)
#define RSA_IMAGE_SIGNATURE_SIZE (256) #define RSA_IMAGE_SIGNATURE_SIZE (256)
#elif defined(WOLFBOOT_SIGN_RSA3072) || defined(WOLFBOOT_SIGN_SECONDARY_RSA3072) #elif defined(WOLFBOOT_SIGN_RSA3072) || defined(WOLFBOOT_SIGN_SECONDARY_RSA3072) || \
defined(WOLFBOOT_SIGN_RSAPSS3072) || defined(WOLFBOOT_SIGN_SECONDARY_RSAPSS3072)
#define RSA_IMAGE_SIGNATURE_SIZE (384) #define RSA_IMAGE_SIGNATURE_SIZE (384)
#elif defined(WOLFBOOT_SIGN_RSA4096) || defined(WOLFBOOT_SIGN_SECONDARY_RSA4096) #elif defined(WOLFBOOT_SIGN_RSA4096) || defined(WOLFBOOT_SIGN_SECONDARY_RSA4096) || \
defined(WOLFBOOT_SIGN_RSAPSS4096) || defined(WOLFBOOT_SIGN_SECONDARY_RSAPSS4096)
#define RSA_IMAGE_SIGNATURE_SIZE (512) #define RSA_IMAGE_SIGNATURE_SIZE (512)
#endif #endif

View File

@ -222,12 +222,25 @@ extern int tolower(int c);
defined(WOLFBOOT_SIGN_SECONDARY_RSA2048) || \ defined(WOLFBOOT_SIGN_SECONDARY_RSA2048) || \
defined(WOLFBOOT_SIGN_SECONDARY_RSA3072) || \ defined(WOLFBOOT_SIGN_SECONDARY_RSA3072) || \
defined(WOLFBOOT_SIGN_SECONDARY_RSA4096) || \ defined(WOLFBOOT_SIGN_SECONDARY_RSA4096) || \
defined(WOLFBOOT_SIGN_RSAPSS2048) || \
defined(WOLFBOOT_SIGN_RSAPSS3072) || \
defined(WOLFBOOT_SIGN_RSAPSS4096) || \
defined(WOLFBOOT_SIGN_SECONDARY_RSAPSS2048) || \
defined(WOLFBOOT_SIGN_SECONDARY_RSAPSS3072) || \
defined(WOLFBOOT_SIGN_SECONDARY_RSAPSS4096) || \
(defined(WOLFCRYPT_SECURE_MODE) && (!defined(PKCS11_SMALL))) (defined(WOLFCRYPT_SECURE_MODE) && (!defined(PKCS11_SMALL)))
# define WC_RSA_BLINDING # define WC_RSA_BLINDING
# define WC_RSA_DIRECT # define WC_RSA_DIRECT
# define RSA_LOW_MEM # define RSA_LOW_MEM
# define WC_ASN_HASH_SHA256 # define WC_ASN_HASH_SHA256
# if defined(WOLFBOOT_SIGN_RSAPSS2048) || defined(WOLFBOOT_SIGN_RSAPSS3072) || \
defined(WOLFBOOT_SIGN_RSAPSS4096) || \
defined(WOLFBOOT_SIGN_SECONDARY_RSAPSS2048) || \
defined(WOLFBOOT_SIGN_SECONDARY_RSAPSS3072) || \
defined(WOLFBOOT_SIGN_SECONDARY_RSAPSS4096)
# define WC_RSA_PSS
# endif
# if !defined(WOLFBOOT_TPM) && !defined(WOLFCRYPT_SECURE_MODE) && \ # if !defined(WOLFBOOT_TPM) && !defined(WOLFCRYPT_SECURE_MODE) && \
!defined(WOLFCRYPT_TEST) && !defined(WOLFCRYPT_BENCHMARK) && \ !defined(WOLFCRYPT_TEST) && !defined(WOLFCRYPT_BENCHMARK) && \
!defined(WOLFBOOT_ENABLE_WOLFHSM_CLIENT) && \ !defined(WOLFBOOT_ENABLE_WOLFHSM_CLIENT) && \
@ -235,7 +248,9 @@ extern int tolower(int c);
# define WOLFSSL_RSA_VERIFY_INLINE # define WOLFSSL_RSA_VERIFY_INLINE
# define WOLFSSL_RSA_VERIFY_ONLY # define WOLFSSL_RSA_VERIFY_ONLY
# define WOLFSSL_RSA_PUBLIC_ONLY # define WOLFSSL_RSA_PUBLIC_ONLY
# define WC_NO_RSA_OAEP # if !defined(WC_RSA_PSS)
# define WC_NO_RSA_OAEP
# endif
# define NO_RSA_BOUNDS_CHECK # define NO_RSA_BOUNDS_CHECK
# endif # endif
# if !defined(USE_FAST_MATH) && !defined(WOLFSSL_SP_MATH_ALL) # if !defined(USE_FAST_MATH) && !defined(WOLFSSL_SP_MATH_ALL)
@ -244,7 +259,8 @@ extern int tolower(int c);
# define WOLFSSL_SP_SMALL # define WOLFSSL_SP_SMALL
# define WOLFSSL_SP_MATH # define WOLFSSL_SP_MATH
# endif # endif
# if defined(WOLFBOOT_SIGN_RSA2048) || defined(WOLFBOOT_SIGN_SECONDARY_RSA2048) # if defined(WOLFBOOT_SIGN_RSA2048) || defined(WOLFBOOT_SIGN_SECONDARY_RSA2048) || \
defined(WOLFBOOT_SIGN_RSAPSS2048) || defined(WOLFBOOT_SIGN_SECONDARY_RSAPSS2048)
# define FP_MAX_BITS (2048 * 2) # define FP_MAX_BITS (2048 * 2)
# define SP_INT_BITS 2048 # define SP_INT_BITS 2048
# define WOLFSSL_SP_NO_3072 # define WOLFSSL_SP_NO_3072
@ -253,7 +269,8 @@ extern int tolower(int c);
# define RSA_MIN_SIZE 2048 # define RSA_MIN_SIZE 2048
# define RSA_MAX_SIZE 2048 # define RSA_MAX_SIZE 2048
# endif # endif
# if defined(WOLFBOOT_SIGN_RSA3072) || defined(WOLFBOOT_SIGN_SECONDARY_RSA3072) # if defined(WOLFBOOT_SIGN_RSA3072) || defined(WOLFBOOT_SIGN_SECONDARY_RSA3072) || \
defined(WOLFBOOT_SIGN_RSAPSS3072) || defined(WOLFBOOT_SIGN_SECONDARY_RSAPSS3072)
# define FP_MAX_BITS (3072 * 2) # define FP_MAX_BITS (3072 * 2)
# define SP_INT_BITS 3072 # define SP_INT_BITS 3072
# define WOLFSSL_SP_NO_2048 # define WOLFSSL_SP_NO_2048
@ -263,7 +280,8 @@ extern int tolower(int c);
# define RSA_MAX_SIZE 3072 # define RSA_MAX_SIZE 3072
# endif # endif
# if defined(WOLFBOOT_SIGN_RSA4096) || defined(WOLFBOOT_SIGN_SECONDARY_RSA4096) # if defined(WOLFBOOT_SIGN_RSA4096) || defined(WOLFBOOT_SIGN_SECONDARY_RSA4096) || \
defined(WOLFBOOT_SIGN_RSAPSS4096) || defined(WOLFBOOT_SIGN_SECONDARY_RSAPSS4096)
# define FP_MAX_BITS (4096 * 2) # define FP_MAX_BITS (4096 * 2)
# define SP_INT_BITS 4096 # define SP_INT_BITS 4096
# define WOLFSSL_SP_NO_2048 # define WOLFSSL_SP_NO_2048

View File

@ -126,16 +126,16 @@ extern "C" {
#ifndef IMAGE_HEADER_SIZE #ifndef IMAGE_HEADER_SIZE
/* Largest cases first */ /* Largest cases first */
# if defined(WOLFBOOT_SIGN_RSA4096) # if defined(WOLFBOOT_SIGN_RSA4096) || defined(WOLFBOOT_SIGN_RSAPSS4096)
# define IMAGE_HEADER_SIZE 1024 # define IMAGE_HEADER_SIZE 1024
/* RSA3072 + strong hash */ /* RSA3072/RSAPSS3072 + strong hash */
# elif (defined(WOLFBOOT_SIGN_RSA3072) && \ # elif ((defined(WOLFBOOT_SIGN_RSA3072) || defined(WOLFBOOT_SIGN_RSAPSS3072)) && \
(defined(WOLFBOOT_HASH_SHA384) || defined(WOLFBOOT_HASH_SHA3_384))) (defined(WOLFBOOT_HASH_SHA384) || defined(WOLFBOOT_HASH_SHA3_384)))
# define IMAGE_HEADER_SIZE 1024 # define IMAGE_HEADER_SIZE 1024
/* RSA2048 + SHA256 */ /* RSA2048/RSAPSS2048 + SHA256 */
# elif defined(WOLFBOOT_SIGN_RSA2048) && defined(WOLFBOOT_HASH_SHA256) # elif (defined(WOLFBOOT_SIGN_RSA2048) || defined(WOLFBOOT_SIGN_RSAPSS2048)) && defined(WOLFBOOT_HASH_SHA256)
# define IMAGE_HEADER_SIZE 512 # define IMAGE_HEADER_SIZE 512
/* ECC384 requires 512 with SHA256 */ /* ECC384 requires 512 with SHA256 */
@ -155,7 +155,7 @@ extern "C" {
# define IMAGE_HEADER_SIZE 256 # define IMAGE_HEADER_SIZE 256
/* Secondary 512-byte fallbacks */ /* Secondary 512-byte fallbacks */
# elif defined(WOLFBOOT_SIGN_RSA3072) || \ # elif defined(WOLFBOOT_SIGN_RSA3072) || defined(WOLFBOOT_SIGN_RSAPSS3072) || \
defined(WOLFBOOT_SIGN_ECC521) || \ defined(WOLFBOOT_SIGN_ECC521) || \
defined(WOLFBOOT_SIGN_ED448) || \ defined(WOLFBOOT_SIGN_ED448) || \
defined(WOLFBOOT_HASH_SHA384) || \ defined(WOLFBOOT_HASH_SHA384) || \
@ -248,9 +248,12 @@ extern "C" {
#define AUTH_KEY_ECC521 0x07 #define AUTH_KEY_ECC521 0x07
#define AUTH_KEY_RSA3072 0x08 #define AUTH_KEY_RSA3072 0x08
#define AUTH_KEY_LMS 0x09 #define AUTH_KEY_LMS 0x09
#define AUTH_KEY_XMSS 0x0A #define AUTH_KEY_XMSS 0x0A
#define AUTH_KEY_ML_DSA 0x0B #define AUTH_KEY_ML_DSA 0x0B
#define AUTH_KEY_NUM 0x0C #define AUTH_KEY_RSAPSS2048 0x0C
#define AUTH_KEY_RSAPSS3072 0x0D
#define AUTH_KEY_RSAPSS4096 0x0E
#define AUTH_KEY_NUM 0x0F
/* /*
* 8 bits: auth type * 8 bits: auth type
@ -271,6 +274,9 @@ extern "C" {
#define HDR_IMG_TYPE_AUTH_LMS (AUTH_KEY_LMS << 8) #define HDR_IMG_TYPE_AUTH_LMS (AUTH_KEY_LMS << 8)
#define HDR_IMG_TYPE_AUTH_XMSS (AUTH_KEY_XMSS << 8) #define HDR_IMG_TYPE_AUTH_XMSS (AUTH_KEY_XMSS << 8)
#define HDR_IMG_TYPE_AUTH_ML_DSA (AUTH_KEY_ML_DSA << 8) #define HDR_IMG_TYPE_AUTH_ML_DSA (AUTH_KEY_ML_DSA << 8)
#define HDR_IMG_TYPE_AUTH_RSAPSS2048 (AUTH_KEY_RSAPSS2048 << 8)
#define HDR_IMG_TYPE_AUTH_RSAPSS3072 (AUTH_KEY_RSAPSS3072 << 8)
#define HDR_IMG_TYPE_AUTH_RSAPSS4096 (AUTH_KEY_RSAPSS4096 << 8)
#define HDR_IMG_TYPE_DIFF 0x00D0 #define HDR_IMG_TYPE_DIFF 0x00D0
@ -289,6 +295,9 @@ extern "C" {
#define KEYSTORE_PUBKEY_SIZE_RSA2048 320 #define KEYSTORE_PUBKEY_SIZE_RSA2048 320
#define KEYSTORE_PUBKEY_SIZE_RSA3072 448 #define KEYSTORE_PUBKEY_SIZE_RSA3072 448
#define KEYSTORE_PUBKEY_SIZE_RSA4096 576 #define KEYSTORE_PUBKEY_SIZE_RSA4096 576
#define KEYSTORE_PUBKEY_SIZE_RSAPSS2048 KEYSTORE_PUBKEY_SIZE_RSA2048
#define KEYSTORE_PUBKEY_SIZE_RSAPSS3072 KEYSTORE_PUBKEY_SIZE_RSA3072
#define KEYSTORE_PUBKEY_SIZE_RSAPSS4096 KEYSTORE_PUBKEY_SIZE_RSA4096
#define KEYSTORE_PUBKEY_SIZE_LMS 60 #define KEYSTORE_PUBKEY_SIZE_LMS 60
#define KEYSTORE_PUBKEY_SIZE_XMSS 68 #define KEYSTORE_PUBKEY_SIZE_XMSS 68
@ -463,6 +472,21 @@ extern "C" {
# ifndef WOLFBOOT_UNIVERSAL_KEYSTORE # ifndef WOLFBOOT_UNIVERSAL_KEYSTORE
# define KEYSTORE_PUBKEY_SIZE KEYSTORE_PUBKEY_SIZE_RSA4096 # define KEYSTORE_PUBKEY_SIZE KEYSTORE_PUBKEY_SIZE_RSA4096
# endif # endif
#elif defined(WOLFBOOT_SIGN_RSAPSS2048)
# define HDR_IMG_TYPE_AUTH HDR_IMG_TYPE_AUTH_RSAPSS2048
# ifndef WOLFBOOT_UNIVERSAL_KEYSTORE
# define KEYSTORE_PUBKEY_SIZE KEYSTORE_PUBKEY_SIZE_RSA2048
# endif
#elif defined(WOLFBOOT_SIGN_RSAPSS3072)
# define HDR_IMG_TYPE_AUTH HDR_IMG_TYPE_AUTH_RSAPSS3072
# ifndef WOLFBOOT_UNIVERSAL_KEYSTORE
# define KEYSTORE_PUBKEY_SIZE KEYSTORE_PUBKEY_SIZE_RSA3072
# endif
#elif defined(WOLFBOOT_SIGN_RSAPSS4096)
# define HDR_IMG_TYPE_AUTH HDR_IMG_TYPE_AUTH_RSAPSS4096
# ifndef WOLFBOOT_UNIVERSAL_KEYSTORE
# define KEYSTORE_PUBKEY_SIZE KEYSTORE_PUBKEY_SIZE_RSA4096
# endif
#elif defined(WOLFBOOT_SIGN_LMS) #elif defined(WOLFBOOT_SIGN_LMS)
# define HDR_IMG_TYPE_AUTH HDR_IMG_TYPE_AUTH_LMS # define HDR_IMG_TYPE_AUTH HDR_IMG_TYPE_AUTH_LMS
# ifndef WOLFBOOT_UNIVERSAL_KEYSTORE # ifndef WOLFBOOT_UNIVERSAL_KEYSTORE

View File

@ -305,6 +305,98 @@ ifeq ($(SIGN),ED448)
endif endif
endif endif
ifeq ($(SIGN),RSAPSS2048)
KEYGEN_OPTIONS+=--rsapss2048
SIGN_OPTIONS+=--rsapss2048
SIGN_ALG=RSAPSS2048
WOLFCRYPT_OBJS+= $(RSA_OBJS)
WOLFCRYPT_OBJS+=$(MATH_OBJS)
CFLAGS+=-D"WOLFBOOT_SIGN_RSAPSS2048" $(RSA_EXTRA_CFLAGS)
ifeq ($(WOLFBOOT_SMALL_STACK),1)
ifneq ($(SPMATH),1)
STACK_USAGE=5008
else
STACK_USAGE=4096
endif
else
ifeq ($(WOLFTPM),1)
STACK_USAGE=$(STACK_USAGE_WOLFTPM)
else
ifneq ($(SPMATH),1)
STACK_USAGE=35952
else
STACK_USAGE=17568
endif
endif
endif
ifeq ($(shell test $(IMAGE_HEADER_SIZE) -lt 512; echo $$?),0)
IMAGE_HEADER_SIZE=512
endif
endif
ifeq ($(SIGN),RSAPSS3072)
KEYGEN_OPTIONS+=--rsapss3072
SIGN_OPTIONS+=--rsapss3072
SIGN_ALG=RSAPSS3072
WOLFCRYPT_OBJS+= $(RSA_OBJS)
WOLFCRYPT_OBJS+=$(MATH_OBJS)
CFLAGS+=-D"WOLFBOOT_SIGN_RSAPSS3072" $(RSA_EXTRA_CFLAGS)
ifeq ($(WOLFBOOT_SMALL_STACK),1)
ifneq ($(SPMATH),1)
STACK_USAGE=5008
else
STACK_USAGE=4364
endif
else
ifeq ($(WOLFTPM),1)
STACK_USAGE=$(STACK_USAGE_WOLFTPM)
else
ifneq ($(SPMATH),1)
STACK_USAGE=52592
else
STACK_USAGE=12288
endif
endif
endif
ifneq ($(HASH),SHA256)
ifeq ($(shell test $(IMAGE_HEADER_SIZE) -lt 1024; echo $$?),0)
IMAGE_HEADER_SIZE=1024
endif
endif
ifeq ($(shell test $(IMAGE_HEADER_SIZE) -lt 512; echo $$?),0)
IMAGE_HEADER_SIZE=512
endif
endif
ifeq ($(SIGN),RSAPSS4096)
KEYGEN_OPTIONS+=--rsapss4096
SIGN_OPTIONS+=--rsapss4096
SIGN_ALG=RSAPSS4096
WOLFCRYPT_OBJS+= $(RSA_OBJS)
WOLFCRYPT_OBJS+=$(MATH_OBJS)
CFLAGS+=-D"WOLFBOOT_SIGN_RSAPSS4096" $(RSA_EXTRA_CFLAGS)
ifeq ($(WOLFBOOT_SMALL_STACK),1)
ifneq ($(SPMATH),1)
STACK_USAGE=5888
else
STACK_USAGE=5768
endif
else
ifeq ($(WOLFTPM),1)
STACK_USAGE=$(STACK_USAGE_WOLFTPM)
else
ifneq ($(SPMATH),1)
STACK_USAGE=69232
else
STACK_USAGE=18064
endif
endif
endif
ifeq ($(shell test $(IMAGE_HEADER_SIZE) -lt 1024; echo $$?),0)
IMAGE_HEADER_SIZE=1024
endif
endif
ifneq ($(findstring RSA2048,$(SIGN)),) ifneq ($(findstring RSA2048,$(SIGN)),)
KEYGEN_OPTIONS+=--rsa2048 KEYGEN_OPTIONS+=--rsa2048
ifeq ($(SIGN),RSA2048ENC) ifeq ($(SIGN),RSA2048ENC)
@ -367,7 +459,9 @@ ifneq ($(findstring RSA3072,$(SIGN)),)
endif endif
endif endif
ifneq ($(HASH),SHA256) ifneq ($(HASH),SHA256)
IMAGE_HEADER_SIZE=1024 ifeq ($(shell test $(IMAGE_HEADER_SIZE) -lt 1024; echo $$?),0)
IMAGE_HEADER_SIZE=1024
endif
endif endif
ifeq ($(shell test $(IMAGE_HEADER_SIZE) -lt 512; echo $$?),0) ifeq ($(shell test $(IMAGE_HEADER_SIZE) -lt 512; echo $$?),0)
IMAGE_HEADER_SIZE=512 IMAGE_HEADER_SIZE=512
@ -510,6 +604,18 @@ ifneq ($(SIGN_SECONDARY),)
WOLFCRYPT_OBJS+=$(RSA_OBJS) WOLFCRYPT_OBJS+=$(RSA_OBJS)
WOLFCRYPT_OBJS+=$(MATH_OBJS) WOLFCRYPT_OBJS+=$(MATH_OBJS)
endif endif
ifeq ($(SIGN_SECONDARY),RSAPSS2048)
WOLFCRYPT_OBJS+=$(RSA_OBJS)
WOLFCRYPT_OBJS+=$(MATH_OBJS)
endif
ifeq ($(SIGN_SECONDARY),RSAPSS3072)
WOLFCRYPT_OBJS+=$(RSA_OBJS)
WOLFCRYPT_OBJS+=$(MATH_OBJS)
endif
ifeq ($(SIGN_SECONDARY),RSAPSS4096)
WOLFCRYPT_OBJS+=$(RSA_OBJS)
WOLFCRYPT_OBJS+=$(MATH_OBJS)
endif
ifeq ($(SIGN_SECONDARY),ECC256) ifeq ($(SIGN_SECONDARY),ECC256)
WOLFCRYPT_OBJS+=$(ECC_OBJS) WOLFCRYPT_OBJS+=$(ECC_OBJS)
WOLFCRYPT_OBJS+=$(MATH_OBJS) WOLFCRYPT_OBJS+=$(MATH_OBJS)

View File

@ -364,7 +364,13 @@ static void wolfBoot_verify_signature_ecc(uint8_t key_slot,
defined(WOLFBOOT_SIGN_RSA4096) || \ defined(WOLFBOOT_SIGN_RSA4096) || \
defined(WOLFBOOT_SIGN_SECONDARY_RSA2048) || \ defined(WOLFBOOT_SIGN_SECONDARY_RSA2048) || \
defined(WOLFBOOT_SIGN_SECONDARY_RSA3072) || \ defined(WOLFBOOT_SIGN_SECONDARY_RSA3072) || \
defined(WOLFBOOT_SIGN_SECONDARY_RSA4096) defined(WOLFBOOT_SIGN_SECONDARY_RSA4096) || \
defined(WOLFBOOT_SIGN_RSAPSS2048) || \
defined(WOLFBOOT_SIGN_RSAPSS3072) || \
defined(WOLFBOOT_SIGN_RSAPSS4096) || \
defined(WOLFBOOT_SIGN_SECONDARY_RSAPSS2048) || \
defined(WOLFBOOT_SIGN_SECONDARY_RSAPSS3072) || \
defined(WOLFBOOT_SIGN_SECONDARY_RSAPSS4096)
#include <wolfssl/wolfcrypt/asn.h> #include <wolfssl/wolfcrypt/asn.h>
#include <wolfssl/wolfcrypt/rsa.h> #include <wolfssl/wolfcrypt/rsa.h>
@ -562,6 +568,74 @@ static void wolfBoot_verify_signature_rsa(uint8_t key_slot,
* WOLFBOOT_SIGN_RSA4096 || WOLFBOOT_SIGN_SECONDARY_RSA2048 || * WOLFBOOT_SIGN_RSA4096 || WOLFBOOT_SIGN_SECONDARY_RSA2048 ||
* WOLFBOOT_SIGN_SECONDARY_RSA3072 || WOLFBOOT_SIGN_SECONDARY_RSA4096 */ * WOLFBOOT_SIGN_SECONDARY_RSA3072 || WOLFBOOT_SIGN_SECONDARY_RSA4096 */
#if defined(WOLFBOOT_SIGN_RSAPSS2048) || \
defined(WOLFBOOT_SIGN_RSAPSS3072) || \
defined(WOLFBOOT_SIGN_RSAPSS4096) || \
defined(WOLFBOOT_SIGN_SECONDARY_RSAPSS2048) || \
defined(WOLFBOOT_SIGN_SECONDARY_RSAPSS3072) || \
defined(WOLFBOOT_SIGN_SECONDARY_RSAPSS4096)
static void wolfBoot_verify_signature_rsa_pss(uint8_t key_slot,
struct wolfBoot_image *img, uint8_t *sig)
{
int ret;
uint8_t output[RSA_IMAGE_SIGNATURE_SIZE];
uint8_t* digest_out = NULL;
word32 inOutIdx = 0;
struct RsaKey rsa;
#if defined(WOLFBOOT_HASH_SHA256)
enum wc_HashType hash_type = WC_HASH_TYPE_SHA256;
int mgf = WC_MGF1SHA256;
#elif defined(WOLFBOOT_HASH_SHA384)
enum wc_HashType hash_type = WC_HASH_TYPE_SHA384;
int mgf = WC_MGF1SHA384;
#else
#error "RSA-PSS requires SHA-256 or SHA-384"
#endif
uint8_t *pubkey = keystore_get_buffer(key_slot);
int pubkey_sz = keystore_get_size(key_slot);
if (pubkey == NULL || pubkey_sz < 0) {
return;
}
/* wolfCrypt software RSA-PSS verify */
ret = wc_InitRsaKey(&rsa, NULL);
if (ret == 0) {
/* Import public key */
ret = wc_RsaPublicKeyDecode((byte*)pubkey, &inOutIdx, &rsa, pubkey_sz);
if (ret >= 0) {
XMEMCPY(output, sig, RSA_IMAGE_SIGNATURE_SIZE);
RSA_VERIFY_FN(ret,
wc_RsaPSS_VerifyCheckInline, output, RSA_IMAGE_SIGNATURE_SIZE,
&digest_out, img->sha_hash, WOLFBOOT_SHA_DIGEST_SIZE,
hash_type, mgf, &rsa);
}
}
wc_FreeRsaKey(&rsa);
/* wc_RsaPSS_VerifyCheckInline returns the PSS-verified data length on
* success (>= digest size), or a negative error code on failure.
* The hash comparison is performed internally by the function.
*
* Note: uses '>=' rather than '==' because PSS verify returns the digest
* size on success, unlike PKCS#1 v1.5 which returns exact decoded length.
*
* ARMORED limitation: the PKCS#1 v1.5 path uses both RSA_VERIFY_FN and
* RSA_VERIFY_HASH armored macros (two hardened gates), but PSS only uses
* RSA_VERIFY_FN because wc_RsaPSS_VerifyCheckInline performs the hash
* comparison internally. The branch below is not armored. Full armored
* hardening for PSS would require a new macro or restructuring. */
if (ret >= WOLFBOOT_SHA_DIGEST_SIZE && img) {
wolfBoot_image_confirm_signature_ok(img);
}
}
#endif /* WOLFBOOT_SIGN_RSAPSS2048 || WOLFBOOT_SIGN_RSAPSS3072 || \
* WOLFBOOT_SIGN_RSAPSS4096 || WOLFBOOT_SIGN_SECONDARY_RSAPSS2048 || \
* WOLFBOOT_SIGN_SECONDARY_RSAPSS3072 || WOLFBOOT_SIGN_SECONDARY_RSAPSS4096 */
#ifdef WOLFBOOT_SIGN_LMS #ifdef WOLFBOOT_SIGN_LMS
#include <wolfssl/wolfcrypt/lms.h> #include <wolfssl/wolfcrypt/lms.h>
#ifdef HAVE_LIBLMS #ifdef HAVE_LIBLMS
@ -2356,7 +2430,10 @@ int wolfBoot_verify_authenticity(struct wolfBoot_image *img)
defined (WOLFBOOT_SIGN_RSA4096) || \ defined (WOLFBOOT_SIGN_RSA4096) || \
defined (WOLFBOOT_SIGN_RSA2048ENC) || \ defined (WOLFBOOT_SIGN_RSA2048ENC) || \
defined (WOLFBOOT_SIGN_RSA3072ENC) || \ defined (WOLFBOOT_SIGN_RSA3072ENC) || \
defined (WOLFBOOT_SIGN_RSA4096ENC) defined (WOLFBOOT_SIGN_RSA4096ENC) || \
defined (WOLFBOOT_SIGN_RSAPSS2048) || \
defined (WOLFBOOT_SIGN_RSAPSS3072) || \
defined (WOLFBOOT_SIGN_RSAPSS4096)
if (stored_signature_size != RSA_IMAGE_SIGNATURE_SIZE) if (stored_signature_size != RSA_IMAGE_SIGNATURE_SIZE)
return -1; return -1;
#elif defined (WOLFBOOT_SIGN_ECC256) || \ #elif defined (WOLFBOOT_SIGN_ECC256) || \
@ -2428,7 +2505,10 @@ int wolfBoot_verify_authenticity(struct wolfBoot_image *img)
defined (WOLFBOOT_SIGN_SECONDARY_RSA4096) || \ defined (WOLFBOOT_SIGN_SECONDARY_RSA4096) || \
defined (WOLFBOOT_SIGN_SECONDARY_RSA2048ENC) || \ defined (WOLFBOOT_SIGN_SECONDARY_RSA2048ENC) || \
defined (WOLFBOOT_SIGN_SECONDARY_RSA3072ENC) || \ defined (WOLFBOOT_SIGN_SECONDARY_RSA3072ENC) || \
defined (WOLFBOOT_SIGN_SECONDARY_RSA4096ENC) defined (WOLFBOOT_SIGN_SECONDARY_RSA4096ENC) || \
defined (WOLFBOOT_SIGN_SECONDARY_RSAPSS2048) || \
defined (WOLFBOOT_SIGN_SECONDARY_RSAPSS3072) || \
defined (WOLFBOOT_SIGN_SECONDARY_RSAPSS4096)
expected_secondary_signature_size = RSA_IMAGE_SIGNATURE_SIZE; expected_secondary_signature_size = RSA_IMAGE_SIGNATURE_SIZE;
#elif defined (WOLFBOOT_SIGN_SECONDARY_ECC256) || \ #elif defined (WOLFBOOT_SIGN_SECONDARY_ECC256) || \
defined (WOLFBOOT_SIGN_SECONDARY_ECC384) || \ defined (WOLFBOOT_SIGN_SECONDARY_ECC384) || \

View File

@ -336,7 +336,9 @@ static struct xmalloc_slot xmalloc_pool[] = {
#elif defined(WOLFBOOT_SIGN_RSA2048) || defined(WOLFBOOT_SIGN_RSA4096) || \ #elif defined(WOLFBOOT_SIGN_RSA2048) || defined(WOLFBOOT_SIGN_RSA4096) || \
defined(WOLFBOOT_SIGN_RSA3072) defined(WOLFBOOT_SIGN_RSA3072) || \
defined(WOLFBOOT_SIGN_RSAPSS2048) || defined(WOLFBOOT_SIGN_RSAPSS4096) || \
defined(WOLFBOOT_SIGN_RSAPSS3072)
#if defined(WOLFBOOT_HASH_SHA256) || defined(WOLFBOOT_HASH_SHA384) #if defined(WOLFBOOT_HASH_SHA256) || defined(WOLFBOOT_HASH_SHA384)
static uint32_t sha_block[HASH_BLOCK_SIZE]; static uint32_t sha_block[HASH_BLOCK_SIZE];
@ -350,7 +352,7 @@ static uint32_t sha_block[HASH_BLOCK_SIZE];
static uint8_t asncheck_buf[ASNCHECK_BUF_SIZE]; static uint8_t asncheck_buf[ASNCHECK_BUF_SIZE];
#ifndef USE_FAST_MATH #ifndef USE_FAST_MATH
#ifdef WOLFBOOT_SIGN_RSA2048 #if defined(WOLFBOOT_SIGN_RSA2048) || defined(WOLFBOOT_SIGN_RSAPSS2048)
#define MP_SCHEME "SP RSA2048" #define MP_SCHEME "SP RSA2048"
#define MP_INT_DYNAMIC_SIZE MP_INT_SIZEOF(MP_BITS_CNT(2048)) #define MP_INT_DYNAMIC_SIZE MP_INT_SIZEOF(MP_BITS_CNT(2048))
#define MP_BIGINT_MODEXP_SIZE (MP_INT_DYNAMIC_SIZE * 4) #define MP_BIGINT_MODEXP_SIZE (MP_INT_DYNAMIC_SIZE * 4)
@ -363,7 +365,7 @@ static uint8_t asncheck_buf[ASNCHECK_BUF_SIZE];
#define MPDIGIT_BUF1_SIZE (MP_DIGIT_SIZE * (72 * 4 + 3)) #define MPDIGIT_BUF1_SIZE (MP_DIGIT_SIZE * (72 * 4 + 3))
static uint8_t mp_digit_buf1[MPDIGIT_BUF1_SIZE]; static uint8_t mp_digit_buf1[MPDIGIT_BUF1_SIZE];
#endif #endif
#elif defined WOLFBOOT_SIGN_RSA3072 #elif defined(WOLFBOOT_SIGN_RSA3072) || defined(WOLFBOOT_SIGN_RSAPSS3072)
#define MP_SCHEME "SP RSA3072" #define MP_SCHEME "SP RSA3072"
#define MP_INT_DYNAMIC_SIZE MP_INT_SIZEOF(MP_BITS_CNT(3072)) #define MP_INT_DYNAMIC_SIZE MP_INT_SIZEOF(MP_BITS_CNT(3072))
#define MP_BIGINT_MODEXP_SIZE (MP_INT_DYNAMIC_SIZE * 4) #define MP_BIGINT_MODEXP_SIZE (MP_INT_DYNAMIC_SIZE * 4)

View File

@ -283,7 +283,7 @@ static void fwritekey(uint8_t *key, int len, FILE *f)
} }
} }
const char KType[][17] = { const char KType[][21] = {
"AUTH_KEY_NONE", "AUTH_KEY_NONE",
"AUTH_KEY_ED25519", "AUTH_KEY_ED25519",
"AUTH_KEY_ECC256", "AUTH_KEY_ECC256",
@ -295,10 +295,13 @@ const char KType[][17] = {
"AUTH_KEY_RSA3072", "AUTH_KEY_RSA3072",
"AUTH_KEY_LMS", "AUTH_KEY_LMS",
"AUTH_KEY_XMSS", "AUTH_KEY_XMSS",
"AUTH_KEY_ML_DSA" "AUTH_KEY_ML_DSA",
"AUTH_KEY_RSAPSS2048",
"AUTH_KEY_RSAPSS3072",
"AUTH_KEY_RSAPSS4096"
}; };
const char KSize[][29] = { const char KSize[][32] = {
"KEYSTORE_PUBKEY_SIZE_NONE", "KEYSTORE_PUBKEY_SIZE_NONE",
"KEYSTORE_PUBKEY_SIZE_ED25519", "KEYSTORE_PUBKEY_SIZE_ED25519",
"KEYSTORE_PUBKEY_SIZE_ECC256", "KEYSTORE_PUBKEY_SIZE_ECC256",
@ -310,10 +313,13 @@ const char KSize[][29] = {
"KEYSTORE_PUBKEY_SIZE_RSA3072", "KEYSTORE_PUBKEY_SIZE_RSA3072",
"KEYSTORE_PUBKEY_SIZE_LMS", "KEYSTORE_PUBKEY_SIZE_LMS",
"KEYSTORE_PUBKEY_SIZE_XMSS", "KEYSTORE_PUBKEY_SIZE_XMSS",
"KEYSTORE_PUBKEY_SIZE_ML_DSA" "KEYSTORE_PUBKEY_SIZE_ML_DSA",
"KEYSTORE_PUBKEY_SIZE_RSAPSS2048",
"KEYSTORE_PUBKEY_SIZE_RSAPSS3072",
"KEYSTORE_PUBKEY_SIZE_RSAPSS4096"
}; };
const char KName[][8] = { const char KName[][12] = {
"NONE", "NONE",
"ED25519", "ED25519",
"ECC256", "ECC256",
@ -325,7 +331,10 @@ const char KName[][8] = {
"RSA3072", "RSA3072",
"LMS", "LMS",
"XMSS", "XMSS",
"ML_DSA" "ML_DSA",
"RSAPSS2048",
"RSAPSS3072",
"RSAPSS4096"
}; };
#define MAX_PUBKEYS 64 #define MAX_PUBKEYS 64
@ -433,6 +442,15 @@ static uint32_t get_pubkey_size(uint32_t keyType)
case AUTH_KEY_RSA4096: case AUTH_KEY_RSA4096:
size = KEYSTORE_PUBKEY_SIZE_RSA4096; size = KEYSTORE_PUBKEY_SIZE_RSA4096;
break; break;
case AUTH_KEY_RSAPSS2048:
size = KEYSTORE_PUBKEY_SIZE_RSA2048;
break;
case AUTH_KEY_RSAPSS3072:
size = KEYSTORE_PUBKEY_SIZE_RSA3072;
break;
case AUTH_KEY_RSAPSS4096:
size = KEYSTORE_PUBKEY_SIZE_RSA4096;
break;
case AUTH_KEY_LMS: case AUTH_KEY_LMS:
size = KEYSTORE_PUBKEY_SIZE_LMS; size = KEYSTORE_PUBKEY_SIZE_LMS;
break; break;
@ -537,7 +555,8 @@ void keystore_add(uint32_t ktype, uint8_t *key, uint32_t sz, const char *keyfile
} }
static void keygen_rsa(const char *keyfile, int kbits, uint32_t id_mask) static void keygen_rsa(const char *keyfile, int kbits, uint32_t id_mask,
int ktype)
{ {
RsaKey k; RsaKey k;
uint8_t priv_der[4096], pub_der[2048]; uint8_t priv_der[4096], pub_der[2048];
@ -591,12 +610,7 @@ static void keygen_rsa(const char *keyfile, int kbits, uint32_t id_mask)
} }
} }
if (kbits == 2048) keystore_add(ktype, pub_der, publen, keyfile, id_mask);
keystore_add(AUTH_KEY_RSA2048, pub_der, publen, keyfile, id_mask);
else if (kbits == 3072)
keystore_add(AUTH_KEY_RSA3072, pub_der, publen, keyfile, id_mask);
else if (kbits == 4096)
keystore_add(AUTH_KEY_RSA4096, pub_der, publen, keyfile, id_mask);
cleanup: cleanup:
wc_ForceZero(priv_der, sizeof(priv_der)); wc_ForceZero(priv_der, sizeof(priv_der));
@ -1325,13 +1339,22 @@ static void key_generate(uint32_t ktype, const char *kfilename, uint32_t id_mask
#ifndef NO_RSA #ifndef NO_RSA
case AUTH_KEY_RSA2048: case AUTH_KEY_RSA2048:
keygen_rsa(kfilename, 2048, id_mask); keygen_rsa(kfilename, 2048, id_mask, AUTH_KEY_RSA2048);
break; break;
case AUTH_KEY_RSA3072: case AUTH_KEY_RSA3072:
keygen_rsa(kfilename, 3072, id_mask); keygen_rsa(kfilename, 3072, id_mask, AUTH_KEY_RSA3072);
break; break;
case AUTH_KEY_RSA4096: case AUTH_KEY_RSA4096:
keygen_rsa(kfilename, 4096, id_mask); keygen_rsa(kfilename, 4096, id_mask, AUTH_KEY_RSA4096);
break;
case AUTH_KEY_RSAPSS2048:
keygen_rsa(kfilename, 2048, id_mask, AUTH_KEY_RSAPSS2048);
break;
case AUTH_KEY_RSAPSS3072:
keygen_rsa(kfilename, 3072, id_mask, AUTH_KEY_RSAPSS3072);
break;
case AUTH_KEY_RSAPSS4096:
keygen_rsa(kfilename, 4096, id_mask, AUTH_KEY_RSAPSS4096);
break; break;
#endif #endif
@ -1506,6 +1529,15 @@ int main(int argc, char** argv)
else if (strcmp(argv[i], "--rsa4096") == 0) { else if (strcmp(argv[i], "--rsa4096") == 0) {
keytype = AUTH_KEY_RSA4096; keytype = AUTH_KEY_RSA4096;
} }
else if (strcmp(argv[i], "--rsapss2048") == 0) {
keytype = AUTH_KEY_RSAPSS2048;
}
else if (strcmp(argv[i], "--rsapss3072") == 0) {
keytype = AUTH_KEY_RSAPSS3072;
}
else if (strcmp(argv[i], "--rsapss4096") == 0) {
keytype = AUTH_KEY_RSAPSS4096;
}
#if defined(WOLFSSL_HAVE_LMS) #if defined(WOLFSSL_HAVE_LMS)
else if (strcmp(argv[i], "--lms") == 0) { else if (strcmp(argv[i], "--lms") == 0) {
keytype = AUTH_KEY_LMS; keytype = AUTH_KEY_LMS;

View File

@ -193,6 +193,9 @@ static inline int fp_truncate(FILE *f, size_t len)
#define SIGN_RSA2048 HDR_IMG_TYPE_AUTH_RSA2048 #define SIGN_RSA2048 HDR_IMG_TYPE_AUTH_RSA2048
#define SIGN_RSA3072 HDR_IMG_TYPE_AUTH_RSA3072 #define SIGN_RSA3072 HDR_IMG_TYPE_AUTH_RSA3072
#define SIGN_RSA4096 HDR_IMG_TYPE_AUTH_RSA4096 #define SIGN_RSA4096 HDR_IMG_TYPE_AUTH_RSA4096
#define SIGN_RSAPSS2048 HDR_IMG_TYPE_AUTH_RSAPSS2048
#define SIGN_RSAPSS3072 HDR_IMG_TYPE_AUTH_RSAPSS3072
#define SIGN_RSAPSS4096 HDR_IMG_TYPE_AUTH_RSAPSS4096
#define SIGN_ED448 HDR_IMG_TYPE_AUTH_ED448 #define SIGN_ED448 HDR_IMG_TYPE_AUTH_ED448
#define SIGN_ECC384 HDR_IMG_TYPE_AUTH_ECC384 #define SIGN_ECC384 HDR_IMG_TYPE_AUTH_ECC384
#define SIGN_ECC521 HDR_IMG_TYPE_AUTH_ECC521 #define SIGN_ECC521 HDR_IMG_TYPE_AUTH_ECC521
@ -836,6 +839,25 @@ static uint8_t *load_key(uint8_t **key_buffer, uint32_t *key_buffer_sz,
if (ret == 0) if (ret == 0)
break; break;
FALL_THROUGH; /* we didn't solve the key, keep trying */
case SIGN_RSAPSS2048:
ret = load_key_rsa(SIGN_RSAPSS2048, 256, KEYSTORE_PUBKEY_SIZE_RSA2048, 512,
key_buffer, key_buffer_sz, pubkey, pubkey_sz, secondary);
if (ret == 0)
break;
FALL_THROUGH;
case SIGN_RSAPSS3072:
ret = load_key_rsa(SIGN_RSAPSS3072, 384, KEYSTORE_PUBKEY_SIZE_RSA3072, 512,
key_buffer, key_buffer_sz, pubkey, pubkey_sz, secondary);
if (ret == 0)
break;
FALL_THROUGH;
case SIGN_RSAPSS4096:
ret = load_key_rsa(SIGN_RSAPSS4096, 512, KEYSTORE_PUBKEY_SIZE_RSA4096, 1024,
key_buffer, key_buffer_sz, pubkey, pubkey_sz, secondary);
if (ret == 0)
break;
FALL_THROUGH; /* we didn't solve the key, keep trying */ FALL_THROUGH; /* we didn't solve the key, keep trying */
case SIGN_LMS: case SIGN_LMS:
ret = -1; ret = -1;
@ -1109,6 +1131,30 @@ static int sign_digest(int sign, int hash_algo,
} }
} }
else else
if (sign == SIGN_RSAPSS2048 ||
sign == SIGN_RSAPSS3072 ||
sign == SIGN_RSAPSS4096)
{
enum wc_HashType hash_type;
int mgf;
if (hash_algo == HASH_SHA256) {
hash_type = WC_HASH_TYPE_SHA256;
mgf = WC_MGF1SHA256;
} else if (hash_algo == HASH_SHA384) {
hash_type = WC_HASH_TYPE_SHA384;
mgf = WC_MGF1SHA384;
} else {
fprintf(stderr, "RSA-PSS requires SHA-256 or SHA-384\n");
return -1;
}
ret = wc_RsaPSS_Sign(digest, digest_sz, signature, *signature_sz,
hash_type, mgf, &key.rsa, &rng);
if (ret > 0) {
*signature_sz = ret;
ret = 0;
}
}
else
if (sign == SIGN_LMS) { if (sign == SIGN_LMS) {
const char *key_file = CMD.key_file; const char *key_file = CMD.key_file;
if (secondary) { if (secondary) {
@ -2630,6 +2676,23 @@ static void set_signature_sizes(int secondary)
CMD.header_sz = 1024; CMD.header_sz = 1024;
*sz = 512; *sz = 512;
} }
else if (*sign == SIGN_RSAPSS2048) {
if (CMD.header_sz < 512)
CMD.header_sz = 512;
*sz = 256;
}
else if (*sign == SIGN_RSAPSS3072) {
if ((CMD.header_sz < 1024) && (CMD.hash_algo != HASH_SHA256))
CMD.header_sz = 1024;
if (CMD.header_sz < 512)
CMD.header_sz = 512;
*sz = 384;
}
else if (*sign == SIGN_RSAPSS4096) {
if (CMD.header_sz < 1024)
CMD.header_sz = 1024;
*sz = 512;
}
else if (*sign == SIGN_LMS) { else if (*sign == SIGN_LMS) {
int lms_ret = 0; int lms_ret = 0;
word32 sig_sz = 0; word32 sig_sz = 0;
@ -2923,6 +2986,36 @@ int main(int argc, char** argv)
sign_str = "RSA4096"; sign_str = "RSA4096";
} }
} }
else if (strcmp(argv[i], "--rsapss2048") == 0) {
if (CMD.sign != SIGN_AUTO) {
CMD.hybrid = 1;
CMD.secondary_sign = SIGN_RSAPSS2048;
secondary_sign_str = "RSAPSS2048";
} else {
CMD.sign = SIGN_RSAPSS2048;
sign_str = "RSAPSS2048";
}
}
else if (strcmp(argv[i], "--rsapss3072") == 0) {
if (CMD.sign != SIGN_AUTO) {
CMD.hybrid = 1;
CMD.secondary_sign = SIGN_RSAPSS3072;
secondary_sign_str = "RSAPSS3072";
} else {
CMD.sign = SIGN_RSAPSS3072;
sign_str = "RSAPSS3072";
}
}
else if (strcmp(argv[i], "--rsapss4096") == 0) {
if (CMD.sign != SIGN_AUTO) {
CMD.hybrid = 1;
CMD.secondary_sign = SIGN_RSAPSS4096;
secondary_sign_str = "RSAPSS4096";
} else {
CMD.sign = SIGN_RSAPSS4096;
sign_str = "RSAPSS4096";
}
}
else if (strcmp(argv[i], "--lms") == 0) { else if (strcmp(argv[i], "--lms") == 0) {
if (CMD.sign != SIGN_AUTO) { if (CMD.sign != SIGN_AUTO) {
CMD.hybrid = 1; CMD.hybrid = 1;
@ -3331,7 +3424,10 @@ int main(int argc, char** argv)
} }
else if (CMD.sign == SIGN_RSA2048 || else if (CMD.sign == SIGN_RSA2048 ||
CMD.sign == SIGN_RSA3072 || CMD.sign == SIGN_RSA3072 ||
CMD.sign == SIGN_RSA4096) { CMD.sign == SIGN_RSA4096 ||
CMD.sign == SIGN_RSAPSS2048 ||
CMD.sign == SIGN_RSAPSS3072 ||
CMD.sign == SIGN_RSAPSS4096) {
wc_FreeRsaKey(&key.rsa); wc_FreeRsaKey(&key.rsa);
} }
else if (CMD.sign == SIGN_LMS) { else if (CMD.sign == SIGN_LMS) {

View File

@ -68,6 +68,7 @@
/* RSA */ /* RSA */
#define HAVE_RSA #define HAVE_RSA
#define WC_RSA_BLINDING #define WC_RSA_BLINDING
#define WC_RSA_PSS
#define WOLFSSL_KEY_GEN #define WOLFSSL_KEY_GEN
/* Hashing */ /* Hashing */