% MagickCore Cipher Methods %
% %
% Software Design %
-% John Cristy %
+% Cristy %
% March 2003 %
% %
% %
-% Copyright 1999-2011 ImageMagick Studio LLC, a non-profit organization %
+% Copyright 1999-2014 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 %
{
value=ciphertext[i] ^ key[i];
for (j=0; j < 4; j++)
- *p++=(value >> (8*j)) & 0xff;
+ *p++=(unsigned char) ((value >> (8*j)) & 0xff);
}
/*
Reset registers.
%
*/
+static inline void IncrementCipherNonce(const size_t length,
+ unsigned char *nonce)
+{
+ register ssize_t
+ i;
+
+ for (i=(ssize_t) (length-1); i >= 0; i--)
+ {
+ nonce[i]++;
+ if (nonce[i] != 0)
+ return;
+ }
+ ThrowFatalException(ResourceLimitFatalError,"Sequence wrap error `%s'");
+}
+
static inline size_t MagickMin(const size_t x,const size_t y)
{
if (x < y)
MagickBooleanType
proceed;
+ MagickSizeType
+ extent;
+
QuantumInfo
*quantum_info;
assert(exception->signature == MagickSignature);
if (passkey == (const StringInfo *) NULL)
return(MagickTrue);
- quantum_info=AcquireQuantumInfo((const ImageInfo *) NULL,image);
- if (quantum_info == (QuantumInfo *) NULL)
- ThrowBinaryException(ResourceLimitError,"MemoryAllocationFailed",
- image->filename);
aes_info=AcquireAESInfo();
key=CloneStringInfo(passkey);
if (key == (StringInfo *) NULL)
{
aes_info=DestroyAESInfo(aes_info);
- quantum_info=DestroyQuantumInfo(quantum_info);
ThrowBinaryException(ResourceLimitError,"MemoryAllocationFailed",
image->filename);
}
{
key=DestroyStringInfo(key);
aes_info=DestroyAESInfo(aes_info);
- quantum_info=DestroyQuantumInfo(quantum_info);
ThrowBinaryException(ResourceLimitError,"MemoryAllocationFailed",
image->filename);
}
key=DestroyStringInfo(key);
signature_info=AcquireSignatureInfo();
UpdateSignature(signature_info,nonce);
- SetStringInfoLength(nonce,sizeof(quantum_info->extent));
- SetStringInfoDatum(nonce,(const unsigned char *) &quantum_info->extent);
+ extent=(MagickSizeType) image->columns*image->rows;
+ SetStringInfoLength(nonce,sizeof(extent));
+ SetStringInfoDatum(nonce,(const unsigned char *) &extent);
UpdateSignature(signature_info,nonce);
+ nonce=DestroyStringInfo(nonce);
FinalizeSignature(signature_info);
(void) ResetMagickMemory(input_block,0,sizeof(input_block));
digest=GetStringInfoDatum(GetSignatureDigest(signature_info));
(void) CopyMagickMemory(input_block,digest,MagickMin(AESBlocksize,
GetSignatureDigestsize(signature_info))*sizeof(*input_block));
- nonce=DestroyStringInfo(nonce);
signature_info=DestroySignatureInfo(signature_info);
/*
Convert cipher pixels to plain pixels.
*/
+ quantum_info=AcquireQuantumInfo((const ImageInfo *) NULL,image);
+ if (quantum_info == (QuantumInfo *) NULL)
+ {
+ aes_info=DestroyAESInfo(aes_info);
+ ThrowBinaryException(ResourceLimitError,"MemoryAllocationFailed",
+ image->filename);
+ }
quantum_type=GetQuantumType(image,exception);
pixels=GetQuantumPixels(quantum_info);
- image_view=AcquireCacheView(image);
+ image_view=AcquireAuthenticCacheView(image,exception);
for (y=0; y < (ssize_t) image->rows; y++)
{
register ssize_t
+ i,
x;
register Quantum
*restrict q;
q=GetCacheViewAuthenticPixels(image_view,0,y,image->columns,1,exception);
- if (q == (const Quantum *) NULL)
+ if (q == (Quantum *) NULL)
break;
length=ExportQuantumPixels(image,image_view,quantum_info,quantum_type,
pixels,exception);
p=pixels;
- for (x=0; x < (ssize_t) length; x++)
+ for (x=0; x < (ssize_t) length; x+=AESBlocksize)
{
(void) CopyMagickMemory(output_block,input_block,AESBlocksize*
sizeof(*output_block));
+ IncrementCipherNonce(AESBlocksize,input_block);
EncipherAESBlock(aes_info,output_block,output_block);
- (void) CopyMagickMemory(input_block,input_block+1,(AESBlocksize-1)*
- sizeof(*input_block));
- input_block[AESBlocksize-1]=(*p);
- *p++^=(*output_block);
+ for (i=0; i < AESBlocksize; i++)
+ p[i]^=output_block[i];
+ p+=AESBlocksize;
+ }
+ (void) CopyMagickMemory(output_block,input_block,AESBlocksize*
+ sizeof(*output_block));
+ EncipherAESBlock(aes_info,output_block,output_block);
+ for (i=0; x < (ssize_t) length; x++)
+ {
+ p[i]^=output_block[i];
+ i++;
}
(void) ImportQuantumPixels(image,image_view,quantum_info,quantum_type,
pixels,exception);
MagickBooleanType
proceed;
+ MagickSizeType
+ extent;
+
QuantumInfo
*quantum_info;
return(MagickTrue);
if (SetImageStorageClass(image,DirectClass,exception) == MagickFalse)
return(MagickFalse);
- quantum_info=AcquireQuantumInfo((const ImageInfo *) NULL,image);
- if (quantum_info == (QuantumInfo *) NULL)
- ThrowBinaryException(ResourceLimitError,"MemoryAllocationFailed",
- image->filename);
aes_info=AcquireAESInfo();
key=CloneStringInfo(passkey);
if (key == (StringInfo *) NULL)
{
aes_info=DestroyAESInfo(aes_info);
- quantum_info=DestroyQuantumInfo(quantum_info);
ThrowBinaryException(ResourceLimitError,"MemoryAllocationFailed",
image->filename);
}
{
key=DestroyStringInfo(key);
aes_info=DestroyAESInfo(aes_info);
- quantum_info=DestroyQuantumInfo(quantum_info);
ThrowBinaryException(ResourceLimitError,"MemoryAllocationFailed",
image->filename);
}
key=DestroyStringInfo(key);
signature_info=AcquireSignatureInfo();
UpdateSignature(signature_info,nonce);
- SetStringInfoLength(nonce,sizeof(quantum_info->extent));
- SetStringInfoDatum(nonce,(const unsigned char *) &quantum_info->extent);
+ extent=(MagickSizeType) image->columns*image->rows;
+ SetStringInfoLength(nonce,sizeof(extent));
+ SetStringInfoDatum(nonce,(const unsigned char *) &extent);
UpdateSignature(signature_info,nonce);
nonce=DestroyStringInfo(nonce);
FinalizeSignature(signature_info);
+ signature=StringInfoToHexString(GetSignatureDigest(signature_info));
+ (void) SetImageProperty(image,"cipher:type","AES",exception);
+ (void) SetImageProperty(image,"cipher:mode","CTR",exception);
+ (void) SetImageProperty(image,"cipher:nonce",signature,exception);
+ signature=DestroyString(signature);
(void) ResetMagickMemory(input_block,0,sizeof(input_block));
digest=GetStringInfoDatum(GetSignatureDigest(signature_info));
(void) CopyMagickMemory(input_block,digest,MagickMin(AESBlocksize,
GetSignatureDigestsize(signature_info))*sizeof(*input_block));
- signature=StringInfoToHexString(GetSignatureDigest(signature_info));
- (void) SetImageProperty(image,"cipher:type","AES");
- (void) SetImageProperty(image,"cipher:mode","CFB");
- (void) SetImageProperty(image,"cipher:nonce",signature);
- signature=DestroyString(signature);
signature_info=DestroySignatureInfo(signature_info);
/*
Convert plain pixels to cipher pixels.
*/
+ quantum_info=AcquireQuantumInfo((const ImageInfo *) NULL,image);
+ if (quantum_info == (QuantumInfo *) NULL)
+ {
+ aes_info=DestroyAESInfo(aes_info);
+ ThrowBinaryException(ResourceLimitError,"MemoryAllocationFailed",
+ image->filename);
+ }
quantum_type=GetQuantumType(image,exception);
pixels=GetQuantumPixels(quantum_info);
- image_view=AcquireCacheView(image);
+ image_view=AcquireAuthenticCacheView(image,exception);
for (y=0; y < (ssize_t) image->rows; y++)
{
register ssize_t
+ i,
x;
register Quantum
*restrict q;
q=GetCacheViewAuthenticPixels(image_view,0,y,image->columns,1,exception);
- if (q == (const Quantum *) NULL)
+ if (q == (Quantum *) NULL)
break;
length=ExportQuantumPixels(image,image_view,quantum_info,quantum_type,
pixels,exception);
p=pixels;
- for (x=0; x < (ssize_t) length; x++)
+ for (x=0; x < (ssize_t) length; x+=AESBlocksize)
{
(void) CopyMagickMemory(output_block,input_block,AESBlocksize*
sizeof(*output_block));
+ IncrementCipherNonce(AESBlocksize,input_block);
EncipherAESBlock(aes_info,output_block,output_block);
- *p^=(*output_block);
- (void) CopyMagickMemory(input_block,input_block+1,(AESBlocksize-1)*
- sizeof(*input_block));
- input_block[AESBlocksize-1]=(*p++);
+ for (i=0; i < AESBlocksize; i++)
+ p[i]^=output_block[i];
+ p+=AESBlocksize;
+ }
+ (void) CopyMagickMemory(output_block,input_block,AESBlocksize*
+ sizeof(*output_block));
+ EncipherAESBlock(aes_info,output_block,output_block);
+ for (i=0; x < (ssize_t) length; x++)
+ {
+ p[i]^=output_block[i];
+ i++;
}
(void) ImportQuantumPixels(image,image_view,quantum_info,quantum_type,
pixels,exception);