pub struct Tag<const GAMMA: u8> { /* private fields */ }
Expand description
A tag is a probabilistic cryptographic structure. When constructed for a given TaggingKey
it will pass the DetectionKey::test_tag
100% of the time. For other tagging keys
it will pass the test with probability GAMMA
related to the security parameter of the system.
This system provides the following security properties:
- Correctness: Valid tags constructed for a specific tagging key will always validate when tested using the detection key
- Fuzziness: Invalid tags will produce false positives with probability p related to the security property (γ)
- Security: An adversarial server with access to the detection key is unable to distinguish false positives from true positives. (Detection Ambiguity)
Implementations§
Source§impl<const GAMMA: u8> Tag<GAMMA>
impl<const GAMMA: u8> Tag<GAMMA>
Sourcepub fn compress(&self) -> Vec<u8> ⓘ
pub fn compress(&self) -> Vec<u8> ⓘ
An optimal sized copy of the tag
Compressed u || y || ciphertext
Ciphertext is right-padded with zeros to the nearest byte
You probably want to use one of the many serde serialize
apis instead (see README)
use rand::rngs::OsRng;
use fuzzytags::RootSecret;
let mut rng = OsRng;
let secret = RootSecret::<24>::generate(&mut rng);
let tagging_key = secret.tagging_key();
// extract a detection key
let detection_key = secret.extract_detection_key(5);
// Give tagging key to a another party...
// and then they can do...
let tag = tagging_key.generate_tag(&mut rng);
let compressed_tag = tag.compress();
Sourcepub fn decompress(bytes: &[u8]) -> Option<Tag<GAMMA>>
pub fn decompress(bytes: &[u8]) -> Option<Tag<GAMMA>>
decompress an optimally encoded fuzzytag byte array, returns None if invalid
You probably want to use one of the many serde deserialize
apis instead (see README)
use fuzzytags::{RootSecret, Tag};
use rand::rngs::OsRng;
let mut rng = OsRng;
let secret = RootSecret::<24>::generate(&mut rng);
let tagging_key = secret.tagging_key();
// extract a detection key
let detection_key = secret.extract_detection_key(5);
// Give tagging key to a another party...
// and then they can do...
let tag = tagging_key.generate_tag(&mut rng);
let compressed_tag = tag.compress();
let decompressed_tag = Tag::decompress(&compressed_tag).unwrap();
assert_eq!(tag, decompressed_tag);
Trait Implementations§
Source§impl<'de, const GAMMA: u8> Deserialize<'de> for Tag<GAMMA>
impl<'de, const GAMMA: u8> Deserialize<'de> for Tag<GAMMA>
Source§fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>where
D: Deserializer<'de>,
fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>where
D: Deserializer<'de>,
Deserialize this value from the given Serde deserializer. Read more
impl<const GAMMA: u8> Eq for Tag<GAMMA>
impl<const GAMMA: u8> StructuralPartialEq for Tag<GAMMA>
Auto Trait Implementations§
impl<const GAMMA: u8> Freeze for Tag<GAMMA>
impl<const GAMMA: u8> RefUnwindSafe for Tag<GAMMA>
impl<const GAMMA: u8> Send for Tag<GAMMA>
impl<const GAMMA: u8> Sync for Tag<GAMMA>
impl<const GAMMA: u8> Unpin for Tag<GAMMA>
impl<const GAMMA: u8> UnwindSafe for Tag<GAMMA>
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Mutably borrows from an owned value. Read more