Starting to move stuff in to a lib
[mnenc] / libmnenc / mnenc.cpp
1 #include <iostream>
2 #include <fstream>
3 #include <string>
4 #include <cstdio>
5 #include <cstdlib>
6 #include <ctime>
7 #include <sys/stat.h>
8 #include <sys/types.h>
9 #include "mnenc.hpp"
10
11 using namespace std;
12
13 mnenc::mnenc() { //Constructor
14         make_folder();
15         get_imei(); //see get_imei below
16         imei += imei; //imei now have 30 digits
17         imei += imei; //imei now have 60 digits
18         imei += imei; //imei now have 120 digits
19         imei += imei; //imei now have 240 digits, should now be longer than any password
20 }
21
22 void mnenc::encrypt(string str) { //Run xor against imei
23         for(int i=0; i < (signed) str.size(); i++)      {
24                 str[i] = str[i] ^ imei[i];
25         }
26         enc = str;
27 }
28  
29 void mnenc::decrypt(string str) { //Same as above only the other way around
30         for(int i = 0; i < (signed) enc.size(); i++)    {
31                 str[i] = imei[i] ^ str[i];
32         }
33         dec = str;
34 }
35
36 bool mnenc::to_file(string filename) { //Save to file
37         bool worked = false;
38         ofstream keyfile;
39         keyfile.open(filename.c_str());
40         if(keyfile.is_open()) {
41                 keyfile << enc;
42                 keyfile.close();
43                 worked = true;
44         }
45         return worked;
46 }
47
48 bool mnenc::from_file(string filename) { //Read password file
49         bool worked = false;
50         ifstream keyfile(filename.c_str());
51         string encryptedpw = "";
52         string line = "";
53         if (keyfile.is_open()) {
54                 while (! keyfile.eof() ) {
55                         getline (keyfile,line);
56                         encryptedpw += line;
57                 }
58                 keyfile.close();
59                 worked = true;
60         }
61         enc = encryptedpw;
62         decrypt(enc); // Automatically decrypt password on read
63         return worked;
64 }
65
66 string mnenc::genkey() { 
67         string key = "";
68         srand(time(NULL));
69         for(int i = 0; i < 15; i++) {
70                 key += (rand() % 10);  //generate a random number between 0 and 9
71         }
72         string username = getenv("USER"); //Get username
73         string filename = "/home/" + username + "/.mnenc/.keyfile"; //This is where the key goes 
74         ofstream os;
75         os.open(filename.c_str());
76         if(os.is_open()) {
77                 os << key;
78                 os.close();
79         }
80         return key;
81 }
82 void mnenc::get_imei() {
83         /* TODO 
84          * Implement this in c++ since it is realy realy ugly to shell out like this...
85          */
86           
87         string username = getenv("USER"); //Get username
88         string filename = "/home/" + username + "/.mnenc/.keyfile"; //This is where the key goes if we generate it
89         string cmd = "dbus-send --system --print-reply --type=method_call --dest=com.nokia.phone.SIM /com/nokia/phone/SIM/security Phone.Sim.Security.get_imei | grep string | sed -e 's/^.*\\\"\\([0-9]\\)/\\1/' -e 's/\\\"//'"; //Command used when shelling out to get imei
90         if(system(cmd.c_str()) == 0) { //if we can get imei from dbus
91                 FILE *fp; //a file pointer
92                 char buffer[1024]; //Some tmp storage
93                 fp = popen(cmd.c_str(), "r"); //Open a pipe whith the command
94                 while ( fgets(buffer, 1024, fp) != NULL ) //Read the result
95                         imei.append(buffer); //Add the result to our attribute
96                 pclose(fp); //Close the pipe
97         } else { //If we could not get imei
98                 ifstream keyfile(filename.c_str()); //open the keyfile
99                 string k = "";
100                 string line = "";
101                 if (keyfile.is_open()) { //if it worked
102                         while (! keyfile.eof() ) { //Get the key from there
103                                 getline (keyfile,line);
104                                 k += line;
105                         }
106                         keyfile.close(); //Close the file
107                         imei = k; //And save result
108                 } else { //If that didnt work 
109                         imei = genkey(); //generate a new key and save that to teh keyfile
110                 }
111                 
112         }
113 }
114
115 bool mnenc::user_from_file(string filename) { //Read userfile (Added by hexagon 2010-01-17)
116         bool worked = false;
117         ifstream userfile(filename.c_str());
118         string buf = "";
119         string line = "";
120         if (userfile.is_open()) {
121                 while (! userfile.eof() ) {
122                         getline (userfile,line);
123                         buf += line;
124                 }
125                 userfile.close();
126                 worked = true;
127         }
128         user = buf;
129         return worked;
130 }
131
132 bool mnenc::user_to_file(string filename) { //Save username to file (Added by hexagon 2010-01-17)
133         bool worked = false;
134         ofstream userfile;
135         userfile.open(filename.c_str());
136         if(userfile.is_open()) {
137                 userfile << user;
138                 userfile.close();
139                 worked = true;
140         }
141         return worked;
142 }
143
144 void mnenc::set_user(string usr) { // Sets username (Added by hexagon 2010-01-17)
145     user = usr.c_str();
146 }
147
148 string mnenc::get_user() { // Gets username (Added by hexagon 2010-01-17)
149     return user;
150 }
151
152 void mnenc::make_folder() {
153         string username = getenv("USER"); //Get username
154         string foldername = "/home/" + username + "/.mnenc"; //This is where the key goes 
155         int ret = chdir(foldername.c_str());
156         if(ret != 0) {
157                 mkdir(foldername.c_str(), 0755);
158         }
159 }