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
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
use crate::base::secp256k1::key::{ SecretKey, PublicKey };
use crate::base::secp256k1::Secp256k1;
use crate::base::curve::{entropy, scalar_multiple};
use cast_rs::hexcast;
static PRE_PRIVATE_KEY: &'static str = "00";
pub struct J256k1 {}
impl J256k1 {
pub fn build_keypair_str(seed: &String) -> Result<(String, String), &'static str> {
if let Some(seed) = entropy(seed) {
let scalar = scalar_multiple(&seed, None);
let secp = Secp256k1::new();
if let Ok(secret_key) = SecretKey::from_slice(&scalar) {
let public_key = PublicKey::from_secret_key(&secp, &secret_key).serialize().to_vec();
let scalar_public_key = scalar_multiple(public_key.as_slice(), Some(0));
if let Ok(mut secret_key_gen) = SecretKey::from_slice(&scalar_public_key) {
if let Ok(_) = secret_key_gen.add_assign(&secret_key[..]) {
//private_key
let private_key = PRE_PRIVATE_KEY.to_owned() + secret_key_gen.to_string().as_str();
if let Ok(key_str) = hexcast::decode(&private_key) {
if let Ok(secret_key) = SecretKey::from_slice(&key_str[1..]) {
let public_gen = PublicKey::from_secret_key(&secp, &secret_key).serialize().to_vec();
//public key
let public_key = hex::encode(public_gen);
//so 33bytes = 33 * 8 = 264 = 32 * 8 + 8 = 256 + 8;
return Ok( ( private_key.to_ascii_uppercase(), public_key.to_ascii_uppercase() ) );
} else {
return Err("32 bytes, within curve order");
}
} else {
return Err("hex decode private_key error.");
}
} else {
//.expect("32 bytes, within curve order");
return Err("32 bytes, within curve order");
}
} else {
//.expect("32 bytes, within curve order");
return Err("32 bytes, within curve order");
}
} else {
//.expect("32 bytes, within curve order");
return Err("32 bytes, within curve order");
}
} else {
return Err("entropy error.");
}
// let seed = entropy(seed);
// let scalar = scalar_multiple(&seed, None);
//
// let secp = Secp256k1::new();
// let secret_key = SecretKey::from_slice(&scalar).expect("32 bytes, within curve order");
// let public_key = PublicKey::from_secret_key(&secp, &secret_key).serialize().to_vec();
//
// let scalar_public_key = scalar_multiple(public_key.as_slice(), Some(0));
// let mut secret_key_gen = SecretKey::from_slice(&scalar_public_key).expect("32 bytes, within curve order");
// secret_key_gen.add_assign(&secret_key[..]).unwrap();
//
// //private_key
// let private_key = PRE_PRIVATE_KEY.to_owned() + secret_key_gen.to_string().as_str();
//
// let key_str = hex::decode(&private_key).unwrap();
// let secret_key = SecretKey::from_slice(&key_str[1..]).expect("32 bytes, within curve order");
// let public_gen = PublicKey::from_secret_key(&secp, &secret_key).serialize().to_vec();
//
// //public key
// let public_key = hex::encode(public_gen);
//
// //so 33bytes = 33 * 8 = 264 = 32 * 8 + 8 = 256 + 8;
// ( private_key.to_ascii_uppercase(), public_key.to_ascii_uppercase() )
}
}