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