bc-envelope 0.43.0

Gordian Envelope for Rust.
Documentation
#![cfg(feature = "encrypt")]

use bc_components::{DigestProvider, EncryptedMessage, Nonce, SymmetricKey};
use bc_envelope::prelude::*;
use hex_literal::hex;

mod common;
use crate::common::check_encoding::*;

fn basic_envelope() -> Envelope { Envelope::new("Hello.") }

fn known_value_envelope() -> Envelope { Envelope::new(known_values::NOTE) }

fn assertion_envelope() -> Envelope { Envelope::new_assertion("knows", "Bob") }

fn single_assertion_envelope() -> Envelope {
    Envelope::new("Alice").add_assertion("knows", "Bob")
}

fn double_assertion_envelope() -> Envelope {
    single_assertion_envelope().add_assertion("knows", "Carol")
}

fn wrapped_envelope() -> Envelope { basic_envelope().wrap() }

fn double_wrapped_envelope() -> Envelope { wrapped_envelope().wrap() }

fn symmetric_key() -> SymmetricKey {
    SymmetricKey::from_data(hex!(
        "38900719dea655e9a1bc1682aaccf0bfcd79a7239db672d39216e4acdd660dc0"
    ))
}

fn fake_nonce() -> Nonce { Nonce::from_data(hex!("4d785658f36c22fb5aed3ac0")) }

fn encrypted_test(e1: Envelope) -> EnvelopeResult<()> {
    let e2 = e1
        .encrypt_subject_opt(&symmetric_key(), Some(fake_nonce()))?
        .check_encoding()?;

    assert!(e1.is_equivalent_to(&e2));
    assert!(e1.subject().is_equivalent_to(&e2.subject()));

    let encrypted_message = e2.extract_subject::<EncryptedMessage>()?;
    assert_eq!(encrypted_message.digest(), e1.subject().digest());

    let e3 = e2.decrypt_subject(&symmetric_key())?;

    assert!(e1.is_equivalent_to(&e3));

    Ok(())
}

#[test]
fn test_encrypted() {
    encrypted_test(basic_envelope()).unwrap();
    encrypted_test(wrapped_envelope()).unwrap();
    encrypted_test(double_wrapped_envelope()).unwrap();
    encrypted_test(known_value_envelope()).unwrap();
    encrypted_test(assertion_envelope()).unwrap();
    encrypted_test(single_assertion_envelope()).unwrap();
    encrypted_test(double_assertion_envelope()).unwrap();
}