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§
- Cose
Agent - COSE recipient, signer or counter-signature structure.