From cb4a46e7fbe62d788e66ed6121c717a2d22a4d7c Mon Sep 17 00:00:00 2001 From: watcherhd Date: Thu, 21 Apr 2011 14:14:52 +0000 Subject: svn.miranda.im is moving to a new home! git-svn-id: http://miranda-plugins.googlecode.com/svn/trunk@7 e753b5eb-9565-29b2-b5c5-2cc6f99dfbcb --- cryptopp/cpp_rsau.cpp | 258 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 258 insertions(+) create mode 100644 cryptopp/cpp_rsau.cpp (limited to 'cryptopp/cpp_rsau.cpp') diff --git a/cryptopp/cpp_rsau.cpp b/cryptopp/cpp_rsau.cpp new file mode 100644 index 0000000..6644e71 --- /dev/null +++ b/cryptopp/cpp_rsau.cpp @@ -0,0 +1,258 @@ +#include "commonheaders.h" + +const string padding = "PADDING!PADDING!PADDING!PADDING!"; // 256 bit + + +string pad256(string& str) { + string out = str; + int pad = out.length() % 32; + if( pad ) { // надо выровнять на 256 бит + if( pad>3 ) { + out += tlv(0,padding.substr(0,32-3-pad)); + } + else { + if( pad==3 ) out += string("\0\0\0"); + else + if( pad==2 ) out += string("\0\0"); + else out += string("\0"); + } + } + return out; +} + + +string& add_delim(string& str, const string& del, int len) { + string val; + for( u_int i=0; i 3 ) { + t = 0; + b.copy((char*)&t,3); + u_int l = t>>8; + t &= 0xFF; + if( b.length() >= 3+l ) { + v = b.substr(3,l); + r = b.substr(3+l); + } + } + if( !v.length() ) { + t = -1; + } + b = r; + return b; +} + + +string& un_tlv(string& b, int& t, int& v) { + string s; + un_tlv(b,t,s); + v = 0; + s.copy((char*)&v,s.length()); + return b; +} + + +int str2int(string& s) { + int v = 0; + if( s.length()<=sizeof(int) ) + s.copy((char*)&v,s.length()); + return v; +} + + +string hash(string& b) +{ + return hash((PBYTE)b.data(),b.length()); +} + + +string hash(PBYTE b, int l) +{ + BYTE h[RSA_KEYSIZE]; + RSA_CalculateDigest(h, b, l); + string s; s.assign((char*)&h,RSA_KEYSIZE); + return s; +} + + +string hash128(string& b) +{ + return hash128((PBYTE)b.data(),b.length()); +} + + +string hash128(LPSTR b) +{ + return hash128((PBYTE)b,strlen(b)); +} + + +string hash128(PBYTE b, int l) +{ + BYTE h[RIPEMD128::DIGESTSIZE]; + RIPEMD128().CalculateDigest(h, b, l); + string s; s.assign((char*)&h,sizeof(h)); + return s; +} + + +string hash256(string& b) +{ + return hash256((PBYTE)b.data(),b.length()); +} + + +string hash256(LPSTR b) +{ + return hash256((PBYTE)b,strlen(b)); +} + + +string hash256(PBYTE b, int l) +{ +// BYTE h[SHA256::DIGESTSIZE]; +// SHA256().CalculateDigest(h, b, l); + BYTE h[RIPEMD256::DIGESTSIZE]; + RIPEMD256().CalculateDigest(h, b, l); + string s; s.assign((char*)&h,sizeof(h)); + return s; +} + + +Integer BinaryToInteger(const string& data) +{ + StringSource ss(data, true, NULL); + SecByteBlock result(ss.MaxRetrievable()); + ss.Get(result, result.size()); + return Integer(result, result.size()); +} + + +string IntegerToBinary(const Integer& value) +{ + SecByteBlock sbb(value.MinEncodedSize()); + value.Encode(sbb, sbb.size()); + string data; + StringSource(sbb, sbb.size(), true, new StringSink(data)); + return data; +} + +/* +RandomPool& GlobalRNG() +{ + static RandomPool randomPool; + return randomPool; +} +*/ + +AutoSeededRandomPool& GlobalRNG() +{ + static AutoSeededRandomPool randomPool; + return randomPool; +} + + +void GenerateRSAKey(unsigned int keyLength, string& privKey, string& pubKey) +{ + RSAES_PKCS1v15_Decryptor priv(GlobalRNG(), keyLength); + StringSink privFile(privKey); + priv.DEREncode(privFile); + privFile.MessageEnd(); + + RSAES_PKCS1v15_Encryptor pub(priv); + StringSink pubFile(pubKey); + pub.DEREncode(pubFile); + pubFile.MessageEnd(); +} + + +string RSAEncryptString(const RSA::PublicKey& pubkey, const string& plaintext) +{ + RSAES_PKCS1v15_Encryptor pub(pubkey); + + string result; + StringSource(plaintext, true, new PK_EncryptorFilter(GlobalRNG(), pub, new StringSink(result))); + return result; +} + + +string RSADecryptString(const RSA::PrivateKey& privkey, const string& ciphertext) +{ + RSAES_PKCS1v15_Decryptor priv(privkey); + + string result; + try { + StringSource(ciphertext, true, new PK_DecryptorFilter(GlobalRNG(), priv, new StringSink(result))); + } + catch (...) { + ; + } + return result; +} + + +string RSASignString(const RSA::PrivateKey& privkey, const string& plaintext) +{ + RSASSA_PKCS1v15_SHA_Signer priv(privkey); + + string result; + try { + StringSource(plaintext, true, new SignerFilter(GlobalRNG(), priv, new StringSink(result))); + } + catch (...) { + ; + } + return result; +} + + +BOOL RSAVerifyString(const RSA::PublicKey& pubkey, const string& plaintext, const string& sig) +{ + RSASSA_PKCS1v15_SHA_Verifier ver(pubkey); + + return ver.VerifyMessage((PBYTE)plaintext.data(), plaintext.length(), (PBYTE)sig.data(), sig.length()); +} + + +// EOF -- cgit v1.2.3