U
    c6{i)7 ã                   @  s^  U d dl mZ d dlZd dlZd dlZd dlZd dlZd dl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 ejdkr’d dlmZ n4ejd	k rºe d
¡Zddddœdd„Znd dlmZ d dl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 dlm%Z& d dlm'Z( d dlm)Z* d dlm+Z, ddddddd d!d"d#d$d%d&d'd(d)d*d+d,d-d.d/d0d1d2gZ-eej.ej/ej0ej1ej2f Z3eej4ej5ej6ej7ej8f Z9ee3e9f Z:ee;ed3e;f f Z<e(j=Z>d4e?d< e(j@ZAd4e?d< d5ZBe(jCZDd4e?d< e(jEZFd4e?d< e(jGZHd4e?d6< e(jIZJd4e?d7< G d8d „ d eKƒZLee$eLƒZMe*eLƒZNdvd9d:d;œd<d=„ZOd:d>d?œd@dA„ZPd:d>dBdCœdDdE„ZQd>d:dFœdGdH„ZRd:d9dIœdJdK„ZSG dLdM„ dMƒZTG dNd!„ d!ƒZUG dOdP„ dPƒZVedQƒdRdSœdTd.„ƒZWedUƒddPdVœdWd-„ƒZXejYG dXd#„ d#ƒƒZZedYƒG dZd"„ d"ƒƒZ[ed[ƒG d\d$„ d$ƒƒZ\G d]d„ dƒZ]G d^d(„ d(ƒZ^G d_d%„ d%ƒZ_G d`d'„ d'eKƒZ`G dad&„ d&ƒZad4d>ddbœdcd/„Zbd4dd>ddœded)„Zcd4d!d>dfœdgd,„Zddwd4d!dhdid>djœdkd+„ZeG dldm„ dmƒZfd4dnd!dbœdod2„Zgdxd4dndid!dpœdqd1„Zhd4d$d>drœdsd*„ZieiZjejeiekd[eld*dt� d4d>d$dbœdud0„ZmemZnejemekd[eld0dt� dS )yé    )ÚannotationsN)Ú	b16encode)ÚIterableÚSequence)Úpartial)ÚAnyÚCallableÚUnion)é   é   )Ú
deprecated)r
   é   ÚTÚstrÚobjectzCallable[[_T], _T])ÚmsgÚkwargsÚreturnc                 K  s   dd„ S )Nc                 S  s   | S ©N© )Úfr   r   ú2/tmp/pip-unpacked-wheel-41p89xha/OpenSSL/crypto.pyÚ<lambda>   ó    zdeprecated.<locals>.<lambda>r   )r   r   r   r   r   r      s    r   )ÚutilsÚx509)ÚdsaÚecÚed448Úed25519Úrsa)ÚStrOrBytesPath)Úbyte_string)Úexception_from_error_queue)Úffi)Úlib)Úmake_assert)Ú
path_bytesÚFILETYPE_ASN1ÚFILETYPE_PEMÚFILETYPE_TEXTÚTYPE_DSAÚTYPE_RSAÚX509ÚErrorÚPKeyÚX509ExtensionÚX509NameÚX509ReqÚ	X509StoreÚX509StoreContextÚX509StoreContextErrorÚX509StoreFlagsÚdump_certificateÚdump_certificate_requestÚdump_privatekeyÚdump_publickeyÚget_elliptic_curveÚget_elliptic_curvesÚload_certificateÚload_certificate_requestÚload_privatekeyÚload_publickey.Úintiÿÿ  ÚTYPE_DHÚTYPE_ECc                   @  s   e Zd ZdZdS )r.   z7
    An error occurred in an `OpenSSL.crypto` API.
    N)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r   r   r   r.   t   s   úbytes | Noner   )Úbufferr   c                 C  sn   | dkrt  t  ¡ ¡}t j}n2t d| ¡}t  |t| ƒ¡}|fddddœdd„}t|tj	kƒ t 
||¡}|S )zÙ
    Allocate a new OpenSSL memory BIO.

    Arrange for the garbage collector to clean it up automatically.

    :param buffer: None or some bytes to use to put into the BIO so that they
        can be read out.
    Núchar[]r   )ÚbioÚrefr   c                 S  s
   t  | ¡S r   )Ú_libÚBIO_free)rK   rL   r   r   r   Úfree�   s    z_new_mem_buf.<locals>.free)rM   ZBIO_newZ	BIO_s_memrN   Ú_ffiÚnewZBIO_new_mem_bufÚlenÚ_openssl_assertÚNULLÚgc)rI   rK   rO   Údatar   r   r   Ú_new_mem_buf~   s    	rW   Úbytes)rK   r   c                 C  s.   t  d¡}t | |¡}t  |d |¡dd… S )zO
    Copy the contents of an OpenSSL BIO object into a Python byte string.
    zchar**r   N)rP   rQ   rM   ZBIO_get_mem_datarI   )rK   Úresult_bufferZbuffer_lengthr   r   r   Ú_bio_to_string˜   s    
rZ   ÚNone)ÚboundaryÚwhenr   c                 C  s@   t |tƒstdƒ‚t| tjkƒ t | |¡}|dkr<tdƒ‚dS )aô  
    The the time value of an ASN1 time object.

    @param boundary: An ASN1_TIME pointer (or an object safely
        castable to that type) which will have its value set.
    @param when: A string representation of the desired time value.

    @raise TypeError: If C{when} is not a L{bytes} string.
    @raise ValueError: If C{when} does not represent a time in the required
        format.
    @raise RuntimeError: If the time value cannot be set for some other
        (unspecified) reason.
    zwhen must be a byte stringr   zInvalid stringN)	Ú
isinstancerX   Ú	TypeErrorrS   rP   rT   rM   ZASN1_TIME_set_stringÚ
ValueError)r\   r]   Ú
set_resultr   r   r   Ú_set_asn1_time¡   s    
rb   ©r]   r   c                 C  s2   t  ¡ }t|tjkƒ t |t j¡}t|| ƒ |S )aŒ  
    Behaves like _set_asn1_time but returns a new ASN1_TIME object.

    @param when: A string representation of the desired time value.

    @raise TypeError: If C{when} is not a L{bytes} string.
    @raise ValueError: If C{when} does not represent a time in the required
        format.
    @raise RuntimeError: If the time value cannot be set for some other
        (unspecified) reason.
    )rM   ZASN1_TIME_newrS   rP   rT   rU   ZASN1_TIME_freerb   )r]   Úretr   r   r   Ú_new_asn1_timeº   s
    
re   )Ú	timestampr   c                 C  s    t  d| ¡}t |¡dkrdS t |¡tjkr>t  t |¡¡S t  d¡}t 	| |¡ t
|d t jkƒ t  d|d ¡}t |¡}t  |¡}t |d ¡ |S dS )a]  
    Retrieve the time value of an ASN1 time object.

    @param timestamp: An ASN1_GENERALIZEDTIME* (or an object safely castable to
        that type) from which the time value will be retrieved.

    @return: The time value from C{timestamp} as a L{bytes} string in a certain
        format.  Or C{None} if the object contains no time value.
    úASN1_STRING*r   NzASN1_GENERALIZEDTIME**)rP   ÚcastrM   ÚASN1_STRING_lengthZASN1_STRING_typeZV_ASN1_GENERALIZEDTIMEÚstringÚASN1_STRING_get0_datarQ   ZASN1_TIME_to_generalizedtimerS   rT   ZASN1_GENERALIZEDTIME_free)rf   Zstring_timestampZgeneralized_timestampZstring_dataÚstring_resultr   r   r   Ú_get_asn1_timeÍ   s    
ÿ


rm   c                   @  s8   e Zd Zddœdd„Zdddœdd„Zddœd	d
„ZdS )Ú_X509NameInvalidatorr[   ©r   c                 C  s
   g | _ d S r   )Ú_names©Úselfr   r   r   Ú__init__ë   s    z_X509NameInvalidator.__init__r1   ©Únamer   c                 C  s   | j  |¡ d S r   )rp   Úappend©rr   ru   r   r   r   Úaddî   s    z_X509NameInvalidator.addc                 C  s   | j D ]}|`qd S r   )rp   Ú_namerw   r   r   r   Úclearñ   s    
z_X509NameInvalidator.clearN)rD   rE   rF   rs   rx   rz   r   r   r   r   rn   ê   s   rn   c                   @  s„   e Zd ZdZdZdZddœdd„Zddœd	d
„Zedd dœdd„ƒZ	ddddœdd„Z
ddœdd„Zddœdd„Zddœdd„ZdS )r/   zD
    A class representing an DSA or RSA public key or key pair.
    FTr[   ro   c                 C  s"   t  ¡ }t |t j¡| _d| _d S )NF)rM   ZEVP_PKEY_newrP   rU   ÚEVP_PKEY_freeÚ_pkeyÚ_initialized©rr   Úpkeyr   r   r   rs   ÿ   s    zPKey.__init__Ú_Keyc                 C  sR   ddl m}m} | jr0tt| ƒ}t t||ƒ¡S t	t| ƒ}t t||dd�¡S dS )a  
        Export as a ``cryptography`` key.

        :rtype: One of ``cryptography``'s `key interfaces`_.

        .. _key interfaces: https://cryptography.io/en/latest/hazmat/            primitives/asymmetric/rsa/#key-interfaces

        .. versionadded:: 16.1.0
        r   )Úload_der_private_keyÚload_der_public_keyN)Úpassword)
Ú,cryptography.hazmat.primitives.serializationr�   r‚   Ú_only_publicr:   r(   Útypingrh   r€   r9   )rr   r�   r‚   Úderr   r   r   Úto_cryptography_key  s    

zPKey.to_cryptography_key)Ú
crypto_keyr   c                 C  s¨   t |tjtjtjtjtjtj	t
jt
jtjtjf
ƒs:tdƒ‚ddlm}m}m}m} t |tjtjtj	t
jtjfƒr†tt| |j|j¡ƒS | |j|j|ƒ ¡}tt|ƒS dS )zø
        Construct based on a ``cryptography`` *crypto_key*.

        :param crypto_key: A ``cryptography`` key.
        :type crypto_key: One of ``cryptography``'s `key interfaces`_.

        :rtype: PKey

        .. versionadded:: 16.1.0
        zUnsupported key typer   )ÚEncodingÚNoEncryptionÚPrivateFormatÚPublicFormatN)r^   r   ÚDSAPrivateKeyÚDSAPublicKeyr   ÚEllipticCurvePrivateKeyÚEllipticCurvePublicKeyr   ÚEd25519PrivateKeyÚEd25519PublicKeyr   ÚEd448PrivateKeyÚEd448PublicKeyr    ÚRSAPrivateKeyÚRSAPublicKeyr_   r„   rŠ   r‹   rŒ   r�   r@   r(   Úpublic_bytesÚDERZSubjectPublicKeyInfoZprivate_bytesZPKCS8r?   )Úclsr‰   rŠ   r‹   rŒ   r�   r‡   r   r   r   Úfrom_cryptography_key  sL    öþûþ
 ÿþ  ÿzPKey.from_cryptography_keyrA   )ÚtypeÚbitsr   c              	   C  s6  t |tƒstdƒ‚t |tƒs$tdƒ‚|tkr¢|dkr<tdƒ‚t ¡ }t |tj	¡}t 
|tj¡ t ¡ }t |||tj¡}t|dkƒ t | j|¡}t|dkƒ nŠ|tk�r$t ¡ }t|tjkƒ t |tj¡}t ||tjdtjtjtj¡}t|dkƒ tt |¡dkƒ tt | j|¡dkƒ ntdƒ‚d| _dS )	a3  
        Generate a key pair of the given type, with the given number of bits.

        This generates a key "into" the this object.

        :param type: The key type.
        :type type: :py:data:`TYPE_RSA` or :py:data:`TYPE_DSA`
        :param bits: The number of bits.
        :type bits: :py:data:`int` ``>= 0``
        :raises TypeError: If :py:data:`type` or :py:data:`bits` isn't
            of the appropriate type.
        :raises ValueError: If the number of bits isn't an integer of
            the appropriate size.
        :return: ``None``
        ztype must be an integerzbits must be an integerr   zInvalid number of bitsé   zNo such key typeTN)r^   rA   r_   r,   r`   rM   ZBN_newrP   rU   ÚBN_freeZBN_set_wordZRSA_F4ZRSA_newZRSA_generate_key_exrT   rS   ZEVP_PKEY_assign_RSAr|   r+   ZDSA_newZDSA_freeZDSA_generate_parameters_exZDSA_generate_keyZEVP_PKEY_set1_DSAr.   r}   )rr   rœ   r�   Úexponentr    Úresultr   Úresr   r   r   Úgenerate_keyU  sB    


      ÿzPKey.generate_keyÚboolc                 C  sd   | j rtdƒ‚t |  ¡ ¡tjkr*tdƒ‚t | j¡}t 	|tj
¡}t |¡}|dkrZdS tƒ  dS )ax  
        Check the consistency of an RSA private key.

        This is the Python equivalent of OpenSSL's ``RSA_check_key``.

        :return: ``True`` if key is consistent.

        :raise OpenSSL.crypto.Error: if the key is inconsistent.

        :raise TypeError: if the key is of a type which cannot be checked.
            Only RSA keys can currently be checked.
        zpublic key onlyz'Only RSA keys can currently be checked.rž   TN)r…   r_   rM   ZEVP_PKEY_typerœ   ÚEVP_PKEY_RSAÚEVP_PKEY_get1_RSAr|   rP   rU   ÚRSA_freeZRSA_check_keyÚ_raise_current_error)rr   r    r¡   r   r   r   Úcheck�  s    
z
PKey.checkc                 C  s   t  | j¡S )zT
        Returns the type of the key

        :return: The type of the key.
        )rM   ÚEVP_PKEY_idr|   rq   r   r   r   rœ   §  s    z	PKey.typec                 C  s   t  | j¡S )zh
        Returns the number of bits of the key

        :return: The number of bits of the key.
        )rM   ZEVP_PKEY_bitsr|   rq   r   r   r   r�   ¯  s    z	PKey.bitsN)rD   rE   rF   rG   r…   r}   rs   rˆ   Úclassmethodr›   r£   r©   rœ   r�   r   r   r   r   r/   ÷   s   98c                      sš   e Zd ZdZdZdddœ‡ fdd„Zeddd	œd
d„ƒZeddd	œdd„ƒZeddd dœdd„ƒZ	dddddœdd„Z
ddœdd„Zddœdd„Z‡  ZS )Ú_EllipticCurveaZ  
    A representation of a supported elliptic curve.

    @cvar _curves: :py:obj:`None` until an attempt is made to load the curves.
        Thereafter, a :py:type:`set` containing :py:type:`_EllipticCurve`
        instances each of which represents one curve supported by the system.
    @type _curves: :py:type:`NoneType` or :py:type:`set`
    Nr   r¤   ©Úotherr   c                   s   t |tƒrtƒ  |¡S tS )z·
        Implement cooperation with the right-hand side argument of ``!=``.

        Python 3 seems to have dropped this cooperation in this very narrow
        circumstance.
        )r^   r¬   ÚsuperÚ__ne__ÚNotImplemented©rr   r®   ©Ú	__class__r   r   r°   Ä  s    
z_EllipticCurve.__ne__úset[_EllipticCurve])r%   r   c                   s>   ˆ  tjd¡}t d|¡}ˆ  ||¡ t‡ ‡fdd„|D ƒƒS )zü
        Get the curves supported by OpenSSL.

        :param lib: The OpenSSL library binding object.

        :return: A :py:type:`set` of ``cls`` instances giving the names of the
            elliptic curves the underlying library supports.
        r   zEC_builtin_curve[]c                 3  s   | ]}ˆ   ˆ|j¡V  qd S r   )Úfrom_nidÚnid)Ú.0Úc©rš   r%   r   r   Ú	<genexpr>ß  s     z7_EllipticCurve._load_elliptic_curves.<locals>.<genexpr>)ZEC_get_builtin_curvesrP   rT   rQ   Úset)rš   r%   Z
num_curvesZbuiltin_curvesr   rº   r   Ú_load_elliptic_curvesÏ  s    
z$_EllipticCurve._load_elliptic_curvesc                 C  s   | j dkr|  |¡| _ | j S )a  
        Get, cache, and return the curves supported by OpenSSL.

        :param lib: The OpenSSL library binding object.

        :return: A :py:type:`set` of ``cls`` instances giving the names of the
            elliptic curves the underlying library supports.
        N)Ú_curvesr½   rº   r   r   r   Ú_get_elliptic_curvesá  s    

z#_EllipticCurve._get_elliptic_curvesrA   )r%   r·   r   c                 C  s   | ||t  | |¡¡ d¡ƒS )aË  
        Instantiate a new :py:class:`_EllipticCurve` associated with the given
        OpenSSL NID.

        :param lib: The OpenSSL library binding object.

        :param nid: The OpenSSL NID the resulting curve object will represent.
            This must be a curve NID (and not, for example, a hash NID) or
            subsequent operations will fail in unpredictable ways.
        :type nid: :py:class:`int`

        :return: The curve object.
        Úascii)rP   rj   Ú
OBJ_nid2snÚdecode)rš   r%   r·   r   r   r   r¶   ï  s    z_EllipticCurve.from_nidr   r[   )r%   r·   ru   r   c                 C  s   || _ || _|| _dS )a‰  
        :param _lib: The :py:mod:`cryptography` binding instance used to
            interface with OpenSSL.

        :param _nid: The OpenSSL NID identifying the curve this object
            represents.
        :type _nid: :py:class:`int`

        :param name: The OpenSSL short name identifying the curve this object
            represents.
        :type name: :py:class:`unicode`
        N)rM   Ú_nidru   )rr   r%   r·   ru   r   r   r   rs      s    z_EllipticCurve.__init__ro   c                 C  s   d| j ›d�S )Nz<Curve ú>©ru   rq   r   r   r   Ú__repr__  s    z_EllipticCurve.__repr__c                 C  s   | j  | j¡}t |t j¡S )zÅ
        Create a new OpenSSL EC_KEY structure initialized to use this curve.

        The structure is automatically garbage collected when the Python object
        is garbage collected.
        )rM   ZEC_KEY_new_by_curve_namerÃ   rP   rU   ZEC_KEY_free)rr   Úkeyr   r   r   Ú
_to_EC_KEY  s    z_EllipticCurve._to_EC_KEY)rD   rE   rF   rG   r¾   r°   r«   r½   r¿   r¶   rs   rÆ   rÈ   Ú__classcell__r   r   r³   r   r¬   ¸  s   	r¬   zSget_elliptic_curves is deprecated. You should use the APIs in cryptography instead.rµ   ro   c                   C  s
   t  t¡S )a“  
    Return a set of objects representing the elliptic curves supported in the
    OpenSSL build in use.

    The curve objects have a :py:class:`unicode` ``name`` attribute by which
    they identify themselves.

    The curve objects are useful as values for the argument accepted by
    :py:meth:`Context.set_tmp_ecdh` to specify which elliptical curve should be
    used for ECDHE key exchange.
    )r¬   r¿   rM   r   r   r   r   r<     s    zRget_elliptic_curve is deprecated. You should use the APIs in cryptography instead.rt   c                 C  s,   t ƒ D ]}|j| kr|  S qtd| ƒ‚dS )aT  
    Return a single curve object selected by name.

    See :py:func:`get_elliptic_curves` for information about curve objects.

    :param name: The OpenSSL short name identifying the curve object to
        retrieve.
    :type name: :py:class:`unicode`

    If the named curve is not supported then :py:class:`ValueError` is raised.
    zunknown curve nameN)r<   ru   r`   )ru   Zcurver   r   r   r;   2  s    


c                      s¢   e Zd ZdZd ddœdd„Zddddœ‡ fd	d
„Zdddœdd„Zdddœdd„Zdddœdd„Zddœdd„Z	ddœdd„Z
ddœdd„Zddœdd„Z‡  ZS ) r1   a  
    An X.509 Distinguished Name.

    :ivar countryName: The country of the entity.
    :ivar C: Alias for  :py:attr:`countryName`.

    :ivar stateOrProvinceName: The state or province of the entity.
    :ivar ST: Alias for :py:attr:`stateOrProvinceName`.

    :ivar localityName: The locality of the entity.
    :ivar L: Alias for :py:attr:`localityName`.

    :ivar organizationName: The organization name of the entity.
    :ivar O: Alias for :py:attr:`organizationName`.

    :ivar organizationalUnitName: The organizational unit of the entity.
    :ivar OU: Alias for :py:attr:`organizationalUnitName`

    :ivar commonName: The common name of the entity.
    :ivar CN: Alias for :py:attr:`commonName`.

    :ivar emailAddress: The e-mail address of the entity.
    r[   rt   c                 C  s    t  |j¡}t |t j¡| _dS )zž
        Create a new X509Name, copying the given X509Name instance.

        :param name: The name to copy.
        :type name: :py:class:`X509Name`
        N)rM   ZX509_NAME_dupry   rP   rU   ZX509_NAME_freerw   r   r   r   rs   b  s    zX509Name.__init__r   r   )ru   Úvaluer   c           	   	     s  |  d¡rtƒ  ||¡S t|ƒtk	r<tdt|ƒjd›d�ƒ‚t t	|ƒ¡}|tj
kr|z
tƒ  W n tk
rr   Y nX tdƒ‚tt | j¡ƒD ]J}t | j|¡}t |¡}t |¡}||krŒt | j|¡}t |¡  qØqŒt|tƒrì| d¡}t | j|tj|ddd¡}|�stƒ  d S )	NÚ_z$attribute name must be string, not 'z.200ú'úNo such attributeúutf-8éÿÿÿÿr   )Ú
startswithr¯   Ú__setattr__rœ   r   r_   rD   rM   ÚOBJ_txt2nidÚ_byte_stringÚ	NID_undefr¨   r.   ÚAttributeErrorÚrangeÚX509_NAME_entry_country   ÚX509_NAME_get_entryÚX509_NAME_ENTRY_get_objectÚOBJ_obj2nidZX509_NAME_delete_entryZX509_NAME_ENTRY_freer^   ÚencodeZX509_NAME_add_entry_by_NIDZMBSTRING_UTF8)	rr   ru   rÊ   r·   ÚiÚentZent_objZent_nidÚ
add_resultr³   r   r   rÑ   l  sD    
ÿ






      ÿzX509Name.__setattr__ú
str | Nonec           	   
   C  sÎ   t  t|ƒ¡}|t jkr@z
tƒ  W n tk
r6   Y nX tdƒ‚t  | j|d¡}|dkr\dS t  	| j|¡}t  
|¡}t d¡}t  ||¡}t|dkƒ z"t |d |¡dd…  d¡}W 5 t  |d ¡ X |S )a
  
        Find attribute. An X509Name object has the following attributes:
        countryName (alias C), stateOrProvince (alias ST), locality (alias L),
        organization (alias O), organizationalUnit (alias OU), commonName
        (alias CN) and more...
        rÍ   rÏ   Núunsigned char**r   rÎ   )rM   rÒ   rÓ   rÔ   r¨   r.   rÕ   ZX509_NAME_get_index_by_NIDry   rØ   ÚX509_NAME_ENTRY_get_datarP   rQ   ZASN1_STRING_to_UTF8rS   ÚOPENSSL_freerI   rÂ   )	rr   ru   r·   Zentry_indexÚentryrV   rY   Zdata_lengthr¡   r   r   r   Ú__getattr__“  s*    



ÿzX509Name.__getattr__r¤   r­   c                 C  s"   t |tƒstS t | j|j¡dkS ©Nr   ©r^   r1   r±   rM   ZX509_NAME_cmpry   r²   r   r   r   Ú__eq__»  s    
zX509Name.__eq__c                 C  s"   t |tƒstS t | j|j¡dk S rå   ræ   r²   r   r   r   Ú__lt__Á  s    
zX509Name.__lt__ro   c                 C  sD   t  dd¡}t | j|t|ƒ¡}t|t jkƒ d t  	|¡ 
d¡¡S )z6
        String representation of an X509Name
        rJ   i   z<X509Name object '{}'>rÎ   )rP   rQ   rM   ZX509_NAME_onelinery   rR   rS   rT   Úformatrj   rÂ   )rr   rY   Zformat_resultr   r   r   rÆ   Ç  s      ÿÿzX509Name.__repr__rA   c                 C  s   t  | j¡S )a&  
        Return an integer representation of the first four bytes of the
        MD5 digest of the DER representation of the name.

        This is the Python equivalent of OpenSSL's ``X509_NAME_hash``.

        :return: The (integer) hash of this name.
        :rtype: :py:class:`int`
        )rM   ZX509_NAME_hashry   rq   r   r   r   ÚhashÕ  s    
zX509Name.hashrX   c                 C  sN   t  d¡}t | j|¡}t|dkƒ t  |d |¡dd… }t |d ¡ |S )zŽ
        Return the DER encoding of this name.

        :return: The DER encoded form of this name.
        :rtype: :py:class:`bytes`
        rà   r   N)rP   rQ   rM   Zi2d_X509_NAMEry   rS   rI   râ   )rr   rY   Zencode_resultrl   r   r   r   r‡   á  s    
zX509Name.derzlist[tuple[bytes, bytes]]c           	      C  sˆ   g }t t | j¡ƒD ]n}t | j|¡}t |¡}t |¡}t |¡}t |¡}t	 
t |¡t |¡¡dd… }| t	 |¡|f¡ q|S )z¼
        Returns the components of this name, as a sequence of 2-tuples.

        :return: The components of this name.
        :rtype: :py:class:`list` of ``name, value`` tuples.
        N)rÖ   rM   r×   ry   rØ   rÙ   rá   rÚ   rÁ   rP   rI   rk   ri   rv   rj   )	rr   r¡   rÜ   rÝ   ÚfnameZfvalr·   ru   rÊ   r   r   r   Úget_componentsð  s    



 ÿzX509Name.get_components)rD   rE   rF   rG   rs   rÑ   rä   rç   rè   rÆ   rê   r‡   rì   rÉ   r   r   r³   r   r1   H  s   
'(zZX509Extension support in pyOpenSSL is deprecated. You should use the APIs in cryptography.c                   @  s¢   e Zd ZU dZddddddddœdd	„Zed
dœdd„ƒZejdej	dej
diZded< ddœdd„Zddœdd„Zddœdd„Zddœdd„Zddœdd„ZdS )r0   zu
    An X.509 v3 certificate extension.

    .. deprecated:: 23.3.0
       Use cryptography's X509 APIs instead.
    NrX   r¤   zX509 | Noner[   )Ú	type_nameÚcriticalrÊ   ÚsubjectÚissuerr   c                 C  s¶   t  d¡}t |t jt jt jt jd¡ t |¡ |dk	rRt|tƒsJtdƒ‚|j	|_
|dk	rtt|tƒsltdƒ‚|j	|_|r€d| }t t j|||¡}|t jkr¢tƒ  t  |tj¡| _dS )aÝ  
        Initializes an X509 extension.

        :param type_name: The name of the type of extension_ to create.
        :type type_name: :py:data:`bytes`

        :param bool critical: A flag indicating whether this is a critical
            extension.

        :param value: The OpenSSL textual representation of the extension's
            value.
        :type value: :py:data:`bytes`

        :param subject: Optional X509 certificate to use as subject.
        :type subject: :py:class:`X509`

        :param issuer: Optional X509 certificate to use as issuer.
        :type issuer: :py:class:`X509`

        .. _extension: https://www.openssl.org/docs/manmaster/man5/
            x509v3_config.html#STANDARD-EXTENSIONS
        zX509V3_CTX*r   Nzissuer must be an X509 instancez subject must be an X509 instances	   critical,)rP   rQ   rM   ZX509V3_set_ctxrT   ZX509V3_set_ctx_nodbr^   r-   r_   Ú_x509Zissuer_certZsubject_certZX509V3_EXT_nconfr¨   rU   ÚX509_EXTENSION_freeÚ
_extension)rr   rí   rî   rÊ   rï   rð   ÚctxÚ	extensionr   r   r   rs     s"    




zX509Extension.__init__r   ro   c                 C  s   t  t  | j¡¡S r   )rM   rÚ   ÚX509_EXTENSION_get_objectró   rq   r   r   r   rÃ   \  s    
ÿzX509Extension._nidÚemailÚDNSÚURIztyping.ClassVar[dict[int, str]]Ú	_prefixesr   c              	   C  sÔ   t  dt | j¡¡}t  |tj¡}g }tt |¡ƒD ]”}t 	||¡}z| j
|j }W n: tk
rŽ   tƒ }t ||¡ | t|ƒ d¡¡ Y q4X t  |jjj|jjj¡d d …  d¡}| |d | ¡ q4d |¡S )NzGENERAL_NAMES*rÎ   ú:z, )rP   rh   rM   ZX509V3_EXT_d2iró   rU   ZGENERAL_NAMES_freerÖ   Zsk_GENERAL_NAME_numZsk_GENERAL_NAME_valuerú   rœ   ÚKeyErrorrW   ZGENERAL_NAME_printrv   rZ   rÂ   rI   ÚdZia5rV   ÚlengthÚjoin)rr   ÚnamesÚpartsrÜ   ru   ÚlabelrK   rÊ   r   r   r   Ú_subjectAltNameStringh  s&     
ÿ þz#X509Extension._subjectAltNameStringc                 C  sF   t j| jkr|  ¡ S tƒ }t  || jdd¡}t|dkƒ t|ƒ 	d¡S )zF
        :return: a nice text representation of the extension
        r   rÎ   )
rM   ZNID_subject_alt_namerÃ   r  rW   ZX509V3_EXT_printró   rS   rZ   rÂ   )rr   rK   Zprint_resultr   r   r   Ú__str__~  s    zX509Extension.__str__c                 C  s   t  | j¡S )zk
        Returns the critical field of this X.509 extension.

        :return: The critical field.
        )rM   ZX509_EXTENSION_get_criticalró   rq   r   r   r   Úget_critical‹  s    zX509Extension.get_criticalc                 C  s<   t  | j¡}t  |¡}t  |¡}|tjkr4t |¡S dS dS )zü
        Returns the short type name of this X.509 extension.

        The result is a byte string such as :py:const:`b"basicConstraints"`.

        :return: The short type name.
        :rtype: :py:data:`bytes`

        .. versionadded:: 0.12
        s   UNDEFN)rM   rö   ró   rÚ   rÁ   rP   rT   rj   )rr   Úobjr·   Úbufr   r   r   Úget_short_name“  s    



zX509Extension.get_short_namec                 C  s@   t  | j¡}t d|¡}t  |¡}t  |¡}t ||¡dd… S )zÍ
        Returns the data of the X509 extension, encoded as ASN.1.

        :return: The ASN.1 encoded data of this X509 extension.
        :rtype: :py:data:`bytes`

        .. versionadded:: 0.12
        rg   N)rM   ZX509_EXTENSION_get_dataró   rP   rh   rk   ri   rI   )rr   Zoctet_resultrl   Zchar_resultÚresult_lengthr   r   r   Úget_data©  s
    	

zX509Extension.get_data)NN)rD   rE   rF   rG   rs   ÚpropertyrÃ   rM   Z	GEN_EMAILZGEN_DNSZGEN_URIrú   Ú__annotations__r  r  r  r  r
  r   r   r   r   r0     s$   
  úE   ýzPCSR support in pyOpenSSL is deprecated. You should use the APIs in cryptography.c                   @  sÊ   e Zd ZdZddœdd„Zddœdd„Zedd d	œd
d„ƒZdddœdd„Zddœdd„Z	dddœdd„Z
ddœdd„Zddœdd„Zdddœdd„Zddœd d!„Zdd"dd#œd$d%„Zdd&dœd'd(„Zd)S )*r2   zŽ
    An X.509 certificate signing requests.

    .. deprecated:: 24.2.0
       Use `cryptography.x509.CertificateSigningRequest` instead.
    r[   ro   c                 C  s&   t  ¡ }t |t j¡| _|  d¡ d S rå   )rM   ZX509_REQ_newrP   rU   ÚX509_REQ_freeÚ_reqÚset_version)rr   Úreqr   r   r   rs   Å  s    zX509Req.__init__zx509.CertificateSigningRequestc                 C  s   ddl m} tt| ƒ}||ƒS )z®
        Export as a ``cryptography`` certificate signing request.

        :rtype: ``cryptography.x509.CertificateSigningRequest``

        .. versionadded:: 17.1.0
        r   )Úload_der_x509_csr)Úcryptography.x509r  Ú"_dump_certificate_request_internalr(   )rr   r  r‡   r   r   r   Úto_cryptographyË  s    
zX509Req.to_cryptography)Ú
crypto_reqr   c                 C  s6   t |tjƒstdƒ‚ddlm} | |j¡}tt	|ƒS )a  
        Construct based on a ``cryptography`` *crypto_req*.

        :param crypto_req: A ``cryptography`` X.509 certificate signing request
        :type crypto_req: ``cryptography.x509.CertificateSigningRequest``

        :rtype: X509Req

        .. versionadded:: 17.1.0
        z%Must be a certificate signing requestr   ©rŠ   )
r^   r   ZCertificateSigningRequestr_   r„   rŠ   r˜   r™   Ú"_load_certificate_request_internalr(   )rš   r  rŠ   r‡   r   r   r   Úfrom_cryptographyÙ  s
    zX509Req.from_cryptographyr/   ©r   r   c                 C  s    t  | j|j¡}t|dkƒ dS )zµ
        Set the public key of the certificate signing request.

        :param pkey: The public key to use.
        :type pkey: :py:class:`PKey`

        :return: ``None``
        rž   N)rM   ZX509_REQ_set_pubkeyr  r|   rS   ©rr   r   ra   r   r   r   Ú
set_pubkeyï  s    	zX509Req.set_pubkeyc                 C  sD   t  t ¡}t | j¡|_t|jtjkƒ t 	|jtj
¡|_d|_|S )z‹
        Get the public key of the certificate signing request.

        :return: The public key.
        :rtype: :py:class:`PKey`
        T)r/   Ú__new__rM   ZX509_REQ_get_pubkeyr  r|   rS   rP   rT   rU   r{   r…   r~   r   r   r   Ú
get_pubkeyû  s    
zX509Req.get_pubkeyrA   ©Úversionr   c                 C  s@   t |tƒstdƒ‚|dkr"tdƒ‚t | j|¡}t|dkƒ dS )z±
        Set the version subfield (RFC 2986, section 4.1) of the certificate
        request.

        :param int version: The version number.
        :return: ``None``
        zversion must be an intr   z9Invalid version. The only valid version for X509Req is 0.rž   N)r^   rA   r_   r`   rM   ZX509_REQ_set_versionr  rS   )rr   r  ra   r   r   r   r  	  s    
ÿzX509Req.set_versionc                 C  s   t  | j¡S )z¿
        Get the version subfield (RFC 2459, section 4.1.2.1) of the certificate
        request.

        :return: The value of the version subfield.
        :rtype: :py:class:`int`
        )rM   ZX509_REQ_get_versionr  rq   r   r   r   Úget_version  s    zX509Req.get_versionr1   c                 C  s2   t  t ¡}t | j¡|_t|jtjkƒ | |_	|S )aÝ  
        Return the subject of this certificate signing request.

        This creates a new :class:`X509Name` that wraps the underlying subject
        name field on the certificate signing request. Modifying it will modify
        the underlying signing request, and will have the effect of modifying
        any other :class:`X509Name` that refers to this subject.

        :return: The subject of this certificate signing request.
        :rtype: :class:`X509Name`
        )
r1   r  rM   ZX509_REQ_get_subject_namer  ry   rS   rP   rT   Ú_ownerrw   r   r   r   Úget_subject$  s
    
zX509Req.get_subjectúIterable[X509Extension]©Ú
extensionsr   c                 C  s|   t jdtdd� t ¡ }t|tjkƒ t |tj	¡}|D ]$}t
|tƒsNtdƒ‚t ||j¡ q8t | j|¡}t|dkƒ dS )z×
        Add extensions to the certificate signing request.

        :param extensions: The X.509 extensions to add.
        :type extensions: iterable of :py:class:`X509Extension`
        :return: ``None``
        úƒThis API is deprecated and will be removed in a future version of pyOpenSSL. You should use pyca/cryptography's X.509 APIs instead.é   ©Ú
stacklevelú+One of the elements is not an X509Extensionrž   N)ÚwarningsÚwarnÚDeprecationWarningrM   Zsk_X509_EXTENSION_new_nullrS   rP   rT   rU   Zsk_X509_EXTENSION_freer^   r0   r`   Zsk_X509_EXTENSION_pushró   ZX509_REQ_add_extensionsr  )rr   r%  ÚstackÚextrÞ   r   r   r   Úadd_extensions:  s    ù

zX509Req.add_extensionszlist[X509Extension]c                 C  s~   t jdtdd� g }t | j¡}t |dd„ ¡}tt 	|¡ƒD ]:}t
 t
¡}t t ||¡¡}t |tj¡|_| |¡ q>|S )zé
        Get X.509 extensions in the certificate signing request.

        :return: The X.509 extensions in this request.
        :rtype: :py:class:`list` of :py:class:`X509Extension` objects.

        .. versionadded:: 0.15
        r&  r'  r(  c                 S  s   t  | t t jd¡¡S )Nrò   )rM   Zsk_X509_EXTENSION_pop_freerP   Ú	addressofZ_original_lib)Úxr   r   r   r   r  s   þz(X509Req.get_extensions.<locals>.<lambda>)r+  r,  r-  rM   ZX509_REQ_get_extensionsr  rP   rU   rÖ   Zsk_X509_EXTENSION_numr0   r  ÚX509_EXTENSION_dupZsk_X509_EXTENSION_valuerò   ró   rv   )rr   ÚextsZnative_exts_objrÜ   r/  rõ   r   r   r   Úget_extensions[  s&    	ù
þ

ÿzX509Req.get_extensionsr   ©r   Údigestr   c                 C  s^   |j rtdƒ‚|jstdƒ‚t t|ƒ¡}|tjkr<tdƒ‚t | j	|j
|¡}t|dkƒ dS )aa  
        Sign the certificate signing request with this key and digest type.

        :param pkey: The key pair to sign with.
        :type pkey: :py:class:`PKey`
        :param digest: The name of the message digest to use for the signature,
            e.g. :py:data:`"sha256"`.
        :type digest: :py:class:`str`
        :return: ``None``
        zKey has only public partúKey is uninitializedúNo such digest methodr   N)r…   r`   r}   rM   ÚEVP_get_digestbynamerÓ   rP   rT   ZX509_REQ_signr  r|   rS   )rr   r   r7  Z
digest_objÚsign_resultr   r   r   Úsign�  s    
zX509Req.signr¤   c                 C  s4   t |tƒstdƒ‚t | j|j¡}|dkr0tƒ  |S )a@  
        Verifies the signature on this certificate signing request.

        :param PKey key: A public key.

        :return: ``True`` if the signature is correct.
        :rtype: bool

        :raises OpenSSL.crypto.Error: If the signature is invalid or there is a
            problem verifying the signature.
        úpkey must be a PKey instancer   )r^   r/   r_   rM   ZX509_REQ_verifyr  r|   r¨   )rr   r   r¡   r   r   r   Úverify™  s    
zX509Req.verifyN)rD   rE   rF   rG   rs   r  r«   r  r  r  r  r   r"  r0  r5  r<  r>  r   r   r   r   r2   ¹  s   
!&c                   @  s  e Zd ZdZddœdd„Zedd dœdd	„ƒZd
dœdd„Zed
d dœdd„ƒZdddœdd„Z	ddœdd„Z
ddœdd„Zdddœdd„Zddddœdd„Zd dœd!d"„Zdd d#œd$d%„Zddœd&d'„Zddd(œd)d*„Zddœd+d,„Zddd-œd.d/„Zddd-œd0d1„Zd2dœd3d4„Zdd5d6œd7d8„Zd5dœd9d:„Zd;d dd<œd=d>„Zd dd?œd@dA„Zd5dœdBdC„Zd dd?œdDdE„ZddFd6œdGdH„ZddFddIœdJdK„ZdFdœdLdM„ZdFddNœdOdP„ZdFdœdQdR„Z dFddSœdTdU„Z!ddœdVdW„Z"dXddYœdZd[„Z#dd\d]œd^d_„Z$d`S )ar-   z
    An X.509 certificate.
    r[   ro   c                 C  s:   t  ¡ }t|tjkƒ t |t j¡| _tƒ | _	tƒ | _
d S r   )rM   ZX509_newrS   rP   rT   rU   Ú	X509_freerñ   rn   Ú_issuer_invalidatorÚ_subject_invalidator)rr   r   r   r   r   rs   ´  s
    zX509.__init__r   )r   r   c                 C  s.   |   | ¡}t |tj¡|_tƒ |_tƒ |_|S r   )	r  rP   rU   rM   r?  rñ   rn   r@  rA  )rš   r   Úcertr   r   r   Ú_from_raw_x509_ptr¼  s
    
zX509._from_raw_x509_ptrzx509.Certificatec                 C  s   ddl m} tt| ƒ}||ƒS )z�
        Export as a ``cryptography`` certificate.

        :rtype: ``cryptography.x509.Certificate``

        .. versionadded:: 17.1.0
        r   )Úload_der_x509_certificate)r  rD  r7   r(   )rr   rD  r‡   r   r   r   r  Ä  s    
zX509.to_cryptography)Úcrypto_certr   c                 C  s6   t |tjƒstdƒ‚ddlm} | |j¡}tt	|ƒS )zü
        Construct based on a ``cryptography`` *crypto_cert*.

        :param crypto_key: A ``cryptography`` X.509 certificate.
        :type crypto_key: ``cryptography.x509.Certificate``

        :rtype: X509

        .. versionadded:: 17.1.0
        zMust be a certificater   r  )
r^   r   ZCertificater_   r„   rŠ   r˜   r™   r=   r(   )rš   rE  rŠ   r‡   r   r   r   r  Ñ  s
    zX509.from_cryptographyrA   r  c                 C  s,   t |tƒstdƒ‚tt | j|¡dkƒ dS )a	  
        Set the version number of the certificate. Note that the
        version value is zero-based, eg. a value of 0 is V1.

        :param version: The version number of the certificate.
        :type version: :py:class:`int`

        :return: ``None``
        zversion must be an integerrž   N)r^   rA   r_   rS   rM   ZX509_set_versionrñ   )rr   r  r   r   r   r  å  s    

zX509.set_versionc                 C  s   t  | j¡S )z˜
        Return the version number of the certificate.

        :return: The version number of the certificate.
        :rtype: :py:class:`int`
        )rM   ZX509_get_versionrñ   rq   r   r   r   r   ô  s    zX509.get_versionr/   c                 C  sF   t  t ¡}t | j¡|_|jtjkr*tƒ  t 	|jtj
¡|_d|_|S )z{
        Get the public key of the certificate.

        :return: The public key.
        :rtype: :py:class:`PKey`
        T)r/   r  rM   ZX509_get_pubkeyrñ   r|   rP   rT   r¨   rU   r{   r…   r~   r   r   r   r  ý  s    
zX509.get_pubkeyr  c                 C  s2   t |tƒstdƒ‚t | j|j¡}t|dkƒ dS )z¥
        Set the public key of the certificate.

        :param pkey: The public key.
        :type pkey: :py:class:`PKey`

        :return: :py:data:`None`
        r=  rž   N)r^   r/   r_   rM   ZX509_set_pubkeyrñ   r|   rS   r  r   r   r   r    s    	
zX509.set_pubkeyr   r6  c                 C  sp   t |tƒstdƒ‚|jr tdƒ‚|js.tdƒ‚t t|ƒ¡}|t	j
krNtdƒ‚t | j|j|¡}t|dkƒ dS )a  
        Sign the certificate with this key and digest type.

        :param pkey: The key to sign with.
        :type pkey: :py:class:`PKey`

        :param digest: The name of the message digest to use.
        :type digest: :py:class:`str`

        :return: :py:data:`None`
        r=  zKey only has public partr8  r9  r   N)r^   r/   r_   r…   r`   r}   rM   r:  rÓ   rP   rT   Z	X509_signrñ   r|   rS   )rr   r   r7  Zevp_mdr;  r   r   r   r<    s    

z	X509.signrX   c                 C  sZ   t  | j¡}t d¡}t  |tjtj|¡ t  |d ¡}|t jkrJt	dƒ‚t 
t  |¡¡S )zþ
        Return the signature algorithm used in the certificate.

        :return: The name of the algorithm.
        :rtype: :py:class:`bytes`

        :raises ValueError: If the signature algorithm is undefined.

        .. versionadded:: 0.13
        zASN1_OBJECT **r   zUndefined signature algorithm)rM   ZX509_get0_tbs_sigalgrñ   rP   rQ   ZX509_ALGOR_get0rT   rÚ   rÔ   r`   rj   Z
OBJ_nid2ln)rr   Zsig_algZalgr·   r   r   r   Úget_signature_algorithm7  s    

zX509.get_signature_algorithm)Údigest_namer   c                 C  s„   t  t|ƒ¡}|tjkr tdƒ‚t dt j¡}t dd¡}t|ƒ|d< t  	| j
|||¡}t|dkƒ d dd„ t ||d ¡D ƒ¡S )	a5  
        Return the digest of the X509 object.

        :param digest_name: The name of the digest algorithm to use.
        :type digest_name: :py:class:`str`

        :return: The digest of the object, formatted as
            :py:const:`b":"`-delimited hex pairs.
        :rtype: :py:class:`bytes`
        r9  zunsigned char[]zunsigned int[]rž   r   ó   :c                 S  s   g | ]}t |ƒ ¡ ‘qS r   )r   Úupper)r¸   Úchr   r   r   Ú
<listcomp>c  s   ÿzX509.digest.<locals>.<listcomp>)rM   r:  rÓ   rP   rT   r`   rQ   ZEVP_MAX_MD_SIZErR   ZX509_digestrñ   rS   rÿ   rI   )rr   rG  r7  rY   r	  Zdigest_resultr   r   r   r7  J  s$    
   ÿþÿzX509.digestc                 C  s   t  | j¡S )z�
        Return the hash of the X509 subject.

        :return: The hash of the subject.
        :rtype: :py:class:`int`
        )rM   ZX509_subject_name_hashrñ   rq   r   r   r   Úsubject_name_hashi  s    zX509.subject_name_hash)Úserialr   c                 C  sª   t |tƒstdƒ‚t|ƒdd… }| d¡}t d¡}t ||¡}t	|tj
kƒ t |d tj
¡}t |d ¡ t	|tj
kƒ t |tj¡}t | j|¡}t	|dkƒ dS )z±
        Set the serial number of the certificate.

        :param serial: The new serial number.
        :type serial: :py:class:`int`

        :return: :py:data`None`
        zserial must be an integerr'  NrÀ   zBIGNUM**r   rž   )r^   rA   r_   ÚhexrÛ   rP   rQ   rM   Z	BN_hex2bnrS   rT   ZBN_to_ASN1_INTEGERrŸ   rU   ZASN1_INTEGER_freeZX509_set_serialNumberrñ   )rr   rM  Ú
hex_serialZhex_serial_bytesÚbignum_serialr¡   Úasn1_serialra   r   r   r   Úset_serial_numberr  s    	


zX509.set_serial_numberc              	   C  sh   t  | j¡}t  |tj¡}z<t  |¡}z t 	|¡}t
|dƒ}|W ¢W ¢S t  |¡ X W 5 t  |¡ X dS )zx
        Return the serial number of this certificate.

        :return: The serial number.
        :rtype: int
        é   N)rM   ZX509_get_serialNumberrñ   ZASN1_INTEGER_to_BNrP   rT   rŸ   Z	BN_bn2hexrâ   rj   rA   )rr   rQ  rP  rO  Zhexstring_serialrM  r   r   r   Úget_serial_numberŽ  s    


zX509.get_serial_number)Úamountr   c                 C  s.   t |tƒstdƒ‚t | j¡}t ||¡ dS )zÍ
        Adjust the time stamp on which the certificate stops being valid.

        :param int amount: The number of seconds by which to adjust the
            timestamp.
        :return: ``None``
        úamount must be an integerN)r^   rA   r_   rM   ÚX509_getm_notAfterrñ   ÚX509_gmtime_adj)rr   rU  ZnotAfterr   r   r   Úgmtime_adj_notAfter¢  s    
zX509.gmtime_adj_notAfterc                 C  s.   t |tƒstdƒ‚t | j¡}t ||¡ dS )z½
        Adjust the timestamp on which the certificate starts being valid.

        :param amount: The number of seconds by which to adjust the timestamp.
        :return: ``None``
        rV  N)r^   rA   r_   rM   ÚX509_getm_notBeforerñ   rX  )rr   rU  Z	notBeforer   r   r   Úgmtime_adj_notBefore°  s    
zX509.gmtime_adj_notBeforer¤   c                 C  sT   |   ¡ }|dkrtdƒ‚| d¡}tj |d¡}tjj}tj |¡jdd�}||k S )z¡
        Check whether the certificate has expired.

        :return: ``True`` if the certificate has expired, ``False`` otherwise.
        :rtype: bool
        NzUnable to determine notAfterrÎ   z%Y%m%d%H%M%SZ)Útzinfo)	Úget_notAfterr`   rÂ   ÚdatetimeÚstrptimeÚtimezoneÚutcÚnowÚreplace)rr   Z
time_bytesZtime_stringZ	not_afterÚUTCÚutcnowr   r   r   Úhas_expired½  s    
zX509.has_expiredrH   )Úwhichr   c                 C  s   t || jƒƒS r   )rm   rñ   )rr   rg  r   r   r   Ú_get_boundary_timeÎ  s    zX509._get_boundary_timec                 C  s   |   tj¡S )a
  
        Get the timestamp at which the certificate starts being valid.

        The timestamp is formatted as an ASN.1 TIME::

            YYYYMMDDhhmmssZ

        :return: A timestamp string, or ``None`` if there is none.
        :rtype: bytes or NoneType
        )rh  rM   rZ  rq   r   r   r   Úget_notBeforeÑ  s    zX509.get_notBeforezCallable[..., Any])rg  r]   r   c                 C  s   t || jƒ|ƒS r   )rb   rñ   )rr   rg  r]   r   r   r   Ú_set_boundary_timeÞ  s    zX509._set_boundary_timerc   c                 C  s   |   tj|¡S )zî
        Set the timestamp at which the certificate starts being valid.

        The timestamp is formatted as an ASN.1 TIME::

            YYYYMMDDhhmmssZ

        :param bytes when: A timestamp string.
        :return: ``None``
        )rj  rM   rZ  ©rr   r]   r   r   r   Úset_notBeforeã  s    zX509.set_notBeforec                 C  s   |   tj¡S )a	  
        Get the timestamp at which the certificate stops being valid.

        The timestamp is formatted as an ASN.1 TIME::

            YYYYMMDDhhmmssZ

        :return: A timestamp string, or ``None`` if there is none.
        :rtype: bytes or NoneType
        )rh  rM   rW  rq   r   r   r   r]  ð  s    zX509.get_notAfterc                 C  s   |   tj|¡S )zí
        Set the timestamp at which the certificate stops being valid.

        The timestamp is formatted as an ASN.1 TIME::

            YYYYMMDDhhmmssZ

        :param bytes when: A timestamp string.
        :return: ``None``
        )rj  rM   rW  rk  r   r   r   Úset_notAfterý  s    zX509.set_notAfterr1   c                 C  s0   t  t ¡}|| jƒ|_t|jtjkƒ | |_|S r   )r1   r  rñ   ry   rS   rP   rT   r!  )rr   rg  ru   r   r   r   Ú	_get_name
  s
    
zX509._get_name)rg  ru   r   c                 C  s0   t |tƒstdƒ‚|| j|jƒ}t|dkƒ d S )Nzname must be an X509Namerž   )r^   r1   r_   rñ   ry   rS   )rr   rg  ru   ra   r   r   r   Ú	_set_name  s    
zX509._set_namec                 C  s   |   tj¡}| j |¡ |S )a¥  
        Return the issuer of this certificate.

        This creates a new :class:`X509Name` that wraps the underlying issuer
        name field on the certificate. Modifying it will modify the underlying
        certificate, and will have the effect of modifying any other
        :class:`X509Name` that refers to this issuer.

        :return: The issuer of this certificate.
        :rtype: :class:`X509Name`
        )rn  rM   ZX509_get_issuer_namer@  rx   rw   r   r   r   Ú
get_issuer  s    zX509.get_issuer)rð   r   c                 C  s   |   tj|¡ | j ¡  dS )zŸ
        Set the issuer of this certificate.

        :param issuer: The issuer.
        :type issuer: :py:class:`X509Name`

        :return: ``None``
        N)ro  rM   ZX509_set_issuer_namer@  rz   )rr   rð   r   r   r   Ú
set_issuer+  s    	zX509.set_issuerc                 C  s   |   tj¡}| j |¡ |S )a©  
        Return the subject of this certificate.

        This creates a new :class:`X509Name` that wraps the underlying subject
        name field on the certificate. Modifying it will modify the underlying
        certificate, and will have the effect of modifying any other
        :class:`X509Name` that refers to this subject.

        :return: The subject of this certificate.
        :rtype: :class:`X509Name`
        )rn  rM   ZX509_get_subject_namerA  rx   rw   r   r   r   r"  7  s    zX509.get_subject)rï   r   c                 C  s   |   tj|¡ | j ¡  dS )z£
        Set the subject of this certificate.

        :param subject: The subject.
        :type subject: :py:class:`X509Name`

        :return: ``None``
        N)ro  rM   ZX509_set_subject_namerA  rz   )rr   rï   r   r   r   Úset_subjectG  s    	zX509.set_subjectc                 C  s   t  | j¡S )z¯
        Get the number of extensions on this certificate.

        :return: The number of extensions.
        :rtype: :py:class:`int`

        .. versionadded:: 0.12
        )rM   ZX509_get_ext_countrñ   rq   r   r   r   Úget_extension_countS  s    	zX509.get_extension_countr#  r$  c                 C  sN   t jdtdd� |D ]4}t|tƒs*tdƒ‚t | j|j	d¡}t
|dkƒ qdS )zÍ
        Add extensions to the certificate.

        :param extensions: The extensions to add.
        :type extensions: An iterable of :py:class:`X509Extension` objects.
        :return: ``None``
        r&  r'  r(  r*  rÏ   rž   N)r+  r,  r-  r^   r0   r`   rM   ZX509_add_extrñ   ró   rS   )rr   r%  r/  rÞ   r   r   r   r0  ^  s    ù

zX509.add_extensionsr0   )Úindexr   c                 C  s^   t jdtdd� t t¡}t | j|¡|_|jt	j
kr>tdƒ‚t |j¡}t	 |tj¡|_|S )aÏ  
        Get a specific extension of the certificate by index.

        Extensions on a certificate are kept in order. The index
        parameter selects which extension will be returned.

        :param int index: The index of the extension to retrieve.
        :return: The extension at the specified index.
        :rtype: :py:class:`X509Extension`
        :raises IndexError: If the extension index was out of bounds.

        .. versionadded:: 0.12
        r&  r'  r(  zextension index out of bounds)r+  r,  r-  r0   r  rM   ZX509_get_extrñ   ró   rP   rT   Ú
IndexErrorr3  rU   rò   )rr   rt  r/  rõ   r   r   r   Úget_extensionw  s    ù

zX509.get_extensionN)%rD   rE   rF   rG   rs   r«   rC  r  r  r  r   r  r  r<  rF  r7  rL  rR  rT  rY  r[  rf  rh  ri  rj  rl  r]  rm  rn  ro  rp  rq  r"  rr  rs  r0  rv  r   r   r   r   r-   ¯  sF   		c                   @  sž   e Zd ZU dZejZded< ejZ	ded< ej
Zded< ejZded< ejZded< ejZded< ejZded	< ejZded
< ejZded< ejZded< dS )r6   a  
    Flags for X509 verification, used to change the behavior of
    :class:`X509Store`.

    See `OpenSSL Verification Flags`_ for details.

    .. _OpenSSL Verification Flags:
        https://www.openssl.org/docs/manmaster/man3/X509_VERIFY_PARAM_set_flags.html
    rA   Ú	CRL_CHECKÚCRL_CHECK_ALLÚIGNORE_CRITICALÚX509_STRICTÚALLOW_PROXY_CERTSÚPOLICY_CHECKÚEXPLICIT_POLICYÚINHIBIT_MAPÚCHECK_SS_SIGNATUREÚPARTIAL_CHAINN)rD   rE   rF   rG   rM   ZX509_V_FLAG_CRL_CHECKrw  r  ZX509_V_FLAG_CRL_CHECK_ALLrx  ZX509_V_FLAG_IGNORE_CRITICALry  ZX509_V_FLAG_X509_STRICTrz  ZX509_V_FLAG_ALLOW_PROXY_CERTSr{  ZX509_V_FLAG_POLICY_CHECKr|  ZX509_V_FLAG_EXPLICIT_POLICYr}  ZX509_V_FLAG_INHIBIT_MAPr~  ZX509_V_FLAG_CHECK_SS_SIGNATUREr  ZX509_V_FLAG_PARTIAL_CHAINr€  r   r   r   r   r6   ™  s   

c                   @  sr   e Zd ZdZddœdd„Zdddœdd	„Zd
ddœdd„Zdddœdd„Zdddœdd„Zdddddœdd„Z	dS )r3   aº  
    An X.509 store.

    An X.509 store is used to describe a context in which to verify a
    certificate. A description of a context may include a set of certificates
    to trust, a set of certificate revocation lists, verification flags and
    more.

    An X.509 store, being only a description, cannot be used by itself to
    verify a certificate. To carry out the actual verification process, see
    :class:`X509StoreContext`.
    r[   ro   c                 C  s   t  ¡ }t |t j¡| _d S r   )rM   ZX509_STORE_newrP   rU   ZX509_STORE_freeÚ_store©rr   Ústorer   r   r   rs   ¾  s    zX509Store.__init__r-   )rB  r   c                 C  s0   t |tƒstƒ ‚t | j|j¡}t|dkƒ dS )aÔ  
        Adds a trusted certificate to this store.

        Adding a certificate with this method adds this certificate as a
        *trusted* certificate.

        :param X509 cert: The certificate to add to this store.

        :raises TypeError: If the certificate is not an :class:`X509`.

        :raises OpenSSL.crypto.Error: If OpenSSL was unhappy with your
            certificate.

        :return: ``None`` if the certificate was added successfully.
        rž   N)r^   r-   r_   rM   ZX509_STORE_add_certr�  rñ   rS   )rr   rB  r¢   r   r   r   Úadd_certÂ  s    
zX509Store.add_certzx509.CertificateRevocationList)Úcrlr   c                 C  sv   t |tjƒrTddlm} t| |j¡ƒ}t 	|t
j¡}t|t
jkƒ t
 |tj¡}ntdƒ‚tt | j|¡dkƒ dS )aþ  
        Add a certificate revocation list to this store.

        The certificate revocation lists added to a store will only be used if
        the associated flags are configured to check certificate revocation
        lists.

        .. versionadded:: 16.1.0

        :param crl: The certificate revocation list to add to this store.
        :type crl: ``cryptography.x509.CertificateRevocationList``
        :return: ``None`` if the certificate revocation list was added
            successfully.
        r   r  z?CRL must be of type cryptography.x509.CertificateRevocationListN)r^   r   ZCertificateRevocationListr„   rŠ   rW   r˜   r™   rM   Zd2i_X509_CRL_biorP   rT   rS   rU   ZX509_CRL_freer_   ZX509_STORE_add_crlr�  )rr   r…  rŠ   rK   Zopenssl_crlr   r   r   Úadd_crlØ  s    ÿzX509Store.add_crlrA   )Úflagsr   c                 C  s   t t | j|¡dkƒ dS )aÒ  
        Set verification flags to this store.

        Verification flags can be combined by oring them together.

        .. note::

          Setting a verification flag sometimes requires clients to add
          additional information to the store, otherwise a suitable error will
          be raised.

          For example, in setting flags to enable CRL checking a
          suitable CRL must be added to the store otherwise an error will be
          raised.

        .. versionadded:: 16.1.0

        :param int flags: The verification flags to set on this store.
            See :class:`X509StoreFlags` for available constants.
        :return: ``None`` if the verification flags were successfully set.
        r   N)rS   rM   ZX509_STORE_set_flagsr�  )rr   r‡  r   r   r   Ú	set_flagsö  s    zX509Store.set_flagszdatetime.datetime)Úvfy_timer   c                 C  sF   t  ¡ }t |t j¡}t  |t | ¡ ¡¡ t	t  
| j|¡dkƒ dS )a¤  
        Set the time against which the certificates are verified.

        Normally the current time is used.

        .. note::

          For example, you can determine if a certificate was valid at a given
          time.

        .. versionadded:: 17.0.0

        :param datetime vfy_time: The verification time to set on this store.
        :return: ``None`` if the verification time was successfully set.
        r   N)rM   ZX509_VERIFY_PARAM_newrP   rU   ZX509_VERIFY_PARAM_freeZX509_VERIFY_PARAM_set_timeÚcalendarÚtimegmÚ	timetuplerS   ZX509_STORE_set1_paramr�  )rr   r‰  Úparamr   r   r   Úset_time  s     ÿzX509Store.set_timeNzStrOrBytesPath | None)ÚcafileÚcapathr   c                 C  sN   |dkrt j}nt|ƒ}|dkr(t j}nt|ƒ}t | j||¡}|sJtƒ  dS )aˆ  
        Let X509Store know where we can find trusted certificates for the
        certificate chain.  Note that the certificates have to be in PEM
        format.

        If *capath* is passed, it must be a directory prepared using the
        ``c_rehash`` tool included with OpenSSL.  Either, but not both, of
        *cafile* or *capath* may be ``None``.

        .. note::

          Both *cafile* and *capath* may be set simultaneously.

          Call this method multiple times to add more than one location.
          For example, CA certificates, and certificate revocation list bundles
          may be passed in *cafile* in subsequent calls to this method.

        .. versionadded:: 20.0

        :param cafile: In which file we can find the certificates (``bytes`` or
                       ``unicode``).
        :param capath: In which directory we can find the certificates
                       (``bytes`` or ``unicode``).

        :return: ``None`` if the locations were set successfully.

        :raises OpenSSL.crypto.Error: If both *cafile* and *capath* is ``None``
            or the locations could not be set for any reason.

        N)rP   rT   Ú_path_bytesrM   ZX509_STORE_load_locationsr�  r¨   )rr   r�  r�  Zload_resultr   r   r   Úload_locations&  s    #  ÿzX509Store.load_locations)N)
rD   rE   rF   rG   rs   r„  r†  rˆ  rŽ  r’  r   r   r   r   r3   °  s    ýc                      s,   e Zd ZdZdddddœ‡ fdd„Z‡  ZS )	r5   zù
    An exception raised when an error occurred while verifying a certificate
    using `OpenSSL.X509StoreContext.verify_certificate`.

    :ivar certificate: The certificate which caused verificate failure.
    :type certificate: :class:`X509`
    r   z	list[Any]r-   r[   )ÚmessageÚerrorsÚcertificater   c                   s   t ƒ  |¡ || _|| _d S r   )r¯   rs   r”  r•  )rr   r“  r”  r•  r³   r   r   rs   c  s    zX509StoreContextError.__init__)rD   rE   rF   rG   rs   rÉ   r   r   r³   r   r5   Z  s   c                   @  sˆ   e Zd ZdZddddddœdd	„Zeddd
œdd„ƒZedddœdd„ƒZddœdd„Zdddœdd„Z	ddœdd„Z
ddœdd„ZdS )r4   a9  
    An X.509 store context.

    An X.509 store context is used to carry out the actual verification process
    of a certificate in a described context. For describing such a context, see
    :class:`X509Store`.

    :param X509Store store: The certificates which will be trusted for the
        purposes of any verifications.
    :param X509 certificate: The certificate to be verified.
    :param chain: List of untrusted certificates that may be used for building
        the certificate chain. May be ``None``.
    :type chain: :class:`list` of :class:`X509`
    Nr3   r-   zSequence[X509] | Noner[   )rƒ  r•  Úchainr   c                 C  s   || _ || _|  |¡| _d S r   )r�  Ú_certÚ_build_certificate_stackÚ_chain)rr   rƒ  r•  r–  r   r   r   rs   {  s    zX509StoreContext.__init__)Úcertificatesr   c                 C  s¤   dddœdd„}| d ks$t | ƒdkr*tjS t ¡ }t|tjkƒ t ||¡}| D ]N}t|tƒsft	dƒ‚tt 
|j¡dkƒ t ||j¡dkrPt |j¡ tƒ  qP|S )Nr   r[   )Úsr   c                 S  s8   t t | ¡ƒD ]}t | |¡}t |¡ qt | ¡ d S r   )rÖ   rM   Úsk_X509_numÚsk_X509_valuer?  Úsk_X509_free)r›  rÜ   r2  r   r   r   Úcleanup‰  s    z:X509StoreContext._build_certificate_stack.<locals>.cleanupr   z+One of the elements is not an X509 instance)rR   rP   rT   rM   Zsk_X509_new_nullrS   rU   r^   r-   r_   ZX509_up_refrñ   Zsk_X509_pushr?  r¨   )rš  rŸ  r.  rB  r   r   r   r˜  …  s    
z)X509StoreContext._build_certificate_stackr   r5   )Ú	store_ctxr   c                 C  s\   t  t t | ¡¡¡ d¡}t | ¡t | ¡|g}t | ¡}t |¡}t	 
|¡}t|||ƒS )zú
        Convert an OpenSSL native context error failure into a Python
        exception.

        When a call to native OpenSSL X509_verify_cert fails, additional
        information about the failure can be obtained from the store context.
        rÎ   )rP   rj   rM   ZX509_verify_cert_error_stringZX509_STORE_CTX_get_errorrÂ   ZX509_STORE_CTX_get_error_depthZX509_STORE_CTX_get_current_certZX509_dupr-   rC  r5   )r   r“  r”  rñ   r—  Úpycertr   r   r   Ú_exception_from_context£  s    	ÿÿüý


z(X509StoreContext._exception_from_contextro   c                 C  sj   t  ¡ }t|tjkƒ t |t j¡}t  || jj| j	j
| j¡}t|dkƒ t  |¡}|dkrf|  |¡‚|S )a3  
        Verifies the certificate and runs an X509_STORE_CTX containing the
        results.

        :raises X509StoreContextError: If an error occurred when validating a
          certificate in the context. Sets ``certificate`` attribute to
          indicate which certificate caused the error.
        rž   r   )rM   ZX509_STORE_CTX_newrS   rP   rT   rU   ZX509_STORE_CTX_freeZX509_STORE_CTX_initr�  r—  rñ   r™  ZX509_verify_certr¢  )rr   r   rd   r   r   r   Ú_verify_certificate½  s    	   ÿ

z$X509StoreContext._verify_certificate)rƒ  r   c                 C  s
   || _ dS )zÖ
        Set the context's X.509 store.

        .. versionadded:: 0.15

        :param X509Store store: The store description which will be used for
            the purposes of any *future* verifications.
        N)r�  r‚  r   r   r   Ú	set_storeÕ  s    	zX509StoreContext.set_storec                 C  s   |   ¡  dS )a"  
        Verify a certificate in a context.

        .. versionadded:: 0.15

        :raises X509StoreContextError: If an error occurred when validating a
          certificate in the context. Sets ``certificate`` attribute to
          indicate which certificate caused the error.
        N)r£  rq   r   r   r   Úverify_certificateà  s    
z#X509StoreContext.verify_certificatez
list[X509]c                 C  st   |   ¡ }t |¡}t|tjkƒ g }tt |¡ƒD ]2}t ||¡}t|tjkƒ t	 
|¡}| |¡ q2t |¡ |S )aR  
        Verify a certificate in a context and return the complete validated
        chain.

        :raises X509StoreContextError: If an error occurred when validating a
          certificate in the context. Sets ``certificate`` attribute to
          indicate which certificate caused the error.

        .. versionadded:: 20.0
        )r£  rM   ZX509_STORE_CTX_get1_chainrS   rP   rT   rÖ   rœ  r�  r-   rC  rv   rž  )rr   r   Z
cert_stackr¡   rÜ   rB  r¡  r   r   r   Úget_verified_chainì  s    


z#X509StoreContext.get_verified_chain)N)rD   rE   rF   rG   rs   Ústaticmethodr˜  r¢  r£  r¤  r¥  r¦  r   r   r   r   r4   k  s    ü
)rœ   rI   r   c                 C  sv   t |tƒr| d¡}t|ƒ}| tkr<t |tjtjtj¡}n | t	krTt 
|tj¡}ntdƒ‚|tjkrltƒ  t |¡S )a  
    Load a certificate (X509) from the string *buffer* encoded with the
    type *type*.

    :param type: The file type (one of FILETYPE_PEM, FILETYPE_ASN1)

    :param bytes buffer: The buffer the certificate is stored in

    :return: The X509 object
    rÀ   ú3type argument must be FILETYPE_PEM or FILETYPE_ASN1)r^   r   rÛ   rW   r)   rM   ZPEM_read_bio_X509rP   rT   r(   Zd2i_X509_bior`   r¨   r-   rC  )rœ   rI   rK   r   r   r   r   r=   	  s    


)rœ   rB  r   c                 C  sn   t ƒ }| tkrt ||j¡}n<| tkr6t ||j¡}n$| tkrRt ||jdd¡}nt	dƒ‚t
|dkƒ t|ƒS )a  
    Dump the certificate *cert* into a buffer string encoded with the type
    *type*.

    :param type: The file type (one of FILETYPE_PEM, FILETYPE_ASN1, or
        FILETYPE_TEXT)
    :param cert: The certificate to dump
    :return: The buffer with the dumped certificate in
    r   úCtype argument must be FILETYPE_PEM, FILETYPE_ASN1, or FILETYPE_TEXTrž   )rW   r)   rM   ZPEM_write_bio_X509rñ   r(   Zi2d_X509_bior*   ZX509_print_exr`   rS   rZ   )rœ   rB  rK   Úresult_coder   r   r   r7   &  s    
ÿ)rœ   r   r   c                 C  sP   t ƒ }| tkrtj}n| tkr&tj}ntdƒ‚|||jƒ}|dkrHtƒ  t	|ƒS )zú
    Dump a public key to a buffer.

    :param type: The file type (one of :data:`FILETYPE_PEM` or
        :data:`FILETYPE_ASN1`).
    :param PKey pkey: The public key to dump
    :return: The buffer with the dumped key in it.
    :rtype: bytes
    r¨  rž   )
rW   r)   rM   ZPEM_write_bio_PUBKEYr(   Zi2d_PUBKEY_bior`   r|   r¨   rZ   )rœ   r   rK   Z	write_biorª  r   r   r   r:   B  s    
rß   úPassphraseCallableT | None)rœ   r   ÚcipherÚ
passphraser   c           	   	   C  s  t ƒ }t|tƒstdƒ‚|dk	rR|dkr0tdƒ‚t t|ƒ¡}|tjkrXt	dƒ‚ntj}t
| |ƒ}| tkr’t ||j|tjd|j|j¡}| ¡  nh| tkrªt ||j¡}nP| tkròt |j¡tjkrÌtdƒ‚t t |j¡tj¡}t ||d¡}nt	dƒ‚t|dkƒ t|ƒS )a…  
    Dump the private key *pkey* into a buffer string encoded with the type
    *type*.  Optionally (if *type* is :const:`FILETYPE_PEM`) encrypting it
    using *cipher* and *passphrase*.

    :param type: The file type (one of :const:`FILETYPE_PEM`,
        :const:`FILETYPE_ASN1`, or :const:`FILETYPE_TEXT`)
    :param PKey pkey: The PKey to dump
    :param cipher: (optional) if encrypted PEM format, the cipher to use
    :param passphrase: (optional) if encrypted PEM format, this can be either
        the passphrase to use, or a callback for providing the passphrase.

    :return: The buffer with the dumped key in
    :rtype: bytes
    zpkey must be a PKeyNzDif a value is given for cipher one must also be given for passphrasezInvalid cipher namer   z-Only RSA keys are supported for FILETYPE_TEXTr©  )rW   r^   r/   r_   rM   ZEVP_get_cipherbynamerÓ   rP   rT   r`   Ú_PassphraseHelperr)   ZPEM_write_bio_PrivateKeyr|   ÚcallbackÚcallback_argsÚraise_if_problemr(   Zi2d_PrivateKey_bior*   rª   r¥   rU   r¦   r§   Z	RSA_printrS   rZ   )	rœ   r   r¬  r­  rK   Z
cipher_objÚhelperrª  r    r   r   r   r9   [  sH    
ÿ


ù	
ÿc                   @  sr   e Zd Zdddddddœdd„Zed	d
œdd„ƒZed	d
œdd„ƒZefdddœdd„Zd	dd	d	ddœdd„Z	dS )r®  FrA   r«  r¤   r[   )rœ   r­  Ú	more_argsÚtruncater   c                 C  s4   |t kr|d k	rtdƒ‚|| _|| _|| _g | _d S )Nz0only FILETYPE_PEM key format supports encryption)r)   r`   Ú_passphraseÚ
_more_argsÚ	_truncateÚ	_problems)rr   rœ   r­  r³  r´  r   r   r   rs   ¡  s    ÿz_PassphraseHelper.__init__r   ro   c                 C  s@   | j d krtjS t| j tƒs&t| j ƒr4t d| j¡S tdƒ‚d S )NZpem_password_cbú2Last argument must be a byte string or a callable.)	rµ  rP   rT   r^   rX   Úcallabler¯  Ú_read_passphraser_   rq   r   r   r   r¯  ±  s    
ÿz_PassphraseHelper.callbackc                 C  s8   | j d krtjS t| j tƒs&t| j ƒr,tjS tdƒ‚d S )Nr¹  )rµ  rP   rT   r^   rX   rº  r_   rq   r   r   r   r°  ¼  s    
ÿz_PassphraseHelper.callback_argsztype[Exception])ÚexceptionTyper   c                 C  s8   | j r4zt|ƒ W n |k
r&   Y nX | j  d¡‚d S rå   )r¸  Ú_exception_from_error_queueÚpop)rr   r¼  r   r   r   r±  Ç  s    z"_PassphraseHelper.raise_if_problem)r  ÚsizeÚrwflagÚuserdatar   c              
   C  sä   zªt | jƒr.| jr"|  |||¡}qB|  |¡}n| jd k	s<t‚| j}t|tƒsTtdƒ‚t|ƒ|kr|| jrt|d |… }ntdƒ‚t	t|ƒƒD ]}|||d … ||< qˆt|ƒW S  t
k
rÞ } z| j |¡ W Y ¢dS d }~X Y nX d S )NzBytes expectedz+passphrase returned by callback is too longrž   r   )rº  rµ  r¶  ÚAssertionErrorr^   rX   r`   rR   r·  rÖ   Ú	Exceptionr¸  rv   )rr   r  r¿  rÀ  rÁ  r¡   rÜ   Úer   r   r   r»  Ñ  s*    

ÿ
z"_PassphraseHelper._read_passphraseN)FF)
rD   rE   rF   rs   r  r¯  r°  r.   r±  r»  r   r   r   r   r®     s     û


r®  zstr | bytesc                 C  s�   t |tƒr| d¡}t|ƒ}| tkr<t |tjtjtj¡}n | t	krTt 
|tj¡}ntdƒ‚|tjkrltƒ  t t¡}t |tj¡|_d|_|S )a<  
    Load a public key from a buffer.

    :param type: The file type (one of :data:`FILETYPE_PEM`,
        :data:`FILETYPE_ASN1`).
    :param buffer: The buffer the key is stored in.
    :type buffer: A Python string object, either unicode or bytestring.
    :return: The PKey object.
    :rtype: :class:`PKey`
    rÀ   r¨  T)r^   r   rÛ   rW   r)   rM   ZPEM_read_bio_PUBKEYrP   rT   r(   Zd2i_PUBKEY_bior`   r¨   r/   r  rU   r{   r|   r…   )rœ   rI   rK   Úevp_pkeyr   r   r   r   r@   î  s&    

   ÿ

)rœ   rI   r­  r   c                 C  sœ   t |tƒr| d¡}t|ƒ}t| |ƒ}| tkrNt |tj	|j
|j¡}| ¡  n | tkrft |tj	¡}ntdƒ‚|tj	kr~tƒ  t t¡}t |tj¡|_|S )a³  
    Load a private key (PKey) from the string *buffer* encoded with the type
    *type*.

    :param type: The file type (one of FILETYPE_PEM, FILETYPE_ASN1)
    :param buffer: The buffer the key is stored in
    :param passphrase: (optional) if encrypted PEM format, this can be
                       either the passphrase to use, or a callback for
                       providing the passphrase.

    :return: The PKey object
    rÀ   r¨  )r^   r   rÛ   rW   r®  r)   rM   ZPEM_read_bio_PrivateKeyrP   rT   r¯  r°  r±  r(   Zd2i_PrivateKey_bior`   r¨   r/   r  rU   r{   r|   )rœ   rI   r­  rK   r²  rÅ  r   r   r   r   r?   	  s(    


   ÿ


)rœ   r  r   c                 C  sn   t ƒ }| tkrt ||j¡}n<| tkr6t ||j¡}n$| tkrRt ||jdd¡}nt	dƒ‚t
|dkƒ t|ƒS )av  
    Dump the certificate request *req* into a buffer string encoded with the
    type *type*.

    :param type: The file type (one of FILETYPE_PEM, FILETYPE_ASN1)
    :param req: The certificate request to dump
    :return: The buffer with the dumped certificate request in


    .. deprecated:: 24.2.0
       Use `cryptography.x509.CertificateSigningRequest` instead.
    r   r©  )rW   r)   rM   ZPEM_write_bio_X509_REQr  r(   Zi2d_X509_REQ_bior*   ZX509_REQ_print_exr`   rS   rZ   )rœ   r  rK   rª  r   r   r   r8   9	  s    ÿrÅ   c                 C  sˆ   t |tƒr| d¡}t|ƒ}| tkr<t |tjtjtj¡}n | t	krTt 
|tj¡}ntdƒ‚t|tjkƒ t t¡}t |tj¡|_|S )a—  
    Load a certificate request (X509Req) from the string *buffer* encoded with
    the type *type*.

    :param type: The file type (one of FILETYPE_PEM, FILETYPE_ASN1)
    :param buffer: The buffer the certificate request is stored in
    :return: The X509Req object

    .. deprecated:: 24.2.0
       Use `cryptography.x509.load_der_x509_csr` or
       `cryptography.x509.load_pem_x509_csr` instead.
    rÀ   r¨  )r^   r   rÛ   rW   r)   rM   ZPEM_read_bio_X509_REQrP   rT   r(   Zd2i_X509_REQ_bior`   rS   r2   r  rU   r  r  )rœ   rI   rK   r  Zx509reqr   r   r   r>   g	  s    


)N)NN)N)oÚ
__future__r   rŠ  r^  Ú	functoolsÚsysr†   r+  Úbase64r   Úcollections.abcr   r   r   r   r   r	   Úversion_infor   ÚTypeVarZ_TZtyping_extensionsZcryptographyr   r   Z)cryptography.hazmat.primitives.asymmetricr   r   r   r   r    ZOpenSSL._utilr!   r"   rÓ   r#   r½  r$   rP   r%   rM   r&   Z_make_assertr'   r‘  Ú__all__rŽ   r�   r’   r”   r–   Z_PrivateKeyr�   r‘   r“   r•   r—   Z
_PublicKeyr€   rX   ZPassphraseCallableTZSSL_FILETYPE_PEMr)   r  ZSSL_FILETYPE_ASN1r(   r*   r¥   r,   ZEVP_PKEY_DSAr+   ZEVP_PKEY_DHrB   ZEVP_PKEY_ECrC   rÃ  r.   r¨   rS   rW   rZ   rb   re   rm   rn   r/   r¬   r<   r;   Útotal_orderingr1   r0   r2   r-   r6   r3   r5   r4   r=   r7   r:   r9   r®  r@   r?   r8   r  rD   r-  r>   r  r   r   r   r   Ú<module>   s(   


çüÿüÿ
	 Bgÿÿ Cÿ +ÿ s   m +   üEN% ý) ø ø