| Index: openssl/crypto/rsa/rsa_sign.c
|
| ===================================================================
|
| --- openssl/crypto/rsa/rsa_sign.c (revision 105093)
|
| +++ openssl/crypto/rsa/rsa_sign.c (working copy)
|
| @@ -62,6 +62,7 @@
|
| #include <openssl/rsa.h>
|
| #include <openssl/objects.h>
|
| #include <openssl/x509.h>
|
| +#include "rsa_locl.h"
|
|
|
| /* Size of an SSL signature: MD5+SHA1 */
|
| #define SSL_SIG_LENGTH 36
|
| @@ -90,14 +91,6 @@
|
| i = SSL_SIG_LENGTH;
|
| s = m;
|
| } else {
|
| - /* NB: in FIPS mode block anything that isn't a TLS signature */
|
| -#ifdef OPENSSL_FIPS
|
| - if(FIPS_mode() && !(rsa->flags & RSA_FLAG_NON_FIPS_ALLOW))
|
| - {
|
| - RSAerr(RSA_F_RSA_SIGN, RSA_R_OPERATION_NOT_ALLOWED_IN_FIPS_MODE);
|
| - return 0;
|
| - }
|
| -#endif
|
| sig.algor= &algor;
|
| sig.algor->algorithm=OBJ_nid2obj(type);
|
| if (sig.algor->algorithm == NULL)
|
| @@ -137,12 +130,7 @@
|
| i2d_X509_SIG(&sig,&p);
|
| s=tmps;
|
| }
|
| -#ifdef OPENSSL_FIPS
|
| - /* Bypass algorithm blocking: this is allowed if we get this far */
|
| - i=rsa->meth->rsa_priv_enc(i,s,sigret,rsa,RSA_PKCS1_PADDING);
|
| -#else
|
| i=RSA_private_encrypt(i,s,sigret,rsa,RSA_PKCS1_PADDING);
|
| -#endif
|
| if (i <= 0)
|
| ret=0;
|
| else
|
| @@ -155,8 +143,11 @@
|
| return(ret);
|
| }
|
|
|
| -int RSA_verify(int dtype, const unsigned char *m, unsigned int m_len,
|
| - unsigned char *sigbuf, unsigned int siglen, RSA *rsa)
|
| +int int_rsa_verify(int dtype, const unsigned char *m,
|
| + unsigned int m_len,
|
| + unsigned char *rm, size_t *prm_len,
|
| + const unsigned char *sigbuf, size_t siglen,
|
| + RSA *rsa)
|
| {
|
| int i,ret=0,sigtype;
|
| unsigned char *s;
|
| @@ -164,49 +155,38 @@
|
|
|
| if (siglen != (unsigned int)RSA_size(rsa))
|
| {
|
| - RSAerr(RSA_F_RSA_VERIFY,RSA_R_WRONG_SIGNATURE_LENGTH);
|
| + RSAerr(RSA_F_INT_RSA_VERIFY,RSA_R_WRONG_SIGNATURE_LENGTH);
|
| return(0);
|
| }
|
|
|
| - if((rsa->flags & RSA_FLAG_SIGN_VER) && rsa->meth->rsa_verify)
|
| + if((dtype == NID_md5_sha1) && rm)
|
| {
|
| - return rsa->meth->rsa_verify(dtype, m, m_len,
|
| - sigbuf, siglen, rsa);
|
| + i = RSA_public_decrypt((int)siglen,
|
| + sigbuf,rm,rsa,RSA_PKCS1_PADDING);
|
| + if (i <= 0)
|
| + return 0;
|
| + *prm_len = i;
|
| + return 1;
|
| }
|
|
|
| s=(unsigned char *)OPENSSL_malloc((unsigned int)siglen);
|
| if (s == NULL)
|
| {
|
| - RSAerr(RSA_F_RSA_VERIFY,ERR_R_MALLOC_FAILURE);
|
| + RSAerr(RSA_F_INT_RSA_VERIFY,ERR_R_MALLOC_FAILURE);
|
| goto err;
|
| }
|
| - if(dtype == NID_md5_sha1)
|
| - {
|
| - if (m_len != SSL_SIG_LENGTH)
|
| - {
|
| - RSAerr(RSA_F_RSA_VERIFY,RSA_R_INVALID_MESSAGE_LENGTH);
|
| + if((dtype == NID_md5_sha1) && (m_len != SSL_SIG_LENGTH) ) {
|
| + RSAerr(RSA_F_INT_RSA_VERIFY,RSA_R_INVALID_MESSAGE_LENGTH);
|
| goto err;
|
| - }
|
| - }
|
| - /* NB: in FIPS mode block anything that isn't a TLS signature */
|
| -#ifdef OPENSSL_FIPS
|
| - else if(FIPS_mode() && !(rsa->flags & RSA_FLAG_NON_FIPS_ALLOW))
|
| - {
|
| - RSAerr(RSA_F_RSA_VERIFY, RSA_R_OPERATION_NOT_ALLOWED_IN_FIPS_MODE);
|
| - return 0;
|
| - }
|
| - /* Bypass algorithm blocking: this is allowed */
|
| - i=rsa->meth->rsa_pub_dec((int)siglen,sigbuf,s,rsa,RSA_PKCS1_PADDING);
|
| -#else
|
| + }
|
| i=RSA_public_decrypt((int)siglen,sigbuf,s,rsa,RSA_PKCS1_PADDING);
|
| -#endif
|
|
|
| if (i <= 0) goto err;
|
|
|
| /* Special case: SSL signature */
|
| if(dtype == NID_md5_sha1) {
|
| if((i != SSL_SIG_LENGTH) || memcmp(s, m, SSL_SIG_LENGTH))
|
| - RSAerr(RSA_F_RSA_VERIFY,RSA_R_BAD_SIGNATURE);
|
| + RSAerr(RSA_F_INT_RSA_VERIFY,RSA_R_BAD_SIGNATURE);
|
| else ret = 1;
|
| } else {
|
| const unsigned char *p=s;
|
| @@ -217,7 +197,7 @@
|
| /* Excess data can be used to create forgeries */
|
| if(p != s+i)
|
| {
|
| - RSAerr(RSA_F_RSA_VERIFY,RSA_R_BAD_SIGNATURE);
|
| + RSAerr(RSA_F_INT_RSA_VERIFY,RSA_R_BAD_SIGNATURE);
|
| goto err;
|
| }
|
|
|
| @@ -226,7 +206,7 @@
|
| if(sig->algor->parameter
|
| && ASN1_TYPE_get(sig->algor->parameter) != V_ASN1_NULL)
|
| {
|
| - RSAerr(RSA_F_RSA_VERIFY,RSA_R_BAD_SIGNATURE);
|
| + RSAerr(RSA_F_INT_RSA_VERIFY,RSA_R_BAD_SIGNATURE);
|
| goto err;
|
| }
|
|
|
| @@ -252,15 +232,30 @@
|
| }
|
| else
|
| {
|
| - RSAerr(RSA_F_RSA_VERIFY,
|
| + RSAerr(RSA_F_INT_RSA_VERIFY,
|
| RSA_R_ALGORITHM_MISMATCH);
|
| goto err;
|
| }
|
| }
|
| - if ( ((unsigned int)sig->digest->length != m_len) ||
|
| + if (rm)
|
| + {
|
| + const EVP_MD *md;
|
| + md = EVP_get_digestbynid(dtype);
|
| + if (md && (EVP_MD_size(md) != sig->digest->length))
|
| + RSAerr(RSA_F_INT_RSA_VERIFY,
|
| + RSA_R_INVALID_DIGEST_LENGTH);
|
| + else
|
| + {
|
| + memcpy(rm, sig->digest->data,
|
| + sig->digest->length);
|
| + *prm_len = sig->digest->length;
|
| + ret = 1;
|
| + }
|
| + }
|
| + else if (((unsigned int)sig->digest->length != m_len) ||
|
| (memcmp(m,sig->digest->data,m_len) != 0))
|
| {
|
| - RSAerr(RSA_F_RSA_VERIFY,RSA_R_BAD_SIGNATURE);
|
| + RSAerr(RSA_F_INT_RSA_VERIFY,RSA_R_BAD_SIGNATURE);
|
| }
|
| else
|
| ret=1;
|
| @@ -275,3 +270,16 @@
|
| return(ret);
|
| }
|
|
|
| +int RSA_verify(int dtype, const unsigned char *m, unsigned int m_len,
|
| + const unsigned char *sigbuf, unsigned int siglen,
|
| + RSA *rsa)
|
| + {
|
| +
|
| + if((rsa->flags & RSA_FLAG_SIGN_VER) && rsa->meth->rsa_verify)
|
| + {
|
| + return rsa->meth->rsa_verify(dtype, m, m_len,
|
| + sigbuf, siglen, rsa);
|
| + }
|
| +
|
| + return int_rsa_verify(dtype, m, m_len, NULL, NULL, sigbuf, siglen, rsa);
|
| + }
|
|
|