@@ -53,10 +53,32 @@ bool OSSLECDSA::sign(PrivateKey* privateKey, const ByteString& dataToSign,
5353 ByteString& signature, const AsymMech::Type mechanism,
5454 const void * /* param = NULL */ , const size_t /* paramLen = 0 */ )
5555{
56+
57+ HashAlgo::Type hash = HashAlgo::Unknown;
58+
5659 if (mechanism != AsymMech::ECDSA)
5760 {
58- ERROR_MSG (" Invalid mechanism supplied (%i)" , mechanism);
59- return false ;
61+ switch (mechanism)
62+ {
63+ case AsymMech::ECDSA_SHA1:
64+ hash = HashAlgo::SHA1;
65+ break ;
66+ case AsymMech::ECDSA_SHA224:
67+ hash = HashAlgo::SHA224;
68+ break ;
69+ case AsymMech::ECDSA_SHA256:
70+ hash = HashAlgo::SHA256;
71+ break ;
72+ case AsymMech::ECDSA_SHA384:
73+ hash = HashAlgo::SHA384;
74+ break ;
75+ case AsymMech::ECDSA_SHA512:
76+ hash = HashAlgo::SHA512;
77+ break ;
78+ default :
79+ ERROR_MSG (" Invalid mechanism supplied (%i)" , mechanism);
80+ return false ;
81+ }
6082 }
6183
6284 // Check if the private key is the right type
@@ -93,6 +115,24 @@ bool OSSLECDSA::sign(PrivateKey* privateKey, const ByteString& dataToSign,
93115 EC_KEY_set_method (eckey, EC_KEY_OpenSSL ());
94116#endif
95117
118+ // Pre-hash the data if necessary
119+ ByteString prepDataToSign;
120+ if (hash == HashAlgo::Unknown) {
121+ prepDataToSign = dataToSign;
122+ } else {
123+ HashAlgorithm* digest = CryptoFactory::i ()->getHashAlgorithm (hash);
124+
125+ if (!digest->hashInit ()
126+ || !digest->hashUpdate (dataToSign)
127+ || !digest->hashFinal (prepDataToSign))
128+ {
129+ delete digest;
130+ return false ;
131+ }
132+ delete digest;
133+ }
134+
135+
96136 // Perform the signature operation
97137 size_t len = pk->getOrderLength ();
98138 if (len == 0 )
@@ -102,7 +142,7 @@ bool OSSLECDSA::sign(PrivateKey* privateKey, const ByteString& dataToSign,
102142 }
103143 signature.resize (2 * len);
104144 memset (&signature[0 ], 0 , 2 * len);
105- ECDSA_SIG *sig = ECDSA_do_sign (dataToSign .const_byte_str (), dataToSign .size (), eckey);
145+ ECDSA_SIG *sig = ECDSA_do_sign (prepDataToSign .const_byte_str (), prepDataToSign .size (), eckey);
106146 if (sig == NULL )
107147 {
108148 ERROR_MSG (" ECDSA sign failed (0x%08X)" , ERR_get_error ());
@@ -145,11 +185,33 @@ bool OSSLECDSA::verify(PublicKey* publicKey, const ByteString& originalData,
145185 const ByteString& signature, const AsymMech::Type mechanism,
146186 const void * /* param = NULL */ , const size_t /* paramLen = 0 */ )
147187{
188+
189+ HashAlgo::Type hash = HashAlgo::Unknown;
190+
148191 if (mechanism != AsymMech::ECDSA)
149- {
150- ERROR_MSG (" Invalid mechanism supplied (%i)" , mechanism);
151- return false ;
152- }
192+ {
193+ switch (mechanism)
194+ {
195+ case AsymMech::ECDSA_SHA1:
196+ hash = HashAlgo::SHA1;
197+ break ;
198+ case AsymMech::ECDSA_SHA224:
199+ hash = HashAlgo::SHA224;
200+ break ;
201+ case AsymMech::ECDSA_SHA256:
202+ hash = HashAlgo::SHA256;
203+ break ;
204+ case AsymMech::ECDSA_SHA384:
205+ hash = HashAlgo::SHA384;
206+ break ;
207+ case AsymMech::ECDSA_SHA512:
208+ hash = HashAlgo::SHA512;
209+ break ;
210+ default :
211+ ERROR_MSG (" Invalid mechanism supplied (%i)" , mechanism);
212+ return false ;
213+ }
214+ }
153215
154216 // Check if the private key is the right type
155217 if (!publicKey->isOfType (OSSLECPublicKey::type))
@@ -213,7 +275,25 @@ bool OSSLECDSA::verify(PublicKey* publicKey, const ByteString& originalData,
213275 ECDSA_SIG_free (sig);
214276 return false ;
215277 }
216- int ret = ECDSA_do_verify (originalData.const_byte_str (), originalData.size (), sig, eckey);
278+
279+ // Pre-hash the data if necessary
280+ ByteString prepDataToSign;
281+ if (hash == HashAlgo::Unknown) {
282+ prepDataToSign = originalData;
283+ } else {
284+ HashAlgorithm* digest = CryptoFactory::i ()->getHashAlgorithm (hash);
285+
286+ if (!digest->hashInit ()
287+ || !digest->hashUpdate (originalData)
288+ || !digest->hashFinal (prepDataToSign))
289+ {
290+ delete digest;
291+ return false ;
292+ }
293+ delete digest;
294+ }
295+
296+ int ret = ECDSA_do_verify (prepDataToSign.const_byte_str (), prepDataToSign.size (), sig, eckey);
217297 if (ret != 1 )
218298 {
219299 if (ret < 0 )
0 commit comments