From f4c20290509d7ed3a8fd5304577e7a4cc0b9d974 Mon Sep 17 00:00:00 2001 From: Mike Buland Date: Tue, 3 Apr 2007 03:49:53 +0000 Subject: Ok, no code is left in src, it's all in src/old. We'll gradually move code back into src as it's fixed and re-org'd. This includes tests, which, I may write a unit test system into libbu++ just to make my life easier. --- src/sha1.cpp | 161 ----------------------------------------------------------- 1 file changed, 161 deletions(-) delete mode 100644 src/sha1.cpp (limited to 'src/sha1.cpp') diff --git a/src/sha1.cpp b/src/sha1.cpp deleted file mode 100644 index 8270c3b..0000000 --- a/src/sha1.cpp +++ /dev/null @@ -1,161 +0,0 @@ -#include -#include -#include - -#include "sha1.h" - -Sha1::Sha1() : - H0( 0x67452301 ), - H1( 0xefcdab89 ), - H2( 0x98badcfe ), - H3( 0x10325476 ), - H4( 0xc3d2e1f0 ), - unprocessedBytes( 0 ), - size( 0 ) -{ -} - -Sha1::~Sha1() -{ -} - -void Sha1::process() -{ - int t; - uint32_t a, b, c, d, e, K, f, W[80]; - - // starting values - a = H0; - b = H1; - c = H2; - d = H3; - e = H4; - - // copy and expand the message block - for( t = 0; t < 16; t++ ) W[t] = (bytes[t*4] << 24) - +(bytes[t*4 + 1] << 16) - +(bytes[t*4 + 2] << 8) - + bytes[t*4 + 3]; - for(; t< 80; t++ ) W[t] = lrot( W[t-3]^W[t-8]^W[t-14]^W[t-16], 1 ); - - /* main loop */ - uint32_t temp; - for( t = 0; t < 80; t++ ) - { - if( t < 20 ) { - K = 0x5a827999; - f = (b & c) | ((~b) & d); - } else if( t < 40 ) { - K = 0x6ed9eba1; - f = b ^ c ^ d; - } else if( t < 60 ) { - K = 0x8f1bbcdc; - f = (b & c) | (b & d) | (c & d); - } else { - K = 0xca62c1d6; - f = b ^ c ^ d; - } - temp = lrot(a,5) + f + e + W[t] + K; - e = d; - d = c; - c = lrot(b,30); - b = a; - a = temp; - //printf( "t=%d %08x %08x %08x %08x %08x\n",t,a,b,c,d,e ); - } - - /* add variables */ - H0 += a; - H1 += b; - H2 += c; - H3 += d; - H4 += e; - - //printf( "Current: %08x %08x %08x %08x %08x\n",H0,H1,H2,H3,H4 ); - /* all bytes have been processed */ - unprocessedBytes = 0; -} - -void Sha1::update( const char* data, int num ) -{ - // add these bytes to the running total - size += num; - - // repeat until all data is processed - while( num > 0 ) - { - // number of bytes required to complete block - int needed = 64 - unprocessedBytes; - - // number of bytes to copy (use smaller of two) - int toCopy = (num < needed) ? num : needed; - - // Copy the bytes - memcpy( bytes + unprocessedBytes, data, toCopy ); - - // Bytes have been copied - num -= toCopy; - data += toCopy; - unprocessedBytes += toCopy; - - // there is a full block - if( unprocessedBytes == 64 ) process(); - } -} - -unsigned char* Sha1::getDigest() -{ - // save the message size - uint32_t totalBitsL = size << 3; - uint32_t totalBitsH = size >> 29; - - // add 0x80 to the message - update( "\x80", 1 ); - - unsigned char footer[64] = { - 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, 0 }; - - // block has no room for 8-byte filesize, so finish it - if( unprocessedBytes > 56 ) - update( (char*)footer, 64 - unprocessedBytes); - - // how many zeros do we need - int neededZeros = 56 - unprocessedBytes; - - // store file size (in bits) in big-endian format - toBigEndian( totalBitsH, footer + neededZeros ); - toBigEndian( totalBitsL, footer + neededZeros + 4 ); - - // finish the final block - update( (char*)footer, neededZeros + 8 ); - - // allocate memory for the digest bytes - unsigned char* digest = new unsigned char[20]; - - // copy the digest bytes - toBigEndian( H0, digest ); - toBigEndian( H1, digest + 4 ); - toBigEndian( H2, digest + 8 ); - toBigEndian( H3, digest + 12 ); - toBigEndian( H4, digest + 16 ); - - // return the digest - return digest; -} - -uint32_t Sha1::lrot( uint32_t x, int bits ) -{ - return (x<>(32 - bits)); -}; - -void Sha1::toBigEndian( uint32_t num, unsigned char* byte ) -{ - byte[0] = (unsigned char)(num>>24); - byte[1] = (unsigned char)(num>>16); - byte[2] = (unsigned char)(num>>8); - byte[3] = (unsigned char)num; -} - -- cgit v1.2.3