#include "pip.h" #include "piauth.h" class Obj : public PIObject { PIOBJECT(Obj) public: Obj() : PIObject() {} EVENT_HANDLER2(void, authorizeServer, PIByteArray, info, bool *, ok) { piCout << "[authorizeServer]" << PIString(info); //*ok = true; } EVENT_HANDLER2(void, passwordCheck, PIByteArray, phash, bool *, ok) { piCout << "[passwordCheck]" << phash.toHex(); PIByteArray ph = PICrypt::passwordHash("secret", PIByteArray::fromHex("AABBCCDD")); piCout << "[passwordCheck]" << ph.toHex(); if (phash == ph) *ok = true; } EVENT_HANDLER1(void, userEnterPassword, PIString *, password) { *password = "secret"; piCout << "[userEnterPassword]" << *password; } }; int main(int argc, char *argv[]) { piCout << "start"; PICrypt crypt; PIByteArray skey1, pkey1; crypt.generateKeypair(pkey1, skey1); PIByteArray skey2, pkey2; crypt.generateKeypair(pkey2, skey2); PIByteArray sign = PIAuth::generateSign(PICrypt::generateKey()); piCout << "sign" << sign.toHex(); piCout << "key1 " << pkey1.toHex() << skey1.toHex(); piCout << "key2 " << pkey2.toHex() << skey2.toHex(); PIString msg = "what the f*ck?"; PIByteArray ba = msg.toUTF8(); piCout << "source" << ba.toHex() << msg; PIByteArray cba = crypt.crypt(ba, pkey2, skey1); PIByteArray psign = crypt.extractSignPublicKey(sign); PIByteArray scba = crypt.signMessage(cba, sign); piCout << "crypted" << cba.toHex(); piCout << "signed" << scba.toHex() << psign.toHex(); PIByteArray dba = crypt.decrypt(cba, pkey1, skey2); piCout << "decrypted" << dba.toHex() << PIString(dba); piCout << "verify" << crypt.verifySign(cba, scba, psign); cba = crypt.crypt(ba, pkey1, skey2); piCout << "crypted" << cba.toHex(); //cba[7] = 0; dba = crypt.decrypt(cba, pkey2, skey1); piCout << "decrypted" << dba.toHex() << PIString(dba); piCout << "======================================="; PIAuth server(PIAuth::generateSign(pkey1)); msg = "This is Server with PIAuth"; server.setInfoData(msg.toUTF8()); PIAuth client(PIAuth::generateSign(pkey2)); client.setAuthorizedPublicKeys(PIVector() << server.getSignPublicKey()); Obj o; CONNECTU(&client, authorize, &o, authorizeServer); CONNECTU(&client, passwordRequest, &o, userEnterPassword); CONNECTU(&server, passwordCheck, &o, passwordCheck); client.startClient(); ba = server.startServer(); int st = PIAuth::AuthProbe; piCout << "server" << st << ba.toHex() << ba.size(); // ba[40] = 2; // { // int s; // ba >> s; // PIByteArray rinfo; // PIByteArray rsign; // PIByteArray rsign_pk; // PIByteArray box_pk; // PIByteArray noise; // ba >> rinfo >> rsign_pk >> box_pk >> noise >> rsign; // ba.clear(); // PIByteArray sign2 = PIAuth::generateSign(PICrypt::generateRandomBuff(100)); // msg = "Server"; // ba << s << msg.toUTF8() << crypt.extractSignPublicKey(sign2) << box_pk << noise; // rsign = crypt.signMessage(ba, sign2); // ba << rsign; // } st = client.receive(ba); piCout << "client" << st << ba.toHex() << ba.size(); st = server.receive(ba); piCout << "server" << st << ba.toHex() << ba.size(); st = client.receive(ba); piCout << "client" << st << ba.toHex() << ba.size(); st = server.receive(ba); piCout << "server" << st << ba.toHex() << ba.size(); return 0; }