Files
nym/common/nymsphinx/anonymous-replies/src/encryption_key.rs
T
Jędrzej Stuczyński 827c13b69e moved nym-gateway-probe to monorepo and updated rust-edition to 2024 (#6094)
dont build netstack in CI

additional rust 2024 fixes

fixes

removed temp.rs

first round of cleanup

removed duplicated NS types

moved gateway probe to the monorepo
2025-10-08 16:17:43 +01:00

73 lines
2.2 KiB
Rust

// Copyright 2021 - Nym Technologies SA <contact@nymtech.net>
// SPDX-License-Identifier: Apache-2.0
use nym_crypto::{
OutputSizeUser, crypto_hash,
generic_array::{GenericArray, typenum::Unsigned},
symmetric::stream_cipher::{CipherKey, KeySizeUser, generate_key},
};
use nym_sphinx_params::{ReplySurbEncryptionAlgorithm, ReplySurbKeyDigestAlgorithm};
use rand::{CryptoRng, RngCore};
use std::fmt::{self, Display, Formatter};
pub type EncryptionKeyDigest =
GenericArray<u8, <ReplySurbKeyDigestAlgorithm as OutputSizeUser>::OutputSize>;
pub type SurbEncryptionKeySize = <ReplySurbEncryptionAlgorithm as KeySizeUser>::KeySize;
#[derive(Clone, Copy, Debug)]
pub struct SurbEncryptionKey(CipherKey<ReplySurbEncryptionAlgorithm>);
#[derive(Debug)]
pub enum SurbEncryptionKeyError {
BytesOfInvalidLengthError,
}
impl Display for SurbEncryptionKeyError {
fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result {
match self {
SurbEncryptionKeyError::BytesOfInvalidLengthError => {
write!(f, "provided bytes have invalid length")
}
}
}
}
impl std::error::Error for SurbEncryptionKeyError {}
impl SurbEncryptionKey {
/// Generates fresh pseudorandom key that is going to be used by the recipient of the message
/// to encrypt payload of the reply. It is only generated when reply-SURB is attached.
pub fn new<R: RngCore + CryptoRng>(rng: &mut R) -> Self {
SurbEncryptionKey(generate_key::<ReplySurbEncryptionAlgorithm, _>(rng))
}
pub fn try_from_bytes(bytes: &[u8]) -> Result<Self, SurbEncryptionKeyError> {
if bytes.len() != SurbEncryptionKeySize::USIZE {
return Err(SurbEncryptionKeyError::BytesOfInvalidLengthError);
}
Ok(SurbEncryptionKey(GenericArray::clone_from_slice(bytes)))
}
pub fn compute_digest(&self) -> EncryptionKeyDigest {
crypto_hash::compute_digest::<ReplySurbKeyDigestAlgorithm>(&self.0)
}
pub fn to_bytes(&self) -> Vec<u8> {
self.0.to_vec()
}
pub fn as_bytes(&self) -> &[u8] {
self.0.as_ref()
}
pub fn size(&self) -> usize {
self.0.len()
}
pub fn inner(&self) -> &CipherKey<ReplySurbEncryptionAlgorithm> {
&self.0
}
}