U
    dn                     @   s   d Z ddlmZ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mZ ddlmZ dd	lmZmZ d
ZG dd dZddde
dfddZdS )zSecure serializer.    )dumpsloadsregistry)bytes_to_strensure_bytesstr_to_bytes)DEFAULT_SECURITY_DIGEST)	b64decode	b64encode   )CertificateFSCertStore)
PrivateKey)get_digest_algorithmreraise_errors)SecureSerializerregister_authc                   @   sT   e Zd ZdZdddedfddZdd Zdd	 Zed
fddZ	ed
fddZ
dS )r   zSigned serializer.Njsonc                 C   s&   || _ || _|| _t|| _|| _d S N)_key_cert_cert_storer   _digest_serializer)selfkeycertZ
cert_storedigest
serializer r   A/tmp/pip-unpacked-wheel-9cz4377o/celery/security/serialization.py__init__   s
    
zSecureSerializer.__init__c              
   C   s   | j dk	st| jdk	sttdtfT tt|| jd\}}}t|}| j	|||| j 
|| j| j dW  5 Q R  S Q R X dS )z%Serialize data structure into string.NzUnable to serialize: {0!r}r   )	signaturesigner)r   AssertionErrorr   r   	Exceptionr   r   r   r   _packsignr   Zget_id)r   datacontent_typecontent_encodingbodyr   r   r    	serialize   s     
zSecureSerializer.serializec              	   C   s~   | j dk	sttdtfB | |}|d |d |d   }}}| j | ||| j W 5 Q R X tt||d |d dd	S )
z'Deserialize data structure from string.NzUnable to deserialize: {0!r}r#   r$   r,   r*   r+   T)force)	r   r%   r   r&   _unpackverifyr   r   r   )r   r)   payloadr#   r$   r,   r   r   r    deserialize*   s    

  zSecureSerializer.deserializez c                 C   s&   | dd |||||fD }t|S )Nc                 s   s   | ]}t |V  qd S r   )r   ).0sr   r   r    	<genexpr>8   s    z)SecureSerializer._pack.<locals>.<genexpr>)joinr
   )r   r,   r*   r+   r$   r#   sepfieldsr   r   r    r'   6   s    
 zSecureSerializer._packc                 C   s   t t|}||}|d | }| j| }| jd? }t|}|| }	|	| }
||	|
 }||
| d  |}||t|d t|d t|d dS )N   r   r      )r$   r#   r*   r+   r,   )	r	   r   findr   Z
get_pubkeyZkey_sizelensplitr   )r   r1   r7   Zraw_payloadZ	first_sepr$   Zsigner_certZsig_lenZsep_lenZsignature_start_positionZsignature_end_positionr#   vr   r   r    r/   >   s&    

 


zSecureSerializer._unpack)__name__
__module____qualname____doc__r   r!   r-   r2   r   r'   r/   r   r   r   r    r      s    

r   Nr   c                 C   sF   t | ot| |ot||o t|||d}tjd|j|jddd dS )zRegister security serializer.r"   authzapplication/datazutf-8)r*   r+   N)r   r   r   r   r   registerr-   r2   )r   r   storer   r   r4   r   r   r    r   [   s    

 r   )rB   Zkombu.serializationr   r   r   Zkombu.utils.encodingr   r   r   Zcelery.app.defaultsr   Zcelery.utils.serializationr	   r
   Zcertificater   r   r   r   utilsr   r   __all__r   r   r   r   r   r    <module>   s   L