U
    g=                     @   sV  d Z ddlmZmZmZmZ ddl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 ddlmZ dd	lmZ dd
lmZ ddlmZmZmZmZ ddlmZmZm Z m!Z!m"Z" ddl#m$Z$ ddl%m&Z& ddl'm(Z( dgZ)ddddddZ*dddddZ+e,dddZ-e&e(dd d!Z.e&eej/d"d#d$Z0ed%d&d'Z1e&ee,d"d(dZ2d)S )*zu
ETSI TS 119 102-2 reporting functionality.

.. warning::
    This feature is incubating and subject to API changes.
    )AnyDictOptionalcast)tsp)hashes)ValidationObjectValidationObjectType)XmlDateTime)ts_11910202xades)xmldsig_core)
cades_asn1)
AdESStatus)NonexistentAttributeErrorfind_cms_attributefind_unique_cms_attributeget_pyca_cryptography_hash)AdESBasicValidationResultAdESLTAValidationResultAdESWithTimeValidationResult$derive_validation_object_binary_data#derive_validation_object_identifier)get_signing_cert_attr)EmbeddedPdfSignature)PdfSignatureStatusgenerate_reportz&http://www.w3.org/2000/09/xmldsig#sha1z'http://www.w3.org/2001/04/xmlenc#sha256z-http://www.w3.org/2001/04/xmldsig-more#sha224z-http://www.w3.org/2001/04/xmldsig-more#sha384z'http://www.w3.org/2001/04/xmlenc#sha512)sha1sha256sha224sha384sha512z!http://uri.etsi.org/19102/v1.2.1#z!http://uri.etsi.org/01903/v1.3.2#z"http://www.w3.org/2000/09/xmldsig#z http://www.w3.org/2001/XMLSchema)ZvrZXAdESZdsxsalgoc                 C   s4   z
t |  W S  tk
r.   td|  dY nX d S )Nz3No XML signature syntax available for digest algo '')DIGEST_ALGO_URISKeyErrorNotImplementedErrorr#    r)   H/tmp/pip-unpacked-wheel-owvgwkas/pyhanko/sign/validation/report/tools.py_digest_algo_uri6   s    

r+   )embedded_sig
api_statusc              	   C   s  | j d }i }| jp$|jr"|jjnd }|rBtjdt|d|d< t|}|d k	rg }|d D ]d}t	|t
jrtd}n|d d j}|tjtt|t|d	 j|d
 r|d
  nd d q^tjdt|d|d< z0t|d}	|	d }
tjdd|
j d|d< W n tk
r    Y nX |jrFtjdt|jjd|d< zLt|dd }|j}t	|tjr|d }
tj dd|
j d}||d< W n tk
r   Y nX d| j!krtj"dt#| j!d fd|d< |j$r|j$}g }|j%D ]F}tj&j'}|j(j dd)dd |j*D  }|tj+||d  q|j,p>d!D ]F}tj&j-}|j(j d"d)d#d |j*D  }|tj+||d  q@tj.dt|d$|d%< |jrtjd&t|jjd|d'< z"t|d(}tj/d|jd)|d(< W n tk
r   Y nX d*| j!kr$tj0dt#| j!d* d+|d,< d-| j!krLtj1dt#| j!d- d.|d/< d0| j!krttj2dt#| j!d0 d1|d2< d3| j!krtj3dt#| j!d3 d4d  d5|d6< td7d | j!d8 D |d9< d:| j!krtj4t#| j!d: d4d  d;|d<< tj5f |S )=Nsigned_attrsT)signedtimeZsigning_timecertsr   Zhash_algorithm	algorithmZ	cert_hashZissuer_serial)digest_methoddigest_valueZx509_issuer_serial)r/   cert_idZsigning_certificateZcommitment_type_indicationZcommitment_type_idzurn:oid:)r/   Zcommitment_type_identifier)r/   Ztime_stamp_valueZall_data_objects_time_stampZsignature_policy_identifierr   sig_policy_id)r/   r6   Zsig_policy_identifierz	/Location)r/   Zaddress_stringZsignature_production_placez: z; c                 s   s   | ]}t |jV  qd S Nstrnative.0vr)   r)   r*   	<genexpr>   s     z#_summarise_attrs.<locals>.<genexpr>)Zendorsement_typeroler)    c                 s   s   | ]}t |jV  qd S r7   r8   r;   r)   r)   r*   r>      s     )r/   Zrole_detailsZsigner_roleFZsignature_time_stampmessage_digest)r/   digestz/Reason)r/   Zreason_elementreasonz/Name)r/   Zname_elementnamez/ContactInfo)r/   Zcontact_info_elementZcontact_infoz
/SubFilter   )r/   Zsub_filter_elementZ
sub_filterc                 s   s   | ]}t |V  qd S r7   )int)r<   xr)   r)   r*   r>      s    z
/ByteRangeZ
byte_rangez/Filter)filterrH   )6signer_infoZself_reported_timestampZtimestamp_validity	timestampr   ZSASigningTimeTyper
   from_datetimer   
isinstancer   Z	ESSCertIDr:   appendZSACertIDTyper   DigestMethodr+   DigestValuedumpZSACertIDListTypetupler   ZSACommitmentTypeIndicationTypeZdottedr   Zcontent_timestamp_validityZSATimestampTyper   Zchosenr   ZSignaturePolicyIdZSASigPolicyIdentifierTypeZ
sig_objectZSASignatureProductionPlaceTyper9   cades_signer_attrsZclaimed_attrsZ"SAOneSignerRoleTypeEndorsementTypeZCLAIMEDZ	attr_typejoinZattr_valuesZSAOneSignerRoleTypeZcertified_attrsZ	CERTIFIEDZSASignerRoleTypeZSAMessageDigestTypeZSAReasonTypeZ
SANameTypeZSAContactInfoTypeZSASubFilterTypeZSAFilterTypeZSignatureAttributesType)r,   r-   r.   kwargsZclaimed_timeZsigning_cert_attrZcert_ids_xmlr5   Z	hash_algoZcommitment_typeoidZsig_policy_identZactual_policy_identZ	ident_xmlrR   ZrolesZclaimed_attrZ	role_typeZstringifiedZ	cert_attrrA   r)   r)   r*   _summarise_attrs?   s*   


 
  


 

" "  

   




rV   )r,   statusreturnc                 C   s  t t|j}t|j}t|}|| jd 	  |
 }tjtt|jt|d}tjt| jd j|ddd}t|trd}nt|trd}nd}tjd	tjd
tjdi|jj }	|j}
|
d k	std }t|trtj t!"|j#dd}t$t%j&|j'd}tj(|tj)t!"|
|dtj*tjtt|jt| + ddt,| |tj-tj.t/| fddtj0d| dtj1|	d|jj2 fdd}|S )Nr.   )r3   r4   	signatureF)Zsignature_valuedigest_alg_and_valueZ	hash_onlyZdoc_hash_onlyZLTAZLTVMZBasicz+urn:etsi:019102:mainindication:total-passedz+urn:etsi:019102:mainindication:total-failedz,urn:etsi:019102:mainindication:indeterminatez"urn:etsi:019102:poetype:validation)ZpoetimeZtype_of_proof)object_typevalue)validation_timebest_signature_time)rZ   )Zvoreference)Zsigner_certificatez"urn:etsi:019102:validationprocess:)Zsignature_validation_process_idzurn:etsi:019102:subindication:)Zmain_indicationZsub_indication)Zsignature_identifierZvalidation_time_infoZsigners_documentZsignature_attributesZsigner_informationZsignature_validation_processZsignature_validation_status)3r   r   r-   r   Zmd_algorithmr   ZHashupdaterI   rP   finalizer   ZDigestAlgAndValueTyper   rN   r+   rO   r   ZSignatureIdentifierTypeZSignatureValuer:   rL   r   r   r   ZPASSEDZFAILEDZINDETERMINATEZades_subindicrW   r]   AssertionErrorZPOETyper
   rK   r^   r   r	   CERTIFICATEZsigning_certSignatureValidationReportTypeZValidationTimeInfoTypeZSignersDocumentTypeZcompute_digestrV   ZSignerInformationTypeZVOReferenceTyper   ZSignatureValidationProcessTypeZValidationStatusTypeZstandard_name)r,   rW   r-   Zmd_specZmdZdtbsr_digestZdtbsr_digest_infoZsig_idprocessZades_main_indicr]   Zbest_sig_timeZsigner_cert_voZsingle_reportr)   r)   r*   _generate_report  s    




   


&re   )voc                 C   s2   t | }tjt| | j |r*tj|dnd dS )N)base64)idr[   Z validation_object_representation)r   r   r	   r   r[   ZurnZ"ValidationObjectRepresentationType)rf   Zbin_datar)   r)   r*   _package_validation_objectd  s    ri   c                 C   sf   t jt| |ft tdd |jD d}ddlm} ddlm	} |dd}||d	j
|td
}|S )a.  
    Generate signature validation report in XML format according to
    ETSI TS 119 102-2.

    :param embedded_sig:
        PDF signature to report on.
    :param status:
        AdES validation result to turn into a report.
    :return:
        A string representation of the validation report.
    c                 s   s   | ]}t |V  qd S r7   )ri   )r<   rf   r)   r)   r*   r>     s   z"generate_report.<locals>.<genexpr>)Zsignature_validation_reportZsignature_validation_objectsr   )XmlSerializer)SerializerConfigz  )indent)config)Zns_map)r   ZValidationReportre   ZValidationObjectListTyperQ   Zvalidation_objectsZ$xsdata.formats.dataclass.serializersrj   Z+xsdata.formats.dataclass.serializers.configrk   render
NAMESPACES)r,   rW   reportrj   rk   rm   Zserr)   r)   r*   r   r  s    
	
N)3__doc__typingr   r   r   r   Z
asn1cryptor   Zcryptography.hazmat.primitivesr   Zpyhanko_certvalidator.ltv.poer   r	   Zxsdata.models.datatyper
   Zpyhanko.generated.etsir   r   Zpyhanko.generated.w3cr   Zpyhanko.sign.adesr   Zpyhanko.sign.ades.reportr   Zpyhanko.sign.generalr   r   r   r   Zpyhanko.sign.validation.adesr   r   r   r   r   Z#pyhanko.sign.validation.generic_cmsr   Z$pyhanko.sign.validation.pdf_embeddedr   Zpyhanko.sign.validation.statusr   __all__r&   ro   r9   r+   rV   rc   re   ri   r   r)   r)   r)   r*   <module>   sP   	
  N Y 