Skip to main content

PdfSignature

Struct PdfSignature 

Source
pub struct PdfSignature {
    pub byte_range: [i64; 4],
    pub contents: Vec<u8>,
    pub sub_filter: Option<String>,
    pub filter: Option<String>,
    pub sig_type: Option<String>,
    pub name: Option<String>,
    pub reason: Option<String>,
    pub location: Option<String>,
    pub contact_info: Option<String>,
    pub signing_time: Option<String>,
    pub signed_data: Option<SignedData>,
    pub contents_offset: Option<u64>,
}
Expand description

One PDF /Sig form field’s signature dictionary, fully parsed and ready to verify.

Fields§

§byte_range: [i64; 4]

/ByteRange [a b c d] — exactly four signed integers per ISO 32000-1 §12.8.1. The signed bytes are pdf[a..a+b] ‖ pdf[c..c+d]. Stored as i64 (the spec says “integer”, and Adobe-encoded files routinely overflow u32 for large PDFs — keeping i64 matches the on-wire shape).

§contents: Vec<u8>

/Contents hex-decoded — the raw CMS SignedData ContentInfo blob (DER) for adbe.pkcs7.detached / ETSI.CAdES.detached, or the raw RFC 3161 TimeStampToken for ETSI.RFC3161.

§sub_filter: Option<String>

/SubFilter name — adbe.pkcs7.detached, adbe.pkcs7.sha1, ETSI.CAdES.detached, ETSI.RFC3161, or any other handler- specific name. None only when the dict omits it (extremely non-conformant; we still surface the rest of the dict).

§filter: Option<String>

/Filter name — typically Adobe.PPKLite or Adobe.PPKMS. None when the dict omits it.

§sig_type: Option<String>

/Type name — Sig (default), DocTimeStamp, or absent.

§name: Option<String>

Optional /Name — the human-readable signer name embedded by the signing application (PDF text string).

§reason: Option<String>

Optional /Reason.

§location: Option<String>

Optional /Location.

§contact_info: Option<String>

Optional /ContactInfo.

§signing_time: Option<String>

Optional /M — signing-time, PDF date format D:YYYYMMDDHHmmSS.

§signed_data: Option<SignedData>

CMS SignedData parsed from Self::contents. Surfaced as Some only when Self::sub_filter is one of the SubFilters whose /Contents is a CMS ContentInfo blob — the round-21 reader does not parse RFC 3161 TimeStampTokens (those carry a nested CMS as well, but the outer wrapper is different and the signed message is the digest in MessageImprint, not the /ByteRange body).

§contents_offset: Option<u64>

The byte offset (in the original PDF) at which the signature dictionary’s /Contents <…> hex literal starts. Useful for diagnostics and for round-trip rewriting (replace the placeholder hex with a real signature, leaving everything else byte-stable). Stored as u64 so it can address arbitrarily large PDFs.

Implementations§

Source§

impl PdfSignature

Source

pub fn signed_message(&self, pdf: &[u8]) -> Result<Vec<u8>, PdfError>

Compute the bytes the /ByteRange entry says were signed: pdf[a..a+b] ‖ pdf[c..c+d]. Returns an error when any range falls outside the input or when the byte-range integers are negative.

Source

pub fn is_cms_detached(&self) -> bool

true when this signature’s /SubFilter names one of the CMS- based detached forms whose /Contents is a complete CMS ContentInfo blob. The verifier dispatch in crate::pubsec::verify::verify_signature applies to these.

Source

pub fn is_doc_timestamp(&self) -> bool

true when this entry is a document time-stamp signature per ISO 32000-1 §12.8.5 — i.e. the dict’s /Type is DocTimeStamp or its /SubFilter is ETSI.RFC3161. Either marker independently identifies a DocTimeStamp (the spec allows both /Type /DocTimeStamp and /SubFilter /ETSI.RFC3161 — real-world files frequently set both, but only one is required).

Trait Implementations§

Source§

impl Clone for PdfSignature

Source§

fn clone(&self) -> PdfSignature

Returns a duplicate of the value. Read more
1.0.0 (const: unstable) · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for PdfSignature

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<ST, DT> CastableFrom<ST, Initialized, Initialized> for DT
where ST: ?Sized, DT: ?Sized,

Source§

impl<ST, DT> CastableFrom<ST, Uninit, Uninit> for DT
where ST: ?Sized, DT: ?Sized,

Source§

impl<T> CloneToUninit for T
where T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T> Read<Exclusive, BecauseExclusive> for T
where T: ?Sized,

Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
Source§

impl<T> ToOwned for T
where T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
Source§

impl<V, T> VZip<V> for T
where V: MultiLane<T>,

Source§

fn vzip(self) -> V