Module agent

Module agent 

Source
Expand description

Module to build recipients/signers for the various types of COSE messages.

This structure is also used to build counter signatures that can be present in any type of COSE message.

§Example

This example shows a cose-sign1 message with 2 counter signatures present in it, one of them is counter signed externally to the crate.

§Encoding the message

use cose::message::CoseMessage;
use cose::agent::CoseAgent;
use cose::keys;
use cose::algs;
use openssl::bn::BigNum;
use openssl::bn::BigNumContext;
use openssl::ec::EcPoint;
use openssl::ec::{EcGroup, EcKey};
use openssl::hash::MessageDigest;
use openssl::pkey::PKey;
use openssl::sign::{Signer, Verifier};
use openssl::nid::Nid;
use hex;

fn main() {
    let msg = b"This is the content.".to_vec();

    // Prepare cose-key
    let mut key = keys::CoseKey::new();
    key.bytes =
    hex::decode("A601020258246D65726961646F632E6272616E64796275636B406275636B6C616E642E6578616D706C65200121582065EDA5A12577C2BAE829437FE338701A10AAA375E1BB5B5DE108DE439C08551D2258201E52ED75701163F7F9E40DDF9F341B3DC9BA860AF7E0CA7CA7E9EECD0084D19C235820AFF907C99F9AD3AAE6C4CDF21122BCE2BD68B5283E6907154AD911840FA208CF").unwrap();
    key.decode().unwrap();

    // Prepare cose_sign1 message
    let mut sign1 = CoseMessage::new_sign();
    sign1.header.alg(algs::ES256, true, false);
    sign1.header.kid(key.kid.clone().unwrap(), true, false);
    sign1.payload(msg);

    // Add key and generate the signature without AAD
    sign1.key(&key).unwrap();
    sign1.secure_content(None).unwrap();

    // Prepare counter signature
    let mut ckey = keys::CoseKey::new();
    ckey.bytes =
    hex::decode("A60102024231312001215820BAC5B11CAD8F99F9C72B05CF4B9E26D244DC189F745228255A219A86D6A09EFF22582020138BF82DC1B6D562BE0FA54AB7804A3A64B6D72CCFED6B6FB6ED28BBFC117E23582057C92077664146E876760C9520D054AA93C3AFB04E306705DB6090308507B4D3").unwrap();
    ckey.decode().unwrap();

    let mut counter = CoseAgent::new_counter_sig();
    counter.header.alg(algs::ES256, true, false);
    counter.header.kid(ckey.kid.clone().unwrap(), true, false);

    // Add counter signature 1 key, counter sign and add to the cose-sign1 message
    counter.key(&ckey).unwrap();
    sign1.counter_sig(None, &mut counter).unwrap();
    sign1.add_counter_sig(counter).unwrap();

    // Encode cose-sign1 message
    sign1.encode(true).unwrap();
}

§Decoding the message

use cose::message::CoseMessage;
use cose::agent::CoseAgent;
use cose::keys;
use cose::algs;
use openssl::bn::BigNum;
use openssl::bn::BigNumContext;
use openssl::ec::EcPoint;
use openssl::ec::{EcGroup, EcKey};
use openssl::hash::MessageDigest;
use openssl::pkey::PKey;
use openssl::sign::{Signer, Verifier};
use openssl::nid::Nid;
use hex;

fn main() {

    // Prepare cose-key
    let mut key = keys::CoseKey::new();
    key.bytes =
    hex::decode("A601020258246D65726961646F632E6272616E64796275636B406275636B6C616E642E6578616D706C65200121582065EDA5A12577C2BAE829437FE338701A10AAA375E1BB5B5DE108DE439C08551D2258201E52ED75701163F7F9E40DDF9F341B3DC9BA860AF7E0CA7CA7E9EECD0084D19C235820AFF907C99F9AD3AAE6C4CDF21122BCE2BD68B5283E6907154AD911840FA208CF").unwrap();
    key.decode().unwrap();

    // Prepare CoseMessage with the cose-sign1 message to decode
    let mut verify = CoseMessage::new_sign();
    verify.bytes = hex::decode("d284582aa201260458246d65726961646f632e6272616e64796275636b406275636b6c616e642e6578616d706c65a1078347a2044231310126a0584043e4f6cb352d4fc0942b129e76cdf89690fe2a7a2a5d015abac74968c72b22064126ea3addec92c6ba5257be4295e631f34478f1d7a80be3ac832bd714a39cee54546869732069732074686520636f6e74656e742e58408c6d7a58caa8e23ad509ba291cb17689d61e4ad96a51b4a76d46785655df118cc4137815606d983e0bc55ab45f332aebfef85d4c50965269fc90de5651235ba1").unwrap();
    verify.init_decoder(None).unwrap();

    // Add key and decode the message
    verify.key(&key).unwrap();
    verify.decode(None, None).unwrap();

    // Counter cose-key
    let mut ckey = keys::CoseKey::new();
    ckey.bytes =
    hex::decode("A60102024231312001215820BAC5B11CAD8F99F9C72B05CF4B9E26D244DC189F745228255A219A86D6A09EFF22582020138BF82DC1B6D562BE0FA54AB7804A3A64B6D72CCFED6B6FB6ED28BBFC117E23582057C92077664146E876760C9520D054AA93C3AFB04E306705DB6090308507B4D3").unwrap();
    ckey.decode().unwrap();

    // Add counter key and verify
    verify.header.counters[0].key(&ckey).unwrap();
    verify.counters_verify(None, 0).unwrap();
}

Structs§

CoseAgent
COSE recipient, signer or counter-signature structure.