@@ -170,17 +170,21 @@ int EVP_PBE_scrypt(const char *pass, size_t passlen,
170170 if (r == 0 || p == 0 || N < 2 || (N & (N - 1 )))
171171 return 0 ;
172172 /* Check p * r < SCRYPT_PR_MAX avoiding overflow */
173- if (p > SCRYPT_PR_MAX / r )
173+ if (p > SCRYPT_PR_MAX / r ) {
174+ EVPerr (EVP_F_EVP_PBE_SCRYPT , EVP_R_MEMORY_LIMIT_EXCEEDED );
174175 return 0 ;
176+ }
175177
176178 /*
177179 * Need to check N: if 2^(128 * r / 8) overflows limit this is
178180 * automatically satisfied since N <= UINT64_MAX.
179181 */
180182
181183 if (16 * r <= LOG2_UINT64_MAX ) {
182- if (N >= (((uint64_t )1 ) << (16 * r )))
184+ if (N >= (((uint64_t )1 ) << (16 * r ))) {
185+ EVPerr (EVP_F_EVP_PBE_SCRYPT , EVP_R_MEMORY_LIMIT_EXCEEDED );
183186 return 0 ;
187+ }
184188 }
185189
186190 /* Memory checks: check total allocated buffer size fits in uint64_t */
@@ -205,13 +209,17 @@ int EVP_PBE_scrypt(const char *pass, size_t passlen,
205209 * This is combined size V, X and T (section 4)
206210 */
207211 i = UINT64_MAX / (32 * sizeof (uint32_t ));
208- if (N + 2 > i / r )
212+ if (N + 2 > i / r ) {
213+ EVPerr (EVP_F_EVP_PBE_SCRYPT , EVP_R_MEMORY_LIMIT_EXCEEDED );
209214 return 0 ;
215+ }
210216 Vlen = 32 * r * (N + 2 ) * sizeof (uint32_t );
211217
212218 /* check total allocated size fits in uint64_t */
213- if (Blen > UINT64_MAX - Vlen )
219+ if (Blen > UINT64_MAX - Vlen ) {
220+ EVPerr (EVP_F_EVP_PBE_SCRYPT , EVP_R_MEMORY_LIMIT_EXCEEDED );
214221 return 0 ;
222+ }
215223
216224 if (maxmem == 0 )
217225 maxmem = SCRYPT_MAX_MEM ;
@@ -230,8 +238,10 @@ int EVP_PBE_scrypt(const char *pass, size_t passlen,
230238 return 1 ;
231239
232240 B = OPENSSL_malloc ((size_t )(Blen + Vlen ));
233- if (B == NULL )
241+ if (B == NULL ) {
242+ EVPerr (EVP_F_EVP_PBE_SCRYPT , ERR_R_MALLOC_FAILURE );
234243 return 0 ;
244+ }
235245 X = (uint32_t * )(B + Blen );
236246 T = X + 32 * r ;
237247 V = T + 32 * r ;
@@ -247,6 +257,9 @@ int EVP_PBE_scrypt(const char *pass, size_t passlen,
247257 goto err ;
248258 rv = 1 ;
249259 err :
260+ if (rv == 0 )
261+ EVPerr (EVP_F_EVP_PBE_SCRYPT , EVP_R_PBKDF2_ERROR );
262+
250263 OPENSSL_clear_free (B , (size_t )(Blen + Vlen ));
251264 return rv ;
252265}
0 commit comments