1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
// Copyright 2018 The Exonum Team
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//   http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

//! A set of helpers for testing.

use bitcoin::blockdata::transaction::Transaction;
use bitcoin::network::serialize;
use rand::{self, Rng};
use secp256k1::{PublicKey, Secp256k1, SecretKey};

/// Computes a secret key and a corresponding public key using a
/// given pseudo-random number generator.
pub fn secp_gen_keypair_with_rng<R: Rng>(rng: &mut R) -> (PublicKey, SecretKey) {
    let context = Secp256k1::new();
    let sk = SecretKey::new(&context, rng);
    let pk = PublicKey::from_secret_key(&context, &sk).unwrap();
    (pk, sk)
}

/// Generates a secret key and a corresponding public key using a cryptographically
/// secure pseudo-random number generator.
pub fn secp_gen_keypair() -> (PublicKey, SecretKey) {
    let mut rng = rand::thread_rng();
    secp_gen_keypair_with_rng(&mut rng)
}

/// Decodes a Bitcoin transaction from the given hex string.
///
/// # Panics
///
/// - If the given hex string can't be decoded as a Bitcoin transaction.
pub fn btc_tx_from_hex(s: &str) -> Transaction {
    let bytes = ::bitcoin::util::misc::hex_bytes(s).unwrap();
    serialize::deserialize(&bytes).unwrap()
}