The argument to ec_privkey_export_der is BOOLEAN GetPrivKey call ec_privkey_export_der to use the flag
SECP256K1_EC_COMPRESSED is true SECP256K1_EC_UNCOMPRESSED is true
The argument to ec_privkey_export_der is BOOLEAN GetPrivKey call ec_privkey_export_der to use the flag
SECP256K1_EC_COMPRESSED is true SECP256K1_EC_UNCOMPRESSED is true
If you consider this pull request important, please also help to review the conflicting pull requests. Ideally, start with the one that should be merged first.
169@@ -170,7 +170,7 @@ CPrivKey CKey::GetPrivKey() const {
170 size_t privkeylen;
171 privkey.resize(PRIVATE_KEY_SIZE);
172 privkeylen = PRIVATE_KEY_SIZE;
173- ret = ec_privkey_export_der(secp256k1_context_sign, privkey.data(), &privkeylen, begin(), fCompressed ? SECP256K1_EC_COMPRESSED : SECP256K1_EC_UNCOMPRESSED);
174+ ret = ec_privkey_export_der(secp256k1_context_sign, privkey.data(), &privkeylen, begin(), fCompressed);
0src/key.cpp:173:95: warning: implicit conversion bool -> 'int' [readability-implicit-bool-conversion]
169@@ -170,7 +170,7 @@ CPrivKey CKey::GetPrivKey() const {
170 size_t privkeylen;
171 privkey.resize(PRIVATE_KEY_SIZE);
172 privkeylen = PRIVATE_KEY_SIZE;
173- ret = ec_privkey_export_der(secp256k1_context_sign, privkey.data(), &privkeylen, begin(), fCompressed ? SECP256K1_EC_COMPRESSED : SECP256K1_EC_UNCOMPRESSED);
174+ ret = ec_privkey_export_der(secp256k1_context_sign, privkey.data(), &privkeylen, begin(), fCompressed ? 1 : 0);
fCompressed is a C++ bool, this gets coerced to 1
or 0
automatically; so you can leave out the ? 1 : 0
.
the type bool can be converted to int with the value false becoming 0 and true becoming 1. https://en.cppreference.com/w/cpp/language/implicit_conversion
ec_privkey_export_der
does not take a bit field (secp256k1_ec_pubkey_serialize
is what takes SECP256K1_EC_COMPRESSED=258
and SECP256K1_EC_UNCOMPRESSED=2
). I’m surprised none of the tests catches this.
suggested on IRC was, to prevent the bug as well as the conversion warning without using really contorted C++:
0diff --git a/src/key.cpp b/src/key.cpp
1index df452cd3302ee6aff363b8fc8ea328b69d8bfb55..80d6589a3c36b823402b81d759ff43520037c43a 100644
2--- a/src/key.cpp
3+++ b/src/key.cpp
4@@ -89,7 +89,7 @@ static int ec_privkey_import_der(const secp256k1_context* ctx, unsigned char *ou
5 * will be set to the number of bytes used in the buffer.
6 * key32 must point to a 32-byte raw private key.
7 */
8-static int ec_privkey_export_der(const secp256k1_context *ctx, unsigned char *privkey, size_t *privkeylen, const unsigned char *key32, int compressed) {
9+static int ec_privkey_export_der(const secp256k1_context *ctx, unsigned char *privkey, size_t *privkeylen, const unsigned char *key32, bool compressed) {
10 assert(*privkeylen >= CKey::PRIVATE_KEY_SIZE);
11 secp256k1_pubkey pubkey;
12 size_t pubkeylen = 0;
13@@ -170,7 +170,7 @@ CPrivKey CKey::GetPrivKey() const {
14 size_t privkeylen;
15 privkey.resize(PRIVATE_KEY_SIZE);
16 privkeylen = PRIVATE_KEY_SIZE;
17- ret = ec_privkey_export_der(secp256k1_context_sign, privkey.data(), &privkeylen, begin(), fCompressed ? SECP256K1_EC_COMPRESSED : SECP256K1_EC_UNCOMPRESSED);
18+ ret = ec_privkey_export_der(secp256k1_context_sign, privkey.data(), &privkeylen, begin(), fCompressed);
19 assert(ret);
20 privkey.resize(privkeylen);
21 return privkey;