diff options
| -rw-r--r-- | src/crypt.cpp | 40 | ||||
| -rw-r--r-- | src/crypt.h | 12 | ||||
| -rw-r--r-- | src/cryptohash.h | 3 | ||||
| -rw-r--r-- | src/formatter.h | 6 | ||||
| -rw-r--r-- | src/md5.cpp | 47 | ||||
| -rw-r--r-- | src/md5.h | 3 | ||||
| -rw-r--r-- | src/tests/cryptpass.cpp | 18 | ||||
| -rw-r--r-- | src/tests/md5.cpp | 2 | ||||
| -rw-r--r-- | src/util.cpp | 1 |
9 files changed, 116 insertions, 16 deletions
diff --git a/src/crypt.cpp b/src/crypt.cpp new file mode 100644 index 0000000..9111cda --- /dev/null +++ b/src/crypt.cpp | |||
| @@ -0,0 +1,40 @@ | |||
| 1 | #include "bu/crypt.h" | ||
| 2 | #include "bu/md5.h" | ||
| 3 | #include "bu/base64.h" | ||
| 4 | #include "bu/membuf.h" | ||
| 5 | #include "bu/file.h" | ||
| 6 | |||
| 7 | Bu::FString Bu::cryptPass( const Bu::FString &sPass, const Bu::FString &sSalt ) | ||
| 8 | { | ||
| 9 | Bu::Md5 md5; | ||
| 10 | Bu::MemBuf mbOut; | ||
| 11 | Bu::Base64 b64Out( mbOut ); | ||
| 12 | |||
| 13 | Bu::FString::const_iterator i = sSalt.find('$'); | ||
| 14 | Bu::FString sSaltSml = sSalt.getSubStr( sSalt.begin(), i ); | ||
| 15 | |||
| 16 | md5.addData( sPass ); | ||
| 17 | md5.addData( sSaltSml ); | ||
| 18 | md5.writeResult( b64Out ); | ||
| 19 | |||
| 20 | b64Out.stop(); | ||
| 21 | |||
| 22 | return sSaltSml + "$" + mbOut.getString(); | ||
| 23 | } | ||
| 24 | |||
| 25 | Bu::FString Bu::cryptPass( const Bu::FString &sPass ) | ||
| 26 | { | ||
| 27 | Bu::MemBuf mbSalt; | ||
| 28 | Bu::Base64 b64Salt( mbSalt ); | ||
| 29 | Bu::File fRand("/dev/urandom", Bu::File::Read ); | ||
| 30 | |||
| 31 | #define STR 6 | ||
| 32 | char buf[STR]; | ||
| 33 | fRand.read( buf, STR ); | ||
| 34 | b64Salt.write( buf, STR ); | ||
| 35 | |||
| 36 | b64Salt.stop(); | ||
| 37 | |||
| 38 | return cryptPass( sPass, mbSalt.getString() ); | ||
| 39 | } | ||
| 40 | |||
diff --git a/src/crypt.h b/src/crypt.h new file mode 100644 index 0000000..1ea1b85 --- /dev/null +++ b/src/crypt.h | |||
| @@ -0,0 +1,12 @@ | |||
| 1 | #ifndef BU_CRYPT_H | ||
| 2 | #define BU_CRYPT_H | ||
| 3 | |||
| 4 | #include "bu/fstring.h" | ||
| 5 | |||
| 6 | namespace Bu | ||
| 7 | { | ||
| 8 | FString cryptPass( const FString &sPass, const FString &sSalt ); | ||
| 9 | FString cryptPass( const FString &sPass ); | ||
| 10 | }; | ||
| 11 | |||
| 12 | #endif | ||
diff --git a/src/cryptohash.h b/src/cryptohash.h index 87aaf09..91c9511 100644 --- a/src/cryptohash.h +++ b/src/cryptohash.h | |||
| @@ -12,6 +12,8 @@ | |||
| 12 | 12 | ||
| 13 | namespace Bu | 13 | namespace Bu |
| 14 | { | 14 | { |
| 15 | class Stream; | ||
| 16 | |||
| 15 | class CryptoHash | 17 | class CryptoHash |
| 16 | { | 18 | { |
| 17 | public: | 19 | public: |
| @@ -23,6 +25,7 @@ namespace Bu | |||
| 23 | virtual void addData( const void *sData, int iSize ) = 0; | 25 | virtual void addData( const void *sData, int iSize ) = 0; |
| 24 | virtual void addData( const Bu::FString &sData ); | 26 | virtual void addData( const Bu::FString &sData ); |
| 25 | virtual FString getResult() = 0; | 27 | virtual FString getResult() = 0; |
| 28 | virtual void writeResult( Stream &sOut ) = 0; | ||
| 26 | }; | 29 | }; |
| 27 | }; | 30 | }; |
| 28 | 31 | ||
diff --git a/src/formatter.h b/src/formatter.h index 8bb8e08..9f407a4 100644 --- a/src/formatter.h +++ b/src/formatter.h | |||
| @@ -134,6 +134,7 @@ namespace Bu | |||
| 134 | { | 134 | { |
| 135 | // This code is taken from Nango, hopefully we can make it better. | 135 | // This code is taken from Nango, hopefully we can make it better. |
| 136 | bool bNeg = i<0; | 136 | bool bNeg = i<0; |
| 137 | char cBase = fLast.bCaps?'A':'a'; | ||
| 137 | char buf[sizeof(type)*8+1]; | 138 | char buf[sizeof(type)*8+1]; |
| 138 | if( bNeg ) i = -i; | 139 | if( bNeg ) i = -i; |
| 139 | if( fLast.uRadix < 2 || fLast.uRadix > 36 ) | 140 | if( fLast.uRadix < 2 || fLast.uRadix > 36 ) |
| @@ -146,7 +147,7 @@ namespace Bu | |||
| 146 | { | 147 | { |
| 147 | int c = i%fLast.uRadix; | 148 | int c = i%fLast.uRadix; |
| 148 | i /= fLast.uRadix; | 149 | i /= fLast.uRadix; |
| 149 | buf[j] = (char)((c<10)?('0'+c):('A'+c-10)); | 150 | buf[j] = (char)((c<10)?('0'+c):(cBase+c-10)); |
| 150 | if( i == 0 ) | 151 | if( i == 0 ) |
| 151 | { | 152 | { |
| 152 | if( bNeg ) buf[--j] = '-'; | 153 | if( bNeg ) buf[--j] = '-'; |
| @@ -164,6 +165,7 @@ namespace Bu | |||
| 164 | { | 165 | { |
| 165 | // This code is taken from Nango, hopefully we can make it better. | 166 | // This code is taken from Nango, hopefully we can make it better. |
| 166 | char buf[sizeof(type)*8+1]; | 167 | char buf[sizeof(type)*8+1]; |
| 168 | char cBase = fLast.bCaps?'A':'a'; | ||
| 167 | if( fLast.uRadix < 2 || fLast.uRadix > 36 ) | 169 | if( fLast.uRadix < 2 || fLast.uRadix > 36 ) |
| 168 | { | 170 | { |
| 169 | usedFormat(); | 171 | usedFormat(); |
| @@ -174,7 +176,7 @@ namespace Bu | |||
| 174 | { | 176 | { |
| 175 | int c = i%fLast.uRadix; | 177 | int c = i%fLast.uRadix; |
| 176 | i /= fLast.uRadix; | 178 | i /= fLast.uRadix; |
| 177 | buf[j] = (char)((c<10)?('0'+c):('A'+c-10)); | 179 | buf[j] = (char)((c<10)?('0'+c):(cBase+c-10)); |
| 178 | if( i == 0 ) | 180 | if( i == 0 ) |
| 179 | { | 181 | { |
| 180 | if( fLast.bPlus ) buf[--j] = '+'; | 182 | if( fLast.bPlus ) buf[--j] = '+'; |
diff --git a/src/md5.cpp b/src/md5.cpp index 14b244a..8d7b7c9 100644 --- a/src/md5.cpp +++ b/src/md5.cpp | |||
| @@ -9,6 +9,8 @@ | |||
| 9 | #include <stdlib.h> | 9 | #include <stdlib.h> |
| 10 | #include <string.h> | 10 | #include <string.h> |
| 11 | #include "md5.h" | 11 | #include "md5.h" |
| 12 | #include "bu/stream.h" | ||
| 13 | |||
| 12 | 14 | ||
| 13 | // This performs a wrapping bitwise shift, kinda' fun! | 15 | // This performs a wrapping bitwise shift, kinda' fun! |
| 14 | 16 | ||
| @@ -84,11 +86,39 @@ void Bu::Md5::addData( const void *sVData, int iSize ) | |||
| 84 | 86 | ||
| 85 | Bu::FString Bu::Md5::getResult() | 87 | Bu::FString Bu::Md5::getResult() |
| 86 | { | 88 | { |
| 89 | long lsum[4]; | ||
| 90 | compCap( lsum ); | ||
| 91 | return Bu::FString( (const char *)lsum, 4*4 ); | ||
| 92 | } | ||
| 93 | |||
| 94 | void Bu::Md5::writeResult( Bu::Stream &sOut ) | ||
| 95 | { | ||
| 96 | long lsum[4]; | ||
| 97 | compCap( lsum ); | ||
| 98 | sOut.write( lsum, 4*4 ); | ||
| 99 | } | ||
| 100 | |||
| 101 | Bu::FString Bu::Md5::getHexResult() | ||
| 102 | { | ||
| 87 | static const char hex_tab[] = {"0123456789abcdef"}; | 103 | static const char hex_tab[] = {"0123456789abcdef"}; |
| 88 | char str[33]; | 104 | char str[33]; |
| 89 | 105 | ||
| 90 | long lsum[4]; | 106 | long lsum[4]; |
| 91 | memcpy( lsum, sum, 4*4 ); | 107 | compCap( lsum ); |
| 108 | |||
| 109 | int k = 0; | ||
| 110 | for( int i = 0; i < 16; i++ ) | ||
| 111 | { | ||
| 112 | str[k++] = hex_tab[(lsum[i>>2] >> ((i%4)*8+4)) & 0xF]; | ||
| 113 | str[k++] = hex_tab[(lsum[i>>2] >> ((i%4)*8 )) & 0xF]; | ||
| 114 | } | ||
| 115 | |||
| 116 | return Bu::FString( str, 32 ); | ||
| 117 | } | ||
| 118 | |||
| 119 | void Bu::Md5::compCap( long *sumout ) | ||
| 120 | { | ||
| 121 | memcpy( sumout, sum, 4*4 ); | ||
| 92 | long lbuf[16]; | 122 | long lbuf[16]; |
| 93 | memcpy( lbuf, inbuf, 4*16 ); | 123 | memcpy( lbuf, inbuf, 4*16 ); |
| 94 | 124 | ||
| @@ -96,25 +126,16 @@ Bu::FString Bu::Md5::getResult() | |||
| 96 | uint64_t iBits = iBytes*8; | 126 | uint64_t iBits = iBytes*8; |
| 97 | if( iBytes > 0 && iFill>>2 >= 14 ) | 127 | if( iBytes > 0 && iFill>>2 >= 14 ) |
| 98 | { | 128 | { |
| 99 | compBlock( lbuf, lsum ); | 129 | compBlock( lbuf, sumout ); |
| 100 | memset( lbuf, 0, 4*16 ); | 130 | memset( lbuf, 0, 4*16 ); |
| 101 | memcpy( lbuf+14, &iBits, 8 ); | 131 | memcpy( lbuf+14, &iBits, 8 ); |
| 102 | compBlock( lbuf, lsum ); | 132 | compBlock( lbuf, sumout ); |
| 103 | } | 133 | } |
| 104 | else | 134 | else |
| 105 | { | 135 | { |
| 106 | memcpy( lbuf+14, &iBits, 8 ); | 136 | memcpy( lbuf+14, &iBits, 8 ); |
| 107 | compBlock( lbuf, lsum ); | 137 | compBlock( lbuf, sumout ); |
| 108 | } | 138 | } |
| 109 | |||
| 110 | int k = 0; | ||
| 111 | for( int i = 0; i < 16; i++ ) | ||
| 112 | { | ||
| 113 | str[k++] = hex_tab[(lsum[i>>2] >> ((i%4)*8+4)) & 0xF]; | ||
| 114 | str[k++] = hex_tab[(lsum[i>>2] >> ((i%4)*8 )) & 0xF]; | ||
| 115 | } | ||
| 116 | |||
| 117 | return Bu::FString( str, 32 ); | ||
| 118 | } | 139 | } |
| 119 | 140 | ||
| 120 | void Bu::Md5::compBlock( long *x, long *lsum ) | 141 | void Bu::Md5::compBlock( long *x, long *lsum ) |
| @@ -30,12 +30,15 @@ namespace Bu | |||
| 30 | virtual void addData( const void *sData, int iSize ); | 30 | virtual void addData( const void *sData, int iSize ); |
| 31 | using Bu::CryptoHash::addData; | 31 | using Bu::CryptoHash::addData; |
| 32 | virtual FString getResult(); | 32 | virtual FString getResult(); |
| 33 | virtual void writeResult( Bu::Stream &sOut ); | ||
| 34 | virtual FString getHexResult(); | ||
| 33 | 35 | ||
| 34 | private: | 36 | private: |
| 35 | /** | 37 | /** |
| 36 | * Compute one block of input data. | 38 | * Compute one block of input data. |
| 37 | */ | 39 | */ |
| 38 | void compBlock( long *x, long *lsum ); | 40 | void compBlock( long *x, long *lsum ); |
| 41 | void compCap( long *sumout ); | ||
| 39 | 42 | ||
| 40 | long inbuf[16]; | 43 | long inbuf[16]; |
| 41 | long iFill; | 44 | long iFill; |
diff --git a/src/tests/cryptpass.cpp b/src/tests/cryptpass.cpp new file mode 100644 index 0000000..4b090fe --- /dev/null +++ b/src/tests/cryptpass.cpp | |||
| @@ -0,0 +1,18 @@ | |||
| 1 | #include "bu/crypt.h" | ||
| 2 | #include "bu/sio.h" | ||
| 3 | |||
| 4 | using namespace Bu; | ||
| 5 | |||
| 6 | int main( int argc, char *argv[] ) | ||
| 7 | { | ||
| 8 | if( argc == 1 ) | ||
| 9 | sio << "Syntax: " << argv[0] << " <password> [salt]" << sio.nl | ||
| 10 | << sio.nl; | ||
| 11 | else if( argc == 2 ) | ||
| 12 | sio << "Crypt1: >> " << cryptPass( argv[1] ) << " <<" << sio.nl; | ||
| 13 | else | ||
| 14 | sio << "Crypt2: >> " << cryptPass( argv[1], argv[2] ) << " <<" << sio.nl; | ||
| 15 | |||
| 16 | return 0; | ||
| 17 | } | ||
| 18 | |||
diff --git a/src/tests/md5.cpp b/src/tests/md5.cpp index 3b3d5e7..69ddd1d 100644 --- a/src/tests/md5.cpp +++ b/src/tests/md5.cpp | |||
| @@ -28,7 +28,7 @@ int main( int argc, char *argv[] ) | |||
| 28 | break; | 28 | break; |
| 29 | } | 29 | } |
| 30 | 30 | ||
| 31 | sio << m.getResult() << " *" << *argv << sio.nl; | 31 | sio << m.getHexResult() << " *" << *argv << sio.nl; |
| 32 | } | 32 | } |
| 33 | } | 33 | } |
| 34 | 34 | ||
diff --git a/src/util.cpp b/src/util.cpp new file mode 100644 index 0000000..111574c --- /dev/null +++ b/src/util.cpp | |||
| @@ -0,0 +1 @@ | |||
| #include "bu/util.h" | |||
