secretkeyring.go 2.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798
  1. package mock
  2. import (
  3. "github.com/btcsuite/btcd/btcec/v2"
  4. "github.com/btcsuite/btcd/btcec/v2/ecdsa"
  5. "github.com/btcsuite/btcd/btcec/v2/schnorr"
  6. "github.com/btcsuite/btcd/chaincfg/chainhash"
  7. "github.com/btcsuite/btcd/txscript"
  8. "github.com/lightningnetwork/lnd/keychain"
  9. )
  10. // SecretKeyRing is a mock implementation of the SecretKeyRing interface.
  11. type SecretKeyRing struct {
  12. RootKey *btcec.PrivateKey
  13. }
  14. // DeriveNextKey currently returns dummy values.
  15. func (s *SecretKeyRing) DeriveNextKey(
  16. _ keychain.KeyFamily) (keychain.KeyDescriptor, error) {
  17. return keychain.KeyDescriptor{
  18. PubKey: s.RootKey.PubKey(),
  19. }, nil
  20. }
  21. // DeriveKey currently returns dummy values.
  22. func (s *SecretKeyRing) DeriveKey(
  23. _ keychain.KeyLocator) (keychain.KeyDescriptor, error) {
  24. return keychain.KeyDescriptor{
  25. PubKey: s.RootKey.PubKey(),
  26. }, nil
  27. }
  28. // DerivePrivKey currently returns dummy values.
  29. func (s *SecretKeyRing) DerivePrivKey(
  30. _ keychain.KeyDescriptor) (*btcec.PrivateKey, error) {
  31. return s.RootKey, nil
  32. }
  33. // ECDH currently returns dummy values.
  34. func (s *SecretKeyRing) ECDH(_ keychain.KeyDescriptor,
  35. _ *btcec.PublicKey) ([32]byte, error) {
  36. return [32]byte{}, nil
  37. }
  38. // SignMessage signs the passed message and ignores the KeyDescriptor.
  39. func (s *SecretKeyRing) SignMessage(_ keychain.KeyLocator,
  40. msg []byte, doubleHash bool) (*ecdsa.Signature, error) {
  41. var digest []byte
  42. if doubleHash {
  43. digest = chainhash.DoubleHashB(msg)
  44. } else {
  45. digest = chainhash.HashB(msg)
  46. }
  47. return ecdsa.Sign(s.RootKey, digest), nil
  48. }
  49. // SignMessageCompact signs the passed message.
  50. func (s *SecretKeyRing) SignMessageCompact(_ keychain.KeyLocator,
  51. msg []byte, doubleHash bool) ([]byte, error) {
  52. var digest []byte
  53. if doubleHash {
  54. digest = chainhash.DoubleHashB(msg)
  55. } else {
  56. digest = chainhash.HashB(msg)
  57. }
  58. return ecdsa.SignCompact(s.RootKey, digest, true)
  59. }
  60. // SignMessageSchnorr signs the passed message and ignores the KeyDescriptor.
  61. func (s *SecretKeyRing) SignMessageSchnorr(_ keychain.KeyLocator,
  62. msg []byte, doubleHash bool, taprootTweak []byte,
  63. tag []byte) (*schnorr.Signature, error) {
  64. var digest []byte
  65. switch {
  66. case len(tag) > 0:
  67. taggedHash := chainhash.TaggedHash(tag, msg)
  68. digest = taggedHash[:]
  69. case doubleHash:
  70. digest = chainhash.DoubleHashB(msg)
  71. default:
  72. digest = chainhash.HashB(msg)
  73. }
  74. privKey := s.RootKey
  75. if len(taprootTweak) > 0 {
  76. privKey = txscript.TweakTaprootPrivKey(*privKey, taprootTweak)
  77. }
  78. return schnorr.Sign(privKey, digest)
  79. }