components/openssl/openssl-1.0.1-fips-140/patches/36_evp_leak.patch
branchs11u2-sru
changeset 3624 70b1e516a3e9
parent 3402 110b254c69b8
child 4002 95b8f35fcdd5
equal deleted inserted replaced
3619:639868f63ef4 3624:70b1e516a3e9
    55 +		}
    55 +		}
    56 +
    56 +
    57  	return ret;
    57  	return ret;
    58  	}
    58  	}
    59  
    59  
    60 @@ -502,6 +515,7 @@
    60 @@ -501,6 +501,7 @@
    61  int EVP_DecryptFinal_ex(EVP_CIPHER_CTX *ctx, unsigned char *out, int *outl)
    61  int EVP_DecryptFinal_ex(EVP_CIPHER_CTX *ctx, unsigned char *out, int *outl)
    62  	{
    62  	{
    63  	unsigned int i, b;
    63  	int i,n;
    64 +	int err = 1;
    64 +	int err = 1;
    65          unsigned char pad, padding_good;
    65  	unsigned int b;
    66  	*outl=0;
    66  	*outl=0;
    67  
    67  
    68 @@ -509,10 +522,14 @@
    68 @@ -508,10 +509,14 @@
    69  		{
    69  		{
    70  		int ret = M_do_cipher(ctx, out, NULL, 0);
    70  		i = M_do_cipher(ctx, out, NULL, 0);
    71  		if (ret < 0)
    71  		if (i < 0)
    72 -			return 0;
    72 -			return 0;
    73 +			{
    73 +			{
    74 +			err = 0;
    74 +			err = 0;
    75 +			goto cleanup;
    75 +			goto cleanup;
    76 +			}
    76 +			}
    77  		else
    77  		else
    78  			*outl = ret;
    78  			*outl = i;
    79 -		return 1;
    79 -		return 1;
    80 +		err = 1;
    80 +		err = 1;
    81 +		goto cleanup;
    81 +		goto cleanup;
    82  		}
    82  		}
    83  
    83  
    84  	b=(unsigned int)(ctx->cipher->block_size);
    84  	b=ctx->cipher->block_size;
    85 @@ -521,10 +538,12 @@
    85 @@ -520,10 +525,12 @@
    86  		if(ctx->buf_len)
    86  		if(ctx->buf_len)
    87  			{
    87  			{
    88  			EVPerr(EVP_F_EVP_DECRYPTFINAL_EX,EVP_R_DATA_NOT_MULTIPLE_OF_BLOCK_LENGTH);
    88  			EVPerr(EVP_F_EVP_DECRYPTFINAL_EX,EVP_R_DATA_NOT_MULTIPLE_OF_BLOCK_LENGTH);
    89 -			return 0;
    89 -			return 0;
    90 +			err = 0;
    90 +			err = 0;
    95 +		err = 1;
    95 +		err = 1;
    96 +		goto cleanup;
    96 +		goto cleanup;
    97  		}
    97  		}
    98  	if (b > 1)
    98  	if (b > 1)
    99  		{
    99  		{
   100 @@ -531,7 +550,8 @@
   100 @@ -530,7 +537,8 @@
   101  		if (ctx->buf_len || !ctx->final_used)
   101  		if (ctx->buf_len || !ctx->final_used)
   102  			{
   102  			{
   103  			EVPerr(EVP_F_EVP_DECRYPTFINAL_EX,EVP_R_WRONG_FINAL_BLOCK_LENGTH);
   103  			EVPerr(EVP_F_EVP_DECRYPTFINAL_EX,EVP_R_WRONG_FINAL_BLOCK_LENGTH);
   104 -			return(0);
   104 -			return(0);
   105 +			err = 0;
   105 +			err = 0;
   106 +			goto cleanup;
   106 +			goto cleanup;
   107  			}
   107  			}
   108  		OPENSSL_assert(b <= sizeof ctx->final);
   108  		OPENSSL_assert(b <= sizeof ctx->final);
   109  		pad=ctx->final[b-1];
   109  
   110 @@ -555,13 +577,22 @@
   110 @@ -542,7 +550,8 @@
   111  			out[i] = ctx->final[i] & padding_good;
   111  		if (n == 0 || n > (int)b)
   112  		/* Safe cast: for a good padding, EVP_MAX_IV_LENGTH >= b >= pad */
   112  			{
   113  		*outl = padding_good & ((unsigned char)(b - pad));
   113  			EVPerr(EVP_F_EVP_DECRYPTFINAL_EX,EVP_R_BAD_DECRYPT);
   114 -		return padding_good & 1;
   114 -			return(0);
   115 +		err = padding_good & 1;
   115 +			err = 0;
   116 +		goto cleanup;
   116 +			goto cleanup;
       
   117  			}
       
   118  		for (i=0; i<n; i++)
       
   119  			{
       
   120 @@ -549,7 +558,8 @@
       
   121  			if (ctx->final[--b] != n)
       
   122  				{
       
   123  				EVPerr(EVP_F_EVP_DECRYPTFINAL_EX,EVP_R_BAD_DECRYPT);
       
   124 -				return(0);
       
   125 +				err = 0;
       
   126 +				goto cleanup;
       
   127  				}
       
   128  			}
       
   129  		n=ctx->cipher->block_size-n;
       
   130 @@ -559,7 +569,13 @@
   117  		}
   131  		}
   118  	else
   132  	else
   119  		{
   133  		*outl=0;
   120  		*outl = 0;
   134 -	return(1);
   121 -		return 1;
   135 +	err = 1;
   122 +		err = 1;
       
   123  		}
       
   124 +
       
   125 +cleanup:
   136 +cleanup:
   126 +	if (ctx->cipher->cleanup)
   137 +	if (ctx->cipher->cleanup)
   127 +		{
   138 +		{
   128 +		ctx->cipher->cleanup(ctx);
   139 +		ctx->cipher->cleanup(ctx);
   129 +		}
   140 +		}
   130 +
       
   131 +	return err;
   141 +	return err;
   132  	}
   142  	}
   133  
   143  
   134  void EVP_CIPHER_CTX_free(EVP_CIPHER_CTX *ctx)
   144  void EVP_CIPHER_CTX_free(EVP_CIPHER_CTX *ctx)