o
    çó·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rId dlmZ nejd	k rYe d
¡Zdwd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, g d¢Z-eej.ej/ej0ej1ej2f Z3eej4ej5ej6ej7ej8f Z9ee3e9f Z:ee;ede;f f Z<e(j=Z>de?d< e(j@ZAde?d < d!ZBe(jCZDde?d"< e(jEZFde?d#< e(jGZHde?d$< e(jIZJde?d%< G d&d'„ d'eKƒZLee$eLƒZMe*eLƒZNdxdyd+d,„ZOdzd/d0„ZPd{d4d5„ZQd|d6d7„ZRd}d9d:„ZSG d;d<„ d<ƒZTG d=d>„ d>ƒZUG d?d@„ d@ƒZVedAƒd~dCdD„ƒZWedEƒddGdH„ƒZXejYG dIdJ„ dJƒƒZZedKƒG dLdM„ dMƒƒZ[edNƒG dOdP„ dPƒƒZ\G dQdR„ dRƒZ]G dSdT„ dTƒZ^G dUdV„ dVƒZ_G dWdX„ dXeKƒZ`G dYdZ„ dZƒZad€d\d]„Zbd�d_d`„Zcd‚dbdc„Zd		dƒd„dhdi„ZeG djdk„ dkƒZfd…dmdn„Zg	dxd†dodp„Zhd‡drds„ZieiZjejeiekdNeldsdt� dˆdudv„ZmemZnejemekdNeldvdt� dS )‰é    )ÚannotationsN)Ú	b16encode)ÚIterableÚSequence)Úpartial)ÚAnyÚCallableÚUnion)é   é   )Ú
deprecated)r
   é   ÚTÚmsgÚstrÚkwargsÚobjectÚreturnúCallable[[_T], _T]c                 K  s   dd„ S )Nc                 S  s   | S ©N© )Úfr   r   úTC:\Users\psant\Downloads\PAF backend\school\venv\Lib\site-packages\OpenSSL/crypto.pyÚ<lambda>   s    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.Úintr)   r(   iÿÿ  r,   r+   Ú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    r.   Úbufferúbytes | Noner   c                 C  sf   | du rt  t  ¡ ¡}t j}nt d| ¡}t  |t| ƒ¡}|f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[]Úbior   Úrefr   c                 S  s
   t  | ¡S r   )Ú_libÚBIO_free)rK   rL   r   r   r   Úfree�   ó   
z_new_mem_buf.<locals>.free)rK   r   rL   r   r   r   )rM   ZBIO_newZ	BIO_s_memrN   Ú_ffiÚnewZBIO_new_mem_bufÚlenÚ_openssl_assertÚNULLÚgc)rH   rK   rO   Údatar   r   r   Ú_new_mem_buf~   s   	rX   rK   Úbytesc                 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)rQ   rR   rM   ZBIO_get_mem_datarH   )rK   Úresult_bufferZbuffer_lengthr   r   r   Ú_bio_to_string˜   s   
r[   ÚboundaryÚwhenÚNonec                 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)	Ú
isinstancerY   Ú	TypeErrorrT   rQ   rU   rM   ZASN1_TIME_set_stringÚ
ValueError)r\   r]   Ú
set_resultr   r   r   Ú_set_asn1_time¡   s   
ÿrc   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.
    N)rM   ZASN1_TIME_newrT   rQ   rU   rV   ZASN1_TIME_freerc   )r]   Úretr   r   r   Ú_new_asn1_timeº   s
   
re   Ú	timestampc                 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 )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**)rQ   ÚcastrM   ÚASN1_STRING_lengthZASN1_STRING_typeZV_ASN1_GENERALIZEDTIMEÚstringÚASN1_STRING_get0_datarR   ZASN1_TIME_to_generalizedtimerT   rU   ZASN1_GENERALIZEDTIME_free)rf   Zstring_timestampZgeneralized_timestampZstring_dataÚstring_resultr   r   r   Ú_get_asn1_timeÍ   s   
ÿ


rm   c                   @  s*   e Zd Zddd„Zddd„Zdd	d
„ZdS )Ú_X509NameInvalidatorr   r^   c                 C  s
   g | _ d S r   )Ú_names©Úselfr   r   r   Ú__init__ë   rP   z_X509NameInvalidator.__init__Únamer1   c                 C  s   | j  |¡ d S r   )ro   Úappend©rq   rs   r   r   r   Úaddî   s   z_X509NameInvalidator.addc                 C  s   | j D ]}|`qd S r   )ro   Ú_nameru   r   r   r   Úclearñ   s   
þz_X509NameInvalidator.clearN©r   r^   ©rs   r1   r   r^   )rD   rE   rF   rr   rv   rx   r   r   r   r   rn   ê   s    

rn   c                   @  sb   e Zd ZdZdZdZddd„Zdd	d
„Zeddd„ƒZ	ddd„Z
ddd„Zd dd„Zd dd„ZdS )!r/   zD
    A class representing an DSA or RSA public key or key pair.
    FTr   r^   c                 C  s"   t  ¡ }t |t j¡| _d| _d S )NF)rM   ZEVP_PKEY_newrQ   rV   ÚEVP_PKEY_freeÚ_pkeyÚ_initialized©rq   Úpkeyr   r   r   rr   ÿ   s   
zPKey.__init__Ú_Keyc                 C  sN   ddl m}m} | jrtt| ƒ}t t||ƒ¡S t	t| ƒ}t t||d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   )rq   r�   r‚   Úderr   r   r   Úto_cryptography_key  s   

zPKey.to_cryptography_keyÚ
crypto_keyc                 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ƒrCtt| |j|j¡ƒS | |j|j|ƒ ¡}tt|ƒ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  sF   öþûþ
ÿþÿ
zPKey.from_cryptography_keyÚtyperA   Úbitsc              	   C  s4  t |tƒs	tdƒ‚t |tƒstdƒ‚|tkrQ|dkrtdƒ‚t ¡ }t |tj	¡}t 
|tj¡ t ¡ }t |||tj¡}t|dkƒ t | j|¡}t|dkƒ nD|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,   ra   rM   ZBN_newrQ   rV   ÚBN_freeZBN_set_wordZRSA_F4ZRSA_newZRSA_generate_key_exrU   rT   ZEVP_PKEY_assign_RSAr|   r+   ZDSA_newZDSA_freeZDSA_generate_parameters_exZDSA_generate_keyZEVP_PKEY_set1_DSAr.   r}   )rq   rœ   r�   Úexponentr    Úresultr   Úresr   r   r   Úgenerate_keyU  s6   

ÿ
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r-d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|   rQ   rV   ÚRSA_freeZRSA_check_keyÚ_raise_current_error)rq   r    r¡   r   r   r   Úcheck�  s   

z
PKey.checkc                 C  ó   t  | j¡S )zT
        Returns the type of the key

        :return: The type of the key.
        N)rM   ÚEVP_PKEY_idr|   rp   r   r   r   rœ   §  ó   z	PKey.typec                 C  rª   )zh
        Returns the number of bits of the key

        :return: The number of bits of the key.
        N)rM   ZEVP_PKEY_bitsr|   rp   r   r   r   r�   ¯  r¬   z	PKey.bitsNry   )r   r€   )r‰   r€   r   r/   )rœ   rA   r�   rA   r   r^   ©r   r¤   ©r   rA   )rD   rE   rF   rG   r…   r}   rr   rˆ   Úclassmethodr›   r£   r©   rœ   r�   r   r   r   r   r/   ÷   s    


9
8
r/   c                      sn   e Zd ZdZdZd‡ fdd„Zeddd„ƒZeddd„ƒZeddd„ƒZ	ddd„Z
d dd„Z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`
    NÚotherr   r   r¤   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.
        N)r_   r°   ÚsuperÚ__ne__ÚNotImplemented©rq   r±   ©Ú	__class__r   r   r³   Ä  s   
z_EllipticCurve.__ne__r%   úset[_EllipticCurve]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>N)ZEC_get_builtin_curvesrQ   rU   rR   Úset)rš   r%   Z
num_curvesZbuiltin_curvesr   r½   r   Ú_load_elliptic_curvesÏ  s   
z$_EllipticCurve._load_elliptic_curvesc                 C  s   | j du 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_curvesrº   rA   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.
        ÚasciiN)rQ   rj   Ú
OBJ_nid2snÚdecode)rš   r%   rº   r   r   r   r¹   ï  s   z_EllipticCurve.from_nidrs   r   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   Ú_nidrs   )rq   r%   rº   rs   r   r   r   rr      s   
z_EllipticCurve.__init__c                 C  s   d| j ›d�S )Nz<Curve ú>©rs   rp   r   r   r   Ú__repr__  ó   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.
        N)rM   ZEC_KEY_new_by_curve_namerÆ   rQ   rV   ZEC_KEY_free)rq   Úkeyr   r   r   Ú
_to_EC_KEY  s   z_EllipticCurve._to_EC_KEY©r±   r   r   r¤   )r%   r   r   r¸   )r%   r   rº   rA   r   r°   )r%   r   rº   rA   rs   r   r   r^   ©r   r   ©r   r   )rD   rE   rF   rG   rÁ   r³   r¯   rÀ   rÂ   r¹   rr   rÉ   rÌ   Ú__classcell__r   r   r¶   r   r°   ¸  s    	

r°   zSget_elliptic_curves is deprecated. You should use the APIs in cryptography instead.r¸   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.
    N)r°   rÂ   rM   r   r   r   r   r<     s   
r<   zRget_elliptic_curve is deprecated. You should use the APIs in cryptography instead.rs   c                 C  s(   t ƒ D ]}|j| kr|  S qtd| ƒ‚)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<   rs   ra   )rs   Zcurver   r   r   r;   2  s
   

ÿ
r;   c                      sr   e Zd ZdZd dd„Zd!‡ fd
d„Zd"dd„Zd#dd„Zd#dd„Zd$dd„Z	d%dd„Z
d&dd„Z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.
    rs   r   r^   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_duprw   rQ   rV   ZX509_NAME_freeru   r   r   r   rr   b  s   zX509Name.__init__r   Úvaluer   c           	   	     s  |  d¡rtƒ  ||¡S t|ƒturtdt|ƒjd›d�ƒ‚t t	|ƒ¡}|tj
kr?ztƒ  W tdƒ‚ ty>   Y tdƒ‚w tt | j¡ƒD ]%}t | j|¡}t |¡}t |¡}||krlt | j|¡}t |¡  qmqGt|tƒrw| d¡}t | j|tj|ddd¡}|s‹tƒ  d S 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_countrw   Ú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)	rq   rs   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 tdƒ‚ ty    Y tdƒ‚w t  | j|d¡}|dkr/dS t  	| j|¡}t  
|¡}t d¡}t  ||¡}t|dkƒ zt |d |¡dd…  d¡}W t  |d ¡ |S t  |d ¡ w )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_NIDrw   rß   ÚX509_NAME_ENTRY_get_datarQ   rR   ZASN1_STRING_to_UTF8rT   rH   rÅ   ÚOPENSSL_free)	rq   rs   rº   Zentry_indexÚentryrW   rZ   Zdata_lengthr¡   r   r   r   Ú__getattr__“  s0   
þþ

ÿÿ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_cmprw   rµ   r   r   r   Ú__eq__»  ó   
zX509Name.__eq__c                 C  s"   t |tƒstS t | j|j¡dk S rì   rí   rµ   r   r   r   Ú__lt__Á  rï   zX509Name.__lt__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Õ   N)rQ   rR   rM   ZX509_NAME_onelinerw   rS   rT   rU   Úformatrj   rÅ   )rq   rZ   Zformat_resultr   r   r   rÉ   Ç  s   ÿÿzX509Name.__repr__rA   c                 C  rª   )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`
        N)rM   ZX509_NAME_hashrw   rp   r   r   r   ÚhashÕ  ó   
zX509Name.hashrY   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)rQ   rR   rM   Zi2d_X509_NAMErw   rT   rH   ré   )rq   rZ   Zencode_resultrl   r   r   r   r‡   á  s   
zX509Name.derúlist[tuple[bytes, bytes]]c           	      C  sˆ   g }t t | j¡ƒD ]7}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Þ   rw   rß   rà   rè   rá   rÄ   rQ   rH   rk   ri   rt   rj   )	rq   r¡   rã   rä   ÚfnameZfvalrº   rs   rÑ   r   r   r   Úget_componentsð  s   



ÿþzX509Name.get_componentsrz   )rs   r   rÑ   r   r   r^   )rs   r   r   ræ   rÍ   rÎ   r®   ©r   rY   )r   rô   )rD   rE   rF   rG   rr   rØ   rë   rî   rð   rÉ   rò   r‡   rö   rÐ   r   r   r¶   r   r1   H  s    


'
(



r1   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„Zed$dd„ƒZejdej	dej
diZded< d%dd„Zd%dd„Zd&dd„Zd'dd„Zd'd d!„ZdS )(r0   zu
    An X.509 v3 certificate extension.

    .. deprecated:: 23.3.0
       Use cryptography's X509 APIs instead.
    NÚ	type_namerY   Úcriticalr¤   rÑ   ÚsubjectúX509 | NoneÚissuerr   r^   c                 C  s¶   t  d¡}t |t jt jt jt jd¡ t |¡ |dur)t|tƒs%tdƒ‚|j	|_
|dur:t|tƒs6tdƒ‚|j	|_|r@d| }t t j|||¡}|t jkrQtƒ  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,)rQ   rR   rM   ZX509V3_set_ctxrU   ZX509V3_set_ctx_nodbr_   r-   r`   Ú_x509Zissuer_certZsubject_certZX509V3_EXT_nconfr¨   rV   ÚX509_EXTENSION_freeÚ
_extension)rq   rø   rù   rÑ   rú   rü   ÚctxÚ	extensionr   r   r   rr     s"   




zX509Extension.__init__r   c                 C  s   t  t  | j¡¡S r   )rM   rá   ÚX509_EXTENSION_get_objectrÿ   rp   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 ]Q}t 	||¡}z| j
|j }W n tyF   tƒ }t ||¡ | t|ƒ d¡¡ Y qw t  d|jj¡}t  t |¡t |¡¡d d …  d¡}| |d | ¡ qd |¡S )NzGENERAL_NAMES*rÕ   rg   ú:z, )rQ   rh   rM   ZX509V3_EXT_d2irÿ   rV   ZGENERAL_NAMES_freerÝ   Zsk_GENERAL_NAME_numZsk_GENERAL_NAME_valuer  rœ   ÚKeyErrorrX   ZGENERAL_NAME_printrt   r[   rÅ   ÚdZia5rH   rk   ri   Újoin)	rq   ÚnamesÚpartsrã   rs   ÚlabelrK   Zasn1_stringrÑ   r   r   r   Ú_subjectAltNameStringh  s2   ÿýþýý
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Õ   N)
rM   ZNID_subject_alt_namerÆ   r  rX   ZX509V3_EXT_printrÿ   rT   r[   rÅ   )rq   rK   Zprint_resultr   r   r   Ú__str__€  s   zX509Extension.__str__c                 C  rª   )zk
        Returns the critical field of this X.509 extension.

        :return: The critical field.
        N)rM   ZX509_EXTENSION_get_criticalrÿ   rp   r   r   r   Úget_critical�  r¬   zX509Extension.get_criticalc                 C  s8   t  | j¡}t  |¡}t  |¡}|tjkrt |¡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Ä   rQ   rU   rj   )rq   Ú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ÿ   rQ   rh   rk   ri   rH   )rq   Zoctet_resultrl   Zchar_resultÚresult_lengthr   r   r   Úget_data«  s
   	

zX509Extension.get_data©NN)rø   rY   rù   r¤   rÑ   rY   rú   rû   rü   rû   r   r^   rÏ   rÎ   r­   r÷   )rD   rE   rF   rG   rr   ÚpropertyrÆ   rM   Z	GEN_EMAILZGEN_DNSZGEN_URIr  Ú__annotations__r  r  r  r  r  r   r   r   r   r0     s    
 úEý



r0   zPCSR support in pyOpenSSL is deprecated. You should use the APIs in cryptography.c                   @  sŒ   e Zd ZdZd*dd„Zd+dd„Zed,d
d„ƒZd-dd„Zd.dd„Z	d/dd„Z
d0dd„Zd1dd„Zd2dd„Zd3d d!„Zd4d$d%„Zd5d'd(„Zd)S )6r2   zŽ
    An X.509 certificate signing requests.

    .. deprecated:: 24.2.0
       Use `cryptography.x509.CertificateSigningRequest` instead.
    r   r^   c                 C  s&   t  ¡ }t |t j¡| _|  d¡ d S rì   )rM   ZX509_REQ_newrQ   rV   ÚX509_REQ_freeÚ_reqÚset_version)rq   Úreqr   r   r   rr   Ç  s   zX509Req.__init__úx509.CertificateSigningRequestc                 C  ó   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_csrN)Úcryptography.x509r  Ú"_dump_certificate_request_internalr(   )rq   r  r‡   r   r   r   Úto_cryptographyÍ  s   
zX509Req.to_cryptographyÚ
crypto_reqc                 C  ó6   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Š   N)
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/   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|   rT   ©rq   r   rb   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`
        TN)r/   Ú__new__rM   ZX509_REQ_get_pubkeyr  r|   rT   rQ   rU   rV   r{   r…   r~   r   r   r   Ú
get_pubkeyý  s   
zX509Req.get_pubkeyÚversionrA   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`   ra   rM   ZX509_REQ_set_versionr  rT   )rq   r,  rb   r   r   r   r    s   
ÿzX509Req.set_versionc                 C  rª   )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`
        N)rM   ZX509_REQ_get_versionr  rp   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`
        N)
r1   r*  rM   ZX509_REQ_get_subject_namer  rw   rT   rQ   rU   Ú_ownerru   r   r   r   Úget_subject&  s
   
zX509Req.get_subjectÚ
extensionsúIterable[X509Extension]c                 C  s|   t jdtdd� t ¡ }t|tjkƒ t |tj	¡}|D ]}t
|tƒs'tdƒ‚t ||j¡ qt | 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_nullrT   rQ   rU   rV   Zsk_X509_EXTENSION_freer_   r0   ra   Zsk_X509_EXTENSION_pushrÿ   ZX509_REQ_add_extensionsr  )rq   r0  ÚstackÚextrå   r   r   r   Úadd_extensions<  s   ù

zX509Req.add_extensionsú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
        r2  r3  r4  c                 S  s   t  | t t jd¡¡S )Nrþ   )rM   Zsk_X509_EXTENSION_pop_freerQ   Ú	addressofZ_original_lib)Úxr   r   r   r   t  s    þz(X509Req.get_extensions.<locals>.<lambda>N)r7  r8  r9  rM   ZX509_REQ_get_extensionsr  rQ   rV   rÝ   Zsk_X509_EXTENSION_numr0   r*  ÚX509_EXTENSION_dupZsk_X509_EXTENSION_valuerþ   rÿ   rt   )rq   ÚextsZnative_exts_objrã   r;  r  r   r   r   Úget_extensions]  s&   	ù
þ

ÿzX509Req.get_extensionsÚ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…   ra   r}   rM   ÚEVP_get_digestbynamerÚ   rQ   rU   ZX509_REQ_signr  r|   rT   )rq   r   rC  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rtƒ  |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   N)r_   r/   r`   rM   ZX509_REQ_verifyr  r|   r¨   )rq   r   r¡   r   r   r   Úverify›  s   
zX509Req.verifyNry   )r   r  )r#  r  r   r2   ©r   r/   r   r^   ©r   r/   ©r,  rA   r   r^   r®   ©r   r1   ©r0  r1  r   r^   )r   r=  ©r   r/   rC  r   r   r^   )r   r/   r   r¤   )rD   rE   rF   rG   rr   r"  r¯   r'  r)  r+  r  r-  r/  r<  rB  rH  rJ  r   r   r   r   r2   »  s    









!
&r2   c                   @  sX  e Zd ZdZd`dd„Zedadd	„ƒZdbdd„Zedcdd„ƒZdddd„Z	dedd„Z
dfdd„Zdgdd„Zdhdd„Zdid!d"„Zdjd$d%„Zded&d'„Zdkd)d*„Zded+d,„Zdld.d/„Zdld0d1„Zdmd3d4„Zdnd7d8„Zdod9d:„Zdpd=d>„Zdqd?d@„ZdodAdB„ZdqdCdD„ZdrdFdG„ZdsdIdJ„ZdtdKdL„ZdudNdO„ZdtdPdQ„Z dvdSdT„Z!dedUdV„Z"dwdYdZ„Z#dxd]d^„Z$d_S )yr-   z
    An X.509 certificate.
    r   r^   c                 C  s:   t  ¡ }t|tjkƒ t |t j¡| _tƒ | _	tƒ | _
d S r   )rM   ZX509_newrT   rQ   rU   rV   Ú	X509_freerý   rn   Ú_issuer_invalidatorÚ_subject_invalidator)rq   r   r   r   r   rr   ¶  s
   zX509.__init__r   r   c                 C  s.   |   | ¡}t |tj¡|_tƒ |_tƒ |_|S r   )	r*  rQ   rV   rM   rQ  rý   rn   rR  rS  )rš   r   Úcertr   r   r   Ú_from_raw_x509_ptr¾  s
   
zX509._from_raw_x509_ptrúx509.Certificatec                 C  r  )z�
        Export as a ``cryptography`` certificate.

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

        .. versionadded:: 17.1.0
        r   )Úload_der_x509_certificateN)r   rW  r7   r(   )rq   rW  r‡   r   r   r   r"  Æ  s   
zX509.to_cryptographyÚcrypto_certc                 C  r$  )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%  N)
r_   r   ÚCertificater`   r„   rŠ   r˜   r™   r=   r(   )rš   rX  rŠ   r‡   r   r   r   r'  Ó  s
   
zX509.from_cryptographyr,  rA   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`   rT   rM   ZX509_set_versionrý   )rq   r,  r   r   r   r  ç  s   

zX509.set_versionc                 C  rª   )z˜
        Return the version number of the certificate.

        :return: The version number of the certificate.
        :rtype: :py:class:`int`
        N)rM   ZX509_get_versionrý   rp   r   r   r   r-  ö  ó   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`
        TN)r/   r*  rM   ZX509_get_pubkeyrý   r|   rQ   rU   r¨   rV   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`
        rI  rž   N)r_   r/   r`   rM   ZX509_set_pubkeyrý   r|   rT   r(  r   r   r   r)    s   
	zX509.set_pubkeyrC  r   c                 C  sp   t |tƒs	tdƒ‚|jrtdƒ‚|jstdƒ‚t t|ƒ¡}|t	j
kr't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`
        rI  zKey only has public partrD  rE  r   N)r_   r/   r`   r…   ra   r}   rM   rF  rÚ   rQ   rU   Z	X509_signrý   r|   rT   )rq   r   rC  Zevp_mdrG  r   r   r   rH    s   

z	X509.signrY   c                 C  sZ   t  | j¡}t d¡}t  |tjtj|¡ t  |d ¡}|t jkr%t	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 algorithmN)rM   ZX509_get0_tbs_sigalgrý   rQ   rR   ZX509_ALGOR_get0rU   rá   rÛ   ra   rj   Z
OBJ_nid2ln)rq   Zsig_algÚalgrº   r   r   r   Úget_signature_algorithm9  s   

zX509.get_signature_algorithmÚdigest_namec                 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`
        rE  zunsigned char[]zunsigned int[]rž   r   ó   :c                 S  s   g | ]}t |ƒ ¡ ‘qS r   )r   Úupper)r»   Úchr   r   r   Ú
<listcomp>e  s    
ÿÿzX509.digest.<locals>.<listcomp>N)rM   rF  rÚ   rQ   rU   ra   rR   ZEVP_MAX_MD_SIZErS   ZX509_digestrý   rT   r
  rH   )rq   r]  rC  rZ   r  Zdigest_resultr   r   r   rC  L  s   

ÿþÿzX509.digestc                 C  rª   )z�
        Return the hash of the X509 subject.

        :return: The hash of the subject.
        :rtype: :py:class:`int`
        N)rM   ZX509_subject_name_hashrý   rp   r   r   r   Úsubject_name_hashk  rZ  zX509.subject_name_hashÚserialc                 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 integerr3  NrÃ   zBIGNUM**r   rž   )r_   rA   r`   Úhexrâ   rQ   rR   rM   Z	BN_hex2bnrT   rU   ZBN_to_ASN1_INTEGERrŸ   rV   ZASN1_INTEGER_freeZX509_set_serialNumberrý   )rq   rc  Ú
hex_serialZhex_serial_bytesÚbignum_serialr¡   Úasn1_serialrb   r   r   r   Úset_serial_numbert  s   
	

zX509.set_serial_numberc              	   C  sp   t  | j¡}t  |tj¡}z$t  |¡}zt |¡}t|dƒ}|W t  	|¡ W t  
|¡ S t  	|¡ w t  
|¡ w )zx
        Return the serial number of this certificate.

        :return: The serial number.
        :rtype: int
        é   N)rM   ZX509_get_serialNumberrý   ZASN1_INTEGER_to_BNrQ   rU   Z	BN_bn2hexrj   rA   ré   rŸ   )rq   rg  rf  re  Zhexstring_serialrc  r   r   r   Úget_serial_number�  s   


þzX509.get_serial_numberÚamountc                 C  ó.   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)rq   rk  ZnotAfterr   r   r   Úgmtime_adj_notAfter¤  s   
zX509.gmtime_adj_notAfterc                 C  rl  )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``
        rm  N)r_   rA   r`   rM   ÚX509_getm_notBeforerý   ro  )rq   rk  Z	notBeforer   r   r   Úgmtime_adj_notBefore²  s   
zX509.gmtime_adj_notBeforer¤   c                 C  sT   |   ¡ }|du 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_notAfterra   rÅ   ÚdatetimeÚstrptimeÚtimezoneÚutcÚnowÚreplace)rq   Z
time_bytesZtime_stringZ	not_afterÚUTCÚutcnowr   r   r   Úhas_expired¿  s   
zX509.has_expiredÚwhichrI   c                 C  s   t || jƒƒS r   )rm   rý   )rq   r~  r   r   r   Ú_get_boundary_timeÐ  rÊ   zX509._get_boundary_timec                 C  ó   |   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
        N)r  rM   rq  rp   r   r   r   Úget_notBeforeÓ  ó   zX509.get_notBeforeúCallable[..., Any]r]   c                 C  s   t || jƒ|ƒS r   )rc   rý   )rq   r~  r]   r   r   r   Ú_set_boundary_timeà  s   zX509._set_boundary_timec                 C  ó   |   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``
        N)r„  rM   rq  ©rq   r]   r   r   r   Úset_notBeforeå  ó   zX509.set_notBeforec                 C  r€  )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
        N)r  rM   rn  rp   r   r   r   rt  ò  r‚  zX509.get_notAfterc                 C  r…  )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``
        N)r„  rM   rn  r†  r   r   r   Úset_notAfterÿ  rˆ  zX509.set_notAfterr1   c                 C  s0   t  t ¡}|| jƒ|_t|jtjkƒ | |_|S r   )r1   r*  rý   rw   rT   rQ   rU   r.  )rq   r~  rs   r   r   r   Ú	_get_name  s
   
zX509._get_namers   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ý   rw   rT   )rq   r~  rs   rb   r   r   r   Ú	_set_name  s   
zX509._set_namec                 C  ó   |   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`
        N)rŠ  rM   ZX509_get_issuer_namerR  rv   ru   r   r   r   Ú
get_issuer  ó   zX509.get_issuerrü   c                 C  ó   |   tj|¡ | j ¡  dS )zŸ
        Set the issuer of this certificate.

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

        :return: ``None``
        N)r‹  rM   ZX509_set_issuer_namerR  rx   )rq   rü   r   r   r   Ú
set_issuer-  ó   	zX509.set_issuerc                 C  rŒ  )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`
        N)rŠ  rM   ZX509_get_subject_namerS  rv   ru   r   r   r   r/  9  rŽ  zX509.get_subjectrú   c                 C  r�  )z£
        Set the subject of this certificate.

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

        :return: ``None``
        N)r‹  rM   ZX509_set_subject_namerS  rx   )rq   rú   r   r   r   Úset_subjectI  r‘  zX509.set_subjectc                 C  rª   )z¯
        Get the number of extensions on this certificate.

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

        .. versionadded:: 0.12
        N)rM   ZX509_get_ext_countrý   rp   r   r   r   Úget_extension_countU  s   	zX509.get_extension_countr0  r1  c                 C  sN   t jdtdd� |D ]}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``
        r2  r3  r4  r6  rÖ   rž   N)r7  r8  r9  r_   r0   ra   rM   ZX509_add_extrý   rÿ   rT   )rq   r0  r;  rå   r   r   r   r<  `  s   ù

ûzX509.add_extensionsÚindexr0   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
        r2  r3  r4  zextension index out of boundsN)r7  r8  r9  r0   r*  rM   ZX509_get_extrý   rÿ   rQ   rU   Ú
IndexErrorr@  rV   rþ   )rq   r”  r;  r  r   r   r   Úget_extensiony  s   ù

zX509.get_extensionNry   )r   r   r   r-   )r   rV  )rX  rV  r   r-   rM  r®   rL  rK  rP  r÷   )r]  r   r   rY   )rc  rA   r   r^   )rk  rA   r   r^   r­   )r~  r   r   rI   )r   rI   )r~  rƒ  r]   rY   r   r^   )r]   rY   r   r^   )r~  r   r   r1   )r~  r   rs   r1   r   r^   rN  )rü   r1   r   r^   )rú   r1   r   r^   rO  )r”  rA   r   r0   )%rD   rE   rF   rG   rr   r¯   rU  r"  r'  r  r-  r+  r)  rH  r\  rC  rb  rh  rj  rp  rr  r}  r  r�  r„  r‡  rt  r‰  rŠ  r‹  r�  r�  r/  r’  r“  r<  r–  r   r   r   r   r-   ±  sH    




	





	

















r-   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_CHECKr—  r  ZX509_V_FLAG_CRL_CHECK_ALLr˜  ZX509_V_FLAG_IGNORE_CRITICALr™  ZX509_V_FLAG_X509_STRICTrš  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   
 
r6   c                   @  sP   e Zd ZdZddd„Zddd	„Zddd„Zddd„Zd dd„Z	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   r^   c                 C  s   t  ¡ }t |t j¡| _d S r   )rM   ZX509_STORE_newrQ   rV   ZX509_STORE_freeÚ_store©rq   Ústorer   r   r   rr   À  s   zX509Store.__init__rT  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ý   rT   )rq   rT  r¢   r   r   r   Úadd_certÄ  s   
zX509Store.add_certÚcrlúx509.CertificateRevocationListc                 C  sv   t |tjƒr*d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Š   rX   r˜   r™   rM   Zd2i_X509_CRL_biorQ   rU   rT   rV   ZX509_CRL_freer`   ZX509_STORE_add_crlr¡  )rq   r¥  rŠ   rK   Zopenssl_crlr   r   r   Úadd_crlÚ  s   ÿzX509Store.add_crlÚflagsrA   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)rT   rM   ZX509_STORE_set_flagsr¡  )rq   r¨  r   r   r   Ú	set_flagsø  s   zX509Store.set_flagsÚvfy_timeúdatetime.datetimec                 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_newrQ   rV   ZX509_VERIFY_PARAM_freeZX509_VERIFY_PARAM_set_timeÚcalendarÚtimegmÚ	timetuplerT   ZX509_STORE_set1_paramr¡  )rq   rª  Úparamr   r   r   Úset_time  s   ÿzX509Store.set_timeNÚcafileúStrOrBytesPath | NoneÚcapathc                 C  sR   |du rt j}nt|ƒ}|du rt j}nt|ƒ}t | j||¡}|s'tƒ  dS 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)rQ   rU   Ú_path_bytesrM   ZX509_STORE_load_locationsr¡  r¨   )rq   r±  r³  Zload_resultr   r   r   Úload_locations(  s   #ÿ
ÿzX509Store.load_locationsry   )rT  r-   r   r^   )r¥  r¦  r   r^   )r¨  rA   r   r^   )rª  r«  r   r^   r   )r±  r²  r³  r²  r   r^   )
rD   rE   rF   rG   rr   r¤  r§  r©  r°  rµ  r   r   r   r   r3   ²  s    




ýr3   c                      s"   e Zd ZdZ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`
    Úmessager   Úerrorsú	list[Any]Úcertificater-   r   r^   c                   s   t ƒ  |¡ || _|| _d S r   )r²   rr   r·  r¹  )rq   r¶  r·  r¹  r¶   r   r   rr   e  s   
zX509StoreContextError.__init__)r¶  r   r·  r¸  r¹  r-   r   r^   )rD   rE   rF   rG   rr   rÐ   r   r   r¶   r   r5   \  s    r5   c                   @  sb   e Zd ZdZ	dddd„Zed dd„ƒZed!dd„ƒZd"dd„Zd#dd„Z	d$dd„Z
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`
    Nr£  r3   r¹  r-   ÚchainúSequence[X509] | Noner   r^   c                 C  s   || _ || _|  |¡| _d S r   )r¡  Ú_certÚ_build_certificate_stackÚ_chain)rq   r£  r¹  rº  r   r   r   rr   }  s   zX509StoreContext.__init__Úcertificatesc                 C  sž   d	dd„}| d u st | ƒdkrtjS t ¡ }t|tjkƒ t ||¡}| D ]'}t|tƒs0t	dƒ‚tt 
|j¡dkƒ t ||j¡dkrLt |j¡ tƒ  q%|S )
NÚsr   r   r^   c                 S  s8   t t | ¡ƒD ]}t | |¡}t |¡ qt | ¡ d S r   )rÝ   rM   Úsk_X509_numÚsk_X509_valuerQ  Úsk_X509_free)rÀ  rã   r?  r   r   r   Úcleanup‹  s   z:X509StoreContext._build_certificate_stack.<locals>.cleanupr   z+One of the elements is not an X509 instance)rÀ  r   r   r^   )rS   rQ   rU   rM   Zsk_X509_new_nullrT   rV   r_   r-   r`   ZX509_up_refrý   Zsk_X509_pushrQ  r¨   )r¿  rÄ  r:  rT  r   r   r   r½  ‡  s   

€z)X509StoreContext._build_certificate_stackÚ	store_ctxr   r5   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Õ   N)rQ   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-   rU  r5   )rÅ  r¶  r·  rý   r¼  Úpycertr   r   r   Ú_exception_from_context¥  s   	ÿÿüý


z(X509StoreContext._exception_from_contextc                 C  sj   t  ¡ }t|tjkƒ t |t j¡}t  || jj| j	j
| j¡}t|dkƒ t  |¡}|dkr3|  |¡‚|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   N)rM   ZX509_STORE_CTX_newrT   rQ   rU   rV   ZX509_STORE_CTX_freeZX509_STORE_CTX_initr¡  r¼  rý   r¾  ZX509_verify_certrÇ  )rq   rÅ  rd   r   r   r   Ú_verify_certificate¿  s   	ÿ

z$X509StoreContext._verify_certificatec                 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È  rp   r   r   r   Úverify_certificateâ  ró   z#X509StoreContext.verify_certificateú
list[X509]c                 C  st   |   ¡ }t |¡}t|tjkƒ g }tt |¡ƒD ]}t ||¡}t|tjkƒ t	 
|¡}| |¡ qt |¡ |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
        N)rÈ  rM   ZX509_STORE_CTX_get1_chainrT   rQ   rU   rÝ   rÁ  rÂ  r-   rU  rt   rÃ  )rq   rÅ  Z
cert_stackr¡   rã   rT  rÆ  r   r   r   Úget_verified_chainî  s   


z#X509StoreContext.get_verified_chainr   )r£  r3   r¹  r-   rº  r»  r   r^   )r¿  r»  r   r^   )rÅ  r   r   r5   rÏ   )r£  r3   r   r^   ry   )r   rË  )rD   rE   rF   rG   rr   Ústaticmethodr½  rÇ  rÈ  rÉ  rÊ  rÌ  r   r   r   r   r4   m  s    ü



r4   rœ   c                 C  sv   t |tƒr
| d¡}t|ƒ}| tkrt |tjtjtj¡}n| t	kr*t 
|tj¡}ntdƒ‚|tjkr6tƒ  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_ASN1N)r_   r   râ   rX   r)   rM   ZPEM_read_bio_X509rQ   rU   r(   Zd2i_X509_biora   r¨   r-   rU  )rœ   rH   rK   r   r   r   r   r=     s   



r=   rT  c                 C  sn   t ƒ }| tkrt ||j¡}n| tkrt ||j¡}n| tkr)t ||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ž   N)rX   r)   rM   ZPEM_write_bio_X509rý   r(   Zi2d_X509_bior*   ZX509_print_exra   rT   r[   )rœ   rT  rK   Úresult_coder   r   r   r7   (  s   
ÿr7   r   c                 C  sP   t ƒ }| tkrtj}n| tkrtj}ntdƒ‚|||jƒ}|dkr$tƒ  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ž   N)
rX   r)   rM   ZPEM_write_bio_PUBKEYr(   Zi2d_PUBKEY_biora   r|   r¨   r[   )rœ   r   rK   Z	write_biorÐ  r   r   r   r:   D  s   
r:   Úcipherræ   Ú
passphraseúPassphraseCallableT | Nonec           	   	   C  s  t ƒ }t|tƒstdƒ‚|dur)|du rtdƒ‚t t|ƒ¡}|tjkr(t	dƒ‚ntj}t
| |ƒ}| tkrIt ||j|tjd|j|j¡}| ¡  n4| tkrUt ||j¡}n(| tkryt |j¡tjkrft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Ï  )rX   r_   r/   r`   rM   ZEVP_get_cipherbynamerÚ   rQ   rU   ra   Ú_PassphraseHelperr)   ZPEM_write_bio_PrivateKeyr|   ÚcallbackÚcallback_argsÚraise_if_problemr(   Zi2d_PrivateKey_bior*   r«   r¥   rV   r¦   r§   Z	RSA_printrT   r[   )	rœ   r   rÑ  rÒ  rK   Z
cipher_objÚhelperrÐ  r    r   r   r   r9   ]  sJ   
ÿ
ÿ
ù
	ÿr9   c                   @  sP   e Zd Z		dddd„Zeddd„ƒZeddd„ƒZefd dd„Zd!dd„Z	dS )"rÔ  Frœ   rA   rÒ  rÓ  Ú	more_argsr¤   Útruncater   r^   c                 C  s4   |t kr|d urtdƒ‚|| _|| _|| _g | _d S )Nz0only FILETYPE_PEM key format supports encryption)r)   ra   Ú_passphraseÚ
_more_argsÚ	_truncateÚ	_problems)rq   rœ   rÒ  rÙ  rÚ  r   r   r   rr   £  s   ÿ
z_PassphraseHelper.__init__r   c                 C  s<   | j d u rtjS t| j tƒst| j ƒrt d| j¡S tdƒ‚)NZpem_password_cbú2Last argument must be a byte string or a callable.)	rÛ  rQ   rU   r_   rY   ÚcallablerÕ  Ú_read_passphraser`   rp   r   r   r   rÕ  ³  s   
ÿz_PassphraseHelper.callbackc                 C  s4   | j d u rtjS t| j tƒst| j ƒrtjS tdƒ‚)Nrß  )rÛ  rQ   rU   r_   rY   rà  r`   rp   r   r   r   rÖ  ¾  s   
ÿz_PassphraseHelper.callback_argsÚexceptionTypeútype[Exception]c                 C  s6   | j rzt|ƒ W n	 |y   Y nw | j  d¡‚d S rì   )rÞ  Ú_exception_from_error_queueÚpop)rq   râ  r   r   r   r×  É  s   ÿùz"_PassphraseHelper.raise_if_problemr  ÚsizeÚrwflagÚuserdatac              
   C  sÞ   zUt | jƒr| jr|  |||¡}n|  |¡}n
| jd usJ ‚| j}t|tƒs*tdƒ‚t|ƒ|kr>| jr:|d |… }ntdƒ‚tt|ƒƒD ]}|||d … ||< qDt|ƒW S  t	yn } z| j
 |¡ W Y d }~dS d }~ww )NzBytes expectedz+passphrase returned by callback is too longrž   r   )rà  rÛ  rÜ  r_   rY   ra   rS   rÝ  rÝ   Ú	ExceptionrÞ  rt   )rq   r  ræ  rç  rè  r¡   rã   Úer   r   r   rá  Ó  s.   

ÿ
€þz"_PassphraseHelper._read_passphraseN)FF)
rœ   rA   rÒ  rÓ  rÙ  r¤   rÚ  r¤   r   r^   rÏ   )râ  rã  r   r^   )
r  r   ræ  rA   rç  r   rè  r   r   rA   )
rD   rE   rF   rr   r  rÕ  rÖ  r.   r×  rá  r   r   r   r   rÔ  ¢  s    û


rÔ  ústr | bytesc                 C  s�   t |tƒr
| d¡}t|ƒ}| tkrt |tjtjtj¡}n| t	kr*t 
|tj¡}ntdƒ‚|tjkr6tƒ  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Î  TN)r_   r   râ   rX   r)   rM   ZPEM_read_bio_PUBKEYrQ   rU   r(   Zd2i_PUBKEY_biora   r¨   r/   r*  rV   r{   r|   r…   )rœ   rH   rK   Úevp_pkeyr   r   r   r   r@   ð  s    

ÿ

r@   c                 C  sœ   t |tƒr
| d¡}t|ƒ}t| |ƒ}| tkr't |tj	|j
|j¡}| ¡  n| tkr3t |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Î  N)r_   r   râ   rX   rÔ  r)   rM   ZPEM_read_bio_PrivateKeyrQ   rU   rÕ  rÖ  r×  r(   Zd2i_PrivateKey_biora   r¨   r/   r*  rV   r{   r|   )rœ   rH   rÒ  rK   rØ  rì  r   r   r   r   r?   	  s"   


ÿ


r?   r  c                 C  sn   t ƒ }| tkrt ||j¡}n| tkrt ||j¡}n| tkr)t ||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Ï  N)rX   r)   rM   ZPEM_write_bio_X509_REQr  r(   Zi2d_X509_REQ_bior*   ZX509_REQ_print_exra   rT   r[   )rœ   r  rK   rÐ  r   r   r   r8   ;	  s   ÿr8   rÈ   c                 C  sˆ   t |tƒr
| d¡}t|ƒ}| tkrt |tjtjtj¡}n| t	kr*t 
|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Î  N)r_   r   râ   rX   r)   rM   ZPEM_read_bio_X509_REQrQ   rU   r(   Zd2i_X509_REQ_biora   rT   r2   r*  rV   r  r  )rœ   rH   rK   r  Zx509reqr   r   r   r>   i	  s   


r>   )r   r   r   r   r   r   r   )rH   rI   r   r   )rK   r   r   rY   )r\   r   r]   rY   r   r^   )r]   rY   r   r   )rf   r   r   rI   )r   r¸   )rs   r   r   r°   )rœ   rA   rH   rY   r   r-   )rœ   rA   rT  r-   r   rY   )rœ   rA   r   r/   r   rY   r  )
rœ   rA   r   r/   rÑ  ræ   rÒ  rÓ  r   rY   )rœ   rA   rH   rë  r   r/   )rœ   rA   rH   rë  rÒ  rÓ  r   r/   )rœ   rA   r  r2   r   rY   )rœ   rA   rH   rY   r   r2   )oÚ
__future__r   r¬  ru  Ú	functoolsÚsysr†   r7  Úbase64r   Úcollections.abcr   r   r   r   r   r	   Úversion_infor   ÚTypeVarÚ_TZtyping_extensionsZcryptographyr   r   Z)cryptography.hazmat.primitives.asymmetricr   r   r   r   r    ZOpenSSL._utilr!   r"   rÚ   r#   rä  r$   rQ   r%   rM   r&   Z_make_assertr'   r´  Ú__all__rŽ   r�   r’   r”   r–   Z_PrivateKeyr�   r‘   r“   r•   r—   Z
_PublicKeyr€   rY   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¨   rT   rX   r[   rc   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   r9  r>   r&  r   r   r   r   Ú<module>   sö    


üÿüÿ


	

 Bgÿÿ Cÿ -ÿ s   m + 


üE
N%ý
) ø
 
ø