bls_extensions.rs 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  1. use bls12_381 as bls;
  2. use std::io;
  3. use crate::error::{Error, Result};
  4. use crate::serial::{Decodable, Encodable, ReadExt, WriteExt};
  5. macro_rules! from_slice {
  6. ($data:expr, $len:literal) => {{
  7. let mut array = [0; $len];
  8. // panics if not enough data
  9. let bytes = &$data[..array.len()];
  10. array.copy_from_slice(bytes);
  11. array
  12. }};
  13. }
  14. pub trait BlsStringConversion {
  15. fn to_string(&self) -> String;
  16. fn from_string(object: &str) -> Self;
  17. }
  18. impl BlsStringConversion for bls::Scalar {
  19. fn to_string(&self) -> String {
  20. let mut bytes = self.to_bytes();
  21. bytes.reverse();
  22. hex::encode(bytes)
  23. }
  24. fn from_string(object: &str) -> Self {
  25. let mut bytes = from_slice!(&hex::decode(object).unwrap(), 32);
  26. bytes.reverse();
  27. bls::Scalar::from_bytes(&bytes).unwrap()
  28. }
  29. }
  30. macro_rules! serialization_bls {
  31. ($type:ty, $to_x:ident, $from_x:ident, $size:literal) => {
  32. impl Encodable for $type {
  33. fn encode<S: io::Write>(&self, mut s: S) -> Result<usize> {
  34. let data = self.$to_x();
  35. assert_eq!(data.len(), $size);
  36. s.write_slice(&data)?;
  37. Ok(data.len())
  38. }
  39. }
  40. impl Decodable for $type {
  41. fn decode<D: io::Read>(mut d: D) -> Result<Self> {
  42. let mut slice = [0u8; $size];
  43. d.read_slice(&mut slice)?;
  44. let result = Self::$from_x(&slice);
  45. if bool::from(result.is_none()) {
  46. return Err(Error::ParseFailed("$t conversion from slice failed"));
  47. }
  48. Ok(result.unwrap())
  49. }
  50. }
  51. };
  52. }
  53. serialization_bls!(bls::Scalar, to_bytes, from_bytes, 32);
  54. macro_rules! make_serialize_deserialize_test {
  55. ($name:ident, $type:ty, $default_func:ident) => {
  56. #[test]
  57. fn $name() {
  58. let point = <$type>::$default_func();
  59. let mut data: Vec<u8> = vec![];
  60. let result = point.encode(&mut data);
  61. assert!(result.is_ok());
  62. let point2 = <$type>::decode(&data[..]);
  63. assert!(point2.is_ok());
  64. let point2 = point2.unwrap();
  65. assert_eq!(point, point2);
  66. }
  67. };
  68. }
  69. make_serialize_deserialize_test!(serial_test_scalar, bls::Scalar, zero);