@@ -586,11 +586,14 @@ void wc_LmsKey_Free(LmsKey* key)
586586 #ifndef WOLFSSL_LMS_VERIFY_ONLY
587587 if (key -> priv_data != NULL ) {
588588 const LmsParams * params = key -> params ;
589-
590- ForceZero (key -> priv_data , LMS_PRIV_DATA_LEN (params -> levels ,
589+ int priv_data_len = LMS_PRIV_DATA_LEN (params -> levels ,
591590 params -> height , params -> p , params -> rootLevels ,
592- params -> cacheBits , params -> hash_len )) ;
591+ params -> cacheBits , params -> hash_len );
593592
593+ #ifdef WOLFSSL_WC_LMS_SERIALIZE_STATE
594+ priv_data_len += HSS_PRIVATE_KEY_LEN (key -> params -> hash_len );
595+ #endif
596+ ForceZero (key -> priv_data , priv_data_len );
594597 XFREE (key -> priv_data , key -> heap , DYNAMIC_TYPE_LMS );
595598 }
596599 #endif
@@ -717,6 +720,7 @@ int wc_LmsKey_SetContext(LmsKey* key, void* context)
717720int wc_LmsKey_MakeKey (LmsKey * key , WC_RNG * rng )
718721{
719722 int ret = 0 ;
723+ int priv_data_len = 0 ;
720724
721725 /* Validate parameters. */
722726 if ((key == NULL ) || (rng == NULL )) {
@@ -738,17 +742,26 @@ int wc_LmsKey_MakeKey(LmsKey* key, WC_RNG* rng)
738742 ret = BAD_FUNC_ARG ;
739743 }
740744
741- if (( ret == 0 ) && ( key -> priv_data == NULL ) ) {
745+ if (ret == 0 ) {
742746 const LmsParams * params = key -> params ;
747+ priv_data_len = LMS_PRIV_DATA_LEN (params -> levels , params -> height ,
748+ params -> p , params -> rootLevels , params -> cacheBits , params -> hash_len );
743749
750+ #ifdef WOLFSSL_WC_LMS_SERIALIZE_STATE
751+ priv_data_len += HSS_PRIVATE_KEY_LEN (key -> params -> hash_len );
752+ #endif
753+ }
754+ if ((ret == 0 ) && (key -> priv_data == NULL )) {
744755 /* Allocate memory for the private key data. */
745- key -> priv_data = (byte * )XMALLOC (LMS_PRIV_DATA_LEN (params -> levels ,
746- params -> height , params -> p , params -> rootLevels , params -> cacheBits ,
747- params -> hash_len ), key -> heap , DYNAMIC_TYPE_LMS );
756+ key -> priv_data = (byte * )XMALLOC (priv_data_len , key -> heap ,
757+ DYNAMIC_TYPE_LMS );
748758 /* Check pointer is valid. */
749759 if (key -> priv_data == NULL ) {
750760 ret = MEMORY_E ;
751761 }
762+ #ifdef WOLFSSL_WC_LMS_SERIALIZE_STATE
763+ XMEMSET (key -> priv_data , 0 , priv_data_len );
764+ #endif
752765 }
753766 if (ret == 0 ) {
754767 #ifdef WOLFSSL_SMALL_STACK
@@ -759,7 +772,8 @@ int wc_LmsKey_MakeKey(LmsKey* key, WC_RNG* rng)
759772
760773 #ifdef WOLFSSL_SMALL_STACK
761774 /* Allocate memory for working state. */
762- state = (LmsState * )XMALLOC (sizeof (LmsState ), NULL , DYNAMIC_TYPE_TMP_BUFFER );
775+ state = (LmsState * )XMALLOC (sizeof (LmsState ), NULL ,
776+ DYNAMIC_TYPE_TMP_BUFFER );
763777 if (state == NULL ) {
764778 ret = MEMORY_E ;
765779 }
@@ -781,9 +795,18 @@ int wc_LmsKey_MakeKey(LmsKey* key, WC_RNG* rng)
781795 }
782796 }
783797 if (ret == 0 ) {
798+ int rv ;
784799 /* Write private key to storage. */
785- int rv = key -> write_private_key (key -> priv_raw ,
800+ #ifdef WOLFSSL_WC_LMS_SERIALIZE_STATE
801+ XMEMCPY (key -> priv_data + priv_data_len -
802+ HSS_PRIVATE_KEY_LEN (key -> params -> hash_len ), key -> priv_raw ,
803+ HSS_PRIVATE_KEY_LEN (key -> params -> hash_len ));
804+ rv = key -> write_private_key (key -> priv_data , priv_data_len ,
805+ key -> context );
806+ #else
807+ rv = key -> write_private_key (key -> priv_raw ,
786808 HSS_PRIVATE_KEY_LEN (key -> params -> hash_len ), key -> context );
809+ #endif
787810 if (rv != WC_LMS_RC_SAVED_TO_NV_MEMORY ) {
788811 ret = IO_FAILED_E ;
789812 }
@@ -816,6 +839,7 @@ int wc_LmsKey_MakeKey(LmsKey* key, WC_RNG* rng)
816839int wc_LmsKey_Reload (LmsKey * key )
817840{
818841 int ret = 0 ;
842+ int priv_data_len = 0 ;
819843
820844 /* Validate parameter. */
821845 if (key == NULL ) {
@@ -837,25 +861,46 @@ int wc_LmsKey_Reload(LmsKey* key)
837861 ret = BAD_FUNC_ARG ;
838862 }
839863
840- if (( ret == 0 ) && ( key -> priv_data == NULL ) ) {
864+ if (ret == 0 ) {
841865 const LmsParams * params = key -> params ;
866+ priv_data_len = LMS_PRIV_DATA_LEN (params -> levels , params -> height ,
867+ params -> p , params -> rootLevels , params -> cacheBits , params -> hash_len );
842868
869+ #ifdef WOLFSSL_WC_LMS_SERIALIZE_STATE
870+ priv_data_len += HSS_PRIVATE_KEY_LEN (params -> hash_len );
871+ #endif
872+ }
873+ if ((ret == 0 ) && (key -> priv_data == NULL )) {
843874 /* Allocate memory for the private key data. */
844- key -> priv_data = (byte * )XMALLOC (LMS_PRIV_DATA_LEN (params -> levels ,
845- params -> height , params -> p , params -> rootLevels , params -> cacheBits ,
846- params -> hash_len ), key -> heap , DYNAMIC_TYPE_LMS );
875+ key -> priv_data = (byte * )XMALLOC (priv_data_len , key -> heap ,
876+ DYNAMIC_TYPE_LMS );
847877 /* Check pointer is valid. */
848878 if (key -> priv_data == NULL ) {
849879 ret = MEMORY_E ;
850880 }
851881 }
852882 if (ret == 0 ) {
883+ int rv ;
884+
853885 /* Load private key. */
854- int rv = key -> read_private_key (key -> priv_raw ,
886+ #ifdef WOLFSSL_WC_LMS_SERIALIZE_STATE
887+ const LmsParams * params = key -> params ;
888+
889+ rv = key -> read_private_key (key -> priv_data , priv_data_len , key -> context );
890+ #else
891+ rv = key -> read_private_key (key -> priv_raw ,
855892 HSS_PRIVATE_KEY_LEN (key -> params -> hash_len ), key -> context );
893+ #endif
856894 if (rv != WC_LMS_RC_READ_TO_MEMORY ) {
857895 ret = IO_FAILED_E ;
858896 }
897+ #ifdef WOLFSSL_WC_LMS_SERIALIZE_STATE
898+ if (ret == 0 ) {
899+ XMEMCPY (key -> priv_raw , key -> priv_data + priv_data_len -
900+ HSS_PRIVATE_KEY_LEN (params -> hash_len ),
901+ HSS_PRIVATE_KEY_LEN (params -> hash_len ));
902+ }
903+ #endif
859904 }
860905
861906 /* Double check the key actually has signatures left. */
@@ -874,7 +919,8 @@ int wc_LmsKey_Reload(LmsKey* key)
874919
875920 #ifdef WOLFSSL_SMALL_STACK
876921 /* Allocate memory for working state. */
877- state = (LmsState * )XMALLOC (sizeof (LmsState ), NULL , DYNAMIC_TYPE_TMP_BUFFER );
922+ state = (LmsState * )XMALLOC (sizeof (LmsState ), NULL ,
923+ DYNAMIC_TYPE_TMP_BUFFER );
878924 if (state == NULL ) {
879925 ret = MEMORY_E ;
880926 }
@@ -972,7 +1018,8 @@ int wc_LmsKey_Sign(LmsKey* key, byte* sig, word32* sigSz, const byte* msg,
9721018
9731019 #ifdef WOLFSSL_SMALL_STACK
9741020 /* Allocate memory for working state. */
975- state = (LmsState * )XMALLOC (sizeof (LmsState ), NULL , DYNAMIC_TYPE_TMP_BUFFER );
1021+ state = (LmsState * )XMALLOC (sizeof (LmsState ), NULL ,
1022+ DYNAMIC_TYPE_TMP_BUFFER );
9761023 if (state == NULL ) {
9771024 ret = MEMORY_E ;
9781025 }
@@ -997,9 +1044,24 @@ int wc_LmsKey_Sign(LmsKey* key, byte* sig, word32* sigSz, const byte* msg,
9971044 * sigSz = (word32 )key -> params -> sig_len ;
9981045 }
9991046 if (ret == 0 ) {
1047+ int rv ;
1048+
10001049 /* Write private key to storage. */
1001- int rv = key -> write_private_key (key -> priv_raw ,
1050+ #ifdef WOLFSSL_WC_LMS_SERIALIZE_STATE
1051+ const LmsParams * params = key -> params ;
1052+ int priv_data_len = LMS_PRIV_DATA_LEN (params -> levels , params -> height ,
1053+ params -> p , params -> rootLevels , params -> cacheBits ,
1054+ params -> hash_len ) + HSS_PRIVATE_KEY_LEN (key -> params -> hash_len );
1055+
1056+ XMEMCPY (key -> priv_data + priv_data_len -
1057+ HSS_PRIVATE_KEY_LEN (params -> hash_len ), key -> priv_raw ,
1058+ HSS_PRIVATE_KEY_LEN (params -> hash_len ));
1059+ rv = key -> write_private_key (key -> priv_data , priv_data_len ,
1060+ key -> context );
1061+ #else
1062+ rv = key -> write_private_key (key -> priv_raw ,
10021063 HSS_PRIVATE_KEY_LEN (key -> params -> hash_len ), key -> context );
1064+ #endif
10031065 if (rv != WC_LMS_RC_SAVED_TO_NV_MEMORY ) {
10041066 ret = IO_FAILED_E ;
10051067 }
@@ -1234,7 +1296,8 @@ int wc_LmsKey_Verify(LmsKey* key, const byte* sig, word32 sigSz,
12341296
12351297 #ifdef WOLFSSL_SMALL_STACK
12361298 /* Allocate memory for working state. */
1237- state = (LmsState * )XMALLOC (sizeof (LmsState ), NULL , DYNAMIC_TYPE_TMP_BUFFER );
1299+ state = (LmsState * )XMALLOC (sizeof (LmsState ), NULL ,
1300+ DYNAMIC_TYPE_TMP_BUFFER );
12381301 if (state == NULL ) {
12391302 ret = MEMORY_E ;
12401303 }
0 commit comments