2014-08-10 22:13:11 +02:00
|
|
|
// Copyright (c) 2014 Conformal Systems LLC.
|
|
|
|
// Use of this source code is governed by an ISC
|
|
|
|
// license that can be found in the LICENSE file.
|
|
|
|
|
|
|
|
package btcec_test
|
|
|
|
|
|
|
|
import (
|
|
|
|
"encoding/hex"
|
|
|
|
"fmt"
|
|
|
|
|
2015-02-06 17:09:24 +01:00
|
|
|
"github.com/btcsuite/btcd/btcec"
|
2015-02-05 21:57:50 +01:00
|
|
|
"github.com/btcsuite/btcd/wire"
|
2014-08-10 22:13:11 +02:00
|
|
|
)
|
|
|
|
|
|
|
|
// This example demonstrates signing a message with a secp256k1 private key that
|
|
|
|
// is first parsed form raw bytes and serializing the generated signature.
|
|
|
|
func Example_signMessage() {
|
|
|
|
// Decode a hex-encoded private key.
|
|
|
|
pkBytes, err := hex.DecodeString("22a47fa09a223f2aa079edf85a7c2d4f87" +
|
|
|
|
"20ee63e502ee2869afab7de234b80c")
|
|
|
|
if err != nil {
|
|
|
|
fmt.Println(err)
|
|
|
|
return
|
|
|
|
}
|
|
|
|
privKey, pubKey := btcec.PrivKeyFromBytes(btcec.S256(), pkBytes)
|
|
|
|
|
|
|
|
// Sign a message using the private key.
|
|
|
|
message := "test message"
|
2015-02-05 21:57:50 +01:00
|
|
|
messageHash := wire.DoubleSha256([]byte(message))
|
2014-08-10 22:13:11 +02:00
|
|
|
signature, err := privKey.Sign(messageHash)
|
|
|
|
if err != nil {
|
|
|
|
fmt.Println(err)
|
|
|
|
return
|
|
|
|
}
|
|
|
|
|
|
|
|
// Serialize and display the signature.
|
2015-04-02 09:57:52 +02:00
|
|
|
fmt.Printf("Serialized Signature: %x\n", signature.Serialize())
|
2014-08-10 22:13:11 +02:00
|
|
|
|
|
|
|
// Verify the signature for the message using the public key.
|
|
|
|
verified := signature.Verify(messageHash, pubKey)
|
|
|
|
fmt.Printf("Signature Verified? %v\n", verified)
|
|
|
|
|
|
|
|
// Output:
|
2015-04-02 09:57:52 +02:00
|
|
|
// Serialized Signature: 304402201008e236fa8cd0f25df4482dddbb622e8a8b26ef0ba731719458de3ccd93805b022032f8ebe514ba5f672466eba334639282616bb3c2f0ab09998037513d1f9e3d6d
|
2014-08-10 22:13:11 +02:00
|
|
|
// Signature Verified? true
|
|
|
|
}
|
|
|
|
|
|
|
|
// This example demonstrates verifying a secp256k1 signature against a public
|
|
|
|
// key that is first parsed from raw bytes. The signature is also parsed from
|
|
|
|
// raw bytes.
|
|
|
|
func Example_verifySignature() {
|
|
|
|
// Decode hex-encoded serialized public key.
|
|
|
|
pubKeyBytes, err := hex.DecodeString("02a673638cb9587cb68ea08dbef685c" +
|
|
|
|
"6f2d2a751a8b3c6f2a7e9a4999e6e4bfaf5")
|
|
|
|
if err != nil {
|
|
|
|
fmt.Println(err)
|
|
|
|
return
|
|
|
|
}
|
|
|
|
pubKey, err := btcec.ParsePubKey(pubKeyBytes, btcec.S256())
|
|
|
|
if err != nil {
|
|
|
|
fmt.Println(err)
|
|
|
|
return
|
|
|
|
}
|
|
|
|
|
|
|
|
// Decode hex-encoded serialized signature.
|
|
|
|
sigBytes, err := hex.DecodeString("30450220090ebfb3690a0ff115bb1b38b" +
|
|
|
|
"8b323a667b7653454f1bccb06d4bbdca42c2079022100ec95778b51e707" +
|
|
|
|
"1cb1205f8bde9af6592fc978b0452dafe599481c46d6b2e479")
|
2015-04-02 09:57:52 +02:00
|
|
|
|
2014-08-10 22:13:11 +02:00
|
|
|
if err != nil {
|
|
|
|
fmt.Println(err)
|
|
|
|
return
|
|
|
|
}
|
|
|
|
signature, err := btcec.ParseSignature(sigBytes, btcec.S256())
|
|
|
|
if err != nil {
|
|
|
|
fmt.Println(err)
|
|
|
|
return
|
|
|
|
}
|
|
|
|
|
|
|
|
// Verify the signature for the message using the public key.
|
|
|
|
message := "test message"
|
2015-02-05 21:57:50 +01:00
|
|
|
messageHash := wire.DoubleSha256([]byte(message))
|
2014-08-10 22:13:11 +02:00
|
|
|
verified := signature.Verify(messageHash, pubKey)
|
|
|
|
fmt.Println("Signature Verified?", verified)
|
|
|
|
|
|
|
|
// Output:
|
|
|
|
// Signature Verified? true
|
|
|
|
}
|