wolfcose 0.1.0

Safe Rust API for wolfSSL wolfCOSE.
#![allow(missing_docs)]

use wolfcose::{
    Algorithm, AlgorithmClass, AlgorithmUse, CoseKeyBuilder, CoseKeyView, Curve, KeyType,
    SymmetricKey,
};

#[test]
fn key_builder_and_symmetric_accessors_are_covered() {
    let symmetric = SymmetricKey::new([1u8; 16])
        .with_algorithm(Algorithm::A128GCM)
        .with_kid(b"sym");
    assert_eq!(symmetric.material(), &[1u8; 16]);
    assert_eq!(symmetric.algorithm(), Some(Algorithm::A128GCM));
    assert_eq!(symmetric.kid(), Some(&b"sym"[..]));
    let key = symmetric.into_cose_key().unwrap();
    let view = CoseKeyView::from_key(&key);
    assert_eq!(view.key_type, KeyType::SYMMETRIC);
    assert_eq!(view.curve, Curve::from_id(0));
    assert_eq!(view.symmetric_len, Some(16));

    let key = CoseKeyBuilder::new()
        .key_type(KeyType::EC2)
        .algorithm(Algorithm::ES256)
        .curve(Curve::P256)
        .kid(b"ec2")
        .has_private(false)
        .build()
        .unwrap();
    let view = CoseKeyView::from_key(&key);
    assert_eq!(view.key_type, KeyType::EC2);
    assert_eq!(view.algorithm, Algorithm::ES256);
    assert_eq!(view.curve, Curve::P256);
    assert_eq!(view.kid, b"ec2");
    assert!(!view.has_private);
}

#[test]
fn algorithm_and_key_type_metadata_cover_remaining_variants() {
    for algorithm in [
        Algorithm::ES256,
        Algorithm::ES384,
        Algorithm::ES512,
        Algorithm::EDDSA,
        Algorithm::PS256,
        Algorithm::PS384,
        Algorithm::PS512,
        Algorithm::ML_DSA_44,
        Algorithm::ML_DSA_65,
        Algorithm::ML_DSA_87,
    ] {
        assert_eq!(algorithm.class(), AlgorithmClass::Signature);
        assert!(algorithm.is_signing());
        assert_eq!(algorithm.key_bits_hint(), None);
    }

    for (algorithm, bits) in [
        (Algorithm::A192GCM, 192),
        (Algorithm::A256GCM, 256),
        (Algorithm::CHACHA20_POLY1305, 256),
        (Algorithm::AES_CCM_16_64_128, 128),
        (Algorithm::AES_CCM_16_64_256, 256),
        (Algorithm::AES_CCM_64_64_128, 128),
        (Algorithm::AES_CCM_64_64_256, 256),
        (Algorithm::AES_CCM_16_128_128, 128),
        (Algorithm::AES_CCM_16_128_256, 256),
        (Algorithm::AES_CCM_64_128_128, 128),
        (Algorithm::AES_CCM_64_128_256, 256),
    ] {
        assert!(algorithm.is_encryption());
        assert_eq!(algorithm.key_bits_hint(), Some(bits));
    }

    for (algorithm, bits) in [
        (Algorithm::HMAC384, 384),
        (Algorithm::HMAC512, 512),
        (Algorithm::AES_MAC_128_64, 128),
        (Algorithm::AES_MAC_256_64, 256),
        (Algorithm::AES_MAC_128_128, 128),
        (Algorithm::AES_MAC_256_128, 256),
    ] {
        assert!(algorithm.is_mac());
        assert_eq!(algorithm.key_bits_hint(), Some(bits));
    }

    for algorithm in [
        Algorithm::A128KW,
        Algorithm::A192KW,
        Algorithm::A256KW,
        Algorithm::DIRECT,
        Algorithm::ECDH_ES_HKDF_256,
        Algorithm::ECDH_ES_HKDF_512,
        Algorithm::ECDH_SS_HKDF_256,
        Algorithm::ECDH_SS_HKDF_512,
        Algorithm::ECDH_ES_A128KW,
        Algorithm::ECDH_ES_A192KW,
        Algorithm::ECDH_ES_A256KW,
    ] {
        assert!(algorithm.is_key_management());
    }

    assert_eq!(Algorithm::UNSET.class(), AlgorithmClass::Unknown);
    assert_eq!(Algorithm::A128GCM.iv_len_hint(), Some(12));
    assert_eq!(Algorithm::HMAC256.iv_len_hint(), None);
    assert_eq!(AlgorithmUse::Encrypt, AlgorithmUse::Encrypt);
    assert_eq!(
        KeyType::from_id(KeyType::SYMMETRIC.id()),
        KeyType::SYMMETRIC
    );
    assert_eq!(KeyType::OKP.id(), wolfcose::raw::WOLFCOSE_KTY_OKP as i32);
    assert_eq!(KeyType::EC2.id(), wolfcose::raw::WOLFCOSE_KTY_EC2 as i32);
    assert_eq!(KeyType::RSA.id(), wolfcose::raw::WOLFCOSE_KTY_RSA as i32);
    assert_eq!(Curve::from_id(Curve::P256.id()), Curve::P256);
    assert_eq!(Curve::P384.id(), wolfcose::raw::WOLFCOSE_CRV_P384 as i32);
    assert_eq!(Curve::P521.id(), wolfcose::raw::WOLFCOSE_CRV_P521 as i32);
    assert_eq!(
        Curve::ED25519.id(),
        wolfcose::raw::WOLFCOSE_CRV_ED25519 as i32
    );
    assert_eq!(Curve::ED448.id(), wolfcose::raw::WOLFCOSE_CRV_ED448 as i32);
}