easy_srp/
util.rs

1
2//! Various utility methods and modules
3//! 
4//! Contains modules for (de-)serializing various forms of [u8] as
5//! base 64 and vice versa.
6
7pub mod base64_u8 {
8  use base64::Engine;
9  use serde::{Serialize, Serializer};
10
11  pub fn serialize<S: Serializer>(v: &[u8], s: S) -> Result<S::Ok, S::Error> {
12    let engine = base64::engine::general_purpose::STANDARD_NO_PAD;
13    let base64 = engine.encode(v);
14    String::serialize(&base64, s)
15  }
16}
17
18pub mod base64_vec_u8 {
19  use base64::Engine;
20  use serde::{Serialize, Deserialize};
21  use serde::{Deserializer, Serializer};
22
23  pub fn serialize<S: Serializer>(v: &Vec<u8>, s: S) -> Result<S::Ok, S::Error> {
24    let engine = base64::engine::general_purpose::STANDARD_NO_PAD;
25    let base64 = engine.encode(v);
26    String::serialize(&base64, s)
27  }
28  
29  pub fn deserialize<'de, D: Deserializer<'de>>(d: D) -> Result<Vec<u8>, D::Error> {
30    let base64 = String::deserialize(d)?;
31    let engine = base64::engine::general_purpose::STANDARD_NO_PAD;
32    engine.decode(base64.as_bytes())
33      .map_err(|e| serde::de::Error::custom(e))
34  }
35}
36
37pub mod base64_opt_vec_u8 {
38  use serde::de::Visitor;
39  use serde::{Deserializer, Serializer};
40
41use super::base64_vec_u8;
42
43  pub fn serialize<S: Serializer>(v: &Option<Vec<u8>>, s: S) -> Result<S::Ok, S::Error> {
44    match v {
45        Some(v) => return base64_vec_u8::serialize(v, s),
46        None => return  s.serialize_none(),
47    };
48  }
49  
50  pub fn deserialize<'de, D: Deserializer<'de>>(d: D) -> Result<Option<Vec<u8>>, D::Error> {
51    return d.deserialize_option(OptVisitor {});
52  }
53
54  struct OptVisitor {}
55
56  impl<'de> Visitor<'de> for OptVisitor {
57    type Value = Option<Vec<u8>>;
58  
59    fn expecting(&self, formatter: &mut std::fmt::Formatter) -> std::fmt::Result {
60        return write!(formatter, "Some(base64-value) or None.");
61    }
62
63    fn visit_none<E>(self) -> Result<Self::Value, E>
64        where
65            E: serde::de::Error, {
66        return Ok(None);
67    }
68
69    fn visit_some<D>(self, deserializer: D) -> Result<Self::Value, D::Error>
70        where
71            D: Deserializer<'de>, {
72        let result = base64_vec_u8::deserialize(deserializer)?;
73        return Ok(Some(result));
74    }
75  }
76}