X-Git-Url: https://git.pterodactylus.net/?p=fms.git;a=blobdiff_plain;f=src%2Ffreenet%2Ffrostidentity.cpp;fp=src%2Ffreenet%2Ffrostidentity.cpp;h=0c6d29d53ab30afc827baf9937b36c3c52a07264;hp=0000000000000000000000000000000000000000;hb=109c20e6f822c6efa465af31249e5608469253b6;hpb=9ae3b1434e51788e6feb72e1415ec800d05c535a diff --git a/src/freenet/frostidentity.cpp b/src/freenet/frostidentity.cpp new file mode 100644 index 0000000..0c6d29d --- /dev/null +++ b/src/freenet/frostidentity.cpp @@ -0,0 +1,104 @@ +#include "../../include/freenet/frostidentity.h" +#include "../../include/stringfunctions.h" +#include "../../include/base64.h" + +#include + +FrostIdentity::FrostIdentity() +{ + std::memset(&m_rsa,0,sizeof(m_rsa)); +} + +FrostIdentity::~FrostIdentity() +{ + rsa_free(&m_rsa); +} + +const bool FrostIdentity::FromPublicKey(const std::string &publickey) +{ + std::vector keyparts; + std::vector edata; + std::vector ndata; + + rsa_free(&m_rsa); + std::memset(&m_rsa,0,sizeof(m_rsa)); + + StringFunctions::Split(publickey,":",keyparts); + + if(keyparts.size()==2) + { + Base64::Decode(keyparts[0],edata); + Base64::Decode(keyparts[1],ndata); + + m_rsa.type=PK_PUBLIC; +#ifdef LTC_SOURCE + mp_init(&m_rsa.N); + mp_init(&m_rsa.e); + mp_read_unsigned_bin(m_rsa.N,&ndata[0],ndata.size()); + mp_read_unsigned_bin(m_rsa.e,&edata[0],edata.size()); +#else + ltm_desc.init(&m_rsa.N); + ltm_desc.init(&m_rsa.e); + ltm_desc.unsigned_read(m_rsa.N,&ndata[0],ndata.size()); + ltm_desc.unsigned_read(m_rsa.e,&edata[0],edata.size()); +#endif + + m_publickey=publickey; + + return true; + } + else + { + return false; + } +} + +const bool FrostIdentity::VerifyAuthor(const std::string &author) +{ + std::vector authorparts; + std::vector authorhash(100,0); + unsigned long authorhashlen=authorhash.size(); + std::string authorhashstr=""; + std::vector publickeydata(m_publickey.begin(),m_publickey.end()); + + StringFunctions::Split(author,"@",authorparts); + + if(m_publickey!="" && authorparts.size()==2) + { + hash_memory(find_hash("sha1"),&publickeydata[0],publickeydata.size(),&authorhash[0],&authorhashlen); + authorhash.resize(authorhashlen); + + Base64::Encode(authorhash,authorhashstr); + + authorhashstr.erase(27); + authorhashstr=StringFunctions::Replace(authorhashstr,"/","_"); + + return (authorhashstr==authorparts[1]); + + } + else + { + return false; + } + +} + +const bool FrostIdentity::VerifySignature(const std::vector &data, const std::string &signature) +{ + std::vector sigdata; + std::vector hashdata(100,0); + unsigned long hashlen=hashdata.size(); + int status,rval; + + rval=status=0; + + Base64::Decode(signature,sigdata); + + hash_memory(find_hash("sha1"),&data[0],data.size(),&hashdata[0],&hashlen); + hashdata.resize(hashlen); + + rval=rsa_verify_hash_ex(&sigdata[0],sigdata.size(),&hashdata[0],hashdata.size(),LTC_PKCS_1_PSS,find_hash("sha1"),16,&status,&m_rsa); + + return (rval==0 && status==1) ? true : false; + +}