
    vKg8                      % S SK Jr  S SKrS SKrS SKrS SKrS SKrS SKJr  S SK	J
r
Jr  S SKJr  S SKJr  S SKJrJrJr  S SKJrJr  S S	KJrJrJrJrJr  S S
KJr  S SKJr  S SKJ r!  S SKJ"r#  S SKJ$r%  S SKJ&r'  / SQr(\\RR                  \RT                  \RV                  \RX                  \RZ                  4   r.\\R^                  \R`                  \Rb                  \Rd                  \Rf                  4   r4\\.\44   r5\\6\7\4   r8\\7\S\74   4   r9\#Rt                  r;S\<S'   \#Rz                  r>S\<S'   Sr?\#R                  rAS\<S'   \#R                  rCS\<S'   \#R                  rES\<S'   \#R                  rGS\<S'    " S S\H5      rI\" \\I5      rJ\%" \I5      rKSLSMS jjrLSNS jrMSOS jrNSPS jrOSQS  jrP " S! S"5      rQ " S# S$5      rR " S% S&5      rSSRS' jrT\TrU\R                  " \T\WS(\XS)S*9  SSS+ jrY\R                  " \Y\WS,\XS-S*9  \R                   " S. S/5      5       r[ " S0 S15      r\\\r]\R                  " \\\WS2\XS1S*9   " S3 S45      r^\^r_\R                  " \^\WS5\XS4S*9   " S6 S75      r` " S8 S95      ra " S: S;5      rb " S< S=\H5      rc " S> S?5      rdSTS@ jreSUSA jrfSVSB jrg  SW         SXSC jjrh " SD SE5      riSYSF jrj SL       SZSG jjrkS[SH jrl\lrm\R                  " \l\WS5\XSIS*9  S\SJ jrn\nro\R                  " \n\WS5\XSKS*9  g)]    )annotationsN)	b16encode)IterableSequence)partial)PathLike)AnyCallableUnion)utilsx509)dsaeced448ed25519rsa)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                      \ rS rSrSrSrg)r   j   z/
An error occurred in an `OpenSSL.crypto` API.
 N)__name__
__module____qualname____firstlineno____doc____static_attributes__r7       N/var/www/highfloat_scraper/venv/lib/python3.13/site-packages/OpenSSL/crypto.pyr   r   j   s    r>   r   c                b   U c:  [         R                  " [         R                  " 5       5      n[         R                  nO?[        R
                  " SU 5      n[         R                  " U[        U 5      5      nU4SS jjn[        U[        R                  :g  5        [        R                  " X5      nU$ )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                .    [         R                  " U 5      $ N)_libBIO_free)biorefs     r?   free_new_mem_buf.<locals>.free   s    ==%%r>   )rF   r	   rG   r	   returnr	   )rD   BIO_new	BIO_s_memrE   _ffinewBIO_new_mem_buflen_openssl_assertNULLgc)bufferrF   rH   datas       r?   _new_mem_bufrV   t   s}     ~ll4>>+,}}xx&)""4V5 '+ 	& C499$%
''#
CJr>   c                    [         R                  " S5      n[        R                  " X5      n[         R                  " US   U5      SS $ )zG
Copy the contents of an OpenSSL BIO object into a Python byte string.
zchar**r   N)rM   rN   rD   BIO_get_mem_datarT   )rF   result_bufferbuffer_lengths      r?   _bio_to_stringr[      s=     HHX&M))#=M;;}Q'7::r>   c                    [        U[        5      (       d  [        S5      e[        U [        R
                  :g  5        [        R                  " X5      nUS:X  a  [        S5      eg)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	TypeErrorrQ   rM   rR   rD   ASN1_TIME_set_string
ValueError)boundarywhen
set_results      r?   _set_asn1_timere      sX     dE""455 H		)***8:JQ)** r>   c                    [         R                  " 5       n[        U[        R                  :g  5        [        R
                  " U[         R                  5      n[        X5        U$ )al  
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.
)rD   ASN1_TIME_newrQ   rM   rR   rS   ASN1_TIME_freere   )rc   rets     r?   _new_asn1_timerj      sF     


CC499$%
''#t**
+C3Jr>   c                b   [         R                  " SU 5      n[        R                  " U5      S:X  a  g[        R                  " U5      [        R
                  :X  a*  [         R                  " [        R                  " U5      5      $ [         R                  " S5      n[        R                  " X5        [        US   [         R                  :g  5        [         R                  " SUS   5      n[        R                  " U5      n[         R                  " U5      n[        R                  " US   5        U$ )aE  
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**)rM   castrD   ASN1_STRING_lengthASN1_STRING_typeV_ASN1_GENERALIZEDTIMEstringASN1_STRING_get0_datarN   ASN1_TIME_to_generalizedtimerQ   rR   ASN1_GENERALIZEDTIME_free)	timestampstring_timestampgeneralized_timestampstring_datastring_results        r?   _get_asn1_timerz      s     yy;/0A5./43N3NN{{4556FGHH $)A B)))K-a0DII=>99^5J15MN001ABK0&&'<Q'?@r>   c                  2    \ rS rSrSS jrSS jrSS jrSrg)	_X509NameInvalidator   c                    / U l         g rC   _namesselfs    r?   __init___X509NameInvalidator.__init__   s	    &(r>   c                :    U R                   R                  U5        g rC   )r   appendr   names     r?   add_X509NameInvalidator.add   s    4 r>   c                .    U R                    H  nU?M     g rC   )r   _namer   s     r?   clear_X509NameInvalidator.clear   s    KKD
  r>   r   NrJ   Noner   r"   rJ   r   )r8   r9   r:   r;   r   r   r   r=   r7   r>   r?   r|   r|      s    )!r>   r|   c                  p    \ rS rSrSrSrSrSS jrSS jr\	SS j5       r
SS jrSS	 jrSS
 jrSS jrSrg)r       z<
A class representing an DSA or RSA public key or key pair.
FTc                    [         R                  " 5       n[        R                  " U[         R                  5      U l        SU l        g )NF)rD   EVP_PKEY_newrM   rS   EVP_PKEY_free_pkey_initializedr   pkeys     r?   r   PKey.__init__   s0      "WWT4#5#56
!r>   c                    SSK JnJn  U R                  (       a  [	        [
        U 5      nU" U5      $ [        [
        U 5      nU" US5      $ )z
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),cryptography.hazmat.primitives.serializationr   r   _only_publicr+   r   r*   )r   r   r   ders       r?   to_cryptography_keyPKey.to_cryptography_key   sB    	

  5C&s++!-6C'T22r>   c                   [        U[        R                  [        R                  [        R
                  [        R                  [        R                  [        R                  [        R                  [        R                  [        R                  [        R                  4
5      (       d  [!        S5      eSSKJnJnJnJn  [        U[        R                  [        R                  [        R                  [        R                  [        R                  45      (       a4  [-        [.        UR1                  UR2                  UR4                  5      5      $ UR7                  UR2                  UR8                  U" 5       5      n[;        [.        U5      $ )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)r]   r   DSAPrivateKeyDSAPublicKeyr   EllipticCurvePrivateKeyEllipticCurvePublicKeyr   Ed25519PrivateKeyEd25519PublicKeyr   Ed448PrivateKeyEd448PublicKeyr   RSAPrivateKeyRSAPublicKeyr_   r   r   r   r   r   r1   r   public_bytesDERSubjectPublicKeyInfoprivate_bytesPKCS8r0   )cls
crypto_keyr   r   r   r   r   s          r?   from_cryptography_keyPKey.from_cryptography_key  s2    !!  **))))((%%$$!!  
 
 233	
 	
   ))(($$  	
 	
 "''LL,"C"C  **m11<>C #=#66r>   c           	        [        U[        5      (       d  [        S5      e[        U[        5      (       d  [        S5      eU[        :X  a  US::  a  [	        S5      e[
        R                  " 5       n[        R                  " U[
        R                  5      n[
        R                  " U[
        R                  5        [
        R                  " 5       n[
        R                  " XBU[        R                  5      n[        US:H  5        [
        R                   " U R"                  U5      n[        US:H  5        GOU[$        :X  Ga  [
        R&                  " 5       n[        U[        R                  :g  5        [        R                  " U[
        R(                  5      n[
        R*                  " Xb[        R                  S[        R                  [        R                  [        R                  5      n[        US:H  5        [        [
        R,                  " U5      S:H  5        [        [
        R.                  " U R"                  U5      S:H  5        O[1        S5      eSU l        g)	a  
Generate a key pair of the given type, with the given number of bits.

This generates a key "into" the this object.

:param type: The key type.
:type type: :py:data:`TYPE_RSA` or :py:data:`TYPE_DSA`
:param bits: The number of bits.
:type bits: :py:data:`int` ``>= 0``
:raises TypeError: If :py:data:`type` or :py:data:`bits` isn't
    of the appropriate type.
:raises ValueError: If the number of bits isn't an integer of
    the appropriate size.
:return: ``None``
ztype must be an integerzbits must be an integerr   zInvalid number of bits   zNo such key typeTN)r]   r2   r_   r   ra   rD   BN_newrM   rS   BN_freeBN_set_wordRSA_F4RSA_newRSA_generate_key_exrR   rQ   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_keyPKey.generate_keyK  s     $$$566$$$5668qy !9:: {{}Hwwx6HXt{{3,,.C--c499MFFaK(--djj#>FFaK(X,,.CC499,-''#t}}-C11499aDIItyyC C1H%D11#6!;<D224::sCqHI*++ r>   c                   U R                   (       a  [        S5      e[        R                  " U R	                  5       5      [        R
                  :w  a  [        S5      e[        R                  " U R                  5      n[        R                  " U[        R                  5      n[        R                  " U5      nUS:X  a  g[        5         g)a@  
Check the consistency of an RSA private key.

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

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

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

:raise TypeError: if the key is of a type which cannot be checked.
    Only RSA keys can currently be checked.
zpublic key onlyz'Only RSA keys can currently be checked.r   TN)r   r_   rD   EVP_PKEY_typer   EVP_PKEY_RSAEVP_PKEY_get1_RSAr   rM   rS   RSA_freeRSA_check_key_raise_current_error)r   r   r   s      r?   check
PKey.check  s     -..diik*d.?.??EFF$$TZZ0ggc4==)##C(Q;r>   c                B    [         R                  " U R                  5      $ )z<
Returns the type of the key

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

++r>   c                B    [         R                  " U R                  5      $ )zP
Returns the number of bits of the key

:return: The number of bits of the key.
)rD   EVP_PKEY_bitsr   r   s    r?   r   	PKey.bits  s     !!$**--r>   )r   r   Nr   )rJ   _Key)r   r   rJ   r    )r   r2   r   r2   rJ   r   rJ   boolrJ   r2   )r8   r9   r:   r;   r<   r   r   r   r   classmethodr   r   r   r   r   r=   r7   r>   r?   r    r       sG     LL"
3. 77 77r6!p4,.r>   r    c                     ^  \ rS rSrSrSrSU 4S jjr\SS j5       r\SS j5       r	\SS j5       r
SS jrSS	 jrSS
 jrSrU =r$ )_EllipticCurvei  aB  
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                X   > [        U[        5      (       a  [        TU ]  U5      $ [        $ )z
Implement cooperation with the right-hand side argument of ``!=``.

Python 3 seems to have dropped this cooperation in this very narrow
circumstance.
)r]   r   super__ne__NotImplemented)r   other	__class__s     r?   r   _EllipticCurve.__ne__  s'     e^,,7>%((r>   c                   ^ ^ TR                  [        R                  S5      n[        R                  " SU5      nTR                  X25        [	        U U4S jU 5       5      $ )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  Z   >#    U H!  nTR                  TUR                  5      v   M#     g 7frC   )from_nidnid).0cr   r   s     r?   	<genexpr>7_EllipticCurve._load_elliptic_curves.<locals>.<genexpr>  s#     D^3<<QUU++^s   (+)EC_get_builtin_curvesrM   rR   rN   set)r   r   
num_curvesbuiltin_curvess   ``  r?   _load_elliptic_curves$_EllipticCurve._load_elliptic_curves  sM     ..tyy!<
"6
C 	!!.=D^DDDr>   c                `    U R                   c  U R                  U5      U l         U R                   $ )z
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_curves#_EllipticCurve._get_elliptic_curves  s*     ;;33C8CK{{r>   c           	     x    U " X[         R                  " UR                  U5      5      R                  S5      5      $ )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)rM   rq   
OBJ_nid2sndecode)r   r   r   s      r?   r   _EllipticCurve.from_nid  s.     3T[[)<=DDWMNNr>   c                (    Xl         X l        X0l        g)aA  
: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rD   _nidr   )r   r   r   r   s       r?   r   _EllipticCurve.__init__  s     			r>   c                $    SU R                   < S3$ )Nz<Curve >r   r   s    r?   __repr___EllipticCurve.__repr__  s    Q''r>   c                    U R                   R                  U R                  5      n[        R                  " U[         R
                  5      $ )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.
)rD   EC_KEY_new_by_curve_namer  rM   rS   EC_KEY_free)r   keys     r?   
_to_EC_KEY_EllipticCurve._to_EC_KEY
  s3     ii00;wwsD,,--r>   r  r   r	   rJ   r   )r   r	   rJ   set[_EllipticCurve])r   r	   r   r2   rJ   r   )r   r	   r   r2   r   strrJ   r   rJ   r  rJ   r	   )r8   r9   r:   r;   r<   r   r   r   r   r   r   r   r  r  r=   __classcell__r   s   @r?   r   r     sh     G	 E E"   O O "(. .r>   r   c                 4    [         R                  [        5      $ )as  
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   rD   r7   r>   r?   r-   r-     s     ..t44r>   zSget_elliptic_curves is deprecated. You should use the APIs in cryptography instead.r-   r  c                d    [        5        H  nUR                  U :X  d  M  Us  $    [        SU 5      e)a8  
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)_get_elliptic_curves_internalr   ra   )r   curves     r?   r,   r,   2  s2     /0::L 1 )4
00r>   zRget_elliptic_curve is deprecated. You should use the APIs in cryptography instead.r,   c                     ^  \ rS rSrSrSS jrSU 4S jjrSS jrSS jrSS jr	SS jr
SS	 jrSS
 jrSS jrSrU =r$ )r"   iP  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                    [         R                  " UR                  5      n[        R                  " U[         R
                  5      U l        g)z~
Create a new X509Name, copying the given X509Name instance.

:param name: The name to copy.
:type name: :py:class:`X509Name`
N)rD   X509_NAME_dupr   rM   rS   X509_NAME_freer   s     r?   r   X509Name.__init__j  s0     !!$**-''$(;(;<
r>   c           	       > UR                  S5      (       a  [        T	U ]	  X5      $ [        U5      [        La#  [        S[        U5      R                  S S35      e[        R                  " [        U5      5      nU[        R                  :X  a   [        5         [        S5      e[        [        R                  " U R                   5      5       H  n[        R"                  " U R                   U5      n[        R$                  " U5      n[        R&                  " U5      nX7:X  d  MW  [        R(                  " U R                   U5      n[        R*                  " U5          O   [-        U[        5      (       a  UR/                  S5      n[        R0                  " U R                   U[        R2                  USSS5      nU(       d  [        5         g g ! [         a     GN@f = f)	N_z$attribute name must be string, not 'z.200'No such attributeutf-8r   )
startswithr   __setattr__r   r  r_   r8   rD   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_freer]   encodeX509_NAME_add_entry_by_NIDMBSTRING_UTF8)
r   r   valuer   ientent_objent_nid
add_resultr   s
            r?   r+  X509Name.__setattr__t  s   ??37&t33 :S K((.a1 
 |D12$.. $& !!455 t11$**=>A**4::q9C55c:G&&w/G~11$**a@))#. ? eS!!LL)E44JJT//B

  " )  s   
G 
GGc                   [         R                  " [        U5      5      nU[         R                  :X  a   [	        5         [        S5      e[         R                  " U R                  US5      nUS:X  a  g[         R                  " U R                  U5      n[         R                  " U5      n[        R                  " S5      n[         R                  " Xe5      n[        US:  5         [        R                  " US   U5      SS R!                  S5      n[         R"                  " US   5        U$ ! [
         a     Nf = f! [         R"                  " US   5        f = f)z
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(  )rD   r,  r-  r.  r   r   r/  X509_NAME_get_index_by_NIDr   r2  X509_NAME_ENTRY_get_datarM   rN   ASN1_STRING_to_UTF8rQ   rT   r  OPENSSL_free)	r   r   r   entry_indexentryrU   rY   data_lengthr   s	            r?   __getattr__X509Name.__getattr__  s$    |D12$.. $& !!45555djj#rJ"(([A,,U3!23..}Cq()	0[[q!1;?BIIF
 mA./-  * mA./s   
D, %,D< ,
D98D9<Ec                    [        U[        5      (       d  [        $ [        R                  " U R
                  UR
                  5      S:H  $ Nr   r]   r"   r   rD   X509_NAME_cmpr   r   r   s     r?   __eq__X509Name.__eq__  s5    %**!!!!$**ekk:a??r>   c                    [        U[        5      (       d  [        $ [        R                  " U R
                  UR
                  5      S:  $ rM  rN  rP  s     r?   __lt__X509Name.__lt__  s5    %**!!!!$**ekk:Q>>r>   c                &   [         R                  " SS5      n[        R                  " U R                  U[        U5      5      n[        U[         R                  :g  5        SR                  [         R                  " U5      R                  S5      5      $ )z&
String representation of an X509Name
rA   i   z<X509Name object '{}'>r(  )rM   rN   rD   X509_NAME_oneliner   rP   rQ   rR   formatrq   r  )r   rY   format_results      r?   r  X509Name.__repr__  sq     3/..JJs='9
 	23'..KK&--g6
 	
r>   c                B    [         R                  " U R                  5      $ )z
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`
)rD   X509_NAME_hashr   r   s    r?   hashX509Name.hash  s     ""4::..r>   c                    [         R                  " S5      n[        R                  " U R                  U5      n[        US:  5        [         R                  " US   U5      SS n[        R                  " US   5        U$ )zn
Return the DER encoding of this name.

:return: The DER encoded form of this name.
:rtype: :py:class:`bytes`
rB  r   N)rM   rN   rD   i2d_X509_NAMEr   rQ   rT   rF  )r   rY   encode_resultry   s       r?   r   X509Name.der  si     !23**4::}E*+M!$4mDQG-*+r>   c                .   / n[        [        R                  " U R                  5      5       H  n[        R                  " U R                  U5      n[        R
                  " U5      n[        R                  " U5      n[        R                  " U5      n[        R                  " U5      n[        R                  " [        R                  " U5      [        R                  " U5      5      SS nUR                  [        R                  " U5      U45        M     U$ )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)r0  rD   r1  r   r2  r3  rD  r4  r  rM   rT   rr   rn   r   rq   )	r   r   r;  r<  fnamefvalr   r   r:  s	            r?   get_components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:  r	   rJ   r   )r   r  rJ   
str | Noner  r  r   rJ   r^   )rJ   zlist[tuple[bytes, bytes]])r8   r9   r:   r;   r<   r   r+  rJ  rQ  rT  r  r]  r   rf  r=   r  r  s   @r?   r"   r"   P  s=    0=%#N&P@?

/ r>   r"   c                      \ rS rSr% Sr  S           SS jjr\SS j5       r\R                  S\R                  S\R                  S0rS	\S
'   SS jrSS jrSS jrSS jrSS jrSrg)r!   i  ze
An X.509 v3 certificate extension.

.. deprecated:: 23.3.0
   Use cryptography's X509 APIs instead.
Nc                   [         R                  " S5      n[        R                  " U[         R                  [         R                  [         R                  [         R                  S5        [        R
                  " U5        Ub1  [        U[        5      (       d  [        S5      eUR                  Ul
        Ub1  [        U[        5      (       d  [        S5      eUR                  Ul        U(       a  SU-   n[        R                  " [         R                  XaU5      nU[         R                  :X  a
  [        5         [         R                  " U[        R                  5      U l        g)ae  
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,)rM   rN   rD   X509V3_set_ctxrR   X509V3_set_ctx_nodbr]   r   r_   _x509issuer_certsubject_certX509V3_EXT_nconfr   rS   X509_EXTENSION_free
_extension)r   	type_namecriticalr:  subjectissuerctx	extensions           r?   r   X509Extension.__init__  s    < hh}%
 	CDIItyy$))QO 	  % fd++ ABB$llCOgt,, BCC&}}C !5(E))$))SUK			! "'')T-E-EFr>   c                j    [         R                  " [         R                  " U R                  5      5      $ rC   )rD   r4  X509_EXTENSION_get_objectrs  r   s    r?   r  X509Extension._nid`  s'    **4??;
 	
r>   emailDNSURIztyping.ClassVar[dict[int, str]]	_prefixesc                6   [         R                  " S[        R                  " U R                  5      5      n[         R
                  " U[        R                  5      n/ n[        [        R                  " U5      5       H  n[        R                  " X5      n U R                  UR                     n[         R                  " UR                  R                  R                  UR                  R                  R                   5      S S  R#                  S5      nUR%                  US-   U-   5        M     SR/                  U5      $ ! [&         aN    [)        5       n[        R*                  " Xt5        UR%                  [-        U5      R#                  S5      5         GM  f = f)NzGENERAL_NAMES*r(  :z, )rM   rm   rD   X509V3_EXT_d2irs  rS   GENERAL_NAMES_freer0  sk_GENERAL_NAME_numsk_GENERAL_NAME_valuer  r   rT   dia5rU   lengthr  r   KeyErrorrV   GENERAL_NAME_printr[   join)r   namespartsr;  r   labelr:  rF   s           r?   _subjectAltNameString#X509Extension._subjectAltNameStringl  s1   		d11$//B
 t667t//67A--e7D
2tyy1 DFFJJOOTVVZZ5F5FG&/  US[501 8 yy  B"n''2^C077@AABs   E  AFFc                   [         R                  U R                  :X  a  U R                  5       $ [	        5       n[         R
                  " XR                  SS5      n[        US:g  5        [        U5      R                  S5      $ )z6
:return: a nice text representation of the extension
r   r(  )
rD   NID_subject_alt_namer  r  rV   X509V3_EXT_printrs  rQ   r[   r  )r   rF   print_results      r?   __str__X509Extension.__str__  sg     $$		1--//n,,S//1aH)*c"))'22r>   c                B    [         R                  " U R                  5      $ )zS
Returns the critical field of this X.509 extension.

:return: The critical field.
)rD   X509_EXTENSION_get_criticalrs  r   s    r?   get_criticalX509Extension.get_critical  s     //@@r>   c                    [         R                  " U R                  5      n[         R                  " U5      n[         R                  " U5      nU[
        R                  :w  a  [
        R                  " U5      $ g)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)rD   r|  rs  r4  r  rM   rR   rq   )r   objr   bufs       r?   get_short_nameX509Extension.get_short_name  sV     ,,T__=s# ooc"$));;s##r>   c                    [         R                  " U R                  5      n[        R                  " SU5      n[         R
                  " U5      n[         R                  " U5      n[        R                  " X45      S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
rl   N)rD   X509_EXTENSION_get_datars  rM   rm   rr   rn   rT   )r   octet_resultry   char_resultresult_lengths        r?   get_dataX509Extension.get_data  s\     33DOOD		.,?00?//>{{;6q99r>   )rs  NN)rt  r^   ru  r   r:  r^   rv  X509 | Nonerw  r  rJ   r   r  r  r   ri  )r8   r9   r:   r;   r<   r   propertyr  rD   	GEN_EMAILGEN_DNSGEN_URIr  __annotations__r  r  r  r  r  r=   r7   r>   r?   r!   r!     s      $"CGCG CG 	CG
 CG CG 
CGJ 
 
 	ee2I.  ,3A,:r>   r!   zZX509Extension support in pyOpenSSL is deprecated. You should use the APIs in cryptography.c                      \ rS rSrSrSS jrSS jr\    SS j5       rSS jr	SS jr
SS jrSS	 jrSS
 jr    SS jrSS jrSS jrSS jrSrg)r#   i  z~
An X.509 certificate signing requests.

.. deprecated:: 24.2.0
   Use `cryptography.x509.CertificateSigningRequest` instead.
c                    [         R                  " 5       n[        R                  " U[         R                  5      U l        U R                  S5        g rM  )rD   X509_REQ_newrM   rS   X509_REQ_free_reqset_version)r   reqs     r?   r   X509Req.__init__  s6    !GGC!3!34	r>   c                >    SSK Jn  [        [        U 5      nU" U5      $ )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_cryptographyX509Req.to_cryptography  s     	80E %%r>   c                    [        U[        R                  5      (       d  [        S5      eSSKJn  UR                  UR                  5      n[        [        U5      $ )z
Construct based on a ``cryptography`` *crypto_req*.

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

:rtype: X509Req

.. versionadded:: 17.1.0
z%Must be a certificate signing requestr   r   )
r]   r   CertificateSigningRequestr_   r   r   r   r   "_load_certificate_request_internalr   )r   
crypto_reqr   r   s       r?   from_cryptographyX509Req.from_cryptography  sG     *d&D&DEECDDI%%hll31-EEr>   c                v    [         R                  " U R                  UR                  5      n[	        US:H  5        g)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)rD   X509_REQ_set_pubkeyr  r   rQ   r   r   rd   s      r?   
set_pubkeyX509Req.set_pubkey  s*     --diiD

a(r>   c                D   [         R                  [         5      n[        R                  " U R                  5      Ul        [        UR
                  [        R                  :g  5        [        R                  " UR
                  [        R                  5      Ul        SUl        U$ )zk
Get the public key of the certificate signing request.

:return: The public key.
:rtype: :py:class:`PKey`
T)r    __new__rD   X509_REQ_get_pubkeyr  r   rQ   rM   rR   rS   r   r   r   s     r?   
get_pubkeyX509Req.get_pubkey  sf     ||D!--dii8


dii/0WWTZZ););<
 r>   c                    [        U[        5      (       d  [        S5      eUS:w  a  [        S5      e[        R
                  " U R                  U5      n[        US:H  5        g)z
Set the version subfield (RFC 2986, section 4.1) of the certificate
request.

:param int version: The version number.
:return: ``None``
zversion must be an intr   z9Invalid version. The only valid version for X509Req is 0.r   N)r]   r2   r_   ra   rD   X509_REQ_set_versionr  rQ   )r   versionrd   s      r?   r  X509Req.set_version  sX     '3''455a<K  ..tyy'B

a(r>   c                B    [         R                  " U R                  5      $ )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`
)rD   X509_REQ_get_versionr  r   s    r?   get_versionX509Req.get_version'  s     ((33r>   c                    [         R                  [         5      n[        R                  " U R                  5      Ul        [        UR
                  [        R                  :g  5        Xl	        U$ )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`
)
r"   r  rD   X509_REQ_get_subject_namer  r   rQ   rM   rR   _ownerr   s     r?   get_subjectX509Req.get_subject1  sK     )33DII>


dii/0 r>   c                   [         R                  " S[        SS9  [        R                  " 5       n[        U[        R                  :g  5        [        R                  " U[        R                  5      nU HC  n[        U[        5      (       d  [        S5      e[        R                  " X#R                  5        ME     [        R                  " U R                   U5      n[        US:H  5        g)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DeprecationWarningrD   sk_X509_EXTENSION_new_nullrQ   rM   rR   rS   sk_X509_EXTENSION_freer]   _X509ExtensionInternalra   sk_X509_EXTENSION_pushrs  X509_REQ_add_extensionsr  )r   
extensionsstackextr?  s        r?   add_extensionsX509Req.add_extensionsG  s     	& 	
 //1*+t::;Cc#9:: !NOO ''~~>  11$))UC

a(r>   c                   [         R                  " S[        SS9  / n[        R                  " U R
                  5      n[        R                  " US 5      n[        [        R                  " U5      5       H  n[        R                  [        5      n[        R                  " [        R                  " X#5      5      n[        R                  " U[        R                  5      Ul        UR!                  U5        M     U$ )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                v    [         R                  " U [        R                  " [         R                  S5      5      $ )Nrr  )rD   sk_X509_EXTENSION_pop_freerM   	addressof_original_lib)xs    r?   <lambda>(X509Req.get_extensions.<locals>.<lambda>  s'    d55t113HIr>   )r  r  r  rD   X509_REQ_get_extensionsr  rM   rS   r0  sk_X509_EXTENSION_numr  r  X509_EXTENSION_dupsk_X509_EXTENSION_valuerr  rs  r   )r   extsnative_exts_objr;  r  ry  s         r?   get_extensionsX509Req.get_extensionsj  s     	& 	
 66tyyA''
 t11/BCA(001GHC//,,_@I "WWY0H0HICNKK D r>   c                d   UR                   (       a  [        S5      eUR                  (       d  [        S5      e[        R                  " [        U5      5      nU[        R                  :X  a  [        S5      e[        R                  " U R                  UR                  U5      n[        US:  5        g)a!  
Sign the certificate signing request with this key and digest type.

:param pkey: The key pair to sign with.
:type pkey: :py:class:`PKey`
:param digest: The name of the message digest to use for the signature,
    e.g. :py:data:`"sha256"`.
:type digest: :py:class:`str`
:return: ``None``
zKey has only public partKey is uninitializedNo such digest methodr   N)r   ra   r   rD   EVP_get_digestbynamer-  rM   rR   X509_REQ_signr  r   rQ   )r   r   digest
digest_objsign_results        r?   signX509Req.sign  s     788  344..|F/CD
"455((DJJ
Ka(r>   c                    [        U[        5      (       d  [        S5      e[        R                  " U R
                  UR                  5      nUS::  a
  [        5         U$ )a  
Verifies the signature on this certificate signing request.

:param PKey key: A public key.

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

:raises OpenSSL.crypto.Error: If the signature is invalid or there is a
    problem verifying the signature.
pkey must be a PKey instancer   )r]   r    r_   rD   X509_REQ_verifyr  r   r   )r   r   r   s      r?   verifyX509Req.verify  sI     $%%:;;%%dii<Q; "r>   )r  Nr   )rJ   x509.CertificateSigningRequest)r  r  rJ   r#   r   r    rJ   r   rJ   r    r  r2   rJ   r   r   rJ   r"   r  z Iterable[_X509ExtensionInternal]rJ   r   )rJ   zlist[_X509ExtensionInternal]r   r    r  r  rJ   r   )r   r    rJ   r   )r8   r9   r:   r;   r<   r   r  r   r  r  r  r  r  r  r  r  r  r  r=   r7   r>   r?   r#   r#     sx    & F7F	F F*
))"4,!):!)	!)F$L)0r>   r#   zPCSR support in pyOpenSSL is deprecated. You should use the APIs in cryptography.c                     \ rS rSrSrS%S jr\S&S j5       rS'S jr\S(S j5       r	S)S jr
S*S jrS+S	 jrS,S
 jrS-S jrS.S jrS/S jrS.S jrS0S jrS*S jrS1S jrS1S jrS2S jrS3S jrS4S jr      S5S jrS6S jrS4S jrS6S jrS7S jrS8S jrS9S jrS:S jr S9S jr!S;S jr"S*S  jr#    S<S! jr$S=S" jr%S#r&g$)>r   i  z
An X.509 certificate.
c                    [         R                  " 5       n[        U[        R                  :g  5        [        R
                  " U[         R                  5      U l        [        5       U l	        [        5       U l
        g rC   )rD   X509_newrQ   rM   rR   rS   	X509_freern  r|   _issuer_invalidator_subject_invalidator)r   r   s     r?   r   X509.__init__  sJ    }}		)*WWT4>>2
#7#9 $8$:!r>   c                    U R                  U 5      n[        R                  " U[        R                  5      Ul        [        5       Ul        [        5       Ul        U$ rC   )	r  rM   rS   rD   r  rn  r|   r  r  )r   r   certs      r?   _from_raw_x509_ptrX509._from_raw_x509_ptr  sA    {{3WWT4>>2
#7#9 $8$:!r>   c                >    SSK Jn  [        [        U 5      nU" U5      $ )zp
Export as a ``cryptography`` certificate.

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

.. versionadded:: 17.1.0
r   )load_der_x509_certificate)r  r!  r(   r   )r   r!  r   s      r?   r  X509.to_cryptography  s     	@}d3(--r>   c                    [        U[        R                  5      (       d  [        S5      eSSKJn  UR                  UR                  5      n[        [        U5      $ )z
Construct based on a ``cryptography`` *crypto_cert*.

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

:rtype: X509

.. versionadded:: 17.1.0
zMust be a certificater   r  )
r]   r   Certificater_   r   r   r   r   r.   r   )r   crypto_certr   r   s       r?   r  X509.from_cryptography  sG     +t'7'788344I&&x||4s33r>   c                    [        U[        5      (       d  [        S5      e[        [        R
                  " U R                  U5      S:H  5        g)z
Set the version number of the certificate. Note that the
version value is zero-based, eg. a value of 0 is V1.

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

:return: ``None``
zversion must be an integerr   N)r]   r2   r_   rQ   rD   X509_set_versionrn  )r   r  s     r?   r  X509.set_version  s;     '3''899--djj'BaGHr>   c                B    [         R                  " U R                  5      $ )zx
Return the version number of the certificate.

:return: The version number of the certificate.
:rtype: :py:class:`int`
)rD   X509_get_versionrn  r   s    r?   r  X509.get_version  s     $$TZZ00r>   c                H   [         R                  [         5      n[        R                  " U R                  5      Ul        UR
                  [        R                  :X  a
  [        5         [        R                  " UR
                  [        R                  5      Ul        SUl        U$ )z[
Get the public key of the certificate.

:return: The public key.
:rtype: :py:class:`PKey`
T)r    r  rD   X509_get_pubkeyrn  r   rM   rR   r   rS   r   r   r   s     r?   r  X509.get_pubkey  sg     ||D!))$**5
::" "WWTZZ););<
 r>   c                    [        U[        5      (       d  [        S5      e[        R                  " U R
                  UR                  5      n[        US:H  5        g)z}
Set the public key of the certificate.

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

:return: :py:data:`None`
r
  r   N)r]   r    r_   rD   X509_set_pubkeyrn  r   rQ   r  s      r?   r  X509.set_pubkey)  sC     $%%:;;))$**djjA

a(r>   c                   [        U[        5      (       d  [        S5      eUR                  (       a  [	        S5      eUR
                  (       d  [	        S5      e[        R                  " [        U5      5      nU[        R                  :X  a  [	        S5      e[        R                  " U R                  UR                  U5      n[        US:  5        g)z
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)r]   r    r_   r   ra   r   rD   r  r-  rM   rR   	X509_signrn  r   rQ   )r   r   r  evp_mdr  s        r?   r  	X509.sign8  s     $%%:;;788  344**<+?@TYY455nnTZZVDa(r>   c                   [         R                  " U R                  5      n[        R                  " S5      n[         R
                  " U[        R                  [        R                  U5        [         R                  " US   5      nU[         R                  :X  a  [        S5      e[        R                  " [         R                  " U5      5      $ )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)rD   X509_get0_tbs_sigalgrn  rM   rN   X509_ALGOR_get0rR   r4  r.  ra   rq   
OBJ_nid2ln)r   sig_algalgr   s       r?   get_signature_algorithmX509.get_signature_algorithmT  s     ++DJJ7hh'(S$))TYY@s1v&$.. <=={{4??3/00r>   c                   [         R                  " [        U5      5      nU[        R                  :X  a  [        S5      e[        R                  " S[         R                  5      n[        R                  " SS5      n[        U5      US'   [         R                  " U R                  X#U5      n[        US:H  5        SR                  [        R                  " X4S   5       Vs/ sH  n[        U5      R                  5       PM     sn5      $ s  snf )z
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      :)rD   r  r-  rM   rR   ra   rN   EVP_MAX_MD_SIZErP   X509_digestrn  rQ   r  rT   r   upper)r   digest_namer  rY   r  digest_resultchs          r?   r  X509.digestg  s     **<+DETYY455!2D4H4HI!115}-a((JJ}
 	*+yy ++m15EFFB "##%F
 	
s   "Dc                B    [         R                  " U R                  5      $ )zc
Return the hash of the X509 subject.

:return: The hash of the subject.
:rtype: :py:class:`bytes`
)rD   X509_subject_name_hashrn  r   s    r?   subject_name_hashX509.subject_name_hash  s     **4::66r>   c                t   [        U[        5      (       d  [        S5      e[        U5      SS nUR	                  S5      n[
        R                  " S5      n[        R                  " XC5      n[        U[
        R                  :g  5        [        R                  " US   [
        R                  5      n[        R                  " US   5        [        U[
        R                  :g  5        [
        R                  " U[        R                  5      n[        R                  " U R                   U5      n[        US:H  5        g)z
Set the serial number of the certificate.

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

:return: :py:data`None`
zserial must be an integerr  Nr  zBIGNUM**r   r   )r]   r2   r_   hexr7  rM   rN   rD   	BN_hex2bnrQ   rR   BN_to_ASN1_INTEGERr   rS   ASN1_INTEGER_freeX509_set_serialNumberrn  )r   serial
hex_serialhex_serial_bytesbignum_serialr   asn1_serialrd   s           r?   set_serial_numberX509.set_serial_number  s     &#&&788[_
%,,W5, @$))+,--mA.>		J]1%&tyy01ggk4+A+AB//

KH

a(r>   c                   [         R                  " U R                  5      n[         R                  " U[        R
                  5      n [         R                  " U5      n [        R                  " U5      n[        US5      nU[         R                  " U5        [         R                  " U5        $ ! [         R                  " U5        f = f! [         R                  " U5        f = f)zX
Return the serial number of this certificate.

:return: The serial number.
:rtype: int
   )rD   X509_get_serialNumberrn  ASN1_INTEGER_to_BNrM   rR   	BN_bn2hexrq   r2   rF  r   )r   rV  rU  rS  hexstring_serialrR  s         r?   get_serial_numberX509.get_serial_number  s     00<//TYYG		(6J.#';;z#: -r2!!*-LL' !!*-LL's$   C	 #B. C	 .CC	 	C!c                    [        U[        5      (       d  [        S5      e[        R                  " U R
                  5      n[        R                  " X!5        g)z
Adjust the time stamp on which the certificate stops being valid.

:param int amount: The number of seconds by which to adjust the
    timestamp.
:return: ``None``
amount must be an integerN)r]   r2   r_   rD   X509_getm_notAfterrn  X509_gmtime_adj)r   amountnotAfters      r?   gmtime_adj_notAfterX509.gmtime_adj_notAfter  s?     &#&&788**4::6X.r>   c                    [        U[        5      (       d  [        S5      e[        R                  " U R
                  5      n[        R                  " X!5        g)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``
rb  N)r]   r2   r_   rD   X509_getm_notBeforern  rd  )r   re  	notBefores      r?   gmtime_adj_notBeforeX509.gmtime_adj_notBefore  s?     &#&&788,,TZZ8	Y/r>   c                4   U R                  5       nUc  [        S5      eUR                  S5      n[        R                  R	                  US5      n[        R
                  R                  n[        R                  R                  U5      R                  SS9nX5:  $ )z
Check whether the certificate has expired.

:return: ``True`` if the certificate has expired, ``False`` otherwise.
:rtype: bool
NzUnable to determine notAfterr(  z%Y%m%d%H%M%SZ)tzinfo)	get_notAfterra   r  datetimestrptimetimezoneutcnowreplace)r   
time_bytestime_string	not_afterUTCutcnows         r?   has_expiredX509.has_expired  s     &&(
;<< ''0%%..{OL	##""&&s+3343@!!r>   c                8    [        U" U R                  5      5      $ rC   )rz   rn  )r   whichs     r?   _get_boundary_timeX509._get_boundary_time  s    eDJJ/00r>   c                @    U R                  [        R                  5      $ )z
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
)r  rD   rj  r   s    r?   get_notBeforeX509.get_notBefore  s     &&t'?'?@@r>   c                :    [        U" U R                  5      U5      $ rC   )re   rn  )r   r  rc   s      r?   _set_boundary_timeX509._set_boundary_time  s     eDJJ/66r>   c                B    U R                  [        R                  U5      $ )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``
)r  rD   rj  r   rc   s     r?   set_notBeforeX509.set_notBefore   s     &&t'?'?FFr>   c                @    U R                  [        R                  5      $ )z
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
)r  rD   rc  r   s    r?   rp  X509.get_notAfter  s     &&t'>'>??r>   c                B    U R                  [        R                  U5      $ )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``
)r  rD   rc  r  s     r?   set_notAfterX509.set_notAfter  s     &&t'>'>EEr>   c                    [         R                  [         5      nU" U R                  5      Ul        [	        UR                  [
        R                  :g  5        Xl        U$ rC   )r"   r  rn  r   rQ   rM   rR   r  )r   r  r   s      r?   	_get_nameX509._get_name'  sC    )4::&


dii/0 r>   c                    [        U[        5      (       d  [        S5      eU" U R                  UR                  5      n[        US:H  5        g )Nzname must be an X509Namer   )r]   r"   r_   rn  r   rQ   )r   r  r   rd   s       r?   	_set_nameX509._set_name2  s;    $))6774::tzz2

a(r>   c                z    U R                  [        R                  5      nU R                  R	                  U5        U$ )ae  
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`
)r  rD   X509_get_issuer_namer  r   r   s     r?   
get_issuerX509.get_issuer8  s1     ~~d778  $$T*r>   c                x    U R                  [        R                  U5        U R                  R	                  5         g)zw
Set the issuer of this certificate.

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

:return: ``None``
N)r  rD   X509_set_issuer_namer  r   )r   rw  s     r?   
set_issuerX509.set_issuerH  s*     	t00&9  &&(r>   c                z    U R                  [        R                  5      nU R                  R	                  U5        U$ )ai  
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`
)r  rD   X509_get_subject_namer  r   r   s     r?   r  X509.get_subjectT  s1     ~~d889!!%%d+r>   c                x    U R                  [        R                  U5        U R                  R	                  5         g)z{
Set the subject of this certificate.

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

:return: ``None``
N)r  rD   X509_set_subject_namer  r   )r   rv  s     r?   set_subjectX509.set_subjectd  s*     	t117;!!'')r>   c                B    [         R                  " U R                  5      $ )z
Get the number of extensions on this certificate.

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

.. versionadded:: 0.12
)rD   X509_get_ext_countrn  r   s    r?   get_extension_countX509.get_extension_countp  s     &&tzz22r>   c                    [         R                  " S[        SS9  U H]  n[        U[        5      (       d  [        S5      e[        R                  " U R                  UR                  S5      n[        US:H  5        M_     g)z
Add extensions to the certificate.

:param extensions: The extensions to add.
:type extensions: An iterable of :py:class:`X509Extension` objects.
:return: ``None``
r  r  r  r  r)  r   N)r  r  r  r]   r  ra   rD   X509_add_extrn  rs  rQ   )r   r  r  r?  s       r?   r  X509.add_extensions{  sk     	& 	
 Cc#9:: !NOO**4::s~~rJJJ!O, r>   c                   [         R                  " S[        SS9  [        R	                  [        5      n[
        R                  " U R                  U5      Ul        UR                  [        R                  :X  a  [        S5      e[
        R                  " UR                  5      n[        R                  " U[
        R                  5      Ul        U$ )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  r  r  rD   X509_get_extrn  rs  rM   rR   
IndexErrorr  rS   rr  )r   indexr  ry  s       r?   get_extensionX509.get_extension  s     	& 	
 %,,-CD**4::u=>>TYY&<==++CNN;	D,D,DE
r>   )r  r  rn  Nr   )r   r	   rJ   r   )rJ   x509.Certificate)r%  r  rJ   r   r  r   r  r  r  ri  )rD  r  rJ   r^   )rR  r2   rJ   r   )re  r2   rJ   r   r   )r  r	   rJ   bytes | None)rJ   r  )r  zCallable[..., Any]rc   r^   rJ   r   )rc   r^   rJ   r   )r  r	   rJ   r"   )r  r	   r   r"   rJ   r   r  )rw  r"   rJ   r   )rv  r"   rJ   r   r  )r  r2   rJ   r  )'r8   r9   r:   r;   r<   r   r   r  r  r  r  r  r  r  r  r=  r  rJ  rW  r_  rg  rl  r|  r  r  r  r  rp  r  r  r  r  r  r  r  r  r  r  r=   r7   r>   r?   r   r     s    ;  . 4 4&I1))81&
>7)8((/0""1A7'7/47	7
G@F	) 
) 
*	3-:-	-6r>   r   c                  n   \ rS rSr% Sr\R                  rS\S'   \R                  r
S\S'   \R                  rS\S'   \R                  rS\S'   \R                  rS\S'   \R"                  rS\S	'   \R&                  rS\S
'   \R*                  rS\S'   \R.                  rS\S'   \R2                  rS\S'   Srg)r'   i  z
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
r2   	CRL_CHECKCRL_CHECK_ALLIGNORE_CRITICALX509_STRICTALLOW_PROXY_CERTSPOLICY_CHECKEXPLICIT_POLICYINHIBIT_MAPCHECK_SS_SIGNATUREPARTIAL_CHAINr7   N)r8   r9   r:   r;   r<   rD   X509_V_FLAG_CRL_CHECKr  r  X509_V_FLAG_CRL_CHECK_ALLr  X509_V_FLAG_IGNORE_CRITICALr  X509_V_FLAG_X509_STRICTr  X509_V_FLAG_ALLOW_PROXY_CERTSr  X509_V_FLAG_POLICY_CHECKr  X509_V_FLAG_EXPLICIT_POLICYr  X509_V_FLAG_INHIBIT_MAPr  X509_V_FLAG_CHECK_SS_SIGNATUREr  X509_V_FLAG_PARTIAL_CHAINr  r=   r7   r>   r?   r'   r'     s     //Is/77M37;;OS;33K3!??s?55L#5;;OS;33K3"AAA77M37r>   r'   c                  d    \ rS rSrSrSS jrSS jrSS jrSS jrSS jr	 S     SS	 jjr
S
rg)r$   i  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                    [         R                  " 5       n[        R                  " U[         R                  5      U l        g rC   )rD   X509_STORE_newrM   rS   X509_STORE_free_storer   stores     r?   r   X509Store.__init__  s(    ##%ggeT%9%9:r>   c                    [        U[        5      (       d
  [        5       e[        R                  " U R
                  UR                  5      n[        US:H  5        g)a  
Adds a trusted certificate to this store.

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

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

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

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

:return: ``None`` if the certificate was added successfully.
r   N)r]   r   r_   rD   X509_STORE_add_certr  rn  rQ   )r   r  r   s      r?   add_certX509Store.add_cert  s?      $%%+&&t{{DJJ?q!r>   c                   [        U[        R                  5      (       a  SSKJn  [        UR                  UR                  5      5      n[        R                  " U[        R                  5      n[        U[        R                  :g  5        [        R                  " U[        R                  5      nO[        S5      e[        [        R                   " U R"                  U5      S:g  5        g)a  
Add a certificate revocation list to this store.

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

.. versionadded:: 16.1.0

:param crl: The certificate revocation list to add to this store.
:type crl: ``cryptography.x509.CertificateRevocationList``
:return: ``None`` if the certificate revocation list was added
    successfully.
r   r  z?CRL must be of type cryptography.x509.CertificateRevocationListN)r]   r   CertificateRevocationListr   r   rV   r   r   rD   d2i_X509_CRL_biorM   rR   rQ   rS   X509_CRL_freer_   X509_STORE_add_crlr  )r   crlr   rF   openssl_crls        r?   add_crlX509Store.add_crl  s     c499::Ms//=>C//TYY?KK49945''+t'9'9:C> 
 	//SAQFGr>   c                ^    [        [        R                  " U R                  U5      S:g  5        g)ab  
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)rQ   rD   X509_STORE_set_flagsr  )r   flagss     r?   	set_flagsX509Store.set_flags  s"    , 	11$++uEJKr>   c                D   [         R                  " 5       n[        R                  " U[         R                  5      n[         R
                  " U[        R                  " UR                  5       5      5        [        [         R                  " U R                  U5      S:g  5        g)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)rD   X509_VERIFY_PARAM_newrM   rS   X509_VERIFY_PARAM_freeX509_VERIFY_PARAM_set_timecalendartimegm	timetuplerQ   X509_STORE_set1_paramr  )r   vfy_timeparams      r?   set_timeX509Store.set_time-  sm      **,t::;''8??8#5#5#78	
 	224;;F!KLr>   Nc                    Uc  [         R                  nO[        U5      nUc  [         R                  nO[        U5      n[        R                  " U R
                  X5      nU(       d  [        5         gg)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)rM   rR   _path_bytesrD   X509_STORE_load_locationsr  r   )r   cafilecapathload_results       r?   load_locationsX509Store.load_locationsE  s^    B >YYF (F>YYF (F44KK
  " r>   r  r   )r  r   rJ   r   )r  zx509.CertificateRevocationListrJ   r   )r  r2   rJ   r   )r  zdatetime.datetimerJ   r   rC   )r  StrOrBytesPathr  zStrOrBytesPath | NonerJ   r   )r8   r9   r:   r;   r<   r   r  r  r  r  r  r=   r7   r>   r?   r$   r$     sL    ;",H<L0M2 GK/#$/#.C/#	/# /#r>   r$   c                  @   ^  \ rS rSrSr        SU 4S jjrSrU =r$ )r&   iw  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U ]  U5        X l        X0l        g rC   )r   r   errorscertificate)r   messager  r  r   s       r?   r   X509StoreContextError.__init__  s     	!&r>   )r  r  )r  r  r  z	list[Any]r  r   rJ   r   )r8   r9   r:   r;   r<   r   r=   r  r  s   @r?   r&   r&   w  s2    ''$-'<@'	' 'r>   r&   c                      \ rS rSrSr S       SS jjr\    SS j5       r\SS j5       rSS jr	SS jr
SS	 jrSS
 jrSrg)r%   i  a  
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                H    Xl         X l        U R                  U5      U l        g rC   )r  _cert_build_certificate_stack_chain)r   r  r  chains       r?   r   X509StoreContext.__init__  s       
33E:r>   c                ,   SS jnU b  [        U 5      S:X  a  [        R                  $ [        R                  " 5       n[        U[        R                  :g  5        [        R                  " X!5      nU  H  n[        U[        5      (       d  [        S5      e[        [        R                  " UR                  5      S:  5        [        R                  " X#R                  5      S::  d  Mu  [        R                  " UR                  5        [        5         M     U$ )Nc                    [        [        R                  " U 5      5       H/  n[        R                  " X5      n[        R                  " U5        M1     [        R
                  " U 5        g rC   )r0  rD   sk_X509_numsk_X509_valuer  sk_X509_free)sr;  r  s      r?   cleanup:X509StoreContext._build_certificate_stack.<locals>.cleanup  sJ     4++A./&&q,q! 0 a r>   r   z+One of the elements is not an X509 instance)r  r	   rJ   r   )rP   rM   rR   rD   sk_X509_new_nullrQ   rS   r]   r   r_   X509_up_refrn  sk_X509_pushr  r   )certificatesr  r  r  s       r?   r  )X509StoreContext._build_certificate_stack  s    	! 3|#4#999%%'*+' DdD)) MNND,,TZZ81<=  

3q8tzz*$& ! r>   c                   [         R                  " [        R                  " [        R                  " U 5      5      5      R                  S5      n[        R                  " U 5      [        R                  " U 5      U/n[        R                  " U 5      n[        R                  " U5      n[        R                  U5      n[        XU5      $ )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(  )rM   rq   rD   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  r&   )	store_ctxr  r  rn  r  pycerts         r?   _exception_from_context(X509StoreContext._exception_from_context  s     ++..--i8
 &/	 	 )))4//	:
 44Y?e$((/$Wf==r>   c                   [         R                  " 5       n[        U[        R                  :g  5        [        R
                  " U[         R                  5      n[         R                  " XR                  R                  U R                  R                  U R                  5      n[        US:H  5        [         R                  " U5      nUS::  a  U R                  U5      eU$ )a  
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   )rD   X509_STORE_CTX_newrQ   rM   rR   rS   X509_STORE_CTX_freeX509_STORE_CTX_initr  r  rn  r  X509_verify_certr  )r   r  ri   s      r?   _verify_certificate$X509StoreContext._verify_certificate  s     ++-		TYY./GGIt'?'?@	&&{{))4::+;+;T[[
 	q!##I.!8..y99r>   c                    Xl         g)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.
Nr  r  s     r?   	set_storeX509StoreContext.set_store  s	     r>   c                $    U R                  5         g)z
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_certificate#X509StoreContext.verify_certificate  s     	  "r>   c                   U R                  5       n[        R                  " U5      n[        U[        R
                  :g  5        / n[        [        R                  " U5      5       H[  n[        R                  " X$5      n[        U[        R
                  :g  5        [        R                  U5      nUR                  U5        M]     [        R                  " U5        U$ )a  
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#  rD   X509_STORE_CTX_get1_chainrQ   rM   rR   r0  r	  r
  r   r  r   r  )r   r  
cert_stackr   r;  r  r  s          r?   get_verified_chain#X509StoreContext.get_verified_chain	  s     ,,.	 33I>

dii/0t''
34A%%j4DDDII-.,,T2FMM&!	 5 	*%r>   )r  r  r  rC   )r  r$   r  r   r  Sequence[X509] | NonerJ   r   )r  r0  rJ   r   )r  r	   rJ   r&   r  )r  r$   rJ   r   r   )rJ   z
list[X509])r8   r9   r:   r;   r<   r   staticmethodr  r  r#  r&  r)  r.  r=   r7   r>   r?   r%   r%     s    & (,	;; ; %	;
 
; +	 : > >20	
#r>   r%   c                   [        U[        5      (       a  UR                  S5      n[        U5      nU [        :X  aD  [
        R                  " U[        R                  [        R                  [        R                  5      nO;U [        :X  a&  [
        R                  " U[        R                  5      nO[        S5      eU[        R                  :X  a
  [        5         [        R                  U5      $ )z
Load a certificate (X509) from the string *buffer* encoded with the
type *type*.

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

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

:return: The X509 object
r  3type argument must be FILETYPE_PEM or FILETYPE_ASN1)r]   r  r7  rV   r   rD   PEM_read_bio_X509rM   rR   r   d2i_X509_biora   r   r   r  )r   rT   rF   r   s       r?   r.   r.   &  s     &#w'
v
C|%%c499diiK		  dii0NOOtyy""4((r>   c                d   [        5       nU [        :X  a!  [        R                  " X!R                  5      nOcU [
        :X  a!  [        R                  " X!R                  5      nO8U [        :X  a#  [        R                  " X!R                  SS5      nO[        S5      e[        US:H  5        [        U5      $ )z
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   )rV   r   rD   PEM_write_bio_X509rn  r   i2d_X509_bior   X509_print_exra   rQ   r[   )r   r  rF   result_codes       r?   r(   r(   C  s     .C|--c::>		''ZZ8		((jj!Q?
 	

 K1$%#r>   c                    [        5       nU [        :X  a  [        R                  nO&U [        :X  a  [        R
                  nO[        S5      eU" X!R                  5      nUS:w  a
  [        5         [        U5      $ )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
r3  r   )
rV   r   rD   PEM_write_bio_PUBKEYr   i2d_PUBKEY_biora   r   r   r[   )r   r   rF   	write_bior;  s        r?   r+   r+   _  sd     .C|--			''	NOOC,Ka#r>   c           	        [        5       n[        U[        5      (       d  [        S5      eUbM  Uc  [        S5      e[        R
                  " [        U5      5      nU[        R                  :X  a  [        S5      eO[        R                  n[        X5      nU [        :X  aY  [        R                  " UUR                  U[        R                  SUR                  UR                  5      nUR!                  5         OU ["        :X  a!  [        R$                  " XAR                  5      nOU [&        :X  a  [        R(                  " UR                  5      [        R*                  :w  a  [        S5      e[        R,                  " [        R.                  " UR                  5      [        R0                  5      n[        R2                  " XHS5      nO[        S5      e[5        US:g  5        [7        U5      $ )aU  
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_TEXTr7  )rV   r]   r    r_   rD   EVP_get_cipherbynamer-  rM   rR   ra   _PassphraseHelperr   PEM_write_bio_PrivateKeyr   callbackcallback_argsraise_if_problemr   i2d_PrivateKey_bior   r   r   rS   r   r   	RSA_printrQ   r[   )	r   r   cipher
passphraserF   
cipher_objhelperr;  r   s	            r?   r*   r*   x  s   * .CdD!!-..8  ..|F/CD
"233 # YY
t0F|33JJIIOO  
 	!		--c::>		DJJ'4+<+<<KLLggd,,TZZ8$--HnnSq1
 	

 K1$%#r>   c                      \ rS rSr  S	         S
S jjr\SS j5       r\SS j5       r\4SS jjr	          SS jr
Srg)rB  i  c                f    U[         :w  a  Ub  [        S5      eX l        X0l        X@l        / U l        g )Nz0only FILETYPE_PEM key format supports encryption)r   ra   _passphrase
_more_args	_truncate	_problems)r   r   rJ  	more_argstruncates        r?   r   _PassphraseHelper.__init__  s:     <J$:B  &#!*,r>   c                   U R                   c  [        R                  $ [        U R                   [        5      (       d  [        U R                   5      (       a!  [        R                  " SU R                  5      $ [        S5      e)Npem_password_cb2Last argument must be a byte string or a callable.)	rO  rM   rR   r]   r^   callablerD  _read_passphraser_   r   s    r?   rD  _PassphraseHelper.callback  sc    #99((%00HT=M=M4N4N==!2D4I4IJJD r>   c                    U R                   c  [        R                  $ [        U R                   [        5      (       d  [        U R                   5      (       a  [        R                  $ [        S5      e)NrX  )rO  rM   rR   r]   r^   rY  r_   r   s    r?   rE  _PassphraseHelper.callback_args  sU    #99((%00HT=M=M4N4N99D r>   c                    U R                   (       a'   [        U5        U R                   R                  S5      eg ! U a     N$f = frM  )rR  _exception_from_error_queuepop)r   exceptionTypes     r?   rF  "_PassphraseHelper.raise_if_problem  sF    >>+M: ..$$Q''  ! s   : AAc                >    [        U R                  5      (       a6  U R                  (       a  U R                  X#U5      nO-U R                  U5      nOU R                  c   eU R                  n[        U[        5      (       d  [        S5      e[        U5      U:  a"  U R                  (       a  US U nO[        S5      e[        [        U5      5       H  nXVUS-    X'   M     [        U5      $ ! [         a%  nU R                  R                  U5         S nAgS nAff = f)NzBytes expectedz+passphrase returned by callback is too longr   r   )rY  rO  rP  r]   r^   ra   rP   rQ  r0  	ExceptionrR  r   )r   r  sizerwflaguserdatar   r;  es           r?   rZ  "_PassphraseHelper._read_passphrase  s    	(())??!--dHEF!--f5F''333))fe,, !1226{T!>>#ET]F$E  3v;'AE* (v; 	NN!!!$	s   C*C- -
D7DD)rP  rO  rR  rQ  N)FF)
r   r2   rJ  PassphraseCallableT | NonerS  r   rT  r   rJ   r   r  )ra  ztype[Exception]rJ   r   )
r  r	   re  r2   rf  r	   rg  r	   rJ   r2   )r8   r9   r:   r;   r   r  rD  rE  r   rF  rZ  r=   r7   r>   r?   rB  rB    s    
  -- /- 	-
 - 
-      AF (!+.:=	r>   rB  c                J   [        U[        5      (       a  UR                  S5      n[        U5      nU [        :X  aD  [
        R                  " U[        R                  [        R                  [        R                  5      nO;U [        :X  a&  [
        R                  " U[        R                  5      nO[        S5      eU[        R                  :X  a
  [        5         [        R                  [        5      n[        R                  " U[
        R                   5      Ul        SUl        U$ )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  r3  T)r]   r  r7  rV   r   rD   PEM_read_bio_PUBKEYrM   rR   r   d2i_PUBKEY_biora   r   r    r  rS   r   r   r   )r   rT   rF   evp_pkeyr   s        r?   r1   r1   	  s     &#w'
v
C|++DIItyy
 
	&&sDII6NOO499<<D4#5#56DJDKr>   c                b   [        U[        5      (       a  UR                  S5      n[        U5      n[	        X5      nU [
        :X  aL  [        R                  " U[        R                  UR                  UR                  5      nUR                  5         O;U [        :X  a&  [        R                  " U[        R                  5      nO[        S5      eU[        R                  :X  a
  [!        5         ["        R%                  ["        5      n[        R&                  " U[        R(                  5      Ul        U$ )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  r3  )r]   r  r7  rV   rB  r   rD   PEM_read_bio_PrivateKeyrM   rR   rD  rE  rF  r   d2i_PrivateKey_biora   r   r    r  rS   r   r   )r   rT   rJ  rF   rL  rn  r   s          r?   r0   r0   -	  s    " &#w'
v
Ct0F|//FOOV-A-A
 	!		**3		:NOO499<<D4#5#56DJKr>   c                d   [        5       nU [        :X  a!  [        R                  " X!R                  5      nOcU [
        :X  a!  [        R                  " X!R                  5      nO8U [        :X  a#  [        R                  " X!R                  SS5      nO[        S5      e[        US:g  5        [        U5      $ )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   r7  )rV   r   rD   PEM_write_bio_X509_REQr  r   i2d_X509_REQ_bior   X509_REQ_print_exra   rQ   r[   )r   r  rF   r;  s       r?   r)   r)   V	  s     .C|11#xx@		++C:		,,S((AqA
 	

 K1$%#r>   r)   c                8   [        U[        5      (       a  UR                  S5      n[        U5      nU [        :X  aD  [
        R                  " U[        R                  [        R                  [        R                  5      nO;U [        :X  a&  [
        R                  " U[        R                  5      nO[        S5      e[        U[        R                  :g  5        [        R                  [        5      n[        R                  " U[
        R                   5      Ul        U$ )as  
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  r3  )r]   r  r7  rV   r   rD   PEM_read_bio_X509_REQrM   rR   r   d2i_X509_REQ_biora   rQ   _X509ReqInternalr  rS   r  r  )r   rT   rF   r  x509reqs        r?   r/   r/   	  s     &#w'
v
C|((diiDIIN		##C3NOOC499$%&&'78G773 2 23GLNr>   r/   rC   )rT   r  rJ   r	   )rF   r	   rJ   r^   )rb   r	   rc   r^   rJ   r   )rc   r^   rJ   r	   )ru   r	   rJ   r  )rJ   r  )r   r  rJ   r   )r   r2   rT   r^   rJ   r   )r   r2   r  r   rJ   r^   )r   r2   r   r    rJ   r^   r  )
r   r2   r   r    rI  rh  rJ  rj  rJ   r^   )r   r2   rT   str | bytesrJ   r    )r   r2   rT   r{  rJ  rj  rJ   r    )r   r2   r  r#   rJ   r^   )r   r2   rT   r^   rJ   r#   )p
__future__r   r  rq  	functoolstypingr  base64r   collections.abcr   r   r   osr   r	   r
   r   cryptographyr   r   )cryptography.hazmat.primitives.asymmetricr   r   r   r   r   OpenSSL._utilr   r-  r   r_  r   rM   r   rD   r   _make_assertr   r  __all__r   r   r   r   r   _PrivateKeyr   r   r   r   r   
_PublicKeyr   r  r^   r  PassphraseCallableTSSL_FILETYPE_PEMr   r  SSL_FILETYPE_ASN1r   r   r   r   EVP_PKEY_DSAr   EVP_PKEY_DHr3   EVP_PKEY_ECr4   rd  r   r   rQ   rV   r[   re   rj   rz   r|   r    r   r-   r  
deprecatedr8   r  r,   total_orderingr"   r!   r  r#   ry  r   r'   r$   r&   r%   r.   r(   r+   r*   rB  r1   r0   r)   r  r/   r  r7   r>   r?   <module>r     s   "       .    % : 		 		
 [*$%sE8+,E8CJ#778  ))c )++s + !!# !!!# !  I  :EB u%4;+2&:
 
~. ~.Bd. d.N5 !4    	  		1$   	  		   Dg: g:T '    	  		q qh     	 		i iX8 8.e# e#P'I '"[ [|):88 -1	B
B
B B +	B
 BJK K\J .2&
&& +& 
	&R@ &> "   	 	#	@ &> "   	 	#	r>   