pub mod shared_secretbox {
use rust_sodium::crypto::secretbox;
use serde::{Deserialize, Deserializer, Serialize, Serializer};
use std::fmt::{self, Debug};
use std::ops::Deref;
use std::sync::Arc;
#[derive(Clone, Eq, PartialEq)]
pub struct Key(Arc<secretbox::Key>);
impl Key {
pub fn new(inner: secretbox::Key) -> Self {
Key(Arc::new(secretbox::Key(inner.0)))
}
pub fn from_raw(data: &[u8; secretbox::KEYBYTES]) -> Self {
Key(Arc::new(secretbox::Key(*data)))
}
pub fn from_slice(data: &[u8]) -> Option<Self> {
secretbox::Key::from_slice(data).map(Self::new)
}
}
pub fn gen_key() -> Key {
Key::new(secretbox::gen_key())
}
impl Deref for Key {
type Target = secretbox::Key;
fn deref(&self) -> &Self::Target {
&*self.0
}
}
impl<'de> Deserialize<'de> for Key {
fn deserialize<D: Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
let inner = secretbox::Key::deserialize(deserializer)?;
Ok(Key::new(inner))
}
}
impl Serialize for Key {
fn serialize<S: Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
self.0.serialize(serializer)
}
}
impl Debug for Key {
fn fmt(&self, f: &mut fmt::Formatter) -> Result<(), fmt::Error> {
self.0.fmt(f)
}
}
}
pub mod shared_box {
use rust_sodium::crypto::box_;
use serde::{Deserialize, Deserializer, Serialize, Serializer};
use std::fmt::{self, Debug};
use std::ops::Deref;
use std::sync::Arc;
#[derive(Clone, Eq, PartialEq)]
pub struct SecretKey(Arc<box_::SecretKey>);
impl SecretKey {
pub fn new(inner: box_::SecretKey) -> Self {
SecretKey(Arc::new(box_::SecretKey(inner.0)))
}
pub fn from_raw(data: &[u8; box_::SECRETKEYBYTES]) -> Self {
SecretKey(Arc::new(box_::SecretKey(*data)))
}
}
pub fn gen_keypair() -> (box_::PublicKey, SecretKey) {
let (pk, sk) = box_::gen_keypair();
(pk, SecretKey::new(sk))
}
impl Deref for SecretKey {
type Target = box_::SecretKey;
fn deref(&self) -> &Self::Target {
&*self.0
}
}
impl<'de> Deserialize<'de> for SecretKey {
fn deserialize<D: Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
let inner = box_::SecretKey::deserialize(deserializer)?;
Ok(SecretKey::new(inner))
}
}
impl Serialize for SecretKey {
fn serialize<S: Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
self.0.serialize(serializer)
}
}
impl Debug for SecretKey {
fn fmt(&self, f: &mut fmt::Formatter) -> Result<(), fmt::Error> {
self.0.fmt(f)
}
}
}
pub mod shared_sign {
use rust_sodium::crypto::sign;
use serde::{Deserialize, Deserializer, Serialize, Serializer};
use std::fmt::{self, Debug};
use std::ops::Deref;
use std::sync::Arc;
#[derive(Clone, Eq, PartialEq)]
pub struct SecretKey(Arc<sign::SecretKey>);
impl SecretKey {
pub fn new(inner: sign::SecretKey) -> Self {
SecretKey(Arc::new(sign::SecretKey(inner.0)))
}
pub fn from_raw(data: &[u8; sign::SECRETKEYBYTES]) -> Self {
SecretKey(Arc::new(sign::SecretKey(*data)))
}
}
pub fn gen_keypair() -> (sign::PublicKey, SecretKey) {
let (pk, sk) = sign::gen_keypair();
(pk, SecretKey::new(sk))
}
pub fn keypair_from_seed(seed: &sign::Seed) -> (sign::PublicKey, SecretKey) {
let (pk, sk) = sign::keypair_from_seed(seed);
(pk, SecretKey::new(sk))
}
impl Deref for SecretKey {
type Target = sign::SecretKey;
fn deref(&self) -> &Self::Target {
&*self.0
}
}
impl<'de> Deserialize<'de> for SecretKey {
fn deserialize<D: Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
let inner = sign::SecretKey::deserialize(deserializer)?;
Ok(SecretKey::new(inner))
}
}
impl Serialize for SecretKey {
fn serialize<S: Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
self.0.serialize(serializer)
}
}
impl Debug for SecretKey {
fn fmt(&self, f: &mut fmt::Formatter) -> Result<(), fmt::Error> {
self.0.fmt(f)
}
}
}