@@ -7986,29 +7986,37 @@ static int dilithium_pub_from_priv(dilithium_key* key)
79867986 int ret = 0 ;
79877987 const wc_dilithium_params * params = key -> params ;
79887988 const byte * pub_seed = key -> k ;
7989- const byte * s1p = pub_seed + DILITHIUM_PUB_SEED_SZ + DILITHIUM_K_SZ + DILITHIUM_TR_SZ ;
7990- const byte * s2p = s1p + params -> s1EncSz ;
7989+ const byte * s1p = NULL ;
7990+ const byte * s2p = NULL ;
79917991 sword32 * a = NULL ;
79927992 sword32 * s1 = NULL ;
79937993 sword32 * s2 = NULL ;
79947994 sword32 * t = NULL ;
79957995 byte * t0 = NULL ;
79967996 byte * t1 = key -> p + DILITHIUM_PUB_SEED_SZ ;
79977997
7998- /* Allocate and create cached values. */
7999- #ifndef WC_DILITHIUM_CACHE_MATRIX_A
8000- a = (sword32 * )XMALLOC (params -> aSz , key -> heap ,
8001- DYNAMIC_TYPE_DILITHIUM );
8002- if (a == NULL ) {
8003- ret = MEMORY_E ;
7998+ if ((params == NULL ) || (!key -> prvKeySet )) {
7999+ ret = BAD_STATE_E ;
80048000 }
8005- else {
8006- XMEMSET (a , 0 , params -> aSz );
8001+
8002+ if (ret == 0 ) {
8003+ s1p = pub_seed + DILITHIUM_PUB_SEED_SZ + DILITHIUM_K_SZ + DILITHIUM_TR_SZ ;
8004+ s2p = s1p + params -> s1EncSz ;
80078005 }
80088006
8007+ /* Allocate and create cached values. */
8008+ #ifndef WC_DILITHIUM_CACHE_MATRIX_A
80098009 if (ret == 0 ) {
8010- ret = dilithium_expand_a (& key -> shake , pub_seed , params -> k , params -> l ,
8011- a , key -> heap );
8010+ a = (sword32 * )XMALLOC (params -> aSz , key -> heap ,
8011+ DYNAMIC_TYPE_DILITHIUM );
8012+ if (a == NULL ) {
8013+ ret = MEMORY_E ;
8014+ }
8015+ else {
8016+ XMEMSET (a , 0 , params -> aSz );
8017+ ret = dilithium_expand_a (& key -> shake , pub_seed , params -> k ,
8018+ params -> l , a , key -> heap );
8019+ }
80128020 }
80138021#else
80148022 if (ret == 0 ) {
@@ -8044,6 +8052,7 @@ static int dilithium_pub_from_priv(dilithium_key* key)
80448052 else {
80458053 s1 = key -> s1 ;
80468054 s2 = key -> s2 ;
8055+ dilithium_vec_invntt_full (s2 , params -> k );
80478056 }
80488057 }
80498058#endif
@@ -8071,28 +8080,38 @@ static int dilithium_pub_from_priv(dilithium_key* key)
80718080 dilithium_matrix_mul (t , a , s1 , params -> k , params -> l );
80728081 dilithium_vec_invntt_full (t , params -> k );
80738082 dilithium_vec_add (t , s2 , params -> k );
8074- /* NTT s2 */
8075- dilithium_vec_ntt_small (s2 , params -> k );
80768083
80778084 /* Make positive for decomposing. */
80788085 dilithium_vec_make_pos (t , params -> k );
80798086 /* Decompose t in t0 and t1 and encode into public and private key. */
80808087 dilithium_vec_encode_t0_t1 (t , params -> k , t0 , t1 );
80818088 }
8082-
8089+ #ifdef WC_DILITHIUM_CACHE_PRIV_VECTORS
8090+ if (s2 != NULL ) {
8091+ /* NTT s2 */
8092+ dilithium_vec_ntt_small (s2 , params -> k );
8093+ }
8094+ #endif
80838095#ifndef WC_DILITHIUM_CACHE_MATRIX_A
8084- XMEMSET (a , 0 , params -> aSz );
8085- XFREE (a , key -> heap , DYNAMIC_TYPE_DILITHIUM );
8096+ if (a != NULL ) {
8097+ XMEMSET (a , 0 , params -> aSz );
8098+ XFREE (a , key -> heap , DYNAMIC_TYPE_DILITHIUM );
8099+ }
80868100#endif
80878101#ifndef WC_DILITHIUM_CACHE_PRIV_VECTORS
8088- XMEMSET (s1 , 0 , params -> s1Sz + params -> s2Sz );
8089- XFREE (s1 , key -> heap , DYNAMIC_TYPE_DILITHIUM );
8102+ if (s1 != NULL ) {
8103+ XMEMSET (s1 , 0 , params -> s1Sz + params -> s2Sz );
8104+ XFREE (s1 , key -> heap , DYNAMIC_TYPE_DILITHIUM );
8105+ }
80908106#endif
8091- XMEMSET (t0 , 0 , params -> s2Sz );
8092- XMEMSET (t , 0 , params -> s2Sz );
8093- XFREE (t0 , key -> heap , DYNAMIC_TYPE_DILITHIUM );
8094- XFREE (t , key -> heap , DYNAMIC_TYPE_DILITHIUM );
8095-
8107+ if (t0 != NULL ) {
8108+ XMEMSET (t0 , 0 , params -> s2Sz );
8109+ XFREE (t0 , key -> heap , DYNAMIC_TYPE_DILITHIUM );
8110+ }
8111+ if (t != NULL ) {
8112+ XMEMSET (t , 0 , params -> s2Sz );
8113+ XFREE (t , key -> heap , DYNAMIC_TYPE_DILITHIUM );
8114+ }
80968115 if (ret == 0 ) {
80978116#ifdef WC_DILITHIUM_CACHE_PUB_VECTORS
80988117 #ifndef WC_DILITHIUM_FIXED_ARRAY
@@ -10255,7 +10274,12 @@ int wc_dilithium_pub_from_priv(dilithium_key* key)
1025510274
1025610275 if (ret == 0 ) {
1025710276#ifdef WOLFSSL_WC_DILITHIUM
10258- ret = dilithium_pub_from_priv (key );
10277+ if ((key -> params == NULL ) || (!key -> prvKeySet )) {
10278+ ret = BAD_STATE_E ;
10279+ }
10280+ else {
10281+ ret = dilithium_pub_from_priv (key );
10282+ }
1025910283#elif defined(HAVE_LIBOQS )
1026010284 ret = NOT_COMPILED_IN ;
1026110285#endif
0 commit comments