Hoyt's FORK of DemoIccMAX 2.1.17.hoyt
Documentation for Hoyt's FORK of DemoIccMAX
Loading...
Searching...
No Matches
IccMD5.cpp File Reference

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

#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))))
 ROTATE_LEFT rotates x left n bits.
 
#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 *output, unsigned char *input, unsigned int len)
 Decodes input (unsigned char) into output (UINT4).
 
static void Encode (unsigned char *output, UINT4 *input, unsigned int len)
 Encodes input (UINT4) into output (unsigned char).
 
void icMD5Final (unsigned char *digest, MD5_CTX *context)
 MD5 finalization.
 
void icMD5Init (MD5_CTX *context)
 MD5 initialization.
 
void icMD5Update (MD5_CTX *context, unsigned char *input, unsigned int inputLen)
 MD5 block update operation.
 
static void MD5Transform (UINT4 state[4], unsigned char block[64])
 MD5 basic transformation.
 

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,
z )   (((x) & (y)) | ((~x) & (z)))

Definition at line 64 of file IccMD5.cpp.

Referenced by icIsS15Fixed16NumberNear(), and CIccCamConverter::SetParameter_F().

◆ 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); \
}
#define ROTATE_LEFT(x, n)
ROTATE_LEFT rotates x left n bits.
Definition IccMD5.cpp:71
#define F(x, y, z)
Definition IccMD5.cpp:64
uint32_t UINT4
UINT4 defines a four byte word.
Definition IccMD5.h:48

Definition at line 76 of file IccMD5.cpp.

76#define FF(a, b, c, d, x, s, ac) { \
77 (a) += F ((b), (c), (d)) + (x) + (UINT4)(ac); \
78 (a) = ROTATE_LEFT ((a), (s)); \
79 (a) += (b); \
80 }

Referenced by MD5Transform().

◆ G

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

Definition at line 65 of file IccMD5.cpp.

◆ 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

Definition at line 81 of file IccMD5.cpp.

81#define GG(a, b, c, d, x, s, ac) { \
82 (a) += G ((b), (c), (d)) + (x) + (UINT4)(ac); \
83 (a) = ROTATE_LEFT ((a), (s)); \
84 (a) += (b); \
85 }

Referenced by MD5Transform().

◆ H

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

Definition at line 66 of file IccMD5.cpp.

◆ 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

Definition at line 86 of file IccMD5.cpp.

86#define HH(a, b, c, d, x, s, ac) { \
87 (a) += H ((b), (c), (d)) + (x) + (UINT4)(ac); \
88 (a) = ROTATE_LEFT ((a), (s)); \
89 (a) += (b); \
90 }

Referenced by MD5Transform().

◆ I

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

Definition at line 67 of file IccMD5.cpp.

◆ 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

Definition at line 91 of file IccMD5.cpp.

91#define II(a, b, c, d, x, s, ac) { \
92 (a) += I ((b), (c), (d)) + (x) + (UINT4)(ac); \
93 (a) = ROTATE_LEFT ((a), (s)); \
94 (a) += (b); \
95 }

Referenced by MD5Transform().

◆ ROTATE_LEFT

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

ROTATE_LEFT rotates x left n bits.

Definition at line 71 of file IccMD5.cpp.

◆ S11

#define S11   7

Definition at line 38 of file IccMD5.cpp.

Referenced by MD5Transform().

◆ S12

#define S12   12

Definition at line 39 of file IccMD5.cpp.

Referenced by MD5Transform().

◆ S13

#define S13   17

Definition at line 40 of file IccMD5.cpp.

Referenced by MD5Transform().

◆ S14

#define S14   22

Definition at line 41 of file IccMD5.cpp.

Referenced by MD5Transform().

◆ S21

#define S21   5

Definition at line 42 of file IccMD5.cpp.

Referenced by MD5Transform().

◆ S22

#define S22   9

Definition at line 43 of file IccMD5.cpp.

Referenced by MD5Transform().

◆ S23

#define S23   14

Definition at line 44 of file IccMD5.cpp.

Referenced by MD5Transform().

◆ S24

#define S24   20

Definition at line 45 of file IccMD5.cpp.

Referenced by MD5Transform().

◆ S31

#define S31   4

Definition at line 46 of file IccMD5.cpp.

Referenced by MD5Transform().

◆ S32

#define S32   11

Definition at line 47 of file IccMD5.cpp.

Referenced by MD5Transform().

◆ S33

#define S33   16

Definition at line 48 of file IccMD5.cpp.

Referenced by MD5Transform().

◆ S34

#define S34   23

Definition at line 49 of file IccMD5.cpp.

Referenced by MD5Transform().

◆ S41

#define S41   6

Definition at line 50 of file IccMD5.cpp.

Referenced by MD5Transform().

◆ S42

#define S42   10

Definition at line 51 of file IccMD5.cpp.

Referenced by MD5Transform().

◆ S43

#define S43   15

Definition at line 52 of file IccMD5.cpp.

Referenced by MD5Transform().

◆ S44

#define S44   21

Definition at line 53 of file IccMD5.cpp.

Referenced by MD5Transform().

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.

Definition at line 284 of file IccMD5.cpp.

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.

Definition at line 269 of file IccMD5.cpp.

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 icMD5Final ( unsigned char * digest,
MD5_CTX * context )

MD5 finalization.

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

Definition at line 150 of file IccMD5.cpp.

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}
static void Encode(unsigned char *, UINT4 *, unsigned int)
Encodes input (UINT4) into output (unsigned char).
Definition IccMD5.cpp:269
static unsigned char PADDING[64]
Definition IccMD5.cpp:56
void icMD5Update(MD5_CTX *context, unsigned char *input, unsigned int inputLen)
MD5 block update operation.
Definition IccMD5.cpp:114
unsigned char * POINTER
POINTER defines a generic pointer type.
Definition IccMD5.h:42
static const CFAllocatorContext context

References context, Encode(), icMD5Update(), and PADDING.

Referenced by CalcProfileID().

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

◆ icMD5Init()

void icMD5Init ( MD5_CTX * context)

MD5 initialization.

Begins an MD5 operation, writing a new context.

Definition at line 99 of file IccMD5.cpp.

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 context.

Referenced by CalcProfileID().

+ Here is the caller graph for this function:

◆ icMD5Update()

void 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.

Definition at line 114 of file IccMD5.cpp.

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])
MD5 basic transformation.
Definition IccMD5.cpp:178

References context, and MD5Transform().

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.

Definition at line 178 of file IccMD5.cpp.

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
#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
static void Decode(UINT4 *, unsigned char *, unsigned int)
Decodes input (unsigned char) into output (UINT4).
Definition IccMD5.cpp:284
#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(), FF, GG, HH, II, S11, S12, S13, S14, S21, S22, S23, S24, S31, S32, S33, S34, S41, S42, S43, and S44.

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
}

Definition at line 56 of file IccMD5.cpp.

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().