Skip to content

Conversation

@fingera
Copy link
Contributor

@fingera fingera commented Sep 11, 2018

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

@fingera
Copy link
Contributor Author

fingera commented Sep 11, 2018

Is it changing ec_privkey_export_der? Delete another branch that will never be reached

@Empact
Copy link
Contributor

Empact commented Sep 11, 2018

Looks like a bug to me...

@DrahtBot
Copy link
Contributor

Note to reviewers: This pull request conflicts with the following ones:

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.

@achow101
Copy link
Member

Please make your description and title more descriptive.

@fingera fingera changed the title is this a bug? fix export privkey der always compressed Sep 11, 2018
@practicalswift
Copy link
Contributor

@fingera Nice first-time contribution! Out of curiosity, how did you find this? :-)

Related: #10041 and #10043

@fingera
Copy link
Contributor Author

fingera commented Sep 11, 2018

You found out before, why not fix it?

@fingera fingera closed this Sep 11, 2018
@fingera
Copy link
Contributor Author

fingera commented Sep 11, 2018

@practicalswift
Copy link
Contributor

@fingera Please re-open the PR: this is still confusing and hence unresolved :-)

@fingera fingera reopened this Sep 11, 2018
src/key.cpp Outdated
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

src/key.cpp:173:95: warning: implicit conversion bool -> 'int' [readability-implicit-bool-conversion]

src/key.cpp Outdated
Copy link
Member

@laanwj laanwj Sep 12, 2018

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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

Copy link
Member

@laanwj laanwj Sep 12, 2018

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Huh, apparently @practicalswift told you to do this.
Can you explain @practicalswift ?

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@laanwj
Copy link
Member

laanwj commented Sep 12, 2018

utACK (after squash), this clearly fixes a bug, 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.

@practicalswift
Copy link
Contributor

utACK 67e17da34de278c0b0bab0caad0ad877a053b0d6 modulo squash and a more informative commit message :-)

@laanwj
Copy link
Member

laanwj commented Sep 12, 2018

suggested on IRC was, to prevent the bug as well as the conversion warning without using really contorted C++:

diff --git a/src/key.cpp b/src/key.cpp
index df452cd3302ee6aff363b8fc8ea328b69d8bfb55..80d6589a3c36b823402b81d759ff43520037c43a 100644
--- a/src/key.cpp
+++ b/src/key.cpp
@@ -89,7 +89,7 @@ static int ec_privkey_import_der(const secp256k1_context* ctx, unsigned char *ou
  * will be set to the number of bytes used in the buffer.
  * key32 must point to a 32-byte raw private key.
  */
-static int ec_privkey_export_der(const secp256k1_context *ctx, unsigned char *privkey, size_t *privkeylen, const unsigned char *key32, int compressed) {
+static int ec_privkey_export_der(const secp256k1_context *ctx, unsigned char *privkey, size_t *privkeylen, const unsigned char *key32, bool compressed) {
     assert(*privkeylen >= CKey::PRIVATE_KEY_SIZE);
     secp256k1_pubkey pubkey;
     size_t pubkeylen = 0;
@@ -170,7 +170,7 @@ CPrivKey CKey::GetPrivKey() const {
     size_t privkeylen;
     privkey.resize(PRIVATE_KEY_SIZE);
     privkeylen = PRIVATE_KEY_SIZE;
-    ret = ec_privkey_export_der(secp256k1_context_sign, privkey.data(), &privkeylen, begin(), fCompressed ? SECP256K1_EC_COMPRESSED : SECP256K1_EC_UNCOMPRESSED);
+    ret = ec_privkey_export_der(secp256k1_context_sign, privkey.data(), &privkeylen, begin(), fCompressed);
     assert(ret);
     privkey.resize(privkeylen);
     return privkey;

@laanwj laanwj changed the title fix export privkey der always compressed Pass privkey export DER compression flag correctly Sep 13, 2018
@laanwj
Copy link
Member

laanwj commented Sep 13, 2018

merged via 9a565a8

@laanwj laanwj closed this Sep 13, 2018
pull bot pushed a commit to jaschadub/bitcoin that referenced this pull request Sep 13, 2018
9a565a8 Pass export privkey DER compression flag correctly (liuyujun)

Tree-SHA512: 3fa1d7568ce133cd22708f453f3252c1138b1c40a821e90546d83bee4aac117ac8d848fa46cb45efad1031ce03cd5ba2d6c89b459abca6703aa2a957531e7edf
@fingera fingera deleted the 5-fix-get-priv branch September 13, 2018 09:30
deadalnix pushed a commit to Bitcoin-ABC/bitcoin-abc that referenced this pull request Nov 10, 2020
Summary:
By passing a bitfield where a boolean was expected, the result was
always compressed. Fix this.

This is a backport of Core [[bitcoin/bitcoin#14195 | PR14195]]

Test Plan: `ninja all check-all`

Reviewers: #bitcoin_abc, Fabien

Reviewed By: #bitcoin_abc, Fabien

Differential Revision: https://reviews.bitcoinabc.org/D8344
PastaPastaPasta pushed a commit to PastaPastaPasta/dash that referenced this pull request Jul 1, 2021
9a565a8 Pass export privkey DER compression flag correctly (liuyujun)

Tree-SHA512: 3fa1d7568ce133cd22708f453f3252c1138b1c40a821e90546d83bee4aac117ac8d848fa46cb45efad1031ce03cd5ba2d6c89b459abca6703aa2a957531e7edf
@bitcoin bitcoin locked as resolved and limited conversation to collaborators Sep 8, 2021
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

6 participants