Currently, OpenSSL doesn't check the return code of EVP_DigestFinal_ex() in 
rsa_oaep.c. However, EVP_DigestFinal_ex can return an error, which leads to 
confusion for the caller of RSA Oaep. This patch makes it so we return an error 
code if something goes wrong. This compiles against 1.0.0d.

diff -ur ../openssl-1.0.0d/crypto/rsa/rsa_oaep.c src/crypto/rsa/rsa_oaep.c
--- ../openssl-1.0.0d/crypto/rsa/rsa_oaep.c 2009-06-26 16:14:11.000000000 -0700
+++ src/crypto/rsa/rsa_oaep.c 2011-03-25 11:23:40.000000000 -0700
@@ -188,7 +188,7 @@
  unsigned char cnt[4];
  EVP_MD_CTX c;
  unsigned char md[EVP_MAX_MD_SIZE];
- int mdlen;
+ int mdlen = 0, result = 0;

  EVP_MD_CTX_init(&c);
  mdlen = EVP_MD_size(dgst);
@@ -200,17 +200,17 @@
  cnt[1] = (unsigned char)((i >> 16) & 255);
  cnt[2] = (unsigned char)((i >> 8)) & 255;
  cnt[3] = (unsigned char)(i & 255);
- EVP_DigestInit_ex(&c,dgst, NULL);
- EVP_DigestUpdate(&c, seed, seedlen);
- EVP_DigestUpdate(&c, cnt, 4);
+ if (!EVP_DigestInit_ex(&c,dgst, NULL)) return -1;
+ if (!EVP_DigestUpdate(&c, seed, seedlen)) return -1;
+ if (!EVP_DigestUpdate(&c, cnt, 4)) return -1;
  if (outlen + mdlen <= len)
  {
- EVP_DigestFinal_ex(&c, mask + outlen, NULL);
+ if (!EVP_DigestFinal_ex(&c, mask + outlen, NULL)) return -1;
  outlen += mdlen;
  }
  else
  {
- EVP_DigestFinal_ex(&c, md, NULL);
+ if (!EVP_DigestFinal_ex(&c, md, NULL)) return -1;
  memcpy(mask + outlen, md, len - outlen);
  outlen = len;
  }

______________________________________________________________________
OpenSSL Project                                 http://www.openssl.org
Development Mailing List                       [email protected]
Automated List Manager                           [email protected]

Reply via email to