IccMAX 2.1.27
Color Profile Tools
Loading...
Searching...
No Matches
IccMD5.cpp File Reference
#include "IccMD5.h"
#include <memory.h>
#include <string.h>
+ Include dependency graph for IccMD5.cpp:

Go to the source code of this file.

Macros

#define F(x, y, z)   (((x) & (y)) | ((~x) & (z)))
 
#define FF(a, b, c, d, x, s, ac)
 
#define G(x, y, z)   (((x) & (z)) | ((y) & (~z)))
 
#define GG(a, b, c, d, x, s, ac)
 
#define H(x, y, z)   ((x) ^ (y) ^ (z))
 
#define HH(a, b, c, d, x, s, ac)
 
#define I(x, y, z)   ((y) ^ ((x) | (~z)))
 
#define II(a, b, c, d, x, s, ac)
 
#define ROTATE_LEFT(x, n)   (((x) << (n)) | ((x) >> (32-(n))))
 
#define S11   7
 
#define S12   12
 
#define S13   17
 
#define S14   22
 
#define S21   5
 
#define S22   9
 
#define S23   14
 
#define S24   20
 
#define S31   4
 
#define S32   11
 
#define S33   16
 
#define S34   23
 
#define S41   6
 
#define S42   10
 
#define S43   15
 
#define S44   21
 

Functions

static void Decode (UINT4 *, unsigned char *, unsigned int)
 
static void Encode (unsigned char *, UINT4 *, unsigned int)
 
void ICCPROFLIB_API icMD5Final (unsigned char *digest, MD5_CTX *context)
 
void ICCPROFLIB_API icMD5Init (MD5_CTX *context)
 
void ICCPROFLIB_API icMD5Update (MD5_CTX *context, unsigned char *input, unsigned int inputLen)
 
static void MD5Transform (UINT4[4], unsigned char[64])
 

Variables

static unsigned char PADDING [64]
 

Detailed Description

IccMD5.cpp - RSA Data Security, Inc., MD5 message-digest algorithm

Copyright (C) 1991-2, RSA Data Security, Inc. Created 1991. All rights reserved.

License to copy and use this software is granted provided that it is identified as the "RSA Data Security, Inc. MD5 Message-Digest Algorithm" in all material mentioning or referencing this software or this function.

License is also granted to make and use derivative works provided that such works are identified as "derived from the RSA Data Security, Inc. MD5 Message-Digest Algorithm" in all material mentioning or referencing the derived work.

RSA Data Security, Inc. makes no representations concerning either the merchantability of this software or the suitability of this software for any particular purpose. It is provided "as is" without express or implied warranty of any kind.

These notices must be retained in any copies of any part of this documentation and/or software.

Definition in file IccMD5.cpp.

Macro Definition Documentation

◆ F

#define F (   x,
  y,
 
)    (((x) & (y)) | ((~x) & (z)))

◆ FF

#define FF (   a,
  b,
  c,
  d,
  x,
  s,
  ac 
)
Value:
{ \
(a) += F ((b), (c), (d)) + (x) + (UINT4)(ac); \
(a) = ROTATE_LEFT ((a), (s)); \
(a) += (b); \
}
ICCUINT32 UINT4
Definition IccMD5.h:48
#define ROTATE_LEFT(x, n)
Definition IccMD5.cpp:71
#define F(x, y, z)
Definition IccMD5.cpp:64
76 { \
77 (a) += F ((b), (c), (d)) + (x) + (UINT4)(ac); \
78 (a) = ROTATE_LEFT ((a), (s)); \
79 (a) += (b); \
80 }

◆ G

#define G (   x,
  y,
 
)    (((x) & (z)) | ((y) & (~z)))

◆ GG

#define GG (   a,
  b,
  c,
  d,
  x,
  s,
  ac 
)
Value:
{ \
(a) += G ((b), (c), (d)) + (x) + (UINT4)(ac); \
(a) = ROTATE_LEFT ((a), (s)); \
(a) += (b); \
}
#define G(x, y, z)
Definition IccMD5.cpp:65
81 { \
82 (a) += G ((b), (c), (d)) + (x) + (UINT4)(ac); \
83 (a) = ROTATE_LEFT ((a), (s)); \
84 (a) += (b); \
85 }

◆ H

#define H (   x,
  y,
 
)    ((x) ^ (y) ^ (z))

◆ HH

#define HH (   a,
  b,
  c,
  d,
  x,
  s,
  ac 
)
Value:
{ \
(a) += H ((b), (c), (d)) + (x) + (UINT4)(ac); \
(a) = ROTATE_LEFT ((a), (s)); \
(a) += (b); \
}
#define H(x, y, z)
Definition IccMD5.cpp:66
86 { \
87 (a) += H ((b), (c), (d)) + (x) + (UINT4)(ac); \
88 (a) = ROTATE_LEFT ((a), (s)); \
89 (a) += (b); \
90 }

◆ I

#define I (   x,
  y,
 
)    ((y) ^ ((x) | (~z)))

◆ II

#define II (   a,
  b,
  c,
  d,
  x,
  s,
  ac 
)
Value:
{ \
(a) += I ((b), (c), (d)) + (x) + (UINT4)(ac); \
(a) = ROTATE_LEFT ((a), (s)); \
(a) += (b); \
}
#define I(x, y, z)
Definition IccMD5.cpp:67
91 { \
92 (a) += I ((b), (c), (d)) + (x) + (UINT4)(ac); \
93 (a) = ROTATE_LEFT ((a), (s)); \
94 (a) += (b); \
95 }

◆ ROTATE_LEFT

#define ROTATE_LEFT (   x,
 
)    (((x) << (n)) | ((x) >> (32-(n))))

ROTATE_LEFT rotates x left n bits.

◆ S11

#define S11   7

◆ S12

#define S12   12

◆ S13

#define S13   17

◆ S14

#define S14   22

◆ S21

#define S21   5

◆ S22

#define S22   9

◆ S23

#define S23   14

◆ S24

#define S24   20

◆ S31

#define S31   4

◆ S32

#define S32   11

◆ S33

#define S33   16

◆ S34

#define S34   23

◆ S41

#define S41   6

◆ S42

#define S42   10

◆ S43

#define S43   15

◆ S44

#define S44   21

Function Documentation

◆ Decode()

static void Decode ( UINT4 output,
unsigned char *  input,
unsigned int  len 
)
static

Decodes input (unsigned char) into output (UINT4). Assumes len is a multiple of 4.

285{
286 unsigned int i, j;
287
288 for (i = 0, j = 0; j < len; i++, j += 4)
289 output[i] = ((UINT4)input[j]) | (((UINT4)input[j+1]) << 8) |
290 (((UINT4)input[j+2]) << 16) | (((UINT4)input[j+3]) << 24);
291}

Referenced by MD5Transform().

+ Here is the caller graph for this function:

◆ Encode()

static void Encode ( unsigned char *  output,
UINT4 input,
unsigned int  len 
)
static

Encodes input (UINT4) into output (unsigned char). Assumes len is a multiple of 4.

270{
271 unsigned int i, j;
272
273 for (i = 0, j = 0; j < len; i++, j += 4) {
274 output[j] = (unsigned char)(input[i] & 0xff);
275 output[j+1] = (unsigned char)((input[i] >> 8) & 0xff);
276 output[j+2] = (unsigned char)((input[i] >> 16) & 0xff);
277 output[j+3] = (unsigned char)((input[i] >> 24) & 0xff);
278 }
279}

Referenced by icMD5Final().

+ Here is the caller graph for this function:

◆ icMD5Final()

void ICCPROFLIB_API icMD5Final ( unsigned char *  digest,
MD5_CTX context 
)

MD5 finalization. Ends an MD5 message-digest operation, writing the the message digest and zeroizing the context.

151{
152 unsigned char bits[8];
153 unsigned int index, padLen;
154
155 /* Save number of bits */
156 Encode (bits, context->count, 8);
157
158 /* Pad out to 56 mod 64.
159*/
160 index = (unsigned int)((context->count[0] >> 3) & 0x3f);
161 padLen = (index < 56) ? (56 - index) : (120 - index);
162 icMD5Update (context, PADDING, padLen);
163
164 /* Append length (before padding) */
165 icMD5Update (context, bits, 8);
166
167
168 /* Store state in digest */
169 Encode (digest, context->state, 16);
170
171 /* Zeroize sensitive information.
172*/
173 memset((POINTER)context, 0, sizeof (*context));
174}
unsigned char * POINTER
Definition IccMD5.h:42
static void Encode(unsigned char *, UINT4 *, unsigned int)
Definition IccMD5.cpp:269
void ICCPROFLIB_API icMD5Update(MD5_CTX *context, unsigned char *input, unsigned int inputLen)
Definition IccMD5.cpp:114
static unsigned char PADDING[64]
Definition IccMD5.cpp:56
static const CFAllocatorContext context
Definition RefIccMAXCmm.cpp:1188

References MD5_CTX::count, Encode(), icMD5Update(), PADDING, and MD5_CTX::state.

Referenced by CalcProfileID().

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ icMD5Init()

void ICCPROFLIB_API icMD5Init ( MD5_CTX context)

MD5 initialization. Begins an MD5 operation, writing a new context.

100{
101 context->count[0] = context->count[1] = 0;
102 /* Load magic initialization constants.
103*/
104 context->state[0] = 0x67452301;
105 context->state[1] = 0xefcdab89;
106 context->state[2] = 0x98badcfe;
107 context->state[3] = 0x10325476;
108}

References MD5_CTX::count, and MD5_CTX::state.

Referenced by CalcProfileID().

+ Here is the caller graph for this function:

◆ icMD5Update()

void ICCPROFLIB_API icMD5Update ( MD5_CTX context,
unsigned char *  input,
unsigned int  inputLen 
)

MD5 block update operation. Continues an MD5 message-digest operation, processing another message block, and updating the context.

115{
116 unsigned int i, index, partLen;
117
118 /* Compute number of bytes mod 64 */
119 index = (unsigned int)((context->count[0] >> 3) & 0x3F);
120
121 /* Update number of bits */
122 if ((context->count[0] += ((UINT4)inputLen << 3))
123 < ((UINT4)inputLen << 3))
124 context->count[1]++;
125 context->count[1] += ((UINT4)inputLen >> 29);
126
127 partLen = 64 - index;
128
129 /* Transform as many times as possible.
130 */
131 if (inputLen >= partLen) {
132 memcpy((POINTER)&context->buffer[index], (POINTER)input, partLen);
133 MD5Transform (context->state, context->buffer);
134
135 for (i = partLen; i + 63 < inputLen; i += 64)
136 MD5Transform (context->state, &input[i]);
137
138 index = 0;
139 }
140 else
141 i = 0;
142
143 /* Buffer remaining input */
144 memcpy((POINTER)&context->buffer[index], (POINTER)&input[i],inputLen-i);
145}
static void MD5Transform(UINT4[4], unsigned char[64])
Definition IccMD5.cpp:178

References MD5_CTX::buffer, MD5_CTX::count, MD5Transform(), and MD5_CTX::state.

Referenced by CalcProfileID(), and icMD5Final().

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ MD5Transform()

static void MD5Transform ( UINT4  state[4],
unsigned char  block[64] 
)
static

MD5 basic transformation. Transforms state based on block.

179{
180 UINT4 a = state[0], b = state[1], c = state[2], d = state[3], x[16];
181
182 Decode (x, block, 64);
183
184 /* Round 1 */
185 FF (a, b, c, d, x[ 0], S11, 0xd76aa478); /* 1 */
186 FF (d, a, b, c, x[ 1], S12, 0xe8c7b756); /* 2 */
187 FF (c, d, a, b, x[ 2], S13, 0x242070db); /* 3 */
188 FF (b, c, d, a, x[ 3], S14, 0xc1bdceee); /* 4 */
189 FF (a, b, c, d, x[ 4], S11, 0xf57c0faf); /* 5 */
190 FF (d, a, b, c, x[ 5], S12, 0x4787c62a); /* 6 */
191 FF (c, d, a, b, x[ 6], S13, 0xa8304613); /* 7 */
192 FF (b, c, d, a, x[ 7], S14, 0xfd469501); /* 8 */
193 FF (a, b, c, d, x[ 8], S11, 0x698098d8); /* 9 */
194 FF (d, a, b, c, x[ 9], S12, 0x8b44f7af); /* 10 */
195 FF (c, d, a, b, x[10], S13, 0xffff5bb1); /* 11 */
196 FF (b, c, d, a, x[11], S14, 0x895cd7be); /* 12 */
197 FF (a, b, c, d, x[12], S11, 0x6b901122); /* 13 */
198 FF (d, a, b, c, x[13], S12, 0xfd987193); /* 14 */
199 FF (c, d, a, b, x[14], S13, 0xa679438e); /* 15 */
200 FF (b, c, d, a, x[15], S14, 0x49b40821); /* 16 */
201
202 /* Round 2 */
203 GG (a, b, c, d, x[ 1], S21, 0xf61e2562); /* 17 */
204 GG (d, a, b, c, x[ 6], S22, 0xc040b340); /* 18 */
205 GG (c, d, a, b, x[11], S23, 0x265e5a51); /* 19 */
206 GG (b, c, d, a, x[ 0], S24, 0xe9b6c7aa); /* 20 */
207 GG (a, b, c, d, x[ 5], S21, 0xd62f105d); /* 21 */
208 GG (d, a, b, c, x[10], S22, 0x2441453); /* 22 */
209 GG (c, d, a, b, x[15], S23, 0xd8a1e681); /* 23 */
210 GG (b, c, d, a, x[ 4], S24, 0xe7d3fbc8); /* 24 */
211 GG (a, b, c, d, x[ 9], S21, 0x21e1cde6); /* 25 */
212 GG (d, a, b, c, x[14], S22, 0xc33707d6); /* 26 */
213 GG (c, d, a, b, x[ 3], S23, 0xf4d50d87); /* 27 */
214 GG (b, c, d, a, x[ 8], S24, 0x455a14ed); /* 28 */
215 GG (a, b, c, d, x[13], S21, 0xa9e3e905); /* 29 */
216 GG (d, a, b, c, x[ 2], S22, 0xfcefa3f8); /* 30 */
217 GG (c, d, a, b, x[ 7], S23, 0x676f02d9); /* 31 */
218 GG (b, c, d, a, x[12], S24, 0x8d2a4c8a); /* 32 */
219
220 /* Round 3 */
221 HH (a, b, c, d, x[ 5], S31, 0xfffa3942); /* 33 */
222 HH (d, a, b, c, x[ 8], S32, 0x8771f681); /* 34 */
223 HH (c, d, a, b, x[11], S33, 0x6d9d6122); /* 35 */
224 HH (b, c, d, a, x[14], S34, 0xfde5380c); /* 36 */
225 HH (a, b, c, d, x[ 1], S31, 0xa4beea44); /* 37 */
226 HH (d, a, b, c, x[ 4], S32, 0x4bdecfa9); /* 38 */
227 HH (c, d, a, b, x[ 7], S33, 0xf6bb4b60); /* 39 */
228 HH (b, c, d, a, x[10], S34, 0xbebfbc70); /* 40 */
229 HH (a, b, c, d, x[13], S31, 0x289b7ec6); /* 41 */
230 HH (d, a, b, c, x[ 0], S32, 0xeaa127fa); /* 42 */
231 HH (c, d, a, b, x[ 3], S33, 0xd4ef3085); /* 43 */
232 HH (b, c, d, a, x[ 6], S34, 0x4881d05); /* 44 */
233 HH (a, b, c, d, x[ 9], S31, 0xd9d4d039); /* 45 */
234 HH (d, a, b, c, x[12], S32, 0xe6db99e5); /* 46 */
235 HH (c, d, a, b, x[15], S33, 0x1fa27cf8); /* 47 */
236 HH (b, c, d, a, x[ 2], S34, 0xc4ac5665); /* 48 */
237
238 /* Round 4 */
239 II (a, b, c, d, x[ 0], S41, 0xf4292244); /* 49 */
240 II (d, a, b, c, x[ 7], S42, 0x432aff97); /* 50 */
241 II (c, d, a, b, x[14], S43, 0xab9423a7); /* 51 */
242 II (b, c, d, a, x[ 5], S44, 0xfc93a039); /* 52 */
243 II (a, b, c, d, x[12], S41, 0x655b59c3); /* 53 */
244 II (d, a, b, c, x[ 3], S42, 0x8f0ccc92); /* 54 */
245 II (c, d, a, b, x[10], S43, 0xffeff47d); /* 55 */
246 II (b, c, d, a, x[ 1], S44, 0x85845dd1); /* 56 */
247 II (a, b, c, d, x[ 8], S41, 0x6fa87e4f); /* 57 */
248 II (d, a, b, c, x[15], S42, 0xfe2ce6e0); /* 58 */
249 II (c, d, a, b, x[ 6], S43, 0xa3014314); /* 59 */
250 II (b, c, d, a, x[13], S44, 0x4e0811a1); /* 60 */
251 II (a, b, c, d, x[ 4], S41, 0xf7537e82); /* 61 */
252 II (d, a, b, c, x[11], S42, 0xbd3af235); /* 62 */
253 II (c, d, a, b, x[ 2], S43, 0x2ad7d2bb); /* 63 */
254 II (b, c, d, a, x[ 9], S44, 0xeb86d391); /* 64 */
255
256 state[0] += a;
257 state[1] += b;
258 state[2] += c;
259 state[3] += d;
260
261 /* Zeroize sensitive information.
262*/
263 memset((POINTER)x, 0, sizeof (x));
264}
#define FF(a, b, c, d, x, s, ac)
Definition IccMD5.cpp:76
#define S24
Definition IccMD5.cpp:45
#define S33
Definition IccMD5.cpp:48
#define S32
Definition IccMD5.cpp:47
#define S12
Definition IccMD5.cpp:39
#define S42
Definition IccMD5.cpp:51
#define S11
Definition IccMD5.cpp:38
static void Decode(UINT4 *, unsigned char *, unsigned int)
Definition IccMD5.cpp:284
#define S43
Definition IccMD5.cpp:52
#define S23
Definition IccMD5.cpp:44
#define GG(a, b, c, d, x, s, ac)
Definition IccMD5.cpp:81
#define S44
Definition IccMD5.cpp:53
#define S14
Definition IccMD5.cpp:41
#define HH(a, b, c, d, x, s, ac)
Definition IccMD5.cpp:86
#define S13
Definition IccMD5.cpp:40
#define S41
Definition IccMD5.cpp:50
#define S21
Definition IccMD5.cpp:42
#define II(a, b, c, d, x, s, ac)
Definition IccMD5.cpp:91
#define S22
Definition IccMD5.cpp:43
#define S31
Definition IccMD5.cpp:46
#define S34
Definition IccMD5.cpp:49

References Decode().

Referenced by icMD5Update().

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

Variable Documentation

◆ PADDING

unsigned char PADDING[64]
static
Initial value:
= {
0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
}
56 {
57 0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
58 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
59 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
60};

Referenced by icMD5Final().