Support external eth_sign (#5481)
* Display a QR for eth_sign requests. * Support raw confirmation of eth_sign * Fix ethkey issue on nightly. * Fixing test. * Fixing test.
This commit is contained in:
@@ -57,8 +57,8 @@ mod tests {
|
||||
#[test]
|
||||
fn test_brain() {
|
||||
let words = "this is sparta!".to_owned();
|
||||
let first_keypair = Brain(words.clone()).generate().unwrap();
|
||||
let second_keypair = Brain(words.clone()).generate().unwrap();
|
||||
let first_keypair = Brain::new(words.clone()).generate().unwrap();
|
||||
let second_keypair = Brain::new(words.clone()).generate().unwrap();
|
||||
assert_eq!(first_keypair.secret(), second_keypair.secret());
|
||||
}
|
||||
}
|
||||
|
||||
@@ -25,6 +25,7 @@ use rustc_serialize::hex::{ToHex, FromHex};
|
||||
use bigint::hash::{H520, H256};
|
||||
use {Secret, Public, SECP256K1, Error, Message, public_to_address, Address};
|
||||
|
||||
/// Signature encoded as RSV components
|
||||
#[repr(C)]
|
||||
pub struct Signature([u8; 65]);
|
||||
|
||||
@@ -44,8 +45,32 @@ impl Signature {
|
||||
self.0[64]
|
||||
}
|
||||
|
||||
/// Encode the signature into VRS array (V altered to be in "Electrum" notation).
|
||||
pub fn into_vrs(self) -> [u8; 65] {
|
||||
let mut vrs = [0u8; 65];
|
||||
vrs[0] = self.v() + 27;
|
||||
vrs[1..33].copy_from_slice(self.r());
|
||||
vrs[33..65].copy_from_slice(self.s());
|
||||
vrs
|
||||
}
|
||||
|
||||
/// Parse bytes as a signature encoded as VRS (V in "Electrum" notation).
|
||||
/// May return empty (invalid) signature if given data has invalid length.
|
||||
pub fn from_vrs(data: &[u8]) -> Self {
|
||||
if data.len() != 65 || data[0] < 27 {
|
||||
// fallback to empty (invalid) signature
|
||||
return Signature::default();
|
||||
}
|
||||
|
||||
let mut sig = [0u8; 65];
|
||||
sig[0..32].copy_from_slice(&data[1..33]);
|
||||
sig[32..64].copy_from_slice(&data[33..65]);
|
||||
sig[64] = data[0] - 27;
|
||||
Signature(sig)
|
||||
}
|
||||
|
||||
/// Create a signature object from the sig.
|
||||
pub fn from_rsv(r: &H256, s: &H256, v: u8) -> Signature {
|
||||
pub fn from_rsv(r: &H256, s: &H256, v: u8) -> Self {
|
||||
let mut sig = [0u8; 65];
|
||||
sig[0..32].copy_from_slice(&r);
|
||||
sig[32..64].copy_from_slice(&s);
|
||||
@@ -222,6 +247,21 @@ mod tests {
|
||||
use {Generator, Random, Message};
|
||||
use super::{sign, verify_public, verify_address, recover, Signature};
|
||||
|
||||
#[test]
|
||||
fn vrs_conversion() {
|
||||
// given
|
||||
let keypair = Random.generate().unwrap();
|
||||
let message = Message::default();
|
||||
let signature = sign(keypair.secret(), &message).unwrap();
|
||||
|
||||
// when
|
||||
let vrs = signature.clone().into_vrs();
|
||||
let from_vrs = Signature::from_vrs(&vrs);
|
||||
|
||||
// then
|
||||
assert_eq!(signature, from_vrs);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn signature_to_and_from_str() {
|
||||
let keypair = Random.generate().unwrap();
|
||||
|
||||
Reference in New Issue
Block a user