13ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
23ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
33ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
43ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
53ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                   CCCC  IIIII  PPPP   H   H  EEEEE  RRRR                    %
63ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                  C        I    P   P  H   H  E      R   R                   %
73ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                  C        I    PPPP   HHHHH  EEE    RRRR                    %
83ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                  C        I    P      H   H  E      R R                     %
93ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                   CCCC  IIIII  P      H   H  EEEEE  R  R                    %
103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                          MagickCore Cipher Methods                          %
133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                             Software Design                                 %
15de984cdc3631106b1cbbb8d3972b76a0fc27e8e8cristy%                                  Cristy                                     %
163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                               March  2003                                   %
173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
197ce65e7125a4e1df1a274ce373c537a9df9c16cdCristy%  Copyright 1999-2016 ImageMagick Studio LLC, a non-profit organization      %
203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  dedicated to making software imaging solutions freely available.           %
213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  You may not use this file except in compliance with the License.  You may  %
233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  obtain a copy of the License at                                            %
243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    http://www.imagemagick.org/script/license.php                            %
263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  Unless required by applicable law or agreed to in writing, software        %
283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  distributed under the License is distributed on an "AS IS" BASIS,          %
293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.   %
303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  See the License for the specific language governing permissions and        %
313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  limitations under the License.                                             %
323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  Include declarations.
403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
414c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/studio.h"
424c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/cache.h"
434c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/cipher.h"
444c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/exception.h"
454c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/exception-private.h"
464c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/image.h"
474c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/image-private.h"
48abed7e293f2e8a83e8036df7f2a3e1d9859e5fb2dirk#include "MagickCore/linked-list.h"
494c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/list.h"
504c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/memory_.h"
514c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/monitor.h"
524c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/monitor-private.h"
534c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/property.h"
544c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/quantum-private.h"
554c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/registry.h"
564c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/semaphore.h"
574c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/signature-private.h"
584c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/splay-tree.h"
594c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/statistic.h"
604c08aed51c5899665ade97263692328eea4af106cristy#include "MagickCore/string_.h"
613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#if defined(MAGICKCORE_CIPHER_SUPPORT)
633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  Define declarations.
653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#define AESBlocksize 16
673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  Typedef declarations.
703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
713ed852eea50f9d4cd633efb8c2b054b8e33c253cristytypedef struct _AESInfo
723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  StringInfo
743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *key;
753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  unsigned int
773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    blocksize,
783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *encipher_key,
793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *decipher_key;
803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
81bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy  ssize_t
823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    rounds,
833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    timestamp;
843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
85bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy  size_t
863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    signature;
873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy} AESInfo;
883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  Global declarations.
913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
923ed852eea50f9d4cd633efb8c2b054b8e33c253cristystatic unsigned char
933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  InverseLog[256] =
943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  {
953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      1,   3,   5,  15,  17,  51,  85, 255,  26,  46, 114, 150, 161, 248,
963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy     19,  53,  95, 225,  56,  72, 216, 115, 149, 164, 247,   2,   6,  10,
973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy     30,  34, 102, 170, 229,  52,  92, 228,  55,  89, 235,  38, 106, 190,
983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    217, 112, 144, 171, 230,  49,  83, 245,   4,  12,  20,  60,  68, 204,
993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy     79, 209, 104, 184, 211, 110, 178, 205,  76, 212, 103, 169, 224,  59,
1003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy     77, 215,  98, 166, 241,   8,  24,  40, 120, 136, 131, 158, 185, 208,
1013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    107, 189, 220, 127, 129, 152, 179, 206,  73, 219, 118, 154, 181, 196,
1023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy     87, 249,  16,  48,  80, 240,  11,  29,  39, 105, 187, 214,  97, 163,
1033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    254,  25,  43, 125, 135, 146, 173, 236,  47, 113, 147, 174, 233,  32,
1043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy     96, 160, 251,  22,  58,  78, 210, 109, 183, 194,  93, 231,  50,  86,
1053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    250,  21,  63,  65, 195,  94, 226,  61,  71, 201,  64, 192,  91, 237,
1063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy     44, 116, 156, 191, 218, 117, 159, 186, 213, 100, 172, 239,  42, 126,
1073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    130, 157, 188, 223, 122, 142, 137, 128, 155, 182, 193,  88, 232,  35,
1083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    101, 175, 234,  37, 111, 177, 200,  67, 197,  84, 252,  31,  33,  99,
1093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    165, 244,   7,   9,  27,  45, 119, 153, 176, 203,  70, 202,  69, 207,
1103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy     74, 222, 121, 139, 134, 145, 168, 227,  62,  66, 198,  81, 243,  14,
1113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy     18,  54,  90, 238,  41, 123, 141, 140, 143, 138, 133, 148, 167, 242,
1123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy     13,  23,  57,  75, 221, 124, 132, 151, 162, 253,  28,  36, 108, 180,
1133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    199,  82, 246,   1
1143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  },
1153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  Log[256] =
1163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  {
1173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      0,   0,  25,   1,  50,   2,  26, 198,  75, 199,  27, 104,  51, 238,
1183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    223,   3, 100,   4, 224,  14,  52, 141, 129, 239,  76, 113,   8, 200,
1193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    248, 105,  28, 193, 125, 194,  29, 181, 249, 185,  39, 106,  77, 228,
1203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    166, 114, 154, 201,   9, 120, 101,  47, 138,   5,  33,  15, 225,  36,
1213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy     18, 240, 130,  69,  53, 147, 218, 142, 150, 143, 219, 189,  54, 208,
1223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    206, 148,  19,  92, 210, 241,  64,  70, 131,  56, 102, 221, 253,  48,
1233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    191,   6, 139,  98, 179,  37, 226, 152,  34, 136, 145,  16, 126, 110,
1243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy     72, 195, 163, 182,  30,  66,  58, 107,  40,  84, 250, 133,  61, 186,
1253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy     43, 121,  10,  21, 155, 159,  94, 202,  78, 212, 172, 229, 243, 115,
1263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    167,  87, 175,  88, 168,  80, 244, 234, 214, 116,  79, 174, 233, 213,
1273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    231, 230, 173, 232,  44, 215, 117, 122, 235,  22,  11, 245,  89, 203,
1283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy     95, 176, 156, 169,  81, 160, 127,  12, 246, 111,  23, 196,  73, 236,
1293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    216,  67,  31,  45, 164, 118, 123, 183, 204, 187,  62,  90, 251,  96,
1303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    177, 134,  59,  82, 161, 108, 170,  85,  41, 157, 151, 178, 135, 144,
1313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy     97, 190, 220, 252, 188, 149, 207, 205,  55,  63,  91, 209,  83,  57,
1323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    132, 60,   65, 162, 109,  71,  20,  42, 158,  93,  86, 242, 211, 171,
1333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy     68,  17, 146, 217,  35,  32,  46, 137, 180, 124, 184,  38, 119, 153,
1343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    227, 165, 103,  74, 237, 222, 197,  49, 254,  24,  13,  99, 140, 128,
1353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    192, 247, 112,   7,
1363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  },
1373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  SBox[256] =
1383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  {
1393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy     99, 124, 119, 123, 242, 107, 111, 197,  48,   1, 103,  43, 254, 215,
1403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    171, 118, 202, 130, 201, 125, 250,  89,  71, 240, 173, 212, 162, 175,
1413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    156, 164, 114, 192, 183, 253, 147,  38,  54,  63, 247, 204,  52, 165,
1423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    229, 241, 113, 216,  49,  21,   4, 199,  35, 195,  24, 150,   5, 154,
1433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      7,  18, 128, 226, 235,  39, 178, 117,   9, 131,  44,  26,  27, 110,
1443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy     90, 160,  82,  59, 214, 179,  41, 227,  47, 132,  83, 209,   0, 237,
1453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy     32, 252, 177,  91, 106, 203, 190,  57,  74,  76,  88, 207, 208, 239,
1463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    170, 251,  67,  77,  51, 133,  69, 249,   2, 127,  80,  60, 159, 168,
1473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy     81, 163,  64, 143, 146, 157,  56, 245, 188, 182, 218,  33,  16, 255,
1483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    243, 210, 205,  12,  19, 236,  95, 151,  68,  23, 196, 167, 126,  61,
1493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    100,  93,  25, 115,  96, 129,  79, 220,  34,  42, 144, 136,  70, 238,
1503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    184,  20, 222,  94,  11, 219, 224,  50,  58,  10,  73,   6,  36,  92,
1513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    194, 211, 172,  98, 145, 149, 228, 121, 231, 200,  55, 109, 141, 213,
1523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy     78, 169, 108,  86, 244, 234, 101, 122, 174,   8, 186, 120,  37,  46,
1533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy     28, 166, 180, 198, 232, 221, 116,  31,  75, 189, 139, 138, 112,  62,
1543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    181, 102,  72,   3, 246,  14,  97,  53,  87, 185, 134, 193,  29, 158,
1553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    225, 248, 152,  17, 105, 217, 142, 148, 155,  30, 135, 233, 206,  85,
1563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy     40, 223, 140, 161, 137,  13, 191, 230,  66, 104,  65, 153,  45,  15,
1573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    176,  84, 187, 22
1583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  };
1593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
1603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
1613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  Forward declarations.
1623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
1633ed852eea50f9d4cd633efb8c2b054b8e33c253cristystatic AESInfo
1643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  *DestroyAESInfo(AESInfo *);
1653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
1663ed852eea50f9d4cd633efb8c2b054b8e33c253cristystatic void
1673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  EncipherAESBlock(AESInfo *,const unsigned char *,unsigned char *),
1683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  SetAESKey(AESInfo *,const StringInfo *);
1693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
1703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
1713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
1733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
1743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
1753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%   A c q u i r e A E S I n f o                                               %
1763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
1773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
1783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
1793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
1803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
1813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  AcquireAESInfo() allocate the AESInfo structure.
1823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
1833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  The format of the AcquireAESInfo method is:
1843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
1853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      AESInfo *AcquireAESInfo(void)
1863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
1873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
1883ed852eea50f9d4cd633efb8c2b054b8e33c253cristystatic AESInfo *AcquireAESInfo(void)
1893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
1903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  AESInfo
1913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *aes_info;
1923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
19373bd4a51b419e914565bdf204bf1540dc4c8ee26cristy  aes_info=(AESInfo *) AcquireMagickMemory(sizeof(*aes_info));
1943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (aes_info == (AESInfo *) NULL)
1953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    ThrowFatalException(ResourceLimitFatalError,"MemoryAllocationFailed");
1963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) ResetMagickMemory(aes_info,0,sizeof(*aes_info));
1973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  aes_info->blocksize=AESBlocksize;
1983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  aes_info->key=AcquireStringInfo(32);
1993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  aes_info->encipher_key=(unsigned int *) AcquireQuantumMemory(60UL,sizeof(
2003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *aes_info->encipher_key));
2013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  aes_info->decipher_key=(unsigned int *) AcquireQuantumMemory(60UL,sizeof(
2023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *aes_info->decipher_key));
2033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if ((aes_info->key == (StringInfo *) NULL) ||
2043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      (aes_info->encipher_key == (unsigned int *) NULL) ||
2053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      (aes_info->decipher_key == (unsigned int *) NULL))
2063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    ThrowFatalException(ResourceLimitFatalError,"MemoryAllocationFailed");
207bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy  aes_info->timestamp=(ssize_t) time(0);
208e1c94d9d25db6b0dd7a5028ffee31d1057855d73cristy  aes_info->signature=MagickCoreSignature;
2093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  return(aes_info);
2103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
2113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
2123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
2133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
2153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
2163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
2173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%   D e s t r o y A E S I n f o                                               %
2183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
2193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
2203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
2213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
2233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  DestroyAESInfo() zeros memory associated with the AESInfo structure.
2243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
2253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  The format of the DestroyAESInfo method is:
2263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
2273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      AESInfo *DestroyAESInfo(AESInfo *aes_info)
2283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
2293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  A description of each parameter follows:
2303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
2313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o aes_info: the cipher context.
2323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
2333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
2343ed852eea50f9d4cd633efb8c2b054b8e33c253cristystatic AESInfo *DestroyAESInfo(AESInfo *aes_info)
2353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
2363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) LogMagickEvent(TraceEvent,GetMagickModule(),"...");
2373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(aes_info != (AESInfo *) NULL);
238e1c94d9d25db6b0dd7a5028ffee31d1057855d73cristy  assert(aes_info->signature == MagickCoreSignature);
2393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (aes_info->decipher_key != (unsigned int *) NULL)
2403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    aes_info->decipher_key=(unsigned int *) RelinquishMagickMemory(
2413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      aes_info->decipher_key);
2423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (aes_info->encipher_key != (unsigned int *) NULL)
2433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    aes_info->encipher_key=(unsigned int *) RelinquishMagickMemory(
2443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      aes_info->encipher_key);
2453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (aes_info->key != (StringInfo *) NULL)
2463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    aes_info->key=DestroyStringInfo(aes_info->key);
247e1c94d9d25db6b0dd7a5028ffee31d1057855d73cristy  aes_info->signature=(~MagickCoreSignature);
2483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  aes_info=(AESInfo *) RelinquishMagickMemory(aes_info);
2493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  return(aes_info);
2503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
2513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
2523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
2533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
2553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
2563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
2573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%   E n c i p h e r A E S B l o c k                                           %
2583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
2593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
2603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
2613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
2623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
2633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  EncipherAESBlock() enciphers a single block of plaintext to produce a block
2643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  of ciphertext.
2653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
2663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  The format of the EncipherAESBlock method is:
2673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
2683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      void EncipherAES(AESInfo *aes_info,const unsigned char *plaintext,
2693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%        unsigned char *ciphertext)
2703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
2713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  A description of each parameter follows:
2723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
2733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o aes_info: the cipher context.
2743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
2753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o plaintext: the plain text.
2763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
2773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o ciphertext: the cipher text.
2783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
2793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
2803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
2813ed852eea50f9d4cd633efb8c2b054b8e33c253cristystatic inline void AddRoundKey(const unsigned int *ciphertext,
2823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  const unsigned int *key,unsigned int *plaintext)
2833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
284bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy  register ssize_t
2853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    i;
2863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
2873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /*
2883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    Xor corresponding text input and round key input bytes.
2893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  */
2903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  for (i=0; i < 4; i++)
2913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    plaintext[i]=key[i] ^ ciphertext[i];
2923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
2933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
2943ed852eea50f9d4cd633efb8c2b054b8e33c253cristystatic inline unsigned char ByteMultiply(const unsigned char alpha,
2953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  const unsigned char beta)
2963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
2973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /*
2983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    Byte multiply two elements of GF(2^m) (mix columns and inverse mix columns).
2993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  */
3003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if ((alpha == 0) || (beta == 0))
3013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    return(0);
3023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  return(InverseLog[(Log[alpha]+Log[beta]) % 0xff]);
3033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
3043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
3053ed852eea50f9d4cd633efb8c2b054b8e33c253cristystatic inline unsigned int ByteSubTransform(unsigned int x,
3063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  unsigned char *s_box)
3073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
3083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  unsigned int
3093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    key;
3103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
3113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /*
3123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    Non-linear layer resists differential and linear cryptoanalysis attacks.
3133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  */
3143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  key=(s_box[x & 0xff]) | (s_box[(x >> 8) & 0xff] << 8) |
3153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    (s_box[(x >> 16) & 0xff] << 16) | (s_box[(x >> 24) & 0xff] << 24);
3163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  return(key);
3173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
3183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
3193ed852eea50f9d4cd633efb8c2b054b8e33c253cristystatic void FinalizeRoundKey(const unsigned int *ciphertext,
3203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  const unsigned int *key,unsigned char *plaintext)
3213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
3223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  register unsigned char
3233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *p;
3243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
3253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  register unsigned int
3263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    i,
3273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    j;
3283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
3293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  unsigned int
3303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    value;
3313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
3323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /*
3333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    The round key is XORed with the result of the mix-column transformation.
3343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  */
3353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  p=plaintext;
3363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  for (i=0; i < 4; i++)
3373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  {
3383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    value=ciphertext[i] ^ key[i];
3393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    for (j=0; j < 4; j++)
340aa83c2c383e62bd5342c0d38dc5f6e746998bde8cristy      *p++=(unsigned char) ((value >> (8*j)) & 0xff);
3413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  }
3423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /*
3433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    Reset registers.
3443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  */
3453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  value=0;
3463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
3473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
3483ed852eea50f9d4cd633efb8c2b054b8e33c253cristystatic void InitializeRoundKey(const unsigned char *ciphertext,
3493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  const unsigned int *key,unsigned int *plaintext)
3503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
3513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  register const unsigned char
3523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *p;
3533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
3543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  register unsigned int
3553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    i,
3563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    j;
3573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
3583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  unsigned int
3593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    value;
3603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
3613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  p=ciphertext;
3623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  for (i=0; i < 4; i++)
3633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  {
3643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    value=0;
3653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    for (j=0; j < 4; j++)
3663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      value|=(*p++ << (8*j));
3673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    plaintext[i]=key[i] ^ value;
3683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  }
3693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /*
3703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    Reset registers.
3713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  */
3723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  value=0;
3733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
3743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
3753ed852eea50f9d4cd633efb8c2b054b8e33c253cristystatic inline unsigned int RotateLeft(const unsigned int x)
3763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
3773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  return(((x << 8) | ((x >> 24) & 0xff)));
3783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
3793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
3803ed852eea50f9d4cd633efb8c2b054b8e33c253cristystatic void EncipherAESBlock(AESInfo *aes_info,const unsigned char *plaintext,
3813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  unsigned char *ciphertext)
3823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
383bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy  register ssize_t
3843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    i,
3853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    j;
3863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
3873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  static int
3883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    map[4][4] =
3893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
3903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      { 0, 1, 2, 3 },
3913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      { 1, 2, 3, 0 },
3923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      { 2, 3, 0, 1 },
3933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      { 3, 0, 1, 2 }
3943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    };
3953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
3963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  static unsigned int
3973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    D[] =
3983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
3993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      0xa56363c6U, 0x847c7cf8U, 0x997777eeU, 0x8d7b7bf6U, 0x0df2f2ffU,
4003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      0xbd6b6bd6U, 0xb16f6fdeU, 0x54c5c591U, 0x50303060U, 0x03010102U,
4013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      0xa96767ceU, 0x7d2b2b56U, 0x19fefee7U, 0x62d7d7b5U, 0xe6abab4dU,
4023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      0x9a7676ecU, 0x45caca8fU, 0x9d82821fU, 0x40c9c989U, 0x877d7dfaU,
4033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      0x15fafaefU, 0xeb5959b2U, 0xc947478eU, 0x0bf0f0fbU, 0xecadad41U,
4043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      0x67d4d4b3U, 0xfda2a25fU, 0xeaafaf45U, 0xbf9c9c23U, 0xf7a4a453U,
4053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      0x967272e4U, 0x5bc0c09bU, 0xc2b7b775U, 0x1cfdfde1U, 0xae93933dU,
4063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      0x6a26264cU, 0x5a36366cU, 0x413f3f7eU, 0x02f7f7f5U, 0x4fcccc83U,
4073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      0x5c343468U, 0xf4a5a551U, 0x34e5e5d1U, 0x08f1f1f9U, 0x937171e2U,
4083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      0x73d8d8abU, 0x53313162U, 0x3f15152aU, 0x0c040408U, 0x52c7c795U,
4093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      0x65232346U, 0x5ec3c39dU, 0x28181830U, 0xa1969637U, 0x0f05050aU,
4103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      0xb59a9a2fU, 0x0907070eU, 0x36121224U, 0x9b80801bU, 0x3de2e2dfU,
4113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      0x26ebebcdU, 0x6927274eU, 0xcdb2b27fU, 0x9f7575eaU, 0x1b090912U,
4123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      0x9e83831dU, 0x742c2c58U, 0x2e1a1a34U, 0x2d1b1b36U, 0xb26e6edcU,
4133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      0xee5a5ab4U, 0xfba0a05bU, 0xf65252a4U, 0x4d3b3b76U, 0x61d6d6b7U,
4143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      0xceb3b37dU, 0x7b292952U, 0x3ee3e3ddU, 0x712f2f5eU, 0x97848413U,
4153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      0xf55353a6U, 0x68d1d1b9U, 0x00000000U, 0x2cededc1U, 0x60202040U,
4163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      0x1ffcfce3U, 0xc8b1b179U, 0xed5b5bb6U, 0xbe6a6ad4U, 0x46cbcb8dU,
4173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      0xd9bebe67U, 0x4b393972U, 0xde4a4a94U, 0xd44c4c98U, 0xe85858b0U,
4183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      0x4acfcf85U, 0x6bd0d0bbU, 0x2aefefc5U, 0xe5aaaa4fU, 0x16fbfbedU,
4193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      0xc5434386U, 0xd74d4d9aU, 0x55333366U, 0x94858511U, 0xcf45458aU,
4203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      0x10f9f9e9U, 0x06020204U, 0x817f7ffeU, 0xf05050a0U, 0x443c3c78U,
4213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      0xba9f9f25U, 0xe3a8a84bU, 0xf35151a2U, 0xfea3a35dU, 0xc0404080U,
4223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      0x8a8f8f05U, 0xad92923fU, 0xbc9d9d21U, 0x48383870U, 0x04f5f5f1U,
4233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      0xdfbcbc63U, 0xc1b6b677U, 0x75dadaafU, 0x63212142U, 0x30101020U,
4243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      0x1affffe5U, 0x0ef3f3fdU, 0x6dd2d2bfU, 0x4ccdcd81U, 0x140c0c18U,
4253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      0x35131326U, 0x2fececc3U, 0xe15f5fbeU, 0xa2979735U, 0xcc444488U,
4263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      0x3917172eU, 0x57c4c493U, 0xf2a7a755U, 0x827e7efcU, 0x473d3d7aU,
4273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      0xac6464c8U, 0xe75d5dbaU, 0x2b191932U, 0x957373e6U, 0xa06060c0U,
4283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      0x98818119U, 0xd14f4f9eU, 0x7fdcdca3U, 0x66222244U, 0x7e2a2a54U,
4293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      0xab90903bU, 0x8388880bU, 0xca46468cU, 0x29eeeec7U, 0xd3b8b86bU,
4303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      0x3c141428U, 0x79dedea7U, 0xe25e5ebcU, 0x1d0b0b16U, 0x76dbdbadU,
4313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      0x3be0e0dbU, 0x56323264U, 0x4e3a3a74U, 0x1e0a0a14U, 0xdb494992U,
4323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      0x0a06060cU, 0x6c242448U, 0xe45c5cb8U, 0x5dc2c29fU, 0x6ed3d3bdU,
4333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      0xefacac43U, 0xa66262c4U, 0xa8919139U, 0xa4959531U, 0x37e4e4d3U,
4343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      0x8b7979f2U, 0x32e7e7d5U, 0x43c8c88bU, 0x5937376eU, 0xb76d6ddaU,
4353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      0x8c8d8d01U, 0x64d5d5b1U, 0xd24e4e9cU, 0xe0a9a949U, 0xb46c6cd8U,
4363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      0xfa5656acU, 0x07f4f4f3U, 0x25eaeacfU, 0xaf6565caU, 0x8e7a7af4U,
4373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      0xe9aeae47U, 0x18080810U, 0xd5baba6fU, 0x887878f0U, 0x6f25254aU,
4383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      0x722e2e5cU, 0x241c1c38U, 0xf1a6a657U, 0xc7b4b473U, 0x51c6c697U,
4393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      0x23e8e8cbU, 0x7cdddda1U, 0x9c7474e8U, 0x211f1f3eU, 0xdd4b4b96U,
4403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      0xdcbdbd61U, 0x868b8b0dU, 0x858a8a0fU, 0x907070e0U, 0x423e3e7cU,
4413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      0xc4b5b571U, 0xaa6666ccU, 0xd8484890U, 0x05030306U, 0x01f6f6f7U,
4423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      0x120e0e1cU, 0xa36161c2U, 0x5f35356aU, 0xf95757aeU, 0xd0b9b969U,
4433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      0x91868617U, 0x58c1c199U, 0x271d1d3aU, 0xb99e9e27U, 0x38e1e1d9U,
4443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      0x13f8f8ebU, 0xb398982bU, 0x33111122U, 0xbb6969d2U, 0x70d9d9a9U,
4453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      0x898e8e07U, 0xa7949433U, 0xb69b9b2dU, 0x221e1e3cU, 0x92878715U,
4463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      0x20e9e9c9U, 0x49cece87U, 0xff5555aaU, 0x78282850U, 0x7adfdfa5U,
4473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      0x8f8c8c03U, 0xf8a1a159U, 0x80898909U, 0x170d0d1aU, 0xdabfbf65U,
4483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      0x31e6e6d7U, 0xc6424284U, 0xb86868d0U, 0xc3414182U, 0xb0999929U,
4493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      0x772d2d5aU, 0x110f0f1eU, 0xcbb0b07bU, 0xfc5454a8U, 0xd6bbbb6dU,
4503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      0x3a16162cU
4513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    };
4523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
4533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  unsigned int
4543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    alpha,
4553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    key[4],
4563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    text[4];
4573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
4583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /*
4593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    Encipher one block.
4603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  */
4613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) memset(text,0,sizeof(text));
4623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  InitializeRoundKey(plaintext,aes_info->encipher_key,text);
4633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  for (i=1; i < aes_info->rounds; i++)
4643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  {
4653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    /*
4663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      Linear mixing step: cause diffusion of the bits over multiple rounds.
4673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    */
4683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    for (j=0; j < 4; j++)
4693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      key[j]=D[text[j] & 0xff] ^
4703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        RotateLeft(D[(text[map[1][j]] >> 8) & 0xff] ^
4713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        RotateLeft(D[(text[map[2][j]] >> 16) & 0xff] ^
4723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        RotateLeft(D[(text[map[3][j]] >> 24) & 0xff])));
4733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    AddRoundKey(key,aes_info->encipher_key+4*i,text);
4743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  }
4753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  for (i=0; i < 4; i++)
4763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  {
4773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    alpha=(text[i] & 0x000000ff) | ((text[map[1][i]]) & 0x0000ff00) |
4783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      ((text[map[2][i]]) & 0x00ff0000) | ((text[map[3][i]]) & 0xff000000);
4793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    key[i]=ByteSubTransform(alpha,SBox);
4803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  }
4813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  FinalizeRoundKey(key,aes_info->encipher_key+4*aes_info->rounds,ciphertext);
4823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /*
4833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    Reset registers.
4843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  */
4853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  alpha=0;
4863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) ResetMagickMemory(key,0,sizeof(key));
4873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) ResetMagickMemory(text,0,sizeof(text));
4883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
4893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
4903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
4913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
4923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
4933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
4943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
4953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%     P a s s k e y D e c i p h e r I m a g e                                 %
4963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
4973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
4983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
4993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
5003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
5013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  PasskeyDecipherImage() converts cipher pixels to plain pixels.
5023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
5033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  The format of the PasskeyDecipherImage method is:
5043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
5053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      MagickBooleanType PasskeyDecipherImage(Image *image,
5063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%        const StringInfo *passkey,ExceptionInfo *exception)
5073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      MagickBooleanType DecipherImage(Image *image,const char *passphrase,
5083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%        ExceptionInfo *exception)
5093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
5103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  A description of each parameter follows:
5113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
5123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o image: the image.
5133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
5143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o passphrase: decipher cipher pixels with this passphrase.
5153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
5163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o passkey: decrypt cipher pixels with this passkey.
5173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
5183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o exception: return any errors or warnings in this structure.
5193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
5203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
5213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
5220b1cd1588a5019879935de2fb2fa869c96c86305cristystatic inline void IncrementCipherNonce(const size_t length,
5230b1cd1588a5019879935de2fb2fa869c96c86305cristy  unsigned char *nonce)
5240b1cd1588a5019879935de2fb2fa869c96c86305cristy{
5250b1cd1588a5019879935de2fb2fa869c96c86305cristy  register ssize_t
5260b1cd1588a5019879935de2fb2fa869c96c86305cristy    i;
5270b1cd1588a5019879935de2fb2fa869c96c86305cristy
5280b1cd1588a5019879935de2fb2fa869c96c86305cristy  for (i=(ssize_t) (length-1); i >= 0; i--)
5290b1cd1588a5019879935de2fb2fa869c96c86305cristy  {
5300b1cd1588a5019879935de2fb2fa869c96c86305cristy    nonce[i]++;
5310b1cd1588a5019879935de2fb2fa869c96c86305cristy    if (nonce[i] != 0)
5320b1cd1588a5019879935de2fb2fa869c96c86305cristy      return;
5330b1cd1588a5019879935de2fb2fa869c96c86305cristy  }
5340b1cd1588a5019879935de2fb2fa869c96c86305cristy  ThrowFatalException(ResourceLimitFatalError,"Sequence wrap error `%s'");
5350b1cd1588a5019879935de2fb2fa869c96c86305cristy}
5360b1cd1588a5019879935de2fb2fa869c96c86305cristy
5373ed852eea50f9d4cd633efb8c2b054b8e33c253cristyMagickExport MagickBooleanType DecipherImage(Image *image,
5383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  const char *passphrase,ExceptionInfo *exception)
5393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
5403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  MagickBooleanType
5413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    status;
5423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
5433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  StringInfo
5443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *passkey;
5453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
5463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (passphrase == (const char *) NULL)
5473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    return(MagickTrue);
5483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  passkey=StringToStringInfo(passphrase);
5493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (passkey == (StringInfo *) NULL)
5503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    return(MagickFalse);
5513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  status=PasskeyDecipherImage(image,passkey,exception);
5523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  passkey=DestroyStringInfo(passkey);
5533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  return(status);
5543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
5553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
5563ed852eea50f9d4cd633efb8c2b054b8e33c253cristyMagickExport MagickBooleanType PasskeyDecipherImage(Image *image,
5573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  const StringInfo *passkey,ExceptionInfo *exception)
5583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
5593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#define DecipherImageTag  "Decipher/Image "
5603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
5613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  AESInfo
5623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *aes_info;
5633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
564c4c8d13c0996fea659ce63c682c803e74c1abc8acristy  CacheView
565c4c8d13c0996fea659ce63c682c803e74c1abc8acristy    *image_view;
566c4c8d13c0996fea659ce63c682c803e74c1abc8acristy
5673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  const unsigned char
5683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *digest;
5693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
5703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  MagickBooleanType
5713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    proceed;
5723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
5730b1cd1588a5019879935de2fb2fa869c96c86305cristy  MagickSizeType
5740b1cd1588a5019879935de2fb2fa869c96c86305cristy    extent;
5750b1cd1588a5019879935de2fb2fa869c96c86305cristy
5763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  QuantumInfo
5773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *quantum_info;
5783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
5793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  QuantumType
5803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    quantum_type;
5813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
5823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  SignatureInfo
5833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *signature_info;
5843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
5853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  register unsigned char
5863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *p;
5873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
5883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  size_t
5893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    length;
5903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
5919d314ff2c17a77996c05413c2013880387e50f0ecristy  ssize_t
5929d314ff2c17a77996c05413c2013880387e50f0ecristy    y;
5939d314ff2c17a77996c05413c2013880387e50f0ecristy
5943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  StringInfo
5953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *key,
5963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *nonce;
5973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
5983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  unsigned char
5993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    input_block[AESBlocksize],
6003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    output_block[AESBlocksize],
6013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *pixels;
6023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
6033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /*
6043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    Generate decipher key and nonce.
6053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  */
6063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(image != (Image *) NULL);
607e1c94d9d25db6b0dd7a5028ffee31d1057855d73cristy  assert(image->signature == MagickCoreSignature);
6083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (image->debug != MagickFalse)
6093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename);
6103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(exception != (ExceptionInfo *) NULL);
611e1c94d9d25db6b0dd7a5028ffee31d1057855d73cristy  assert(exception->signature == MagickCoreSignature);
6123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (passkey == (const StringInfo *) NULL)
6133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    return(MagickTrue);
6143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  aes_info=AcquireAESInfo();
6153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  key=CloneStringInfo(passkey);
6163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (key == (StringInfo *) NULL)
6173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
6183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      aes_info=DestroyAESInfo(aes_info);
6193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      ThrowBinaryException(ResourceLimitError,"MemoryAllocationFailed",
6203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        image->filename);
6213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
622f6240ac7e3764dc806f59c17313e0a4d905820d8cristy  nonce=SplitStringInfo(key,GetStringInfoLength(key)/2);
6233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (nonce == (StringInfo *) NULL)
6243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
6253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      key=DestroyStringInfo(key);
6263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      aes_info=DestroyAESInfo(aes_info);
6273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      ThrowBinaryException(ResourceLimitError,"MemoryAllocationFailed",
6283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        image->filename);
6293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
630f6240ac7e3764dc806f59c17313e0a4d905820d8cristy  SetAESKey(aes_info,key);
631f6240ac7e3764dc806f59c17313e0a4d905820d8cristy  key=DestroyStringInfo(key);
6323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  signature_info=AcquireSignatureInfo();
633f6240ac7e3764dc806f59c17313e0a4d905820d8cristy  UpdateSignature(signature_info,nonce);
6340b1cd1588a5019879935de2fb2fa869c96c86305cristy  extent=(MagickSizeType) image->columns*image->rows;
6350b1cd1588a5019879935de2fb2fa869c96c86305cristy  SetStringInfoLength(nonce,sizeof(extent));
6360b1cd1588a5019879935de2fb2fa869c96c86305cristy  SetStringInfoDatum(nonce,(const unsigned char *) &extent);
6373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  UpdateSignature(signature_info,nonce);
6380b1cd1588a5019879935de2fb2fa869c96c86305cristy  nonce=DestroyStringInfo(nonce);
6393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  FinalizeSignature(signature_info);
6403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) ResetMagickMemory(input_block,0,sizeof(input_block));
6413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  digest=GetStringInfoDatum(GetSignatureDigest(signature_info));
6423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) CopyMagickMemory(input_block,digest,MagickMin(AESBlocksize,
6433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    GetSignatureDigestsize(signature_info))*sizeof(*input_block));
6443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  signature_info=DestroySignatureInfo(signature_info);
6453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /*
6463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    Convert cipher pixels to plain pixels.
6473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  */
6485f766ef8b0cd9906c2c3a56d845828380a251073cristy  quantum_info=AcquireQuantumInfo((const ImageInfo *) NULL,image);
6490b1cd1588a5019879935de2fb2fa869c96c86305cristy  if (quantum_info == (QuantumInfo *) NULL)
6500b1cd1588a5019879935de2fb2fa869c96c86305cristy    {
6510b1cd1588a5019879935de2fb2fa869c96c86305cristy      aes_info=DestroyAESInfo(aes_info);
6520b1cd1588a5019879935de2fb2fa869c96c86305cristy      ThrowBinaryException(ResourceLimitError,"MemoryAllocationFailed",
6530b1cd1588a5019879935de2fb2fa869c96c86305cristy        image->filename);
6540b1cd1588a5019879935de2fb2fa869c96c86305cristy    }
6553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  quantum_type=GetQuantumType(image,exception);
656b3f97ae45019a91b30792a6fa42d81a2689a7025cristy  pixels=(unsigned char *) GetQuantumPixels(quantum_info);
65746ff2676b1044ea4101ac7a59b83289cd8f6cfdacristy  image_view=AcquireAuthenticCacheView(image,exception);
658bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy  for (y=0; y < (ssize_t) image->rows; y++)
6593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  {
660bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy    register ssize_t
6610b1cd1588a5019879935de2fb2fa869c96c86305cristy      i,
6623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      x;
6633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
6644c08aed51c5899665ade97263692328eea4af106cristy    register Quantum
66505d2ff7ebf21f659f5b11e45afb294e152f4330cdirk      *magick_restrict q;
6663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
6673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    q=GetCacheViewAuthenticPixels(image_view,0,y,image->columns,1,exception);
668acd2ed254c18c254a0ab5aafa06d1645e5d079d8cristy    if (q == (Quantum *) NULL)
6693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      break;
6703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    length=ExportQuantumPixels(image,image_view,quantum_info,quantum_type,
6713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      pixels,exception);
6723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    p=pixels;
6730b1cd1588a5019879935de2fb2fa869c96c86305cristy    for (x=0; x < (ssize_t) length; x+=AESBlocksize)
6743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
6753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      (void) CopyMagickMemory(output_block,input_block,AESBlocksize*
6763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        sizeof(*output_block));
6770b1cd1588a5019879935de2fb2fa869c96c86305cristy      IncrementCipherNonce(AESBlocksize,input_block);
6783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      EncipherAESBlock(aes_info,output_block,output_block);
6790b1cd1588a5019879935de2fb2fa869c96c86305cristy      for (i=0; i < AESBlocksize; i++)
6800b1cd1588a5019879935de2fb2fa869c96c86305cristy        p[i]^=output_block[i];
6810b1cd1588a5019879935de2fb2fa869c96c86305cristy      p+=AESBlocksize;
6820b1cd1588a5019879935de2fb2fa869c96c86305cristy    }
6830b1cd1588a5019879935de2fb2fa869c96c86305cristy    (void) CopyMagickMemory(output_block,input_block,AESBlocksize*
6840b1cd1588a5019879935de2fb2fa869c96c86305cristy      sizeof(*output_block));
6850b1cd1588a5019879935de2fb2fa869c96c86305cristy    EncipherAESBlock(aes_info,output_block,output_block);
686d9ecd04e9c567113b4b605cf76681cbb37c093cdcristy    for (i=0; x < (ssize_t) length; x++)
6870b1cd1588a5019879935de2fb2fa869c96c86305cristy    {
6880b1cd1588a5019879935de2fb2fa869c96c86305cristy      p[i]^=output_block[i];
6890b1cd1588a5019879935de2fb2fa869c96c86305cristy      i++;
6903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
6913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    (void) ImportQuantumPixels(image,image_view,quantum_info,quantum_type,
6923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      pixels,exception);
6933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    if (SyncCacheViewAuthenticPixels(image_view,exception) == MagickFalse)
6943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      break;
695bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy    proceed=SetImageProgress(image,DecipherImageTag,(MagickOffsetType) y,
696bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy      image->rows);
6973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    if (proceed == MagickFalse)
6983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      break;
6993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  }
7003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  image_view=DestroyCacheView(image_view);
7013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) DeleteImageProperty(image,"cipher:type");
7023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) DeleteImageProperty(image,"cipher:mode");
7033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) DeleteImageProperty(image,"cipher:nonce");
7043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  image->taint=MagickFalse;
7053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /*
7063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    Free resources.
7073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  */
7083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  quantum_info=DestroyQuantumInfo(quantum_info);
7093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  aes_info=DestroyAESInfo(aes_info);
7103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) ResetMagickMemory(input_block,0,sizeof(input_block));
7113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) ResetMagickMemory(output_block,0,sizeof(output_block));
712bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy  return(y == (ssize_t) image->rows ? MagickTrue : MagickFalse);
7133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
7143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
7153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
7163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
7173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
7183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
7193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
7203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%     P a s s k e y E n c i p h e r I m a g e                                 %
7213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
7223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
7233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
7243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
7253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
7263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  PasskeyEncipherImage() converts pixels to cipher-pixels.
7273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
7283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  The format of the PasskeyEncipherImage method is:
7293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
7303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      MagickBooleanType PasskeyEncipherImage(Image *image,
7313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%        const StringInfo *passkey,ExceptionInfo *exception)
7323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      MagickBooleanType EncipherImage(Image *image,const char *passphrase,
7333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%        ExceptionInfo *exception)
7343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
7353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  A description of each parameter follows:
7363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
7373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o image: the image.
7383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
7393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o passphrase: encipher pixels with this passphrase.
7403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
7413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o passkey: decrypt cipher pixels with this passkey.
7423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
7433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o exception: return any errors or warnings in this structure.
7443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
7453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
7463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
7473ed852eea50f9d4cd633efb8c2b054b8e33c253cristyMagickExport MagickBooleanType EncipherImage(Image *image,
7483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  const char *passphrase,ExceptionInfo *exception)
7493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
7503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  MagickBooleanType
7513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    status;
7523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
7533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  StringInfo
7543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *passkey;
7553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
7563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (passphrase == (const char *) NULL)
7573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    return(MagickTrue);
7583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  passkey=StringToStringInfo(passphrase);
7593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (passkey == (StringInfo *) NULL)
7603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    return(MagickFalse);
7613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  status=PasskeyEncipherImage(image,passkey,exception);
7623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  passkey=DestroyStringInfo(passkey);
7633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  return(status);
7643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
7653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
7663ed852eea50f9d4cd633efb8c2b054b8e33c253cristyMagickExport MagickBooleanType PasskeyEncipherImage(Image *image,
7673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  const StringInfo *passkey,ExceptionInfo *exception)
7683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
7693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#define EncipherImageTag  "Encipher/Image "
7703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
7713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  AESInfo
7723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *aes_info;
7733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
774c4c8d13c0996fea659ce63c682c803e74c1abc8acristy  CacheView
775c4c8d13c0996fea659ce63c682c803e74c1abc8acristy    *image_view;
776c4c8d13c0996fea659ce63c682c803e74c1abc8acristy
7773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  char
7783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *signature;
7793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
7803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  const unsigned char
7813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *digest;
7823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
7833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  MagickBooleanType
7843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    proceed;
7853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
7860b1cd1588a5019879935de2fb2fa869c96c86305cristy  MagickSizeType
7870b1cd1588a5019879935de2fb2fa869c96c86305cristy    extent;
7880b1cd1588a5019879935de2fb2fa869c96c86305cristy
7893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  QuantumInfo
7903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *quantum_info;
7913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
7923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  QuantumType
7933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    quantum_type;
7943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
7953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  register unsigned char
7963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *p;
7973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
7983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  SignatureInfo
7993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *signature_info;
8003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
8013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  size_t
8023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    length;
8033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
8049d314ff2c17a77996c05413c2013880387e50f0ecristy  ssize_t
8059d314ff2c17a77996c05413c2013880387e50f0ecristy    y;
8069d314ff2c17a77996c05413c2013880387e50f0ecristy
8073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  StringInfo
8083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *key,
8093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *nonce;
8103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
8113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  unsigned char
8123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    input_block[AESBlocksize],
8133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    output_block[AESBlocksize],
8143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *pixels;
8153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
8163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /*
8173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    Generate encipher key and nonce.
8183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  */
8193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(image != (Image *) NULL);
820e1c94d9d25db6b0dd7a5028ffee31d1057855d73cristy  assert(image->signature == MagickCoreSignature);
8213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (image->debug != MagickFalse)
8223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename);
8233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(exception != (ExceptionInfo *) NULL);
824e1c94d9d25db6b0dd7a5028ffee31d1057855d73cristy  assert(exception->signature == MagickCoreSignature);
8253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (passkey == (const StringInfo *) NULL)
8263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    return(MagickTrue);
827574cc26500992189f637cd1cdf93d0654e7df7aecristy  if (SetImageStorageClass(image,DirectClass,exception) == MagickFalse)
8283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    return(MagickFalse);
8293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  aes_info=AcquireAESInfo();
8303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  key=CloneStringInfo(passkey);
8313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (key == (StringInfo *) NULL)
8323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
8333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      aes_info=DestroyAESInfo(aes_info);
8343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      ThrowBinaryException(ResourceLimitError,"MemoryAllocationFailed",
8353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        image->filename);
8363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
837f6240ac7e3764dc806f59c17313e0a4d905820d8cristy  nonce=SplitStringInfo(key,GetStringInfoLength(key)/2);
8383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (nonce == (StringInfo *) NULL)
8393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
8403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      key=DestroyStringInfo(key);
8413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      aes_info=DestroyAESInfo(aes_info);
8423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      ThrowBinaryException(ResourceLimitError,"MemoryAllocationFailed",
8433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        image->filename);
8443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
845f6240ac7e3764dc806f59c17313e0a4d905820d8cristy  SetAESKey(aes_info,key);
846f6240ac7e3764dc806f59c17313e0a4d905820d8cristy  key=DestroyStringInfo(key);
8473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  signature_info=AcquireSignatureInfo();
848f6240ac7e3764dc806f59c17313e0a4d905820d8cristy  UpdateSignature(signature_info,nonce);
8490b1cd1588a5019879935de2fb2fa869c96c86305cristy  extent=(MagickSizeType) image->columns*image->rows;
8500b1cd1588a5019879935de2fb2fa869c96c86305cristy  SetStringInfoLength(nonce,sizeof(extent));
8510b1cd1588a5019879935de2fb2fa869c96c86305cristy  SetStringInfoDatum(nonce,(const unsigned char *) &extent);
8523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  UpdateSignature(signature_info,nonce);
8533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  nonce=DestroyStringInfo(nonce);
8543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  FinalizeSignature(signature_info);
8553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  signature=StringInfoToHexString(GetSignatureDigest(signature_info));
856d15e65928aec551b7388c2863de3e3e628e2e0ddcristy  (void) SetImageProperty(image,"cipher:type","AES",exception);
8570b1cd1588a5019879935de2fb2fa869c96c86305cristy  (void) SetImageProperty(image,"cipher:mode","CTR",exception);
858d15e65928aec551b7388c2863de3e3e628e2e0ddcristy  (void) SetImageProperty(image,"cipher:nonce",signature,exception);
8593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  signature=DestroyString(signature);
8600b1cd1588a5019879935de2fb2fa869c96c86305cristy  (void) ResetMagickMemory(input_block,0,sizeof(input_block));
8610b1cd1588a5019879935de2fb2fa869c96c86305cristy  digest=GetStringInfoDatum(GetSignatureDigest(signature_info));
8620b1cd1588a5019879935de2fb2fa869c96c86305cristy  (void) CopyMagickMemory(input_block,digest,MagickMin(AESBlocksize,
8630b1cd1588a5019879935de2fb2fa869c96c86305cristy    GetSignatureDigestsize(signature_info))*sizeof(*input_block));
8643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  signature_info=DestroySignatureInfo(signature_info);
8653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /*
8663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    Convert plain pixels to cipher pixels.
8673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  */
8685f766ef8b0cd9906c2c3a56d845828380a251073cristy  quantum_info=AcquireQuantumInfo((const ImageInfo *) NULL,image);
8690b1cd1588a5019879935de2fb2fa869c96c86305cristy  if (quantum_info == (QuantumInfo *) NULL)
8700b1cd1588a5019879935de2fb2fa869c96c86305cristy    {
8710b1cd1588a5019879935de2fb2fa869c96c86305cristy      aes_info=DestroyAESInfo(aes_info);
8720b1cd1588a5019879935de2fb2fa869c96c86305cristy      ThrowBinaryException(ResourceLimitError,"MemoryAllocationFailed",
8730b1cd1588a5019879935de2fb2fa869c96c86305cristy        image->filename);
8740b1cd1588a5019879935de2fb2fa869c96c86305cristy    }
8753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  quantum_type=GetQuantumType(image,exception);
876b3f97ae45019a91b30792a6fa42d81a2689a7025cristy  pixels=(unsigned char *) GetQuantumPixels(quantum_info);
87746ff2676b1044ea4101ac7a59b83289cd8f6cfdacristy  image_view=AcquireAuthenticCacheView(image,exception);
878bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy  for (y=0; y < (ssize_t) image->rows; y++)
8793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  {
880bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy    register ssize_t
8810b1cd1588a5019879935de2fb2fa869c96c86305cristy      i,
8823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      x;
8833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
8844c08aed51c5899665ade97263692328eea4af106cristy    register Quantum
88505d2ff7ebf21f659f5b11e45afb294e152f4330cdirk      *magick_restrict q;
8863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
8873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    q=GetCacheViewAuthenticPixels(image_view,0,y,image->columns,1,exception);
888acd2ed254c18c254a0ab5aafa06d1645e5d079d8cristy    if (q == (Quantum *) NULL)
8893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      break;
8903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    length=ExportQuantumPixels(image,image_view,quantum_info,quantum_type,
8913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      pixels,exception);
8923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    p=pixels;
8930b1cd1588a5019879935de2fb2fa869c96c86305cristy    for (x=0; x < (ssize_t) length; x+=AESBlocksize)
8943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
8953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      (void) CopyMagickMemory(output_block,input_block,AESBlocksize*
8963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        sizeof(*output_block));
8970b1cd1588a5019879935de2fb2fa869c96c86305cristy      IncrementCipherNonce(AESBlocksize,input_block);
8983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      EncipherAESBlock(aes_info,output_block,output_block);
8990b1cd1588a5019879935de2fb2fa869c96c86305cristy      for (i=0; i < AESBlocksize; i++)
9000b1cd1588a5019879935de2fb2fa869c96c86305cristy        p[i]^=output_block[i];
9010b1cd1588a5019879935de2fb2fa869c96c86305cristy      p+=AESBlocksize;
9020b1cd1588a5019879935de2fb2fa869c96c86305cristy    }
9030b1cd1588a5019879935de2fb2fa869c96c86305cristy    (void) CopyMagickMemory(output_block,input_block,AESBlocksize*
9040b1cd1588a5019879935de2fb2fa869c96c86305cristy      sizeof(*output_block));
9050b1cd1588a5019879935de2fb2fa869c96c86305cristy    EncipherAESBlock(aes_info,output_block,output_block);
906d9ecd04e9c567113b4b605cf76681cbb37c093cdcristy    for (i=0; x < (ssize_t) length; x++)
9070b1cd1588a5019879935de2fb2fa869c96c86305cristy    {
9080b1cd1588a5019879935de2fb2fa869c96c86305cristy      p[i]^=output_block[i];
9090b1cd1588a5019879935de2fb2fa869c96c86305cristy      i++;
9103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
9113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    (void) ImportQuantumPixels(image,image_view,quantum_info,quantum_type,
9123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      pixels,exception);
9133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    if (SyncCacheViewAuthenticPixels(image_view,exception) == MagickFalse)
9143ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      break;
915bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy    proceed=SetImageProgress(image,EncipherImageTag,(MagickOffsetType) y,
916bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy      image->rows);
9173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    if (proceed == MagickFalse)
9183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      break;
9193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  }
9203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  image_view=DestroyCacheView(image_view);
9213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  image->taint=MagickFalse;
9223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /*
9233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    Free resources.
9243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  */
9253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  quantum_info=DestroyQuantumInfo(quantum_info);
9263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  aes_info=DestroyAESInfo(aes_info);
9273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) ResetMagickMemory(input_block,0,sizeof(input_block));
9283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) ResetMagickMemory(output_block,0,sizeof(output_block));
929bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy  return(y == (ssize_t) image->rows ? MagickTrue : MagickFalse);
9303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
9313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
9323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
9333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
9343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
9353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
9363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
9373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%   S e t A E S K e y                                                         %
9383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
9393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
9403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
9413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
9423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
9433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  SetAESKey() sets the key for the AES cipher.  The key length is specified
9443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  in bits.  Valid values are 128, 192, or 256 requiring a key buffer length
9453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  in bytes of 16, 24, and 32 respectively.
9463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
9473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  The format of the SetAESKey method is:
9483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
9493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      SetAESKey(AESInfo *aes_info,const StringInfo *key)
9503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
9513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  A description of each parameter follows:
9523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
9533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o aes_info: the cipher context.
9543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
9553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o key: the key.
9563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
9573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
9583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
9593ed852eea50f9d4cd633efb8c2b054b8e33c253cristystatic inline void InverseAddRoundKey(const unsigned int *alpha,
9603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  unsigned int *beta)
9613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
9623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  register unsigned int
9633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    i,
9643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    j;
9653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
9663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  for (i=0; i < 4; i++)
9673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  {
9683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    beta[i]=0;
9693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    for (j=0; j < 4; j++)
9703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      beta[i]|=(ByteMultiply(0xe,(alpha[i] >> (8*j)) & 0xff) ^
9713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        ByteMultiply(0xb,(alpha[i] >> (8*((j+1) % 4))) & 0xff) ^
9723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        ByteMultiply(0xd,(alpha[i] >> (8*((j+2) % 4))) & 0xff) ^
9733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        ByteMultiply(0x9,(alpha[i] >> (8*((j+3) % 4))) & 0xff)) << (8*j);
9743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  }
9753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
9763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
9773ed852eea50f9d4cd633efb8c2b054b8e33c253cristystatic inline unsigned int XTime(unsigned char alpha)
9783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
9793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  unsigned char
9803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    beta;
9813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
9823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  beta=(unsigned char) ((alpha & 0x80) != 0 ? 0x1b : 0);
9833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  alpha<<=1;
9843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  alpha^=beta;
9853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  return(alpha);
9863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
9873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
9883ed852eea50f9d4cd633efb8c2b054b8e33c253cristystatic inline unsigned int RotateRight(const unsigned int x)
9893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
9903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  return((x >> 8) | ((x & 0xff) << 24));
9913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
9923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
9933ed852eea50f9d4cd633efb8c2b054b8e33c253cristystatic void SetAESKey(AESInfo *aes_info,const StringInfo *key)
9943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
9959d314ff2c17a77996c05413c2013880387e50f0ecristy  register ssize_t
9969d314ff2c17a77996c05413c2013880387e50f0ecristy    i;
9979d314ff2c17a77996c05413c2013880387e50f0ecristy
998bb50337b2a8a16ca7e903cc04ab195ff0fd47ae6cristy  ssize_t
9993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    bytes,
10003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    n;
10013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
10023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  unsigned char
10033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    *datum;
10043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
10053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  unsigned int
10063ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    alpha,
10073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    beta;
10083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
10093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /*
10103ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    Determine the number of rounds based on the number of bits in key.
10113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  */
10123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) LogMagickEvent(TraceEvent,GetMagickModule(),"...");
10133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(aes_info != (AESInfo *) NULL);
1014e1c94d9d25db6b0dd7a5028ffee31d1057855d73cristy  assert(aes_info->signature == MagickCoreSignature);
10153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(key != (StringInfo *) NULL);
10163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  n=4;
10173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  aes_info->rounds=10;
10183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if ((8*GetStringInfoLength(key)) >= 256)
10193ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    {
10203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      n=8;
10213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      aes_info->rounds=14;
10223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    }
10233ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  else
10243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    if ((8*GetStringInfoLength(key)) >= 192)
10253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
10263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        n=6;
10273ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        aes_info->rounds=12;
10283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
10293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /*
10303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    Generate crypt key.
10313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  */
10323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  datum=GetStringInfoDatum(aes_info->key);
10333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) ResetMagickMemory(datum,0,GetStringInfoLength(aes_info->key));
10343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) CopyMagickMemory(datum,GetStringInfoDatum(key),MagickMin(
10353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    GetStringInfoLength(key),GetStringInfoLength(aes_info->key)));
10363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  for (i=0; i < n; i++)
10373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    aes_info->encipher_key[i]=datum[4*i] | (datum[4*i+1] << 8) |
10383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      (datum[4*i+2] << 16) | (datum[4*i+3] << 24);
10393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  beta=1;
10403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  bytes=(AESBlocksize/4)*(aes_info->rounds+1);
10413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  for (i=n; i < bytes; i++)
10423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  {
10433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    alpha=aes_info->encipher_key[i-1];
10443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    if ((i % n) == 0)
10453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      {
10463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        alpha=ByteSubTransform(RotateRight(alpha),SBox) ^ beta;
10473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        beta=XTime((unsigned char) (beta & 0xff));
10483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      }
10493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    else
10503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy      if ((n > 6) && ((i % n) == 4))
10513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy        alpha=ByteSubTransform(alpha,SBox);
10523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    aes_info->encipher_key[i]=aes_info->encipher_key[i-n] ^ alpha;
10533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  }
10543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /*
10553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    Generate deciper key (in reverse order).
10563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  */
10573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  for (i=0; i < 4; i++)
10583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  {
10593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    aes_info->decipher_key[i]=aes_info->encipher_key[i];
10603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    aes_info->decipher_key[bytes-4+i]=aes_info->encipher_key[bytes-4+i];
10613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  }
10623ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  for (i=4; i < (bytes-4); i+=4)
10633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    InverseAddRoundKey(aes_info->encipher_key+i,aes_info->decipher_key+i);
10643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  /*
10653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    Reset registers.
10663ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  */
10673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  datum=GetStringInfoDatum(aes_info->key);
10683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) ResetMagickMemory(datum,0,GetStringInfoLength(aes_info->key));
10693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  alpha=0;
10703ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  beta=0;
10713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
10723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#else
10733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
10743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
10753ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
10763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
10773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
10783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
10793ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%     P a s s k e y D e c i p h e r I m a g e                                 %
10803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
10813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
10823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
10833ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
10843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
10853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  PasskeyDecipherImage() converts cipher pixels to plain pixels.
10863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
10873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  The format of the PasskeyDecipherImage method is:
10883ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
10893ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      MagickBooleanType PasskeyDecipherImage(Image *image,
10903ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%        const StringInfo *passkey,ExceptionInfo *exception)
10913ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      MagickBooleanType DecipherImage(Image *image,const char *passphrase,
10923ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%        ExceptionInfo *exception)
10933ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
10943ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  A description of each parameter follows:
10953ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
10963ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o image: the image.
10973ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
10983ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o passphrase: decipher cipher pixels with this passphrase.
10993ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
11003ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o passkey: decrypt cipher pixels with this passkey.
11013ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
11023ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o exception: return any errors or warnings in this structure.
11033ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
11043ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
11053ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
11063ed852eea50f9d4cd633efb8c2b054b8e33c253cristyMagickExport MagickBooleanType DecipherImage(Image *image,
11073ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  const char *passphrase,ExceptionInfo *exception)
11083ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
11093ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(image != (Image *) NULL);
1110e1c94d9d25db6b0dd7a5028ffee31d1057855d73cristy  assert(image->signature == MagickCoreSignature);
11113ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (image->debug != MagickFalse)
11123ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename);
11133ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(exception != (ExceptionInfo *) NULL);
1114e1c94d9d25db6b0dd7a5028ffee31d1057855d73cristy  assert(exception->signature == MagickCoreSignature);
11153ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) passphrase;
11163ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  ThrowBinaryException(ImageError,"CipherSupportNotEnabled",image->filename);
11173ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
11183ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
11193ed852eea50f9d4cd633efb8c2b054b8e33c253cristyMagickExport MagickBooleanType PasskeyDecipherImage(Image *image,
11203ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  const StringInfo *passkey,ExceptionInfo *exception)
11213ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
11223ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(image != (Image *) NULL);
1123e1c94d9d25db6b0dd7a5028ffee31d1057855d73cristy  assert(image->signature == MagickCoreSignature);
11243ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (image->debug != MagickFalse)
11253ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename);
11263ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(exception != (ExceptionInfo *) NULL);
1127e1c94d9d25db6b0dd7a5028ffee31d1057855d73cristy  assert(exception->signature == MagickCoreSignature);
11283ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) passkey;
11293ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  ThrowBinaryException(ImageError,"CipherSupportNotEnabled",image->filename);
11303ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
11313ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
11323ed852eea50f9d4cd633efb8c2b054b8e33c253cristy/*
11333ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
11343ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
11353ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
11363ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
11373ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%     P a s s k e y E n c i p h e r I m a g e                                 %
11383ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
11393ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
11403ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%                                                                             %
11413ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
11423ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
11433ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  PasskeyEncipherImage() converts pixels to cipher-pixels.
11443ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
11453ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  The format of the PasskeyEncipherImage method is:
11463ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
11473ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      MagickBooleanType PasskeyEncipherImage(Image *image,
11483ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%        const StringInfo *passkey,ExceptionInfo *exception)
11493ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%      MagickBooleanType EncipherImage(Image *image,const char *passphrase,
11503ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%        ExceptionInfo *exception)
11513ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
11523ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%  A description of each parameter follows:
11533ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
11543ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o passphrase: decipher cipher pixels with this passphrase.
11553ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
11563ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o passkey: decrypt cipher pixels with this passkey.
11573ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
11583ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%    o exception: return any errors or warnings in this structure.
11593ed852eea50f9d4cd633efb8c2b054b8e33c253cristy%
11603ed852eea50f9d4cd633efb8c2b054b8e33c253cristy*/
11613ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
11623ed852eea50f9d4cd633efb8c2b054b8e33c253cristyMagickExport MagickBooleanType EncipherImage(Image *image,
11633ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  const char *passphrase,ExceptionInfo *exception)
11643ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
11653ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(image != (Image *) NULL);
1166e1c94d9d25db6b0dd7a5028ffee31d1057855d73cristy  assert(image->signature == MagickCoreSignature);
11673ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (image->debug != MagickFalse)
11683ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename);
11693ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(exception != (ExceptionInfo *) NULL);
1170e1c94d9d25db6b0dd7a5028ffee31d1057855d73cristy  assert(exception->signature == MagickCoreSignature);
11713ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) passphrase;
11723ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  ThrowBinaryException(ImageError,"CipherSupportNotEnabled",image->filename);
11733ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
11743ed852eea50f9d4cd633efb8c2b054b8e33c253cristy
11753ed852eea50f9d4cd633efb8c2b054b8e33c253cristyMagickExport MagickBooleanType PasskeyEncipherImage(Image *image,
11763ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  const StringInfo *passkey,ExceptionInfo *exception)
11773ed852eea50f9d4cd633efb8c2b054b8e33c253cristy{
11783ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(image != (Image *) NULL);
1179e1c94d9d25db6b0dd7a5028ffee31d1057855d73cristy  assert(image->signature == MagickCoreSignature);
11803ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  if (image->debug != MagickFalse)
11813ed852eea50f9d4cd633efb8c2b054b8e33c253cristy    (void) LogMagickEvent(TraceEvent,GetMagickModule(),"%s",image->filename);
11823ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  assert(exception != (ExceptionInfo *) NULL);
1183e1c94d9d25db6b0dd7a5028ffee31d1057855d73cristy  assert(exception->signature == MagickCoreSignature);
11843ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  (void) passkey;
11853ed852eea50f9d4cd633efb8c2b054b8e33c253cristy  ThrowBinaryException(ImageError,"CipherSupportNotEnabled",image->filename);
11863ed852eea50f9d4cd633efb8c2b054b8e33c253cristy}
11873ed852eea50f9d4cd633efb8c2b054b8e33c253cristy#endif
1188