kmdcodec.cpp
来自「将konqueror浏览器移植到ARM9 2410中」· C++ 代码 · 共 1,213 行 · 第 1/3 页
CPP
1,213 行
}void KMD5::update( const QByteArray& in ){ update( reinterpret_cast<Q_UINT8 *>(in.data()), in.size() );}void KMD5::update( Q_UINT8 *in, int len ){ if ( len == -1 ) len = qstrlen( reinterpret_cast<char *>(in) ); Q_UINT32 in_index; Q_UINT32 buffer_index; Q_UINT32 buffer_space; Q_UINT32 in_length = static_cast<Q_UINT32>( len ); if (m_finalized) { m_error = ERR_ALREADY_FINALIZED; return; } buffer_index = static_cast<Q_UINT32>((m_count[0] >> 3) & 0x3F); if ( (m_count[0] += (in_length << 3))<(in_length << 3) ) m_count[1]++; m_count[1] += (in_length >> 29); buffer_space = 64 - buffer_index; if (in_length >= buffer_space) { memcpy (m_buffer + buffer_index, in, buffer_space); transform (m_buffer); for (in_index = buffer_space; in_index + 63 < in_length; in_index += 64) transform (in+in_index); buffer_index = 0; } else in_index=0; memcpy(m_buffer+buffer_index, in+in_index, in_length-in_index);}void KMD5::update( FILE *file, bool closeFile ){ Q_UINT8 buffer[1024]; int len; while ((len=fread(buffer, 1, 1024, file))) update(buffer, len); // Check if we got to this point because // we reached EOF or an error. if ( !feof( file ) ) { m_error = ERR_CANNOT_READ_FILE; return; } // Close the file iff the flag is set. if ( closeFile && fclose (file) ) m_error = ERR_CANNOT_CLOSE_FILE;}void KMD5::finalize (){ Q_UINT8 bits[8]; Q_UINT32 index, padLen; static Q_UINT8 PADDING[64]= { 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 }; if (m_finalized) { m_error = ERR_ALREADY_FINALIZED; return; } //encode (bits, m_count, 8); memcpy( bits, m_count, 8 ); // Pad out to 56 mod 64. index = static_cast<Q_UINT32>((m_count[0] >> 3) & 0x3f); padLen = (index < 56) ? (56 - index) : (120 - index); update (PADDING, padLen); // Append length (before padding) update (bits, 8); // Store state in digest //encode (m_digest, m_state, 16); memcpy( m_digest, m_state, 16 ); // Fill sensitive information with zero's memset ( (void *)m_buffer, 0, sizeof(*m_buffer)); m_finalized = true;}void KMD5::reset(){ init();}bool KMD5::verify( const char * msg_digest, DigestType type ){ if ( !m_finalized || !m_digest || m_error != ERR_NONE ) return false; return isDigestMatch( msg_digest, type );}bool KMD5::verify( FILE* f, const char * msg_digest, DigestType type ){ init(); update( f ); finalize(); return isDigestMatch( msg_digest, type );}bool KMD5::verify( const QCString& in, const char * msg_digest, DigestType type ){ init(); update( in ); finalize(); return isDigestMatch( msg_digest, type );}bool KMD5::verify( const QString& in, const char * msg_digest, DigestType type ){ init(); update( in ); finalize(); return isDigestMatch( msg_digest, type );}Q_UINT8* KMD5::rawDigest(){ Q_UINT8* s = new Q_UINT8[16]; rawDigest( reinterpret_cast<char *>(s) ); if ( m_error == ERR_NONE ) return s; else return '\0';}void KMD5::rawDigest( HASH bin ){ if (!m_finalized) { m_error = ERR_NOT_YET_FINALIZED; return; } memcpy( bin, m_digest, 16 );}char * KMD5::hexDigest(){ char *s = new char[33]; hexDigest( s ); if ( m_error == ERR_NONE ) return s; else return 0;}void KMD5::hexDigest( HASHHEX hex ){ if (!m_finalized) { m_error = ERR_NOT_YET_FINALIZED; return; } for (int i=0; i<16; i++) sprintf(hex+i*2, "%02x", m_digest[i]); hex[32]='\0';}void KMD5::init(){ m_finalized = false; m_error = ERR_NONE; m_count[0] = 0; m_count[1] = 0; m_state[0] = 0x67452301; m_state[1] = 0xefcdab89; m_state[2] = 0x98badcfe; m_state[3] = 0x10325476; memset ( static_cast<void *>(m_buffer), 0, sizeof(*m_buffer)); memset ( static_cast<void *>(m_digest), 0, sizeof(*m_digest));}bool KMD5::isDigestMatch( const char * msg_digest, DigestType type ){ bool result = false; switch (type) { case HEX: if ( strcmp( hexDigest(), msg_digest ) == 0 ) result = true; break; case BIN: if ( strcmp( reinterpret_cast<char *>(rawDigest()), msg_digest ) == 0 ) result = true; break; default: break; } return result;}void KMD5::transform( Q_UINT8 block[64] ){ Q_UINT32 a = m_state[0], b = m_state[1], c = m_state[2], d = m_state[3], x[16]; decode (x, block, 64); //memcpy( x, block, 64 ); ASSERT(!m_finalized); // not just a user error, since the method is private /* Round 1 */ FF (a, b, c, d, x[ 0], KMD5_S11, 0xd76aa478); /* 1 */ FF (d, a, b, c, x[ 1], KMD5_S12, 0xe8c7b756); /* 2 */ FF (c, d, a, b, x[ 2], KMD5_S13, 0x242070db); /* 3 */ FF (b, c, d, a, x[ 3], KMD5_S14, 0xc1bdceee); /* 4 */ FF (a, b, c, d, x[ 4], KMD5_S11, 0xf57c0faf); /* 5 */ FF (d, a, b, c, x[ 5], KMD5_S12, 0x4787c62a); /* 6 */ FF (c, d, a, b, x[ 6], KMD5_S13, 0xa8304613); /* 7 */ FF (b, c, d, a, x[ 7], KMD5_S14, 0xfd469501); /* 8 */ FF (a, b, c, d, x[ 8], KMD5_S11, 0x698098d8); /* 9 */ FF (d, a, b, c, x[ 9], KMD5_S12, 0x8b44f7af); /* 10 */ FF (c, d, a, b, x[10], KMD5_S13, 0xffff5bb1); /* 11 */ FF (b, c, d, a, x[11], KMD5_S14, 0x895cd7be); /* 12 */ FF (a, b, c, d, x[12], KMD5_S11, 0x6b901122); /* 13 */ FF (d, a, b, c, x[13], KMD5_S12, 0xfd987193); /* 14 */ FF (c, d, a, b, x[14], KMD5_S13, 0xa679438e); /* 15 */ FF (b, c, d, a, x[15], KMD5_S14, 0x49b40821); /* 16 */ /* Round 2 */ GG (a, b, c, d, x[ 1], KMD5_S21, 0xf61e2562); /* 17 */ GG (d, a, b, c, x[ 6], KMD5_S22, 0xc040b340); /* 18 */ GG (c, d, a, b, x[11], KMD5_S23, 0x265e5a51); /* 19 */ GG (b, c, d, a, x[ 0], KMD5_S24, 0xe9b6c7aa); /* 20 */ GG (a, b, c, d, x[ 5], KMD5_S21, 0xd62f105d); /* 21 */ GG (d, a, b, c, x[10], KMD5_S22, 0x2441453); /* 22 */ GG (c, d, a, b, x[15], KMD5_S23, 0xd8a1e681); /* 23 */ GG (b, c, d, a, x[ 4], KMD5_S24, 0xe7d3fbc8); /* 24 */ GG (a, b, c, d, x[ 9], KMD5_S21, 0x21e1cde6); /* 25 */ GG (d, a, b, c, x[14], KMD5_S22, 0xc33707d6); /* 26 */ GG (c, d, a, b, x[ 3], KMD5_S23, 0xf4d50d87); /* 27 */ GG (b, c, d, a, x[ 8], KMD5_S24, 0x455a14ed); /* 28 */ GG (a, b, c, d, x[13], KMD5_S21, 0xa9e3e905); /* 29 */ GG (d, a, b, c, x[ 2], KMD5_S22, 0xfcefa3f8); /* 30 */ GG (c, d, a, b, x[ 7], KMD5_S23, 0x676f02d9); /* 31 */ GG (b, c, d, a, x[12], KMD5_S24, 0x8d2a4c8a); /* 32 */ /* Round 3 */ HH (a, b, c, d, x[ 5], KMD5_S31, 0xfffa3942); /* 33 */ HH (d, a, b, c, x[ 8], KMD5_S32, 0x8771f681); /* 34 */ HH (c, d, a, b, x[11], KMD5_S33, 0x6d9d6122); /* 35 */ HH (b, c, d, a, x[14], KMD5_S34, 0xfde5380c); /* 36 */ HH (a, b, c, d, x[ 1], KMD5_S31, 0xa4beea44); /* 37 */ HH (d, a, b, c, x[ 4], KMD5_S32, 0x4bdecfa9); /* 38 */ HH (c, d, a, b, x[ 7], KMD5_S33, 0xf6bb4b60); /* 39 */ HH (b, c, d, a, x[10], KMD5_S34, 0xbebfbc70); /* 40 */ HH (a, b, c, d, x[13], KMD5_S31, 0x289b7ec6); /* 41 */ HH (d, a, b, c, x[ 0], KMD5_S32, 0xeaa127fa); /* 42 */ HH (c, d, a, b, x[ 3], KMD5_S33, 0xd4ef3085); /* 43 */ HH (b, c, d, a, x[ 6], KMD5_S34, 0x4881d05); /* 44 */ HH (a, b, c, d, x[ 9], KMD5_S31, 0xd9d4d039); /* 45 */ HH (d, a, b, c, x[12], KMD5_S32, 0xe6db99e5); /* 46 */ HH (c, d, a, b, x[15], KMD5_S33, 0x1fa27cf8); /* 47 */ HH (b, c, d, a, x[ 2], KMD5_S34, 0xc4ac5665); /* 48 */ /* Round 4 */ II (a, b, c, d, x[ 0], KMD5_S41, 0xf4292244); /* 49 */ II (d, a, b, c, x[ 7], KMD5_S42, 0x432aff97); /* 50 */ II (c, d, a, b, x[14], KMD5_S43, 0xab9423a7); /* 51 */ II (b, c, d, a, x[ 5], KMD5_S44, 0xfc93a039); /* 52 */ II (a, b, c, d, x[12], KMD5_S41, 0x655b59c3); /* 53 */ II (d, a, b, c, x[ 3], KMD5_S42, 0x8f0ccc92); /* 54 */ II (c, d, a, b, x[10], KMD5_S43, 0xffeff47d); /* 55 */ II (b, c, d, a, x[ 1], KMD5_S44, 0x85845dd1); /* 56 */ II (a, b, c, d, x[ 8], KMD5_S41, 0x6fa87e4f); /* 57 */ II (d, a, b, c, x[15], KMD5_S42, 0xfe2ce6e0); /* 58 */ II (c, d, a, b, x[ 6], KMD5_S43, 0xa3014314); /* 59 */ II (b, c, d, a, x[13], KMD5_S44, 0x4e0811a1); /* 60 */ II (a, b, c, d, x[ 4], KMD5_S41, 0xf7537e82); /* 61 */ II (d, a, b, c, x[11], KMD5_S42, 0xbd3af235); /* 62 */ II (c, d, a, b, x[ 2], KMD5_S43, 0x2ad7d2bb); /* 63 */ II (b, c, d, a, x[ 9], KMD5_S44, 0xeb86d391); /* 64 */ m_state[0] += a; m_state[1] += b; m_state[2] += c; m_state[3] += d; memset ( static_cast<void *>(x), 0, sizeof(x) );}inline Q_UINT32 KMD5::rotate_left (Q_UINT32 x, Q_UINT32 n){ return (x << n) | (x >> (32-n)) ;}inline Q_UINT32 KMD5::F (Q_UINT32 x, Q_UINT32 y, Q_UINT32 z){ return (x & y) | (~x & z);}inline Q_UINT32 KMD5::G (Q_UINT32 x, Q_UINT32 y, Q_UINT32 z){ return (x & z) | (y & ~z);}inline Q_UINT32 KMD5::H (Q_UINT32 x, Q_UINT32 y, Q_UINT32 z){ return x ^ y ^ z;}inline Q_UINT32 KMD5::I (Q_UINT32 x, Q_UINT32 y, Q_UINT32 z){ return y ^ (x | ~z);}void KMD5::FF ( Q_UINT32& a, Q_UINT32 b, Q_UINT32 c, Q_UINT32 d, Q_UINT32 x, Q_UINT32 s, Q_UINT32 ac ){ a += F(b, c, d) + x + ac; a = rotate_left (a, s) +b;}void KMD5::GG ( Q_UINT32& a, Q_UINT32 b, Q_UINT32 c, Q_UINT32 d, Q_UINT32 x, Q_UINT32 s, Q_UINT32 ac){ a += G(b, c, d) + x + ac; a = rotate_left (a, s) +b;}void KMD5::HH ( Q_UINT32& a, Q_UINT32 b, Q_UINT32 c, Q_UINT32 d, Q_UINT32 x, Q_UINT32 s, Q_UINT32 ac ){ a += H(b, c, d) + x + ac; a = rotate_left (a, s) +b;}void KMD5::II ( Q_UINT32& a, Q_UINT32 b, Q_UINT32 c, Q_UINT32 d, Q_UINT32 x, Q_UINT32 s, Q_UINT32 ac ){ a += I(b, c, d) + x + ac; a = rotate_left (a, s) +b;}void KMD5::encode ( Q_UINT8 *output, Q_UINT32 *in, Q_UINT32 len ){#if !defined(WORDS_BIGENDIAN) memcpy(output, in, len);#else Q_UINT32 i, j; for (i = 0, j = 0; j < len; i++, j += 4) { output[j] = static_cast<Q_UINT8>((in[i] & 0xff)); output[j+1] = static_cast<Q_UINT8>(((in[i] >> 8) & 0xff)); output[j+2] = static_cast<Q_UINT8>(((in[i] >> 16) & 0xff)); output[j+3] = static_cast<Q_UINT8>(((in[i] >> 24) & 0xff)); }#endif}// Decodes in (Q_UINT8) into output (Q_UINT32). Assumes len is a// multiple of 4.void KMD5::decode (Q_UINT32 *output, Q_UINT8 *in, Q_UINT32 len){#if !defined(WORDS_BIGENDIAN) memcpy(output, in, len);#else Q_UINT32 i, j; for (i = 0, j = 0; j < len; i++, j += 4) output[i] = static_cast<Q_UINT32>(in[j]) | (static_cast<Q_UINT32>(in[j+1]) << 8) | (static_cast<Q_UINT32>(in[j+2]) << 16) | (static_cast<Q_UINT32>(in[j+3]) << 24);#endif}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?