Add sign and verify to NewcoinAddress.

This commit is contained in:
Arthur Britto
2012-05-13 15:04:06 -07:00
parent ee017fbf9d
commit 76e8e34038
2 changed files with 77 additions and 9 deletions

View File

@@ -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<unsigned char> NewcoinAddress::accountPrivateEncrypt(const NewcoinAddress& naPublicTo, const std::vector<unsigned char>& vucPlainText)
bool NewcoinAddress::accountPrivateSign(const uint256& uHash, std::vector<unsigned char>& 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<unsigned char>& 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<unsigned char> NewcoinAddress::accountPrivateEncrypt(const NewcoinAddress& naPublicTo, const std::vector<unsigned char>& vucPlainText) const
{
CKey ckPrivate;
CKey ckPublic;
@@ -362,7 +426,7 @@ std::vector<unsigned char> NewcoinAddress::accountPrivateEncrypt(const NewcoinAd
return vucCipherText;
}
std::vector<unsigned char> NewcoinAddress::accountPrivateDecrypt(const NewcoinAddress& naPublicFrom, const std::vector<unsigned char>& vucCipherText)
std::vector<unsigned char> NewcoinAddress::accountPrivateDecrypt(const NewcoinAddress& naPublicFrom, const std::vector<unsigned char>& vucCipherText) const
{
CKey ckPrivate;
CKey ckPublic;

View File

@@ -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<unsigned char>& vucSig) const;
bool accountPrivateVerify(const uint256& uHash, const std::vector<unsigned char>& vucSig) const;
// Encrypt a message.
std::vector<unsigned char> accountPrivateEncrypt(const NewcoinAddress& naPublicTo, const std::vector<unsigned char>& vucPlainText);
std::vector<unsigned char> accountPrivateEncrypt(const NewcoinAddress& naPublicTo, const std::vector<unsigned char>& vucPlainText) const;
// Decrypt a message.
std::vector<unsigned char> accountPrivateDecrypt(const NewcoinAddress& naPublicFrom, const std::vector<unsigned char>& vucCipherText);
std::vector<unsigned char> accountPrivateDecrypt(const NewcoinAddress& naPublicFrom, const std::vector<unsigned char>& vucCipherText) const;
//
// Family Generators