@@ -8003,29 +8003,37 @@ static int dilithium_pub_from_priv(dilithium_key* key)
80038003 int ret = 0 ;
80048004 const wc_dilithium_params * params = key -> params ;
80058005 const byte * pub_seed = key -> k ;
8006- const byte * s1p = pub_seed + DILITHIUM_PUB_SEED_SZ + DILITHIUM_K_SZ + DILITHIUM_TR_SZ ;
8007- const byte * s2p = s1p + params -> s1EncSz ;
8006+ const byte * s1p = NULL ;
8007+ const byte * s2p = NULL ;
80088008 sword32 * a = NULL ;
80098009 sword32 * s1 = NULL ;
80108010 sword32 * s2 = NULL ;
80118011 sword32 * t = NULL ;
80128012 byte * t0 = NULL ;
80138013 byte * t1 = key -> p + DILITHIUM_PUB_SEED_SZ ;
80148014
8015- /* Allocate and create cached values. */
8016- #ifndef WC_DILITHIUM_CACHE_MATRIX_A
8017- a = (sword32 * )XMALLOC (params -> aSz , key -> heap ,
8018- DYNAMIC_TYPE_DILITHIUM );
8019- if (a == NULL ) {
8020- ret = MEMORY_E ;
8015+ if ((params == NULL ) || (!key -> prvKeySet )) {
8016+ ret = BAD_STATE_E ;
80218017 }
8022- else {
8023- XMEMSET (a , 0 , params -> aSz );
8018+
8019+ if (ret == 0 ) {
8020+ s1p = pub_seed + DILITHIUM_PUB_SEED_SZ + DILITHIUM_K_SZ + DILITHIUM_TR_SZ ;
8021+ s2p = s1p + params -> s1EncSz ;
80248022 }
80258023
8024+ /* Allocate and create cached values. */
8025+ #ifndef WC_DILITHIUM_CACHE_MATRIX_A
80268026 if (ret == 0 ) {
8027- ret = dilithium_expand_a (& key -> shake , pub_seed , params -> k , params -> l ,
8028- a , key -> heap );
8027+ a = (sword32 * )XMALLOC (params -> aSz , key -> heap ,
8028+ DYNAMIC_TYPE_DILITHIUM );
8029+ if (a == NULL ) {
8030+ ret = MEMORY_E ;
8031+ }
8032+ else {
8033+ XMEMSET (a , 0 , params -> aSz );
8034+ ret = dilithium_expand_a (& key -> shake , pub_seed , params -> k ,
8035+ params -> l , a , key -> heap );
8036+ }
80298037 }
80308038#else
80318039 if (ret == 0 ) {
@@ -8061,6 +8069,7 @@ static int dilithium_pub_from_priv(dilithium_key* key)
80618069 else {
80628070 s1 = key -> s1 ;
80638071 s2 = key -> s2 ;
8072+ dilithium_vec_invntt_full (s2 , params -> k );
80648073 }
80658074 }
80668075#endif
@@ -8088,28 +8097,38 @@ static int dilithium_pub_from_priv(dilithium_key* key)
80888097 dilithium_matrix_mul (t , a , s1 , params -> k , params -> l );
80898098 dilithium_vec_invntt_full (t , params -> k );
80908099 dilithium_vec_add (t , s2 , params -> k );
8091- /* NTT s2 */
8092- dilithium_vec_ntt_small (s2 , params -> k );
80938100
80948101 /* Make positive for decomposing. */
80958102 dilithium_vec_make_pos (t , params -> k );
80968103 /* Decompose t in t0 and t1 and encode into public and private key. */
80978104 dilithium_vec_encode_t0_t1 (t , params -> k , t0 , t1 );
80988105 }
8099-
8106+ #ifdef WC_DILITHIUM_CACHE_PRIV_VECTORS
8107+ if (s2 != NULL ) {
8108+ /* NTT s2 */
8109+ dilithium_vec_ntt_small (s2 , params -> k );
8110+ }
8111+ #endif
81008112#ifndef WC_DILITHIUM_CACHE_MATRIX_A
8101- XMEMSET (a , 0 , params -> aSz );
8102- XFREE (a , key -> heap , DYNAMIC_TYPE_DILITHIUM );
8113+ if (a != NULL ) {
8114+ XMEMSET (a , 0 , params -> aSz );
8115+ XFREE (a , key -> heap , DYNAMIC_TYPE_DILITHIUM );
8116+ }
81038117#endif
81048118#ifndef WC_DILITHIUM_CACHE_PRIV_VECTORS
8105- XMEMSET (s1 , 0 , params -> s1Sz + params -> s2Sz );
8106- XFREE (s1 , key -> heap , DYNAMIC_TYPE_DILITHIUM );
8119+ if (s1 != NULL ) {
8120+ XMEMSET (s1 , 0 , params -> s1Sz + params -> s2Sz );
8121+ XFREE (s1 , key -> heap , DYNAMIC_TYPE_DILITHIUM );
8122+ }
81078123#endif
8108- XMEMSET (t0 , 0 , params -> s2Sz );
8109- XMEMSET (t , 0 , params -> s2Sz );
8110- XFREE (t0 , key -> heap , DYNAMIC_TYPE_DILITHIUM );
8111- XFREE (t , key -> heap , DYNAMIC_TYPE_DILITHIUM );
8112-
8124+ if (t0 != NULL ) {
8125+ XMEMSET (t0 , 0 , params -> s2Sz );
8126+ XFREE (t0 , key -> heap , DYNAMIC_TYPE_DILITHIUM );
8127+ }
8128+ if (t != NULL ) {
8129+ XMEMSET (t , 0 , params -> s2Sz );
8130+ XFREE (t , key -> heap , DYNAMIC_TYPE_DILITHIUM );
8131+ }
81138132 if (ret == 0 ) {
81148133#ifdef WC_DILITHIUM_CACHE_PUB_VECTORS
81158134 #ifndef WC_DILITHIUM_FIXED_ARRAY
@@ -10311,7 +10330,12 @@ int wc_dilithium_pub_from_priv(dilithium_key* key)
1031110330
1031210331 if (ret == 0 ) {
1031310332#ifdef WOLFSSL_WC_DILITHIUM
10314- ret = dilithium_pub_from_priv (key );
10333+ if ((key -> params == NULL ) || (!key -> prvKeySet )) {
10334+ ret = BAD_STATE_E ;
10335+ }
10336+ else {
10337+ ret = dilithium_pub_from_priv (key );
10338+ }
1031510339#elif defined(HAVE_LIBOQS )
1031610340 ret = NOT_COMPILED_IN ;
1031710341#endif
0 commit comments