]> granicus.if.org Git - imagemagick/blobdiff - MagickCore/signature.c
...
[imagemagick] / MagickCore / signature.c
index 184c2c4f11c72fddedbcb07d3ff0bac13ff32db5..eb284e344a53cdeee84252eb4ce8a3b6be98913c 100644 (file)
 %         MagickCore Methods to Compute a Message Digest for an Image         %
 %                                                                             %
 %                             Software Design                                 %
-%                               John Cristy                                   %
+%                                  Cristy                                     %
 %                              December 1992                                  %
 %                                                                             %
 %                                                                             %
-%  Copyright 1999-2013 ImageMagick Studio LLC, a non-profit organization      %
+%  Copyright 1999-2018 ImageMagick Studio LLC, a non-profit organization      %
 %  dedicated to making software imaging solutions freely available.           %
 %                                                                             %
 %  You may not use this file except in compliance with the License.  You may  %
 %  obtain a copy of the License at                                            %
 %                                                                             %
-%    http://www.imagemagick.org/script/license.php                            %
+%    https://imagemagick.org/script/license.php                               %
 %                                                                             %
 %  Unless required by applicable law or agreed to in writing, software        %
 %  distributed under the License is distributed on an "AS IS" BASIS,          %
@@ -46,6 +46,7 @@
 #include "MagickCore/property.h"
 #include "MagickCore/image.h"
 #include "MagickCore/memory_.h"
+#include "MagickCore/memory-private.h"
 #include "MagickCore/pixel-accessor.h"
 #include "MagickCore/quantum.h"
 #include "MagickCore/quantum-private.h"
@@ -77,7 +78,7 @@ struct _SignatureInfo
     high_order;
 
   size_t
-    offset;
+    extent;
 
   MagickBooleanType
     lsb_first;
@@ -118,13 +119,12 @@ MagickPrivate SignatureInfo *AcquireSignatureInfo(void)
   SignatureInfo
     *signature_info;
 
-  unsigned int
+  unsigned long
     lsb_first;
 
-  signature_info=(SignatureInfo *) AcquireMagickMemory(sizeof(*signature_info));
-  if (signature_info == (SignatureInfo *) NULL)
-    ThrowFatalException(ResourceLimitFatalError,"MemoryAllocationFailed");
-  (void) ResetMagickMemory(signature_info,0,sizeof(*signature_info));
+  signature_info=(SignatureInfo *) AcquireCriticalMemory(
+    sizeof(*signature_info));
+  (void) memset(signature_info,0,sizeof(*signature_info));
   signature_info->digestsize=SignatureDigestsize;
   signature_info->blocksize=SignatureBlocksize;
   signature_info->digest=AcquireStringInfo(SignatureDigestsize);
@@ -133,11 +133,13 @@ MagickPrivate SignatureInfo *AcquireSignatureInfo(void)
     SignatureBlocksize,sizeof(*signature_info->accumulator));
   if (signature_info->accumulator == (unsigned int *) NULL)
     ThrowFatalException(ResourceLimitFatalError,"MemoryAllocationFailed");
+  (void) memset(signature_info->accumulator,0,SignatureBlocksize*
+    sizeof(*signature_info->accumulator));
   lsb_first=1;
   signature_info->lsb_first=(int) (*(char *) &lsb_first) == 1 ? MagickTrue :
     MagickFalse;
-  signature_info->timestamp=(ssize_t) time(0);
-  signature_info->signature=MagickSignature;
+  signature_info->timestamp=(ssize_t) time((time_t *) NULL);
+  signature_info->signature=MagickCoreSignature;
   InitializeSignature(signature_info);
   return(signature_info);
 }
@@ -169,7 +171,7 @@ MagickPrivate SignatureInfo *DestroySignatureInfo(SignatureInfo *signature_info)
 {
   (void) LogMagickEvent(TraceEvent,GetMagickModule(),"...");
   assert(signature_info != (SignatureInfo *) NULL);
-  assert(signature_info->signature == MagickSignature);
+  assert(signature_info->signature == MagickCoreSignature);
   if (signature_info->accumulator != (unsigned int *) NULL)
     signature_info->accumulator=(unsigned int *) RelinquishMagickMemory(
       signature_info->accumulator);
@@ -177,7 +179,7 @@ MagickPrivate SignatureInfo *DestroySignatureInfo(SignatureInfo *signature_info)
     signature_info->message=DestroyStringInfo(signature_info->message);
   if (signature_info->digest != (StringInfo *) NULL)
     signature_info->digest=DestroyStringInfo(signature_info->digest);
-  signature_info->signature=(~MagickSignature);
+  signature_info->signature=(~MagickCoreSignature);
   signature_info=(SignatureInfo *) RelinquishMagickMemory(signature_info);
   return(signature_info);
 }
@@ -215,11 +217,13 @@ MagickPrivate void FinalizeSignature(SignatureInfo *signature_info)
   register unsigned int
     *p;
 
+  size_t
+    extent;
+
   unsigned char
     *datum;
 
   unsigned int
-    count,
     high_order,
     low_order;
 
@@ -228,21 +232,21 @@ MagickPrivate void FinalizeSignature(SignatureInfo *signature_info)
   */
   (void) LogMagickEvent(TraceEvent,GetMagickModule(),"...");
   assert(signature_info != (SignatureInfo *) NULL);
-  assert(signature_info->signature == MagickSignature);
+  assert(signature_info->signature == MagickCoreSignature);
   low_order=signature_info->low_order;
   high_order=signature_info->high_order;
-  count=((low_order >> 3) & 0x3f);
+  extent=((low_order >> 3) & 0x3f);
   datum=GetStringInfoDatum(signature_info->message);
-  datum[count++]=(unsigned char) 0x80;
-  if (count <= (unsigned int) (GetStringInfoLength(signature_info->message)-8))
-    (void) ResetMagickMemory(datum+count,0,GetStringInfoLength(
-      signature_info->message)-8-count);
+  datum[extent++]=(unsigned char) 0x80;
+  if (extent <= (unsigned int) (GetStringInfoLength(signature_info->message)-8))
+    (void) memset(datum+extent,0,GetStringInfoLength(
+      signature_info->message)-8-extent);
   else
     {
-      (void) ResetMagickMemory(datum+count,0,GetStringInfoLength(
-        signature_info->message)-count);
+      (void) memset(datum+extent,0,GetStringInfoLength(
+        signature_info->message)-extent);
       TransformSignature(signature_info);
-      (void) ResetMagickMemory(datum,0,GetStringInfoLength(
+      (void) memset(datum,0,GetStringInfoLength(
         signature_info->message)-8);
     }
   datum[56]=(unsigned char) (high_order >> 24);
@@ -264,12 +268,6 @@ MagickPrivate void FinalizeSignature(SignatureInfo *signature_info)
     *q++=(unsigned char) (*p & 0xff);
     p++;
   }
-  /*
-    Reset working registers.
-  */
-  count=0;
-  high_order=0;
-  low_order=0;
 }
 \f
 /*
@@ -299,7 +297,7 @@ MagickPrivate unsigned int GetSignatureBlocksize(
 {
   (void) LogMagickEvent(TraceEvent,GetMagickModule(),"...");
   assert(signature_info != (SignatureInfo *) NULL);
-  assert(signature_info->signature == MagickSignature);
+  assert(signature_info->signature == MagickCoreSignature);
   return(signature_info->blocksize);
 }
 \f
@@ -330,7 +328,7 @@ MagickPrivate const StringInfo *GetSignatureDigest(
 {
   (void) LogMagickEvent(TraceEvent,GetMagickModule(),"...");
   assert(signature_info != (SignatureInfo *) NULL);
-  assert(signature_info->signature == MagickSignature);
+  assert(signature_info->signature == MagickCoreSignature);
   return(signature_info->digest);
 }
 \f
@@ -361,7 +359,7 @@ MagickPrivate unsigned int GetSignatureDigestsize(
 {
   (void) LogMagickEvent(TraceEvent,GetMagickModule(),"...");
   assert(signature_info != (SignatureInfo *) NULL);
-  assert(signature_info->signature == MagickSignature);
+  assert(signature_info->signature == MagickCoreSignature);
   return(signature_info->digestsize);
 }
 \f
@@ -391,7 +389,7 @@ MagickPrivate void InitializeSignature(SignatureInfo *signature_info)
 {
   (void) LogMagickEvent(TraceEvent,GetMagickModule(),"...");
   assert(signature_info != (SignatureInfo *) NULL);
-  assert(signature_info->signature == MagickSignature);
+  assert(signature_info->signature == MagickCoreSignature);
   signature_info->accumulator[0]=0x6a09e667U;
   signature_info->accumulator[1]=0xbb67ae85U;
   signature_info->accumulator[2]=0x3c6ef372U;
@@ -402,7 +400,7 @@ MagickPrivate void InitializeSignature(SignatureInfo *signature_info)
   signature_info->accumulator[7]=0x5be0cd19U;
   signature_info->low_order=0;
   signature_info->high_order=0;
-  signature_info->offset=0;
+  signature_info->extent=0;
 }
 \f
 /*
@@ -437,7 +435,7 @@ MagickPrivate void SetSignatureDigest(SignatureInfo *signature_info,
     Set the signature accumulator.
   */
   assert(signature_info != (SignatureInfo *) NULL);
-  assert(signature_info->signature == MagickSignature);
+  assert(signature_info->signature == MagickCoreSignature);
   SetStringInfo(signature_info->digest,digest);
 }
 \f
@@ -499,14 +497,13 @@ MagickExport MagickBooleanType SignatureImage(Image *image,
     Compute image digital signature.
   */
   assert(image != (Image *) NULL);
-  assert(image->signature == MagickSignature);
+  assert(image->signature == MagickCoreSignature);
   if (image->debug != MagickFalse)
     (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename);
   signature_info=AcquireSignatureInfo();
-  signature=AcquireStringInfo(image->columns*GetPixelChannels(image)*
+  signature=AcquireStringInfo(GetPixelChannels(image)*image->columns*
     sizeof(pixel));
-  pixels=GetStringInfoDatum(signature);
-  image_view=AcquireVirtualCacheView(image);
+  image_view=AcquireVirtualCacheView(image,exception);
   for (y=0; y < (ssize_t) image->rows; y++)
   {
     register ssize_t
@@ -518,35 +515,36 @@ MagickExport MagickBooleanType SignatureImage(Image *image,
     p=GetCacheViewVirtualPixels(image_view,0,y,image->columns,1,exception);
     if (p == (const Quantum *) NULL)
       break;
+    SetStringInfoLength(signature,GetPixelChannels(image)*image->columns*
+      sizeof(pixel));
+    pixels=GetStringInfoDatum(signature);
     q=pixels;
     for (x=0; x < (ssize_t) image->columns; x++)
     {
       register ssize_t
         i;
 
-      if (GetPixelMask(image,p) != 0)
+      if (GetPixelReadMask(image,p) <= (QuantumRange/2))
         {
           p+=GetPixelChannels(image);
           continue;
         }
       for (i=0; i < (ssize_t) GetPixelChannels(image); i++)
       {
-        PixelChannel
-          channel;
-
-        PixelTrait
-          traits;
-
         register ssize_t
           j;
 
-        channel=GetPixelChannelChannel(image,i);
-        traits=GetPixelChannelTraits(image,channel);
+        PixelChannel channel = GetPixelChannelChannel(image,i);
+        PixelTrait traits = GetPixelChannelTraits(image,channel);
         if (traits == UndefinedPixelTrait)
           continue;
         pixel=QuantumScale*p[i];
-        for (j=0; j < (ssize_t) sizeof(pixel); j++)
-          *q++=(unsigned char) (&pixel)[j];
+        if (signature_info->lsb_first == MagickFalse)
+          for (j=(ssize_t) sizeof(pixel)-1; j >= 0; j--)
+            *q++=(unsigned char) ((unsigned char *) &pixel)[j];
+        else
+          for (j=0; j < (ssize_t) sizeof(pixel); j++)
+            *q++=(unsigned char) ((unsigned char *) &pixel)[j];
       }
       p+=GetPixelChannels(image);
     }
@@ -626,7 +624,7 @@ static void TransformSignature(SignatureInfo *signature_info)
   ssize_t
     j;
 
-  static unsigned int
+  static const unsigned int
     K[64] =
     {
       0x428a2f98U, 0x71374491U, 0xb5c0fbcfU, 0xe9b5dba5U, 0x3956c25bU,
@@ -663,7 +661,9 @@ static void TransformSignature(SignatureInfo *signature_info)
   p=GetStringInfoDatum(signature_info->message);
   if (signature_info->lsb_first == MagickFalse)
     {
+DisableMSCWarning(4127)
       if (sizeof(unsigned int) <= 4)
+RestoreMSCWarning
         for (i=0; i < 16; i++)
         {
           T=(*((unsigned int *) p));
@@ -680,7 +680,9 @@ static void TransformSignature(SignatureInfo *signature_info)
         }
     }
   else
+DisableMSCWarning(4127)
     if (sizeof(unsigned int) <= 4)
+RestoreMSCWarning
       for (i=0; i < 16; i++)
       {
         T=(*((unsigned int *) p));
@@ -750,7 +752,7 @@ static void TransformSignature(SignatureInfo *signature_info)
   T=0;
   T1=0;
   T2=0;
-  (void) ResetMagickMemory(W,0,sizeof(W));
+  (void) memset(W,0,sizeof(W));
 }
 \f
 /*
@@ -796,26 +798,25 @@ MagickPrivate void UpdateSignature(SignatureInfo *signature_info,
     Update the Signature accumulator.
   */
   assert(signature_info != (SignatureInfo *) NULL);
-  assert(signature_info->signature == MagickSignature);
+  assert(signature_info->signature == MagickCoreSignature);
   n=GetStringInfoLength(message);
   length=Trunc32((unsigned int) (signature_info->low_order+(n << 3)));
   if (length < signature_info->low_order)
     signature_info->high_order++;
   signature_info->low_order=length;
-  signature_info->high_order+=(unsigned int) (n >> 29);
+  signature_info->high_order+=(unsigned int) n >> 29;
   p=GetStringInfoDatum(message);
-  if (signature_info->offset != 0)
+  if (signature_info->extent != 0)
     {
-      i=GetStringInfoLength(signature_info->message)-signature_info->offset;
+      i=GetStringInfoLength(signature_info->message)-signature_info->extent;
       if (i > n)
         i=n;
-      (void) CopyMagickMemory(GetStringInfoDatum(signature_info->message)+
-        signature_info->offset,p,i);
+      (void) memcpy(GetStringInfoDatum(signature_info->message)+
+        signature_info->extent,p,i);
       n-=i;
       p+=i;
-      signature_info->offset+=i;
-      if (signature_info->offset !=
-          GetStringInfoLength(signature_info->message))
+      signature_info->extent+=i;
+      if (signature_info->extent != GetStringInfoLength(signature_info->message))
         return;
       TransformSignature(signature_info);
     }
@@ -826,12 +827,6 @@ MagickPrivate void UpdateSignature(SignatureInfo *signature_info,
     n-=GetStringInfoLength(signature_info->message);
     TransformSignature(signature_info);
   }
-  (void) CopyMagickMemory(GetStringInfoDatum(signature_info->message),p,n);
-  signature_info->offset=n;
-  /*
-    Reset working registers.
-  */
-  i=0;
-  n=0;
-  length=0;
+  (void) memcpy(GetStringInfoDatum(signature_info->message),p,n);
+  signature_info->extent=n;
 }