mirror of
				https://github.com/KevinMidboe/linguist.git
				synced 2025-10-29 17:50:22 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			163 lines
		
	
	
		
			4.7 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			163 lines
		
	
	
		
			4.7 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
// Copyright (c) 2009-2010 Satoshi Nakamoto
 | 
						|
// Copyright (c) 2009-2012 The Bitcoin developers
 | 
						|
// Distributed under the MIT/X11 software license, see the accompanying
 | 
						|
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
 | 
						|
#ifndef BITCOIN_KEY_H
 | 
						|
#define BITCOIN_KEY_H
 | 
						|
 | 
						|
#include <stdexcept>
 | 
						|
#include <vector>
 | 
						|
 | 
						|
#include "allocators.h"
 | 
						|
#include "serialize.h"
 | 
						|
#include "uint256.h"
 | 
						|
#include "util.h"
 | 
						|
 | 
						|
#include <openssl/ec.h> // for EC_KEY definition
 | 
						|
 | 
						|
// secp160k1
 | 
						|
// const unsigned int PRIVATE_KEY_SIZE = 192;
 | 
						|
// const unsigned int PUBLIC_KEY_SIZE  = 41;
 | 
						|
// const unsigned int SIGNATURE_SIZE   = 48;
 | 
						|
//
 | 
						|
// secp192k1
 | 
						|
// const unsigned int PRIVATE_KEY_SIZE = 222;
 | 
						|
// const unsigned int PUBLIC_KEY_SIZE  = 49;
 | 
						|
// const unsigned int SIGNATURE_SIZE   = 57;
 | 
						|
//
 | 
						|
// secp224k1
 | 
						|
// const unsigned int PRIVATE_KEY_SIZE = 250;
 | 
						|
// const unsigned int PUBLIC_KEY_SIZE  = 57;
 | 
						|
// const unsigned int SIGNATURE_SIZE   = 66;
 | 
						|
//
 | 
						|
// secp256k1:
 | 
						|
// const unsigned int PRIVATE_KEY_SIZE = 279;
 | 
						|
// const unsigned int PUBLIC_KEY_SIZE  = 65;
 | 
						|
// const unsigned int SIGNATURE_SIZE   = 72;
 | 
						|
//
 | 
						|
// see www.keylength.com
 | 
						|
// script supports up to 75 for single byte push
 | 
						|
 | 
						|
class key_error : public std::runtime_error
 | 
						|
{
 | 
						|
public:
 | 
						|
    explicit key_error(const std::string& str) : std::runtime_error(str) {}
 | 
						|
};
 | 
						|
 | 
						|
/** A reference to a CKey: the Hash160 of its serialized public key */
 | 
						|
class CKeyID : public uint160
 | 
						|
{
 | 
						|
public:
 | 
						|
    CKeyID() : uint160(0) { }
 | 
						|
    CKeyID(const uint160 &in) : uint160(in) { }
 | 
						|
};
 | 
						|
 | 
						|
/** A reference to a CScript: the Hash160 of its serialization (see script.h) */
 | 
						|
class CScriptID : public uint160
 | 
						|
{
 | 
						|
public:
 | 
						|
    CScriptID() : uint160(0) { }
 | 
						|
    CScriptID(const uint160 &in) : uint160(in) { }
 | 
						|
};
 | 
						|
 | 
						|
/** An encapsulated public key. */
 | 
						|
class CPubKey {
 | 
						|
private:
 | 
						|
    std::vector<unsigned char> vchPubKey;
 | 
						|
    friend class CKey;
 | 
						|
 | 
						|
public:
 | 
						|
    CPubKey() { }
 | 
						|
    CPubKey(const std::vector<unsigned char> &vchPubKeyIn) : vchPubKey(vchPubKeyIn) { }
 | 
						|
    friend bool operator==(const CPubKey &a, const CPubKey &b) { return a.vchPubKey == b.vchPubKey; }
 | 
						|
    friend bool operator!=(const CPubKey &a, const CPubKey &b) { return a.vchPubKey != b.vchPubKey; }
 | 
						|
    friend bool operator<(const CPubKey &a, const CPubKey &b) { return a.vchPubKey < b.vchPubKey; }
 | 
						|
 | 
						|
    IMPLEMENT_SERIALIZE(
 | 
						|
        READWRITE(vchPubKey);
 | 
						|
    )
 | 
						|
 | 
						|
    CKeyID GetID() const {
 | 
						|
        return CKeyID(Hash160(vchPubKey));
 | 
						|
    }
 | 
						|
 | 
						|
    uint256 GetHash() const {
 | 
						|
        return Hash(vchPubKey.begin(), vchPubKey.end());
 | 
						|
    }
 | 
						|
 | 
						|
    bool IsValid() const {
 | 
						|
        return vchPubKey.size() == 33 || vchPubKey.size() == 65;
 | 
						|
    }
 | 
						|
 | 
						|
    bool IsCompressed() const {
 | 
						|
        return vchPubKey.size() == 33;
 | 
						|
    }
 | 
						|
 | 
						|
    std::vector<unsigned char> Raw() const {
 | 
						|
        return vchPubKey;
 | 
						|
    }
 | 
						|
};
 | 
						|
 | 
						|
 | 
						|
// secure_allocator is defined in serialize.h
 | 
						|
// CPrivKey is a serialized private key, with all parameters included (279 bytes)
 | 
						|
typedef std::vector<unsigned char, secure_allocator<unsigned char> > CPrivKey;
 | 
						|
// CSecret is a serialization of just the secret parameter (32 bytes)
 | 
						|
typedef std::vector<unsigned char, secure_allocator<unsigned char> > CSecret;
 | 
						|
 | 
						|
/** An encapsulated OpenSSL Elliptic Curve key (public and/or private) */
 | 
						|
class CKey
 | 
						|
{
 | 
						|
protected:
 | 
						|
    EC_KEY* pkey;
 | 
						|
    bool fSet;
 | 
						|
    bool fCompressedPubKey;
 | 
						|
 | 
						|
    void SetCompressedPubKey();
 | 
						|
 | 
						|
public:
 | 
						|
 | 
						|
    void Reset();
 | 
						|
 | 
						|
    CKey();
 | 
						|
    CKey(const CKey& b);
 | 
						|
 | 
						|
    CKey& operator=(const CKey& b);
 | 
						|
 | 
						|
    ~CKey();
 | 
						|
 | 
						|
    bool IsNull() const;
 | 
						|
    bool IsCompressed() const;
 | 
						|
 | 
						|
    void MakeNewKey(bool fCompressed);
 | 
						|
    bool SetPrivKey(const CPrivKey& vchPrivKey);
 | 
						|
    bool SetSecret(const CSecret& vchSecret, bool fCompressed = false);
 | 
						|
    CSecret GetSecret(bool &fCompressed) const;
 | 
						|
    CPrivKey GetPrivKey() const;
 | 
						|
    bool SetPubKey(const CPubKey& vchPubKey);
 | 
						|
    CPubKey GetPubKey() const;
 | 
						|
 | 
						|
    bool Sign(uint256 hash, std::vector<unsigned char>& vchSig);
 | 
						|
 | 
						|
    // create a compact signature (65 bytes), which allows reconstructing the used public key
 | 
						|
    // The format is one header byte, followed by two times 32 bytes for the serialized r and s values.
 | 
						|
    // The header byte: 0x1B = first key with even y, 0x1C = first key with odd y,
 | 
						|
    //                  0x1D = second key with even y, 0x1E = second key with odd y
 | 
						|
    bool SignCompact(uint256 hash, std::vector<unsigned char>& vchSig);
 | 
						|
 | 
						|
    // reconstruct public key from a compact signature
 | 
						|
    // This is only slightly more CPU intensive than just verifying it.
 | 
						|
    // If this function succeeds, the recovered public key is guaranteed to be valid
 | 
						|
    // (the signature is a valid signature of the given data for that key)
 | 
						|
    bool SetCompactSignature(uint256 hash, const std::vector<unsigned char>& vchSig);
 | 
						|
 | 
						|
    bool Verify(uint256 hash, const std::vector<unsigned char>& vchSig);
 | 
						|
 | 
						|
    // Verify a compact signature
 | 
						|
    bool VerifyCompact(uint256 hash, const std::vector<unsigned char>& vchSig);
 | 
						|
 | 
						|
    bool IsValid();
 | 
						|
};
 | 
						|
 | 
						|
#endif
 |