o
    vh                     @   s  d dl Z d dlmZ d dlmZmZ d dlmZmZmZ d dlm	Z
 d dlmZmZ d dlmZ dd	lmZmZmZ dd
lmZ g dZG dd dZG dd deZG dd deZG dd deZG dd deZG dd deZG dd de jZG dd de jZdS )    N)datetime)IterableOptional)algoscmscore)pdf)tspx509)hashes   )as_signing_certificate_v2get_pyca_cryptography_hashsimple_cms_attribute)TimeStamper)SignedAttributeProviderSpecUnsignedAttributeProviderSpecCMSAttributeProviderSigningTimeProviderSigningCertificateV2ProviderAdobeRevinfoProviderCMSAlgorithmProtectionProviderTSTProviderc                   @   s<   e Zd ZU dZeed< 	 d
ddZd
deej	 fddZ
d	S )r   zB
    Base class to provide asynchronous CMS attribute values.
    attribute_typeFc                    s   t )a  
        Build the attribute value asynchronously.

        :param dry_run:
            ``True`` if the signer is operating in dry-run (size estimation)
            mode.
        :return:
            An attribute value appropriate for the attribute type.
        NotImplementedErrorselfdry_run r   U/var/www/html/hyperkenya/venv/lib/python3.10/site-packages/pyhanko/sign/attributes.pybuild_attr_value(   s   
z%CMSAttributeProvider.build_attr_valuereturnc                    s,   | j |dI d H }|d urt| j|S d S )N)r   )r!   r   r   )r   r   valuer   r   r    get_attribute4   s
   z"CMSAttributeProvider.get_attributeNF)__name__
__module____qualname____doc__str__annotations__r!   r   r   CMSAttributer$   r   r   r   r    r      s   
 
r   c                   @   s@   e Zd ZU dZdZeed< dejfddZ	dde
jfd	d
ZdS )r   z
    Provide a value for the signing-certificate-v2 attribute.

    :param signing_cert:
        Certificate containing the signer's public key.
    signing_certificate_v2r   signing_certc                 C   
   || _ d S N)r.   )r   r.   r   r   r    __init__F      
z%SigningCertificateV2Provider.__init__Fr"   c                    s   t | jS r0   )r   r.   r   r   r   r    r!   I   s   
z-SigningCertificateV2Provider.build_attr_valueNr%   )r&   r'   r(   r)   r   r*   r+   r
   Certificater1   r	   SigningCertificateV2r!   r   r   r   r    r   <   s
   
 r   c                   @   s>   e Zd ZU dZdZeed< defddZdde	j
fd	d
ZdS )r   z
    Provide a value for the signing-time attribute (i.e. an otherwise
    unauthenticated timestamp).

    :param timestamp:
        Datetime object to include.
    signing_timer   	timestampc                 C   r/   r0   )r6   )r   r6   r   r   r    r1   X   r2   zSigningTimeProvider.__init__Fr"   c                    s   t dt| jiS )Nutc_time)r   Timer   UTCTimer6   r   r   r   r    r!   [   s   z$SigningTimeProvider.build_attr_valueNr%   )r&   r'   r(   r)   r   r*   r+   r   r1   r   r8   r!   r   r   r   r    r   M   s
   
 r   c                   @   sF   e Zd ZU dZdZeed< dejfddZ		dde
ej fd	d
ZdS )r   z
    Yield Adobe-style revocation information for inclusion into a CMS
    object.

    :param value:
        A (pre-formatted) RevocationInfoArchival object.
    adobe_revocation_info_archivalr   r#   c                 C   r/   r0   r#   )r   r#   r   r   r    r1   p   r2   zAdobeRevinfoProvider.__init__Fr"   c                    s   | j S r0   r;   r   r   r   r    r!   s   s   z%AdobeRevinfoProvider.build_attr_valueNr%   )r&   r'   r(   r)   r   r*   r+   asn1_pdfRevocationInfoArchivalr1   r   r!   r   r   r   r    r   e   s   
 r   c                   @   sB   e Zd ZU dZeed< dedejfddZ	dde	j
fd	d
ZdS )r   cms_algorithm_protectionr   digest_algosignature_algoc                 C   s   || _ || _d S r0   )r?   r@   )r   r?   r@   r   r   r    r1   |   s   
z'CMSAlgorithmProtectionProvider.__init__Fr"   c                    sR   d| j i}| j dkr| j}|d jdkrdtdd}tt|| jdS )N	algorithmshake256ed448shake256_leni   )rA   
parameters)digest_algorithmsignature_algorithm)	r?   r@   nativer   Integerr   CMSAlgorithmProtectionr   DigestAlgorithm)r   r   digest_algorithm_argsmechr   r   r    r!      s   

z/CMSAlgorithmProtectionProvider.build_attr_valueNr%   )r&   r'   r(   r   r*   r+   r   SignedDigestAlgorithmr1   r   rJ   r!   r   r   r   r    r   y   s   
 
r   c                	   @   s>   e Zd Z		ddedededefddZdd	ejfd
dZ	dS )r   signature_time_stamp_tokenFrF   
data_to_tstimestamper	attr_typec                 C   s"   || _ || _|| _|| _|| _d S r0   )r   rF   rQ   data	prehashed)r   rF   rP   rQ   rR   rT   r   r   r    r1      s
   
zTSTProvider.__init__r"   c                    sf   | j }| jr| j}nt|}t|}|| j | }|r'| j	|}n| j
||}|I d H S r0   )rF   rT   rS   r   r   HashupdatefinalizerQ   async_dummy_responseasync_timestamp)r   r   rF   digestmd_specmdts_coror   r   r    r!      s   

zTSTProvider.build_attr_valueN)rO   Fr%   )
r&   r'   r(   r*   bytesr   r1   r   ContentInfor!   r   r   r   r    r      s    
r   c                   @   s*   e Zd ZdZdededee fddZdS )r   z
    .. versionadded:: 0.14.0

    Interface for setting up signed attributes, independently of the
    :class:`~pyhanko.sign.signers.pdf_cms.Signer` hierarchy.
    data_digestrF   r"   c                 C      t )z
        Lazily set up signed attribute providers.

        :param data_digest:
            The digest of the data to be signed.
        :param digest_algorithm:
            The digest algorithm used.
        r   )r   r`   rF   r   r   r    signed_attr_providers   s   z1SignedAttributeProviderSpec.signed_attr_providersN)	r&   r'   r(   r)   r^   r*   r   r   rb   r   r   r   r    r      s    r   c                	   @   s0   e Zd ZdZdedejdedee	 fddZ
dS )	r   z
    .. versionadded:: 0.14.0

    Interface for setting up unsigned attributes, independently of the
    :class:`~pyhanko.sign.signers.pdf_cms.Signer` hierarchy.
    	signaturesigned_attrsrF   r"   c                 C   ra   )a>  
        Lazily set up unsigned attribute providers.

        :param signature:
            The signature computed over the signed attributes.
        :param signed_attrs:
            Signed attributes over which the signature was taken.
        :param digest_algorithm:
            The digest algorithm used.
        r   )r   rc   rd   rF   r   r   r    unsigned_attr_providers   s   z5UnsignedAttributeProviderSpec.unsigned_attr_providersN)r&   r'   r(   r)   r^   r   CMSAttributesr*   r   r   re   r   r   r   r    r      s    r   )abcr   typingr   r   
asn1cryptor   r   r   r   r<   r	   r
   cryptography.hazmat.primitivesr   generalr   r   r   
timestampsr   __all__r   r   r   r   r   r   ABCr   r   r   r   r   r    <module>   s$    