#![doc = include_str!("../README.md")]
#![no_std]
extern crate alloc;
pub mod algorithms;
pub mod authenticode;
pub mod firmware_wrapper;
pub mod pkcs7_compat;
use alloc::boxed::Box;
use rasn::prelude::*;
pub use rasn_pkix::{
AlgorithmIdentifier, Attribute, Certificate, CertificateList, CertificateSerialNumber, Name,
SubjectKeyIdentifier,
};
pub const CONTENT_INFO: &Oid = Oid::ISO_MEMBER_BODY_US_RSADSI_PKCS9_SMIME_CT_CONTENTINFO;
pub const CONTENT_TYPE: &Oid = Oid::ISO_MEMBER_BODY_US_RSADSI_PKCS9_CONTENT_TYPE;
pub const MESSAGE_DIGEST: &Oid = Oid::ISO_MEMBER_BODY_US_RSADSI_PKCS9_MESSAGE_DIGEST;
pub const SIGNING_TIME: &Oid = Oid::ISO_MEMBER_BODY_US_RSADSI_PKCS9_SIGNING_TIME;
pub const COUNTER_SIGNATURE: &Oid = Oid::ISO_MEMBER_BODY_US_RSADSI_PKCS9_COUNTER_SIGNATURE;
pub const CONTENT_DATA: &Oid = Oid::ISO_MEMBER_BODY_US_RSADSI_PKCS7_DATA;
pub const CONTENT_SIGNED_DATA: &Oid = Oid::ISO_MEMBER_BODY_US_RSADSI_PKCS7_SIGNED_DATA;
pub const CONTENT_ENVELOPED_DATA: &Oid = Oid::ISO_MEMBER_BODY_US_RSADSI_PKCS7_ENVELOPED_DATA;
pub const CONTENT_DIGESTED_DATA: &Oid = Oid::ISO_MEMBER_BODY_US_RSADSI_PKCS7_DIGESTED_DATA;
pub const CONTENT_ENCRYPTED_DATA: &Oid = Oid::ISO_MEMBER_BODY_US_RSADSI_PKCS7_ENCRYPTED_DATA;
pub const CONTENT_AUTHENTICATED_DATA: &Oid =
Oid::ISO_MEMBER_BODY_US_RSADSI_PKCS9_SMIME_CT_AUTHENTICATED_DATA;
pub type CmsVersion = Integer;
pub type ContentType = ObjectIdentifier;
pub type DigestAlgorithmIdentifier = AlgorithmIdentifier;
pub type DigestAlgorithmIdentifiers = SetOf<DigestAlgorithmIdentifier>;
pub type SignatureAlgorithmIdentifier = AlgorithmIdentifier;
pub type ContentEncryptionAlgorithmIdentifier = AlgorithmIdentifier;
pub type KeyEncryptionAlgorithmIdentifier = AlgorithmIdentifier;
pub type KeyDerivationAlgorithmIdentifier = AlgorithmIdentifier;
pub type MessageAuthenticationCodeAlgorithm = AlgorithmIdentifier;
pub type CertificateSet = SetOf<CertificateChoices>;
pub type RevocationInfoChoices = SetOf<RevocationInfoChoice>;
pub type SignerInfos = SetOf<SignerInfo>;
pub type SignedAttributes = SetOf<Attribute>;
pub type UnsignedAttributes = SetOf<Attribute>;
pub type SignatureValue = OctetString;
pub type RecipientInfos = SetOf<RecipientInfo>;
pub type UnprotectedAttributes = SetOf<Attribute>;
pub type EncryptedContent = OctetString;
pub type EncryptedKey = OctetString;
pub type RecipientEncryptedKeys = SequenceOf<RecipientEncryptedKey>;
pub type UserKeyingMaterial = OctetString;
pub type Digest = OctetString;
pub type AuthAttributes = SetOf<Attribute>;
pub type UnauthAttributes = SetOf<Attribute>;
pub type MessageAuthenticationCode = OctetString;
pub type Signature = BitString;
#[derive(AsnType, Clone, Debug, Decode, Encode, PartialEq, Eq, PartialOrd, Ord, Hash)]
pub struct AuthEnvelopedData {
pub version: CmsVersion,
#[rasn(tag(0))]
pub originator_info: Option<OriginatorInfo>,
pub recipient_infos: RecipientInfos,
pub auth_encrypted_content_info: EncryptedContentInfo,
#[rasn(tag(1))]
pub auth_attrs: Option<AuthAttributes>,
pub mac: MessageAuthenticationCode,
#[rasn(tag(2))]
pub unauth_attrs: Option<UnauthAttributes>,
}
#[derive(AsnType, Clone, Debug, Decode, Encode, PartialEq, Eq, PartialOrd, Ord, Hash)]
pub struct ContentInfo {
pub content_type: ContentType,
#[rasn(tag(explicit(0)))]
pub content: Any,
}
#[derive(AsnType, Clone, Debug, Decode, Encode, PartialEq, Eq, PartialOrd, Ord, Hash)]
pub struct SignedData {
pub version: CmsVersion,
pub digest_algorithms: DigestAlgorithmIdentifiers,
pub encap_content_info: EncapsulatedContentInfo,
#[rasn(tag(0))]
pub certificates: Option<CertificateSet>,
#[rasn(tag(1))]
pub crls: Option<RevocationInfoChoices>,
pub signer_infos: SignerInfos,
}
#[derive(AsnType, Clone, Debug, Decode, Encode, PartialEq, Eq, PartialOrd, Ord, Hash)]
pub struct EnvelopedData {
pub version: CmsVersion,
#[rasn(tag(0))]
pub originator_info: Option<OriginatorInfo>,
pub recipient_infos: RecipientInfos,
pub encrypted_content_info: EncryptedContentInfo,
#[rasn(tag(1))]
pub unprotected_attrs: Option<UnprotectedAttributes>,
}
#[derive(AsnType, Clone, Debug, Decode, Encode, PartialEq, Eq, PartialOrd, Ord, Hash)]
pub struct DigestedData {
pub version: CmsVersion,
pub digest_algorithm: DigestAlgorithmIdentifier,
pub encap_content_info: EncapsulatedContentInfo,
pub digest: Digest,
}
#[derive(AsnType, Clone, Debug, Decode, Encode, PartialEq, Eq, PartialOrd, Ord, Hash)]
pub struct EncryptedData {
pub version: CmsVersion,
pub encrypted_content_info: EncryptedContentInfo,
#[rasn(tag(1))]
pub unprotected_attrs: Option<UnprotectedAttributes>,
}
#[derive(AsnType, Clone, Debug, Decode, Encode, PartialEq, Eq, PartialOrd, Ord, Hash)]
pub struct AuthenticatedData {
pub version: CmsVersion,
#[rasn(tag(0))]
pub originator_info: Option<OriginatorInfo>,
pub recipient_infos: RecipientInfos,
pub mac_algorithm: MessageAuthenticationCodeAlgorithm,
#[rasn(tag(1))]
pub digest_algorithm: Option<DigestAlgorithmIdentifier>,
pub encap_content_info: EncapsulatedContentInfo,
#[rasn(tag(2))]
pub auth_attrs: Option<AuthAttributes>,
pub mac: MessageAuthenticationCode,
#[rasn(tag(3))]
pub unauth_attrs: Option<UnauthAttributes>,
}
#[derive(AsnType, Clone, Debug, Decode, Encode, PartialEq, Eq, PartialOrd, Ord, Hash)]
#[rasn(choice)]
pub enum CertificateChoices {
Certificate(Box<Certificate>),
#[rasn(tag(0))]
ExtendedCertificate(Box<ExtendedCertificate>),
#[rasn(tag(2))]
V2AttributeCertificate(Box<rasn_pkix::attribute_certificate::AttributeCertificate>),
#[rasn(tag(3))]
Other(OtherCertificateFormat),
}
#[derive(AsnType, Clone, Debug, Decode, Encode, PartialEq, Eq, PartialOrd, Ord, Hash)]
pub struct OtherCertificateFormat {
pub other_cert_format: ObjectIdentifier,
pub other_cert: Any,
}
#[derive(AsnType, Clone, Debug, Decode, Encode, PartialEq, Eq, PartialOrd, Ord, Hash)]
#[rasn(choice)]
pub enum RevocationInfoChoice {
Crl(CertificateList),
#[rasn(tag(1))]
Other(OtherRevocationInfoFormat),
}
#[derive(AsnType, Clone, Debug, Decode, Encode, PartialEq, Eq, PartialOrd, Ord, Hash)]
pub struct OtherRevocationInfoFormat {
pub other_rev_info_format: ObjectIdentifier,
pub other_rev_info: Any,
}
#[derive(AsnType, Clone, Debug, Decode, Encode, PartialEq, Eq, PartialOrd, Ord, Hash)]
pub struct EncapsulatedContentInfo {
pub content_type: ContentType,
#[rasn(tag(explicit(0)))]
pub content: Option<OctetString>,
}
#[derive(AsnType, Clone, Debug, Decode, Encode, PartialEq, Eq, PartialOrd, Ord, Hash)]
pub struct SignerInfo {
pub version: CmsVersion,
pub sid: SignerIdentifier,
pub digest_algorithm: DigestAlgorithmIdentifier,
#[rasn(tag(0))]
pub signed_attrs: Option<SignedAttributes>,
pub signature_algorithm: SignatureAlgorithmIdentifier,
pub signature: SignatureValue,
#[rasn(tag(1))]
pub unsigned_attrs: Option<UnsignedAttributes>,
}
#[derive(AsnType, Clone, Debug, Decode, Encode, PartialEq, Eq, PartialOrd, Ord, Hash)]
#[rasn(choice)]
pub enum SignerIdentifier {
IssuerAndSerialNumber(IssuerAndSerialNumber),
#[rasn(tag(0))]
SubjectKeyIdentifier(SubjectKeyIdentifier),
}
#[derive(AsnType, Clone, Debug, Decode, Encode, PartialEq, Eq, PartialOrd, Ord, Hash)]
pub struct IssuerAndSerialNumber {
pub issuer: Name,
pub serial_number: CertificateSerialNumber,
}
#[derive(AsnType, Clone, Debug, Decode, Encode, PartialEq, Eq, PartialOrd, Ord, Hash)]
pub struct OriginatorInfo {
#[rasn(tag(0))]
pub certs: Option<CertificateSet>,
#[rasn(tag(1))]
pub crls: Option<RevocationInfoChoices>,
}
#[derive(AsnType, Clone, Debug, Decode, Encode, PartialEq, Eq, PartialOrd, Ord, Hash)]
pub struct EncryptedContentInfo {
pub content_type: ContentType,
pub content_encryption_algorithm: ContentEncryptionAlgorithmIdentifier,
#[rasn(tag(0))]
pub encrypted_content: Option<EncryptedContent>,
}
#[derive(AsnType, Clone, Debug, Decode, Encode, PartialEq, Eq, PartialOrd, Ord, Hash)]
#[rasn(choice)]
pub enum RecipientInfo {
KeyTransRecipientInfo(KeyTransRecipientInfo),
#[rasn(tag(1))]
KeyAgreeRecipientInfo(KeyAgreeRecipientInfo),
#[rasn(tag(2))]
KekRecipientInfo(KekRecipientInfo),
#[rasn(tag(3))]
PasswordRecipientInfo(PasswordRecipientInfo),
#[rasn(tag(4))]
OtherRecipientInfo(OtherRecipientInfo),
}
#[derive(AsnType, Clone, Debug, Decode, Encode, PartialEq, Eq, PartialOrd, Ord, Hash)]
pub struct KeyTransRecipientInfo {
pub version: CmsVersion,
pub rid: RecipientIdentifier,
pub key_encryption_algorithm: KeyEncryptionAlgorithmIdentifier,
pub encrypted_key: EncryptedKey,
}
#[derive(AsnType, Clone, Debug, Decode, Encode, PartialEq, Eq, PartialOrd, Ord, Hash)]
#[rasn(choice)]
pub enum RecipientIdentifier {
IssuerAndSerialNumber(IssuerAndSerialNumber),
#[rasn(tag(0))]
SubjectKeyIdentifier(SubjectKeyIdentifier),
}
#[derive(AsnType, Clone, Debug, Decode, Encode, PartialEq, Eq, PartialOrd, Ord, Hash)]
pub struct KeyAgreeRecipientInfo {
pub version: CmsVersion,
#[rasn(tag(explicit(0)))]
pub originator: OriginatorIdentifierOrKey,
#[rasn(tag(explicit(1)))]
pub user_keying_material: Option<UserKeyingMaterial>,
pub key_encryption_algorithm: KeyEncryptionAlgorithmIdentifier,
pub recipient_encrypted_keys: RecipientEncryptedKeys,
}
#[derive(AsnType, Clone, Debug, Decode, Encode, PartialEq, Eq, PartialOrd, Ord, Hash)]
pub struct RecipientEncryptedKey {
pub key_agree_recipient_identifier: KeyAgreeRecipientIdentifier,
pub encrypted_key: EncryptedKey,
}
#[derive(AsnType, Clone, Debug, Decode, Encode, PartialEq, Eq, PartialOrd, Ord, Hash)]
#[rasn(choice)]
pub enum KeyAgreeRecipientIdentifier {
IssuerAndSerialNumber(IssuerAndSerialNumber),
#[rasn(tag(0))]
RecipientKeyIdentifier(RecipientKeyIdentifier),
}
#[derive(AsnType, Clone, Debug, Decode, Encode, PartialEq, Eq, PartialOrd, Ord, Hash)]
pub struct RecipientKeyIdentifier {
pub subject_key_identifier: SubjectKeyIdentifier,
pub date: Option<GeneralizedTime>,
pub other: Option<OtherKeyAttribute>,
}
#[derive(AsnType, Clone, Debug, Decode, Encode, PartialEq, Eq, PartialOrd, Ord, Hash)]
pub struct OtherKeyAttribute {
pub key_attr_id: ObjectIdentifier,
pub key_attr: Option<Any>,
}
#[derive(AsnType, Clone, Debug, Decode, Encode, PartialEq, Eq, PartialOrd, Ord, Hash)]
#[rasn(choice)]
pub enum OriginatorIdentifierOrKey {
IssuerAndSerialNumber(IssuerAndSerialNumber),
#[rasn(tag(0))]
SubjectKeyIdentifier(SubjectKeyIdentifier),
#[rasn(tag(1))]
OriginatorPublicKey(OriginatorPublicKey),
}
#[derive(AsnType, Clone, Debug, Decode, Encode, PartialEq, Eq, PartialOrd, Ord, Hash)]
pub struct OriginatorPublicKey {
pub algorithm: AlgorithmIdentifier,
pub public_key: BitString,
}
#[derive(AsnType, Clone, Debug, Decode, Encode, PartialEq, Eq, PartialOrd, Ord, Hash)]
pub struct KekRecipientInfo {
pub version: CmsVersion,
pub kek_id: KekIdentifier,
pub key_encryption_algorithm: KeyEncryptionAlgorithmIdentifier,
pub encrypted_key: EncryptedKey,
}
#[derive(AsnType, Clone, Debug, Decode, Encode, PartialEq, Eq, PartialOrd, Ord, Hash)]
pub struct KekIdentifier {
pub key_identifier: OctetString,
pub date: Option<GeneralizedTime>,
pub other: Option<OtherKeyAttribute>,
}
#[derive(AsnType, Clone, Debug, Decode, Encode, PartialEq, Eq, PartialOrd, Ord, Hash)]
pub struct PasswordRecipientInfo {
pub version: CmsVersion,
#[rasn(tag(0))]
pub key_derivation_algorithm: Option<KeyDerivationAlgorithmIdentifier>,
pub key_encryption_algorithm: KeyEncryptionAlgorithmIdentifier,
pub encrypted_eey: EncryptedKey,
}
#[derive(AsnType, Clone, Debug, Decode, Encode, PartialEq, Eq, PartialOrd, Ord, Hash)]
pub struct OtherRecipientInfo {
pub ori_type: ObjectIdentifier,
pub ori_value: Any,
}
#[derive(AsnType, Clone, Debug, Decode, Encode, PartialEq, Eq, PartialOrd, Ord, Hash)]
#[rasn(choice)]
pub enum ExtendedCertificateOrCertificate {
Certificate(Certificate),
#[rasn(tag(0))]
ExtendedCertificate(ExtendedCertificate),
}
#[derive(AsnType, Clone, Debug, Decode, Encode, PartialEq, Eq, PartialOrd, Ord, Hash)]
pub struct ExtendedCertificate {
pub extended_certificate_info: ExtendedCertificateInfo,
pub signature_algorithm: SignatureAlgorithmIdentifier,
pub signature: Signature,
}
#[derive(AsnType, Clone, Debug, Decode, Encode, PartialEq, Eq, PartialOrd, Ord, Hash)]
pub struct ExtendedCertificateInfo {
pub version: CmsVersion,
pub certificate: Certificate,
pub attributes: UnauthAttributes,
}