Skip to content

Commit

Permalink
crypto: add NUMS_H const
Browse files Browse the repository at this point in the history
  • Loading branch information
josibake committed May 14, 2024
1 parent 2cedb42 commit 91a8047
Show file tree
Hide file tree
Showing 3 changed files with 25 additions and 0 deletions.
12 changes: 12 additions & 0 deletions src/pubkey.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@
#include <secp256k1_schnorrsig.h>
#include <span.h>
#include <uint256.h>
#include <util/strencodings.h>

#include <algorithm>
#include <cassert>
Expand Down Expand Up @@ -181,6 +182,17 @@ int ecdsa_signature_parse_der_lax(secp256k1_ecdsa_signature* sig, const unsigned
return 1;
}

/** Nothing Up My Sleeve (NUMS) point
*
* NUMS_H is a point with an unknown discrete logarithm, constructed by taking the sha256 of 'g'
* (uncompressed encoding), which happens to be a point on the curve.
*
* For an example script for calculating H, refer to the unit tests in
* ./test/functional/test_framework/crypto/secp256k1.py
*/
static const std::vector<unsigned char> NUMS_H_DATA{ParseHex("50929b74c1a04954b78b4b6035e97a5e078a5a0f28ec96d547bfee9ace803ac0")};
const XOnlyPubKey XOnlyPubKey::NUMS_H{NUMS_H_DATA};

XOnlyPubKey::XOnlyPubKey(Span<const unsigned char> bytes)
{
assert(bytes.size() == 32);
Expand Down
5 changes: 5 additions & 0 deletions src/pubkey.h
Original file line number Diff line number Diff line change
Expand Up @@ -233,6 +233,11 @@ class XOnlyPubKey
uint256 m_keydata;

public:
/** Nothing Up My Sleeve point H
* Used as an internal key for provably disabling the key path spend
* see BIP341 for more details */
static const XOnlyPubKey NUMS_H;

/** Construct an empty x-only pubkey. */
XOnlyPubKey() = default;

Expand Down
8 changes: 8 additions & 0 deletions test/functional/test_framework/crypto/secp256k1.py
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,8 @@
* G: the secp256k1 generator point
"""

import unittest
from hashlib import sha256

class FE:
"""Objects of this class represent elements of the field GF(2**256 - 2**32 - 977).
Expand Down Expand Up @@ -344,3 +346,9 @@ def mul(self, a):

# Precomputed table with multiples of G for fast multiplication
FAST_G = FastGEMul(G)

class TestFrameworkSecp256k1(unittest.TestCase):
def test_H(self):
H = sha256(G.to_bytes_uncompressed()).digest()
assert GE.lift_x(FE.from_bytes(H)) is not None
self.assertEqual(H.hex(), "50929b74c1a04954b78b4b6035e97a5e078a5a0f28ec96d547bfee9ace803ac0")

0 comments on commit 91a8047

Please sign in to comment.