Ë
    íU.jZ  ã                   ó  — g d ¢Z ddlZddlZddlZddlmZmZmZmZm	Z	 ddl
mZ ddlmZmZ ddlmZ ddlmZmZmZmZmZ ddlmZ dd	lmZmZmZ dd
lmZmZm Z   G d„ de!«      Z"d„ Z#dd„Z$dd„Z%d„ Z&d„ Z'd„ Z(d„ Z)d„ Z*dd„Z+e+Z,dZ-y))ÚgenerateÚ	constructÚDsaKeyÚ
import_keyé    N)ÚbchrÚbordÚtobytesÚtostrÚ
iter_range)ÚRandom)ÚPKCS8ÚPEM)ÚSHA256)Ú	DerObjectÚDerSequenceÚ
DerIntegerÚDerObjectIdÚDerBitString)ÚInteger)Útest_probable_primeÚ	COMPOSITEÚPROBABLY_PRIME)Ú_expand_subject_public_key_infoÚ_create_subject_public_key_infoÚ _extract_subject_public_key_infoc                   ó¤   — e Zd ZdZg d¢Zd„ Zd„ Zd„ Zd„ Zd„ Z	d„ Z
d	„ Zd
„ Zd„ Zd„ Zd„ Zd„ Zd„ Z	 	 dd„ZeZeZd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zd„ Zy)r   a¼  Class defining an actual DSA key.
    Do not instantiate directly.
    Use :func:`generate`, :func:`construct` or :func:`import_key` instead.

    :ivar p: DSA modulus
    :vartype p: integer

    :ivar q: Order of the subgroup
    :vartype q: integer

    :ivar g: Generator
    :vartype g: integer

    :ivar y: Public key
    :vartype y: integer

    :ivar x: Private key
    :vartype x: integer

    :undocumented: exportKey, publickey
    ©ÚyÚgÚpÚqÚxc           	      ó2  — t        |j                  «       «      }t        d«      }|j                  |«      st        dt	        ||z
  «      z  «      ‚||z
  }|r1|t        d«      k7  r#t        dt	        |t        d«      z
  «      z  «      ‚t        |«      | _        y )N©r   r   r    r!   z$Some DSA components are missing = %s©r"   zUnknown DSA components = %s)ÚsetÚkeysÚissubsetÚ
ValueErrorÚstrÚdictÚ_key)ÚselfÚkey_dictÚ	input_setÚ
public_setÚ	extra_sets        úVC:\xampp\htdocs\tradingbinance\backend\.venv\Lib\site-packages\Crypto/PublicKey/DSA.pyÚ__init__zDsaKey.__init__g   s–   € Ü˜Ÿ™›Ó(ˆ	ÜÐ.Ó/ˆ
Ø×"Ñ" 9Ô-ÜÐCÜ  ¨iÑ!7Ó8ñ9ó :ð :à 
Ñ*ˆ	Ù˜¤c¨&£kÒ1ÜÐ:Ü  ¬S°«[Ñ!8Ó9ñ:ó ;ð ;ä˜“Nˆ�	ó    c                 ó¤  — | j                  «       st        d«      ‚d|cxk  r| j                  k  st        d«      ‚ t        d«      ‚dD �cg c]  }| j                  |   ‘Œ c}\  }}}}t        j                  d|¬«      }||z  j                  |«      }	||z  }
t        |||«      |z  }|	||z  |
|z  z   z  |z  }t        t        ||f«      S c c}w )Nz)DSA public key cannot be used for signingé   zk is not between 2 and q-1)r"   r!   r    r   )Úmin_inclusiveÚmax_exclusive)Úhas_privateÚ	TypeErrorr!   r)   r,   r   Úrandom_rangeÚinverseÚpowÚmapÚint)r-   ÚmÚkÚcompr"   r!   r    r   Úblind_factorÚinv_blind_kÚblind_xÚrÚss                r2   Ú_signzDsaKey._signs   sæ   € Ø×ÑÔ!ÜÐGÓHÐHØ�A”˜Ÿ™’ÜÐ9Ó:Ð:ð ÜÐ9Ó:Ð:á2FÓGÑ2F¨$�d—i‘i “oÐ2FÑG‰
ˆˆ1ˆa�ä×+Ñ+¸!Ø9:ô<ˆà# aÑ'×0Ñ0°Ó3ˆØ�lÑ"ˆä��1�a‹L˜1ÑˆØ˜L¨1Ñ,¨w¸©{Ñ:Ñ;¸qÑ@ˆÜ”3˜˜A˜ÓÐùò Hs   ÁCc                 ó2  — |\  }}dD �cg c]  }| j                   |   ‘Œ c}\  }}}}	d|cxk  r|k  rn yd|cxk  r|k  sy yt        |«      j                  |«      }
|
|z  |z  }|
|z  |z  }t        |	||«      t        |||«      z  |z  |z  }||k(  S c c}w )N)r   r!   r    r   r   F)r,   r   r<   r=   )r-   r@   ÚsigrF   rG   rB   r   r!   r    r   ÚwÚu1Úu2Úvs                 r2   Ú_verifyzDsaKey._verify„   s¸   € Ø‰ˆˆ1Ù2FÓGÑ2F¨$�d—i‘i “oÐ2FÑG‰
ˆˆ1ˆa�Ø�A”	˜”	Øð $% q¤9¨1¢9Øð $-ØÜ�A‹J×Ñ˜qÓ!ˆØ�!‰e�q‰[ˆØ�!‰e�q‰[ˆÜ��B˜‹]œS  B¨›]Ñ*¨QÑ.°!Ñ3ˆØ�A‰vˆùò Hs   ŠBc                 ó   — d| j                   v S )z!Whether this is a DSA private keyr"   ©r,   ©r-   s    r2   r9   zDsaKey.has_private�   s   € ð �d—i‘iÐÐr4   c                  ó   — y)NF© rR   s    r2   Úcan_encryptzDsaKey.can_encrypt”   s   € Ør4   c                  ó   — y)NTrT   rR   s    r2   Úcan_signzDsaKey.can_sign—   s   € Ør4   c                 óB   ‡ — t        ˆ fd„dD «       «      }t        |«      S )z^A matching DSA public key.

        Returns:
            a new :class:`DsaKey` object
        c              3   ó@   •K  — | ]  }|‰j                   |   f–— Œ y ­w©NrQ   )Ú.0rA   r-   s     €r2   Ú	<genexpr>z$DsaKey.public_key.<locals>.<genexpr>¡   s!   øè ø€ Ð QÑ<P°q ! T§Y¡Y¨q¡\Ô!2Ñ<Pùs   ƒr$   )r+   r   )r-   Úpublic_componentss   ` r2   Ú
public_keyzDsaKey.public_keyš   s#   ø€ ô !Ó QÑ<PÓ QÓQÐÜÐ'Ó(Ð(r4   c                 óú   — t        | j                  «       «      t        |j                  «       «      k7  ryd}| j                  D ]5  }|xr/ t        | j                  |d «      t        |j                  |d «      k(  }Œ7 |S )NFT)Úboolr9   Ú_keydataÚgetattrr,   )r-   ÚotherÚresultrB   s       r2   Ú__eq__zDsaKey.__eq__¤   ss   € Ü�× Ñ Ó"Ó#¤t¨E×,=Ñ,=Ó,?Ó'@Ò@ØàˆØ—M”MˆDØò B¤¨¯©°D¸$Ó!?Ü!(¨¯©°T¸4Ó!@ñ"A‰Fð "ð ˆr4   c                 ó&   — | j                  |«       S rZ   )re   )r-   rc   s     r2   Ú__ne__zDsaKey.__ne__®   s   € Ø—;‘;˜uÓ%Ð%Ð%r4   c                 ó   — ddl m} |‚)Nr   )ÚPicklingError)Úpickleri   )r-   ri   s     r2   Ú__getstate__zDsaKey.__getstate__±   s   € å(ØÐr4   c                 óX   — dD �cg c]  }t        | j                  |   «      ‘Œ c}S c c}w )zPThe DSA domain parameters.

        Returns
            tuple : (p,q,g)
        )r    r!   r   )r?   r,   )r-   rB   s     r2   ÚdomainzDsaKey.domain¶   s*   € ñ 2AÓA±¨”�D—I‘I˜d‘OÕ$°ÑAÐAùÒAs   …'c                 óŠ  — g }| j                   D ]^  }|dk(  r9t        | j                  «      j                  «       }|j	                  d|fz  «       ŒAt        | |«      sŒN|j	                  |«       Œ` | j                  «       r|j	                  d«       d| j                  j                  t        | «      dj                  |«      fz  S )Nr    zp(%d)Úprivatez<%s @0x%x %s>Ú,)ra   r   r    Úsize_in_bitsÚappendÚhasattrr9   Ú	__class__Ú__name__ÚidÚjoin)r-   ÚattrsrA   Úbitss       r2   Ú__repr__zDsaKey.__repr__¿   sœ   € ØˆØ—”ˆAØ�CŠxÜ˜tŸv™v“×3Ñ3Ó5�Ø—‘˜W¨ wÑ.Õ/Ü˜˜qÕ!Ø—‘˜Q•ð ð ×ÑÔØ�L‰L˜Ô#à $§.¡.×"9Ñ"9¼2¸d»8ÀSÇXÁXÈeÃ_Ð!UÑUÐUr4   c                 ód   — 	 t        | j                  |   «      S # t        $ r t        |«      ‚w xY wrZ   )r?   r,   ÚKeyErrorÚAttributeError)r-   Úitems     r2   Ú__getattr__zDsaKey.__getattr__Ì   s4   € ð	'Ü�t—y‘y ‘Ó'Ð'øÜò 	'Ü  Ó&Ð&ð	'ús   ‚ š/Nc                 ó†  — |�t        |«      }|€t        j                  }|dk(  r¢dD �cg c]  }| j                  |   j	                  «       ‘Œ! }}d„ }|D �cg c]
  } ||«      ‘Œ }	}dg|	z   }
dj                  |
D �cg c]$  }t        j                  dt        |«      «      |z   ‘Œ& c}«      }dt        j                  |«      dd	 z   S t        | j                  | j                  | j                  g«      }| j                  «       r¾|€d
}|rP|sd}t!        | j"                  «      j%                  «       }t'        j(                  |t*        ||||¬«      }|rd}nd}d}n›|dk7  r|rt-        d«      ‚d| j                  | j                  | j                  | j.                  | j"                  g}t        |«      j%                  «       }d}n3|rt-        d«      ‚t1        t*        t!        | j.                  «      |«      }d}|dk(  r|S |dk(  r&t3        j$                  ||dz   ||«      }t        |«      S t-        d|z  «      ‚c c}w c c}w c c}w )a¯  Export this DSA key.

        Args:
          format (string):
            The encoding for the output:

            - *'PEM'* (default). ASCII as per `RFC1421`_/ `RFC1423`_.
            - *'DER'*. Binary ASN.1 encoding.
            - *'OpenSSH'*. ASCII one-liner as per `RFC4253`_.
              Only suitable for public keys, not for private keys.

          passphrase (string):
            *Private keys only*. The pass phrase to protect the output.

          pkcs8 (boolean):
            *Private keys only*. If ``True`` (default), the key is encoded
            with `PKCS#8`_. If ``False``, it is encoded in the custom
            OpenSSL/OpenSSH container.

          protection (string):
            *Only in combination with a pass phrase*.
            The encryption scheme to use to protect the output.

            If :data:`pkcs8` takes value ``True``, this is the PKCS#8
            algorithm to use for deriving the secret and encrypting
            the private DSA key.
            For a complete list of algorithms, see :mod:`Crypto.IO.PKCS8`.
            The default is *PBKDF2WithHMAC-SHA1AndDES-EDE3-CBC*.

            If :data:`pkcs8` is ``False``, the obsolete PEM encryption scheme is
            used. It is based on MD5 for key derivation, and Triple DES for
            encryption. Parameter :data:`protection` is then ignored.

            The combination ``format='DER'`` and ``pkcs8=False`` is not allowed
            if a passphrase is present.

          randfunc (callable):
            A function that returns random bytes.
            By default it is :func:`Crypto.Random.get_random_bytes`.

        Returns:
          byte string : the encoded key

        Raises:
          ValueError : when the format is unknown or when you try to encrypt a private
            key with *DER* format and OpenSSL/OpenSSH.

        .. warning::
            If you don't provide a pass phrase, the private key will be
            exported in the clear!

        .. _RFC1421:    http://www.ietf.org/rfc/rfc1421.txt
        .. _RFC1423:    http://www.ietf.org/rfc/rfc1423.txt
        .. _RFC4253:    http://www.ietf.org/rfc/rfc4253.txt
        .. _`PKCS#8`:   http://www.ietf.org/rfc/rfc5208.txt
        NÚOpenSSH)r    r!   r   r   c                 óD   — t        | d   «      dz  rt        d«      | z   S | S )Nr   é€   )r   r   r%   s    r2   ÚfunczDsaKey.export_key.<locals>.func  s%   € Ü˜˜1™“J Ò%Ü ›7 Q™;Ð&à�Hr4   ó   ssh-dssr4   ú>Ió   ssh-dss éÿÿÿÿTz"PBKDF2WithHMAC-SHA1AndDES-EDE3-CBC)Ú
key_paramsÚrandfunczENCRYPTED PRIVATEÚPRIVATEr   z#DSA private key cannot be encryptedr   zDSA PRIVATEz*PKCS#8 is only meaningful for private keysÚPUBLICÚDERz KEYz3Unknown key format '%s'. Cannot export the DSA key.)r	   r   Úget_random_bytesr,   Úto_bytesrw   ÚstructÚpackÚlenÚbinasciiÚ
b2a_base64r   r    r!   r   r9   r   r"   Úencoder   ÚwrapÚoidr)   r   r   r   )r-   ÚformatÚpkcs8Ú
passphraseÚ
protectionrŠ   r"   Útup1r„   Útup2ÚkeypartsÚkpÚ	keystringÚparamsÚprivate_keyÚ
binary_keyÚkey_typeÚintsÚpem_strs                      r2   Ú
export_keyzDsaKey.export_keyÒ   s>  € ðv Ð!Ü  Ó,ˆJàÐÜ×.Ñ.ˆHà�YÒÙ5IÓJÑ5I°�D—I‘I˜a‘L×)Ñ)Õ+Ð5IˆDÐJòñ &*Ó*¡T ‘D˜•G TˆDÐ*Ø"�| dÑ*ˆHØŸ™ÙGOÓPÁxÀœVŸ[™[¨¬s°2«wÓ7¸"Ó<ÀxÑPóˆIð ¤×!4Ñ!4°YÓ!?ÀÀÐ!DÑDÐDô ˜dŸf™f d§f¡f¨d¯f©fÐ5Ó6ˆØ×ÑÔØˆ}Ø�ÙÙ!Ø!E�JÜ(¨¯©Ó0×7Ñ7Ó9�Ü"ŸZ™ZØ +¬S°*Ø *°vØ)1ô"�
ñ
 Ø2‘Hà(�HØ!‘
à˜U’?¡zÜ$Ð%JÓKÐKØ˜4Ÿ6™6 4§6¡6¨4¯6©6°4·6±6¸4¿6¹6ÐB�Ü(¨Ó.×5Ñ5Ó7�
Ø(‘áÜ Ð!MÓNÐNä8¼Ü *¨4¯6©6Ó 2°Fó<ˆJàˆHà�UŠ?ØÐØ�UŠ?Ü—j‘jØ *¨H°vÑ,=Ø *¨HóˆGô ˜7Ó#Ð#ÜÐNÐQWÑWÓXÐXùòs Kùò +ùò Qs   ©$H4ÁH9Á<)H>c                 ó   — t        d«      ‚©Nz'Use module Crypto.Signature.DSS instead©ÚNotImplementedError)r-   ÚMÚKs      r2   ÚsignzDsaKey.signU  ó   € Ü!Ð"KÓLÐLr4   c                 ó   — t        d«      ‚r©   rª   )r-   r¬   Ú	signatures      r2   ÚverifyzDsaKey.verifyX  r¯   r4   c                 ó   — t         ‚rZ   rª   )r-   Ú	plaintextr­   s      r2   ÚencryptzDsaKey.encrypt[  ó   € Ü!Ð!r4   c                 ó   — t         ‚rZ   rª   )r-   Ú
ciphertexts     r2   ÚdecryptzDsaKey.decrypt^  r¶   r4   c                 ó   — t         ‚rZ   rª   ©r-   r¬   ÚBs      r2   ÚblindzDsaKey.blinda  r¶   r4   c                 ó   — t         ‚rZ   rª   r»   s      r2   ÚunblindzDsaKey.unblindd  r¶   r4   c                 ó   — t         ‚rZ   rª   rR   s    r2   ÚsizezDsaKey.sizeg  r¶   r4   )r   NNNN)ru   Ú
__module__Ú__qualname__Ú__doc__ra   r3   rH   rO   r9   rU   rW   r^   re   rg   rk   rm   rz   r   r§   Ú	exportKeyÚ	publickeyr®   r²   rµ   r¹   r½   r¿   rÁ   rT   r4   r2   r   r   N   s“   „ ñò, )€Hò
#ò ò"	ò ò
òò)òò&òò
BòVò'ð ?CØ,0ó{Yð| €IØ€IòMòMò"ò"ò"ò"ó"r4   r   c           
      óŽ  — ddddœj                  | «      }|€t        d| z  «      ‚t        j                  dz  }| |z   dz
  |z  dz
  }| dz
  ||z  z
  }t	        d«      }d|dz
  z  }t        ||«      t        k7  r` |d	«      }t	        j                  t        j                  |«      j                  «       «      |dz
  z  }	|	|z  dz  }t        ||«      t        k7  rŒ`|j                  «       |k(  sJ ‚d}
d| dz
  z  }	 t        |dz   «      D �cg c]B  }t        j                  t	        |
|z   «      j                  «       z   «      j                  «       ‘ŒD }}|D �cg c]  }t	        j                  |«      ‘Œ }}t        t        |«      D �cg c]  }||   d||z  z  z  ‘Œ c}||   d|z  dz
  z  d||z  z  z  «      }t	        ||z   «      }|j                  «       | k(  sJ ‚||d
z  z  }||dz
  z
  }|j                  «       | k(  rt        ||«      t        k(  rn
|
|dz   z  }
�Œ#|dz
  |z  }t        j                  d«      D ]w  }dz   t!        d«      z   t	        |«      j                  «       z   }	t	        j                  t        j                  |	«      j                  «       «      }t#        |||«      }|dk7  sŒw n ||fS c c}w c c}w c c}w )z+Generate a new set of DSA domain parametersé    éà   é   )é   é   é   zInvalid modulus length (%d)é   r6   é   é@   é   s   ggen)Úgetr)   r   Údigest_sizer   r   r   Ú
from_bytesÚnewÚdigestrq   r   r�   ÚsumÚ	itertoolsÚcountr   r=   )ÚLrŠ   ÚNÚoutlenÚnÚb_r!   Ú	upper_bitÚseedÚUÚoffsetÚjÚVrN   ÚiÚWÚXÚcr    ÚerÙ   r   s                         r2   Ú_generate_domainrê   k  sâ  € ð ˜ 3Ñ(×,Ñ,¨QÓ/€AØ€yÜÐ6¸Ñ:Ó;Ð;ä×Ñ !Ñ#€FØ	
ˆV‰�a‰˜FÑ" QÑ&€AØ	
ˆQ‰�!�f‘*Ñ	€Bô 	�‹
€AØ�a˜!‘e‘€IÜ
˜a Ó
*¬nÒ
<Ù˜‹|ˆÜ×ÑœvŸz™z¨$Ó/×6Ñ6Ó8Ó9¸YÈ¹]ÑKˆØ�	‰M˜AÑˆô ˜a Ó
*¬nÓ
<ð
 �>‰>Ó˜qÒ Ð!Ð ð €FØ�a˜!‘e‘€IØ
ä! ! a¡%Ô(ó+Ù(�!ô �j‰j˜¤¨°©
Ó 3× <Ñ <Ó >Ñ>Ó?×FÑFÕHØ(ð 	
ð +á-.Ó0©Q¨Œg× Ñ  Õ#¨QˆÐ0Ü´ZÀ´]ÓC±]°��1‘˜˜q 6™zÑ*Ó+°]ÑCØ�1‘˜!˜r™' Q™Ñ'¨A°!°f±*Ñ,=Ñ>ó@ˆô �A˜	‘MÓ"ˆØ�~‰~Ó 1Ò$Ð%Ð$à��Q‘‰KˆØ��Q‘‰KˆØ�>‰>Ó˜qÒ Ü˜q (Ó+¬~Ò=ØØ�!�a‘%‰ˆñ ð$ 
ˆQ‰�1‰€AÜ—‘ Ö#ˆØ�7‰NœT !›WÑ$¤w¨u£~×'>Ñ'>Ó'@Ñ@ˆÜ×ÑœvŸz™z¨!›}×3Ñ3Ó5Ó6ˆÜ��1�a‹LˆØ�‹6Ùð $ð ˆq�!�Tˆ?Ðùò3+ùâ0ùÚCs   ÄAJ8ÅJ=ÆKc                 ó   — |€t         j                  }|rxt        t        |«      \  }}}t	        |«      t
        k(  }|t	        |«      t
        k(  z  }||dz
  |z  dk7  z  }||dk  xs ||k\  z  }|t        |||«      dk7  z  }|rt        d«      ‚t        | |«      \  }}}}|j                  «       }|j                  «       }	|| k7  rt        d|| fz  «      ‚||	fdvrt        d||	fz  «      ‚d|cxk  r|k  st        d«      ‚ t        d«      ‚t        j                  |	dz   |¬	«      }
|
|dz
  z  dz   }t        |||«      }|||||d
œ}t        |«      S )aÖ  Generate a new DSA key pair.

    The algorithm follows Appendix A.1/A.2 and B.1 of `FIPS 186-4`_,
    respectively for domain generation and key pair generation.

    Args:
      bits (integer):
        Key length, or size (in bits) of the DSA modulus *p*.
        It must be 1024, 2048 or 3072.

      randfunc (callable):
        Random number generation function; it accepts a single integer N
        and return a string of random data N bytes long.
        If not specified, :func:`Crypto.Random.get_random_bytes` is used.

      domain (tuple):
        The DSA domain parameters *p*, *q* and *g* as a list of 3
        integers. Size of *p* and *q* must comply to `FIPS 186-4`_.
        If not specified, the parameters are created anew.

    Returns:
      :class:`DsaKey` : a new DSA key object

    Raises:
      ValueError : when **bits** is too little, too big, or not a multiple of 64.

    .. _FIPS 186-4: http://nvlpubs.nist.gov/nistpubs/FIPS/NIST.FIPS.186-4.pdf
    r6   r   zInvalid DSA domain parametersz?Mismatch between size of modulus (%d) and 'bits' parameter (%d)))rË   rÈ   )rÌ   rÉ   )rÌ   rÊ   )rÍ   rÊ   z;Lengths of p and q (%d, %d) are not compatibleto FIPS 186-3zIncorrent DSA generatorrÐ   )Ú
exact_bitsrŠ   r   )r   rŽ   r>   r   r   r   r=   r)   rê   rq   Úrandomr   )ry   rŠ   rm   r    r!   r   Ú	fmt_errorÚ_rÚ   rÛ   rè   r"   r   r.   s                 r2   r   r      s¢  € ð< ÐÜ×*Ñ*ˆáÜ”g˜vÓ&‰ˆˆ1ˆaô (¨Ó*¬iÑ7ˆ	ØÔ(¨Ó+¬yÑ8Ñ8ˆ	à�q˜1‘u ‘k aÑ'Ñ'ˆ	Ø�Q˜!‘VÒ%˜q A™vÑ%ˆ	Ø”S˜˜A˜q“\ QÑ&Ñ&ˆ	ÙÜÐ<Ó=Ð=ä% d¨HÓ5‰
ˆˆ1ˆa�à	�‰Ó€AØ	�‰Ó€AàˆD‚yÜð 6Ø9:¸D¸	ñBó Cð 	Cð 	
ˆ1€vð 0ñ 0äð )Ø,-¨q¨6ñ2ó 3ð 	3ð ˆqŒ9�1Š9ÜÐ2Ó3Ð3ð ÜÐ2Ó3Ð3ô 	�‰ ! b¡&°8Ô<€AØ	ˆQ�‰U‰�a‰€AÜˆAˆq�!‹€Aà˜A 1¨!°Ñ4€HÜ�(ÓÐr4   c           	      ó>  — t        t        dt        t        | «      «      «      }t	        |«      }d}|�r\t        |j                  «      t        k(  }|t        |j                  «      t        k(  z  }||j                  dz
  |j                  z  dk7  z  }||j                  dk  xs |j                  |j                  k\  z  }|t        |j                  |j                  |j                  «      dk7  z  }||j                  dk  xs |j                  |j                  k\  z  }t        |d«      rh||j                  dk  xs |j                  |j                  k\  z  }|t        |j                  |j                  |j                  «      |j                  k7  z  }|rt        d«      ‚|S )a²  Construct a DSA key from a tuple of valid DSA components.

    Args:
      tup (tuple):
        A tuple of long integers, with 4 or 5 items
        in the following order:

            1. Public key (*y*).
            2. Sub-group generator (*g*).
            3. Modulus, finite field order (*p*).
            4. Sub-group order (*q*).
            5. Private key (*x*). Optional.

      consistency_check (boolean):
        If ``True``, the library will verify that the provided components
        fulfil the main DSA properties.

    Raises:
      ValueError: when the key being imported fails the most basic DSA validity checks.

    Returns:
      :class:`DsaKey` : a DSA key object
    r   Fr6   r   r"   zInvalid DSA key components)r+   Úzipr>   r   r   r   r    r   r!   r   r=   r   rs   r"   r)   )ÚtupÚconsistency_checkr.   Úkeyrî   s        r2   r   r   é  sN  € ô2 ”CÐ1´3´wÀÓ3DÓEÓF€HÜ
�Ó
€Cà€IÚä'¨¯©Ó.´)Ñ;ˆ	ØÔ(¨¯©Ó/´9Ñ<Ñ<ˆ	à�s—u‘u˜q‘y C§E¡EÑ)¨aÑ/Ñ/ˆ	Ø�S—U‘U˜a‘ZÒ1 3§5¡5¨C¯E©E¡>Ñ1ˆ	Ø”S˜Ÿ™ §¡ s§u¡uÓ-°Ñ2Ñ2ˆ	à�S—U‘U˜a‘ZÒ1 3§5¡5¨C¯E©E¡>Ñ1ˆ	Ü�3˜ÔØ˜Ÿ™ !™Ò5 s§u¡u°·±¡~Ñ5ˆIØœ˜SŸU™U C§E¡E¨3¯5©5Ó1°S·U±UÑ:Ñ:ˆIáÜÐ5Ó6Ð6à€Jr4   c                 ó¾   — |rt        d«      ‚t        «       j                  | dd¬«      }|d   dk7  rt        d«      ‚dD �cg c]  }||   ‘Œ	 }}t        |«      S c c}w )Nz-DSA private key already comes with parametersé   T)Únr_elementsÚonly_ints_expectedr   zNo version found)rÏ   é   r6   rÑ   é   )r)   r   Údecoder   )Úencodedrš   r¡   ÚderrB   rò   s         r2   Ú_import_openssl_privaterþ   !  sh   € ÙÜÐHÓIÐIÜ
‹-×
Ñ
˜w°AÈ$Ð
Ó
O€CØ
ˆ1�v�‚{ÜÐ+Ó,Ð,Ù!0Ó
1¡˜ˆ3ˆt‹9 €CÐ
1Ü�S‹>Ðùò 2s   ÁAc                 ó"  — t        | «      \  }}}|t        k7  rt        d«      ‚|r|rt        d«      ‚t        «       j	                  |«      j
                  }t        t        «       j	                  |xs |«      «      \  }}}	||	||f}
t        |
«      S )NzNo DSA subjectPublicKeyInfozToo many DSA parameters)	r   r—   r)   r   rû   ÚvalueÚlistr   r   )rü   rš   r¡   ÚalgoidÚencoded_keyÚ
emb_paramsr   r    r!   r   rò   s              r2   Ú_import_subjectPublicKeyInfor  +  sˆ   € ä'FÀwÓ'OÑ#€FˆK˜Ø”‚}ÜÐ6Ó7Ð7Ù‘*ÜÐ2Ó3Ð3ä‹×Ñ˜KÓ(×.Ñ.€AÜ”;“=×'Ñ'¨Ò(<°*Ó=Ó>�G€A€qˆ!Øˆa��Aˆ,€CÜ�S‹>Ðr4   c                 ó2   — t        | «      }t        |d |«      S rZ   )r   r  )rü   rš   r¡   Úsp_infos       r2   Ú_import_x509_certr  9  s   € ä.¨wÓ7€GÜ'¨°°vÓ>Ð>r4   c                 óN  — |rt        d«      ‚t        j                  | |«      }|d   t        k7  rt        d«      ‚t	        «       j                  |d   «      j                  }t        t        «       j                  |d   «      «      \  }}}t        |||«      ||||f}t        |«      S )Nz"PKCS#8 already includes parametersr   zNo PKCS#8 encoded DSA keyr6   rÑ   )r)   r   Úunwrapr—   r   rû   r   r  r   r=   r   )	rü   rš   r¡   rA   r"   r    r!   r   rò   s	            r2   Ú_import_pkcs8r  ?  s—   € ÙÜÐ=Ó>Ð>Ü�‰�W˜jÓ)€AØˆ�tŒs‚{ÜÐ4Ó5Ð5Ü‹×Ñ˜A˜a™DÓ!×'Ñ'€AÜ”;“=×'Ñ'¨¨!©Ó-Ó.�G€A€qˆ!Üˆq�!�Q‹<˜˜A˜q !Ð
$€CÜ�S‹>Ðr4   c                 óˆ   — t         t        t        t        f}|D ]  }	  || ||«      c S  t	        d«      ‚# t        $ r Y Œ'w xY w)z?Import a DSA key (public or private half), encoded in DER form.úDSA key format is not supported)rþ   r  r  r  r)   )Úkey_datarš   r¡   Ú	decodingsÚdecodings        r2   Ú_import_key_derr  K  sY   € ô )Ü-Ü"Üð €Ió
 ˆð	Ù˜H j°&Ó9Ò9ð ô Ð6Ó
7Ð7øô ò 	Ùð	ús   �	5µ	AÁ Ac                 óÈ  — t        | «      } |�t        |«      }| j                  d«      r4t        j                  t	        | «      |«      \  }}}|rd}t        ||d«      S | j                  d«      r¹t        j                  | j                  d«      d   «      }g }t        |«      dkD  rJt        j                  d|dd «      d   }|j                  |dd|z    «       |d|z   d }t        |«      dkD  rŒJ|d   d	k(  r0d
D �cg c]  }t        j                  ||   «      ‘Œ }	}t        |	«      S t        | «      dkD  rt!        | d   «      dk(  rt        | |d«      S t#        d«      ‚c c}w )að  Import a DSA key.

    Args:
      extern_key (string or byte string):
        The DSA key to import.

        The following formats are supported for a DSA **public** key:

        - X.509 certificate (binary DER or PEM)
        - X.509 ``subjectPublicKeyInfo`` (binary DER or PEM)
        - OpenSSH (ASCII one-liner, see `RFC4253`_)

        The following formats are supported for a DSA **private** key:

        - `PKCS#8`_ ``PrivateKeyInfo`` or ``EncryptedPrivateKeyInfo``
          DER SEQUENCE (binary or PEM)
        - OpenSSL/OpenSSH custom format (binary or PEM)

        For details about the PEM encoding, see `RFC1421`_/`RFC1423`_.

      passphrase (string):
        In case of an encrypted private key, this is the pass phrase
        from which the decryption key is derived.

        Encryption may be applied either at the `PKCS#8`_ or at the PEM level.

    Returns:
      :class:`DsaKey` : a DSA key object

    Raises:
      ValueError : when the given key cannot be parsed (possibly because
        the pass phrase is wrong).

    .. _RFC1421: http://www.ietf.org/rfc/rfc1421.txt
    .. _RFC1423: http://www.ietf.org/rfc/rfc1423.txt
    .. _RFC4253: http://www.ietf.org/rfc/rfc4253.txt
    .. _PKCS#8: http://www.ietf.org/rfc/rfc5208.txt
    Ns   -----r‡   ó    r6   rÏ   r†   r   r…   )rÏ   rù   r6   rÑ   é0   r  )r	   Ú
startswithr   rû   r
   r  r“   Ú
a2b_base64Úsplitr’   r�   Úunpackrr   r   rÔ   r   r   r)   )
Ú
extern_keyrš   rý   ÚmarkerÚenc_flagr    rž   Úlengthr"   rò   s
             r2   r   r   \  sg  € ôP ˜Ó$€JØÐÜ˜ZÓ(ˆ
à×Ñ˜XÔ&ä"%§*¡*¬U°:Ó->À
Ó"KÑˆˆf�hÙØˆJÜ˜s J°Ó5Ð5à×Ñ˜[Ô)ä×'Ñ'¨
×(8Ñ(8¸Ó(>¸qÑ(AÓBˆ	ØˆÜ�)‹n˜qÒ Ü—]‘] 4¨°2°A¨Ó7¸Ñ:ˆFØ�O‰O˜I a¨¨F©
Ð3Ô4Ø! ! f¡* +Ð.ˆIô �)‹n˜qÓ ð �A‰;˜*Ò$Ù<HÓI¹L°q”7×%Ñ% h¨q¡kÕ2¸LˆCÐIÜ˜S“>Ð!ä
ˆ:ƒ˜Òœt J¨q¡MÓ2°dÒ:ä˜z¨:°tÓ<Ð<ä
Ð6Ó
7Ð7ùò Js   Ã<Ez1.2.840.10040.4.1)NN)TrZ   ).Ú__all__r“   r�   rØ   ÚCrypto.Util.py3compatr   r   r	   r
   r   ÚCryptor   Ú	Crypto.IOr   r   ÚCrypto.Hashr   ÚCrypto.Util.asn1r   r   r   r   r   ÚCrypto.Math.Numbersr   ÚCrypto.Math.Primalityr   r   r   ÚCrypto.PublicKeyr   r   r   Úobjectr   rê   r   r   rþ   r  r  r  r  r   Ú	importKeyr—   rT   r4   r2   Ú<module>r(     sš   ðò2 =€ã Û Û ç HÕ Hå ß  Ý ÷õ õ (÷3ñ 3÷@ñ @ô@Z"ˆVô Z"òz2ójFóR.òpòò?ò	ò8ó"C8ðN €	ð �r4   