From 76e8e3403826669b0a300ae5af9f3a86e2afd381 Mon Sep 17 00:00:00 2001 From: Arthur Britto Date: Sun, 13 May 2012 15:04:06 -0700 Subject: [PATCH] Add sign and verify to NewcoinAddress. --- src/NewcoinAddress.cpp | 70 ++++++++++++++++++++++++++++++++++++++++-- src/NewcoinAddress.h | 16 ++++++---- 2 files changed, 77 insertions(+), 9 deletions(-) diff --git a/src/NewcoinAddress.cpp b/src/NewcoinAddress.cpp index 70346c1962..0188a7f178 100644 --- a/src/NewcoinAddress.cpp +++ b/src/NewcoinAddress.cpp @@ -20,7 +20,31 @@ NewcoinAddress::NewcoinAddress() bool NewcoinAddress::isValid() const { - return !vchData.empty(); + bool bValid = false; + + if (!vchData.empty()) + { + CKey key; + + switch (nVersion) { + case VER_NODE_PUBLIC: + bValid = key.SetPubKey(getNodePublic()); + break; + + case VER_ACCOUNT_PUBLIC: + bValid = key.SetPubKey(getAccountPublic()); + break; + + case VER_ACCOUNT_PRIVATE: + bValid = key.SetPrivKey(getAccountPrivate()); + break; + + default: + nothing(); + } + } + + return bValid; } void NewcoinAddress::clear() @@ -332,7 +356,47 @@ void NewcoinAddress::setAccountPrivate(const NewcoinAddress& generator, const Ne setAccountPrivate(privkey.GetPrivKey()); } -std::vector NewcoinAddress::accountPrivateEncrypt(const NewcoinAddress& naPublicTo, const std::vector& vucPlainText) +bool NewcoinAddress::accountPrivateSign(const uint256& uHash, std::vector& vucSig) const +{ + CKey ckPrivate; + bool bResult; + + if (!ckPrivate.SetPrivKey(getAccountPrivate())) + { + // Bad private key. + std::cerr << "accountPrivateSign: Bad private key." << std::endl; + bResult = false; + } + else + { + bResult = ckPrivate.Sign(uHash, vucSig); + if (!bResult) + std::cerr << "accountPrivateSign: Signing failed." << std::endl; + } + + return bResult; +} + +bool NewcoinAddress::accountPrivateVerify(const uint256& uHash, const std::vector& vucSig) const +{ + CKey ckPrivate; + bool bVerified; + + if (!ckPrivate.SetPrivKey(getAccountPrivate())) + { + // Bad private key. + std::cerr << "accountPrivateVerify: Bad private key." << std::endl; + bVerified = false; + } + else + { + bVerified = ckPrivate.Verify(uHash, vucSig); + } + + return bVerified; +} + +std::vector NewcoinAddress::accountPrivateEncrypt(const NewcoinAddress& naPublicTo, const std::vector& vucPlainText) const { CKey ckPrivate; CKey ckPublic; @@ -362,7 +426,7 @@ std::vector NewcoinAddress::accountPrivateEncrypt(const NewcoinAd return vucCipherText; } -std::vector NewcoinAddress::accountPrivateDecrypt(const NewcoinAddress& naPublicFrom, const std::vector& vucCipherText) +std::vector NewcoinAddress::accountPrivateDecrypt(const NewcoinAddress& naPublicFrom, const std::vector& vucCipherText) const { CKey ckPrivate; CKey ckPublic; diff --git a/src/NewcoinAddress.h b/src/NewcoinAddress.h index 2842b54629..46d90233da 100644 --- a/src/NewcoinAddress.h +++ b/src/NewcoinAddress.h @@ -11,14 +11,14 @@ class NewcoinAddress : public CBase58Data { private: typedef enum { - VER_NONE = 1, - VER_NODE_PUBLIC = 28, + VER_NONE = 1, + VER_NODE_PUBLIC = 28, VER_NODE_PRIVATE = 32, - VER_ACCOUNT_ID = 0, + VER_ACCOUNT_ID = 0, VER_ACCOUNT_PUBLIC = 35, VER_ACCOUNT_PRIVATE = 34, VER_FAMILY_GENERATOR = 41, - VER_FAMILY_SEED = 33, + VER_FAMILY_SEED = 33, } VersionEncoding; void seedInfo(NewcoinAddress* dstGenerator, BIGNUM** dstPrivateKey) const; @@ -26,6 +26,7 @@ private: public: NewcoinAddress(); + // For public and private key, checks if they are legal. bool isValid() const; void clear(); @@ -87,11 +88,14 @@ public: void setAccountPrivate(uint256 hash256); void setAccountPrivate(const NewcoinAddress& generator, const NewcoinAddress& seed, int seq); + bool accountPrivateSign(const uint256& uHash, std::vector& vucSig) const; + bool accountPrivateVerify(const uint256& uHash, const std::vector& vucSig) const; + // Encrypt a message. - std::vector accountPrivateEncrypt(const NewcoinAddress& naPublicTo, const std::vector& vucPlainText); + std::vector accountPrivateEncrypt(const NewcoinAddress& naPublicTo, const std::vector& vucPlainText) const; // Decrypt a message. - std::vector accountPrivateDecrypt(const NewcoinAddress& naPublicFrom, const std::vector& vucCipherText); + std::vector accountPrivateDecrypt(const NewcoinAddress& naPublicFrom, const std::vector& vucCipherText) const; // // Family Generators