
    g8                      U d dl mZ d dlZd dlZd dlZd dlZd dlZd dlmZ d dl	m
Z
mZ d dlmZ d dlmZ d dlmZmZmZ d dlmZmZ d d	lmZmZmZmZmZ d d
lmZ d dlmZ d dlm Z! d dlm"Z# d dlm$Z% d dlm&Z' g dZ(eejR                  ejT                  ejV                  ejX                  ejZ                  f   Z.eej^                  ej`                  ejb                  ejd                  ejf                  f   Z4ee.e4f   Z5ee6e7ef   Z8ee7ede7f   f   Z9e#jt                  Z;de<d<   e#jz                  Z>de<d<   dZ?e#j                  ZAde<d<   e#j                  ZCde<d<   e#j                  ZEde<d<   e#j                  ZGde<d<    G d deH      ZI eeeI      ZJ e%eI      ZKdLdMdZLdNdZMdOdZNdPdZOdQd ZP G d! d"      ZQ G d# d$      ZR G d% d&      ZSdRd'ZTeTZU ej                  eTeWd(eXd)*       dSd+ZY ej                  eYeWd,eXd-*       ej                   G d. d/             Z[ G d0 d1      Z\e\Z] ej                  e\eWd2eXd1*        G d3 d4      Z^e^Z_ ej                  e^eWd5eXd4*        G d6 d7      Z` G d8 d9      Za G d: d;      Zb G d< d=eH      Zc G d> d?      ZddTd@ZedUdAZfdVdBZg	 	 dW	 	 	 	 	 	 	 	 	 dXdCZh G dD dE      ZidYdFZj	 dL	 	 	 	 	 	 	 dZdGZkd[dHZlelZm ej                  eleWd5eXdI*       d\dJZnenZo ej                  eneWd5eXdK*       y)]    )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                      e Zd ZdZy)r   z7
    An error occurred in an `OpenSSL.crypto` API.
    N)__name__
__module____qualname____doc__     C/var/www/openai/venv/lib/python3.12/site-packages/OpenSSL/crypto.pyr   r   j   s    r;   r   c                T   | 8t        j                  t        j                               }t         j                  }n;t	        j
                  d|       }t        j                  |t        |             }|fdd}t        |t        j                  k7         t	        j                  ||      }|S )z
    Allocate a new OpenSSL memory BIO.

    Arrange for the garbage collector to clean it up automatically.

    :param buffer: None or some bytes to use to put into the BIO so that they
        can be read out.
    char[]c                ,    t        j                  |       S N)_libBIO_free)biorefs     r<   freez_new_mem_buf.<locals>.free   s    ==%%r;   )rC   r	   rD   r	   returnr	   )rA   BIO_new	BIO_s_memrB   _ffinewBIO_new_mem_buflen_openssl_assertNULLgc)bufferrC   rE   datas       r<   _new_mem_bufrR   t   s     ~ll4>>+,}}xx&)""4V5 '+ 	& C499$%
''#t
CJr;   c                    t        j                  d      }t        j                  | |      }t        j                  |d   |      dd S )zO
    Copy the contents of an OpenSSL BIO object into a Python byte string.
    zchar**r   N)rI   rJ   rA   BIO_get_mem_datarP   )rC   result_bufferbuffer_lengths      r<   _bio_to_stringrW      s?     HHX&M))#}=M;;}Q'7::r;   c                    t        |t              st        d      t        | t        j
                  k7         t        j                  | |      }|dk(  rt        d      y)a  
    The the time value of an ASN1 time object.

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

    @raise TypeError: If C{when} is not a L{bytes} string.
    @raise ValueError: If C{when} does not represent a time in the required
        format.
    @raise RuntimeError: If the time value cannot be set for some other
        (unspecified) reason.
    zwhen must be a byte stringr   zInvalid stringN)	
isinstancebytes	TypeErrorrM   rI   rN   rA   ASN1_TIME_set_string
ValueError)boundarywhen
set_results      r<   _set_asn1_timera      sW     dE"455 H		)***8T:JQ)** r;   c                    t        j                         }t        |t        j                  k7         t        j
                  |t         j                        }t        ||        |S )a  
    Behaves like _set_asn1_time but returns a new ASN1_TIME object.

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

    @raise TypeError: If C{when} is not a L{bytes} string.
    @raise ValueError: If C{when} does not represent a time in the required
        format.
    @raise RuntimeError: If the time value cannot be set for some other
        (unspecified) reason.
    )rA   ASN1_TIME_newrM   rI   rN   rO   ASN1_TIME_freera   )r_   rets     r<   _new_asn1_timerf      sH     


CC499$%
''#t**
+C3Jr;   c                J   t        j                  d|       }t        j                  |      dk(  ryt        j                  |      t        j
                  k(  r(t        j                  t        j                  |            S t        j                  d      }t        j                  | |       t        |d   t         j                  k7         t        j                  d|d         }t        j                  |      }t        j                  |      }t        j                  |d          |S )a]  
    Retrieve the time value of an ASN1 time object.

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

    @return: The time value from C{timestamp} as a L{bytes} string in a certain
        format.  Or C{None} if the object contains no time value.
    ASN1_STRING*r   NzASN1_GENERALIZEDTIME**)rI   castrA   ASN1_STRING_lengthASN1_STRING_typeV_ASN1_GENERALIZEDTIMEstringASN1_STRING_get0_datarJ   ASN1_TIME_to_generalizedtimerM   rN   ASN1_GENERALIZEDTIME_free)	timestampstring_timestampgeneralized_timestampstring_datastring_results        r<   _get_asn1_timerv      s     yy;/0A5./43N3NN{{4556FGHH $)A B)))5JK-a0DII=>99^5J15MN001ABK0&&'<Q'?@r;   c                  $    e Zd ZddZddZddZy)_X509NameInvalidatorc                    g | _         y r@   )_namesselfs    r<   __init__z_X509NameInvalidator.__init__   s	    &(r;   c                :    | j                   j                  |       y r@   )rz   appendr|   names     r<   addz_X509NameInvalidator.add   s    4 r;   c                *    | j                   D ]  }|` y r@   )rz   _namer   s     r<   clearz_X509NameInvalidator.clear   s    KKD
  r;   NrF   Noner   r"   rF   r   )r6   r7   r8   r}   r   r   r:   r;   r<   rx   rx      s    )!r;   rx   c                  Z    e Zd ZdZdZdZddZddZedd       Z	ddZ
ddZdd	Zdd
Zy)r    zD
    A class representing an DSA or RSA public key or key pair.
    FTc                    t        j                         }t        j                  |t         j                        | _        d| _        y )NF)rA   EVP_PKEY_newrI   rO   EVP_PKEY_free_pkey_initializedr|   pkeys     r<   r}   zPKey.__init__   s0      "WWT4#5#56
!r;   c                    ddl m}m} | j                  rt	        t
        |       } ||      S t        t
        |       } ||d      S )a  
        Export as a ``cryptography`` key.

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

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

        .. versionadded:: 16.1.0
        r   )load_der_private_keyload_der_public_keyN),cryptography.hazmat.primitives.serializationr   r   _only_publicr+   r   r*   )r|   r   r   ders       r<   to_cryptography_keyzPKey.to_cryptography_key   sB    	

  5C&s++!-6C'T22r;   c                   t        |t        j                  t        j                  t        j
                  t        j                  t        j                  t        j                  t        j                  t        j                  t        j                  t        j                  f
      st!        d      ddlm}m}m}m} t        |t        j                  t        j                  t        j                  t        j                  t        j                  f      r4t-        t.        |j1                  |j2                  |j4                              S |j7                  |j2                  |j8                   |             }t;        t.        |      S )z
        Construct based on a ``cryptography`` *crypto_key*.

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

        :rtype: PKey

        .. versionadded:: 16.1.0
        zUnsupported key typer   )EncodingNoEncryptionPrivateFormatPublicFormat)rY   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_keyzPKey.from_cryptography_key  s(    !!  **))))((%%$$!!  
 233	
 	
   ))(($$  	
 "''LL,"C"C  **m11<>C #=#66r;   c           	        t        |t              st        d      t        |t              st        d      |t        k(  r|dk  rt	        d      t        j                         }t        j                  |t
        j                        }t        j                  |t
        j                         t        j                         }t        j                  |||t        j                        }t        |dk(         t        j                   | j"                  |      }t        |dk(         d| _        y|t$        k(  r
t        j&                         }t        |t        j                  k7         t        j                  |t
        j(                        }t        j*                  ||t        j                  dt        j                  t        j                  t        j                        }t        |dk(         t        t        j,                  |      dk(         t        t        j.                  | j"                  |      dk(         d| _        yt1        d      )	a3  
        Generate a key pair of the given type, with the given number of bits.

        This generates a key "into" the this object.

        :param type: The key type.
        :type type: :py:data:`TYPE_RSA` or :py:data:`TYPE_DSA`
        :param bits: The number of bits.
        :type bits: :py:data:`int` ``>= 0``
        :raises TypeError: If :py:data:`type` or :py:data:`bits` isn't
            of the appropriate type.
        :raises ValueError: If the number of bits isn't an integer of
            the appropriate size.
        :return: ``None``
        ztype must be an integerzbits must be an integerr   zInvalid number of bits   zNo such key typeTN)rY   r2   r[   r   r]   rA   BN_newrI   rO   BN_freeBN_set_wordRSA_F4RSA_newRSA_generate_key_exrN   rM   EVP_PKEY_assign_RSAr   r   DSA_newDSA_freeDSA_generate_parameters_exDSA_generate_keyEVP_PKEY_set1_DSAr   r   )r|   typebitsexponentr   resultr   ress           r<   generate_keyzPKey.generate_keyK  s     $$566$$5668qy !9:: {{}Hwwx6HXt{{3,,.C--c4499MFFaK(--djj#>FFaK(" ! X,,.CC499,-''#t}}-C11T499aDIItyyC C1H%D11#6!;<D224::sCqHI ! *++r;   c                   | j                   rt        d      t        j                  | j	                               t        j
                  k7  rt        d      t        j                  | j                        }t        j                  |t        j                        }t        j                  |      }|dk(  ryt                y)ax  
        Check the consistency of an RSA private key.

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

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

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

        :raise TypeError: if the key is of a type which cannot be checked.
            Only RSA keys can currently be checked.
        zpublic key onlyz'Only RSA keys can currently be checked.r   TN)r   r[   rA   EVP_PKEY_typer   EVP_PKEY_RSAEVP_PKEY_get1_RSAr   rI   rO   RSA_freeRSA_check_key_raise_current_error)r|   r   r   s      r<   checkz
PKey.check  s     -..diik*d.?.??EFF$$TZZ0ggc4==)##C(Q;r;   c                @    t        j                  | j                        S )zT
        Returns the type of the key

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

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

        :return: The number of bits of the key.
        )rA   EVP_PKEY_bitsr   r{   s    r<   r   z	PKey.bits  s     !!$**--r;   Nr   )rF   _Key)r   r   rF   r    )r   r2   r   r2   rF   r   rF   boolrF   r2   )r6   r7   r8   r9   r   r   r}   r   classmethodr   r   r   r   r   r:   r;   r<   r    r       sG     LL"
3. 77 77r6!p4,.r;   r    c                  v     e Zd ZdZdZd
 fdZedd       Zedd       Zedd       Z	ddZ
ddZdd	Z xZS )_EllipticCurveaZ  
    A representation of a supported elliptic curve.

    @cvar _curves: :py:obj:`None` until an attempt is made to load the curves.
        Thereafter, a :py:type:`set` containing :py:type:`_EllipticCurve`
        instances each of which represents one curve supported by the system.
    @type _curves: :py:type:`NoneType` or :py:type:`set`
    Nc                N    t        |t              rt        |   |      S t        S )z
        Implement cooperation with the right-hand side argument of ``!=``.

        Python 3 seems to have dropped this cooperation in this very narrow
        circumstance.
        )rY   r   super__ne__NotImplemented)r|   other	__class__s     r<   r   z_EllipticCurve.__ne__  s$     e^,7>%((r;   c                     j                  t        j                  d      }t        j                  d|      }j                  ||       t	         fd|D              S )z
        Get the curves supported by OpenSSL.

        :param lib: The OpenSSL library binding object.

        :return: A :py:type:`set` of ``cls`` instances giving the names of the
            elliptic curves the underlying library supports.
        r   zEC_builtin_curve[]c              3  V   K   | ]   }j                  |j                         " y wr@   )from_nidnid).0cr   r   s     r<   	<genexpr>z7_EllipticCurve._load_elliptic_curves.<locals>.<genexpr>  s!     D^3<<QUU+^s   &))EC_get_builtin_curvesrI   rN   rJ   set)r   r   
num_curvesbuiltin_curvess   ``  r<   _load_elliptic_curvesz$_EllipticCurve._load_elliptic_curves  sO     ..tyy!<
"6
C 	!!.*=D^DDDr;   c                ^    | j                   | j                  |      | _         | j                   S )a  
        Get, cache, and return the curves supported by OpenSSL.

        :param lib: The OpenSSL library binding object.

        :return: A :py:type:`set` of ``cls`` instances giving the names of the
            elliptic curves the underlying library supports.
        )_curvesr   )r   r   s     r<   _get_elliptic_curvesz#_EllipticCurve._get_elliptic_curves  s*     ;;33C8CK{{r;   c           	     x     | ||t        j                  |j                  |            j                  d            S )a  
        Instantiate a new :py:class:`_EllipticCurve` associated with the given
        OpenSSL NID.

        :param lib: The OpenSSL library binding object.

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

        :return: The curve object.
        ascii)rI   rm   
OBJ_nid2sndecode)r   r   r   s      r<   r   z_EllipticCurve.from_nid  s0     3T[[)<=DDWMNNr;   c                .    || _         || _        || _        y)a  
        :param _lib: The :py:mod:`cryptography` binding instance used to
            interface with OpenSSL.

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

        :param name: The OpenSSL short name identifying the curve this object
            represents.
        :type name: :py:class:`unicode`
        N)rA   _nidr   )r|   r   r   r   s       r<   r}   z_EllipticCurve.__init__  s     			r;   c                "    d| j                   dS )Nz<Curve >r   r{   s    r<   __repr__z_EllipticCurve.__repr__  s    Q''r;   c                    | j                   j                  | j                        }t        j                  |t         j
                        S )z
        Create a new OpenSSL EC_KEY structure initialized to use this curve.

        The structure is automatically garbage collected when the Python object
        is garbage collected.
        )rA   EC_KEY_new_by_curve_namer   rI   rO   EC_KEY_free)r|   keys     r<   
_to_EC_KEYz_EllipticCurve._to_EC_KEY
  s3     ii00;wwsD,,--r;   r   r	   rF   r   )r   r	   rF   set[_EllipticCurve])r   r	   r   r2   rF   r   )r   r	   r   r2   r   strrF   r   rF   r   rF   r	   )r6   r7   r8   r9   r   r   r   r   r   r   r}   r   r   __classcell__r   s   @r<   r   r     sc     G	 E E"   O O "(.r;   r   c                 4    t         j                  t              S )a  
    Return a set of objects representing the elliptic curves supported in the
    OpenSSL build in use.

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

    The curve objects are useful as values for the argument accepted by
    :py:meth:`Context.set_tmp_ecdh` to specify which elliptical curve should be
    used for ECDHE key exchange.
    )r   r   rA   r:   r;   r<   r-   r-     s     ..t44r;   zSget_elliptic_curves is deprecated. You should use the APIs in cryptography instead.r-   r   c                ^    t               D ]  }|j                  | k(  s|c S  t        d|       )aT  
    Return a single curve object selected by name.

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

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

    If the named curve is not supported then :py:class:`ValueError` is raised.
    zunknown curve name)_get_elliptic_curves_internalr   r]   )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                  d     e Zd ZdZddZd fdZddZddZddZddZ	ddZ
dd	Zdd
Z xZS )r"   a  
    An X.509 Distinguished Name.

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

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

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

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

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

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

    :ivar emailAddress: The e-mail address of the entity.
    c                    t        j                  |j                        }t        j                  |t         j
                        | _        y)z
        Create a new X509Name, copying the given X509Name instance.

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

  " )   !455s   	
F3 3	G	G	c                   t        j                  t        |            }|t         j                  k(  r	 t	                t        d      t        j                  | j                  |d      }|dk(  ryt        j                  | j                  |      }t        j                  |      }t        j                  d      }t        j                  ||      }t        |dk\         	 t        j                  |d   |      dd j!                  d      }t        j"                  |d          |S # t
        $ r Y t        d      w xY w# t        j"                  |d          w xY w)a
  
        Find attribute. An X509Name object has the following attributes:
        countryName (alias C), stateOrProvince (alias ST), locality (alias L),
        organization (alias O), organizationalUnit (alias OU), commonName
        (alias CN) and more...
        r  r  Nunsigned char**r   r  )rA   r  r  r  r   r   r  X509_NAME_get_index_by_NIDr   r  X509_NAME_ENTRY_get_datarI   rJ   ASN1_STRING_to_UTF8rM   rP   r   OPENSSL_free)	r|   r   r   entry_indexentryrQ   rU   data_lengthr   s	            r<   __getattr__zX509Name.__getattr__  s2    |D12$.. $& !!45555djj#rJ"(([A,,U3!23..}dCq()	0[[q!1;?BIIF
 mA./-   !455* mA./s   
D# +D< #	D98D9<Ec                    t        |t              st        S t        j                  | j
                  |j
                        dk(  S Nr   rY   r"   r   rA   X509_NAME_cmpr   r|   r   s     r<   __eq__zX509Name.__eq__  s2    %*!!!!$**ekk:a??r;   c                    t        |t              st        S t        j                  | j
                  |j
                        dk  S r0  r1  r3  s     r<   __lt__zX509Name.__lt__  s2    %*!!!!$**ekk:Q>>r;   c                    t        j                  dd      }t        j                  | j                  |t        |            }t        |t         j                  k7         dj                  t        j                  |      j                  d            S )z6
        String representation of an X509Name
        r>   i   z<X509Name object '{}'>r  )rI   rJ   rA   X509_NAME_oneliner   rL   rM   rN   formatrm   r   )r|   rU   format_results      r<   r   zX509Name.__repr__  sq     3/..JJs='9
 	23'..KK&--g6
 	
r;   c                @    t        j                  | j                        S )a&  
        Return an integer representation of the first four bytes of the
        MD5 digest of the DER representation of the name.

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

        :return: The (integer) hash of this name.
        :rtype: :py:class:`int`
        )rA   X509_NAME_hashr   r{   s    r<   hashzX509Name.hash  s     ""4::..r;   c                    t        j                  d      }t        j                  | j                  |      }t        |dk\         t        j                  |d   |      dd }t        j                  |d          |S )z
        Return the DER encoding of this name.

        :return: The DER encoded form of this name.
        :rtype: :py:class:`bytes`
        r&  r   N)rI   rJ   rA   i2d_X509_NAMEr   rM   rP   r*  )r|   rU   encode_resultru   s       r<   r   zX509Name.der  si     !23**4::}E*+M!$4mDQG-*+r;   c                   g }t        t        j                  | j                              D ]  }t        j                  | j                  |      }t        j
                  |      }t        j                  |      }t        j                  |      }t        j                  |      }t        j                  t        j                  |      t        j                  |            dd }|j                  t        j                  |      |f        |S )z
        Returns the components of this name, as a sequence of 2-tuples.

        :return: The components of this name.
        :rtype: :py:class:`list` of ``name, value`` tuples.
        N)r  rA   r  r   r  r  r(  r  r   rI   rP   rn   rj   r   rm   )	r|   r   r   r!  fnamefvalr   r   r  s	            r<   get_componentszX509Name.get_components  s     t11$**=>A**4::q9C33C8E005D""5)C??3'D KK**40$2I2I$2OE MM4;;t,e45 ?  r;   r   )r   r   r  r	   rF   r   )r   r   rF   
str | Noner   r   r   rF   rZ   )rF   zlist[tuple[bytes, bytes]])r6   r7   r8   r9   r}   r  r.  r4  r6  r   r=  r   rD  r   r   s   @r<   r"   r"   P  s8    0=%#N&P@?

/r;   r"   c                      e Zd ZU dZ	 	 d	 	 	 	 	 	 	 	 	 	 	 ddZedd       Zej                  dej                  dej                  diZded	<   dd
ZddZddZddZddZy)r!   zu
    An X.509 v3 certificate extension.

    .. deprecated:: 23.3.0
       Use cryptography's X509 APIs instead.
    Nc                   t        j                  d      }t        j                  |t         j                  t         j                  t         j                  t         j                  d       t        j
                  |       |,t        |t              st        d      |j                  |_
        |,t        |t              st        d      |j                  |_        |rd|z   }t        j                  t         j                  |||      }|t         j                  k(  r
t                t        j                  |t        j                        | _        y)a  
        Initializes an X509 extension.

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

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

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

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

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

        .. _extension: https://www.openssl.org/docs/manmaster/man5/
            x509v3_config.html#STANDARD-EXTENSIONS
        zX509V3_CTX*r   Nzissuer must be an X509 instancez subject must be an X509 instances	   critical,)rI   rJ   rA   X509V3_set_ctxrN   X509V3_set_ctx_nodbrY   r   r[   _x509issuer_certsubject_certX509V3_EXT_nconfr   rO   X509_EXTENSION_free
_extension)r|   	type_namecriticalr  subjectissuerctx	extensions           r<   r}   zX509Extension.__init__  s    < hh}%
 	CDIItyy$))QO 	  % fd+ ABB$llCOgt, BCC&}}C !5(E))$))S)UK			! "'')T-E-EFr;   c                f    t        j                  t        j                  | j                              S r@   )rA   r  X509_EXTENSION_get_objectrP  r{   s    r<   r   zX509Extension._nid`  s'    **4??;
 	
r;   emailDNSURIztyping.ClassVar[dict[int, str]]	_prefixesc                $   t        j                  dt        j                  | j                              }t        j
                  |t        j                        }g }t        t        j                  |            D ]  }t        j                  ||      }	 | j                  |j                     }t        j                  |j                  j                  j                  |j                  j                  j                         d d  j#                  d      }|j%                  |dz   |z           dj/                  |      S # t&        $ rM t)               }t        j*                  ||       |j%                  t-        |      j#                  d             Y w xY w)NzGENERAL_NAMES*r  :z, )rI   ri   rA   X509V3_EXT_d2irP  rO   GENERAL_NAMES_freer  sk_GENERAL_NAME_numsk_GENERAL_NAME_valuer\  r   rP   dia5rQ   lengthr   r   KeyErrorrR   GENERAL_NAME_printrW   join)r|   namespartsr   r   labelr  rC   s           r<   _subjectAltNameStringz#X509Extension._subjectAltNameStringl  s2   		d11$//B
 t667t//67A--eQ7D
2tyy1 DFFJJOOTVVZZ5F5FG&/  US[501 8 yy  B"n''T2^C077@ABs   D99AFFc                   t         j                  | j                  k(  r| j                         S t	               }t        j
                  || j                  dd      }t        |dk7         t        |      j                  d      S )zF
        :return: a nice text representation of the extension
        r   r  )
rA   NID_subject_alt_namer   rl  rR   X509V3_EXT_printrP  rM   rW   r   )r|   rC   print_results      r<   __str__zX509Extension.__str__  si     $$		1--//n,,S$//1aH)*c"))'22r;   c                @    t        j                  | j                        S )zk
        Returns the critical field of this X.509 extension.

        :return: The critical field.
        )rA   X509_EXTENSION_get_criticalrP  r{   s    r<   get_criticalzX509Extension.get_critical  s     //@@r;   c                    t        j                  | j                        }t        j                  |      }t        j                  |      }|t
        j                  k7  rt        j                  |      S y)z
        Returns the short type name of this X.509 extension.

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

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

        .. versionadded:: 0.12
        s   UNDEF)rA   rX  rP  r  r   rI   rN   rm   )r|   objr   bufs       r<   get_short_namezX509Extension.get_short_name  sV     ,,T__=s# ooc"$));;s##r;   c                    t        j                  | j                        }t        j                  d|      }t        j
                  |      }t        j                  |      }t        j                  ||      dd S )z
        Returns the data of the X509 extension, encoded as ASN.1.

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

        .. versionadded:: 0.12
        rh   N)rA   X509_EXTENSION_get_datarP  rI   ri   rn   rj   rP   )r|   octet_resultru   char_resultresult_lengths        r<   get_datazX509Extension.get_data  s^     33DOOD		.,?00?//>{{;6q99r;   NN)rQ  rZ   rR  r   r  rZ   rS  X509 | NonerT  r  rF   r   r   r   r   rF  )r6   r7   r8   r9   r}   propertyr   rA   	GEN_EMAILGEN_DNSGEN_URIr\  __annotations__rl  rq  rt  rx  r~  r:   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                      e Zd ZdZddZddZe	 	 	 	 dd       ZddZddZ	ddZ
ddZdd	Z	 	 	 	 dd
ZddZddZddZy)r#   z
    An X.509 certificate signing requests.

    .. deprecated:: 24.2.0
       Use `cryptography.x509.CertificateSigningRequest` instead.
    c                    t        j                         }t        j                  |t         j                        | _        | j                  d       y r0  )rA   X509_REQ_newrI   rO   X509_REQ_free_reqset_version)r|   reqs     r<   r}   zX509Req.__init__  s6    !GGC!3!34	r;   c                >    ddl m} t        t        |       } ||      S )z
        Export as a ``cryptography`` certificate signing request.

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

        .. versionadded:: 17.1.0
        r   )load_der_x509_csr)cryptography.x509r  "_dump_certificate_request_internalr   )r|   r  r   s      r<   to_cryptographyzX509Req.to_cryptography  s     	80E %%r;   c                    t        |t        j                        st        d      ddlm} |j                  |j                        }t        t        |      S )a  
        Construct based on a ``cryptography`` *crypto_req*.

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

        :rtype: X509Req

        .. versionadded:: 17.1.0
        z%Must be a certificate signing requestr   r   )
rY   r   CertificateSigningRequestr[   r   r   r   r   "_load_certificate_request_internalr   )r   
crypto_reqr   r   s       r<   from_cryptographyzX509Req.from_cryptography  sD     *d&D&DECDDI%%hll31-EEr;   c                t    t        j                  | j                  |j                        }t	        |dk(         y)z
        Set the public key of the certificate signing request.

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

        :return: ``None``
        r   N)rA   X509_REQ_set_pubkeyr  r   rM   r|   r   r`   s      r<   
set_pubkeyzX509Req.set_pubkey  s*     --diiD

a(r;   c                @   t         j                  t               }t        j                  | j                        |_        t        |j
                  t        j                  k7         t        j                  |j
                  t        j                        |_        d|_        |S )z
        Get the public key of the certificate signing request.

        :return: The public key.
        :rtype: :py:class:`PKey`
        T)r    __new__rA   X509_REQ_get_pubkeyr  r   rM   rI   rN   rO   r   r   r   s     r<   
get_pubkeyzX509Req.get_pubkey  sf     ||D!--dii8


dii/0WWTZZ););<
 r;   c                    t        |t              st        d      |dk7  rt        d      t	        j
                  | j                  |      }t        |dk(         y)z
        Set the version subfield (RFC 2986, section 4.1) of the certificate
        request.

        :param int version: The version number.
        :return: ``None``
        zversion must be an intr   z9Invalid version. The only valid version for X509Req is 0.r   N)rY   r2   r[   r]   rA   X509_REQ_set_versionr  rM   )r|   versionr`   s      r<   r  zX509Req.set_version  sU     '3'455a<K  ..tyy'B

a(r;   c                @    t        j                  | j                        S )z
        Get the version subfield (RFC 2459, section 4.1.2.1) of the certificate
        request.

        :return: The value of the version subfield.
        :rtype: :py:class:`int`
        )rA   X509_REQ_get_versionr  r{   s    r<   get_versionzX509Req.get_version'  s     ((33r;   c                    t         j                  t               }t        j                  | j                        |_        t        |j
                  t        j                  k7         | |_	        |S )a  
        Return the subject of this certificate signing request.

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

        :return: The subject of this certificate signing request.
        :rtype: :class:`X509Name`
        )
r"   r  rA   X509_REQ_get_subject_namer  r   rM   rI   rN   _ownerr   s     r<   get_subjectzX509Req.get_subject1  sM     )33DII>


dii/0 r;   c                   t        j                  dt        d       t        j                         }t        |t        j                  k7         t        j                  |t        j                        }|D ]=  }t        |t              st        d      t        j                  ||j                         ? t        j                  | j                   |      }t        |dk(         y)z
        Add extensions to the certificate signing request.

        :param extensions: The X.509 extensions to add.
        :type extensions: iterable of :py:class:`X509Extension`
        :return: ``None``
        This API is deprecated and will be removed in a future version of pyOpenSSL. You should use pyca/cryptography's X.509 APIs instead.   
stacklevel+One of the elements is not an X509Extensionr   N)warningswarnDeprecationWarningrA   sk_X509_EXTENSION_new_nullrM   rI   rN   rO   sk_X509_EXTENSION_freerY   _X509ExtensionInternalr]   sk_X509_EXTENSION_pushrP  X509_REQ_add_extensionsr  )r|   
extensionsstackextr$  s        r<   add_extensionszX509Req.add_extensionsG  s     	& 	
 //1*+t::;Cc#9: !NOO ''s~~>  11$))UC

a(r;   c                   t        j                  dt        d       g }t        j                  | j
                        }t        j                  |d       }t        t        j                  |            D ]~  }t        j                  t              }t        j                  t        j                  ||            }t        j                  |t        j                        |_        |j!                  |        |S )z
        Get X.509 extensions in the certificate signing request.

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

        .. versionadded:: 0.15
        r  r  r  c                r    t        j                  | t        j                  t         j                  d            S )NrO  )rA   sk_X509_EXTENSION_pop_freerI   	addressof_original_lib)xs    r<   <lambda>z(X509Req.get_extensions.<locals>.<lambda>  s'    d55t113HIr;   )r  r  r  rA   X509_REQ_get_extensionsr  rI   rO   r  sk_X509_EXTENSION_numr  r  X509_EXTENSION_dupsk_X509_EXTENSION_valuerO  rP  r   )r|   extsnative_exts_objr   r  rV  s         r<   get_extensionszX509Req.get_extensionsj  s     	& 	
 66tyyA''
 t11/BCA(001GHC//,,_a@I "WWY0H0HICNKK D r;   c                J   |j                   rt        d      |j                  st        d      t        j                  t        |            }|t        j                  k(  rt        d      t        j                  | j                  |j                  |      }t        |dkD         y)aa  
        Sign the certificate signing request with this key and digest type.

        :param pkey: The key pair to sign with.
        :type pkey: :py:class:`PKey`
        :param digest: The name of the message digest to use for the signature,
            e.g. :py:data:`"sha256"`.
        :type digest: :py:class:`str`
        :return: ``None``
        zKey has only public partKey is uninitializedNo such digest methodr   N)r   r]   r   rA   EVP_get_digestbynamer  rI   rN   X509_REQ_signr  r   rM   )r|   r   digest
digest_objsign_results        r<   signzX509Req.sign  s     788  344..|F/CD
"455((DJJ
Ka(r;   c                    t        |t              st        d      t        j                  | j
                  |j                        }|dk  r
t                |S )a@  
        Verifies the signature on this certificate signing request.

        :param PKey key: A public key.

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

        :raises OpenSSL.crypto.Error: If the signature is invalid or there is a
            problem verifying the signature.
        pkey must be a PKey instancer   )rY   r    r[   rA   X509_REQ_verifyr  r   r   )r|   r   r   s      r<   verifyzX509Req.verify  sF     $%:;;%%dii<Q; "r;   Nr   )rF   x509.CertificateSigningRequest)r  r  rF   r#   r   r    rF   r   rF   r    r  r2   rF   r   r   rF   r"   r  z Iterable[_X509ExtensionInternal]rF   r   )rF   zlist[_X509ExtensionInternal]r   r    r  r   rF   r   )r   r    rF   r   )r6   r7   r8   r9   r}   r  r   r  r  r  r  r  r  r  r  r  r  r:   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                  8   e Zd ZdZd#dZed$d       Zd%dZed&d       Zd'dZ	d(dZ
d)dZd*d	Zd+d
Zd,dZd-dZd,dZd.dZd(dZd/dZd/dZd0dZd1dZd2dZ	 	 	 	 	 	 d3dZd4dZd2dZd4dZd5dZd6dZd7dZd8dZd7dZ d9dZ!d(dZ"	 	 	 	 d:d Z#d;d!Z$y")<r   z
    An X.509 certificate.
    c                    t        j                         }t        |t        j                  k7         t        j
                  |t         j                        | _        t               | _	        t               | _
        y r@   )rA   X509_newrM   rI   rN   rO   	X509_freerK  rx   _issuer_invalidator_subject_invalidator)r|   r   s     r<   r}   zX509.__init__  sJ    }}		)*WWT4>>2
#7#9 $8$:!r;   c                    | j                  |       }t        j                  |t        j                        |_        t               |_        t               |_        |S r@   )	r  rI   rO   rA   r  rK  rx   r  r  )r   r   certs      r<   _from_raw_x509_ptrzX509._from_raw_x509_ptr  sA    {{3WWT4>>2
#7#9 $8$:!r;   c                >    ddl m} t        t        |       } ||      S )z
        Export as a ``cryptography`` certificate.

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

        .. versionadded:: 17.1.0
        r   )load_der_x509_certificate)r  r  r(   r   )r|   r  r   s      r<   r  zX509.to_cryptography  s     	@}d3(--r;   c                    t        |t        j                        st        d      ddlm} |j                  |j                        }t        t        |      S )z
        Construct based on a ``cryptography`` *crypto_cert*.

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

        :rtype: X509

        .. versionadded:: 17.1.0
        zMust be a certificater   r  )
rY   r   Certificater[   r   r   r   r   r.   r   )r   crypto_certr   r   s       r<   r  zX509.from_cryptography  sD     +t'7'78344I&&x||4s33r;   c                    t        |t              st        d      t        t	        j
                  | j                  |      dk(         y)a	  
        Set the version number of the certificate. Note that the
        version value is zero-based, eg. a value of 0 is V1.

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

        :return: ``None``
        zversion must be an integerr   N)rY   r2   r[   rM   rA   X509_set_versionrK  )r|   r  s     r<   r  zX509.set_version  s8     '3'899--djj'BaGHr;   c                @    t        j                  | j                        S )z
        Return the version number of the certificate.

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

        :return: The public key.
        :rtype: :py:class:`PKey`
        T)r    r  rA   X509_get_pubkeyrK  r   rI   rN   r   rO   r   r   r   s     r<   r  zX509.get_pubkey  sg     ||D!))$**5
::" "WWTZZ););<
 r;   c                    t        |t              st        d      t        j                  | j
                  |j                        }t        |dk(         y)z
        Set the public key of the certificate.

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

        :return: :py:data:`None`
        r  r   N)rY   r    r[   rA   X509_set_pubkeyrK  r   rM   r  s      r<   r  zX509.set_pubkey)  s@     $%:;;))$**djjA

a(r;   c                   t        |t              st        d      |j                  rt	        d      |j
                  st	        d      t        j                  t        |            }|t        j                  k(  rt	        d      t        j                  | j                  |j                  |      }t        |dkD         y)a  
        Sign the certificate with this key and digest type.

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

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

        :return: :py:data:`None`
        r  zKey only has public partr  r  r   N)rY   r    r[   r   r]   r   rA   r  r  rI   rN   	X509_signrK  r   rM   )r|   r   r  evp_mdr  s        r<   r  z	X509.sign8  s     $%:;;788  344**<+?@TYY455nnTZZVDa(r;   c                   t        j                  | j                        }t        j                  d      }t        j
                  |t        j                  t        j                  |       t        j                  |d         }|t         j                  k(  rt        d      t        j                  t        j                  |            S )z
        Return the signature algorithm used in the certificate.

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

        :raises ValueError: If the signature algorithm is undefined.

        .. versionadded:: 0.13
        zASN1_OBJECT **r   zUndefined signature algorithm)rA   X509_get0_tbs_sigalgrK  rI   rJ   X509_ALGOR_get0rN   r  r  r]   rm   
OBJ_nid2ln)r|   sig_algalgr   s       r<   get_signature_algorithmzX509.get_signature_algorithmT  s     ++DJJ7hh'(S$))TYY@s1v&$.. <=={{4??3/00r;   c                   t        j                  t        |            }|t        j                  k(  rt        d      t        j                  dt         j                        }t        j                  dd      }t        |      |d<   t        j                  | j                  |||      }t        |dk(         dj                  t        j                  ||d         D cg c]  }t        |      j                          c}      S c c}w )a5  
        Return the digest of the X509 object.

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

        :return: The digest of the object, formatted as
            :py:const:`b":"`-delimited hex pairs.
        :rtype: :py:class:`bytes`
        r  zunsigned char[]zunsigned int[]r   r      :)rA   r  r  rI   rN   r]   rJ   EVP_MAX_MD_SIZErL   X509_digestrK  rM   rh  rP   r   upper)r|   digest_namer  rU   r}  digest_resultchs          r<   r  zX509.digestg  s     **<+DETYY455!2D4H4HI!115}-a((JJ}
 	*+yy ++m]15EFFB "##%F
 	
s    Dc                @    t        j                  | j                        S )z
        Return the hash of the X509 subject.

        :return: The hash of the subject.
        :rtype: :py:class:`bytes`
        )rA   X509_subject_name_hashrK  r{   s    r<   subject_name_hashzX509.subject_name_hash  s     **4::66r;   c                `   t        |t              st        d      t        |      dd }|j	                  d      }t        j                  d      }t        j                  ||      }t        |t
        j                  k7         t        j                  |d   t
        j                        }t        j                  |d          t        |t
        j                  k7         t        j                  |t        j                        }t        j                  | j                   |      }t        |dk(         y)z
        Set the serial number of the certificate.

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

        :return: :py:data`None`
        zserial must be an integerr  Nr   zBIGNUM**r   r   )rY   r2   r[   hexr  rI   rJ   rA   	BN_hex2bnrM   rN   BN_to_ASN1_INTEGERr   rO   ASN1_INTEGER_freeX509_set_serialNumberrK  )r|   serial
hex_serialhex_serial_bytesbignum_serialr   asn1_serialr`   s           r<   set_serial_numberz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                   t        j                  | j                        }t        j                  |t        j
                        }	 t        j                  |      }	 t	        j                  |      }t        |d      }|t        j                  |       t        j                  |       S # t        j                  |       w xY w# t        j                  |       w xY w)zx
        Return the serial number of this certificate.

        :return: The serial number.
        :rtype: int
           )rA   X509_get_serialNumberrK  ASN1_INTEGER_to_BNrI   rN   	BN_bn2hexrm   r2   r*  r   )r|   r  r  r  hexstring_serialr  s         r<   get_serial_numberzX509.get_serial_number  s     00<//TYYG		(6J.#';;z#: -r2!!*-LL' !!*-LL's$   C "B( =C (B??C Cc                    t        |t              st        d      t        j                  | j
                        }t        j                  ||       y)z
        Adjust the time stamp on which the certificate stops being valid.

        :param int amount: The number of seconds by which to adjust the
            timestamp.
        :return: ``None``
        amount must be an integerN)rY   r2   r[   rA   X509_getm_notAfterrK  X509_gmtime_adj)r|   amountnotAfters      r<   gmtime_adj_notAfterzX509.gmtime_adj_notAfter  s>     &#&788**4::6Xv.r;   c                    t        |t              st        d      t        j                  | j
                        }t        j                  ||       y)z
        Adjust the timestamp on which the certificate starts being valid.

        :param amount: The number of seconds by which to adjust the timestamp.
        :return: ``None``
        r  N)rY   r2   r[   rA   X509_getm_notBeforerK  r  )r|   r   	notBefores      r<   gmtime_adj_notBeforezX509.gmtime_adj_notBefore  s>     &#&788,,TZZ8	Y/r;   c                :   | j                         }|t        d      |j                  d      }t        j                  j	                  |d      }t        j
                  j                  }t        j                  j                  |      j                  d      }||k  S )z
        Check whether the certificate has expired.

        :return: ``True`` if the certificate has expired, ``False`` otherwise.
        :rtype: bool
        NzUnable to determine notAfterr  z%Y%m%d%H%M%SZ)tzinfo)	get_notAfterr]   r   datetimestrptimetimezoneutcnowreplace)r|   
time_bytestime_string	not_afterUTCutcnows         r<   has_expiredzX509.has_expired  s     &&(
;<< ''0%%..{OL	##""&&s+3343@6!!r;   c                8    t         || j                              S r@   )rv   rK  )r|   whichs     r<   _get_boundary_timezX509._get_boundary_time  s    eDJJ/00r;   c                @    | j                  t        j                        S )a
  
        Get the timestamp at which the certificate starts being valid.

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

            YYYYMMDDhhmmssZ

        :return: A timestamp string, or ``None`` if there is none.
        :rtype: bytes or NoneType
        )r8  rA   r$  r{   s    r<   get_notBeforezX509.get_notBefore  s     &&t'?'?@@r;   c                :    t         || j                        |      S r@   )ra   rK  )r|   r7  r_   s      r<   _set_boundary_timezX509._set_boundary_time  s     eDJJ/66r;   c                B    | j                  t        j                  |      S )z
        Set the timestamp at which the certificate starts being valid.

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

            YYYYMMDDhhmmssZ

        :param bytes when: A timestamp string.
        :return: ``None``
        )r<  rA   r$  r|   r_   s     r<   set_notBeforezX509.set_notBefore   s     &&t'?'?FFr;   c                @    | j                  t        j                        S )a	  
        Get the timestamp at which the certificate stops being valid.

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

            YYYYMMDDhhmmssZ

        :return: A timestamp string, or ``None`` if there is none.
        :rtype: bytes or NoneType
        )r8  rA   r  r{   s    r<   r)  zX509.get_notAfter  s     &&t'>'>??r;   c                B    | j                  t        j                  |      S )z
        Set the timestamp at which the certificate stops being valid.

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

            YYYYMMDDhhmmssZ

        :param bytes when: A timestamp string.
        :return: ``None``
        )r<  rA   r  r>  s     r<   set_notAfterzX509.set_notAfter  s     &&t'>'>EEr;   c                    t         j                  t               } || j                        |_        t	        |j                  t
        j                  k7         | |_        |S r@   )r"   r  rK  r   rM   rI   rN   r  )r|   r7  r   s      r<   	_get_namezX509._get_name'  sE    )4::&


dii/0 r;   c                    t        |t              st        d       || j                  |j                        }t        |dk(         y )Nzname must be an X509Namer   )rY   r"   r[   rK  r   rM   )r|   r7  r   r`   s       r<   	_set_namezX509._set_name2  s8    $)6774::tzz2

a(r;   c                z    | j                  t        j                        }| j                  j	                  |       |S )a  
        Return the issuer of this certificate.

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

        :return: The issuer of this certificate.
        :rtype: :class:`X509Name`
        )rD  rA   X509_get_issuer_namer  r   r   s     r<   
get_issuerzX509.get_issuer8  s1     ~~d778  $$T*r;   c                x    | j                  t        j                  |       | j                  j	                          y)z
        Set the issuer of this certificate.

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

        :return: ``None``
        N)rF  rA   X509_set_issuer_namer  r   )r|   rT  s     r<   
set_issuerzX509.set_issuerH  s*     	t00&9  &&(r;   c                z    | j                  t        j                        }| j                  j	                  |       |S )a  
        Return the subject of this certificate.

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

        :return: The subject of this certificate.
        :rtype: :class:`X509Name`
        )rD  rA   X509_get_subject_namer  r   r   s     r<   r  zX509.get_subjectT  s1     ~~d889!!%%d+r;   c                x    | j                  t        j                  |       | j                  j	                          y)z
        Set the subject of this certificate.

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

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

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

        .. versionadded:: 0.12
        )rA   X509_get_ext_countrK  r{   s    r<   get_extension_countzX509.get_extension_countp  s     &&tzz22r;   c                    t        j                  dt        d       |D ]V  }t        |t              st        d      t        j                  | j                  |j                  d      }t        |dk(         X y)z
        Add extensions to the certificate.

        :param extensions: The extensions to add.
        :type extensions: An iterable of :py:class:`X509Extension` objects.
        :return: ``None``
        r  r  r  r  r  r   N)r  r  r  rY   r  r]   rA   X509_add_extrK  rP  rM   )r|   r  r  r$  s       r<   r  zX509.add_extensions{  sh     	& 	
 Cc#9: !NOO**4::s~~rJJJ!O, r;   c                   t        j                  dt        d       t        j	                  t              }t        j                  | j                  |      |_        |j                  t        j                  k(  rt        d      t        j                  |j                        }t        j                  |t
        j                        |_        |S )a  
        Get a specific extension of the certificate by index.

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

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

        .. versionadded:: 0.12
        r  r  r  zextension index out of bounds)r  r  r  r  r  rA   X509_get_extrK  rP  rI   rN   
IndexErrorr  rO   rO  )r|   indexr  rV  s       r<   get_extensionzX509.get_extension  s     	& 	
 %,,-CD**4::u=>>TYY&<==++CNN;	D,D,DE
r;   Nr   )r   r	   rF   r   )rF   x509.Certificate)r  r\  rF   r   r  r   r  r  r  rF  )r  r   rF   rZ   )r  r2   rF   r   )r   r2   rF   r   r   )r7  r	   rF   bytes | None)rF   r]  )r7  zCallable[..., Any]r_   rZ   rF   r   )r_   rZ   rF   r   )r7  r	   rF   r"   )r7  r	   r   r"   rF   r   r  )rT  r"   rF   r   )rS  r"   rF   r   r  )rZ  r2   rF   r  )%r6   r7   r8   r9   r}   r   r  r  r  r  r  r  r  r  r  r  r  r  r  r"  r&  r5  r8  r:  r<  r?  r)  rB  rD  rF  rI  rL  r  rQ  rT  r  r[  r:   r;   r<   r   r     s    ;  . 4 4&I1))81&
>7)8((/0""1A7'7/47	7
G@F	) 
) 
*	3-:-	-6r;   r   c                  f   e Zd ZU dZej
                  Zded<   ej                  Z	ded<   ej                  Zded<   ej                  Zded<   ej                  Zded<   ej                   Zded<   ej$                  Zded	<   ej(                  Zded
<   ej,                  Zded<   ej0                  Zded<   y)r'   a  
    Flags for X509 verification, used to change the behavior of
    :class:`X509Store`.

    See `OpenSSL Verification Flags`_ for details.

    .. _OpenSSL Verification Flags:
        https://www.openssl.org/docs/manmaster/man3/X509_VERIFY_PARAM_set_flags.html
    r2   	CRL_CHECKCRL_CHECK_ALLIGNORE_CRITICALX509_STRICTALLOW_PROXY_CERTSPOLICY_CHECKEXPLICIT_POLICYINHIBIT_MAPCHECK_SS_SIGNATUREPARTIAL_CHAINN)r6   r7   r8   r9   rA   X509_V_FLAG_CRL_CHECKr_  r  X509_V_FLAG_CRL_CHECK_ALLr`  X509_V_FLAG_IGNORE_CRITICALra  X509_V_FLAG_X509_STRICTrb  X509_V_FLAG_ALLOW_PROXY_CERTSrc  X509_V_FLAG_POLICY_CHECKrd  X509_V_FLAG_EXPLICIT_POLICYre  X509_V_FLAG_INHIBIT_MAPrf  X509_V_FLAG_CHECK_SS_SIGNATURErg  X509_V_FLAG_PARTIAL_CHAINrh  r:   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                  N    e Zd ZdZd	dZd
dZddZddZddZ	 d	 	 	 	 	 ddZ	y)r$   a  
    An X.509 store.

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

    An X.509 store, being only a description, cannot be used by itself to
    verify a certificate. To carry out the actual verification process, see
    :class:`X509StoreContext`.
    c                ~    t        j                         }t        j                  |t         j                        | _        y r@   )rA   X509_STORE_newrI   rO   X509_STORE_free_storer|   stores     r<   r}   zX509Store.__init__  s(    ##%ggeT%9%9:r;   c                    t        |t              s
t               t        j                  | j
                  |j                        }t        |dk(         y)a  
        Adds a trusted certificate to this store.

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

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

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

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

        :return: ``None`` if the certificate was added successfully.
        r   N)rY   r   r[   rA   X509_STORE_add_certrw  rK  rM   )r|   r  r   s      r<   add_certzX509Store.add_cert  s<      $%+&&t{{DJJ?q!r;   c                   t        |t        j                        rddlm} t        |j                  |j                              }t        j                  |t        j                        }t        |t        j                  k7         t        j                  |t        j                        }nt        d      t        t        j                   | j"                  |      dk7         y)a  
        Add a certificate revocation list to this store.

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

        .. versionadded:: 16.1.0

        :param crl: The certificate revocation list to add to this store.
        :type crl: ``cryptography.x509.CertificateRevocationList``
        :return: ``None`` if the certificate revocation list was added
            successfully.
        r   r  z?CRL must be of type cryptography.x509.CertificateRevocationListN)rY   r   CertificateRevocationListr   r   rR   r   r   rA   d2i_X509_CRL_biorI   rN   rM   rO   X509_CRL_freer[   X509_STORE_add_crlrw  )r|   crlr   rC   openssl_crls        r<   add_crlzX509Store.add_crl  s     c499:Ms//=>C//TYY?KK49945''+t'9'9:C> 
 	//SAQFGr;   c                \    t        t        j                  | j                  |      dk7         y)a  
        Set verification flags to this store.

        Verification flags can be combined by oring them together.

        .. note::

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

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

        .. versionadded:: 16.1.0

        :param int flags: The verification flags to set on this store.
            See :class:`X509StoreFlags` for available constants.
        :return: ``None`` if the verification flags were successfully set.
        r   N)rM   rA   X509_STORE_set_flagsrw  )r|   flagss     r<   	set_flagszX509Store.set_flags  s"    , 	11$++uEJKr;   c                :   t        j                         }t        j                  |t         j                        }t        j
                  |t        j                  |j                                      t        t        j                  | j                  |      dk7         y)a  
        Set the time against which the certificates are verified.

        Normally the current time is used.

        .. note::

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

        .. versionadded:: 17.0.0

        :param datetime vfy_time: The verification time to set on this store.
        :return: ``None`` if the verification time was successfully set.
        r   N)rA   X509_VERIFY_PARAM_newrI   rO   X509_VERIFY_PARAM_freeX509_VERIFY_PARAM_set_timecalendartimegm	timetuplerM   X509_STORE_set1_paramrw  )r|   vfy_timeparams      r<   set_timezX509Store.set_time-  sm      **,t::;''8??8#5#5#78	
 	224;;F!KLr;   Nc                    |t         j                  }nt        |      }|t         j                  }nt        |      }t        j                  | j
                  ||      }|st                yy)a  
        Let X509Store know where we can find trusted certificates for the
        certificate chain.  Note that the certificates have to be in PEM
        format.

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

        .. note::

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

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

        .. versionadded:: 20.0

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

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

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

        N)rI   rN   _path_bytesrA   X509_STORE_load_locationsrw  r   )r|   cafilecapathload_results       r<   load_locationszX509Store.load_locationsE  s`    B >YYF (F>YYF (F44KK
  " r;   r   )r  r   rF   r   )r  zx509.CertificateRevocationListrF   r   )r  r2   rF   r   )r  zdatetime.datetimerF   r   r@   )r  StrOrBytesPathr  zStrOrBytesPath | NonerF   r   )
r6   r7   r8   r9   r}   r|  r  r  r  r  r:   r;   r<   r$   r$     sG    ;",H<L0M2 GK/#$/#.C/#	/#r;   r$   c                  4     e Zd ZdZ	 	 	 	 	 	 	 	 d fdZ xZS )r&   z
    An exception raised when an error occurred while verifying a certificate
    using `OpenSSL.X509StoreContext.verify_certificate`.

    :ivar certificate: The certificate which caused verificate failure.
    :type certificate: :class:`X509`
    c                @    t         |   |       || _        || _        y r@   )r   r}   errorscertificate)r|   messager  r  r   s       r<   r}   zX509StoreContextError.__init__  s!     	!&r;   )r  r   r  z	list[Any]r  r   rF   r   )r6   r7   r8   r9   r}   r   r   s   @r<   r&   r&   w  s2    ''$-'<@'	' 'r;   r&   c                  v    e Zd ZdZ	 d
	 	 	 	 	 	 	 ddZe	 	 	 	 dd       Zedd       ZddZddZ	ddZ
dd	Zy)r%   a9  
    An X.509 store context.

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

    :param X509Store store: The certificates which will be trusted for the
        purposes of any verifications.
    :param X509 certificate: The certificate to be verified.
    :param chain: List of untrusted certificates that may be used for building
        the certificate chain. May be ``None``.
    :type chain: :class:`list` of :class:`X509`
    Nc                L    || _         || _        | j                  |      | _        y r@   )rw  _cert_build_certificate_stack_chain)r|   ry  r  chains       r<   r}   zX509StoreContext.__init__  s$      
33E:r;   c                   dd}| t        |       dk(  rt        j                  S t        j                         }t        |t        j                  k7         t        j                  ||      }| D ]  }t        |t              st        d      t        t        j                  |j                        dkD         t        j                  ||j                        dk  smt        j                  |j                         t                 |S )Nc                    t        t        j                  |             D ]-  }t        j                  | |      }t        j                  |       / t        j
                  |        y r@   )r  rA   sk_X509_numsk_X509_valuer  sk_X509_free)sr   r  s      r<   cleanupz:X509StoreContext._build_certificate_stack.<locals>.cleanup  sL     4++A./&&q!,q! 0 a r;   r   z+One of the elements is not an X509 instance)r  r	   rF   r   )rL   rI   rN   rA   sk_X509_new_nullrM   rO   rY   r   r[   X509_up_refrK  sk_X509_pushr  r   )certificatesr  r  r  s       r<   r  z)X509StoreContext._build_certificate_stack  s    	! 3|#4#999%%'*+w' DdD) MNND,,TZZ81<=  

3q8tzz*$& ! r;   c                   t        j                  t        j                  t        j                  |                   j                  d      }t        j                  |       t        j                  |       |g}t        j                  |       }t        j                  |      }t        j                  |      }t        |||      S )z
        Convert an OpenSSL native context error failure into a Python
        exception.

        When a call to native OpenSSL X509_verify_cert fails, additional
        information about the failure can be obtained from the store context.
        r  )rI   rm   rA   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  rK  r  pycerts         r<   _exception_from_contextz(X509StoreContext._exception_from_context  s     ++..--i8
 &/	 	 )))4//	:
 44Y?e$((/$Wff==r;   c                   t        j                         }t        |t        j                  k7         t        j
                  |t         j                        }t        j                  || j                  j                  | j                  j                  | j                        }t        |dk(         t        j                  |      }|dk  r| j                  |      |S )a3  
        Verifies the certificate and runs an X509_STORE_CTX containing the
        results.

        :raises X509StoreContextError: If an error occurred when validating a
          certificate in the context. Sets ``certificate`` attribute to
          indicate which certificate caused the error.
        r   r   )rA   X509_STORE_CTX_newrM   rI   rN   rO   X509_STORE_CTX_freeX509_STORE_CTX_initrw  r  rK  r  X509_verify_certr  )r|   r  re   s      r<   _verify_certificatez$X509StoreContext._verify_certificate  s     ++-		TYY./GGIt'?'?@	&&t{{))4::+;+;T[[
 	q!##I.!8..y99r;   c                    || _         y)z
        Set the context's X.509 store.

        .. versionadded:: 0.15

        :param X509Store store: The store description which will be used for
            the purposes of any *future* verifications.
        N)rw  rx  s     r<   	set_storezX509StoreContext.set_store  s     r;   c                $    | j                          y)a"  
        Verify a certificate in a context.

        .. versionadded:: 0.15

        :raises X509StoreContextError: If an error occurred when validating a
          certificate in the context. Sets ``certificate`` attribute to
          indicate which certificate caused the error.
        N)r  r{   s    r<   verify_certificatez#X509StoreContext.verify_certificate  s     	  "r;   c                   | j                         }t        j                  |      }t        |t        j
                  k7         g }t        t        j                  |            D ]Z  }t        j                  ||      }t        |t        j
                  k7         t        j                  |      }|j                  |       \ t        j                  |       |S )aR  
        Verify a certificate in a context and return the complete validated
        chain.

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

        .. versionadded:: 20.0
        )r  rA   X509_STORE_CTX_get1_chainrM   rI   rN   r  r  r  r   r  r   r  )r|   r  
cert_stackr   r   r  r  s          r<   get_verified_chainz#X509StoreContext.get_verified_chain	  s     ,,.	 33I>

dii/0t''
34A%%j!4DDDII-.,,T2FMM&!	 5 	*%r;   r@   )ry  r$   r  r   r  Sequence[X509] | NonerF   r   )r  r  rF   r   )r  r	   rF   r&   r   )ry  r$   rF   r   r   )rF   z
list[X509])r6   r7   r8   r9   r}   staticmethodr  r  r  r  r  r  r:   r;   r<   r%   r%     s    & (,	;; ; %	;
 
; +	 : > >20	
#r;   r%   c                   t        |t              r|j                  d      }t        |      }| t        k(  rCt        j                  |t        j                  t        j                  t        j                        }n9| t        k(  r%t        j                  |t        j                        }nt        d      |t        j                  k(  r
t                t        j                  |      S )a  
    Load a certificate (X509) from the string *buffer* encoded with the
    type *type*.

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

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

    :return: The X509 object
    r   3type argument must be FILETYPE_PEM or FILETYPE_ASN1)rY   r   r  rR   r   rA   PEM_read_bio_X509rI   rN   r   d2i_X509_bior]   r   r   r  )r   rP   rC   r   s       r<   r.   r.   &  s     &#w'
v
C|%%c499diiK		  dii0NOOtyy""4((r;   c                ^   t               }| t        k(  r!t        j                  ||j                        }na| t
        k(  r!t        j                  ||j                        }n7| t        k(  r#t        j                  ||j                  dd      }nt        d      t        |dk(         t        |      S )a  
    Dump the certificate *cert* into a buffer string encoded with the type
    *type*.

    :param type: The file type (one of FILETYPE_PEM, FILETYPE_ASN1, or
        FILETYPE_TEXT)
    :param cert: The certificate to dump
    :return: The buffer with the dumped certificate in
    r   Ctype argument must be FILETYPE_PEM, FILETYPE_ASN1, or FILETYPE_TEXTr   )rR   r   rA   PEM_write_bio_X509rK  r   i2d_X509_bior   X509_print_exr]   rM   rW   )r   r  rC   result_codes       r<   r(   r(   C  s     .C|--c4::>		''TZZ8		((djj!Q?
 	

 K1$%#r;   c                    t               }| t        k(  rt        j                  }n%| t        k(  rt        j
                  }nt        d       |||j                        }|dk7  r
t                t        |      S )z
    Dump a public key to a buffer.

    :param type: The file type (one of :data:`FILETYPE_PEM` or
        :data:`FILETYPE_ASN1`).
    :param PKey pkey: The public key to dump
    :return: The buffer with the dumped key in it.
    :rtype: bytes
    r  r   )
rR   r   rA   PEM_write_bio_PUBKEYr   i2d_PUBKEY_bior]   r   r   rW   )r   r   rC   	write_bior  s        r<   r+   r+   _  sf     .C|--			''	NOOC,Ka#r;   c           	        t               }t        |t              st        d      |I|t        d      t	        j
                  t        |            }|t        j                  k(  rt        d      t        j                  }t        | |      }| t        k(  rXt	        j                  ||j                  |t        j                  d|j                  |j                        }|j!                          n| t"        k(  r!t	        j$                  ||j                        }n| t&        k(  rt	        j(                  |j                        t        j*                  k7  rt        d      t        j,                  t	        j.                  |j                        t        j0                        }t	        j2                  ||d      }nt        d      t5        |dk7         t7        |      S )a  
    Dump the private key *pkey* into a buffer string encoded with the type
    *type*.  Optionally (if *type* is :const:`FILETYPE_PEM`) encrypting it
    using *cipher* and *passphrase*.

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

    :return: The buffer with the dumped key in
    :rtype: bytes
    zpkey must be a PKeyzDif a value is given for cipher one must also be given for passphrasezInvalid cipher namer   z-Only RSA keys are supported for FILETYPE_TEXTr  )rR   rY   r    r[   rA   EVP_get_cipherbynamer  rI   rN   r]   _PassphraseHelperr   PEM_write_bio_PrivateKeyr   callbackcallback_argsraise_if_problemr   i2d_PrivateKey_bior   r   r   rO   r   r   	RSA_printrM   rW   )	r   r   cipher
passphraserC   
cipher_objhelperr  r   s	            r<   r*   r*   x  s   * .CdD!-..8  ..|F/CD
"233YY
tZ0F|33JJIIOO  
 	!		--c4::>		DJJ'4+<+<<KLLggd,,TZZ8$--HnnS#q1
 	

 K1$%#r;   c                  x    e Zd Z	 	 d	 	 	 	 	 	 	 	 	 ddZed	d       Zed	d       Zefd
dZ	 	 	 	 	 	 	 	 	 	 ddZ	y)r  c                h    |t         k7  r|t        d      || _        || _        || _        g | _        y )Nz0only FILETYPE_PEM key format supports encryption)r   r]   _passphrase
_more_args	_truncate	_problems)r|   r   r  	more_argstruncates        r<   r}   z_PassphraseHelper.__init__  s@     <J$:B  &#!*,r;   c                    | j                   t        j                  S t        | j                   t              st        | j                         r t        j                  d| j                        S t        d      )Npem_password_cb2Last argument must be a byte string or a callable.)	r  rI   rN   rY   rZ   callabler  _read_passphraser[   r{   s    r<   r  z_PassphraseHelper.callback  s]    #99((%0HT=M=M4N==!2D4I4IJJD r;   c                    | j                   t        j                  S t        | j                   t              st        | j                         rt        j                  S t        d      )Nr  )r  rI   rN   rY   rZ   r  r[   r{   s    r<   r  z_PassphraseHelper.callback_args  sO    #99((%0HT=M=M4N99D r;   c                    | j                   r'	 t        |       | j                   j                  d      y # |$ r Y #w xY wr0  )r  _exception_from_error_queuepop)r|   exceptionTypes     r<   r  z"_PassphraseHelper.raise_if_problem  sF    >>+M: ..$$Q''  ! s   5 ==c                   	 t        | j                        r2| j                  r| j                  |||      }n,| j                  |      }n| j                  J | j                  }t        |t              st        d      t        |      |kD  r| j                  r|d | }nt        d      t        t        |            D ]  }|||dz    ||<    t        |      S # t        $ r%}| j                  j                  |       Y d }~yd }~ww xY w)NzBytes expectedz+passphrase returned by callback is too longr   r   )r  r  r  rY   rZ   r]   rL   r  r  	Exceptionr  r   )r|   rw  sizerwflaguserdatar   r   es           r<   r  z"_PassphraseHelper._read_passphrase  s    	(()??!--dFHEF!--f5F''333))fe, !1226{T!>>#ET]F$E  3v;'AE*A (v; 	NN!!!$	s   CC 	D!DDN)FF)
r   r2   r  PassphraseCallableT | Noner  r   r  r   rF   r   r   )r  ztype[Exception]rF   r   )
rw  r	   r  r2   r  r	   r  r	   rF   r2   )
r6   r7   r8   r}   r  r  r  r   r  r  r:   r;   r<   r  r    s    
  -- /- 	-
 - 
-      AF (!+.:=	r;   r  c                4   t        |t              r|j                  d      }t        |      }| t        k(  rCt        j                  |t        j                  t        j                  t        j                        }n9| t        k(  r%t        j                  |t        j                        }nt        d      |t        j                  k(  r
t                t        j                  t              }t        j                  |t
        j                         |_        d|_        |S )a<  
    Load a public key from a buffer.

    :param type: The file type (one of :data:`FILETYPE_PEM`,
        :data:`FILETYPE_ASN1`).
    :param buffer: The buffer the key is stored in.
    :type buffer: A Python string object, either unicode or bytestring.
    :return: The PKey object.
    :rtype: :class:`PKey`
    r   r  T)rY   r   r  rR   r   rA   PEM_read_bio_PUBKEYrI   rN   r   d2i_PUBKEY_bior]   r   r    r  rO   r   r   r   )r   rP   rC   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                N   t        |t              r|j                  d      }t        |      }t	        | |      }| t
        k(  rKt        j                  |t        j                  |j                  |j                        }|j                          n9| t        k(  r%t        j                  |t        j                        }nt        d      |t        j                  k(  r
t!                t"        j%                  t"              }t        j&                  |t        j(                        |_        |S )a  
    Load a private key (PKey) from the string *buffer* encoded with the type
    *type*.

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

    :return: The PKey object
    r   r  )rY   r   r  rR   r  r   rA   PEM_read_bio_PrivateKeyrI   rN   r  r  r  r   d2i_PrivateKey_bior]   r   r    r  rO   r   r   )r   rP   r  rC   r  r  r   s          r<   r0   r0   -	  s    " &#w'
v
CtZ0F|//FOOV-A-A
 	!		**3		:NOO499<<D4#5#56DJKr;   c                ^   t               }| t        k(  r!t        j                  ||j                        }na| t
        k(  r!t        j                  ||j                        }n7| t        k(  r#t        j                  ||j                  dd      }nt        d      t        |dk7         t        |      S )av  
    Dump the certificate request *req* into a buffer string encoded with the
    type *type*.

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


    .. deprecated:: 24.2.0
       Use `cryptography.x509.CertificateSigningRequest` instead.
    r   r  )rR   r   rA   PEM_write_bio_X509_REQr  r   i2d_X509_REQ_bior   X509_REQ_print_exr]   rM   rW   )r   r  rC   r  s       r<   r)   r)   V	  s     .C|11#sxx@		++C:		,,S#((AqA
 	

 K1$%#r;   r)   c                $   t        |t              r|j                  d      }t        |      }| t        k(  rCt        j                  |t        j                  t        j                  t        j                        }n9| t        k(  r%t        j                  |t        j                        }nt        d      t        |t        j                  k7         t        j                  t              }t        j                  |t
        j                         |_        |S )a  
    Load a certificate request (X509Req) from the string *buffer* encoded with
    the type *type*.

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

    .. deprecated:: 24.2.0
       Use `cryptography.x509.load_der_x509_csr` or
       `cryptography.x509.load_pem_x509_csr` instead.
    r   r  )rY   r   r  rR   r   rA   PEM_read_bio_X509_REQrI   rN   r   d2i_X509_REQ_bior]   rM   _X509ReqInternalr  rO   r  r  )r   rP   rC   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/   r@   )rP   r]  rF   r	   )rC   r	   rF   rZ   )r^   r	   r_   rZ   rF   r   )r_   rZ   rF   r	   )rq   r	   rF   r]  )rF   r   )r   r   rF   r   )r   r2   rP   rZ   rF   r   )r   r2   r  r   rF   rZ   )r   r2   r   r    rF   rZ   r  )
r   r2   r   r    r  rE  r  r  rF   rZ   )r   r2   rP   str | bytesrF   r    )r   r2   rP   r  r  r  rF   r    )r   r2   r  r#   rF   rZ   )r   r2   rP   rZ   rF   r#   )p
__future__r   r  r*  	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   rI   r   rA   r   _make_assertr   r  __all__r   r   r   r   r   _PrivateKeyr   r   r   r   r   
_PublicKeyr   r   rZ   r  PassphraseCallableTSSL_FILETYPE_PEMr   r  SSL_FILETYPE_ASN1r   r   r   r   EVP_PKEY_DSAr   EVP_PKEY_DHr3   EVP_PKEY_ECr4   r  r   r   rM   rR   rW   ra   rf   rv   rx   r    r   r-   r  
deprecatedr6   r  r,   total_orderingr"   r!   r  r#   r  r   r'   r$   r&   r%   r.   r(   r+   r*   r  r1   r0   r)   r  r/   r  r:   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;   