Home | History | Annotate | Download | only in MagickCore
      1 /*
      2 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
      3 %                                                                             %
      4 %                                                                             %
      5 %        SSSSS  IIIII   GGGG  N   N   AAA   TTTTT  U   U  RRRR   EEEEE        %
      6 %        SS       I    G      NN  N  A   A    T    U   U  R   R  E            %
      7 %         SSS     I    G  GG  N N N  AAAAA    T    U   U  RRRR   EEE          %
      8 %           SS    I    G   G  N  NN  A   A    T    U   U  R R    E            %
      9 %        SSSSS  IIIII   GGG   N   N  A   A    T     UUU   R  R   EEEEE        %
     10 %                                                                             %
     11 %                                                                             %
     12 %         MagickCore Methods to Compute a Message Digest for an Image         %
     13 %                                                                             %
     14 %                             Software Design                                 %
     15 %                                  Cristy                                     %
     16 %                              December 1992                                  %
     17 %                                                                             %
     18 %                                                                             %
     19 %  Copyright 1999-2016 ImageMagick Studio LLC, a non-profit organization      %
     20 %  dedicated to making software imaging solutions freely available.           %
     21 %                                                                             %
     22 %  You may not use this file except in compliance with the License.  You may  %
     23 %  obtain a copy of the License at                                            %
     24 %                                                                             %
     25 %    http://www.imagemagick.org/script/license.php                            %
     26 %                                                                             %
     27 %  Unless required by applicable law or agreed to in writing, software        %
     28 %  distributed under the License is distributed on an "AS IS" BASIS,          %
     29 %  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.   %
     30 %  See the License for the specific language governing permissions and        %
     31 %  limitations under the License.                                             %
     32 %                                                                             %
     33 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
     34 %
     35 %
     36 %
     37 */
     38 
     39 /*
     41   Include declarations.
     42 */
     43 #include "MagickCore/studio.h"
     44 #include "MagickCore/cache.h"
     45 #include "MagickCore/exception.h"
     46 #include "MagickCore/exception-private.h"
     47 #include "MagickCore/property.h"
     48 #include "MagickCore/image.h"
     49 #include "MagickCore/memory_.h"
     50 #include "MagickCore/pixel-accessor.h"
     51 #include "MagickCore/quantum.h"
     52 #include "MagickCore/quantum-private.h"
     53 #include "MagickCore/signature.h"
     54 #include "MagickCore/signature-private.h"
     55 #include "MagickCore/string_.h"
     56 /*
     57   Define declarations.
     58 */
     59 #define SignatureBlocksize  64
     60 #define SignatureDigestsize  32
     61 
     62 /*
     64   Typedef declarations.
     65 */
     66 struct _SignatureInfo
     67 {
     68   unsigned int
     69     digestsize,
     70     blocksize;
     71 
     72   StringInfo
     73     *digest,
     74     *message;
     75 
     76   unsigned int
     77     *accumulator,
     78     low_order,
     79     high_order;
     80 
     81   size_t
     82     offset;
     83 
     84   MagickBooleanType
     85     lsb_first;
     86 
     87   ssize_t
     88     timestamp;
     89 
     90   size_t
     91     signature;
     92 };
     93 
     94 /*
     96   Forward declarations.
     97 */
     98 static void
     99   TransformSignature(SignatureInfo *);
    100 
    101 /*
    103 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    104 %                                                                             %
    105 %                                                                             %
    106 %                                                                             %
    107 +   A c q u i r e S i g n a t u r e I n f o                                   %
    108 %                                                                             %
    109 %                                                                             %
    110 %                                                                             %
    111 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    112 %
    113 %  AcquireSignatureInfo() allocate the SignatureInfo structure.
    114 %
    115 %  The format of the AcquireSignatureInfo method is:
    116 %
    117 %      SignatureInfo *AcquireSignatureInfo(void)
    118 %
    119 */
    120 MagickPrivate SignatureInfo *AcquireSignatureInfo(void)
    121 {
    122   SignatureInfo
    123     *signature_info;
    124 
    125   unsigned long
    126     lsb_first;
    127 
    128   signature_info=(SignatureInfo *) AcquireMagickMemory(sizeof(*signature_info));
    129   if (signature_info == (SignatureInfo *) NULL)
    130     ThrowFatalException(ResourceLimitFatalError,"MemoryAllocationFailed");
    131   (void) ResetMagickMemory(signature_info,0,sizeof(*signature_info));
    132   signature_info->digestsize=SignatureDigestsize;
    133   signature_info->blocksize=SignatureBlocksize;
    134   signature_info->digest=AcquireStringInfo(SignatureDigestsize);
    135   signature_info->message=AcquireStringInfo(SignatureBlocksize);
    136   signature_info->accumulator=(unsigned int *) AcquireQuantumMemory(
    137     SignatureBlocksize,sizeof(*signature_info->accumulator));
    138   if (signature_info->accumulator == (unsigned int *) NULL)
    139     ThrowFatalException(ResourceLimitFatalError,"MemoryAllocationFailed");
    140   lsb_first=1;
    141   signature_info->lsb_first=(int) (*(char *) &lsb_first) == 1 ? MagickTrue :
    142     MagickFalse;
    143   signature_info->timestamp=(ssize_t) time(0);
    144   signature_info->signature=MagickCoreSignature;
    145   InitializeSignature(signature_info);
    146   return(signature_info);
    147 }
    148 
    149 /*
    151 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    152 %                                                                             %
    153 %                                                                             %
    154 %                                                                             %
    155 +   D e s t r o y S i g n a t u r e I n f o                                   %
    156 %                                                                             %
    157 %                                                                             %
    158 %                                                                             %
    159 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    160 %
    161 %  DestroySignatureInfo() zeros memory associated with the SignatureInfo
    162 %  structure.
    163 %
    164 %  The format of the DestroySignatureInfo method is:
    165 %
    166 %      SignatureInfo *DestroySignatureInfo(SignatureInfo *signature_info)
    167 %
    168 %  A description of each parameter follows:
    169 %
    170 %    o signature_info: the cipher signature_info.
    171 %
    172 */
    173 MagickPrivate SignatureInfo *DestroySignatureInfo(SignatureInfo *signature_info)
    174 {
    175   (void) LogMagickEvent(TraceEvent,GetMagickModule(),"...");
    176   assert(signature_info != (SignatureInfo *) NULL);
    177   assert(signature_info->signature == MagickCoreSignature);
    178   if (signature_info->accumulator != (unsigned int *) NULL)
    179     signature_info->accumulator=(unsigned int *) RelinquishMagickMemory(
    180       signature_info->accumulator);
    181   if (signature_info->message != (StringInfo *) NULL)
    182     signature_info->message=DestroyStringInfo(signature_info->message);
    183   if (signature_info->digest != (StringInfo *) NULL)
    184     signature_info->digest=DestroyStringInfo(signature_info->digest);
    185   signature_info->signature=(~MagickCoreSignature);
    186   signature_info=(SignatureInfo *) RelinquishMagickMemory(signature_info);
    187   return(signature_info);
    188 }
    189 
    190 /*
    192 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    193 %                                                                             %
    194 %                                                                             %
    195 %                                                                             %
    196 +   F i n a l i z e S i g n a t u r e                                         %
    197 %                                                                             %
    198 %                                                                             %
    199 %                                                                             %
    200 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    201 %
    202 %  FinalizeSignature() finalizes the Signature message accumulator computation.
    203 %
    204 %  The format of the FinalizeSignature method is:
    205 %
    206 %      FinalizeSignature(SignatureInfo *signature_info)
    207 %
    208 %  A description of each parameter follows:
    209 %
    210 %    o signature_info: the address of a structure of type SignatureInfo.
    211 %
    212 */
    213 MagickPrivate void FinalizeSignature(SignatureInfo *signature_info)
    214 {
    215   register ssize_t
    216     i;
    217 
    218   register unsigned char
    219     *q;
    220 
    221   register unsigned int
    222     *p;
    223 
    224   unsigned char
    225     *datum;
    226 
    227   unsigned int
    228     count,
    229     high_order,
    230     low_order;
    231 
    232   /*
    233     Add padding and return the message accumulator.
    234   */
    235   (void) LogMagickEvent(TraceEvent,GetMagickModule(),"...");
    236   assert(signature_info != (SignatureInfo *) NULL);
    237   assert(signature_info->signature == MagickCoreSignature);
    238   low_order=signature_info->low_order;
    239   high_order=signature_info->high_order;
    240   count=((low_order >> 3) & 0x3f);
    241   datum=GetStringInfoDatum(signature_info->message);
    242   datum[count++]=(unsigned char) 0x80;
    243   if (count <= (unsigned int) (GetStringInfoLength(signature_info->message)-8))
    244     (void) ResetMagickMemory(datum+count,0,GetStringInfoLength(
    245       signature_info->message)-8-count);
    246   else
    247     {
    248       (void) ResetMagickMemory(datum+count,0,GetStringInfoLength(
    249         signature_info->message)-count);
    250       TransformSignature(signature_info);
    251       (void) ResetMagickMemory(datum,0,GetStringInfoLength(
    252         signature_info->message)-8);
    253     }
    254   datum[56]=(unsigned char) (high_order >> 24);
    255   datum[57]=(unsigned char) (high_order >> 16);
    256   datum[58]=(unsigned char) (high_order >> 8);
    257   datum[59]=(unsigned char) high_order;
    258   datum[60]=(unsigned char) (low_order >> 24);
    259   datum[61]=(unsigned char) (low_order >> 16);
    260   datum[62]=(unsigned char) (low_order >> 8);
    261   datum[63]=(unsigned char) low_order;
    262   TransformSignature(signature_info);
    263   p=signature_info->accumulator;
    264   q=GetStringInfoDatum(signature_info->digest);
    265   for (i=0; i < (SignatureDigestsize/4); i++)
    266   {
    267     *q++=(unsigned char) ((*p >> 24) & 0xff);
    268     *q++=(unsigned char) ((*p >> 16) & 0xff);
    269     *q++=(unsigned char) ((*p >> 8) & 0xff);
    270     *q++=(unsigned char) (*p & 0xff);
    271     p++;
    272   }
    273 }
    274 
    275 /*
    277 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    278 %                                                                             %
    279 %                                                                             %
    280 %                                                                             %
    281 +   G e t S i g n a t u r e B l o c k s i z e                                 %
    282 %                                                                             %
    283 %                                                                             %
    284 %                                                                             %
    285 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    286 %
    287 %  GetSignatureBlocksize() returns the Signature blocksize.
    288 %
    289 %  The format of the GetSignatureBlocksize method is:
    290 %
    291 %      unsigned int *GetSignatureBlocksize(const SignatureInfo *signature_info)
    292 %
    293 %  A description of each parameter follows:
    294 %
    295 %    o signature_info: the signature info.
    296 %
    297 */
    298 MagickPrivate unsigned int GetSignatureBlocksize(
    299   const SignatureInfo *signature_info)
    300 {
    301   (void) LogMagickEvent(TraceEvent,GetMagickModule(),"...");
    302   assert(signature_info != (SignatureInfo *) NULL);
    303   assert(signature_info->signature == MagickCoreSignature);
    304   return(signature_info->blocksize);
    305 }
    306 
    307 /*
    309 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    310 %                                                                             %
    311 %                                                                             %
    312 %                                                                             %
    313 +   G e t S i g n a t u r e D i g e s t                                       %
    314 %                                                                             %
    315 %                                                                             %
    316 %                                                                             %
    317 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    318 %
    319 %  GetSignatureDigest() returns the signature digest.
    320 %
    321 %  The format of the GetSignatureDigest method is:
    322 %
    323 %      const StringInfo *GetSignatureDigest(const SignatureInfo *signature_info)
    324 %
    325 %  A description of each parameter follows:
    326 %
    327 %    o signature_info: the signature info.
    328 %
    329 */
    330 MagickPrivate const StringInfo *GetSignatureDigest(
    331   const SignatureInfo *signature_info)
    332 {
    333   (void) LogMagickEvent(TraceEvent,GetMagickModule(),"...");
    334   assert(signature_info != (SignatureInfo *) NULL);
    335   assert(signature_info->signature == MagickCoreSignature);
    336   return(signature_info->digest);
    337 }
    338 
    339 /*
    341 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    342 %                                                                             %
    343 %                                                                             %
    344 %                                                                             %
    345 +   G e t S i g n a t u r e D i g e s t s i z e                               %
    346 %                                                                             %
    347 %                                                                             %
    348 %                                                                             %
    349 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    350 %
    351 %  GetSignatureDigestsize() returns the Signature digest size.
    352 %
    353 %  The format of the GetSignatureDigestsize method is:
    354 %
    355 %      unsigned int *GetSignatureDigestsize(const SignatureInfo *signature_info)
    356 %
    357 %  A description of each parameter follows:
    358 %
    359 %    o signature_info: the signature info.
    360 %
    361 */
    362 MagickPrivate unsigned int GetSignatureDigestsize(
    363   const SignatureInfo *signature_info)
    364 {
    365   (void) LogMagickEvent(TraceEvent,GetMagickModule(),"...");
    366   assert(signature_info != (SignatureInfo *) NULL);
    367   assert(signature_info->signature == MagickCoreSignature);
    368   return(signature_info->digestsize);
    369 }
    370 
    371 /*
    373 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    374 %                                                                             %
    375 %                                                                             %
    376 %                                                                             %
    377 +   I n i t i a l i z e S i g n a t u r e                                     %
    378 %                                                                             %
    379 %                                                                             %
    380 %                                                                             %
    381 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    382 %
    383 %  InitializeSignature() initializes the Signature accumulator.
    384 %
    385 %  The format of the DestroySignatureInfo method is:
    386 %
    387 %      void InitializeSignatureInfo(SignatureInfo *signature_info)
    388 %
    389 %  A description of each parameter follows:
    390 %
    391 %    o signature_info: the cipher signature_info.
    392 %
    393 */
    394 MagickPrivate void InitializeSignature(SignatureInfo *signature_info)
    395 {
    396   (void) LogMagickEvent(TraceEvent,GetMagickModule(),"...");
    397   assert(signature_info != (SignatureInfo *) NULL);
    398   assert(signature_info->signature == MagickCoreSignature);
    399   signature_info->accumulator[0]=0x6a09e667U;
    400   signature_info->accumulator[1]=0xbb67ae85U;
    401   signature_info->accumulator[2]=0x3c6ef372U;
    402   signature_info->accumulator[3]=0xa54ff53aU;
    403   signature_info->accumulator[4]=0x510e527fU;
    404   signature_info->accumulator[5]=0x9b05688cU;
    405   signature_info->accumulator[6]=0x1f83d9abU;
    406   signature_info->accumulator[7]=0x5be0cd19U;
    407   signature_info->low_order=0;
    408   signature_info->high_order=0;
    409   signature_info->offset=0;
    410 }
    411 
    412 /*
    414 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    415 %                                                                             %
    416 %                                                                             %
    417 %                                                                             %
    418 +   S e t S i g n a t u r e D i g e s t                                       %
    419 %                                                                             %
    420 %                                                                             %
    421 %                                                                             %
    422 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    423 %
    424 %  SetSignatureDigest() set the signature digest.
    425 %
    426 %  The format of the SetSignatureDigest method is:
    427 %
    428 %      SetSignatureDigest(SignatureInfo *signature_info,
    429 %        const StringInfo *digest)
    430 %
    431 %  A description of each parameter follows:
    432 %
    433 %    o signature_info: the signature info.
    434 %
    435 %    o digest: the digest.
    436 %
    437 */
    438 MagickPrivate void SetSignatureDigest(SignatureInfo *signature_info,
    439   const StringInfo *digest)
    440 {
    441   /*
    442     Set the signature accumulator.
    443   */
    444   assert(signature_info != (SignatureInfo *) NULL);
    445   assert(signature_info->signature == MagickCoreSignature);
    446   SetStringInfo(signature_info->digest,digest);
    447 }
    448 
    449 /*
    451 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    452 %                                                                             %
    453 %                                                                             %
    454 %                                                                             %
    455 %   S i g n a t u r e I m a g e                                               %
    456 %                                                                             %
    457 %                                                                             %
    458 %                                                                             %
    459 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    460 %
    461 %  SignatureImage() computes a message digest from an image pixel stream with
    462 %  an implementation of the NIST SHA-256 Message Digest algorithm.  This
    463 %  signature uniquely identifies the image and is convenient for determining
    464 %  if an image has been modified or whether two images are identical.
    465 %
    466 %  The format of the SignatureImage method is:
    467 %
    468 %      MagickBooleanType SignatureImage(Image *image,ExceptionInfo *exception)
    469 %
    470 %  A description of each parameter follows:
    471 %
    472 %    o image: the image.
    473 %
    474 %    o exception: return any errors or warnings in this structure.
    475 %
    476 */
    477 MagickExport MagickBooleanType SignatureImage(Image *image,
    478   ExceptionInfo *exception)
    479 {
    480   CacheView
    481     *image_view;
    482 
    483   char
    484     *hex_signature;
    485 
    486   double
    487     pixel;
    488 
    489   register const Quantum
    490     *p;
    491 
    492   SignatureInfo
    493     *signature_info;
    494 
    495   ssize_t
    496     y;
    497 
    498   StringInfo
    499     *signature;
    500 
    501   unsigned char
    502     *pixels;
    503 
    504   /*
    505     Compute image digital signature.
    506   */
    507   assert(image != (Image *) NULL);
    508   assert(image->signature == MagickCoreSignature);
    509   if (image->debug != MagickFalse)
    510     (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename);
    511   signature_info=AcquireSignatureInfo();
    512   signature=AcquireStringInfo(GetPixelChannels(image)*image->columns*
    513     sizeof(pixel));
    514   image_view=AcquireVirtualCacheView(image,exception);
    515   for (y=0; y < (ssize_t) image->rows; y++)
    516   {
    517     register ssize_t
    518       x;
    519 
    520     register unsigned char
    521       *q;
    522 
    523     p=GetCacheViewVirtualPixels(image_view,0,y,image->columns,1,exception);
    524     if (p == (const Quantum *) NULL)
    525       break;
    526     SetStringInfoLength(signature,GetPixelChannels(image)*image->columns*
    527       sizeof(pixel));
    528     pixels=GetStringInfoDatum(signature);
    529     q=pixels;
    530     for (x=0; x < (ssize_t) image->columns; x++)
    531     {
    532       register ssize_t
    533         i;
    534 
    535       if (GetPixelReadMask(image,p) == 0)
    536         {
    537           p+=GetPixelChannels(image);
    538           continue;
    539         }
    540       for (i=0; i < (ssize_t) GetPixelChannels(image); i++)
    541       {
    542         register ssize_t
    543           j;
    544 
    545         PixelChannel channel=GetPixelChannelChannel(image,i);
    546         PixelTrait traits=GetPixelChannelTraits(image,channel);
    547         if (traits == UndefinedPixelTrait)
    548           continue;
    549         pixel=QuantumScale*p[i];
    550         for (j=0; j < (ssize_t) sizeof(pixel); j++)
    551           *q++=(unsigned char) ((unsigned char *) &pixel)[j];
    552       }
    553       p+=GetPixelChannels(image);
    554     }
    555     SetStringInfoLength(signature,(size_t) (q-pixels));
    556     UpdateSignature(signature_info,signature);
    557   }
    558   image_view=DestroyCacheView(image_view);
    559   FinalizeSignature(signature_info);
    560   hex_signature=StringInfoToHexString(GetSignatureDigest(signature_info));
    561   (void) DeleteImageProperty(image,"signature");
    562   (void) SetImageProperty(image,"signature",hex_signature,exception);
    563   /*
    564     Free resources.
    565   */
    566   hex_signature=DestroyString(hex_signature);
    567   signature=DestroyStringInfo(signature);
    568   signature_info=DestroySignatureInfo(signature_info);
    569   return(MagickTrue);
    570 }
    571 
    572 /*
    574 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    575 %                                                                             %
    576 %                                                                             %
    577 %                                                                             %
    578 +   T r a n s f o r m S i g n a t u r e                                       %
    579 %                                                                             %
    580 %                                                                             %
    581 %                                                                             %
    582 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    583 %
    584 %  TransformSignature() transforms the Signature message accumulator.
    585 %
    586 %  The format of the TransformSignature method is:
    587 %
    588 %      TransformSignature(SignatureInfo *signature_info)
    589 %
    590 %  A description of each parameter follows:
    591 %
    592 %    o signature_info: the address of a structure of type SignatureInfo.
    593 %
    594 */
    595 
    596 static inline unsigned int Ch(unsigned int x,unsigned int y,unsigned int z)
    597 {
    598   return((x & y) ^ (~x & z));
    599 }
    600 
    601 static inline unsigned int Maj(unsigned int x,unsigned int y,unsigned int z)
    602 {
    603   return((x & y) ^ (x & z) ^ (y & z));
    604 }
    605 
    606 static inline unsigned int Trunc32(unsigned int x)
    607 {
    608   return((unsigned int) (x & 0xffffffffU));
    609 }
    610 
    611 static unsigned int RotateRight(unsigned int x,unsigned int n)
    612 {
    613   return(Trunc32((x >> n) | (x << (32-n))));
    614 }
    615 
    616 static void TransformSignature(SignatureInfo *signature_info)
    617 {
    618 #define Sigma0(x)  (RotateRight(x,7) ^ RotateRight(x,18) ^ Trunc32((x) >> 3))
    619 #define Sigma1(x)  (RotateRight(x,17) ^ RotateRight(x,19) ^ Trunc32((x) >> 10))
    620 #define Suma0(x)  (RotateRight(x,2) ^ RotateRight(x,13) ^ RotateRight(x,22))
    621 #define Suma1(x)  (RotateRight(x,6) ^ RotateRight(x,11) ^ RotateRight(x,25))
    622 
    623   register ssize_t
    624     i;
    625 
    626   register unsigned char
    627     *p;
    628 
    629   ssize_t
    630     j;
    631 
    632   static unsigned int
    633     K[64] =
    634     {
    635       0x428a2f98U, 0x71374491U, 0xb5c0fbcfU, 0xe9b5dba5U, 0x3956c25bU,
    636       0x59f111f1U, 0x923f82a4U, 0xab1c5ed5U, 0xd807aa98U, 0x12835b01U,
    637       0x243185beU, 0x550c7dc3U, 0x72be5d74U, 0x80deb1feU, 0x9bdc06a7U,
    638       0xc19bf174U, 0xe49b69c1U, 0xefbe4786U, 0x0fc19dc6U, 0x240ca1ccU,
    639       0x2de92c6fU, 0x4a7484aaU, 0x5cb0a9dcU, 0x76f988daU, 0x983e5152U,
    640       0xa831c66dU, 0xb00327c8U, 0xbf597fc7U, 0xc6e00bf3U, 0xd5a79147U,
    641       0x06ca6351U, 0x14292967U, 0x27b70a85U, 0x2e1b2138U, 0x4d2c6dfcU,
    642       0x53380d13U, 0x650a7354U, 0x766a0abbU, 0x81c2c92eU, 0x92722c85U,
    643       0xa2bfe8a1U, 0xa81a664bU, 0xc24b8b70U, 0xc76c51a3U, 0xd192e819U,
    644       0xd6990624U, 0xf40e3585U, 0x106aa070U, 0x19a4c116U, 0x1e376c08U,
    645       0x2748774cU, 0x34b0bcb5U, 0x391c0cb3U, 0x4ed8aa4aU, 0x5b9cca4fU,
    646       0x682e6ff3U, 0x748f82eeU, 0x78a5636fU, 0x84c87814U, 0x8cc70208U,
    647       0x90befffaU, 0xa4506cebU, 0xbef9a3f7U, 0xc67178f2U
    648     };  /* 32-bit fractional part of the cube root of the first 64 primes */
    649 
    650   unsigned int
    651     A,
    652     B,
    653     C,
    654     D,
    655     E,
    656     F,
    657     G,
    658     H,
    659     shift,
    660     T,
    661     T1,
    662     T2,
    663     W[64];
    664 
    665   shift=32;
    666   p=GetStringInfoDatum(signature_info->message);
    667   if (signature_info->lsb_first == MagickFalse)
    668     {
    669 DisableMSCWarning(4127)
    670       if (sizeof(unsigned int) <= 4)
    671 RestoreMSCWarning
    672         for (i=0; i < 16; i++)
    673         {
    674           T=(*((unsigned int *) p));
    675           p+=4;
    676           W[i]=Trunc32(T);
    677         }
    678       else
    679         for (i=0; i < 16; i+=2)
    680         {
    681           T=(*((unsigned int *) p));
    682           p+=8;
    683           W[i]=Trunc32(T >> shift);
    684           W[i+1]=Trunc32(T);
    685         }
    686     }
    687   else
    688 DisableMSCWarning(4127)
    689     if (sizeof(unsigned int) <= 4)
    690 RestoreMSCWarning
    691       for (i=0; i < 16; i++)
    692       {
    693         T=(*((unsigned int *) p));
    694         p+=4;
    695         W[i]=((T << 24) & 0xff000000) | ((T << 8) & 0x00ff0000) |
    696           ((T >> 8) & 0x0000ff00) | ((T >> 24) & 0x000000ff);
    697       }
    698     else
    699       for (i=0; i < 16; i+=2)
    700       {
    701         T=(*((unsigned int *) p));
    702         p+=8;
    703         W[i]=((T << 24) & 0xff000000) | ((T << 8) & 0x00ff0000) |
    704           ((T >> 8) & 0x0000ff00) | ((T >> 24) & 0x000000ff);
    705         T>>=shift;
    706         W[i+1]=((T << 24) & 0xff000000) | ((T << 8) & 0x00ff0000) |
    707           ((T >> 8) & 0x0000ff00) | ((T >> 24) & 0x000000ff);
    708       }
    709   /*
    710     Copy accumulator to registers.
    711   */
    712   A=signature_info->accumulator[0];
    713   B=signature_info->accumulator[1];
    714   C=signature_info->accumulator[2];
    715   D=signature_info->accumulator[3];
    716   E=signature_info->accumulator[4];
    717   F=signature_info->accumulator[5];
    718   G=signature_info->accumulator[6];
    719   H=signature_info->accumulator[7];
    720   for (i=16; i < 64; i++)
    721     W[i]=Trunc32(Sigma1(W[i-2])+W[i-7]+Sigma0(W[i-15])+W[i-16]);
    722   for (j=0; j < 64; j++)
    723   {
    724     T1=Trunc32(H+Suma1(E)+Ch(E,F,G)+K[j]+W[j]);
    725     T2=Trunc32(Suma0(A)+Maj(A,B,C));
    726     H=G;
    727     G=F;
    728     F=E;
    729     E=Trunc32(D+T1);
    730     D=C;
    731     C=B;
    732     B=A;
    733     A=Trunc32(T1+T2);
    734   }
    735   /*
    736     Add registers back to accumulator.
    737   */
    738   signature_info->accumulator[0]=Trunc32(signature_info->accumulator[0]+A);
    739   signature_info->accumulator[1]=Trunc32(signature_info->accumulator[1]+B);
    740   signature_info->accumulator[2]=Trunc32(signature_info->accumulator[2]+C);
    741   signature_info->accumulator[3]=Trunc32(signature_info->accumulator[3]+D);
    742   signature_info->accumulator[4]=Trunc32(signature_info->accumulator[4]+E);
    743   signature_info->accumulator[5]=Trunc32(signature_info->accumulator[5]+F);
    744   signature_info->accumulator[6]=Trunc32(signature_info->accumulator[6]+G);
    745   signature_info->accumulator[7]=Trunc32(signature_info->accumulator[7]+H);
    746   /*
    747     Reset working registers.
    748   */
    749   A=0;
    750   B=0;
    751   C=0;
    752   D=0;
    753   E=0;
    754   F=0;
    755   G=0;
    756   H=0;
    757   T=0;
    758   T1=0;
    759   T2=0;
    760   (void) ResetMagickMemory(W,0,sizeof(W));
    761 }
    762 
    763 /*
    765 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    766 %                                                                             %
    767 %                                                                             %
    768 %                                                                             %
    769 +   U p d a t e S i g n a t u r e                                             %
    770 %                                                                             %
    771 %                                                                             %
    772 %                                                                             %
    773 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    774 %
    775 %  UpdateSignature() updates the Signature message accumulator.
    776 %
    777 %  The format of the UpdateSignature method is:
    778 %
    779 %      UpdateSignature(SignatureInfo *signature_info,const StringInfo *message)
    780 %
    781 %  A description of each parameter follows:
    782 %
    783 %    o signature_info: the address of a structure of type SignatureInfo.
    784 %
    785 %    o message: the message.
    786 %
    787 */
    788 MagickPrivate void UpdateSignature(SignatureInfo *signature_info,
    789   const StringInfo *message)
    790 {
    791   register size_t
    792     i;
    793 
    794   register unsigned char
    795     *p;
    796 
    797   size_t
    798     n;
    799 
    800   unsigned int
    801     length;
    802 
    803   /*
    804     Update the Signature accumulator.
    805   */
    806   assert(signature_info != (SignatureInfo *) NULL);
    807   assert(signature_info->signature == MagickCoreSignature);
    808   n=GetStringInfoLength(message);
    809   length=Trunc32((unsigned int) (signature_info->low_order+(n << 3)));
    810   if (length < signature_info->low_order)
    811     signature_info->high_order++;
    812   signature_info->low_order=length;
    813   signature_info->high_order+=(unsigned int) (n >> 29);
    814   p=GetStringInfoDatum(message);
    815   if (signature_info->offset != 0)
    816     {
    817       i=GetStringInfoLength(signature_info->message)-signature_info->offset;
    818       if (i > n)
    819         i=n;
    820       (void) CopyMagickMemory(GetStringInfoDatum(signature_info->message)+
    821         signature_info->offset,p,i);
    822       n-=i;
    823       p+=i;
    824       signature_info->offset+=i;
    825       if (signature_info->offset !=
    826           GetStringInfoLength(signature_info->message))
    827         return;
    828       TransformSignature(signature_info);
    829     }
    830   while (n >= GetStringInfoLength(signature_info->message))
    831   {
    832     SetStringInfoDatum(signature_info->message,p);
    833     p+=GetStringInfoLength(signature_info->message);
    834     n-=GetStringInfoLength(signature_info->message);
    835     TransformSignature(signature_info);
    836   }
    837   (void) CopyMagickMemory(GetStringInfoDatum(signature_info->message),p,n);
    838   signature_info->offset=n;
    839 }
    840