|
WizardsToolkit
1.0.7
|
00001 /* 00002 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 00003 % % 00004 % % 00005 % SSSSS H H AAA % 00006 % SS H H A A % 00007 % SSS HHHHH AAAAA % 00008 % SS H H A A % 00009 % SSSSS H H A A % 00010 % % 00011 % % 00012 % Wizard's Toolkit Secure Hash Algorithm-512 Methods % 00013 % % 00014 % Software Design % 00015 % John Cristy % 00016 % March 2003 % 00017 % % 00018 % % 00019 % Copyright 1999-2011 ImageMagick Studio LLC, a non-profit organization % 00020 % dedicated to making software imaging solutions freely available. % 00021 % % 00022 % You may not use this file except in compliance with the License. You may % 00023 % obtain a copy of the License at % 00024 % % 00025 % http://www.wizards-toolkit.org/script/license.php % 00026 % % 00027 % Unless required by applicable law or agreed to in writing, software % 00028 % distributed under the License is distributed on an "AS IS" BASIS, % 00029 % WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. % 00030 % See the License for the specific language governing permissions and % 00031 % limitations under the License. % 00032 % % 00033 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 00034 % 00035 % See http://csrc.nist.gov/cryptval/shs.htm. 00036 % 00037 */ 00038 00039 /* 00040 Include declarations. 00041 */ 00042 #include "wizard/studio.h" 00043 #include "wizard/exception.h" 00044 #include "wizard/exception-private.h" 00045 #include "wizard/memory_.h" 00046 #include "wizard/sha512.h" 00047 /* 00048 Define declarations. 00049 */ 00050 #define SHA512Blocksize 128 00051 #define SHA512Digestsize 64 00052 00053 /* 00054 Typedef declarations. 00055 */ 00056 struct _SHA512Info 00057 { 00058 unsigned int 00059 digestsize, 00060 blocksize; 00061 00062 StringInfo 00063 *digest, 00064 *message; 00065 00066 WizardSizeType 00067 *accumulator, 00068 low_order, 00069 high_order; 00070 00071 size_t 00072 offset; 00073 00074 WizardBooleanType 00075 lsb_first; 00076 00077 time_t 00078 timestamp; 00079 00080 size_t 00081 signature; 00082 }; 00083 00084 /* 00085 Forward declarations. 00086 */ 00087 static void 00088 TransformSHA512(SHA512Info *); 00089 00090 /* 00091 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 00092 % % 00093 % % 00094 % % 00095 % A c q u i r e S H A I n f o % 00096 % % 00097 % % 00098 % % 00099 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 00100 % 00101 % AcquireSHA512Info() allocate the SHA512Info structure. 00102 % 00103 % The format of the AcquireSHA512Info method is: 00104 % 00105 % SHA512Info *AcquireSHA512Info(void) 00106 % 00107 */ 00108 WizardExport SHA512Info *AcquireSHA512Info(void) 00109 { 00110 SHA512Info 00111 *sha_info; 00112 00113 unsigned int 00114 lsb_first; 00115 00116 sha_info=(SHA512Info *) AcquireWizardMemory(sizeof(*sha_info)); 00117 if (sha_info == (SHA512Info *) NULL) 00118 ThrowWizardFatalError(HashError,MemoryError); 00119 (void) ResetWizardMemory(sha_info,0,sizeof(*sha_info)); 00120 sha_info->digestsize=SHA512Digestsize; 00121 sha_info->blocksize=SHA512Blocksize; 00122 sha_info->digest=AcquireStringInfo(SHA512Digestsize); 00123 sha_info->message=AcquireStringInfo(SHA512Blocksize); 00124 sha_info->accumulator=(WizardSizeType *) AcquireQuantumMemory(SHA512Blocksize, 00125 sizeof(*sha_info->accumulator)); 00126 if (sha_info->accumulator == (WizardSizeType *) NULL) 00127 ThrowWizardFatalError(HashError,MemoryError); 00128 lsb_first=1; 00129 sha_info->lsb_first=(int) 00130 (*(char *) &lsb_first) == 1 ? WizardTrue : WizardFalse; 00131 sha_info->timestamp=time((time_t *) NULL); 00132 sha_info->signature=WizardSignature; 00133 InitializeSHA512(sha_info); 00134 return(sha_info); 00135 } 00136 00137 /* 00138 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 00139 % % 00140 % % 00141 % % 00142 % D e s t r o y S H A I n f o % 00143 % % 00144 % % 00145 % % 00146 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 00147 % 00148 % DestroySHA512Info() zeros memory associated with the SHA512Info structure. 00149 % 00150 % The format of the DestroySHA512Info method is: 00151 % 00152 % SHA512Info *DestroySHA512Info(SHA512Info *sha_info) 00153 % 00154 % A description of each parameter follows: 00155 % 00156 % o sha_info: The cipher sha_info. 00157 % 00158 */ 00159 WizardExport SHA512Info *DestroySHA512Info(SHA512Info *sha_info) 00160 { 00161 (void) LogWizardEvent(TraceEvent,GetWizardModule(),"..."); 00162 assert(sha_info != (SHA512Info *) NULL); 00163 assert(sha_info->signature == WizardSignature); 00164 if (sha_info->accumulator != (WizardSizeType *) NULL) 00165 sha_info->accumulator=(WizardSizeType *) 00166 RelinquishWizardMemory(sha_info->accumulator); 00167 if (sha_info->message != (StringInfo *) NULL) 00168 sha_info->message=DestroyStringInfo(sha_info->message); 00169 if (sha_info->digest != (StringInfo *) NULL) 00170 sha_info->digest=DestroyStringInfo(sha_info->digest); 00171 sha_info->signature=(~WizardSignature); 00172 sha_info=(SHA512Info *) RelinquishWizardMemory(sha_info); 00173 return(sha_info); 00174 } 00175 00176 /* 00177 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 00178 % % 00179 % % 00180 % % 00181 % F i n a l i z e S H A % 00182 % % 00183 % % 00184 % % 00185 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 00186 % 00187 % FinalizeSHA512() finalizes the SHA512 message accumulator computation. 00188 % 00189 % The format of the FinalizeSHA512 method is: 00190 % 00191 % FinalizeSHA512(SHA512Info *sha_info) 00192 % 00193 % A description of each parameter follows: 00194 % 00195 % o sha_info: The address of a structure of type SHA512Info. 00196 % 00197 % 00198 */ 00199 WizardExport void FinalizeSHA512(SHA512Info *sha_info) 00200 { 00201 WizardOffsetType 00202 count; 00203 00204 register ssize_t 00205 i; 00206 00207 register unsigned char 00208 *q; 00209 00210 register WizardSizeType 00211 *p; 00212 00213 unsigned char 00214 *datum; 00215 00216 WizardSizeType 00217 high_order, 00218 low_order; 00219 00220 /* 00221 Add padding and return the message accumulator. 00222 */ 00223 (void) LogWizardEvent(TraceEvent,GetWizardModule(),"..."); 00224 assert(sha_info != (SHA512Info *) NULL); 00225 assert(sha_info->signature == WizardSignature); 00226 low_order=sha_info->low_order; 00227 high_order=sha_info->high_order; 00228 count=(WizardOffsetType) ((low_order >> 3) & 0x7f); 00229 datum=GetStringInfoDatum(sha_info->message); 00230 datum[count++]=(unsigned char) 0x80; 00231 if (count <= (WizardOffsetType) (GetStringInfoLength(sha_info->message)-16)) 00232 (void) ResetWizardMemory(datum+count,0,(size_t) (GetStringInfoLength( 00233 sha_info->message)-16-count)); 00234 else 00235 { 00236 (void) ResetWizardMemory(datum+count,0,(size_t) (GetStringInfoLength( 00237 sha_info->message)-count)); 00238 TransformSHA512(sha_info); 00239 (void) ResetWizardMemory(datum,0,GetStringInfoLength(sha_info->message)- 00240 16); 00241 } 00242 datum[112]=(unsigned char) (high_order >> 56); 00243 datum[113]=(unsigned char) (high_order >> 48); 00244 datum[114]=(unsigned char) (high_order >> 40); 00245 datum[115]=(unsigned char) (high_order >> 32); 00246 datum[116]=(unsigned char) (high_order >> 24); 00247 datum[117]=(unsigned char) (high_order >> 16); 00248 datum[118]=(unsigned char) (high_order >> 8); 00249 datum[119]=(unsigned char) high_order; 00250 datum[120]=(unsigned char) (low_order >> 56); 00251 datum[121]=(unsigned char) (low_order >> 48); 00252 datum[122]=(unsigned char) (low_order >> 40); 00253 datum[123]=(unsigned char) (low_order >> 32); 00254 datum[124]=(unsigned char) (low_order >> 24); 00255 datum[125]=(unsigned char) (low_order >> 16); 00256 datum[126]=(unsigned char) (low_order >> 8); 00257 datum[127]=(unsigned char) low_order; 00258 TransformSHA512(sha_info); 00259 p=sha_info->accumulator; 00260 q=GetStringInfoDatum(sha_info->digest); 00261 for (i=0; i < (SHA512Digestsize/8); i++) 00262 { 00263 *q++=(unsigned char) ((*p >> 56) & 0xff); 00264 *q++=(unsigned char) ((*p >> 48) & 0xff); 00265 *q++=(unsigned char) ((*p >> 40) & 0xff); 00266 *q++=(unsigned char) ((*p >> 32) & 0xff); 00267 *q++=(unsigned char) ((*p >> 24) & 0xff); 00268 *q++=(unsigned char) ((*p >> 16) & 0xff); 00269 *q++=(unsigned char) ((*p >> 8) & 0xff); 00270 *q++=(unsigned char) (*p & 0xff); 00271 p++; 00272 } 00273 /* 00274 Reset working registers. 00275 */ 00276 count=0; 00277 high_order=0; 00278 low_order=0; 00279 } 00280 00281 /* 00282 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 00283 % % 00284 % % 00285 % % 00286 % G e t S H A 5 1 2 B l o c k s i z e % 00287 % % 00288 % % 00289 % % 00290 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 00291 % 00292 % GetSHA512Blocksize() returns the SHA512 blocksize. 00293 % 00294 % The format of the GetSHA512Blocksize method is: 00295 % 00296 % unsigned int *GetSHA512Blocksize(const SHA512Info *sha512_info) 00297 % 00298 % A description of each parameter follows: 00299 % 00300 % o sha512_info: The shaa info. 00301 % 00302 */ 00303 WizardExport unsigned int GetSHA512Blocksize(const SHA512Info *sha512_info) 00304 { 00305 (void) LogWizardEvent(TraceEvent,GetWizardModule(),"..."); 00306 WizardAssert(CipherDomain,sha512_info != (SHA512Info *) NULL); 00307 WizardAssert(CipherDomain,sha512_info->signature == WizardSignature); 00308 return(sha512_info->blocksize); 00309 } 00310 00311 /* 00312 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 00313 % % 00314 % % 00315 % % 00316 % G e t S H A 5 1 2 D i g e s t % 00317 % % 00318 % % 00319 % % 00320 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 00321 % 00322 % GetSHA512Digest() returns the SHA512 digest. 00323 % 00324 % The format of the GetSHA512Digest method is: 00325 % 00326 % const StringInfo *GetSHA512Digest(const SHA512Info *sha512_info) 00327 % 00328 % A description of each parameter follows: 00329 % 00330 % o sha512_info: The shaa info. 00331 % 00332 */ 00333 WizardExport const StringInfo *GetSHA512Digest(const SHA512Info *sha512_info) 00334 { 00335 (void) LogWizardEvent(TraceEvent,GetWizardModule(),"..."); 00336 WizardAssert(HashDomain,sha512_info != (SHA512Info *) NULL); 00337 WizardAssert(HashDomain,sha512_info->signature == WizardSignature); 00338 return(sha512_info->digest); 00339 } 00340 00341 /* 00342 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 00343 % % 00344 % % 00345 % % 00346 % G e t S H A 5 1 2 D i g e s t s i z e % 00347 % % 00348 % % 00349 % % 00350 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 00351 % 00352 % GetSHA512Digestsize() returns the SHA512 digest size. 00353 % 00354 % The format of the GetSHA512Digestsize method is: 00355 % 00356 % unsigned int *GetSHA512Digestsize(const SHA512Info *sha512_info) 00357 % 00358 % A description of each parameter follows: 00359 % 00360 % o sha512_info: The shaa info. 00361 % 00362 */ 00363 WizardExport unsigned int GetSHA512Digestsize(const SHA512Info *sha512_info) 00364 { 00365 (void) LogWizardEvent(TraceEvent,GetWizardModule(),"..."); 00366 WizardAssert(CipherDomain,sha512_info != (SHA512Info *) NULL); 00367 WizardAssert(CipherDomain,sha512_info->signature == WizardSignature); 00368 return(sha512_info->digestsize); 00369 } 00370 00371 /* 00372 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 00373 % % 00374 % % 00375 % % 00376 % I n i t i a l i z e S H A % 00377 % % 00378 % % 00379 % % 00380 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 00381 % 00382 % IntializeSHA512() intializes the SHA512 accumulator. 00383 % 00384 % The format of the DestroySHA512Info method is: 00385 % 00386 % void InitializeSHA512Info(SHA512Info *sha_info) 00387 % 00388 % A description of each parameter follows: 00389 % 00390 % o sha_info: The cipher sha_info. 00391 % 00392 */ 00393 WizardExport void InitializeSHA512(SHA512Info *sha_info) 00394 { 00395 (void) LogWizardEvent(TraceEvent,GetWizardModule(),"..."); 00396 assert(sha_info != (SHA512Info *) NULL); 00397 assert(sha_info->signature == WizardSignature); 00398 sha_info->accumulator[0]=WizardULLConstant(0x6a09e667f3bcc908); 00399 sha_info->accumulator[1]=WizardULLConstant(0xbb67ae8584caa73b); 00400 sha_info->accumulator[2]=WizardULLConstant(0x3c6ef372fe94f82b); 00401 sha_info->accumulator[3]=WizardULLConstant(0xa54ff53a5f1d36f1); 00402 sha_info->accumulator[4]=WizardULLConstant(0x510e527fade682d1); 00403 sha_info->accumulator[5]=WizardULLConstant(0x9b05688c2b3e6c1f); 00404 sha_info->accumulator[6]=WizardULLConstant(0x1f83d9abfb41bd6b); 00405 sha_info->accumulator[7]=WizardULLConstant(0x5be0cd19137e2179); 00406 sha_info->low_order=0; 00407 sha_info->high_order=0; 00408 sha_info->offset=0; 00409 } 00410 00411 /* 00412 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 00413 % % 00414 % % 00415 % % 00416 % T r a n s f o r m S H A % 00417 % % 00418 % % 00419 % % 00420 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 00421 % 00422 % TransformSHA512() transforms the SHA512 message accumulator. 00423 % 00424 % The format of the TransformSHA512 method is: 00425 % 00426 % TransformSHA512(SHA512Info *sha_info) 00427 % 00428 % A description of each parameter follows: 00429 % 00430 % o sha_info: The address of a structure of type SHA512Info. 00431 % 00432 % 00433 */ 00434 00435 static inline WizardSizeType Ch(WizardSizeType x,WizardSizeType y,WizardSizeType z) 00436 { 00437 return((x & y) ^ (~x & z)); 00438 } 00439 00440 static inline WizardSizeType Maj(WizardSizeType x, WizardSizeType y,WizardSizeType z) 00441 { 00442 return((x & y) ^ (x & z) ^ (y & z)); 00443 } 00444 00445 static inline WizardSizeType Trunc64(WizardSizeType x) 00446 { 00447 return((WizardSizeType) (x & WizardULLConstant(0xffffffffffffffff))); 00448 } 00449 00450 static WizardSizeType RotateRight(WizardSizeType x,WizardSizeType n) 00451 { 00452 return(Trunc64((x >> n) | (x << (64-n)))); 00453 } 00454 00455 static void TransformSHA512(SHA512Info *sha_info) 00456 { 00457 #define Sigma0(x) (RotateRight(x,1) ^ RotateRight(x,8) ^ Trunc64((x) >> 7)) 00458 #define Sigma1(x) (RotateRight(x,19) ^ RotateRight(x,61) ^ Trunc64((x) >> 6)) 00459 #define Suma0(x) (RotateRight(x,28) ^ RotateRight(x,34) ^ RotateRight(x,39)) 00460 #define Suma1(x) (RotateRight(x,14) ^ RotateRight(x,18) ^ RotateRight(x,41)) 00461 00462 ssize_t 00463 j; 00464 00465 register ssize_t 00466 i; 00467 00468 register unsigned char 00469 *p; 00470 00471 static WizardSizeType 00472 K[80] = 00473 { 00474 WizardULLConstant(0x428a2f98d728ae22), 00475 WizardULLConstant(0x7137449123ef65cd), 00476 WizardULLConstant(0xb5c0fbcfec4d3b2f), 00477 WizardULLConstant(0xe9b5dba58189dbbc), 00478 WizardULLConstant(0x3956c25bf348b538), 00479 WizardULLConstant(0x59f111f1b605d019), 00480 WizardULLConstant(0x923f82a4af194f9b), 00481 WizardULLConstant(0xab1c5ed5da6d8118), 00482 WizardULLConstant(0xd807aa98a3030242), 00483 WizardULLConstant(0x12835b0145706fbe), 00484 WizardULLConstant(0x243185be4ee4b28c), 00485 WizardULLConstant(0x550c7dc3d5ffb4e2), 00486 WizardULLConstant(0x72be5d74f27b896f), 00487 WizardULLConstant(0x80deb1fe3b1696b1), 00488 WizardULLConstant(0x9bdc06a725c71235), 00489 WizardULLConstant(0xc19bf174cf692694), 00490 WizardULLConstant(0xe49b69c19ef14ad2), 00491 WizardULLConstant(0xefbe4786384f25e3), 00492 WizardULLConstant(0x0fc19dc68b8cd5b5), 00493 WizardULLConstant(0x240ca1cc77ac9c65), 00494 WizardULLConstant(0x2de92c6f592b0275), 00495 WizardULLConstant(0x4a7484aa6ea6e483), 00496 WizardULLConstant(0x5cb0a9dcbd41fbd4), 00497 WizardULLConstant(0x76f988da831153b5), 00498 WizardULLConstant(0x983e5152ee66dfab), 00499 WizardULLConstant(0xa831c66d2db43210), 00500 WizardULLConstant(0xb00327c898fb213f), 00501 WizardULLConstant(0xbf597fc7beef0ee4), 00502 WizardULLConstant(0xc6e00bf33da88fc2), 00503 WizardULLConstant(0xd5a79147930aa725), 00504 WizardULLConstant(0x06ca6351e003826f), 00505 WizardULLConstant(0x142929670a0e6e70), 00506 WizardULLConstant(0x27b70a8546d22ffc), 00507 WizardULLConstant(0x2e1b21385c26c926), 00508 WizardULLConstant(0x4d2c6dfc5ac42aed), 00509 WizardULLConstant(0x53380d139d95b3df), 00510 WizardULLConstant(0x650a73548baf63de), 00511 WizardULLConstant(0x766a0abb3c77b2a8), 00512 WizardULLConstant(0x81c2c92e47edaee6), 00513 WizardULLConstant(0x92722c851482353b), 00514 WizardULLConstant(0xa2bfe8a14cf10364), 00515 WizardULLConstant(0xa81a664bbc423001), 00516 WizardULLConstant(0xc24b8b70d0f89791), 00517 WizardULLConstant(0xc76c51a30654be30), 00518 WizardULLConstant(0xd192e819d6ef5218), 00519 WizardULLConstant(0xd69906245565a910), 00520 WizardULLConstant(0xf40e35855771202a), 00521 WizardULLConstant(0x106aa07032bbd1b8), 00522 WizardULLConstant(0x19a4c116b8d2d0c8), 00523 WizardULLConstant(0x1e376c085141ab53), 00524 WizardULLConstant(0x2748774cdf8eeb99), 00525 WizardULLConstant(0x34b0bcb5e19b48a8), 00526 WizardULLConstant(0x391c0cb3c5c95a63), 00527 WizardULLConstant(0x4ed8aa4ae3418acb), 00528 WizardULLConstant(0x5b9cca4f7763e373), 00529 WizardULLConstant(0x682e6ff3d6b2b8a3), 00530 WizardULLConstant(0x748f82ee5defb2fc), 00531 WizardULLConstant(0x78a5636f43172f60), 00532 WizardULLConstant(0x84c87814a1f0ab72), 00533 WizardULLConstant(0x8cc702081a6439ec), 00534 WizardULLConstant(0x90befffa23631e28), 00535 WizardULLConstant(0xa4506cebde82bde9), 00536 WizardULLConstant(0xbef9a3f7b2c67915), 00537 WizardULLConstant(0xc67178f2e372532b), 00538 WizardULLConstant(0xca273eceea26619c), 00539 WizardULLConstant(0xd186b8c721c0c207), 00540 WizardULLConstant(0xeada7dd6cde0eb1e), 00541 WizardULLConstant(0xf57d4f7fee6ed178), 00542 WizardULLConstant(0x06f067aa72176fba), 00543 WizardULLConstant(0x0a637dc5a2c898a6), 00544 WizardULLConstant(0x113f9804bef90dae), 00545 WizardULLConstant(0x1b710b35131c471b), 00546 WizardULLConstant(0x28db77f523047d84), 00547 WizardULLConstant(0x32caab7b40c72493), 00548 WizardULLConstant(0x3c9ebe0a15c9bebc), 00549 WizardULLConstant(0x431d67c49c100d4c), 00550 WizardULLConstant(0x4cc5d4becb3e42b6), 00551 WizardULLConstant(0x597f299cfc657e2a), 00552 WizardULLConstant(0x5fcb6fab3ad6faec), 00553 WizardULLConstant(0x6c44198c4a475817) 00554 }; /* 64-bit fractional part of the cube root of the first 64 primes */ 00555 00556 WizardSizeType 00557 A, 00558 B, 00559 C, 00560 D, 00561 E, 00562 F, 00563 G, 00564 H, 00565 T, 00566 T1, 00567 T2, 00568 W[80]; 00569 00570 p=GetStringInfoDatum(sha_info->message); 00571 if (sha_info->lsb_first == WizardFalse) 00572 for (i=0; i < 16; i++) 00573 { 00574 T=(*((WizardSizeType *) p)); 00575 p+=8; 00576 W[i]=(T); 00577 } 00578 else 00579 { 00580 for (i=0; i < 16; i++) 00581 { 00582 T=(*((WizardSizeType *) p)); 00583 p+=8; 00584 W[i]=(WizardSizeType) 00585 (((T << 56) & WizardULLConstant(0xff00000000000000)) | 00586 ((T << 40) & WizardULLConstant(0x00ff000000000000)) | 00587 ((T << 24) & WizardULLConstant(0x0000ff0000000000)) | 00588 ((T << 8) & WizardULLConstant(0x000000ff00000000)) | 00589 ((T >> 8) & WizardULLConstant(0x00000000ff000000)) | 00590 ((T >> 24) & WizardULLConstant(0x0000000000ff0000)) | 00591 ((T >> 40) & WizardULLConstant(0x000000000000ff00)) | 00592 ((T >> 56) & WizardULLConstant(0x00000000000000ff))); 00593 } 00594 } 00595 /* 00596 Copy accumulator to registers. 00597 */ 00598 A=sha_info->accumulator[0]; 00599 B=sha_info->accumulator[1]; 00600 C=sha_info->accumulator[2]; 00601 D=sha_info->accumulator[3]; 00602 E=sha_info->accumulator[4]; 00603 F=sha_info->accumulator[5]; 00604 G=sha_info->accumulator[6]; 00605 H=sha_info->accumulator[7]; 00606 for (i=16; i < 80; i++) 00607 W[i]=Trunc64(Sigma1(W[i-2])+W[i-7]+Sigma0(W[i-15])+W[i-16]); 00608 for (j=0; j < 80; j++) 00609 { 00610 T1=Trunc64(H+Suma1(E)+Ch(E,F,G)+K[j]+W[j]); 00611 T2=Trunc64(Suma0(A)+Maj(A,B,C)); 00612 H=G; 00613 G=F; 00614 F=E; 00615 E=Trunc64(D+T1); 00616 D=C; 00617 C=B; 00618 B=A; 00619 A=Trunc64(T1+T2); 00620 } 00621 /* 00622 Add registers back to accumulator. 00623 */ 00624 sha_info->accumulator[0]=Trunc64(sha_info->accumulator[0]+A); 00625 sha_info->accumulator[1]=Trunc64(sha_info->accumulator[1]+B); 00626 sha_info->accumulator[2]=Trunc64(sha_info->accumulator[2]+C); 00627 sha_info->accumulator[3]=Trunc64(sha_info->accumulator[3]+D); 00628 sha_info->accumulator[4]=Trunc64(sha_info->accumulator[4]+E); 00629 sha_info->accumulator[5]=Trunc64(sha_info->accumulator[5]+F); 00630 sha_info->accumulator[6]=Trunc64(sha_info->accumulator[6]+G); 00631 sha_info->accumulator[7]=Trunc64(sha_info->accumulator[7]+H); 00632 /* 00633 Reset working registers. 00634 */ 00635 A=0; 00636 B=0; 00637 C=0; 00638 D=0; 00639 E=0; 00640 F=0; 00641 G=0; 00642 H=0; 00643 T=0; 00644 T1=0; 00645 T2=0; 00646 (void) ResetWizardMemory(W,0,sizeof(W)); 00647 } 00648 00649 /* 00650 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 00651 % % 00652 % % 00653 % % 00654 % U p d a t e S H A % 00655 % % 00656 % % 00657 % % 00658 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 00659 % 00660 % UpdateSHA512() updates the SHA512 message accumulator. 00661 % 00662 % The format of the UpdateSHA512 method is: 00663 % 00664 % UpdateSHA512(SHA512Info *sha_info,const StringInfo *message) 00665 % 00666 % A description of each parameter follows: 00667 % 00668 % o sha_info: The address of a structure of type SHA512Info. 00669 % 00670 % o message: The message. 00671 % 00672 */ 00673 WizardExport void UpdateSHA512(SHA512Info *sha_info,const StringInfo *message) 00674 { 00675 register size_t 00676 i; 00677 00678 register unsigned char 00679 *p; 00680 00681 WizardSizeType 00682 length, 00683 n; 00684 00685 /* 00686 Update the SHA512 accumulator. 00687 */ 00688 assert(sha_info != (SHA512Info *) NULL); 00689 assert(sha_info->signature == WizardSignature); 00690 n=(WizardSizeType) GetStringInfoLength(message); 00691 length=Trunc64(sha_info->low_order+(n << 3)); 00692 if (length < sha_info->low_order) 00693 sha_info->high_order++; 00694 sha_info->low_order=length; 00695 sha_info->high_order+=(n >> 61); 00696 p=GetStringInfoDatum(message); 00697 if (sha_info->offset != 0) 00698 { 00699 i=GetStringInfoLength(sha_info->message)-sha_info->offset; 00700 if ((WizardSizeType) i > n) 00701 i=(size_t) n; 00702 (void) CopyWizardMemory(GetStringInfoDatum(sha_info->message)+ 00703 sha_info->offset,p,i); 00704 n-=i; 00705 p+=i; 00706 sha_info->offset+=i; 00707 if (sha_info->offset != GetStringInfoLength(sha_info->message)) 00708 return; 00709 TransformSHA512(sha_info); 00710 } 00711 while (n >= (WizardSizeType) GetStringInfoLength(sha_info->message)) 00712 { 00713 SetStringInfoDatum(sha_info->message,p); 00714 p+=GetStringInfoLength(sha_info->message); 00715 n-=GetStringInfoLength(sha_info->message); 00716 TransformSHA512(sha_info); 00717 } 00718 (void) CopyWizardMemory(GetStringInfoDatum(sha_info->message),p,(size_t) n); 00719 sha_info->offset=(size_t) n; 00720 /* 00721 Reset working registers. 00722 */ 00723 i=0; 00724 n=0; 00725 length=0; 00726 }