Skip to content
Snippets Groups Projects
Commit ad7ebf2b authored by Éloïs's avatar Éloïs Committed by Éloïs
Browse files

[fix] handle pubkeys with too many leading zeros

parent 0a4c67e5
No related branches found
No related tags found
1 merge request!10Elois/pubkey leading 1
...@@ -9,6 +9,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ...@@ -9,6 +9,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
## [Unreleased] - ReleaseDate ## [Unreleased] - ReleaseDate
### Fixed
- base58: handle base58 string with too many leading zeros (Especially the string `11111111111111111111111111111111111111111111`).
## [0.12.0] - 2020-03-02 ## [0.12.0] - 2020-03-02
### Fixed ### Fixed
......
...@@ -58,17 +58,20 @@ pub fn str_base58_to_32bytes(base58_data: &str) -> Result<([u8; 32], usize), Bas ...@@ -58,17 +58,20 @@ pub fn str_base58_to_32bytes(base58_data: &str) -> Result<([u8; 32], usize), Bas
} }
/// Create a Base58 string from a slice of bytes. /// Create a Base58 string from a slice of bytes.
pub fn bytes_to_str_base58(bytes: &[u8], mut count_leading_1: usize) -> String { pub fn bytes_to_str_base58(bytes: &[u8], count_leading_1: usize) -> String {
let mut str_base58 = String::new(); let mut str_base58 = String::new();
let bytes = &bytes[count_leading_1..]; let mut remaining_leading_1 = count_leading_1;
while remaining_leading_1 > 0 {
remaining_leading_1 -= 1;
str_base58.push('1');
}
if count_leading_1 >= 32 {
return str_base58;
}
let bytes = if count_leading_1 == 0 && !bytes.is_empty() && bytes[0] == 0 { let bytes = if count_leading_1 == 0 && !bytes.is_empty() && bytes[0] == 0 {
&bytes[1..] &bytes[1..]
} else { } else {
while count_leading_1 > 0 {
count_leading_1 -= 1;
str_base58.push('1');
}
&bytes[count_leading_1..] &bytes[count_leading_1..]
}; };
...@@ -82,8 +85,34 @@ mod tests { ...@@ -82,8 +85,34 @@ mod tests {
use super::*; use super::*;
#[test]
fn test_base_58_str_with_only_1() -> Result<(), BaseConvertionError> {
let base58str = "11111111111111111111111111111111111111111111";
let (bytes, count_leading_1) = str_base58_to_32bytes(base58str)?;
println!("{:?}", bytes);
assert_eq!(base58str, &bytes_to_str_base58(&bytes[..], count_leading_1),);
Ok(())
}
#[test] #[test]
fn test_base_58_str_with_leading_1() -> Result<(), BaseConvertionError> { fn test_base_58_str_with_leading_1() -> Result<(), BaseConvertionError> {
let base58str = "13fn6X3XWVgshHTgS8beZMo9XiyScx6MB6yPsBB5ZBia";
let (bytes, count_leading_1) = str_base58_to_32bytes(base58str)?;
println!("{:?}", bytes);
assert_eq!(base58str, &bytes_to_str_base58(&bytes[..], count_leading_1),);
Ok(())
}
#[test]
fn test_other_base_58_str_with_leading_1() -> Result<(), BaseConvertionError> {
let base58str = "1V27SH9TiVEDs8TWFPydpRKxhvZari7wjGwQnPxMnkr"; let base58str = "1V27SH9TiVEDs8TWFPydpRKxhvZari7wjGwQnPxMnkr";
let (bytes, count_leading_1) = str_base58_to_32bytes(base58str)?; let (bytes, count_leading_1) = str_base58_to_32bytes(base58str)?;
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment