@@ -78,35 +78,37 @@ class MD5
7878
7979 private:
8080 void init ();
81- using uint1 = unsigned char ; // 8bit
82- using uint4 = unsigned int ; // 32bit
8381 enum
8482 {
8583 blocksize = 64
8684 }; // VC6 won't eat a const static int here
8785
88- void transform (const uint1 block[blocksize]);
89- static void decode (uint4 output[], const uint1 input[], size_type len);
90- static void encode (uint1 output[], const uint4 input[], size_type len);
86+ void transform (const uint8_t block[blocksize]);
87+ static void decode (uint32_t output[], const uint8_t input[], size_type len);
88+ static void encode (uint8_t output[], const uint32_t input[], size_type len);
9189
9290 bool finalized{false };
9391 // bytes that didn't fit in last 64 byte chunk
94- uint1 buffer[blocksize]{};
95- uint4 count[2 ] = {0 , 0 }; // 64bit counter for number of bits (lo, hi)
92+ uint8_t buffer[blocksize]{};
93+ uint32_t count[2 ] = {0 , 0 }; // 64bit counter for number of bits (lo, hi)
9694 // load magic initialization constants:
97- uint4 state[4 ] = {0x67452301 , 0xefcdab89 , 0x98badcfe , 0x10325476 };
98- uint1 digest[16 ]{}; // the result
95+ uint32_t state[4 ] = {0x67452301 , 0xefcdab89 , 0x98badcfe , 0x10325476 };
96+ uint8_t digest[16 ]{}; // the result
9997
10098 // low level logic operations
101- static inline uint4 F (uint4 x, uint4 y, uint4 z);
102- static inline uint4 G (uint4 x, uint4 y, uint4 z);
103- static inline uint4 H (uint4 x, uint4 y, uint4 z);
104- static inline uint4 I (uint4 x, uint4 y, uint4 z);
105- static inline uint4 rotate_left (uint4 x, int n);
106- static inline void FF (uint4& a, uint4 b, uint4 c, uint4 d, uint4 x, uint4 s, uint4 ac);
107- static inline void GG (uint4& a, uint4 b, uint4 c, uint4 d, uint4 x, uint4 s, uint4 ac);
108- static inline void HH (uint4& a, uint4 b, uint4 c, uint4 d, uint4 x, uint4 s, uint4 ac);
109- static inline void II (uint4& a, uint4 b, uint4 c, uint4 d, uint4 x, uint4 s, uint4 ac);
99+ static inline uint32_t F (uint32_t x, uint32_t y, uint32_t z);
100+ static inline uint32_t G (uint32_t x, uint32_t y, uint32_t z);
101+ static inline uint32_t H (uint32_t x, uint32_t y, uint32_t z);
102+ static inline uint32_t I (uint32_t x, uint32_t y, uint32_t z);
103+ static inline uint32_t rotate_left (uint32_t x, uint32_t n);
104+ static inline void FF (
105+ uint32_t & a, uint32_t b, uint32_t c, uint32_t d, uint32_t x, uint32_t s, uint32_t ac);
106+ static inline void GG (
107+ uint32_t & a, uint32_t b, uint32_t c, uint32_t d, uint32_t x, uint32_t s, uint32_t ac);
108+ static inline void HH (
109+ uint32_t & a, uint32_t b, uint32_t c, uint32_t d, uint32_t x, uint32_t s, uint32_t ac);
110+ static inline void II (
111+ uint32_t & a, uint32_t b, uint32_t c, uint32_t d, uint32_t x, uint32_t s, uint32_t ac);
110112};
111113
112114// Constants for MD5Transform routine.
@@ -130,33 +132,37 @@ class MD5
130132// /////////////////////////////////////////////
131133
132134// F, G, H and I are basic MD5 functions.
133- inline MD5::uint4 MD5::F (uint4 x, uint4 y, uint4 z) { return (x & y) | (~x & z); }
135+ inline uint32_t MD5::F (uint32_t x, uint32_t y, uint32_t z) { return (x & y) | (~x & z); }
134136
135- inline MD5::uint4 MD5::G (uint4 x, uint4 y, uint4 z) { return (x & z) | (y & ~z); }
137+ inline uint32_t MD5::G (uint32_t x, uint32_t y, uint32_t z) { return (x & z) | (y & ~z); }
136138
137- inline MD5::uint4 MD5::H (uint4 x, uint4 y, uint4 z) { return x ^ y ^ z; }
138- inline MD5::uint4 MD5::I (uint4 x, uint4 y, uint4 z) { return y ^ (x | ~z); }
139+ inline uint32_t MD5::H (uint32_t x, uint32_t y, uint32_t z) { return x ^ y ^ z; }
140+ inline uint32_t MD5::I (uint32_t x, uint32_t y, uint32_t z) { return y ^ (x | ~z); }
139141// rotate_left rotates x left n bits.
140- inline MD5::uint4 MD5::rotate_left (uint4 x, int n) { return (x << n) | (x >> (32 - n)); }
142+ inline uint32_t MD5::rotate_left (uint32_t x, uint32_t n) { return (x << n) | (x >> (32 - n)); }
141143
142144// FF, GG, HH, and II transformations for rounds 1, 2, 3, and 4.
143145// Rotation is separate from addition to prevent recomputation.
144- inline void MD5::FF (uint4& a, uint4 b, uint4 c, uint4 d, uint4 x, uint4 s, uint4 ac)
146+ inline void MD5::FF (
147+ uint32_t & a, uint32_t b, uint32_t c, uint32_t d, uint32_t x, uint32_t s, uint32_t ac)
145148{
146149 a = rotate_left (a + F (b, c, d) + x + ac, s) + b;
147150}
148151
149- inline void MD5::GG (uint4& a, uint4 b, uint4 c, uint4 d, uint4 x, uint4 s, uint4 ac)
152+ inline void MD5::GG (
153+ uint32_t & a, uint32_t b, uint32_t c, uint32_t d, uint32_t x, uint32_t s, uint32_t ac)
150154{
151155 a = rotate_left (a + G (b, c, d) + x + ac, s) + b;
152156}
153157
154- inline void MD5::HH (uint4& a, uint4 b, uint4 c, uint4 d, uint4 x, uint4 s, uint4 ac)
158+ inline void MD5::HH (
159+ uint32_t & a, uint32_t b, uint32_t c, uint32_t d, uint32_t x, uint32_t s, uint32_t ac)
155160{
156161 a = rotate_left (a + H (b, c, d) + x + ac, s) + b;
157162}
158163
159- inline void MD5::II (uint4& a, uint4 b, uint4 c, uint4 d, uint4 x, uint4 s, uint4 ac)
164+ inline void MD5::II (
165+ uint32_t & a, uint32_t b, uint32_t c, uint32_t d, uint32_t x, uint32_t s, uint32_t ac)
160166{
161167 a = rotate_left (a + I (b, c, d) + x + ac, s) + b;
162168}
@@ -167,7 +173,7 @@ inline void MD5::II(uint4& a, uint4 b, uint4 c, uint4 d, uint4 x, uint4 s, uint4
167173MD5::MD5 (const std::string& text)
168174{
169175 init ();
170- update (text.c_str (), text.length ());
176+ update (text.c_str (), static_cast <size_type>( text.length () ));
171177 finalize ();
172178}
173179
@@ -177,38 +183,40 @@ void MD5::init() { *this = MD5(); }
177183
178184// ////////////////////////////
179185
180- // decodes input (unsigned char) into output (uint4 ). Assumes len is a multiple
186+ // decodes input (unsigned char) into output (uint32_t ). Assumes len is a multiple
181187// of 4.
182- void MD5::decode (uint4 output[], const uint1 input[], size_type len)
188+ void MD5::decode (uint32_t output[], const uint8_t input[], size_type len)
183189{
184190 for (unsigned int i = 0 , j = 0 ; j < len; i++, j += 4 )
185191 {
186- output[i] = ((uint4)input[j]) | (((uint4)input[j + 1 ]) << 8 ) | (((uint4)input[j + 2 ]) << 16 ) |
187- (((uint4)input[j + 3 ]) << 24 );
192+ output[i] = (static_cast <uint32_t >(input[j])) | //
193+ ((static_cast <uint32_t >(input[j + 1 ])) << 8 ) |
194+ ((static_cast <uint32_t >(input[j + 2 ])) << 16 ) |
195+ ((static_cast <uint32_t >(input[j + 3 ])) << 24 );
188196 }
189197}
190198
191199// ////////////////////////////
192200
193- // encodes input (uint4 ) into output (unsigned char). Assumes len is
201+ // encodes input (uint32_t ) into output (unsigned char). Assumes len is
194202// a multiple of 4.
195- void MD5::encode (uint1 output[], const uint4 input[], size_type len)
203+ void MD5::encode (uint8_t output[], const uint32_t input[], size_type len)
196204{
197205 for (size_type i = 0 , j = 0 ; j < len; i++, j += 4 )
198206 {
199- output[j] = input[i] & 0xff ;
200- output[j + 1 ] = ( input[i] >> 8 ) & 0xff ;
201- output[j + 2 ] = ( input[i] >> 16 ) & 0xff ;
202- output[j + 3 ] = ( input[i] >> 24 ) & 0xff ;
207+ output[j] = static_cast < uint8_t >( input[i] & 0xff ) ;
208+ output[j + 1 ] = static_cast < uint8_t >(( input[i] >> 8 ) & 0xff ) ;
209+ output[j + 2 ] = static_cast < uint8_t >(( input[i] >> 16 ) & 0xff ) ;
210+ output[j + 3 ] = static_cast < uint8_t >(( input[i] >> 24 ) & 0xff ) ;
203211 }
204212}
205213
206214// ////////////////////////////
207215
208216// apply MD5 algo on a block
209- void MD5::transform (const uint1 block[blocksize])
217+ void MD5::transform (const uint8_t block[blocksize])
210218{
211- uint4 a = state[0 ], b = state[1 ], c = state[2 ], d = state[3 ], x[16 ];
219+ uint32_t a = state[0 ], b = state[1 ], c = state[2 ], d = state[3 ], x[16 ];
212220 decode (x, block, blocksize);
213221
214222 /* Round 1 */
@@ -419,7 +427,7 @@ std::string mrpt::system::md5(const unsigned char* data, size_t len)
419427{
420428 ASSERT_ (data);
421429 MD5 md5;
422- md5.update (data, len);
430+ md5.update (data, static_cast < uint32_t >( len) );
423431 md5.finalize ();
424432
425433 return md5.hexdigest ();
0 commit comments