% 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, %
#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"
high_order;
size_t
- offset;
+ extent;
MagickBooleanType
lsb_first;
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);
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);
}
{
(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);
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);
}
register unsigned int
*p;
+ size_t
+ extent;
+
unsigned char
*datum;
unsigned int
- count,
high_order,
low_order;
*/
(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);
*q++=(unsigned char) (*p & 0xff);
p++;
}
- /*
- Reset working registers.
- */
- count=0;
- high_order=0;
- low_order=0;
}
\f
/*
{
(void) LogMagickEvent(TraceEvent,GetMagickModule(),"...");
assert(signature_info != (SignatureInfo *) NULL);
- assert(signature_info->signature == MagickSignature);
+ assert(signature_info->signature == MagickCoreSignature);
return(signature_info->blocksize);
}
\f
{
(void) LogMagickEvent(TraceEvent,GetMagickModule(),"...");
assert(signature_info != (SignatureInfo *) NULL);
- assert(signature_info->signature == MagickSignature);
+ assert(signature_info->signature == MagickCoreSignature);
return(signature_info->digest);
}
\f
{
(void) LogMagickEvent(TraceEvent,GetMagickModule(),"...");
assert(signature_info != (SignatureInfo *) NULL);
- assert(signature_info->signature == MagickSignature);
+ assert(signature_info->signature == MagickCoreSignature);
return(signature_info->digestsize);
}
\f
{
(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;
signature_info->accumulator[7]=0x5be0cd19U;
signature_info->low_order=0;
signature_info->high_order=0;
- signature_info->offset=0;
+ signature_info->extent=0;
}
\f
/*
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
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,exception);
for (y=0; y < (ssize_t) image->rows; y++)
{
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);
}
ssize_t
j;
- static unsigned int
+ static const unsigned int
K[64] =
{
0x428a2f98U, 0x71374491U, 0xb5c0fbcfU, 0xe9b5dba5U, 0x3956c25bU,
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));
}
}
else
+DisableMSCWarning(4127)
if (sizeof(unsigned int) <= 4)
+RestoreMSCWarning
for (i=0; i < 16; i++)
{
T=(*((unsigned int *) p));
T=0;
T1=0;
T2=0;
- (void) ResetMagickMemory(W,0,sizeof(W));
+ (void) memset(W,0,sizeof(W));
}
\f
/*
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);
}
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;
}