version 0.3.33
[fms.git] / src / freenet / frostidentity.cpp
diff --git a/src/freenet/frostidentity.cpp b/src/freenet/frostidentity.cpp
new file mode 100644 (file)
index 0000000..0c6d29d
--- /dev/null
@@ -0,0 +1,104 @@
+#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