--- /dev/null
+#include "../../include/freenet/frostidentity.h"\r
+#include "../../include/stringfunctions.h"\r
+#include "../../include/base64.h"\r
+\r
+#include <cstring>\r
+\r
+FrostIdentity::FrostIdentity()\r
+{\r
+ std::memset(&m_rsa,0,sizeof(m_rsa));\r
+}\r
+\r
+FrostIdentity::~FrostIdentity()\r
+{\r
+ rsa_free(&m_rsa);\r
+}\r
+\r
+const bool FrostIdentity::FromPublicKey(const std::string &publickey)\r
+{\r
+ std::vector<std::string> keyparts;\r
+ std::vector<unsigned char> edata;\r
+ std::vector<unsigned char> ndata;\r
+\r
+ rsa_free(&m_rsa);\r
+ std::memset(&m_rsa,0,sizeof(m_rsa));\r
+\r
+ StringFunctions::Split(publickey,":",keyparts);\r
+\r
+ if(keyparts.size()==2)\r
+ {\r
+ Base64::Decode(keyparts[0],edata);\r
+ Base64::Decode(keyparts[1],ndata);\r
+\r
+ m_rsa.type=PK_PUBLIC;\r
+#ifdef LTC_SOURCE\r
+ mp_init(&m_rsa.N);\r
+ mp_init(&m_rsa.e);\r
+ mp_read_unsigned_bin(m_rsa.N,&ndata[0],ndata.size());\r
+ mp_read_unsigned_bin(m_rsa.e,&edata[0],edata.size());\r
+#else\r
+ ltm_desc.init(&m_rsa.N);\r
+ ltm_desc.init(&m_rsa.e);\r
+ ltm_desc.unsigned_read(m_rsa.N,&ndata[0],ndata.size());\r
+ ltm_desc.unsigned_read(m_rsa.e,&edata[0],edata.size()); \r
+#endif\r
+\r
+ m_publickey=publickey;\r
+\r
+ return true;\r
+ }\r
+ else\r
+ {\r
+ return false;\r
+ }\r
+}\r
+\r
+const bool FrostIdentity::VerifyAuthor(const std::string &author)\r
+{\r
+ std::vector<std::string> authorparts;\r
+ std::vector<unsigned char> authorhash(100,0);\r
+ unsigned long authorhashlen=authorhash.size();\r
+ std::string authorhashstr="";\r
+ std::vector<unsigned char> publickeydata(m_publickey.begin(),m_publickey.end());\r
+\r
+ StringFunctions::Split(author,"@",authorparts);\r
+\r
+ if(m_publickey!="" && authorparts.size()==2)\r
+ {\r
+ hash_memory(find_hash("sha1"),&publickeydata[0],publickeydata.size(),&authorhash[0],&authorhashlen);\r
+ authorhash.resize(authorhashlen);\r
+\r
+ Base64::Encode(authorhash,authorhashstr);\r
+\r
+ authorhashstr.erase(27);\r
+ authorhashstr=StringFunctions::Replace(authorhashstr,"/","_");\r
+\r
+ return (authorhashstr==authorparts[1]);\r
+\r
+ }\r
+ else\r
+ {\r
+ return false;\r
+ }\r
+\r
+}\r
+\r
+const bool FrostIdentity::VerifySignature(const std::vector<unsigned char> &data, const std::string &signature)\r
+{\r
+ std::vector<unsigned char> sigdata;\r
+ std::vector<unsigned char> hashdata(100,0);\r
+ unsigned long hashlen=hashdata.size();\r
+ int status,rval;\r
+\r
+ rval=status=0;\r
+\r
+ Base64::Decode(signature,sigdata);\r
+\r
+ hash_memory(find_hash("sha1"),&data[0],data.size(),&hashdata[0],&hashlen);\r
+ hashdata.resize(hashlen);\r
+\r
+ rval=rsa_verify_hash_ex(&sigdata[0],sigdata.size(),&hashdata[0],hashdata.size(),LTC_PKCS_1_PSS,find_hash("sha1"),16,&status,&m_rsa);\r
+\r
+ return (rval==0 && status==1) ? true : false;\r
+\r
+}\r