From 0325a90dab9d714d59cd93646c7f13a8fc3eea5d Mon Sep 17 00:00:00 2001 From: Dario Date: Fri, 5 Jun 2020 16:49:14 +0200 Subject: [PATCH] add possibility to use ed25519 with only a pubkey --- src/cpp/Crypto/KeyPairEd25519.cpp | 9 +++++++++ src/cpp/Crypto/KeyPairEd25519.h | 16 ++++++++++++++-- 2 files changed, 23 insertions(+), 2 deletions(-) diff --git a/src/cpp/Crypto/KeyPairEd25519.cpp b/src/cpp/Crypto/KeyPairEd25519.cpp index 68cfc9cf6..856eac357 100644 --- a/src/cpp/Crypto/KeyPairEd25519.cpp +++ b/src/cpp/Crypto/KeyPairEd25519.cpp @@ -6,12 +6,20 @@ #include "../lib/BinHexConverter.h" +#include "Passphrase.h" + KeyPairEd25519::KeyPairEd25519(MemoryBin* privateKey, const unsigned char* publicKey) : mSodiumSecret(privateKey) { memcpy(mSodiumPublic, publicKey, crypto_sign_PUBLICKEYBYTES); } +KeyPairEd25519::KeyPairEd25519(const unsigned char* publicKey) + : mSodiumSecret(nullptr) +{ + memcpy(mSodiumPublic, publicKey, crypto_sign_PUBLICKEYBYTES); +} + KeyPairEd25519::KeyPairEd25519() : mSodiumSecret(nullptr) { @@ -96,6 +104,7 @@ MemoryBin* KeyPairEd25519::sign(const MemoryBin* message) { if (!message || !message->size()) return nullptr; + if (!mSodiumSecret) return nullptr; auto messageSize = message->size(); auto mm = MemoryManager::getInstance(); auto em = ErrorManager::getInstance(); diff --git a/src/cpp/Crypto/KeyPairEd25519.h b/src/cpp/Crypto/KeyPairEd25519.h index 10cfba13c..9efe2e046 100644 --- a/src/cpp/Crypto/KeyPairEd25519.h +++ b/src/cpp/Crypto/KeyPairEd25519.h @@ -11,9 +11,9 @@ * \brief: Key Pairs class for ed25519 keys, used for default gradido transactions */ -#include "../SingletonManager/MemoryManager.h" #include "sodium.h" -#include "Passphrase.h" + +class Passphrase; class KeyPairEd25519 : public IKeyPair { @@ -21,6 +21,7 @@ public: //! \param privateKey: take ownership, release after object destruction //! \param publicKey: copy KeyPairEd25519(MemoryBin* privateKey, const unsigned char* publicKey); + KeyPairEd25519(const unsigned char* publicKey); ~KeyPairEd25519(); @@ -33,8 +34,19 @@ public: inline const unsigned char* getPublicKey() const { return mSodiumPublic; } + inline bool isTheSame(const KeyPairEd25519& b) const { + return 0 == sodium_memcmp(mSodiumPublic, b.mSodiumPublic, crypto_sign_PUBLICKEYBYTES); + } + + inline bool operator == (const KeyPairEd25519& b) const { return isTheSame(b); } + inline bool operator != (const KeyPairEd25519& b) const { return !isTheSame(b); } + + inline bool hasPrivateKey() const { return mSodiumSecret != nullptr; } + protected: KeyPairEd25519(); + + private: // 64 Byte //! \brief ed25519 libsodium private key