*** ALL TESTS PASS WITH RUSTC HEAD ***

There is still a lot of work to do modernizing the library, but the code
compiles cleanly with all unit tests passing now. Probably not much can
be done now until wizards-wallet is in better shape and the library is
actually in use.
This commit is contained in:
Andrew Poelstra 2015-05-10 14:32:26 -05:00
parent 4b1b1c4a74
commit adaf50a408
3 changed files with 11 additions and 13 deletions

View File

@ -2461,8 +2461,8 @@ impl Builder {
/// dedicated opcodes to push some small integers. /// dedicated opcodes to push some small integers.
pub fn push_int(&mut self, data: i64) { pub fn push_int(&mut self, data: i64) {
// We can special-case -1, 1-16 // We can special-case -1, 1-16
if data == -1 || (data >= 1 && data <=16) { if data == -1 || (data >= 1 && data <= 16) {
self.0.push(data as u8 + opcodes::OP_TRUE as u8); self.0.push((data + opcodes::OP_TRUE as i64) as u8);
} }
// We can also special-case zero // We can also special-case zero
else if data == 0 { else if data == 0 {

View File

@ -79,7 +79,7 @@ pub fn script_find_and_remove(haystack: &mut Vec<u8>, needle: &[u8]) -> usize {
n_deleted += 1; n_deleted += 1;
// This is ugly but prevents infinite loop in case of overflow // This is ugly but prevents infinite loop in case of overflow
let overflow = top < needle.len(); let overflow = top < needle.len();
top -= needle.len(); top = top.wrapping_sub(needle.len());
if overflow { break; } if overflow { break; }
} else { } else {
i += match opcodes::All::from_u8((*haystack)[i]).classify() { i += match opcodes::All::from_u8((*haystack)[i]).classify() {
@ -91,7 +91,7 @@ pub fn script_find_and_remove(haystack: &mut Vec<u8>, needle: &[u8]) -> usize {
}; };
} }
} }
haystack.truncate(top + needle.len()); haystack.truncate(top.wrapping_add(needle.len()));
n_deleted n_deleted
} }

View File

@ -20,7 +20,7 @@ use std::default::Default;
use std::io::Cursor; use std::io::Cursor;
use serde::{Serialize, Deserialize, Serializer, Deserializer}; use serde::{Serialize, Deserialize, Serializer, Deserializer};
use byteorder::{BigEndian, ByteOrder, ReadBytesExt}; use byteorder::{BigEndian, ByteOrder, ReadBytesExt, WriteBytesExt};
use crypto::digest::Digest; use crypto::digest::Digest;
use crypto::hmac::Hmac; use crypto::hmac::Hmac;
use crypto::mac::Mac; use crypto::mac::Mac;
@ -160,7 +160,7 @@ impl ExtendedPrivKey {
pub fn ckd_priv(&self, secp: &Secp256k1, i: ChildNumber) -> Result<ExtendedPrivKey, Error> { pub fn ckd_priv(&self, secp: &Secp256k1, i: ChildNumber) -> Result<ExtendedPrivKey, Error> {
let mut result = [0; 64]; let mut result = [0; 64];
let mut hmac = Hmac::new(Sha512::new(), &self.chain_code[..]); let mut hmac = Hmac::new(Sha512::new(), &self.chain_code[..]);
let mut be_n = [0; 32]; let mut be_n = [0; 4];
match i { match i {
ChildNumber::Normal(n) => { ChildNumber::Normal(n) => {
if n >= (1 << 31) { return Err(Error::InvalidChildNumber(i)) } if n >= (1 << 31) { return Err(Error::InvalidChildNumber(i)) }
@ -241,7 +241,7 @@ impl ExtendedPubKey {
ChildNumber::Normal(n) => { ChildNumber::Normal(n) => {
let mut hmac = Hmac::new(Sha512::new(), &self.chain_code[..]); let mut hmac = Hmac::new(Sha512::new(), &self.chain_code[..]);
hmac.input(&self.public_key[..]); hmac.input(&self.public_key[..]);
let mut be_n = [0; 32]; let mut be_n = [0; 4];
BigEndian::write_u32(&mut be_n, n); BigEndian::write_u32(&mut be_n, n);
hmac.input(&be_n); hmac.input(&be_n);
@ -295,16 +295,14 @@ impl ToBase58 for ExtendedPrivKey {
}.iter().cloned()); }.iter().cloned());
ret.push(self.depth as u8); ret.push(self.depth as u8);
ret.extend(self.parent_fingerprint[..].iter().cloned()); ret.extend(self.parent_fingerprint[..].iter().cloned());
let mut be_n = [0; 32];
match self.child_number { match self.child_number {
ChildNumber::Hardened(n) => { ChildNumber::Hardened(n) => {
BigEndian::write_u32(&mut be_n, n + (1 << 31)); ret.write_u32::<BigEndian>(n + (1 << 31)).unwrap();
} }
ChildNumber::Normal(n) => { ChildNumber::Normal(n) => {
BigEndian::write_u32(&mut be_n, n); ret.write_u32::<BigEndian>(n).unwrap();
} }
} }
ret.extend(be_n.iter().cloned());
ret.extend(self.chain_code[..].iter().cloned()); ret.extend(self.chain_code[..].iter().cloned());
ret.push(0); ret.push(0);
ret.extend(self.secret_key[..].iter().cloned()); ret.extend(self.secret_key[..].iter().cloned());
@ -351,7 +349,7 @@ impl ToBase58 for ExtendedPubKey {
}.iter().cloned()); }.iter().cloned());
ret.push(self.depth as u8); ret.push(self.depth as u8);
ret.extend(self.parent_fingerprint[..].iter().cloned()); ret.extend(self.parent_fingerprint[..].iter().cloned());
let mut be_n = [0; 32]; let mut be_n = [0; 4];
match self.child_number { match self.child_number {
ChildNumber::Hardened(n) => { ChildNumber::Hardened(n) => {
BigEndian::write_u32(&mut be_n, n + (1 << 31)); BigEndian::write_u32(&mut be_n, n + (1 << 31));
@ -449,7 +447,7 @@ mod tests {
// m // m
test_path(&secp, Bitcoin, &seed, &[], test_path(&secp, Bitcoin, &seed, &[],
"xprv9s21ZrQH143K3QTDL4LXw2F7HEK3wJUD2nW2nRk4stbPy6cq3jPPqjiChkVvvNKmPGJxWUtg6LnF5kejMRNNU3TGtRBeJgk33yuGBxrMPHi", "xprv9s21ZrQH143K3QTDL4LXw2F7HEK3wJUD2nW2nRk4stbPy6cq3jPPqjiChkVvvNKmPGJxWUtg6LnF5kejMRNNU3TGtRBeJgk33yuGBxrMPHi",
"xpub661MyMwAqRbcFtXgS5sYJABqqG9YLmC4Q1Rdap9gSE8NqtwybGhePY2gZ29ESFjqJoCu1Rupje8YtGqsefD265TMg7usUDFdp6W1EGMcet8"); "xpub661MyMwAqRbcFtXgS5sYJABqqG9YLmC4Q1Rdap9gSE8NqtwybGhePY2gZ29ESFjqJoCu1Rupje8YtGqsefD265TMg7usUDFdp6W1EGMcet8");
// m/0h // m/0h
test_path(&secp, Bitcoin, &seed, &[Hardened(0)], test_path(&secp, Bitcoin, &seed, &[Hardened(0)],