50#define MD5Blocksize 64
51#define MD5Digestsize 16
108 if (md5_info == (
MD5Info *) NULL)
110 (void) memset(md5_info,0,
sizeof(*md5_info));
117 if (md5_info->
accumulator == (
unsigned int *) NULL)
119 md5_info->
timestamp=time((time_t *) NULL);
149 assert(md5_info != (
MD5Info *) NULL);
151 if (md5_info->
accumulator != (
unsigned int *) NULL)
209 assert(md5_info != (
MD5Info *) NULL);
216 number_bytes=(ssize_t) ((md5_info->
low_order >> 3) & 0x3F);
221 (120-number_bytes)));
223 datum[0]=(
unsigned char) 0x80;
225 datum[i]=(
unsigned char) 0x0;
232 for (i=0; i < 14; i++)
234 message[i]=(
unsigned int) (*p++);
235 message[i]|=((
unsigned int) (*p++)) << 8;
236 message[i]|=((
unsigned int) (*p++)) << 16;
237 message[i]|=((
unsigned int) (*p++)) << 24;
246 *p++=(
unsigned char) (md5_info->
accumulator[i] & 0xff);
247 *p++=(
unsigned char) ((md5_info->
accumulator[i] >> 8) & 0xff);
248 *p++=(
unsigned char) ((md5_info->
accumulator[i] >> 16) & 0xff);
249 *p++=(
unsigned char) ((md5_info->
accumulator[i] >> 24) & 0xff);
255 (void) memset(message,0,
sizeof(message));
374 assert(md5_info != (
MD5Info *) NULL);
381 md5_info->
accumulator[0]=(
unsigned int) 0x67452301;
382 md5_info->
accumulator[1]=(
unsigned int) 0xefcdab89;
383 md5_info->
accumulator[2]=(
unsigned int) 0x98badcfe;
384 md5_info->
accumulator[3]=(
unsigned int) 0x10325476;
412static inline unsigned int F(
const unsigned int x,
const unsigned int y,
413 const unsigned int z)
415 return((x & y) | (~x & z));
418static inline unsigned int G(
const unsigned int x,
const unsigned int y,
419 const unsigned int z)
421 return((x & z) | (y & ~z));
424static inline unsigned int H(
const unsigned int x,
const unsigned int y,
425 const unsigned int z)
430static inline unsigned int I(
const unsigned int x,
const unsigned int y,
431 const unsigned int z)
433 return(y ^ (x | ~z));
436static inline unsigned int Trunc32(
const unsigned int x)
438 return((
unsigned int) (x & 0xffffffffUL));
441static inline unsigned int RotateLeft(
const unsigned int x,
const unsigned int n)
443 return(
Trunc32((x << n) | (x >> (32-n))));
457 static const unsigned int
460 0xd76aa478U, 0xe8c7b756U, 0x242070dbU, 0xc1bdceeeU, 0xf57c0fafU,
461 0x4787c62aU, 0xa8304613U, 0xfd469501U, 0x698098d8U, 0x8b44f7afU,
462 0xffff5bb1U, 0x895cd7beU, 0x6b901122U, 0xfd987193U, 0xa679438eU,
463 0x49b40821U, 0xf61e2562U, 0xc040b340U, 0x265e5a51U, 0xe9b6c7aaU,
464 0xd62f105dU, 0x02441453U, 0xd8a1e681U, 0xe7d3fbc8U, 0x21e1cde6U,
465 0xc33707d6U, 0xf4d50d87U, 0x455a14edU, 0xa9e3e905U, 0xfcefa3f8U,
466 0x676f02d9U, 0x8d2a4c8aU, 0xfffa3942U, 0x8771f681U, 0x6d9d6122U,
467 0xfde5380cU, 0xa4beea44U, 0x4bdecfa9U, 0xf6bb4b60U, 0xbebfbc70U,
468 0x289b7ec6U, 0xeaa127faU, 0xd4ef3085U, 0x04881d05U, 0xd9d4d039U,
469 0xe6db99e5U, 0x1fa27cf8U, 0xc4ac5665U, 0xf4292244U, 0x432aff97U,
470 0xab9423a7U, 0xfc93a039U, 0x655b59c3U, 0x8f0ccc92U, 0xffeff47dU,
471 0x85845dd1U, 0x6fa87e4fU, 0xfe2ce6e0U, 0xa3014314U, 0x4e0811a1U,
472 0xf7537e82U, 0xbd3af235U, 0x2ad7d2bbU, 0xeb86d391U,
493 for (i=0; i < 4; i++)
495 A+=
F(B,C,D)+message[j & 0x0f]+(*p++);
498 D+=
F(A,B,C)+message[j & 0x0f]+(*p++);
501 C+=
F(D,A,B)+message[j & 0x0f]+(*p++);
504 B+=
F(C,D,A)+message[j & 0x0f]+(*p++);
512 for (i=0; i < 4; i++)
514 A+=
G(B,C,D)+message[j & 0x0f]+(*p++);
517 D+=
G(A,B,C)+message[j & 0x0f]+(*p++);
520 C+=
G(D,A,B)+message[j & 0x0f]+(*p++);
523 B+=
G(C,D,A)+message[j & 0x0f]+(*p++);
531 for (i=0; i < 4; i++)
533 A+=
H(B,C,D)+message[j & 0x0f]+(*p++);
536 D+=
H(A,B,C)+message[j & 0x0f]+(*p++);
539 C+=
H(D,A,B)+message[j & 0x0f]+(*p++);
542 B+=
H(C,D,A)+message[j & 0x0f]+(*p++);
550 for (i=0; i < 4; i++)
552 A+=
I(B,C,D)+message[j & 0x0f]+(*p++);
555 D+=
I(A,B,C)+message[j & 0x0f]+(*p++);
558 C+=
I(D,A,B)+message[j & 0x0f]+(*p++);
561 B+=
I(C,D,A)+message[j & 0x0f]+(*p++);
625 assert(md5_info != (
MD5Info *) NULL);
627 number_bytes=(
unsigned int) ((md5_info->
low_order >> 3) & 0x3F);
630 if ((number_bits & 0xffffffff) < md5_info->
low_order)
638 p[number_bytes++]=datum[i];
639 if (number_bytes != 0x40)
641 for (j=0; j < 16; j++)
643 buffer[j]=(
unsigned int) (*p++);
644 buffer[j]|=((
unsigned int) (*p++)) << 8;
645 buffer[j]|=((
unsigned int) (*p++)) << 16;
646 buffer[j]|=((
unsigned int) (*p++)) << 24;
656 (void) memset(buffer,0,
sizeof(buffer));
#define WizardAssert(domain, predicate)
#define ThrowWizardFatalError(domain, error)
WizardBooleanType LogWizardEvent(const LogEventType type, const char *module, const char *function, const size_t line, const char *format,...)
#define GetWizardModule()
WizardExport WizardBooleanType InitializeMD5(MD5Info *md5_info)
WizardExport const StringInfo * GetMD5Digest(const MD5Info *md5_info)
static unsigned int H(const unsigned int x, const unsigned int y, const unsigned int z)
WizardExport WizardBooleanType FinalizeMD5(MD5Info *md5_info)
static unsigned int I(const unsigned int x, const unsigned int y, const unsigned int z)
static void TransformMD5(MD5Info *, const unsigned int *)
WizardExport WizardBooleanType UpdateMD5(MD5Info *md5_info, const StringInfo *message)
WizardExport MD5Info * AcquireMD5Info(void)
WizardExport unsigned int GetMD5Blocksize(const MD5Info *md5_info)
WizardExport MD5Info * DestroyMD5Info(MD5Info *md5_info)
WizardExport unsigned int GetMD5Digestsize(const MD5Info *md5_info)
static unsigned int F(const unsigned int x, const unsigned int y, const unsigned int z)
static unsigned int RotateLeft(const unsigned int x, const unsigned int n)
static unsigned int G(const unsigned int x, const unsigned int y, const unsigned int z)
WizardExport void * AcquireWizardMemory(const size_t size)
WizardExport void * AcquireQuantumMemory(const size_t count, const size_t quantum)
WizardExport void * RelinquishWizardMemory(void *memory)
WizardExport size_t GetStringInfoLength(const StringInfo *string_info)
WizardExport StringInfo * AcquireStringInfo(const size_t length)
WizardExport unsigned char * GetStringInfoDatum(const StringInfo *string_info)
WizardExport StringInfo * DestroyStringInfo(StringInfo *string_info)
unsigned int * accumulator