From 48540940b6c28bb4378abfeb500ec45a625b37b6 Mon Sep 17 00:00:00 2001 From: Vadim Dashevskiy Date: Tue, 15 May 2012 10:38:20 +0000 Subject: initial commit git-svn-id: http://svn.miranda-ng.org/main/trunk@2 1316c22d-e87f-b044-9b9b-93d7a3e3ba9c --- plugins/CryptoPP/cpp_rsau.cpp | 258 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 258 insertions(+) create mode 100644 plugins/CryptoPP/cpp_rsau.cpp (limited to 'plugins/CryptoPP/cpp_rsau.cpp') diff --git a/plugins/CryptoPP/cpp_rsau.cpp b/plugins/CryptoPP/cpp_rsau.cpp new file mode 100644 index 0000000000..6644e715fa --- /dev/null +++ b/plugins/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