Page Menu
Home
Phabricator
Search
Configure Global Search
Log In
Files
F10615255
key.h
No One
Temporary
Actions
Download File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Award Token
Flag For Later
Size
6 KB
Subscribers
None
key.h
View Options
// Copyright (c) 2009-2010 Satoshi Nakamoto
// Copyright (c) 2009-2016 The Bitcoin Core developers
// Copyright (c) 2017 The Zcash developers
// Distributed under the MIT 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
<pubkey.h>
#include
<support/allocators/secure.h>
#include
<uint256.h>
#include
<stdexcept>
#include
<vector>
/**
* secure_allocator is defined in allocators.h
* CPrivKey is a serialized private key, with all parameters included
* (SIZE bytes)
*/
typedef
std
::
vector
<
uint8_t
,
secure_allocator
<
uint8_t
>>
CPrivKey
;
//! a Schnorr signature
using
SchnorrSig
=
std
::
array
<
uint8_t
,
CPubKey
::
SCHNORR_SIZE
>
;
/** An encapsulated secp256k1 private key. */
class
CKey
{
public
:
/**
* secp256k1:
*/
static
const
unsigned
int
SIZE
=
279
;
static
const
unsigned
int
COMPRESSED_SIZE
=
214
;
/**
* see www.keylength.com
* script supports up to 75 for single byte push
*/
static_assert
(
SIZE
>=
COMPRESSED_SIZE
,
"COMPRESSED_SIZE is larger than SIZE"
);
private
:
//! Whether this private key is valid. We check for correctness when
//! modifying the key data, so fValid should always correspond to the actual
//! state.
bool
fValid
;
//! Whether the public key corresponding to this private key is (to be)
//! compressed.
bool
fCompressed
;
//! The actual byte data
std
::
vector
<
uint8_t
,
secure_allocator
<
uint8_t
>>
keydata
;
//! Check whether the 32-byte array pointed to by vch is valid keydata.
static
bool
Check
(
const
uint8_t
*
vch
);
public
:
//! Construct an invalid private key.
CKey
()
:
fValid
(
false
),
fCompressed
(
false
)
{
// Important: vch must be 32 bytes in length to not break serialization
keydata
.
resize
(
32
);
}
//! Produce a valid compressed key
static
CKey
MakeCompressedKey
();
//! Produce a valid uncompressed key
static
CKey
MakeUncompressedKey
();
friend
bool
operator
==
(
const
CKey
&
a
,
const
CKey
&
b
)
{
return
a
.
fCompressed
==
b
.
fCompressed
&&
a
.
size
()
==
b
.
size
()
&&
memcmp
(
a
.
keydata
.
data
(),
b
.
keydata
.
data
(),
a
.
size
())
==
0
;
}
//! Initialize using begin and end iterators to byte data.
template
<
typename
T
>
void
Set
(
const
T
pbegin
,
const
T
pend
,
bool
fCompressedIn
)
{
if
(
size_t
(
pend
-
pbegin
)
!=
keydata
.
size
())
{
fValid
=
false
;
}
else
if
(
Check
(
&
pbegin
[
0
]))
{
memcpy
(
keydata
.
data
(),
(
uint8_t
*
)
&
pbegin
[
0
],
keydata
.
size
());
fValid
=
true
;
fCompressed
=
fCompressedIn
;
}
else
{
fValid
=
false
;
}
}
//! Simple read-only vector-like interface.
unsigned
int
size
()
const
{
return
(
fValid
?
keydata
.
size
()
:
0
);
}
const
uint8_t
*
begin
()
const
{
return
keydata
.
data
();
}
const
uint8_t
*
end
()
const
{
return
keydata
.
data
()
+
size
();
}
//! Check whether this private key is valid.
bool
IsValid
()
const
{
return
fValid
;
}
//! Check whether the public key corresponding to this private key is (to
//! be) compressed.
bool
IsCompressed
()
const
{
return
fCompressed
;
}
//! Generate a new private key using a cryptographic PRNG.
void
MakeNewKey
(
bool
fCompressed
);
//! Negate private key
bool
Negate
();
/**
* Convert the private key to a CPrivKey (serialized OpenSSL private key
* data).
* This is expensive.
*/
CPrivKey
GetPrivKey
()
const
;
/**
* Compute the public key from a private key.
* This is expensive.
*/
CPubKey
GetPubKey
()
const
;
/**
* Create a DER-serialized ECDSA signature.
* The test_case parameter tweaks the deterministic nonce.
*/
bool
SignECDSA
(
const
uint256
&
hash
,
std
::
vector
<
uint8_t
>
&
vchSig
,
bool
grind
=
true
,
uint32_t
test_case
=
0
)
const
;
/**
* Create a Schnorr signature.
* The test_case parameter tweaks the deterministic nonce.
*/
bool
SignSchnorr
(
const
uint256
&
hash
,
SchnorrSig
&
sig
,
uint32_t
test_case
=
0
)
const
;
bool
SignSchnorr
(
const
uint256
&
hash
,
std
::
vector
<
uint8_t
>
&
vchSig
,
uint32_t
test_case
=
0
)
const
;
/**
* Create a compact ECDSA 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,
* add 0x04 for compressed keys.
*/
bool
SignCompact
(
const
uint256
&
hash
,
std
::
vector
<
uint8_t
>
&
vchSig
)
const
;
//! Derive BIP32 child key.
bool
Derive
(
CKey
&
keyChild
,
ChainCode
&
ccChild
,
unsigned
int
nChild
,
const
ChainCode
&
cc
)
const
;
/**
* Verify thoroughly whether a private key and a public key match.
* This is done using a different mechanism than just regenerating it.
* (An ECDSA signature is created then verified.)
*/
bool
VerifyPubKey
(
const
CPubKey
&
vchPubKey
)
const
;
//! Load private key and check that public key matches.
bool
Load
(
const
CPrivKey
&
privkey
,
const
CPubKey
&
vchPubKey
,
bool
fSkipCheck
);
};
struct
CExtKey
{
uint8_t
nDepth
;
uint8_t
vchFingerprint
[
4
];
unsigned
int
nChild
;
ChainCode
chaincode
;
CKey
key
;
friend
bool
operator
==
(
const
CExtKey
&
a
,
const
CExtKey
&
b
)
{
return
a
.
nDepth
==
b
.
nDepth
&&
memcmp
(
&
a
.
vchFingerprint
[
0
],
&
b
.
vchFingerprint
[
0
],
sizeof
(
vchFingerprint
))
==
0
&&
a
.
nChild
==
b
.
nChild
&&
a
.
chaincode
==
b
.
chaincode
&&
a
.
key
==
b
.
key
;
}
void
Encode
(
uint8_t
code
[
BIP32_EXTKEY_SIZE
])
const
;
void
Decode
(
const
uint8_t
code
[
BIP32_EXTKEY_SIZE
]);
bool
Derive
(
CExtKey
&
out
,
unsigned
int
nChild
)
const
;
CExtPubKey
Neuter
()
const
;
void
SetSeed
(
const
uint8_t
*
seed
,
unsigned
int
nSeedLen
);
CExtKey
()
=
default
;
};
/**
* Initialize the elliptic curve support. May not be called twice without
* calling ECC_Stop first.
*/
void
ECC_Start
();
/**
* Deinitialize the elliptic curve support. No-op if ECC_Start wasn't called
* first.
*/
void
ECC_Stop
();
/** Check that required EC support is available at runtime. */
bool
ECC_InitSanityCheck
();
#endif
// BITCOIN_KEY_H
File Metadata
Details
Attached
Mime Type
text/x-c++
Expires
Sat, Nov 23, 10:02 (1 d, 20 h)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
4510581
Default Alt Text
key.h (6 KB)
Attached To
rSTAGING Bitcoin ABC staging
Event Timeline
Log In to Comment