
    kj                      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
 d dlmZ d dlmZmZmZ ej                  dk\  rd dlmZ n,ej                  d	k  r ej$                  d
      ZdLdZnd dlmZ d dlmZmZ d dlmZmZmZmZmZ d dlmZ d dlm Z! d dlm"Z# d dlm$Z% d dlm&Z' d dlm(Z) d dlm*Z+ g dZ,eejZ                  ej\                  ej^                  ej`                  ejb                  f   Z2eejf                  ejh                  ejj                  ejl                  ejn                  f   Z8ee2e8f   Z9ee:ede:f   f   Z;e'jx                  Z=de>d<   e'j~                  Z@de>d<   dZAe'j                  ZCde>d<   e'j                  ZEde>d<   e'j                  ZGde>d<   e'j                  ZIde>d<    G d d eJ      ZK ee#eK      ZL e)eK      ZMdMdNd!ZNdOd"ZOdPd#ZPdQd$ZQdRd%ZR G d& d'      ZS G d( d)      ZT G d* d+      ZU ed,      dSd-       ZV ed.      dTd/       ZWej                   G d0 d1             ZY ed2       G d3 d4             ZZ G d5 d6      Z[ G d7 d8      Z\ G d9 d:      Z] G d; d<eJ      Z^ G d= d>      Z_dUd?Z`dVd@ZadWdAZb	 	 dX	 	 	 	 	 	 	 	 	 dYdBZc G dC dD      ZddZdEZe	 dM	 	 	 	 	 	 	 d[dFZfd\dGZgegZh ej"                  egeid2ejdHI       d]dJZkekZl ej"                  ekeid2ejdKI       y)^    )annotationsN)	b16encode)Sequence)partial)AnyCallableUnion)      )
deprecated)r
      Tc                    d S )Nc                    | S N )fs    W/home/ubuntu/.cache/pipx/cdb5059130eadca/lib/python3.12/site-packages/OpenSSL/crypto.py<lambda>zdeprecated.<locals>.<lambda>   s         r   )msgkwargss     r   r   r      s    r   )utilsx509)dsaeced448ed25519rsa)StrOrBytesPath)byte_string)exception_from_error_queue)ffi)lib)make_assert)
path_bytes)FILETYPE_ASN1FILETYPE_PEMFILETYPE_TEXTTYPE_DSATYPE_RSAX509ErrorPKeyX509NameX509Req	X509StoreX509StoreContextX509StoreContextErrorX509StoreFlagsdump_certificatedump_certificate_requestdump_privatekeydump_publickeyget_elliptic_curveget_elliptic_curvesload_certificateload_certificate_requestload_privatekeyload_publickey.intr(   r'   i  r+   r*   TYPE_DHTYPE_ECc                      e Zd ZdZy)r-   z7
    An error occurred in an `OpenSSL.crypto` API.
    N)__name__
__module____qualname____doc__r   r   r   r-   r-   r   s    r   r-   c                T   | 8t        j                  t        j                               }t         j                  }n;t	        j
                  d|       }t        j                  |t        |             }|fdd}t        |t        j                  k7         t	        j                  ||      }|S )z
    Allocate a new OpenSSL memory BIO.

    Arrange for the garbage collector to clean it up automatically.

    :param buffer: None or some bytes to use to put into the BIO so that they
        can be read out.
    char[]c                ,    t        j                  |       S r   )_libBIO_free)biorefs     r   freez_new_mem_buf.<locals>.free   s    ==%%r   )rL   r   rM   r   returnr   )rJ   BIO_new	BIO_s_memrK   _ffinewBIO_new_mem_buflen_openssl_assertNULLgc)bufferrL   rN   datas       r   _new_mem_bufr[   |   s     ~ll4>>+,}}xx&)""4V5 '+ 	& C499$%
''#t
CJr   c                    t        j                  d      }t        j                  | |      }t        j                  |d   |      dd S )zO
    Copy the contents of an OpenSSL BIO object into a Python byte string.
    zchar**r   N)rR   rS   rJ   BIO_get_mem_datarY   )rL   result_bufferbuffer_lengths      r   _bio_to_stringr`      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	TypeErrorrV   rR   rW   rJ   ASN1_TIME_set_string
ValueError)boundarywhen
set_results      r   _set_asn1_timerj      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.
    )rJ   ASN1_TIME_newrV   rR   rW   rX   ASN1_TIME_freerj   )rh   rets     r   _new_asn1_timero      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.
    zASN1_STRING*r   NzASN1_GENERALIZEDTIME**)rR   castrJ   ASN1_STRING_lengthASN1_STRING_typeV_ASN1_GENERALIZEDTIMEstringASN1_STRING_get0_datarS   ASN1_TIME_to_generalizedtimerV   rW   ASN1_GENERALIZEDTIME_free)	timestampstring_timestampgeneralized_timestampstring_datastring_results        r   _get_asn1_timer~      s     yy;/0A5./43N3NN{{4556FGHH $)A B)))5JK-a0DII=>99^5J15MN001ABK0&&'<Q'?@r   c                  $    e Zd ZddZddZddZy)_X509NameInvalidatorc                    g | _         y r   )_namesselfs    r   __init__z_X509NameInvalidator.__init__   s	    &(r   c                :    | j                   j                  |       y r   )r   appendr   names     r   addz_X509NameInvalidator.add   s    4 r   c                *    | j                   D ]  }|` y r   )r   _namer   s     r   clearz_X509NameInvalidator.clear   s    KK 	D
	r   NrO   Noner   r/   rO   r   )rC   rD   rE   r   r   r   r   r   r   r   r      s    )!r   r   c                  Z    e Zd ZdZdZdZddZddZedd       Z	ddZ
ddZdd	Zdd
Zy)r.   zD
    A class representing an DSA or RSA public key or key pair.
    FTc                    t        j                         }t        j                  |t         j                        | _        d| _        y )NF)rJ   EVP_PKEY_newrR   rX   EVP_PKEY_free_pkey_initializedr   pkeys     r   r   zPKey.__init__   s0      "WWT4#5#56
!r   c                    ddl m}m} | j                  r0t	        t
        |       }t        j                  t         ||            S t        t
        |       }t        j                  t         ||d            S )a  
        Export as a ``cryptography`` key.

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

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

        .. versionadded:: 16.1.0
        r   )load_der_private_keyload_der_public_keyN)password)
,cryptography.hazmat.primitives.serializationr   r   _only_publicr8   r'   typingrq   _Keyr7   )r   r   r   ders       r   to_cryptography_keyzPKey.to_cryptography_key  sZ    	

  5C;;t%8%=>>!-6C;;t%9#%MNNr   c                   t        |t        j                  t        j                  t        j
                  t        j                  t        j                  t        j                  t        j                  t        j                  t        j                  t        j                  f
      st!        d      ddlm}m}m}m} t        |t        j                  t        j                  t        j                  t        j                  t        j                  f      r4t-        t.        |j1                  |j2                  |j4                              S |j7                  |j2                  |j8                   |             }t;        t.        |      S )z
        Construct based on a ``cryptography`` *crypto_key*.

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

        :rtype: PKey

        .. versionadded:: 16.1.0
        zUnsupported key typer   )EncodingNoEncryptionPrivateFormatPublicFormat)rb   r   DSAPrivateKeyDSAPublicKeyr   EllipticCurvePrivateKeyEllipticCurvePublicKeyr   Ed25519PrivateKeyEd25519PublicKeyr   Ed448PrivateKeyEd448PublicKeyr   RSAPrivateKeyRSAPublicKeyrd   r   r   r   r   r   r>   r'   public_bytesDERSubjectPublicKeyInfoprivate_bytesPKCS8r=   )cls
crypto_keyr   r   r   r   r   s          r   from_cryptography_keyzPKey.from_cryptography_key  s(    !!  **))))((%%$$!!  
 233	
 	
   ))(($$  	
 "''LL,"C"C  **m11<>C #=#66r   c           	        t        |t              st        d      t        |t              st        d      |t        k(  r|dk  rt	        d      t        j                         }t        j                  |t
        j                        }t        j                  |t
        j                         t        j                         }t        j                  |||t        j                        }t        |dk(         t        j                   | j"                  |      }t        |dk(         d| _        y|t$        k(  r
t        j&                         }t        |t        j                  k7         t        j                  |t
        j(                        }t        j*                  ||t        j                  dt        j                  t        j                  t        j                        }t        |dk(         t        t        j,                  |      dk(         t        t        j.                  | j"                  |      dk(         d| _        yt1        d      )	a3  
        Generate a key pair of the given type, with the given number of bits.

        This generates a key "into" the this object.

        :param type: The key type.
        :type type: :py:data:`TYPE_RSA` or :py:data:`TYPE_DSA`
        :param bits: The number of bits.
        :type bits: :py:data:`int` ``>= 0``
        :raises TypeError: If :py:data:`type` or :py:data:`bits` isn't
            of the appropriate type.
        :raises ValueError: If the number of bits isn't an integer of
            the appropriate size.
        :return: ``None``
        ztype must be an integerzbits must be an integerr   zInvalid number of bits   zNo such key typeTN)rb   r?   rd   r+   rf   rJ   BN_newrR   rX   BN_freeBN_set_wordRSA_F4RSA_newRSA_generate_key_exrW   rV   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_keyS  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   rd   rJ   EVP_PKEY_typer   EVP_PKEY_RSAEVP_PKEY_get1_RSAr   rR   rX   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.
        )rJ   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.
        )rJ   EVP_PKEY_bitsr   r   s    r   r   z	PKey.bits  s     !!$**--r   Nr   )rO   r   )r   r   rO   r.   )r   r?   r   r?   rO   r   rO   boolrO   r?   )rC   rD   rE   rF   r   r   r   r   classmethodr   r   r   r   r   r   r   r   r.   r.      sH     LL"
O. 77 77r6!p4,.r   r.   c                  v     e Zd ZdZdZd
 fdZedd       Zedd       Zedd       Z	ddZ
ddZdd	Z xZS )_EllipticCurveaZ  
    A representation of a supported elliptic curve.

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

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

        :param lib: The OpenSSL library binding object.

        :return: A :py:type:`set` of ``cls`` instances giving the names of the
            elliptic curves the underlying library supports.
        r   zEC_builtin_curve[]c              3  V   K   | ]   }j                  |j                         " y wr   )from_nidnid).0cr   r$   s     r   	<genexpr>z7_EllipticCurve._load_elliptic_curves.<locals>.<genexpr>  s      D3<<QUU+Ds   &))EC_get_builtin_curvesrR   rW   rS   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)rR   ru   
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)rJ   _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.
        )rJ   EC_KEY_new_by_curve_namer   rR   rX   EC_KEY_free)r   keys     r   
_to_EC_KEYz_EllipticCurve._to_EC_KEY  s3     ii00;wwsD,,--r   r   r   rO   r   )r$   r   rO   set[_EllipticCurve])r$   r   r   r?   rO   r   )r$   r   r   r?   r   strrO   r   rO   r  rO   r   )rC   rD   rE   rF   r   r   r   r   r   r   r   r   r  __classcell__r   s   @r   r   r     sc     G	 E E"   O O "(.r   r   zSget_elliptic_curves is deprecated. You should use the APIs in cryptography instead.c                 4    t         j                  t              S )a  
    Return a set of objects representing the elliptic curves supported in the
    OpenSSL build in use.

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

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

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

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

    If the named curve is not supported then :py:class:`ValueError` is raised.
    zunknown curve name)r:   r   rf   )r   curves     r   r9   r9   0  s7      %& ::L )4
00r   c                  d     e Zd ZdZddZd fdZddZddZddZddZ	ddZ
dd	Zdd
Z xZS )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)rJ   X509_NAME_dupr   rR   rX   X509_NAME_freer   s     r   r   zX509Name.__init__`  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                  |t5        |      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  rd   rC   rJ   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_freerb   encodeX509_NAME_add_entry_by_NIDMBSTRING_UTF8rU   )
r   r   valuer   ientent_objent_nid
add_resultr   s
            r   r  zX509Name.__setattr__j  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//E
B

  " )   !455s   	
F< <	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  )rJ   r  r  r  r   r-   r  X509_NAME_get_index_by_NIDr   r   X509_NAME_ENTRY_get_datarR   rS   ASN1_STRING_to_UTF8rV   rY   r   OPENSSL_free)	r   r   r   entry_indexentryrZ   r^   data_lengthr   s	            r   __getattr__zX509Name.__getattr__  s2    |D12$.. $& !!45555djj#rJ"(([A,,U3!23..}dCq()	0[[q!1;?BIIF
 mA./-   !455* mA./s   
D# +D< #	D98D9<Ec                    t        |t              st        S t        j                  | j
                  |j
                        dk(  S Nr   rb   r/   r   rJ   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 r9  r:  r<  s     r   __lt__zX509Name.__lt__  s2    %*!!!!$**ekk:Q>>r   c                    t        j                  dd      }t        j                  | j                  |t        |            }t        |t         j                  k7         dj                  t        j                  |      j                  d            S )z6
        String representation of an X509Name
        rH   i   z<X509Name object '{}'>r  )rR   rS   rJ   X509_NAME_oneliner   rU   rV   rW   formatru   r   )r   r^   format_results      r   r   zX509Name.__repr__  sq     3/..JJs='9
 	23'..KK&--g6
 	
r   c                @    t        j                  | j                        S )a&  
        Return an integer representation of the first four bytes of the
        MD5 digest of the DER representation of the name.

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

        :return: The (integer) hash of this name.
        :rtype: :py:class:`int`
        )rJ   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)rR   rS   rJ   i2d_X509_NAMEr   rV   rY   r3  )r   r^   encode_resultr}   s       r   r   zX509Name.der  si     !23**4::}E*+M!$4mDQG-*+r   c                   g }t        t        j                  | j                              D ]  }t        j                  | j                  |      }t        j
                  |      }t        j                  |      }t        j                  |      }t        j                  |      }t        j                  t        j                  |      t        j                  |            dd }|j                  t        j                  |      |f        |S )z
        Returns the components of this name, as a sequence of 2-tuples.

        :return: The components of this name.
        :rtype: :py:class:`list` of ``name, value`` tuples.
        N)r  rJ   r  r   r   r!  r1  r"  r   rR   rY   rv   rr   r   ru   )	r   r   r)  r*  fnamefvalr   r   r(  s	            r   get_componentszX509Name.get_components  s     t11$**=> 	6A**4::q9C33C8E005D""5)C??3'D KK**40$2I2I$2OE MM4;;t,e45	6  r   r   )r   r  r(  r   rO   r   )r   r  rO   
str | Noner  r  r   rO   rc   )rO   zlist[tuple[bytes, bytes]])rC   rD   rE   rF   r   r  r7  r=  r?  r   rF  r   rM  r	  r
  s   @r   r/   r/   F  s8    0=%#N&P@?

/r   r/   zPCSR support in pyOpenSSL is deprecated. You should use the APIs in cryptography.c                  r    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y)r0   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 r9  )rJ   X509_REQ_newrR   rX   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.x509rX  "_dump_certificate_request_internalr'   )r   rX  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   )
rb   r   CertificateSigningRequestrd   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)rJ   X509_REQ_set_pubkeyrT  r   rV   r   r   ri   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__rJ   X509_REQ_get_pubkeyrT  r   rV   rR   rW   rX   r   r   r   s     r   
get_pubkeyzX509Req.get_pubkeyK  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)rb   r?   rd   rf   rJ   X509_REQ_set_versionrT  rV   )r   versionri   s      r   rU  zX509Req.set_versionY  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`
        )rJ   X509_REQ_get_versionrT  r   s    r   get_versionzX509Req.get_versionj  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/   rg  rJ   X509_REQ_get_subject_namerT  r   rV   rR   rW   _ownerr   s     r   get_subjectzX509Req.get_subjectt  sM     )33DII>


dii/0 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   rf   r   rJ   EVP_get_digestbynamer  rR   rW   X509_REQ_signrT  r   rV   )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   )rb   r.   rd   rJ   X509_REQ_verifyrT  r   r   )r   r   r   s      r   verifyzX509Req.verify  sF     $%:;;%%dii<Q; "r   Nr   )rO   x509.CertificateSigningRequest)r`  r  rO   r0   r   r.   rO   r   rO   r.   rl  r?   rO   r   r   rO   r/   r   r.   ry  r  rO   r   )r   r.   rO   r   )rC   rD   rE   rF   r   r[  r   ra  re  ri  rU  ro  rs  r|  r  r   r   r   r0   r0   	  s\    
& F7F	F F*
))"4,)0r   r0   c                      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d.dZd/dZd0dZ	 	 	 	 	 	 d1dZd2dZd0dZd2dZd3dZd4dZd5dZd6dZd5dZ d7dZ!d&dZ"y )8r,   z
    An X.509 certificate.
    c                    t        j                         }t        |t        j                  k7         t        j
                  |t         j                        | _        t               | _	        t               | _
        y r   )rJ   X509_newrV   rR   rW   rX   	X509_free_x509r   _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   )	rg  rR   rX   rJ   r  r  r   r  r  )r   r   certs      r   _from_raw_x509_ptrzX509._from_raw_x509_ptr  sA    {{3WWT4>>2
#7#9 $8$:!r   c                >    ddl m} t        t        |       } ||      S )z
        Export as a ``cryptography`` certificate.

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

        .. versionadded:: 17.1.0
        r   )load_der_x509_certificate)rY  r  r5   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]  )
rb   r   Certificaterd   r   r   r   r   r;   r'   )r   crypto_certr   r   s       r   ra  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)rb   r?   rd   rV   rJ   X509_set_versionr  )r   rl  s     r   rU  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`
        )rJ   X509_get_versionr  r   s    r   ro  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.   rg  rJ   X509_get_pubkeyr  r   rR   rW   r   rX   r   r   r   s     r   ri  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)rb   r.   rd   rJ   X509_set_pubkeyr  r   rV   rd  s      r   re  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 partru  rv  r   N)rb   r.   rd   r   rf   r   rJ   rw  r  rR   rW   	X509_signr  r   rV   )r   r   ry  evp_mdr{  s        r   r|  z	X509.sign$  s     $%:;;788  344**<+?@TYY455nnTZZVDa(r   c                   t        j                  | j                        }t        j                  d      }t        j
                  |t        j                  t        j                  |       t        j                  |d         }|t         j                  k(  rt        d      t        j                  t        j                  |            S )z
        Return the signature algorithm used in the certificate.

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

        :raises ValueError: If the signature algorithm is undefined.

        .. versionadded:: 0.13
        zASN1_OBJECT **r   zUndefined signature algorithm)rJ   X509_get0_tbs_sigalgr  rR   rS   X509_ALGOR_get0rW   r"  r  rf   ru   
OBJ_nid2ln)r   sig_algalgr   s       r   get_signature_algorithmzX509.get_signature_algorithm@  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`
        rv  zunsigned char[]zunsigned int[]r   r      :)rJ   rw  r  rR   rW   rf   rS   EVP_MAX_MD_SIZErU   X509_digestr  rV   joinrY   r   upper)r   digest_namery  r^   result_lengthdigest_resultchs          r   ry  zX509.digestS  s     **<+DETYY455!2D4H4HI!115}-a((JJ}
 	*+yy ++m]15EF "##%
 	
s    Dc                @    t        j                  | j                        S )z
        Return the hash of the X509 subject.

        :return: The hash of the subject.
        :rtype: :py:class:`int`
        )rJ   X509_subject_name_hashr  r   s    r   subject_name_hashzX509.subject_name_hashr  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 integer   Nr   zBIGNUM**r   r   )rb   r?   rd   hexr%  rR   rS   rJ   	BN_hex2bnrV   rW   BN_to_ASN1_INTEGERr   rX   ASN1_INTEGER_freeX509_set_serialNumberr  )r   serial
hex_serialhex_serial_bytesbignum_serialr   asn1_serialri   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
           )rJ   X509_get_serialNumberr  ASN1_INTEGER_to_BNrR   rW   	BN_bn2hexru   r?   r3  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)rb   r?   rd   rJ   X509_getm_notAfterr  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)rb   r?   rd   rJ   X509_getm_notBeforer  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_notAfterrf   r   datetimestrptimetimezoneutcnowreplace)r   
time_bytestime_string	not_afterUTCutcnows         r   has_expiredzX509.has_expired  s     &&(
;<< ''0%%..{OL	##""&&s+3343@6!!r   c                8    t         || j                              S r   )r~   r  )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
        )r  rJ   r  r   s    r   get_notBeforezX509.get_notBefore  s     &&t'?'?@@r   c                :    t         || j                        |      S r   )rj   r  )r   r  rh   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  rJ   r  r   rh   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
        )r  rJ   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  rJ   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/   rg  r  r   rV   rR   rW   rr  )r   r  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   )rb   r/   rd   r  r   rV   )r   r  r   ri   s       r   	_set_namezX509._set_name  s8    $)6774::tzz2

a(r   c                z    | j                  t        j                        }| j                  j	                  |       |S )a  
        Return the issuer of this certificate.

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

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

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

        :return: ``None``
        N)r  rJ   X509_set_issuer_namer  r   )r   issuers     r   
set_issuerzX509.set_issuer4  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`
        )r  rJ   X509_get_subject_namer  r   r   s     r   rs  zX509.get_subject@  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)r  rJ   X509_set_subject_namer  r   )r   subjects     r   set_subjectzX509.set_subjectP  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
        )rJ   X509_get_ext_countr  r   s    r   get_extension_countzX509.get_extension_count\  s     &&tzz22r   Nr   )r   r   rO   r,   )rO   x509.Certificate)r  r  rO   r,   r  r   r  r  r  rO  )r  r  rO   rc   )r  r?   rO   r   )r  r?   rO   r   r   )r  r   rO   bytes | None)rO   r  )r  zCallable[..., Any]rh   rc   rO   r   )rh   rc   rO   r   )r  r   rO   r/   )r  r   r   r/   rO   r   r  )r  r/   rO   r   )r  r/   rO   r   )#rC   rD   rE   rF   r   r   r  r[  ra  rU  ro  ri  re  r|  r  ry  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  rs  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	) 
) 
*	3r   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)r4   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
    r?   	CRL_CHECKCRL_CHECK_ALLIGNORE_CRITICALX509_STRICTALLOW_PROXY_CERTSPOLICY_CHECKEXPLICIT_POLICYINHIBIT_MAPCHECK_SS_SIGNATUREPARTIAL_CHAINN)rC   rD   rE   rF   rJ   X509_V_FLAG_CRL_CHECKr  __annotations__X509_V_FLAG_CRL_CHECK_ALLr  X509_V_FLAG_IGNORE_CRITICALr	  X509_V_FLAG_X509_STRICTr
  X509_V_FLAG_ALLOW_PROXY_CERTSr  X509_V_FLAG_POLICY_CHECKr  X509_V_FLAG_EXPLICIT_POLICYr  X509_V_FLAG_INHIBIT_MAPr  X509_V_FLAG_CHECK_SS_SIGNATUREr  X509_V_FLAG_PARTIAL_CHAINr  r   r   r   r4   r4   h  s     //Is/77M37;;OS;33K3!??s?55L#5;;OS;33K3"AAA77M37r   r4   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)r1   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   )rJ   X509_STORE_newrR   rX   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)rb   r,   rd   rJ   X509_STORE_add_certr   r  rV   )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)rb   r   CertificateRevocationListr   r   r[   r   r   rJ   d2i_X509_CRL_biorR   rW   rV   rX   X509_CRL_freerd   X509_STORE_add_crlr   )r   crlr   rL   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)rV   rJ   X509_STORE_set_flagsr   )r   flagss     r   	set_flagszX509Store.set_flags  s"    , 	11$++uEJKr   c                :   t        j                         }t        j                  |t         j                        }t        j
                  |t        j                  |j                                      t        t        j                  | j                  |      dk7         y)a  
        Set the time against which the certificates are verified.

        Normally the current time is used.

        .. note::

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

        .. versionadded:: 17.0.0

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

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

        .. note::

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

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

        .. versionadded:: 20.0

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

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

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

        N)rR   rW   _path_bytesrJ   X509_STORE_load_locationsr   r   )r   cafilecapathload_results       r   load_locationszX509Store.load_locations  s`    F >YYF (F>YYF (F44KK
  " r   r   )r  r,   rO   r   )r+  zx509.CertificateRevocationListrO   r   )r0  r?   rO   r   )r:  zdatetime.datetimerO   r   r   )r@  StrOrBytesPath | NonerA  rD  rO   r   )
rC   rD   rE   rF   r   r%  r-  r1  r<  rC  r   r   r   r1   r1     sI    ;",H<L0M6 )-1#%1# &1# 
	1#r   r1   c                  4     e Zd ZdZ	 	 	 	 	 	 	 	 d fdZ xZS )r3   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   messagerG  rH  r   s       r   r   zX509StoreContextError.__init__2  s!     	!&r   )rI  r  rG  z	list[Any]rH  r,   rO   r   )rC   rD   rE   rF   r   r	  r
  s   @r   r3   r3   )  s2    ''$-'<@'	' 'r   r3   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)r2   a9  
    An X.509 store context.

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

    :param X509Store store: The certificates which will be trusted for the
        purposes of any verifications.
    :param X509 certificate: The certificate to be verified.
    :param chain: List of untrusted certificates that may be used for building
        the certificate chain. May be ``None``.
    :type chain: :class:`list` of :class:`X509`
    Nc                L    || _         || _        | j                  |      | _        y r   )r   _cert_build_certificate_stack_chain)r   r"  rH  chains       r   r   zX509StoreContext.__init__J  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  rJ   sk_X509_numsk_X509_valuer  sk_X509_free)sr)  xs      r   cleanupz:X509StoreContext._build_certificate_stack.<locals>.cleanupX  sQ     4++A./ "&&q!,q!" a r   r   z+One of the elements is not an X509 instance)rU  r   rO   r   )rU   rR   rW   rJ   sk_X509_new_nullrV   rX   rb   r,   rd   X509_up_refr  sk_X509_pushr  r   )certificatesrW  stackr  s       r   rM  z)X509StoreContext._build_certificate_stackT  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  )rR   ru   rJ   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  r3   )	store_ctxrI  rG  r  rL  pycerts         r   _exception_from_contextz(X509StoreContext._exception_from_contextr  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   )rJ   X509_STORE_CTX_newrV   rR   rW   rX   X509_STORE_CTX_freeX509_STORE_CTX_initr   rL  r  rN  X509_verify_certre  )r   rc  rn   s      r   _verify_certificatez$X509StoreContext._verify_certificate  s     ++-		TYY./GGIt'?'?@	&&t{{))4::+;+;T[[
 	q!##I.!8..y99r   c                    || _         y)z
        Set the context's X.509 store.

        .. versionadded:: 0.15

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

        .. versionadded:: 0.15

        :raises X509StoreContextError: If an error occurred when validating a
          certificate in the context. Sets ``certificate`` attribute to
          indicate which certificate caused the error.
        N)rk  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
        )rk  rJ   X509_STORE_CTX_get1_chainrV   rR   rW   r  rR  rS  r,   r  r   rT  )r   rc  
cert_stackr   r)  r  rd  s          r   get_verified_chainz#X509StoreContext.get_verified_chain  s     ,,.	 33I>

dii/0t''
34 	"A%%j!4DDDII-.,,T2FMM&!		" 	*%r   r   )r"  r1   rH  r,   rO  Sequence[X509] | NonerO   r   )r[  rt  rO   r   )rc  r   rO   r3   r  )r"  r1   rO   r   r   )rO   z
list[X509])rC   rD   rE   rF   r   staticmethodrM  re  rk  rm  ro  rs  r   r   r   r2   r2   :  s    & (,	;; ; %	;
 
; +	 : > >20	
#r   r2   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)rb   r  r%  r[   r(   rJ   PEM_read_bio_X509rR   rW   r'   d2i_X509_biorf   r   r,   r  )r   rY   rL   r   s       r   r;   r;     s     &#w'
v
C|%%c499diiK		  dii0NOOtyy""4((r   c                ^   t               }| t        k(  r!t        j                  ||j                        }na| t
        k(  r!t        j                  ||j                        }n7| t        k(  r#t        j                  ||j                  dd      }nt        d      t        |dk(         t        |      S )a  
    Dump the certificate *cert* into a buffer string encoded with the type
    *type*.

    :param type: The file type (one of FILETYPE_PEM, FILETYPE_ASN1, or
        FILETYPE_TEXT)
    :param cert: The certificate to dump
    :return: The buffer with the dumped certificate in
    r   Ctype argument must be FILETYPE_PEM, FILETYPE_ASN1, or FILETYPE_TEXTr   )r[   r(   rJ   PEM_write_bio_X509r  r'   i2d_X509_bior)   X509_print_exrf   rV   r`   )r   r  rL   result_codes       r   r5   r5     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
    rw  r   )
r[   r(   rJ   PEM_write_bio_PUBKEYr'   i2d_PUBKEY_biorf   r   r   r`   )r   r   rL   	write_bior  s        r   r8   r8     sf     .C|--			''	NOOC,Ka#r   c           	        t               }t        |t              st        d      |I|t        d      t	        j
                  t        |            }|t        j                  k(  rt        d      t        j                  }t        | |      }| t        k(  rXt	        j                  ||j                  |t        j                  d|j                  |j                        }|j!                          n| t"        k(  r!t	        j$                  ||j                        }n| t&        k(  rt	        j(                  |j                        t        j*                  k7  rt        d      t        j,                  t	        j.                  |j                        t        j0                        }t	        j2                  ||d      }nt        d      t5        |dk7         t7        |      S )a  
    Dump the private key *pkey* into a buffer string encoded with the type
    *type*.  Optionally (if *type* is :const:`FILETYPE_PEM`) encrypting it
    using *cipher* and *passphrase*.

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

    :return: The buffer with the dumped key in
    :rtype: bytes
    zpkey must be a PKeyzDif a value is given for cipher one must also be given for passphrasezInvalid cipher namer   z-Only RSA keys are supported for FILETYPE_TEXTr{  )r[   rb   r.   rd   rJ   EVP_get_cipherbynamer  rR   rW   rf   _PassphraseHelperr(   PEM_write_bio_PrivateKeyr   callbackcallback_argsraise_if_problemr'   i2d_PrivateKey_bior)   r   r   rX   r   r   	RSA_printrV   r`   )	r   r   cipher
passphraserL   
cipher_objhelperr  r   s	            r   r7   r7   *  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(   rf   _passphrase
_more_args	_truncate	_problems)r   r   r  	more_argstruncates        r   r   z_PassphraseHelper.__init__p  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  rR   rW   rb   rc   callabler  _read_passphraserd   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  rR   rW   rb   rc   r  rd   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r9  )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  rb   rc   rf   rU   r  r  	Exceptionr  r   )r   buf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   r?   r  PassphraseCallableT | Noner  r   r  r   rO   r   r  )r  ztype[Exception]rO   r   )
r  r   r  r?   r  r   r  r   rO   r?   )
rC   rD   rE   r   propertyr  r  r-   r  r  r   r   r   r  r  o  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   rw  T)rb   r  r%  r[   r(   rJ   PEM_read_bio_PUBKEYrR   rW   r'   d2i_PUBKEY_biorf   r   r.   rg  rX   r   r   r   )r   rY   rL   evp_pkeyr   s        r   r>   r>     s     &#w'
v
C|++DIItyy
 
	&&sDII6NOO499<<D4#5#56DJDKr   c                N   t        |t              r|j                  d      }t        |      }t	        | |      }| t
        k(  rKt        j                  |t        j                  |j                  |j                        }|j                          n9| t        k(  r%t        j                  |t        j                        }nt        d      |t        j                  k(  r
t!                t"        j%                  t"              }t        j&                  |t        j(                        |_        |S )a  
    Load a private key (PKey) from the string *buffer* encoded with the type
    *type*.

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

    :return: The PKey object
    r   rw  )rb   r  r%  r[   r  r(   rJ   PEM_read_bio_PrivateKeyrR   rW   r  r  r  r'   d2i_PrivateKey_biorf   r   r.   rg  rX   r   r   )r   rY   r  rL   r  r  r   s          r   r=   r=     s    " &#w'
v
CtZ0F|//FOOV-A-A
 	!		**3		:NOO499<<D4#5#56DJKr   c                ^   t               }| t        k(  r!t        j                  ||j                        }na| t
        k(  r!t        j                  ||j                        }n7| t        k(  r#t        j                  ||j                  dd      }nt        d      t        |dk7         t        |      S )av  
    Dump the certificate request *req* into a buffer string encoded with the
    type *type*.

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


    .. deprecated:: 24.2.0
       Use `cryptography.x509.CertificateSigningRequest` instead.
    r   r{  )r[   r(   rJ   PEM_write_bio_X509_REQrT  r'   i2d_X509_REQ_bior)   X509_REQ_print_exrf   rV   r`   )r   rV  rL   r  s       r   r6   r6     s     .C|11#sxx@		++C:		,,S#((AqA
 	

 K1$%#r   r6   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   rw  )rb   r  r%  r[   r(   rJ   PEM_read_bio_X509_REQrR   rW   r'   d2i_X509_REQ_biorf   rV   r0   rg  rX   rS  rT  )r   rY   rL   rV  x509reqs        r   r<   r<   6  s     &#w'
v
C|((diiDIIN		##C3NOOC499$%oog&G773 2 23GLNr   r<   )r   r  r   objectrO   zCallable[[_T], _T]r   )rY   r  rO   r   )rL   r   rO   rc   )rg   r   rh   rc   rO   r   )rh   rc   rO   r   )ry   r   rO   r  )rO   r  )r   r  rO   r   )r   r?   rY   rc   rO   r,   )r   r?   r  r,   rO   rc   )r   r?   r   r.   rO   rc   )NN)
r   r?   r   r.   r  rN  r  r  rO   rc   )r   r?   rY   str | bytesrO   r.   )r   r?   rY   r  r  r  rO   r.   )r   r?   rV  r0   rO   rc   )r   r?   rY   rc   rO   r0   )m
__future__r   r6  r  	functoolssysr   base64r   collections.abcr   r   r   r   r	   version_infowarningsr   TypeVar_Ttyping_extensionscryptographyr   r   )cryptography.hazmat.primitives.asymmetricr   r   r   r   r   OpenSSL._utilr    r!   r  r"   r  r#   rR   r$   rJ   r%   _make_assertr&   r>  __all__r   r   r   r   r   _PrivateKeyr   r   r   r   r   
_PublicKeyr   rc   PassphraseCallableTSSL_FILETYPE_PEMr(   r  SSL_FILETYPE_ASN1r'   r)   r   r+   EVP_PKEY_DSAr*   EVP_PKEY_DHr@   EVP_PKEY_ECrA   r  r-   r   rV   r[   r`   rj   ro   r~   r   r.   r   r:   r9   total_orderingr/   r0   r,   r4   r1   r3   r2   r;   r5   r8   r7   r  r>   r=   r6   rZ  rC   DeprecationWarningr<   r_  r   r   r   <module>r     s   "    
   $   w#		B - $  )8 		 		
 [*$%E8CJ#778  ))c )++s + !!# !!!# !  I  :EB u%4;+2&:
 
~. ~.Bd. d.N 5	5 1	1$   D h h	hVm3 m3`8 8.g# g#T'I '"[ [|):88 -1	B
B
B B +	B
 BJK K\J .2&
&& +& 
	&R@ &> "   	 	#	@ &> "   	 	#	r   