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