Remove unsafe code from base58 impl (#1992)

This commit is contained in:
hashmap 2018-11-17 18:23:54 +01:00 committed by Ignotus Peverell
parent f8787514f9
commit bc36de8187

View file

@ -30,7 +30,7 @@
use digest::Digest; use digest::Digest;
use sha2::Sha256; use sha2::Sha256;
use std::{error, fmt, mem, str}; use std::{error, fmt, str};
use byteorder::{ByteOrder, LittleEndian}; use byteorder::{ByteOrder, LittleEndian};
@ -47,12 +47,8 @@ fn sha256d_hash(data: &[u8]) -> [u8; 32] {
} }
#[inline] #[inline]
pub fn into_le_low_u32(data: [u8; 32]) -> u32 { pub fn into_le_low_u32(data: &[u8; 32]) -> u32 {
let mut ret: [u64; 4] = unsafe { mem::transmute(data) }; LittleEndian::read_u64(&data[0..8]) as u32
for x in (&mut ret).iter_mut() {
*x = x.to_le();
}
ret[0] as u32
} }
/// An error that might occur during base58 decoding /// An error that might occur during base58 decoding
@ -285,7 +281,7 @@ pub fn from_check(data: &str) -> Result<Vec<u8>, Error> {
} }
let ck_start = ret.len() - 4; let ck_start = ret.len() - 4;
let expected = sha256d_hash(&ret[..ck_start]); let expected = sha256d_hash(&ret[..ck_start]);
let expected = into_le_low_u32(expected); let expected = into_le_low_u32(&expected);
let actual = LittleEndian::read_u32(&ret[ck_start..(ck_start + 4)]); let actual = LittleEndian::read_u32(&ret[ck_start..(ck_start + 4)]);
if expected != actual { if expected != actual {
return Err(Error::BadChecksum(expected, actual)); return Err(Error::BadChecksum(expected, actual));