
    h)7                      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 n,ej"                  d	k  r ej&                  d
      ZdOd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j`                  ejb                  ejd                  f   Z3eejh                  ejj                  ejl                  ejn                  ejp                  f   Z9ee3e9f   Z:ee;ede;f   f   Z<e(jz                  Z>de?d<   e(j                  ZAde?d<   dZBe(j                  ZDde?d<   e(j                  ZFde?d<   e(j                  ZHde?d<   e(j                  ZJde?d<    G d d eK      ZL ee$eL      ZM e*eL      ZNdPdQd!ZOdRd"ZPdSd#ZQdTd$ZRdUd%ZS G d& d'      ZT G d( d)      ZU G d* d+      ZV ed,      dVd-       ZW ed.      dWd/       ZXej                   G d0 d1             ZZ ed2       G d3 d4             Z[ ed5       G d6 d7             Z\ G d8 d9      Z] G d: d;      Z^ G d< d=      Z_ G d> d?eK      Z` G d@ dA      ZadXdBZbdYdCZcdZdDZd	 	 d[	 	 	 	 	 	 	 	 	 d\dEZe G dF dG      Zfd]dHZg	 dP	 	 	 	 	 	 	 d^dIZhd_dJZieiZj ej$                  eiekd5eldKL       d`dMZmemZn ej$                  emekd5eldNL       y)a    )annotationsN)	b16encode)IterableSequence)partial)AnyCallableUnion)      )
deprecated)r      Tc                    d S )Nc                    | S N )fs    J/var/www/Befach/backend/env/lib/python3.12/site-packages/OpenSSL/crypto.py<lambda>zdeprecated.<locals>.<lambda>   s        r   )msgkwargss     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                      e Zd ZdZy)r.   z7
    An error occurred in an `OpenSSL.crypto` API.
    N)__name__
__module____qualname____doc__r   r   r   r.   r.   t   s    r   r.   c                T   | 8t        j                  t        j                               }t         j                  }n;t	        j
                  d|       }t        j                  |t        |             }|fdd}t        |t        j                  k7         t	        j                  ||      }|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.
    char[]c                ,    t        j                  |       S r   )_libBIO_free)biorefs     r   freez_new_mem_buf.<locals>.free   s    ==%%r   )rN   r   rO   r   returnr   )rL   BIO_new	BIO_s_memrM   _ffinewBIO_new_mem_buflen_openssl_assertNULLgc)bufferrN   rP   datas       r   _new_mem_bufr]   ~   s     ~ll4>>+,}}xx&)""4V5 '+ 	& C499$%
''#t
CJr   c                    t        j                  d      }t        j                  | |      }t        j                  |d   |      dd S )zO
    Copy the contents of an OpenSSL BIO object into a Python byte string.
    zchar**r   N)rT   rU   rL   BIO_get_mem_datar[   )rN   result_bufferbuffer_lengths      r   _bio_to_stringrb      s?     HHX&M))#}=M;;}Q'7::r   c                    t        |t              st        d      t        | t        j
                  k7         t        j                  | |      }|dk(  rt        d      y)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)	
isinstancebytes	TypeErrorrX   rT   rY   rL   ASN1_TIME_set_string
ValueError)boundarywhen
set_results      r   _set_asn1_timerl      sW     dE"455 H		)***8T:JQ)** r   c                    t        j                         }t        |t        j                  k7         t        j
                  |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.
    )rL   ASN1_TIME_newrX   rT   rY   rZ   ASN1_TIME_freerl   )rj   rets     r   _new_asn1_timerq      sH     


CC499$%
''#t**
+C3Jr   c                J   t        j                  d|       }t        j                  |      dk(  ryt        j                  |      t        j
                  k(  r(t        j                  t        j                  |            S t        j                  d      }t        j                  | |       t        |d   t         j                  k7         t        j                  d|d         }t        j                  |      }t        j                  |      }t        j                  |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**)rT   castrL   ASN1_STRING_lengthASN1_STRING_typeV_ASN1_GENERALIZEDTIMEstringASN1_STRING_get0_datarU   ASN1_TIME_to_generalizedtimerX   rY   ASN1_GENERALIZEDTIME_free)	timestampstring_timestampgeneralized_timestampstring_datastring_results        r   _get_asn1_timer      s     yy;/0A5./43N3NN{{4556FGHH $)A B)))5JK-a0DII=>99^5J15MN001ABK0&&'<Q'?@r   c                  $    e Zd ZddZddZddZy)_X509NameInvalidatorc                    g | _         y r   )_namesselfs    r   __init__z_X509NameInvalidator.__init__   s	    &(r   c                :    | j                   j                  |       y r   )r   appendr   names     r   addz_X509NameInvalidator.add   s    4 r   c                *    | j                   D ]  }|` y r   )r   _namer   s     r   clearz_X509NameInvalidator.clear   s    KKD
  r   NrQ   Noner   r1   rQ   r   )rE   rF   rG   r   r   r   r   r   r   r   r      s    )!r   r   c                  Z    e Zd ZdZdZdZddZddZedd       Z	ddZ
ddZdd	Zdd
Zy)r/   zD
    A class representing an DSA or RSA public key or key pair.
    FTc                    t        j                         }t        j                  |t         j                        | _        d| _        y )NF)rL   EVP_PKEY_newrT   rZ   EVP_PKEY_free_pkey_initializedr   pkeys     r   r   zPKey.__init__   s0      "WWT4#5#56
!r   c                    ddl m}m} | j                  r0t	        t
        |       }t        j                  t         ||            S t        t
        |       }t        j                  t         ||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(   typingrt   _Keyr9   )r   r   r   ders       r   to_cryptography_keyzPKey.to_cryptography_key  sZ    	

  5C;;t%8%=>>!-6C;;t%9#%MNNr   c                   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      r4t-        t.        |j1                  |j2                  |j4                              S |j7                  |j2                  |j8                   |             }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PublicFormat)rd   r   DSAPrivateKeyDSAPublicKeyr   EllipticCurvePrivateKeyEllipticCurvePublicKeyr   Ed25519PrivateKeyEd25519PublicKeyr   Ed448PrivateKeyEd448PublicKeyr    RSAPrivateKeyRSAPublicKeyrf   r   r   r   r   r   r@   r(   public_bytesDERSubjectPublicKeyInfoprivate_bytesPKCS8r?   )cls
crypto_keyr   r   r   r   r   s          r   from_cryptography_keyzPKey.from_cryptography_key  s(    !!  **))))((%%$$!!  
 233	
 	
   ))(($$  	
 "''LL,"C"C  **m11<>C #=#66r   c           	        t        |t              st        d      t        |t              st        d      |t        k(  r|dk  rt	        d      t        j                         }t        j                  |t
        j                        }t        j                  |t
        j                         t        j                         }t        j                  |||t        j                        }t        |dk(         t        j                   | j"                  |      }t        |dk(         d| _        y|t$        k(  r
t        j&                         }t        |t        j                  k7         t        j                  |t
        j(                        }t        j*                  ||t        j                  dt        j                  t        j                  t        j                        }t        |dk(         t        t        j,                  |      dk(         t        t        j.                  | j"                  |      dk(         d| _        yt1        d      )	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)rd   rA   rf   r,   rh   rL   BN_newrT   rZ   BN_freeBN_set_wordRSA_F4RSA_newRSA_generate_key_exrY   rX   EVP_PKEY_assign_RSAr   r+   DSA_newDSA_freeDSA_generate_parameters_exDSA_generate_keyEVP_PKEY_set1_DSAr.   r   )r   typebitsexponentr    resultr   ress           r   generate_keyzPKey.generate_keyU  s     $$566$$5668qy !9:: {{}Hwwx6HXt{{3,,.C--c4499MFFaK(--djj#>FFaK(" ! X,,.CC499,-''#t}}-C11T499aDIItyyC C1H%D11#6!;<D224::sCqHI ! *++r   c                   | j                   rt        d      t        j                  | j	                               t        j
                  k7  rt        d      t        j                  | j                        }t        j                  |t        j                        }t        j                  |      }|dk(  ryt                y)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   rf   rL   EVP_PKEY_typer   EVP_PKEY_RSAEVP_PKEY_get1_RSAr   rT   rZ   RSA_freeRSA_check_key_raise_current_error)r   r    r   s      r   checkz
PKey.check  s     -..diik*d.?.??EFF$$TZZ0ggc4==)##C(Q;r   c                @    t        j                  | j                        S )zT
        Returns the type of the key

        :return: The type of the key.
        )rL   EVP_PKEY_idr   r   s    r   r   z	PKey.type  s     

++r   c                @    t        j                  | j                        S )zh
        Returns the number of bits of the key

        :return: The number of bits of the key.
        )rL   EVP_PKEY_bitsr   r   s    r   r   z	PKey.bits  s     !!$**--r   Nr   )rQ   r   )r   r   rQ   r/   )r   rA   r   rA   rQ   r   rQ   boolrQ   rA   )rE   rF   rG   rH   r   r   r   r   classmethodr   r   r   r   r   r   r   r   r/   r/      sH     LL"
O. 77 77r6!p4,.r   r/   c                  v     e Zd ZdZdZd
 fdZedd       Zedd       Zedd       Z	ddZ
ddZdd	Z x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`
    Nc                N    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.
        )rd   r   super__ne__NotImplemented)r   other	__class__s     r   r   z_EllipticCurve.__ne__  s$     e^,7>%((r   c                     j                  t        j                  d      }t        j                  d|      }j                  ||       t	         f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  V   K   | ]   }j                  |j                         " y wr   )from_nidnid).0cr   r%   s     r   	<genexpr>z7_EllipticCurve._load_elliptic_curves.<locals>.<genexpr>  s      D3<<QUU+Ds   &))EC_get_builtin_curvesrT   rY   rU   set)r   r%   
num_curvesbuiltin_curvess   ``  r   _load_elliptic_curvesz$_EllipticCurve._load_elliptic_curves  sO     ..tyy!<
"6
C 	!!.*=D^DDDr   c                ^    | j                   | j                  |      | _         | 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.
        )_curvesr   )r   r%   s     r   _get_elliptic_curvesz#_EllipticCurve._get_elliptic_curves  s*     ;;33C8CK{{r   c           	     x     | ||t        j                  |j                  |            j                  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)rT   rx   
OBJ_nid2sndecode)r   r%   r   s      r   r   z_EllipticCurve.from_nid  s0     3T[[)<=DDWMNNr   c                .    || _         || _        || _        y)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)rL   _nidr   )r   r%   r   r   s       r   r   z_EllipticCurve.__init__   s     			r   c                "    d| j                   dS )Nz<Curve >r   r   s    r   __repr__z_EllipticCurve.__repr__  s    Q''r   c                    | j                   j                  | j                        }t        j                  |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.
        )rL   EC_KEY_new_by_curve_namer   rT   rZ   EC_KEY_free)r   keys     r   
_to_EC_KEYz_EllipticCurve._to_EC_KEY  s3     ii00;wwsD,,--r   r   r   rQ   r   )r%   r   rQ   set[_EllipticCurve])r%   r   r   rA   rQ   r   )r%   r   r   rA   r   strrQ   r   rQ   r	  rQ   r   )rE   rF   rG   rH   r   r   r   r   r   r   r   r  r  __classcell__r   s   @r   r   r     sc     G	 E E"   O O "(.r   r   zSget_elliptic_curves is deprecated. You should use the APIs in cryptography instead.c                 4    t         j                  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   rL   r   r   r   r<   r<     s      ..t44r   zRget_elliptic_curve is deprecated. You should use the APIs in cryptography instead.c                ^    t               D ]  }|j                  | k(  s|c S  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 name)r<   r   rh   )r   curves     r   r;   r;   2  s2      %&::L ' )4
00r   c                  d     e Zd ZdZddZd fdZddZddZddZddZ	ddZ
dd	Zdd
Z x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.
    c                    t        j                  |j                        }t        j                  |t         j
                        | _        y)z
        Create a new X509Name, copying the given X509Name instance.

        :param name: The name to copy.
        :type name: :py:class:`X509Name`
        N)rL   X509_NAME_dupr   rT   rZ   X509_NAME_freer   s     r   r   zX509Name.__init__b  s0     !!$**-''$(;(;<
r   c           	        |j                  d      rt        	| 	  ||      S t        |      t        ur#t        dt        |      j                  dd      t        j                  t        |            }|t        j                  k(  r	 t                t        d      t        t        j                  | j                               D ]  }t        j"                  | j                   |      }t        j$                  |      }t        j&                  |      }||k(  sSt        j(                  | j                   |      }t        j*                  |        n t-        |t              r|j/                  d      }t        j0                  | j                   |t        j2                  |ddd      }|st                y y # t        $ r Y t        d      w xY w)	N_z$attribute name must be string, not 'z.200'No such attributeutf-8r   )
startswithr   __setattr__r   r	  rf   rE   rL   OBJ_txt2nid_byte_string	NID_undefr   r.   AttributeErrorrangeX509_NAME_entry_countr   X509_NAME_get_entryX509_NAME_ENTRY_get_objectOBJ_obj2nidX509_NAME_delete_entryX509_NAME_ENTRY_freerd   encodeX509_NAME_add_entry_by_NIDMBSTRING_UTF8)
r   r   valuer   ientent_objent_nid
add_resultr   s
            r   r  zX509Name.__setattr__l  s   ??37&tU33 :S K((.a1 
 |D12$.. $& !!455 t11$**=>A**4::q9C55c:G&&w/Gg~11$**a@))#. ? eS!LL)E44JJT//B

  " )   !455s   	
F3 3	G	G	c                   t        j                  t        |            }|t         j                  k(  r	 t	                t        d      t        j                  | j                  |d      }|dk(  ryt        j                  | j                  |      }t        j                  |      }t        j                  d      }t        j                  ||      }t        |dk\         	 t        j                  |d   |      dd j!                  d      }t        j"                  |d          |S # t
        $ r Y t        d      w xY w# t        j"                  |d          w xY 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  )rL   r  r  r  r   r.   r   X509_NAME_get_index_by_NIDr   r#  X509_NAME_ENTRY_get_datarT   rU   ASN1_STRING_to_UTF8rX   r[   r   OPENSSL_free)	r   r   r   entry_indexentryr\   r`   data_lengthr   s	            r   __getattr__zX509Name.__getattr__  s2    |D12$.. $& !!45555djj#rJ"(([A,,U3!23..}dCq()	0[[q!1;?BIIF
 mA./-   !455* mA./s   
D# +D< #	D98D9<Ec                    t        |t              st        S t        j                  | j
                  |j
                        dk(  S Nr   rd   r1   r   rL   X509_NAME_cmpr   r   r   s     r   __eq__zX509Name.__eq__  s2    %*!!!!$**ekk:a??r   c                    t        |t              st        S t        j                  | j
                  |j
                        dk  S r<  r=  r?  s     r   __lt__zX509Name.__lt__  s2    %*!!!!$**ekk:Q>>r   c                    t        j                  dd      }t        j                  | j                  |t        |            }t        |t         j                  k7         dj                  t        j                  |      j                  d            S )z6
        String representation of an X509Name
        rJ   i   z<X509Name object '{}'>r  )rT   rU   rL   X509_NAME_oneliner   rW   rX   rY   formatrx   r   )r   r`   format_results      r   r  zX509Name.__repr__  sq     3/..JJs='9
 	23'..KK&--g6
 	
r   c                @    t        j                  | 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`
        )rL   X509_NAME_hashr   r   s    r   hashzX509Name.hash  s     ""4::..r   c                    t        j                  d      }t        j                  | j                  |      }t        |dk\         t        j                  |d   |      dd }t        j                  |d          |S )z
        Return the DER encoding of this name.

        :return: The DER encoded form of this name.
        :rtype: :py:class:`bytes`
        r2  r   N)rT   rU   rL   i2d_X509_NAMEr   rX   r[   r6  )r   r`   encode_resultr   s       r   r   zX509Name.der  si     !23**4::}E*+M!$4mDQG-*+r   c                   g }t        t        j                  | j                              D ]  }t        j                  | j                  |      }t        j
                  |      }t        j                  |      }t        j                  |      }t        j                  |      }t        j                  t        j                  |      t        j                  |            dd }|j                  t        j                  |      |f        |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!  rL   r"  r   r#  r$  r4  r%  r   rT   r[   ry   ru   r   rx   )	r   r   r,  r-  fnamefvalr   r   r+  s	            r   get_componentszX509Name.get_components  s     t11$**=>A**4::q9C33C8E005D""5)C??3'D KK**40$2I2I$2OE MM4;;t,e45 ?  r   r   )r   r	  r+  r   rQ   r   )r   r	  rQ   
str | Noner  r
  r   rQ   re   )rQ   zlist[tuple[bytes, bytes]])rE   rF   rG   rH   r   r  r:  r@  rB  r  rI  r   rP  r  r  s   @r   r1   r1   H  s8    0=%#N&P@?

/r   r1   zZX509Extension support in pyOpenSSL is deprecated. You should use the APIs in cryptography.c                      e Zd ZU dZ	 	 d	 	 	 	 	 	 	 	 	 	 	 ddZedd       Zej                  dej                  dej                  diZded	<   dd
ZddZddZddZddZy)r0   zu
    An X.509 v3 certificate extension.

    .. deprecated:: 23.3.0
       Use cryptography's X509 APIs instead.
    Nc                   t        j                  d      }t        j                  |t         j                  t         j                  t         j                  t         j                  d       t        j
                  |       |,t        |t              st        d      |j                  |_
        |,t        |t              st        d      |j                  |_        |rd|z   }t        j                  t         j                  |||      }|t         j                  k(  r
t                t        j                  |t        j                        | _        y)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,)rT   rU   rL   X509V3_set_ctxrY   X509V3_set_ctx_nodbrd   r-   rf   _x509issuer_certsubject_certX509V3_EXT_nconfr   rZ   X509_EXTENSION_free
_extension)r   	type_namecriticalr+  subjectissuerctx	extensions           r   r   zX509Extension.__init__  s    < hh}%
 	CDIItyy$))QO 	  % fd+ ABB$llCOgt, BCC&}}C !5(E))$))S)UK			! "'')T-E-EFr   c                f    t        j                  t        j                  | j                              S r   )rL   r%  X509_EXTENSION_get_objectr\  r   s    r   r   zX509Extension._nid\  s'    **4??;
 	
r   emailDNSURIztyping.ClassVar[dict[int, str]]	_prefixesc                $   t        j                  dt        j                  | j                              }t        j
                  |t        j                        }g }t        t        j                  |            D ]  }t        j                  ||      }	 | j                  |j                     }t        j                  |j                  j                  j                  |j                  j                  j                         d d  j#                  d      }|j%                  |dz   |z           dj/                  |      S # t&        $ rM t)               }t        j*                  ||       |j%                  t-        |      j#                  d             Y w xY w)NzGENERAL_NAMES*r  :z, )rT   rt   rL   X509V3_EXT_d2ir\  rZ   GENERAL_NAMES_freer!  sk_GENERAL_NAME_numsk_GENERAL_NAME_valuerh  r   r[   dia5r\   lengthr   r   KeyErrorr]   GENERAL_NAME_printrb   join)r   namespartsr,  r   labelr+  rN   s           r   _subjectAltNameStringz#X509Extension._subjectAltNameStringh  s2   		d11$//B
 t667t//67A--eQ7D
2tyy1 DFFJJOOTVVZZ5F5FG&/  US[501 8 yy  B"n''T2^C077@ABs   D99AFFc                   t         j                  | j                  k(  r| j                         S t	               }t        j
                  || j                  dd      }t        |dk7         t        |      j                  d      S )zF
        :return: a nice text representation of the extension
        r   r  )
rL   NID_subject_alt_namer   rx  r]   X509V3_EXT_printr\  rX   rb   r   )r   rN   print_results      r   __str__zX509Extension.__str__~  si     $$		1--//n,,S$//1aH)*c"))'22r   c                @    t        j                  | j                        S )zk
        Returns the critical field of this X.509 extension.

        :return: The critical field.
        )rL   X509_EXTENSION_get_criticalr\  r   s    r   get_criticalzX509Extension.get_critical  s     //@@r   c                    t        j                  | j                        }t        j                  |      }t        j                  |      }|t
        j                  k7  rt        j                  |      S y)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   UNDEF)rL   rd  r\  r%  r   rT   rY   rx   )r   objr   bufs       r   get_short_namezX509Extension.get_short_name  sV     ,,T__=s# ooc"$));;s##r   c                    t        j                  | j                        }t        j                  d|      }t        j
                  |      }t        j                  |      }t        j                  ||      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
        rs   N)rL   X509_EXTENSION_get_datar\  rT   rt   ry   ru   r[   )r   octet_resultr   char_resultresult_lengths        r   get_datazX509Extension.get_data  s^     33DOOD		.,?00?//>{{;6q99r   NN)r]  re   r^  r   r+  re   r_  X509 | Noner`  r  rQ   r   r  r
  r   rR  )rE   rF   rG   rH   r   propertyr   rL   	GEN_EMAILGEN_DNSGEN_URIrh  __annotations__rx  r}  r  r  r  r   r   r   r0   r0     s    
  $"CGCG CG 	CG
 CG CG 
CGJ 
 
 	ee2I.  ,3A,:r   r0   zPCSR support in pyOpenSSL is deprecated. You should use the APIs in cryptography.c                      e Zd ZdZddZddZe	 	 	 	 dd       ZddZddZ	ddZ
ddZdd	Zdd
ZddZddZddZy)r2   z
    An X.509 certificate signing requests.

    .. deprecated:: 24.2.0
       Use `cryptography.x509.CertificateSigningRequest` instead.
    c                    t        j                         }t        j                  |t         j                        | _        | j                  d       y r<  )rL   X509_REQ_newrT   rZ   X509_REQ_free_reqset_version)r   reqs     r   r   zX509Req.__init__  s6    !GGC!3!34	r   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_csr)cryptography.x509r  "_dump_certificate_request_internalr(   )r   r  r   s      r   to_cryptographyzX509Req.to_cryptography  s     	80E %%r   c                    t        |t        j                        st        d      ddlm} |j                  |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   )
rd   r   CertificateSigningRequestrf   r   r   r   r   "_load_certificate_request_internalr(   )r   
crypto_reqr   r   s       r   from_cryptographyzX509Req.from_cryptography  sD     *d&D&DECDDI%%hll31-EEr   c                t    t        j                  | j                  |j                        }t	        |dk(         y)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)rL   X509_REQ_set_pubkeyr  r   rX   r   r   rk   s      r   
set_pubkeyzX509Req.set_pubkey  s*     --diiD

a(r   c                @   t         j                  t               }t        j                  | j                        |_        t        |j
                  t        j                  k7         t        j                  |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__rL   X509_REQ_get_pubkeyr  r   rX   rT   rY   rZ   r   r   r   s     r   
get_pubkeyzX509Req.get_pubkey  sf     ||D!--dii8


dii/0WWTZZ););<
 r   c                    t        |t              st        d      |dk7  rt        d      t	        j
                  | j                  |      }t        |dk(         y)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)rd   rA   rf   rh   rL   X509_REQ_set_versionr  rX   )r   versionrk   s      r   r  zX509Req.set_version	  sU     '3'455a<K  ..tyy'B

a(r   c                @    t        j                  | 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`
        )rL   X509_REQ_get_versionr  r   s    r   get_versionzX509Req.get_version  s     ((33r   c                    t         j                  t               }t        j                  | j                        |_        t        |j
                  t        j                  k7         | |_	        |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  rL   X509_REQ_get_subject_namer  r   rX   rT   rY   _ownerr   s     r   get_subjectzX509Req.get_subject$  sM     )33DII>


dii/0 r   c                   t        j                  dt        d       t        j                         }t        |t        j                  k7         t        j                  |t        j                        }|D ]=  }t        |t              st        d      t        j                  ||j                         ? t        j                  | j                   |      }t        |dk(         y)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DeprecationWarningrL   sk_X509_EXTENSION_new_nullrX   rT   rY   rZ   sk_X509_EXTENSION_freerd   r0   rh   sk_X509_EXTENSION_pushr\  X509_REQ_add_extensionsr  )r   
extensionsstackextr0  s        r   add_extensionszX509Req.add_extensions:  s     	& 	
 //1*+t::;Cc=1 !NOO ''s~~>  11$))UC

a(r   c                   t        j                  dt        d       g }t        j                  | j
                        }t        j                  |d       }t        t        j                  |            D ]~  }t        j                  t              }t        j                  t        j                  ||            }t        j                  |t        j                        |_        |j!                  |        |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                r    t        j                  | t        j                  t         j                  d            S )Nr[  )rL   sk_X509_EXTENSION_pop_freerT   	addressof_original_lib)xs    r   r   z(X509Req.get_extensions.<locals>.<lambda>r  s'    d55t113HIr   )r  r  r  rL   X509_REQ_get_extensionsr  rT   rZ   r!  sk_X509_EXTENSION_numr0   r  X509_EXTENSION_dupsk_X509_EXTENSION_valuer[  r\  r   )r   extsnative_exts_objr,  r  rb  s         r   get_extensionszX509Req.get_extensions[  s     	& 	
 66tyyA''
 t11/BCA''6C//,,_a@I "WWY0H0HICNKK D r   c                J   |j                   rt        d      |j                  st        d      t        j                  t        |            }|t        j                  k(  rt        d      t        j                  | j                  |j                  |      }t        |dkD         y)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   rh   r   rL   EVP_get_digestbynamer  rT   rY   X509_REQ_signr  r   rX   )r   r   digest
digest_objsign_results        r   signzX509Req.sign  s     788  344..|F/CD
"455((DJJ
Ka(r   c                    t        |t              st        d      t        j                  | 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   )rd   r/   rf   rL   X509_REQ_verifyr  r   r   )r   r   r   s      r   verifyzX509Req.verify  sF     $%:;;%%dii<Q; "r   Nr   )rQ   x509.CertificateSigningRequest)r  r  rQ   r2   r   r/   rQ   r   rQ   r/   r  rA   rQ   r   r   rQ   r1   r  zIterable[X509Extension]rQ   r   )rQ   zlist[X509Extension]r   r/   r  r	  rQ   r   )r   r/   rQ   r   )rE   rF   rG   rH   r   r  r   r  r  r  r  r  r  r  r  r  r  r   r   r   r2   r2     sh    
& F7F	F F*
))"4,)B$L)0r   r2   c                  0   e Zd ZdZd#dZed$d       Zd%dZed&d       Zd'dZ	d(dZ
d)dZd*d	Zd+d
Zd,dZd-dZd(dZd.dZd(dZd/dZd/dZd0dZd1dZd2dZ	 	 	 	 	 	 d3dZd4dZd2dZd4dZd5dZd6dZd7dZd8dZd7dZ d9dZ!d(dZ"d:d Z#d;d!Z$y")<r-   z
    An X.509 certificate.
    c                    t        j                         }t        |t        j                  k7         t        j
                  |t         j                        | _        t               | _	        t               | _
        y r   )rL   X509_newrX   rT   rY   rZ   	X509_freerW  r   _issuer_invalidator_subject_invalidator)r   r   s     r   r   zX509.__init__  sJ    }}		)*WWT4>>2
#7#9 $8$:!r   c                    | j                  |       }t        j                  |t        j                        |_        t               |_        t               |_        |S r   )	r  rT   rZ   rL   r  rW  r   r  r  )r   r   certs      r   _from_raw_x509_ptrzX509._from_raw_x509_ptr  sA    {{3WWT4>>2
#7#9 $8$:!r   c                >    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  r  r7   r(   )r   r  r   s      r   r  zX509.to_cryptography  s     	@}d3(--r   c                    t        |t        j                        st        d      ddlm} |j                  |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  )
rd   r   Certificaterf   r   r   r   r   r=   r(   )r   crypto_certr   r   s       r   r  zX509.from_cryptography  sD     +t'7'78344I&&x||4s33r   c                    t        |t              st        d      t        t	        j
                  | j                  |      dk(         y)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)rd   rA   rf   rX   rL   X509_set_versionrW  )r   r  s     r   r  zX509.set_version  s8     '3'899--djj'BaGHr   c                @    t        j                  | j                        S )z
        Return the version number of the certificate.

        :return: The version number of the certificate.
        :rtype: :py:class:`int`
        )rL   X509_get_versionrW  r   s    r   r  zX509.get_version  s     $$TZZ00r   c                B   t         j                  t               }t        j                  | j                        |_        |j
                  t        j                  k(  r
t                t        j                  |j
                  t        j                        |_        d|_        |S )z{
        Get the public key of the certificate.

        :return: The public key.
        :rtype: :py:class:`PKey`
        T)r/   r  rL   X509_get_pubkeyrW  r   rT   rY   r   rZ   r   r   r   s     r   r  zX509.get_pubkey  sg     ||D!))$**5
::" "WWTZZ););<
 r   c                    t        |t              st        d      t        j                  | j
                  |j                        }t        |dk(         y)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)rd   r/   rf   rL   X509_set_pubkeyrW  r   rX   r  s      r   r  zX509.set_pubkey  s@     $%:;;))$**djjA

a(r   c                   t        |t              st        d      |j                  rt	        d      |j
                  st	        d      t        j                  t        |            }|t        j                  k(  rt	        d      t        j                  | j                  |j                  |      }t        |dkD         y)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 partr  r  r   N)rd   r/   rf   r   rh   r   rL   r  r  rT   rY   	X509_signrW  r   rX   )r   r   r  evp_mdr  s        r   r  z	X509.sign  s     $%:;;788  344**<+?@TYY455nnTZZVDa(r   c                   t        j                  | j                        }t        j                  d      }t        j
                  |t        j                  t        j                  |       t        j                  |d         }|t         j                  k(  rt        d      t        j                  t        j                  |            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)rL   X509_get0_tbs_sigalgrW  rT   rU   X509_ALGOR_get0rY   r%  r  rh   rx   
OBJ_nid2ln)r   sig_algalgr   s       r   get_signature_algorithmzX509.get_signature_algorithm7  s     ++DJJ7hh'(S$))TYY@s1v&$.. <=={{4??3/00r   c                   t        j                  t        |            }|t        j                  k(  rt        d      t        j                  dt         j                        }t        j                  dd      }t        |      |d<   t        j                  | j                  |||      }t        |dk(         dj                  t        j                  ||d         D cg c]  }t        |      j                          c}      S c c}w )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`
        r  zunsigned char[]zunsigned int[]r   r      :)rL   r  r  rT   rY   rh   rU   EVP_MAX_MD_SIZErW   X509_digestrW  rX   rt  r[   r   upper)r   digest_namer  r`   r  digest_resultchs          r   r  zX509.digestJ  s     **<+DETYY455!2D4H4HI!115}-a((JJ}
 	*+yy ++m]15EF "##%
 	
s    Dc                @    t        j                  | j                        S )z
        Return the hash of the X509 subject.

        :return: The hash of the subject.
        :rtype: :py:class:`int`
        )rL   X509_subject_name_hashrW  r   s    r   subject_name_hashzX509.subject_name_hashi  s     **4::66r   c                `   t        |t              st        d      t        |      dd }|j	                  d      }t        j                  d      }t        j                  ||      }t        |t
        j                  k7         t        j                  |d   t
        j                        }t        j                  |d          t        |t
        j                  k7         t        j                  |t        j                        }t        j                  | j                   |      }t        |dk(         y)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   )rd   rA   rf   hexr(  rT   rU   rL   	BN_hex2bnrX   rY   BN_to_ASN1_INTEGERr   rZ   ASN1_INTEGER_freeX509_set_serialNumberrW  )r   serial
hex_serialhex_serial_bytesbignum_serialr   asn1_serialrk   s           r   set_serial_numberzX509.set_serial_numberr  s     &#&788[_
%,,W5, /?@$))+,--mA.>		J]1%&tyy01ggk4+A+AB//

KH

a(r   c                   t        j                  | j                        }t        j                  |t        j
                        }	 t        j                  |      }	 t	        j                  |      }t        |d      }|t        j                  |       t        j                  |       S # t        j                  |       w xY w# t        j                  |       w xY w)zx
        Return the serial number of this certificate.

        :return: The serial number.
        :rtype: int
           )rL   X509_get_serialNumberrW  ASN1_INTEGER_to_BNrT   rY   	BN_bn2hexrx   rA   r6  r   )r   r  r  r  hexstring_serialr  s         r   get_serial_numberzX509.get_serial_number  s     00<//TYYG		(6J.#';;z#: -r2!!*-LL' !!*-LL's$   C "B( =C (B??C Cc                    t        |t              st        d      t        j                  | j
                        }t        j                  ||       y)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)rd   rA   rf   rL   X509_getm_notAfterrW  X509_gmtime_adj)r   amountnotAfters      r   gmtime_adj_notAfterzX509.gmtime_adj_notAfter  s>     &#&788**4::6Xv.r   c                    t        |t              st        d      t        j                  | j
                        }t        j                  ||       y)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``
        r'  N)rd   rA   rf   rL   X509_getm_notBeforerW  r)  )r   r*  	notBefores      r   gmtime_adj_notBeforezX509.gmtime_adj_notBefore  s>     &#&788,,TZZ8	Y/r   c                :   | j                         }|t        d      |j                  d      }t        j                  j	                  |d      }t        j
                  j                  }t        j                  j                  |      j                  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_notAfterrh   r   datetimestrptimetimezoneutcnowreplace)r   
time_bytestime_string	not_afterUTCutcnows         r   has_expiredzX509.has_expired  s     &&(
;<< ''0%%..{OL	##""&&s+3343@6!!r   c                8    t         || j                              S r   )r   rW  )r   whichs     r   _get_boundary_timezX509._get_boundary_time  s    eDJJ/00r   c                @    | j                  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
        )rB  rL   r.  r   s    r   get_notBeforezX509.get_notBefore  s     &&t'?'?@@r   c                :    t         || j                        |      S r   )rl   rW  )r   rA  rj   s      r   _set_boundary_timezX509._set_boundary_time  s     eDJJ/66r   c                B    | j                  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``
        )rF  rL   r.  r   rj   s     r   set_notBeforezX509.set_notBefore  s     &&t'?'?FFr   c                @    | j                  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
        )rB  rL   r(  r   s    r   r3  zX509.get_notAfter  s     &&t'>'>??r   c                B    | j                  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``
        )rF  rL   r(  rH  s     r   set_notAfterzX509.set_notAfter  s     &&t'>'>EEr   c                    t         j                  t               } || j                        |_        t	        |j                  t
        j                  k7         | |_        |S r   )r1   r  rW  r   rX   rT   rY   r  )r   rA  r   s      r   	_get_namezX509._get_name
  sE    )4::&


dii/0 r   c                    t        |t              st        d       || j                  |j                        }t        |dk(         y )Nzname must be an X509Namer   )rd   r1   rf   rW  r   rX   )r   rA  r   rk   s       r   	_set_namezX509._set_name  s8    $)6774::tzz2

a(r   c                z    | j                  t        j                        }| 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  rL   X509_get_issuer_namer  r   r   s     r   
get_issuerzX509.get_issuer  s1     ~~d778  $$T*r   c                x    | j                  t        j                  |       | j                  j	                          y)z
        Set the issuer of this certificate.

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

        :return: ``None``
        N)rP  rL   X509_set_issuer_namer  r   )r   r`  s     r   
set_issuerzX509.set_issuer+  s*     	t00&9  &&(r   c                z    | j                  t        j                        }| 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  rL   X509_get_subject_namer  r   r   s     r   r  zX509.get_subject7  s1     ~~d889!!%%d+r   c                x    | j                  t        j                  |       | j                  j	                          y)z
        Set the subject of this certificate.

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

        :return: ``None``
        N)rP  rL   X509_set_subject_namer  r   )r   r_  s     r   set_subjectzX509.set_subjectG  s*     	t117;!!'')r   c                @    t        j                  | j                        S )z
        Get the number of extensions on this certificate.

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

        .. versionadded:: 0.12
        )rL   X509_get_ext_countrW  r   s    r   get_extension_countzX509.get_extension_countS  s     &&tzz22r   c                    t        j                  dt        d       |D ]V  }t        |t              st        d      t        j                  | j                  |j                  d      }t        |dk(         X y)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  rd   r0   rh   rL   X509_add_extrW  r\  rX   )r   r  r  r0  s       r   r  zX509.add_extensions^  sg     	& 	
 Cc=1 !NOO**4::s~~rJJJ!O, r   c                   t        j                  dt        d       t        j	                  t              }t        j                  | j                  |      |_        |j                  t        j                  k(  rt        d      t        j                  |j                        }t        j                  |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  rL   X509_get_extrW  r\  rT   rY   
IndexErrorr  rZ   r[  )r   indexr  rb  s       r   get_extensionzX509.get_extensionw  s     	& 	
 ##M2**4::u=>>TYY&<==++CNN;	D,D,DE
r   Nr   )r   r   rQ   r-   )rQ   x509.Certificate)r  rf  rQ   r-   r  r   r  r  r  rR  )r  r	  rQ   re   )r  rA   rQ   r   )r*  rA   rQ   r   r   )rA  r   rQ   bytes | None)rQ   rg  )rA  zCallable[..., Any]rj   re   rQ   r   )rj   re   rQ   r   )rA  r   rQ   r1   )rA  r   r   r1   rQ   r   r  )r`  r1   rQ   r   )r_  r1   rQ   r   r  )rd  rA   rQ   r0   )%rE   rF   rG   rH   r   r   r  r  r  r  r  r  r  r  r  r  r  r  r%  r,  r0  r?  rB  rD  rF  rI  r3  rL  rN  rP  rS  rV  r  r[  r^  r  re  r   r   r   r-   r-     s    ;  . 4 4&I1))81&
>7)8((/0""1A7'7/47	7
G@F	) 
) 
*	3-2r   r-   c                  f   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j0                  Zded<   y)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)rE   rF   rG   rH   rL   X509_V_FLAG_CRL_CHECKri  r  X509_V_FLAG_CRL_CHECK_ALLrj  X509_V_FLAG_IGNORE_CRITICALrk  X509_V_FLAG_X509_STRICTrl  X509_V_FLAG_ALLOW_PROXY_CERTSrm  X509_V_FLAG_POLICY_CHECKrn  X509_V_FLAG_EXPLICIT_POLICYro  X509_V_FLAG_INHIBIT_MAPrp  X509_V_FLAG_CHECK_SS_SIGNATURErq  X509_V_FLAG_PARTIAL_CHAINrr  r   r   r   r6   r6     s     //Is/77M37;;OS;33K3!??s?55L#5;;OS;33K3"AAA77M37r   r6   c                  N    e Zd ZdZd	dZd
dZddZddZddZ	 d	 	 	 	 	 ddZ	y)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`.
    c                ~    t        j                         }t        j                  |t         j                        | _        y r   )rL   X509_STORE_newrT   rZ   X509_STORE_free_storer   stores     r   r   zX509Store.__init__  s(    ##%ggeT%9%9:r   c                    t        |t              s
t               t        j                  | j
                  |j                        }t        |dk(         y)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)rd   r-   rf   rL   X509_STORE_add_certr  rW  rX   )r   r  r   s      r   add_certzX509Store.add_cert  s<      $%+&&t{{DJJ?q!r   c                   t        |t        j                        rddlm} t        |j                  |j                              }t        j                  |t        j                        }t        |t        j                  k7         t        j                  |t        j                        }nt        d      t        t        j                   | j"                  |      dk7         y)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)rd   r   CertificateRevocationListr   r   r]   r   r   rL   d2i_X509_CRL_biorT   rY   rX   rZ   X509_CRL_freerf   X509_STORE_add_crlr  )r   crlr   rN   openssl_crls        r   add_crlzX509Store.add_crl  s     c499:Ms//=>C//TYY?KK49945''+t'9'9:C> 
 	//SAQFGr   c                \    t        t        j                  | j                  |      dk7         y)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)rX   rL   X509_STORE_set_flagsr  )r   flagss     r   	set_flagszX509Store.set_flags  s"    , 	11$++uEJKr   c                :   t        j                         }t        j                  |t         j                        }t        j
                  |t        j                  |j                                      t        t        j                  | j                  |      dk7         y)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)rL   X509_VERIFY_PARAM_newrT   rZ   X509_VERIFY_PARAM_freeX509_VERIFY_PARAM_set_timecalendartimegm	timetuplerX   X509_STORE_set1_paramr  )r   vfy_timeparams      r   set_timezX509Store.set_time  sm      **,t::;''8??8#5#5#78	
 	224;;F!KLr   Nc                    |t         j                  }nt        |      }|t         j                  }nt        |      }t        j                  | j
                  ||      }|st                yy)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)rT   rY   _path_bytesrL   X509_STORE_load_locationsr  r   )r   cafilecapathload_results       r   load_locationszX509Store.load_locations&  s`    F >YYF (F>YYF (F44KK
  " r   r   )r  r-   rQ   r   )r  zx509.CertificateRevocationListrQ   r   )r  rA   rQ   r   )r  zdatetime.datetimerQ   r   r   )r  StrOrBytesPath | Noner  r  rQ   r   )
rE   rF   rG   rH   r   r  r  r  r  r  r   r   r   r3   r3     sI    ;",H<L0M6 )-1#%1# &1# 
	1#r   r3   c                  4     e Zd ZdZ	 	 	 	 	 	 	 	 d fdZ x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`
    c                @    t         |   |       || _        || _        y r   )r   r   errorscertificate)r   messager  r  r   s       r   r   zX509StoreContextError.__init__c  s!     	!&r   )r  r	  r  z	list[Any]r  r-   rQ   r   )rE   rF   rG   rH   r   r  r  s   @r   r5   r5   Z  s2    ''$-'<@'	' 'r   r5   c                  v    e Zd ZdZ	 d
	 	 	 	 	 	 	 ddZe	 	 	 	 dd       Zedd       ZddZddZ	ddZ
dd	Zy)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`
    Nc                L    || _         || _        | j                  |      | _        y r   )r  _cert_build_certificate_stack_chain)r   r  r  chains       r   r   zX509StoreContext.__init__{  s$      
33E:r   c                   dd}| t        |       dk(  rt        j                  S t        j                         }t        |t        j                  k7         t        j                  ||      }| D ]  }t        |t              st        d      t        t        j                  |j                        dkD         t        j                  ||j                        dk  smt        j                  |j                         t                 |S )Nc                    t        t        j                  |             D ]-  }t        j                  | |      }t        j                  |       / t        j
                  |        y r   )r!  rL   sk_X509_numsk_X509_valuer  sk_X509_free)sr,  r  s      r   cleanupz:X509StoreContext._build_certificate_stack.<locals>.cleanup  sL     4++A./&&q!,q! 0 a r   r   z+One of the elements is not an X509 instance)r  r   rQ   r   )rW   rT   rY   rL   sk_X509_new_nullrX   rZ   rd   r-   rf   X509_up_refrW  sk_X509_pushr  r   )certificatesr  r  r  s       r   r  z)X509StoreContext._build_certificate_stack  s    	! 3|#4#999%%'*+w' DdD) MNND,,TZZ81<=  

3q8tzz*$& ! r   c                   t        j                  t        j                  t        j                  |                   j                  d      }t        j                  |       t        j                  |       |g}t        j                  |       }t        j                  |      }t        j                  |      }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  )rT   rx   rL   X509_verify_cert_error_stringX509_STORE_CTX_get_errorr   X509_STORE_CTX_get_error_depthX509_STORE_CTX_get_current_certX509_dupr-   r  r5   )	store_ctxr  r  rW  r  pycerts         r   _exception_from_contextz(X509StoreContext._exception_from_context  s     ++..--i8
 &/	 	 )))4//	:
 44Y?e$((/$Wff==r   c                   t        j                         }t        |t        j                  k7         t        j
                  |t         j                        }t        j                  || j                  j                  | j                  j                  | j                        }t        |dk(         t        j                  |      }|dk  r| j                  |      |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   )rL   X509_STORE_CTX_newrX   rT   rY   rZ   X509_STORE_CTX_freeX509_STORE_CTX_initr  r  rW  r  X509_verify_certr  )r   r  rp   s      r   _verify_certificatez$X509StoreContext._verify_certificate  s     ++-		TYY./GGIt'?'?@	&&t{{))4::+;+;T[[
 	q!##I.!8..y99r   c                    || _         y)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  s     r   	set_storezX509StoreContext.set_store  s     r   c                $    | j                          y)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  r   s    r   verify_certificatez#X509StoreContext.verify_certificate  s     	  "r   c                   | j                         }t        j                  |      }t        |t        j
                  k7         g }t        t        j                  |            D ]Z  }t        j                  ||      }t        |t        j
                  k7         t        j                  |      }|j                  |       \ t        j                  |       |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  rL   X509_STORE_CTX_get1_chainrX   rT   rY   r!  r  r  r-   r  r   r  )r   r  
cert_stackr   r,  r  r  s          r   get_verified_chainz#X509StoreContext.get_verified_chain  s     ,,.	 33I>

dii/0t''
34A%%j!4DDDII-.,,T2FMM&!	 5 	*%r   r   )r  r3   r  r-   r  Sequence[X509] | NonerQ   r   )r  r  rQ   r   )r  r   rQ   r5   r  )r  r3   rQ   r   r   )rQ   z
list[X509])rE   rF   rG   rH   r   staticmethodr  r  r  r  r  r  r   r   r   r4   r4   k  s    & (,	;; ; %	;
 
; +	 : > >20	
#r   r4   c                   t        |t              r|j                  d      }t        |      }| t        k(  rCt        j                  |t        j                  t        j                  t        j                        }n9| t        k(  r%t        j                  |t        j                        }nt        d      |t        j                  k(  r
t                t        j                  |      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)rd   r	  r(  r]   r)   rL   PEM_read_bio_X509rT   rY   r(   d2i_X509_biorh   r   r-   r  )r   r[   rN   r   s       r   r=   r=   	  s     &#w'
v
C|%%c499diiK		  dii0NOOtyy""4((r   c                ^   t               }| t        k(  r!t        j                  ||j                        }na| t
        k(  r!t        j                  ||j                        }n7| t        k(  r#t        j                  ||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   )r]   r)   rL   PEM_write_bio_X509rW  r(   i2d_X509_bior*   X509_print_exrh   rX   rb   )r   r  rN   result_codes       r   r7   r7   &  s     .C|--c4::>		''TZZ8		((djj!Q?
 	

 K1$%#r   c                    t               }| t        k(  rt        j                  }n%| t        k(  rt        j
                  }nt        d       |||j                        }|dk7  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   )
r]   r)   rL   PEM_write_bio_PUBKEYr(   i2d_PUBKEY_biorh   r   r   rb   )r   r   rN   	write_bior  s        r   r:   r:   B  sf     .C|--			''	NOOC,Ka#r   c           	        t               }t        |t              st        d      |I|t        d      t	        j
                  t        |            }|t        j                  k(  rt        d      t        j                  }t        | |      }| t        k(  rXt	        j                  ||j                  |t        j                  d|j                  |j                        }|j!                          n| t"        k(  r!t	        j$                  ||j                        }n| t&        k(  rt	        j(                  |j                        t        j*                  k7  rt        d      t        j,                  t	        j.                  |j                        t        j0                        }t	        j2                  ||d      }nt        d      t5        |dk7         t7        |      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 PKeyzDif 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  )r]   rd   r/   rf   rL   EVP_get_cipherbynamer  rT   rY   rh   _PassphraseHelperr)   PEM_write_bio_PrivateKeyr   callbackcallback_argsraise_if_problemr(   i2d_PrivateKey_bior*   r   r   rZ   r   r   	RSA_printrX   rb   )	r   r   cipher
passphraserN   
cipher_objhelperr  r    s	            r   r9   r9   [  s   * .CdD!-..8  ..|F/CD
"233YY
tZ0F|33JJIIOO  
 	!		--c4::>		DJJ'4+<+<<KLLggd,,TZZ8$--HnnS#q1
 	

 K1$%#r   c                  x    e Zd Z	 	 d	 	 	 	 	 	 	 	 	 ddZed	d       Zed	d       Zefd
dZ	 	 	 	 	 	 	 	 	 	 ddZ	y)r  c                h    |t         k7  r|t        d      || _        || _        || _        g | _        y )Nz0only FILETYPE_PEM key format supports encryption)r)   rh   _passphrase
_more_args	_truncate	_problems)r   r   r  	more_argstruncates        r   r   z_PassphraseHelper.__init__  s@     <J$:B  &#!*,r   c                    | j                   t        j                  S t        | j                   t              st        | j                         r t        j                  d| j                        S t        d      )Npem_password_cb2Last argument must be a byte string or a callable.)	r  rT   rY   rd   re   callabler  _read_passphraserf   r   s    r   r  z_PassphraseHelper.callback  s]    #99((%0HT=M=M4N==!2D4I4IJJD r   c                    | j                   t        j                  S t        | j                   t              st        | j                         rt        j                  S t        d      )Nr  )r  rT   rY   rd   re   r  rf   r   s    r   r  z_PassphraseHelper.callback_args  sO    #99((%0HT=M=M4N99D r   c                    | j                   r'	 t        |       | j                   j                  d      y # |$ r Y #w xY wr<  )r  _exception_from_error_queuepop)r   exceptionTypes     r   r  z"_PassphraseHelper.raise_if_problem  sF    >>+M: ..$$Q''  ! s   5 ==c                   	 t        | j                        r2| j                  r| j                  |||      }n,| j                  |      }n| j                  J | j                  }t        |t              st        d      t        |      |kD  r| j                  r|d | }nt        d      t        t        |            D ]  }|||dz    ||<    t        |      S # t        $ r%}| j                  j                  |       Y d }~yd }~ww xY w)NzBytes expectedz+passphrase returned by callback is too longr   r   )r  r  r  rd   re   rh   rW   r  r!  	Exceptionr  r   )r   r  sizerwflaguserdatar   r,  es           r   r  z"_PassphraseHelper._read_passphrase  s    	(()??!--dFHEF!--f5F''333))fe, !1226{T!>>#ET]F$E  3v;'AE*A (v; 	NN!!!$	s   CC 	D!DDN)FF)
r   rA   r  PassphraseCallableT | Noner  r   r  r   rQ   r   r  )r  ztype[Exception]rQ   r   )
r  r   r  rA   r  r   r  r   rQ   rA   )
rE   rF   rG   r   r  r  r  r.   r  r  r   r   r   r  r    s    
  -- /- 	-
 - 
-      AF (!+.:=	r   r  c                4   t        |t              r|j                  d      }t        |      }| t        k(  rCt        j                  |t        j                  t        j                  t        j                        }n9| t        k(  r%t        j                  |t        j                        }nt        d      |t        j                  k(  r
t                t        j                  t              }t        j                  |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)rd   r	  r(  r]   r)   rL   PEM_read_bio_PUBKEYrT   rY   r(   d2i_PUBKEY_biorh   r   r/   r  rZ   r   r   r   )r   r[   rN   evp_pkeyr   s        r   r@   r@     s     &#w'
v
C|++DIItyy
 
	&&sDII6NOO499<<D4#5#56DJDKr   c                N   t        |t              r|j                  d      }t        |      }t	        | |      }| t
        k(  rKt        j                  |t        j                  |j                  |j                        }|j                          n9| t        k(  r%t        j                  |t        j                        }nt        d      |t        j                  k(  r
t!                t"        j%                  t"              }t        j&                  |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  )rd   r	  r(  r]   r  r)   rL   PEM_read_bio_PrivateKeyrT   rY   r  r  r  r(   d2i_PrivateKey_biorh   r   r/   r  rZ   r   r   )r   r[   r  rN   r  r  r   s          r   r?   r?   	  s    " &#w'
v
CtZ0F|//FOOV-A-A
 	!		**3		:NOO499<<D4#5#56DJKr   c                ^   t               }| t        k(  r!t        j                  ||j                        }na| t
        k(  r!t        j                  ||j                        }n7| t        k(  r#t        j                  ||j                  dd      }nt        d      t        |dk7         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  )r]   r)   rL   PEM_write_bio_X509_REQr  r(   i2d_X509_REQ_bior*   X509_REQ_print_exrh   rX   rb   )r   r  rN   r  s       r   r8   r8   9	  s     .C|11#sxx@		++C:		,,S#((AqA
 	

 K1$%#r   r8   r   c                $   t        |t              r|j                  d      }t        |      }| t        k(  rCt        j                  |t        j                  t        j                  t        j                        }n9| t        k(  r%t        j                  |t        j                        }nt        d      t        |t        j                  k7         t        j                  t              }t        j                  |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  )rd   r	  r(  r]   r)   rL   PEM_read_bio_X509_REQrT   rY   r(   d2i_X509_REQ_biorh   rX   r2   r  rZ   r  r  )r   r[   rN   r  x509reqs        r   r>   r>   g	  s     &#w'
v
C|((diiDIIN		##C3NOOC499$%oog&G773 2 23GLNr   r>   )r   r	  r   objectrQ   zCallable[[_T], _T]r   )r[   rg  rQ   r   )rN   r   rQ   re   )ri   r   rj   re   rQ   r   )rj   re   rQ   r   )r|   r   rQ   rg  )rQ   r  )r   r	  rQ   r   )r   rA   r[   re   rQ   r-   )r   rA   r  r-   rQ   re   )r   rA   r   r/   rQ   re   r  )
r   rA   r   r/   r  rQ  r  r  rQ   re   )r   rA   r[   str | bytesrQ   r/   )r   rA   r[   r  r  r  rQ   r/   )r   rA   r  r2   rQ   re   )r   rA   r[   re   rQ   r2   )o
__future__r   r  r4  	functoolssysr   r  base64r   collections.abcr   r   r   r   r	   r
   version_infor   TypeVar_Ttyping_extensionscryptographyr   r   )cryptography.hazmat.primitives.asymmetricr   r   r   r   r    OpenSSL._utilr!   r"   r  r#   r  r$   rT   r%   rL   r&   _make_assertr'   r  __all__r   r   r   r   r   _PrivateKeyr   r   r   r   r   
_PublicKeyr   re   PassphraseCallableTSSL_FILETYPE_PEMr)   r  SSL_FILETYPE_ASN1r(   r*   r   r,   EVP_PKEY_DSAr+   EVP_PKEY_DHrB   EVP_PKEY_ECrC   r  r.   r   rX   r]   rb   rl   rq   r   r   r/   r   r<   r;   total_orderingr1   r0   r2   r-   r6   r3   r5   r4   r=   r7   r:   r9   r  r@   r?   r8   r  rE   r  r>   r  r   r   r   <module>r1     s   "    
    .   w#		B - $  ): 		 		
 [*$%E8CJ#778  ))c )++s + !!# !!!# !  I  :EB u%4;+2&:
 
~. ~.Bd. d.N 5	5 1	1$   D g: g:	g:T o o	odg gT8 8.g# g#T'I '"[ [|):88 -1	B
B
B B +	B
 BJK K\J .2&
&& +& 
	&R@ &> "   	 	#	@ &> "   	 	#	r   