diff --git a/CMakeLists.txt b/CMakeLists.txt index 40cb2e6d..e9ebbb44 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -126,12 +126,12 @@ endif () # Check if PIP support cryptographic encryption/decryption by using sodium library if (DEFINED CRYPT) - message(STATUS "Building with CRYPT") + message(STATUS "Building with CRYPT support") unset(CRYPT) set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DPIP_CRYPT") list(APPEND LIBS sodium) else () - message(STATUS "Building without CRYPTH, encryption doesn't work") + message(STATUS "Building without CRYPT, encryption doesn't work") endif () diff --git a/main.cpp b/main.cpp index 6cf61aa3..e3b19806 100644 --- a/main.cpp +++ b/main.cpp @@ -232,7 +232,7 @@ int main (int argc, char * argv[]) { PIByteArray sba = cr.crypt(ba); piCout << ba.size() << ba; piCout << k.size() << k; - piCout << cr.getKey().size() << cr.getKey(); + piCout << cr.key().size() << cr.key(); piCout << sba.size() << sba; piCout << cr.decrypt(sba).size() << cr.decrypt(sba); sba[random()%sba.size()]++; diff --git a/src/math/picrypt.cpp b/src/math/picrypt.cpp index 0f787d0f..a6bd0be6 100644 --- a/src/math/picrypt.cpp +++ b/src/math/picrypt.cpp @@ -1,87 +1,101 @@ -#include "picrypt.h" +/* + PIP - Platform Independent Primitives + Cryptographic class using lib Sodium + Copyright (C) 2015 Andrey Bychkov work.a.b@yandex.ru + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +#include "picrypt.h" #ifdef PIP_CRYPT -#include "sodium.h" +# include "sodium.h" #endif + PICrypt::PICrypt() { #ifdef PIP_CRYPT sodium_init(); - nonce.resize(crypto_secretbox_NONCEBYTES); - key.resize(crypto_secretbox_KEYBYTES); - randombytes_buf(key.data(), key.size()); - randombytes_buf(nonce.data(), nonce.size()); + nonce_.resize(crypto_secretbox_NONCEBYTES); + key_.resize(crypto_secretbox_KEYBYTES); + randombytes_buf(key_.data(), key_.size()); + randombytes_buf(nonce_.data(), nonce_.size()); #else piCout << "[PICrypt]" << "Warning: PICrypt is disabled, to enable install sodium library and build pip with -DCRYPT="; #endif } -bool PICrypt::setKey(const PIByteArray &secret) { - if (secret.size() != key.size()) return false; - key = secret; +bool PICrypt::setKey(const PIByteArray & secret) { + if (secret.size() != key_.size()) return false; + key_ = secret; return true; } -PIByteArray PICrypt::setKey(const PIString &secret) { +PIByteArray PICrypt::setKey(const PIString & secret) { PIByteArray hash; #ifdef PIP_CRYPT hash.resize(crypto_generichash_BYTES); PIByteArray s(secret.data(), secret.size()); crypto_generichash(hash.data(), hash.size(), s.data(), s.size(), 0, 0); - hash.resize(key.size()); + hash.resize(key_.size()); setKey(hash); #endif return hash; } -PIByteArray PICrypt::getKey() { - return key; -} - - -PIByteArray PICrypt::crypt(const PIByteArray &data) { +PIByteArray PICrypt::crypt(const PIByteArray & data) { PIByteArray ret; #ifdef PIP_CRYPT ret.resize(data.size() + crypto_secretbox_MACBYTES); - randombytes_buf(nonce.data(), nonce.size()); - crypto_secretbox_easy(ret.data(), data.data(), data.size(), nonce.data(), key.data()); - ret.append(nonce); + randombytes_buf(nonce_.data(), nonce_.size()); + crypto_secretbox_easy(ret.data(), data.data(), data.size(), nonce_.data(), key_.data()); + ret.append(nonce_); #endif return ret; } -PIByteArray PICrypt::crypt(const PIByteArray &data, const PIByteArray &secret) { +PIByteArray PICrypt::crypt(const PIByteArray & data, const PIByteArray & key) { PIByteArray ret; #ifdef PIP_CRYPT - if (secret.size() != crypto_secretbox_KEYBYTES) return PIByteArray(); + if (key.size() != crypto_secretbox_KEYBYTES) return PIByteArray(); sodium_init(); PIByteArray n; ret.resize(data.size() + crypto_secretbox_MACBYTES); n.resize(crypto_secretbox_NONCEBYTES); randombytes_buf(n.data(), n.size()); - crypto_secretbox_easy(ret.data(), data.data(), data.size(), n.data(), secret.data()); + crypto_secretbox_easy(ret.data(), data.data(), data.size(), n.data(), key.data()); ret.append(n); #endif return ret; } -PIByteArray PICrypt::decrypt(const PIByteArray &crypt_data, bool *ok) { +PIByteArray PICrypt::decrypt(const PIByteArray & crypt_data, bool *ok) { PIByteArray ret; #ifdef PIP_CRYPT - if (crypt_data.size() < nonce.size() + crypto_secretbox_MACBYTES) { + if (crypt_data.size() < nonce_.size() + crypto_secretbox_MACBYTES) { if (ok) *ok = false; return PIByteArray(); } - ret.resize(crypt_data.size() - nonce.size() - crypto_secretbox_MACBYTES); - memcpy(nonce.data(), crypt_data.data(crypt_data.size() - nonce.size()), nonce.size()); - if (crypto_secretbox_open_easy(ret.data(), crypt_data.data(), crypt_data.size() - nonce.size(), nonce.data(), key.data()) != 0) { + ret.resize(crypt_data.size() - nonce_.size() - crypto_secretbox_MACBYTES); + memcpy(nonce_.data(), crypt_data.data(crypt_data.size() - nonce_.size()), nonce_.size()); + if (crypto_secretbox_open_easy(ret.data(), crypt_data.data(), crypt_data.size() - nonce_.size(), nonce_.data(), key_.data()) != 0) { if (ok) *ok = false; - // piCout << "[PICrypt]" << "bad key"; + // piCout << "[PICrypt]" << "bad key_"; return PIByteArray(); } #endif @@ -90,10 +104,10 @@ PIByteArray PICrypt::decrypt(const PIByteArray &crypt_data, bool *ok) { } -PIByteArray PICrypt::decrypt(const PIByteArray &crypt_data, const PIByteArray &secret, bool *ok) { +PIByteArray PICrypt::decrypt(const PIByteArray & crypt_data, const PIByteArray & key, bool *ok) { PIByteArray ret; #ifdef PIP_CRYPT - if (secret.size() != crypto_secretbox_KEYBYTES) { + if (key.size() != crypto_secretbox_KEYBYTES) { if (ok) *ok = false; return PIByteArray(); } @@ -106,9 +120,9 @@ PIByteArray PICrypt::decrypt(const PIByteArray &crypt_data, const PIByteArray &s n.resize(crypto_secretbox_NONCEBYTES); ret.resize(crypt_data.size() - n.size() - crypto_secretbox_MACBYTES); memcpy(n.data(), crypt_data.data(crypt_data.size() - n.size()), n.size()); - if (crypto_secretbox_open_easy(ret.data(), crypt_data.data(), crypt_data.size() - n.size(), n.data(), secret.data()) != 0) { + if (crypto_secretbox_open_easy(ret.data(), crypt_data.data(), crypt_data.size() - n.size(), n.data(), key.data()) != 0) { if (ok) *ok = false; - // piCout << "[PICrypt]" << "bad key"; + // piCout << "[PICrypt]" << "bad key_"; return PIByteArray(); } #endif @@ -117,7 +131,7 @@ PIByteArray PICrypt::decrypt(const PIByteArray &crypt_data, const PIByteArray &s } -PIByteArray PICrypt::hash(const PIString &secret) { +PIByteArray PICrypt::hash(const PIString & secret) { PIByteArray hash; #ifdef PIP_CRYPT sodium_init(); diff --git a/src/math/picrypt.h b/src/math/picrypt.h index deb9917a..8197a282 100644 --- a/src/math/picrypt.h +++ b/src/math/picrypt.h @@ -1,3 +1,25 @@ +/*! \file picrypt.h + * \brief Cryptographic class using lib Sodium +*/ +/* + PIP - Platform Independent Primitives + Cryptographic class using lib Sodium + Copyright (C) 2015 Andrey Bychkov work.a.b@yandex.ru + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + #ifndef PICRYPT_H #define PICRYPT_H @@ -7,28 +29,21 @@ class PICrypt { public: PICrypt(); - bool setKey(const PIByteArray &secret); - PIByteArray setKey(const PIString &secret); - - PIByteArray getKey(); - - PIByteArray crypt(const PIByteArray &data); - - PIByteArray decrypt(const PIByteArray &crypt_data, bool * ok = 0); - - static PIByteArray crypt(const PIByteArray &data, const PIByteArray &secret); - - static PIByteArray decrypt(const PIByteArray &crypt_data, const PIByteArray &secret, bool * ok = 0); - - static PIByteArray hash(const PIString &secret); + bool setKey(const PIByteArray & secret); + PIByteArray setKey(const PIString & secret); + PIByteArray key() {return key_;} + PIByteArray crypt(const PIByteArray & data); + PIByteArray decrypt(const PIByteArray & crypt_data, bool * ok = 0); + static PIByteArray crypt(const PIByteArray & data, const PIByteArray & key); + static PIByteArray decrypt(const PIByteArray & crypt_data, const PIByteArray & key, bool * ok = 0); + static PIByteArray hash(const PIString & secret); static int sizeKey(); - static int sizeCrypt(); private: - PIByteArray nonce; - PIByteArray key; + PIByteArray nonce_, key_; + }; #endif // PICRYPT_H diff --git a/src/piversion.h b/src/piversion.h index 52b4c5a5..6cf4665a 100644 --- a/src/piversion.h +++ b/src/piversion.h @@ -5,6 +5,6 @@ #define PIP_VERSION_MAJOR 0 #define PIP_VERSION_MINOR 5 #define PIP_VERSION_REVISION 1 -#define PIP_VERSION_SUFFIX "_alphav[i]" +#define PIP_VERSION_SUFFIX "_alpha" #endif // PIVERSION_H