Disable GCM, CCM, XTS outside FIPS mode this will be updated
[openssl.git] / crypto / evp / bio_md.c
index a6d35d8bda3436659977eb58bea8dd574fdf8ae0..144fdfd56a0ec047d9ccd41bae96ba04ed3ea94e 100644 (file)
@@ -130,8 +130,8 @@ static int md_read(BIO *b, char *out, int outl)
                {
                if (ret > 0)
                        {
-                       EVP_DigestUpdate(ctx,(unsigned char *)out,
-                               (unsigned int)ret);
+                       if (EVP_DigestUpdate(ctx,(unsigned char *)out,
+                               (unsigned int)ret)<=0) return (-1);
                        }
                }
        BIO_clear_retry_flags(b);
@@ -153,12 +153,19 @@ static int md_write(BIO *b, const char *in, int inl)
                {
                if (ret > 0)
                        {
-                       EVP_DigestUpdate(ctx,(const unsigned char *)in,
-                               (unsigned int)ret);
+                       if (!EVP_DigestUpdate(ctx,(const unsigned char *)in,
+                               (unsigned int)ret))
+                               {
+                               BIO_clear_retry_flags(b);
+                               return 0;
+                               }
                        }
                }
-       BIO_clear_retry_flags(b);
-       BIO_copy_next_retry(b);
+       if(b->next_bio != NULL)
+               {
+               BIO_clear_retry_flags(b);
+               BIO_copy_next_retry(b);
+               }
        return(ret);
        }
 
@@ -196,6 +203,12 @@ static long md_ctrl(BIO *b, int cmd, long num, void *ptr)
                *pctx=ctx;
                b->init = 1;
                break;
+       case BIO_C_SET_MD_CTX:
+               if (b->init)
+                       b->ptr=ptr;
+               else
+                       ret=0;
+               break;
        case BIO_C_DO_STATE_MACHINE:
                BIO_clear_retry_flags(b);
                ret=BIO_ctrl(b->next_bio,cmd,num,ptr);
@@ -211,7 +224,8 @@ static long md_ctrl(BIO *b, int cmd, long num, void *ptr)
        case BIO_CTRL_DUP:
                dbio=ptr;
                dctx=dbio->ptr;
-               EVP_MD_CTX_copy_ex(dctx,ctx);
+               if (!EVP_MD_CTX_copy_ex(dctx,ctx))
+                       return 0;
                b->init=1;
                break;
        default:
@@ -244,7 +258,9 @@ static int md_gets(BIO *bp, char *buf, int size)
        ctx=bp->ptr;
        if (size < ctx->digest->md_size)
                return(0);
-       EVP_DigestFinal_ex(ctx,(unsigned char *)buf,&ret);
+       if (EVP_DigestFinal_ex(ctx,(unsigned char *)buf,&ret)<=0) 
+               return -1;
+               
        return((int)ret);
        }