Skip to content

Commit

Permalink
De/Serialize signatures (for slate consumption) to compressed format …
Browse files Browse the repository at this point in the history
…rather than raw (#2852)

* Serialize signatures in custom secp serializer as compact format instead of raw

* rustfmt
  • Loading branch information
yeastplume authored May 28, 2019
1 parent ee9b9fe commit bb793de
Showing 1 changed file with 17 additions and 8 deletions.
25 changes: 17 additions & 8 deletions core/src/libtx/secp_ser.rs
Original file line number Diff line number Diff line change
Expand Up @@ -55,17 +55,20 @@ pub mod pubkey_serde {
/// Serializes an Option<secp::Signature> to and from hex
pub mod option_sig_serde {
use crate::serde::{Deserialize, Deserializer, Serializer};
use crate::util::secp;
use crate::util::{from_hex, to_hex};
use crate::util::{from_hex, secp, static_secp_instance, to_hex};
use serde::de::Error;

///
pub fn serialize<S>(sig: &Option<secp::Signature>, serializer: S) -> Result<S::Ok, S::Error>
where
S: Serializer,
{
let static_secp = static_secp_instance();
let static_secp = static_secp.lock();
match sig {
Some(sig) => serializer.serialize_str(&to_hex(sig.to_raw_data().to_vec())),
Some(sig) => {
serializer.serialize_str(&to_hex(sig.serialize_compact(&static_secp).to_vec()))
}
None => serializer.serialize_none(),
}
}
Expand All @@ -75,13 +78,15 @@ pub mod option_sig_serde {
where
D: Deserializer<'de>,
{
let static_secp = static_secp_instance();
let static_secp = static_secp.lock();
Option::<String>::deserialize(deserializer).and_then(|res| match res {
Some(string) => from_hex(string.to_string())
.map_err(|err| Error::custom(err.to_string()))
.and_then(|bytes: Vec<u8>| {
let mut b = [0u8; 64];
b.copy_from_slice(&bytes[0..64]);
secp::Signature::from_raw_data(&b)
secp::Signature::from_compact(&static_secp, &b)
.map(|val| Some(val))
.map_err(|err| Error::custom(err.to_string()))
}),
Expand All @@ -94,29 +99,33 @@ pub mod option_sig_serde {
/// Serializes a secp::Signature to and from hex
pub mod sig_serde {
use crate::serde::{Deserialize, Deserializer, Serializer};
use crate::util::secp;
use crate::util::{from_hex, to_hex};
use crate::util::{from_hex, secp, static_secp_instance, to_hex};
use serde::de::Error;

///
pub fn serialize<S>(sig: &secp::Signature, serializer: S) -> Result<S::Ok, S::Error>
where
S: Serializer,
{
serializer.serialize_str(&to_hex(sig.to_raw_data().to_vec()))
let static_secp = static_secp_instance();
let static_secp = static_secp.lock();
serializer.serialize_str(&to_hex(sig.serialize_compact(&static_secp).to_vec()))
}

///
pub fn deserialize<'de, D>(deserializer: D) -> Result<secp::Signature, D::Error>
where
D: Deserializer<'de>,
{
let static_secp = static_secp_instance();
let static_secp = static_secp.lock();
String::deserialize(deserializer)
.and_then(|string| from_hex(string).map_err(|err| Error::custom(err.to_string())))
.and_then(|bytes: Vec<u8>| {
let mut b = [0u8; 64];
b.copy_from_slice(&bytes[0..64]);
secp::Signature::from_raw_data(&b).map_err(|err| Error::custom(err.to_string()))
secp::Signature::from_compact(&static_secp, &b)
.map_err(|err| Error::custom(err.to_string()))
})
}
}
Expand Down

0 comments on commit bb793de

Please sign in to comment.