35 static int ec_privkey_import_der(
const secp256k1_context* ctx,
unsigned char *out32,
const unsigned char *privkey,
size_t privkeylen) {
36 const unsigned char *
end = privkey + privkeylen;
39 if (
end - privkey < 1 || *privkey != 0x30u) {
44 if (
end - privkey < 1 || !(*privkey & 0x80u)) {
47 ptrdiff_t lenb = *privkey & ~0x80u; privkey++;
48 if (lenb < 1 || lenb > 2) {
51 if (
end - privkey < lenb) {
55 ptrdiff_t len = privkey[lenb-1] | (lenb > 1 ? privkey[lenb-2] << 8 : 0u);
57 if (
end - privkey < len) {
61 if (
end - privkey < 3 || privkey[0] != 0x02u || privkey[1] != 0x01u || privkey[2] != 0x01u) {
66 if (
end - privkey < 2 || privkey[0] != 0x04u) {
69 ptrdiff_t oslen = privkey[1];
71 if (oslen > 32 ||
end - privkey < oslen) {
74 memcpy(out32 + (32 - oslen), privkey, oslen);
92 static int ec_privkey_export_der(
const secp256k1_context *ctx,
unsigned char *privkey,
size_t *privkeylen,
const unsigned char *key32,
bool compressed) {
101 static const unsigned char begin[] = {
102 0x30,0x81,0xD3,0x02,0x01,0x01,0x04,0x20
104 static const unsigned char middle[] = {
105 0xA0,0x81,0x85,0x30,0x81,0x82,0x02,0x01,0x01,0x30,0x2C,0x06,0x07,0x2A,0x86,0x48,
106 0xCE,0x3D,0x01,0x01,0x02,0x21,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
107 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
108 0xFF,0xFF,0xFE,0xFF,0xFF,0xFC,0x2F,0x30,0x06,0x04,0x01,0x00,0x04,0x01,0x07,0x04,
109 0x21,0x02,0x79,0xBE,0x66,0x7E,0xF9,0xDC,0xBB,0xAC,0x55,0xA0,0x62,0x95,0xCE,0x87,
110 0x0B,0x07,0x02,0x9B,0xFC,0xDB,0x2D,0xCE,0x28,0xD9,0x59,0xF2,0x81,0x5B,0x16,0xF8,
111 0x17,0x98,0x02,0x21,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
112 0xFF,0xFF,0xFF,0xFF,0xFE,0xBA,0xAE,0xDC,0xE6,0xAF,0x48,0xA0,0x3B,0xBF,0xD2,0x5E,
113 0x8C,0xD0,0x36,0x41,0x41,0x02,0x01,0x01,0xA1,0x24,0x03,0x22,0x00
115 unsigned char *ptr = privkey;
116 memcpy(ptr, begin,
sizeof(begin)); ptr +=
sizeof(begin);
117 memcpy(ptr, key32, 32); ptr += 32;
118 memcpy(ptr, middle,
sizeof(middle)); ptr +=
sizeof(middle);
122 *privkeylen = ptr - privkey;
125 static const unsigned char begin[] = {
126 0x30,0x82,0x01,0x13,0x02,0x01,0x01,0x04,0x20
128 static const unsigned char middle[] = {
129 0xA0,0x81,0xA5,0x30,0x81,0xA2,0x02,0x01,0x01,0x30,0x2C,0x06,0x07,0x2A,0x86,0x48,
130 0xCE,0x3D,0x01,0x01,0x02,0x21,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
131 0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
132 0xFF,0xFF,0xFE,0xFF,0xFF,0xFC,0x2F,0x30,0x06,0x04,0x01,0x00,0x04,0x01,0x07,0x04,
133 0x41,0x04,0x79,0xBE,0x66,0x7E,0xF9,0xDC,0xBB,0xAC,0x55,0xA0,0x62,0x95,0xCE,0x87,
134 0x0B,0x07,0x02,0x9B,0xFC,0xDB,0x2D,0xCE,0x28,0xD9,0x59,0xF2,0x81,0x5B,0x16,0xF8,
135 0x17,0x98,0x48,0x3A,0xDA,0x77,0x26,0xA3,0xC4,0x65,0x5D,0xA4,0xFB,0xFC,0x0E,0x11,
136 0x08,0xA8,0xFD,0x17,0xB4,0x48,0xA6,0x85,0x54,0x19,0x9C,0x47,0xD0,0x8F,0xFB,0x10,
137 0xD4,0xB8,0x02,0x21,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
138 0xFF,0xFF,0xFF,0xFF,0xFE,0xBA,0xAE,0xDC,0xE6,0xAF,0x48,0xA0,0x3B,0xBF,0xD2,0x5E,
139 0x8C,0xD0,0x36,0x41,0x41,0x02,0x01,0x01,0xA1,0x44,0x03,0x42,0x00
141 unsigned char *ptr = privkey;
142 memcpy(ptr, begin,
sizeof(begin)); ptr +=
sizeof(begin);
143 memcpy(ptr, key32, 32); ptr += 32;
144 memcpy(ptr, middle,
sizeof(middle)); ptr +=
sizeof(middle);
148 *privkeylen = ptr - privkey;
173 ret = ec_privkey_export_der(secp256k1_context_sign, privkey.data(), &privkeylen,
begin(),
fCompressed);
175 privkey.resize(privkeylen);
187 assert(result.
size() == clen);
195 unsigned char compact_sig[64];
202 return compact_sig[0] < 0x80;
205 bool CKey::Sign(
const uint256 &hash, std::vector<unsigned char>& vchSig,
bool grind, uint32_t test_case)
const {
210 unsigned char extra_entropy[32] = {0};
211 WriteLE32(extra_entropy, test_case);
213 uint32_t counter = 0;
218 WriteLE32(extra_entropy, ++counter);
223 vchSig.resize(nSigLen);
231 unsigned char rnd[8];
232 std::string str =
"BSHA3 key verification\n";
235 CHash3().
Write((
unsigned char*)str.data(), str.size()).Write(rnd,
sizeof(rnd)).Finalize(hash.
begin());
236 std::vector<unsigned char> vchSig;
238 return pubkey.
Verify(hash, vchSig);
257 if (!ec_privkey_import_der(secp256k1_context_sign, (
unsigned char*)
begin(), privkey.data(), privkey.size()))
271 std::vector<unsigned char, secure_allocator<unsigned char>> vout(64);
272 if ((nChild >> 31) == 0) {
277 assert(
size() == 32);
297 static const unsigned char hashkey[] = {
'B',
'i',
't',
'c',
'o',
'i',
'n',
' ',
's',
'e',
'e',
'd'};
298 std::vector<unsigned char, secure_allocator<unsigned char>> vout(64);
300 key.
Set(vout.data(), vout.data() + 32,
true);
320 code[5] = (
nChild >> 24) & 0xFF; code[6] = (
nChild >> 16) & 0xFF;
321 code[7] = (
nChild >> 8) & 0xFF; code[8] = (
nChild >> 0) & 0xFF;
331 nChild = (code[5] << 24) | (code[6] << 16) | (code[7] << 8) | code[8];
344 assert(secp256k1_context_sign ==
nullptr);
347 assert(ctx !=
nullptr);
351 std::vector<unsigned char, secure_allocator<unsigned char>> vseed(32);
357 secp256k1_context_sign = ctx;
362 secp256k1_context_sign =
nullptr;
void ECC_Start()
Initialize the elliptic curve support.
CPrivKey GetPrivKey() const
Convert the private key to a CPrivKey (serialized OpenSSL private key data).
SECP256K1_API int secp256k1_ecdsa_signature_serialize_compact(const secp256k1_context *ctx, unsigned char *output64, const secp256k1_ecdsa_signature *sig) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(2) SECP256K1_ARG_NONNULL(3)
Serialize an ECDSA signature in compact (64 byte) format.
SECP256K1_API SECP256K1_WARN_UNUSED_RESULT int secp256k1_context_randomize(secp256k1_context *ctx, const unsigned char *seed32) SECP256K1_ARG_NONNULL(1)
Updates the context randomization to protect against side-channel leakage.
bool Derive(CExtKey &out, unsigned int nChild) const
bool VerifyPubKey(const CPubKey &vchPubKey) const
Verify thoroughly whether a private key and a public key match.
CPubKey GetPubKey() const
Compute the public key from a private key.
static constexpr unsigned int PUBLIC_KEY_SIZE
secp256k1:
static const unsigned int COMPRESSED_PRIVATE_KEY_SIZE
UniValue ret(UniValue::VARR)
void Encode(unsigned char code[BIP32_EXTKEY_SIZE]) const
Opaque data structured that holds a parsed ECDSA signature, supporting pubkey recovery.
unsigned char vchFingerprint[4]
void GetStrongRandBytes(unsigned char *out, int num)
Function to gather random data from multiple sources, failing whenever any of those sources fail to p...
SECP256K1_API int secp256k1_ec_pubkey_serialize(const secp256k1_context *ctx, unsigned char *output, size_t *outputlen, const secp256k1_pubkey *pubkey, unsigned int flags) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(2) SECP256K1_ARG_NONNULL(3) SECP256K1_ARG_NONNULL(4)
Serialize a pubkey object into a serialized byte sequence.
const unsigned char * begin() const
#define SECP256K1_CONTEXT_SIGN
SECP256K1_API SECP256K1_WARN_UNUSED_RESULT int secp256k1_ec_privkey_tweak_add(const secp256k1_context *ctx, unsigned char *seckey, const unsigned char *tweak) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(2) SECP256K1_ARG_NONNULL(3)
Tweak a private key by adding tweak to it.
bool fValid
see www.keylength.com script supports up to 75 for single byte push
CKeyID GetID() const
Get the KeyID of this public key (hash of its serialization)
const unsigned char * begin() const
SECP256K1_API const secp256k1_nonce_function secp256k1_nonce_function_rfc6979
An implementation of RFC6979 (using HMAC-SHA256) as nonce generation function.
static constexpr unsigned int COMPRESSED_PUBLIC_KEY_SIZE
bool SignCompact(const uint256 &hash, std::vector< unsigned char > &vchSig) const
Create a compact signature (65 bytes), which allows reconstructing the used public key...
SECP256K1_API void secp256k1_context_destroy(secp256k1_context *ctx)
Destroy a secp256k1 context object.
SECP256K1_API SECP256K1_WARN_UNUSED_RESULT int secp256k1_ec_pubkey_create(const secp256k1_context *ctx, secp256k1_pubkey *pubkey, const unsigned char *seckey) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(2) SECP256K1_ARG_NONNULL(3)
Compute the public key for a secret key.
std::vector< unsigned char, secure_allocator< unsigned char > > CPrivKey
secure_allocator is defined in allocators.h CPrivKey is a serialized private key, with all parameters...
bool Sign(const uint256 &hash, std::vector< unsigned char > &vchSig, bool grind=true, uint32_t test_case=0) const
Create a DER-serialized signature.
#define SECP256K1_EC_UNCOMPRESSED
#define SECP256K1_EC_COMPRESSED
Flag to pass to secp256k1_ec_pubkey_serialize and secp256k1_ec_privkey_export.
static const unsigned int PRIVATE_KEY_SIZE
secp256k1:
SECP256K1_API SECP256K1_WARN_UNUSED_RESULT int secp256k1_ec_seckey_verify(const secp256k1_context *ctx, const unsigned char *seckey) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(2)
Verify an ECDSA secret key.
bool SigHasLowR(const secp256k1_ecdsa_signature *sig)
void ECC_Stop()
Deinitialize the elliptic curve support.
SECP256K1_API int secp256k1_ecdsa_sign(const secp256k1_context *ctx, secp256k1_ecdsa_signature *sig, const unsigned char *msg32, const unsigned char *seckey, secp256k1_nonce_function noncefp, const void *ndata) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(2) SECP256K1_ARG_NONNULL(3) SECP256K1_ARG_NONNULL(4)
Create an ECDSA signature.
SECP256K1_API int secp256k1_ecdsa_sign_recoverable(const secp256k1_context *ctx, secp256k1_ecdsa_recoverable_signature *sig, const unsigned char *msg32, const unsigned char *seckey, secp256k1_nonce_function noncefp, const void *ndata) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(2) SECP256K1_ARG_NONNULL(3) SECP256K1_ARG_NONNULL(4)
Create a recoverable ECDSA signature.
An encapsulated public key.
void Finalize(unsigned char hash[OUTPUT_SIZE])
void MakeNewKey(bool fCompressed)
Generate a new private key using a cryptographic PRNG.
unsigned int size() const
Simple read-only vector-like interface.
unsigned int size() const
Simple read-only vector-like interface to the pubkey data.
bool IsCompressed() const
Check whether the public key corresponding to this private key is (to be) compressed.
Opaque data structured that holds a parsed ECDSA signature.
SECP256K1_API int secp256k1_ecdsa_recoverable_signature_serialize_compact(const secp256k1_context *ctx, unsigned char *output64, int *recid, const secp256k1_ecdsa_recoverable_signature *sig) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(2) SECP256K1_ARG_NONNULL(3) SECP256K1_ARG_NONNULL(4)
Serialize an ECDSA signature in compact format (64 bytes + recovery id).
static constexpr unsigned int COMPACT_SIGNATURE_SIZE
void Set(const T pbegin, const T pend, bool fCompressedIn)
Initialize using begin and end iterators to byte data.
void SetSeed(const unsigned char *seed, unsigned int nSeedLen)
void Decode(const unsigned char code[BIP32_EXTKEY_SIZE])
SECP256K1_API int secp256k1_ecdsa_signature_serialize_der(const secp256k1_context *ctx, unsigned char *output, size_t *outputlen, const secp256k1_ecdsa_signature *sig) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(2) SECP256K1_ARG_NONNULL(3) SECP256K1_ARG_NONNULL(4)
Serialize an ECDSA signature in DER format.
CExtPubKey Neuter() const
bool Verify(const uint256 &hash, const std::vector< unsigned char > &vchSig) const
Verify a DER signature (~72 bytes).
bool Derive(CKey &keyChild, ChainCode &ccChild, unsigned int nChild, const ChainCode &cc) const
Derive BIP32 child key.
void * memcpy(void *a, const void *b, size_t c)
const unsigned int BIP32_EXTKEY_SIZE
CHash3 & Write(const unsigned char *data, size_t len)
CHMAC_SHA3512 & Write(const unsigned char *data, size_t len)
A reference to a CKey: the Hash360 of its serialized public key.
bool fCompressed
Whether the public key corresponding to this private key is (to be) compressed.
void GetRandBytes(unsigned char *buf, int num)
Functions to gather random data via the OpenSSL PRNG.
A hasher class for BSHA3's 256-bit hash (double SHA-3).
A hasher class for HMAC-SHA-3-512.
std::vector< unsigned char, secure_allocator< unsigned char > > keydata
The actual byte data.
static bool Check(const unsigned char *vch)
Check whether the 32-byte array pointed to by vch is valid keydata.
An encapsulated private key.
bool ECC_InitSanityCheck()
Check that required EC support is available at runtime.
static constexpr unsigned int SIGNATURE_SIZE
SECP256K1_API secp256k1_context * secp256k1_context_create(unsigned int flags) SECP256K1_WARN_UNUSED_RESULT
Create a secp256k1 context object.
void BIP32Hash(const ChainCode &chainCode, unsigned int nChild, unsigned char header, const unsigned char data[32], unsigned char output[64])
bool Load(const CPrivKey &privkey, const CPubKey &vchPubKey, bool fSkipCheck)
Load private key and check that public key matches.
bool IsValid() const
Check whether this private key is valid.
Opaque data structure that holds a parsed and valid public key.
bool IsCompressed() const
Check whether this is a compressed public key.