@@ -31,6 +31,12 @@ bool OSSLMLDSA::sign(PrivateKey *privateKey, const ByteString &dataToSign,
3131 return false ;
3232 }
3333
34+ if (privateKey == NULL )
35+ {
36+ ERROR_MSG (" No private key supplied" );
37+ return false ;
38+ }
39+
3440 // Check if the private key is the right type
3541 if (!privateKey->isOfType (OSSLMLDSAPrivateKey::type))
3642 {
@@ -68,6 +74,12 @@ bool OSSLMLDSA::sign(PrivateKey *privateKey, const ByteString &dataToSign,
6874 memset (&signature[0 ], 0 , len);
6975
7076 EVP_MD_CTX *ctx = EVP_MD_CTX_new ();
77+ if (ctx == NULL )
78+ {
79+ ERROR_MSG (" ML-DSA sign ctx alloc failed" );
80+ return false ;
81+ }
82+
7183 if (!EVP_DigestSignInit (ctx, NULL , NULL , NULL , pkey))
7284 {
7385 ERROR_MSG (" ML-DSA sign init failed (0x%08X)" , ERR_get_error ());
@@ -117,6 +129,12 @@ bool OSSLMLDSA::verify(PublicKey *publicKey, const ByteString &originalData,
117129 return false ;
118130 }
119131
132+ if (publicKey == NULL )
133+ {
134+ ERROR_MSG (" No public key supplied" );
135+ return false ;
136+ }
137+
120138 // Check if the private key is the right type
121139 if (!publicKey->isOfType (OSSLMLDSAPublicKey::type))
122140 {
@@ -159,6 +177,14 @@ bool OSSLMLDSA::verify(PublicKey *publicKey, const ByteString &originalData,
159177
160178 unsigned long parameterSet = pk->getParameterSet ();
161179 const char * name = OSSL::mldsaParameterSet2Name (parameterSet);
180+
181+ if (name == NULL )
182+ {
183+ ERROR_MSG (" Unknown ML-DSA parameter set (%lu)" , parameterSet);
184+ EVP_PKEY_CTX_free (vctx);
185+ return false ;
186+ }
187+
162188 sig_alg = EVP_SIGNATURE_fetch (NULL , name, NULL );
163189 if (sig_alg == NULL ) {
164190 ERROR_MSG (" ML-DSA EVP_SIGNATURE_fetch failed (0x%08X)" , ERR_get_error ());
@@ -176,12 +202,20 @@ bool OSSLMLDSA::verify(PublicKey *publicKey, const ByteString &originalData,
176202 int verifyRV = EVP_PKEY_verify (vctx, signature.const_byte_str (), signature.size (),
177203 originalData.const_byte_str (), originalData.size ());
178204
179- if (verifyRV != 1 ) {
180- ERROR_MSG (" ML-DSA verify failed (0x%08X)" , verifyRV);
181- EVP_PKEY_CTX_free (vctx);
182- EVP_SIGNATURE_free (sig_alg);
183- return false ;
184- }
205+ if (verifyRV != 1 )
206+ {
207+ if (verifyRV == 0 )
208+ {
209+ ERROR_MSG (" ML-DSA signature invalid" );
210+ } else
211+ {
212+ ERROR_MSG (" ML-DSA verify error (0x%08X)" , ERR_get_error ());
213+ }
214+ EVP_PKEY_CTX_free (vctx);
215+ EVP_SIGNATURE_free (sig_alg);
216+ return false ;
217+ }
218+
185219 EVP_PKEY_CTX_free (vctx);
186220 EVP_SIGNATURE_free (sig_alg);
187221 return true ;
@@ -265,6 +299,12 @@ bool OSSLMLDSA::generateKeyPair(AsymmetricKeyPair **ppKeyPair, AsymmetricParamet
265299 unsigned long parameterSet = params->getParameterSet ();
266300 const char * name = OSSL::mldsaParameterSet2Name (parameterSet);
267301
302+ if (name == NULL )
303+ {
304+ ERROR_MSG (" Unknown ML-DSA parameter set (%lu)" , parameterSet);
305+ return false ;
306+ }
307+
268308 EVP_PKEY_CTX *ctx = NULL ;
269309 EVP_PKEY *pkey = NULL ;
270310 ctx = EVP_PKEY_CTX_new_from_name (NULL , name, NULL );
@@ -288,8 +328,11 @@ bool OSSLMLDSA::generateKeyPair(AsymmetricKeyPair **ppKeyPair, AsymmetricParamet
288328 // Create an asymmetric key-pair object to return
289329 OSSLMLDSAKeyPair *kp = new OSSLMLDSAKeyPair ();
290330
291- ((OSSLMLDSAPrivateKey *)kp->getPrivateKey ())->setFromOSSL (pkey);
292- ((OSSLMLDSAPublicKey *)kp->getPublicKey ())->setFromOSSL (pkey);
331+ // bump refcount for each wrapper
332+ EVP_PKEY_up_ref (pkey);
333+ ((OSSLMLDSAPrivateKey*)kp->getPrivateKey ())->setFromOSSL (pkey);
334+ EVP_PKEY_up_ref (pkey);
335+ ((OSSLMLDSAPublicKey*) kp->getPublicKey ())->setFromOSSL (pkey);
293336
294337 *ppKeyPair = kp;
295338
0 commit comments