version 0.3.33
[fms.git] / src / freenet / frostidentity.cpp
1 #include "../../include/freenet/frostidentity.h"\r
2 #include "../../include/stringfunctions.h"\r
3 #include "../../include/base64.h"\r
4 \r
5 #include <cstring>\r
6 \r
7 FrostIdentity::FrostIdentity()\r
8 {\r
9         std::memset(&m_rsa,0,sizeof(m_rsa));\r
10 }\r
11 \r
12 FrostIdentity::~FrostIdentity()\r
13 {\r
14         rsa_free(&m_rsa);\r
15 }\r
16 \r
17 const bool FrostIdentity::FromPublicKey(const std::string &publickey)\r
18 {\r
19         std::vector<std::string> keyparts;\r
20         std::vector<unsigned char> edata;\r
21         std::vector<unsigned char> ndata;\r
22 \r
23         rsa_free(&m_rsa);\r
24         std::memset(&m_rsa,0,sizeof(m_rsa));\r
25 \r
26         StringFunctions::Split(publickey,":",keyparts);\r
27 \r
28         if(keyparts.size()==2)\r
29         {\r
30                 Base64::Decode(keyparts[0],edata);\r
31                 Base64::Decode(keyparts[1],ndata);\r
32 \r
33                 m_rsa.type=PK_PUBLIC;\r
34 #ifdef LTC_SOURCE\r
35                 mp_init(&m_rsa.N);\r
36                 mp_init(&m_rsa.e);\r
37                 mp_read_unsigned_bin(m_rsa.N,&ndata[0],ndata.size());\r
38                 mp_read_unsigned_bin(m_rsa.e,&edata[0],edata.size());\r
39 #else\r
40                 ltm_desc.init(&m_rsa.N);\r
41                 ltm_desc.init(&m_rsa.e);\r
42                 ltm_desc.unsigned_read(m_rsa.N,&ndata[0],ndata.size());\r
43                 ltm_desc.unsigned_read(m_rsa.e,&edata[0],edata.size()); \r
44 #endif\r
45 \r
46                 m_publickey=publickey;\r
47 \r
48                 return true;\r
49         }\r
50         else\r
51         {\r
52                 return false;\r
53         }\r
54 }\r
55 \r
56 const bool FrostIdentity::VerifyAuthor(const std::string &author)\r
57 {\r
58         std::vector<std::string> authorparts;\r
59         std::vector<unsigned char> authorhash(100,0);\r
60         unsigned long authorhashlen=authorhash.size();\r
61         std::string authorhashstr="";\r
62         std::vector<unsigned char> publickeydata(m_publickey.begin(),m_publickey.end());\r
63 \r
64         StringFunctions::Split(author,"@",authorparts);\r
65 \r
66         if(m_publickey!="" && authorparts.size()==2)\r
67         {\r
68                 hash_memory(find_hash("sha1"),&publickeydata[0],publickeydata.size(),&authorhash[0],&authorhashlen);\r
69                 authorhash.resize(authorhashlen);\r
70 \r
71                 Base64::Encode(authorhash,authorhashstr);\r
72 \r
73                 authorhashstr.erase(27);\r
74                 authorhashstr=StringFunctions::Replace(authorhashstr,"/","_");\r
75 \r
76                 return (authorhashstr==authorparts[1]);\r
77 \r
78         }\r
79         else\r
80         {\r
81                 return false;\r
82         }\r
83 \r
84 }\r
85 \r
86 const bool FrostIdentity::VerifySignature(const std::vector<unsigned char> &data, const std::string &signature)\r
87 {\r
88         std::vector<unsigned char> sigdata;\r
89         std::vector<unsigned char> hashdata(100,0);\r
90         unsigned long hashlen=hashdata.size();\r
91         int status,rval;\r
92 \r
93         rval=status=0;\r
94 \r
95         Base64::Decode(signature,sigdata);\r
96 \r
97         hash_memory(find_hash("sha1"),&data[0],data.size(),&hashdata[0],&hashlen);\r
98         hashdata.resize(hashlen);\r
99 \r
100         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
101 \r
102         return (rval==0 && status==1) ? true : false;\r
103 \r
104 }\r