diff --git a/src/cpp/Crypto/KeyPairHedera.cpp b/src/cpp/Crypto/KeyPairHedera.cpp index 0a3bf4bc2..2846e9c43 100644 --- a/src/cpp/Crypto/KeyPairHedera.cpp +++ b/src/cpp/Crypto/KeyPairHedera.cpp @@ -10,13 +10,12 @@ KeyPairHedera::KeyPairHedera() } - -KeyPairHedera::KeyPairHedera(const MemoryBin* privateKey, const MemoryBin* publicKey /* = nullptr*/) +KeyPairHedera::KeyPairHedera(const MemoryBin* privateKey, const unsigned char* publicKey/* = nullptr*/, size_t publicKeySize/* = 0*/) : mPrivateKey(nullptr) { auto derPrefixPriv = DataTypeConverter::hexToBin("302e020100300506032b657004220420"); - auto derPrefixPub = DataTypeConverter::hexToBin("302a300506032b6570032100"); - + auto derPrefixPub = DataTypeConverter::hexToBin("302a300506032b6570032100"); + auto mm = MemoryManager::getInstance(); if (privateKey) { @@ -46,19 +45,19 @@ KeyPairHedera::KeyPairHedera(const MemoryBin* privateKey, const MemoryBin* publi default: throw std::exception("[KeyPairHedera] invalid private key"); } - + // check public } if (publicKey) { - switch (publicKey->size()) + switch (publicKeySize) { case 32: { // raw public key - memcpy(mPublicKey, *publicKey, publicKey->size()); + memcpy(mPublicKey, publicKey, publicKeySize); break; } case 44: // DER encoded public key - if (0 == sodium_memcmp(*publicKey, *derPrefixPub, derPrefixPub->size())) { - memcpy(mPublicKey, publicKey->data(derPrefixPub->size()), ed25519_pubkey_SIZE); + if (0 == sodium_memcmp(publicKey, *derPrefixPub, derPrefixPub->size())) { + memcpy(mPublicKey, &publicKey[derPrefixPub->size()], ed25519_pubkey_SIZE); } break; default: @@ -75,6 +74,11 @@ KeyPairHedera::KeyPairHedera(const MemoryBin* privateKey, const MemoryBin* publi mm->releaseMemory(derPrefixPriv); mm->releaseMemory(derPrefixPub); } +KeyPairHedera::KeyPairHedera(const MemoryBin* privateKey, const MemoryBin* publicKey /* = nullptr*/) + : KeyPairHedera(privateKey, publicKey->data(), publicKey->size()) +{ + +} KeyPairHedera::~KeyPairHedera() { diff --git a/src/cpp/Crypto/KeyPairHedera.h b/src/cpp/Crypto/KeyPairHedera.h index 115beebdb..7f0b7f3bc 100644 --- a/src/cpp/Crypto/KeyPairHedera.h +++ b/src/cpp/Crypto/KeyPairHedera.h @@ -22,6 +22,7 @@ public: //! \param privateKey: copy //! \param publicKey: copy //! + KeyPairHedera(const MemoryBin* privateKey, const unsigned char* publicKey = nullptr, size_t publicKeySize = 0); KeyPairHedera(const MemoryBin* privateKey, const MemoryBin* publicKey = nullptr); ~KeyPairHedera(); diff --git a/src/cpp/controller/CryptoKey.cpp b/src/cpp/controller/CryptoKey.cpp index 2e7d343ec..093a21e69 100644 --- a/src/cpp/controller/CryptoKey.cpp +++ b/src/cpp/controller/CryptoKey.cpp @@ -62,6 +62,23 @@ namespace controller { return nullptr; } + KeyPairHedera* CryptoKey::getKeyPair(Poco::AutoPtr user) + { + auto model = getModel(); + auto password = user->getPassword(); + auto mm = MemoryManager::getInstance(); + if (!password || !model->hasPrivateKeyEncrypted()) { + return nullptr; + } + MemoryBin* clearPassword = nullptr; + if (password->decrypt(model->getPrivateKeyEncrypted(), &clearPassword) != SecretKeyCryptography::AUTH_DECRYPT_OK) { + return nullptr; + } + KeyPairHedera* key_pair = new KeyPairHedera(clearPassword, model->getPublicKey(), model->getPublicKeySize()); + mm->releaseMemory(clearPassword); + return key_pair; + } + } diff --git a/src/cpp/controller/CryptoKey.h b/src/cpp/controller/CryptoKey.h index 6e4e110bb..12bb40e70 100644 --- a/src/cpp/controller/CryptoKey.h +++ b/src/cpp/controller/CryptoKey.h @@ -27,6 +27,8 @@ namespace controller { inline Poco::AutoPtr getModel() { return _getModel(); } + KeyPairHedera* getKeyPair(Poco::AutoPtr user); + protected: CryptoKey(model::table::CryptoKey* dbModel); diff --git a/src/cpp/model/table/CryptoKey.h b/src/cpp/model/table/CryptoKey.h index 58d6df5dc..7e50fc728 100644 --- a/src/cpp/model/table/CryptoKey.h +++ b/src/cpp/model/table/CryptoKey.h @@ -24,6 +24,11 @@ namespace model { const char* getTableName() const { return "crypto_keys"; } std::string toString(); + inline const unsigned char* getPublicKey() const { if (mPublicKey.isNull()) return nullptr; return mPublicKey.value().content().data(); } + size_t getPublicKeySize() const { if (mPublicKey.isNull()) return 0; return mPublicKey.value().content().size(); } + + inline bool hasPrivateKeyEncrypted() const { return !mPrivateKey.isNull(); } + inline const std::vector& getPrivateKeyEncrypted() const { return mPrivateKey.value().content(); } static const char* typeToString(KeyType type); protected: