From 0c123c0a3e5c6b5a1716e63f56cb0e9ffce8bded Mon Sep 17 00:00:00 2001 From: Micke Nordin Date: Tue, 19 Jan 2010 21:24:21 +0100 Subject: [PATCH] Starting to move stuff in to a lib --- artwork/demon.svg | 304 +++++++++++++++++++++++++++++++++++++++++++++++ artwork/key24.png | Bin 0 -> 1140 bytes artwork/key48.png | Bin 0 -> 4250 bytes artwork/key64.png | Bin 0 -> 6004 bytes artwork/key_logo.png | Bin 0 -> 33763 bytes libmnenc/Makefile | 46 +++++++ libmnenc/mnenc.cpp | 159 +++++++++++++++++++++++++ libmnenc/mnenc.hpp | 62 ++++++++++ libmnenc/mnenc_test.cpp | 19 +++ mnencd.hpp | 16 ++- 10 files changed, 605 insertions(+), 1 deletion(-) create mode 100644 artwork/demon.svg create mode 100644 artwork/key24.png create mode 100644 artwork/key48.png create mode 100644 artwork/key64.png create mode 100644 artwork/key_logo.png create mode 100755 libmnenc/Makefile create mode 100644 libmnenc/mnenc.cpp create mode 100644 libmnenc/mnenc.hpp create mode 100644 libmnenc/mnenc_test.cpp diff --git a/artwork/demon.svg b/artwork/demon.svg new file mode 100644 index 0000000..9a251f1 --- /dev/null +++ b/artwork/demon.svg @@ -0,0 +1,304 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/artwork/key24.png b/artwork/key24.png new file mode 100644 index 0000000000000000000000000000000000000000..a62c05bfde16010082cbc6cbd020021970d6c1f6 GIT binary patch literal 1140 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 Jmvv4FO#nSI$$0<( literal 0 HcmV?d00001 diff --git a/libmnenc/Makefile b/libmnenc/Makefile new file mode 100755 index 0000000..de68ef1 --- /dev/null +++ b/libmnenc/Makefile @@ -0,0 +1,46 @@ +CXX=g++ +all: libmnenc.so libmnenc.la + +libmnenc.so: mnenc.cpp + $(CXX) -fPIC -g -c -Wall mnenc.cpp + $(CXX) -shared -Wl,-soname,libmnenc.so.1 -o libmnenc.so.0.0.0 mnenc.o -lc + +libmnenc.la: mnenc.cpp + libtool --mode=compile g++ -Wall -c mnenc.cpp + libtool --mode=link g++ -Wall -o libmnenc.la mnenc.lo + ar -cvq libmnenc.a mnenc.o + +install-static: + cp libmnenc.a /usr/lib/ + cp libmnenc.la /usr/lib/ + cp mnenc.hpp /usr/include/ + +install-dynamic: + cp libmnenc.so.0.0.0 /usr/lib/ + ln -s /usr/lib/libmnenc.so.0.0.0 /usr/lib/libmnenc.so.0 + ln -s /usr/lib/libmnenc.so.0.0.0 /usr/lib/libmnenc.so.1 + ln -s /usr/lib/libmnenc.so.0.0.0 /usr/lib/libmnenc.so + +install: install-dynamic install-static + +.PHONY: uninstall-dynamic +uninstall-dynamic: + rm /usr/lib/libmnenc.so.0.0.0 /usr/lib/libmnenc.so.0 /usr/lib/libmnenc.so.1 /usr/lib/libmnenc.so + +.PHONY: uninstall-static +uninstall-static: + rm /usr/lib/libmnenc.la /usr/lib/libmnenc.a + +.PHONY: uninstall +uninstall: uninstall-dynamic uninstall-static + +.PHONY: clean-dynamic +clean-dynamic: + rm -rf libmnenc.so.0.0.0 mnenc.o .libs + +.PHONY: clean-static +clean-static: + rm -rf libmnenc.la libmnenc.a mnenc.o mnenc.lo .libs + +.PHONY: clean +clean: clean-static clean-dynamic diff --git a/libmnenc/mnenc.cpp b/libmnenc/mnenc.cpp new file mode 100644 index 0000000..0e162da --- /dev/null +++ b/libmnenc/mnenc.cpp @@ -0,0 +1,159 @@ +#include +#include +#include +#include +#include +#include +#include +#include +#include "mnenc.hpp" + +using namespace std; + +mnenc::mnenc() { //Constructor + make_folder(); + get_imei(); //see get_imei below + imei += imei; //imei now have 30 digits + imei += imei; //imei now have 60 digits + imei += imei; //imei now have 120 digits + imei += imei; //imei now have 240 digits, should now be longer than any password +} + +void mnenc::encrypt(string str) { //Run xor against imei + for(int i=0; i < (signed) str.size(); i++) { + str[i] = str[i] ^ imei[i]; + } + enc = str; +} + +void mnenc::decrypt(string str) { //Same as above only the other way around + for(int i = 0; i < (signed) enc.size(); i++) { + str[i] = imei[i] ^ str[i]; + } + dec = str; +} + +bool mnenc::to_file(string filename) { //Save to file + bool worked = false; + ofstream keyfile; + keyfile.open(filename.c_str()); + if(keyfile.is_open()) { + keyfile << enc; + keyfile.close(); + worked = true; + } + return worked; +} + +bool mnenc::from_file(string filename) { //Read password file + bool worked = false; + ifstream keyfile(filename.c_str()); + string encryptedpw = ""; + string line = ""; + if (keyfile.is_open()) { + while (! keyfile.eof() ) { + getline (keyfile,line); + encryptedpw += line; + } + keyfile.close(); + worked = true; + } + enc = encryptedpw; + decrypt(enc); // Automatically decrypt password on read + return worked; +} + +string mnenc::genkey() { + string key = ""; + srand(time(NULL)); + for(int i = 0; i < 15; i++) { + key += (rand() % 10); //generate a random number between 0 and 9 + } + string username = getenv("USER"); //Get username + string filename = "/home/" + username + "/.mnenc/.keyfile"; //This is where the key goes + ofstream os; + os.open(filename.c_str()); + if(os.is_open()) { + os << key; + os.close(); + } + return key; +} +void mnenc::get_imei() { + /* TODO + * Implement this in c++ since it is realy realy ugly to shell out like this... + */ + + string username = getenv("USER"); //Get username + string filename = "/home/" + username + "/.mnenc/.keyfile"; //This is where the key goes if we generate it + 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 + if(system(cmd.c_str()) == 0) { //if we can get imei from dbus + FILE *fp; //a file pointer + char buffer[1024]; //Some tmp storage + fp = popen(cmd.c_str(), "r"); //Open a pipe whith the command + while ( fgets(buffer, 1024, fp) != NULL ) //Read the result + imei.append(buffer); //Add the result to our attribute + pclose(fp); //Close the pipe + } else { //If we could not get imei + ifstream keyfile(filename.c_str()); //open the keyfile + string k = ""; + string line = ""; + if (keyfile.is_open()) { //if it worked + while (! keyfile.eof() ) { //Get the key from there + getline (keyfile,line); + k += line; + } + keyfile.close(); //Close the file + imei = k; //And save result + } else { //If that didnt work + imei = genkey(); //generate a new key and save that to teh keyfile + } + + } +} + +bool mnenc::user_from_file(string filename) { //Read userfile (Added by hexagon 2010-01-17) + bool worked = false; + ifstream userfile(filename.c_str()); + string buf = ""; + string line = ""; + if (userfile.is_open()) { + while (! userfile.eof() ) { + getline (userfile,line); + buf += line; + } + userfile.close(); + worked = true; + } + user = buf; + return worked; +} + +bool mnenc::user_to_file(string filename) { //Save username to file (Added by hexagon 2010-01-17) + bool worked = false; + ofstream userfile; + userfile.open(filename.c_str()); + if(userfile.is_open()) { + userfile << user; + userfile.close(); + worked = true; + } + return worked; +} + +void mnenc::set_user(string usr) { // Sets username (Added by hexagon 2010-01-17) + user = usr.c_str(); +} + +string mnenc::get_user() { // Gets username (Added by hexagon 2010-01-17) + return user; +} + +void mnenc::make_folder() { + string username = getenv("USER"); //Get username + string foldername = "/home/" + username + "/.mnenc"; //This is where the key goes + int ret = chdir(foldername.c_str()); + if(ret != 0) { + mkdir(foldername.c_str(), 0755); + } +} diff --git a/libmnenc/mnenc.hpp b/libmnenc/mnenc.hpp new file mode 100644 index 0000000..5bea13a --- /dev/null +++ b/libmnenc/mnenc.hpp @@ -0,0 +1,62 @@ +/* -------------------------------------------------------------------------------------------- +Copyright 2010 Micke Nordin . All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, are +permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this list of + conditions and the following disclaimer. + + 2. Redistributions in binary form must reproduce the above copyright notice, this list + of conditions and the following disclaimer in the documentation and/or other materials + provided with the distribution. + +THIS SOFTWARE IS PROVIDED BY Micke Nordin ``AS IS'' AND ANY EXPRESS OR IMPLIED +WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND +FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL Micke Nordin OR +CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR +CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF +ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +The views and conclusions contained in the software and documentation are those of the +authors and should not be interpreted as representing official policies, either expressed +or implied, of Micke Nordin. +------------------------------------------------------------------------------------------- */ + + +#ifndef _mnenc_h_ +#define _mnenc_h_ +#include + +using namespace std; + +class mnenc { + private: + string dec; //Decrypted password + string enc; //Encrypted password + string user; //Username + string imei; //Imei + void get_imei(); //Gets the imei of the phone + void set_enc(string str) {enc = str;}; //set encrypted password + void set_dec(string str) {dec = str;}; //set decrypted password + string genkey(); //generate a key to be used instead of imei + void make_folder(); //Create /home/user/.qtify if it doesnt exist + + public: + mnenc(); + void encrypt(string str); //encrypt password + void decrypt(string str); //decrypt password + string get_dec() {return dec;}; //get decrypted password + string get_enc() {return enc;}; //Get encrypted password + bool to_file(string filename); //Save to file + bool from_file(string filename); //get from file + /* Added by hexagon */ + bool user_to_file(string filename); //Save to file + bool user_from_file(string filename); //get from file + void set_user(string user); + string get_user(); +}; +#endif diff --git a/libmnenc/mnenc_test.cpp b/libmnenc/mnenc_test.cpp new file mode 100644 index 0000000..5b46b8f --- /dev/null +++ b/libmnenc/mnenc_test.cpp @@ -0,0 +1,19 @@ +#include +#include + +using namespace std; + +int main(int argc, char** argv) +{ + mnenc micke; //Declare a encryptor/decryptor + micke.encrypt("Blahonga"); //Encrypt the password Blahonga + micke.decrypt(micke.get_enc()); //Decrypt the password + cout << micke.get_enc() << endl; //Display encrypted password + cout << micke.get_dec() << endl; //Display decrypted password + micke.to_file("deletethistestfile.txt"); //Save to file + micke.from_file("deletethistestfile.txt"); //Read from file + cout << micke.get_enc() << endl; //Display encrypted password + cout << micke.get_dec() << endl; //Display decrypted password + + return 0; +} diff --git a/mnencd.hpp b/mnencd.hpp index 4eb4bb2..ba7e6a8 100644 --- a/mnencd.hpp +++ b/mnencd.hpp @@ -71,8 +71,22 @@ void put_password(std::string masterpasswd, std::string passwd, std::string user password pw = password(menc.encrypt(key, passwd ), "", key); pw.to_file(make_filename(user, app)); } +std::string do_something(std::string str) { //Handle requests for secure pipe + pid_t proc = fork(); + std::string reply = ""; + if( proc == 0 ) { // child + reply = open_connection( str ); + } else if( p > 0 ) { // parent + // Store p somewhere + } else { // fork failed + } + + return reply; +} +std::string open_connection(std::string str) { -std::string do_something(std::string str) { //Handle requests +} +std::string do_something_else(std::string str) { //Handle requests std::vector request; //Incomming message stored here request = explode(str, "|"); //explode request with function from php.hpp -- 1.7.9.5