§
    8·tc¢W  ã                   ó  — 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-dS ))Ú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dS )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           	      óŽ  — t          |                     ¦   «         ¦  «        }t          d¦  «        }|                     |¦  «        s"t          dt	          ||z
  ¦  «        z  ¦  «        ‚||z
  }|rB|t          d¦  «        k    r/t          dt	          |t          d¦  «        z
  ¦  «        z  ¦  «        ‚t          |¦  «        | _        d S )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        ú:/usr/lib/python3/dist-packages/Cryptodome/PublicKey/DSA.pyÚ__init__zDsaKey.__init__g   sÈ   € Ý˜Ÿš™œÑ(Ô(ˆ	ÝÐ.Ñ/Ô/ˆ
Ø×"Ò" 9Ñ-Ô-ð 	:ÝÐCÝ  ¨iÑ!7Ñ8Ô8ñ9ñ :ô :ð :à 
Ñ*ˆ	Øð 	;˜¥c¨&¡k¤kÒ1Ð1ÝÐ:Ý  ­S°©[¬[Ñ!8Ñ9Ô9ñ:ñ ;ô ;ð ;å˜‘N”NˆŒ	ˆ	ˆ	ó    c                 ó”  ‡ — ‰                       ¦   «         st          d¦  «        ‚d|cxk     r‰ j        k     sn t          d¦  «        ‚ˆ fd„dD ¦   «         \  }}}}t	          j        d|¬¦  «        }||z                       |¦  «        }||z  }	t          |||¦  «        |z  }
|||z  |	|
z  z   z  |z  }t          t          |
|f¦  «        S )Nz)DSA public key cannot be used for signingé   zk is not between 2 and q-1c                 ó*   •— g | ]}‰j         |         ‘ŒS © ©r,   ©Ú.0Úcompr-   s     €r2   ú
<listcomp>z DsaKey._sign.<locals>.<listcomp>y   ó   ø€ ÐGÐGÐG¨$�d”i ”oÐGÐGÐGr4   )r"   r!   r    r   )Úmin_inclusiveÚmax_exclusive)
Úhas_privateÚ	TypeErrorr!   r)   r   Úrandom_rangeÚinverseÚpowÚmapÚint)r-   ÚmÚkr"   r!   r    r   Úblind_factorÚinv_blind_kÚblind_xÚrÚss   `           r2   Ú_signzDsaKey._signs   sô   ø€ Ø×ÒÑ!Ô!ð 	IÝÐGÑHÔHÐHØ�A��’�˜œ’���ÝÐ9Ñ:Ô:Ð:àGÐGÐGÐGÐ2FÐGÑGÔG‰
ˆˆ1ˆa�åÔ+¸!Ø9:ð<ñ <ô <ˆà# aÑ'×0Ò0°Ñ3Ô3ˆØ�lÑ"ˆå��1�a‰LŒL˜1ÑˆØ˜L¨1Ñ,¨w¸©{Ñ:Ñ;¸qÑ@ˆÝ•3˜˜A˜ÑÔÐr4   c                 ó8  ‡ — |\  }}ˆ fd„dD ¦   «         \  }}}}d|cxk     r|k     rn nd|cxk     r|k     sn dS t          |¦  «                             |¦  «        }	|	|z  |z  }
|	|z  |z  }t          ||
|¦  «        t          |||¦  «        z  |z  |z  }||k    S )Nc                 ó*   •— g | ]}‰j         |         ‘ŒS r8   r9   r:   s     €r2   r=   z"DsaKey._verify.<locals>.<listcomp>†   r>   r4   )r   r!   r    r   r   F)r   rD   rE   )r-   rH   ÚsigrM   rN   r   r!   r    r   ÚwÚu1Úu2Úvs   `            r2   Ú_verifyzDsaKey._verify„   sÆ   ø€ Ø‰ˆˆ1ØGÐGÐGÐGÐ2FÐGÑGÔG‰
ˆˆ1ˆa�Ø�A�	�	’	�	˜’	�	�	�	�	 1 q 9 9¢9 9¨1¢9 9 9 9Ø�5Ý�A‰JŒJ×Ò˜qÑ!Ô!ˆØ�!‰e�q‰[ˆØ�!‰e�q‰[ˆÝ��B˜‰]Œ]�S  B¨™]œ]Ñ*¨QÑ.°!Ñ3ˆØ�AŠvˆr4   c                 ó   — d| j         v S )z!Whether this is a DSA private keyr"   r9   ©r-   s    r2   rA   zDsaKey.has_private�   s   € ð �d”iÐÐr4   c                 ó   — dS )NFr8   rY   s    r2   Úcan_encryptzDsaKey.can_encrypt”   s   € Øˆur4   c                 ó   — dS )NTr8   rY   s    r2   Úcan_signzDsaKey.can_sign—   s   € Øˆtr4   c                 óX   ‡ — t          ˆ fd„dD ¦   «         ¦  «        }t          |¦  «        S )z^A matching DSA public key.

        Returns:
            a new :class:`DsaKey` object
        c              3   ó6   •K  — | ]}|‰j         |         fV — Œd S ©Nr9   )r;   rI   r-   s     €r2   ú	<genexpr>z$DsaKey.public_key.<locals>.<genexpr>¡   s.   øè è € Ð QÐ Q°q ! T¤Y¨q¤\Ð!2Ð QÐ QÐ QÐ QÐ QÐ Qr4   r$   )r+   r   )r-   Úpublic_componentss   ` r2   Ú
public_keyzDsaKey.public_keyš   s8   ø€ õ !Ð QÐ QÐ QÐ QÐ<PÐ QÑ QÔ QÑQÔQÐÝÐ'Ñ(Ô(Ð(r4   c                 ó
  — t          |                      ¦   «         ¦  «        t          |                     ¦   «         ¦  «        k    rdS d}| j        D ]2}|o-t          | j        |d ¦  «        t          |j        |d ¦  «        k    }Œ3|S )NFT)ÚboolrA   Ú_keydataÚgetattrr,   )r-   ÚotherÚresultr<   s       r2   Ú__eq__zDsaKey.__eq__¤   s‹   € Ý�× Ò Ñ"Ô"Ñ#Ô#¥t¨E×,=Ò,=Ñ,?Ô,?Ñ'@Ô'@Ò@Ð@Ø�5àˆØ”Mð 	Bð 	BˆDØð B¥¨¬°D¸$Ñ!?Ô!?Ý!(¨¬°T¸4Ñ!@Ô!@ò"AˆFˆFàˆr4   c                 ó.   — |                       |¦  «         S r`   )rj   )r-   rh   s     r2   Ú__ne__zDsaKey.__ne__®   s   € Ø—;’;˜uÑ%Ô%Ð%Ð%r4   c                 ó   — ddl m} |‚)Nr   )ÚPicklingError)Úpicklern   )r-   rn   s     r2   Ú__getstate__zDsaKey.__getstate__±   s   € à(Ð(Ð(Ð(Ð(Ð(ØÐr4   c                 ó    ‡ — ˆ fd„dD ¦   «         S )zPThe DSA domain parameters.

        Returns
            tuple : (p,q,g)
        c                 óD   •— g | ]}t          ‰j        |         ¦  «        ‘ŒS r8   )rG   r,   r:   s     €r2   r=   z!DsaKey.domain.<locals>.<listcomp>½   s'   ø€ ÐAÐAÐA¨•�D”I˜d”OÑ$Ô$ÐAÐAÐAr4   )r    r!   r   r8   rY   s   `r2   ÚdomainzDsaKey.domain¶   s    ø€ ð BÐAÐAÐA°ÐAÑAÔAÐAr4   c                 ó¦  — g }| j         D ]m}|dk    r@t          | j        ¦  «                             ¦   «         }|                     d|fz  ¦  «         ŒHt          | |¦  «        r|                     |¦  «         Œn|                      ¦   «         r|                     d¦  «         d| j        j        t          | ¦  «        d 
                    |¦  «        fz  S )Nr    zp(%d)Úprivatez<%s @0x%x %s>ú,)rf   r   r    Úsize_in_bitsÚappendÚhasattrrA   Ú	__class__Ú__name__ÚidÚjoin)r-   ÚattrsrI   Úbitss       r2   Ú__repr__zDsaKey.__repr__¿   sÅ   € ØˆØ”ð 	 ð 	 ˆAØ�CŠxˆxÝ˜tœv‘”×3Ò3Ñ5Ô5�Ø—’˜W¨ wÑ.Ñ/Ô/Ð/Ð/Ý˜˜qÑ!Ô!ð  Ø—’˜Q‘”�øØ×ÒÑÔð 	$Ø�LŠL˜Ñ#Ô#Ð#à $¤.Ô"9½2¸d¹8¼8ÀSÇXÂXÈeÁ_Ä_Ð!UÑUÐUr4   c                 ór   — 	 t          | j        |         ¦  «        S # t          $ r t          |¦  «        ‚w xY wr`   )rG   r,   ÚKeyErrorÚAttributeError)r-   Úitems     r2   Ú__getattr__zDsaKey.__getattr__Ì   sD   € ð	'Ý�t”y ”Ñ'Ô'Ð'øÝð 	'ð 	'ð 	'Ý  Ñ&Ô&Ð&ð	'øøøs   ‚ œ6r   Nc                 óò  ‡ ‡— |�t          |¦  «        }|€t          j        }|dk    rcˆ fd„dD ¦   «         }d„ Šˆfd„|D ¦   «         }dg|z   }d                     d	„ |D ¦   «         ¦  «        }	d
t	          j        |	¦  «        dd…         z   S t          ‰ j        ‰ j        ‰ j	        g¦  «        }
‰  
                    ¦   «         rµ|€d}|rS|sd}t          ‰ j        ¦  «                             ¦   «         }t          j        |t           |||
|¬¦  «        }|rd}nd}d}n—|dk    r|rt#          d¦  «        ‚d‰ j        ‰ j        ‰ j	        ‰ j        ‰ j        g}t          |¦  «                             ¦   «         }d}n;|rt#          d¦  «        ‚t'          t           t          ‰ j        ¦  «        |
¦  «        }d}|dk    r|S |dk    r)t)          j        ||dz   ||¦  «        }t          |¦  «        S t#          d|z  ¦  «        ‚)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:`Cryptodome.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:`Cryptodome.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ÚOpenSSHc                 óN   •— g | ]!}‰j         |                              ¦   «         ‘Œ"S r8   )r,   Úto_bytes)r;   r"   r-   s     €r2   r=   z%DsaKey.export_key.<locals>.<listcomp>  s+   ø€ ÐJÐJÐJ°�D”I˜a”L×)Ò)Ñ+Ô+ÐJÐJÐJr4   )r    r!   r   r   c                 óZ   — 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”J Ñ%ð Ý ™7œ7 Q™;Ð&à�Hr4   c                 ó&   •— g | ]} ‰|¦  «        ‘ŒS r8   r8   )r;   r"   rŒ   s     €r2   r=   z%DsaKey.export_key.<locals>.<listcomp>  s!   ø€ Ð*Ð*Ð* �D�D˜‘G”GÐ*Ð*Ð*r4   ó   ssh-dssr4   c                 óX   — g | ]'}t          j        d t          |¦  «        ¦  «        |z   ‘Œ(S )ú>I)ÚstructÚpackÚlen)r;   Úkps     r2   r=   z%DsaKey.export_key.<locals>.<listcomp>  s/   € ÐPÐPÐPÀ�Vœ[¨­s°2©w¬wÑ7Ô7¸"Ñ<ÐPÐPÐPr4   ó   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}   ÚbinasciiÚ
b2a_base64r   r    r!   r   rA   r   r"   Úencoder   ÚwrapÚoidr)   r   r   r   )r-   ÚformatÚpkcs8Ú
passphraseÚ
protectionr˜   Útup1Útup2ÚkeypartsÚ	keystringÚparamsÚprivate_keyÚ
binary_keyÚkey_typeÚintsÚpem_strrŒ   s   `               @r2   Ú
export_keyzDsaKey.export_keyÒ   sg  øø€ ðv Ð!Ý  Ñ,Ô,ˆJàÐÝÔ.ˆHà�YÒÐØJÐJÐJÐJÐ5IÐJÑJÔJˆDðð ð ð +Ð*Ð*Ð* TÐ*Ñ*Ô*ˆDØ"�| dÑ*ˆHØŸšØPÐPÀxÐPÑPÔPñô ˆIð ¥Ô!4°YÑ!?Ô!?ÀÀÀÔ!DÑDÐDõ ˜dœf d¤f¨d¬fÐ5Ñ6Ô6ˆØ×ÒÑÔð 	 Øˆ}Ø�Øð )Ø!ð FØ!E�JÝ(¨¬Ñ0Ô0×7Ò7Ñ9Ô9�Ý"œZØ +­S°*Ø *°vØ)1ð"ñ "ô "�
ð
 ð )Ø2�H�Hà(�HØ!�
�
à˜U’?�? z�?Ý$Ð%JÑKÔKÐKØ˜4œ6 4¤6¨4¬6°4´6¸4¼6ÐB�Ý(¨Ñ.Ô.×5Ò5Ñ7Ô7�
Ø(��àð OÝ Ð!MÑNÔNÐNå8½Ý *¨4¬6Ñ 2Ô 2°Fñ<ô <ˆJàˆHà�UŠ?ˆ?ØÐØ�UŠ?ˆ?Ý”jØ *¨H°vÑ,=Ø *¨Hñô ˆGõ ˜7Ñ#Ô#Ð#ÝÐNÐQWÑWÑXÔXÐXr4   c                 ó    — t          d¦  «        ‚©Nz+Use module Cryptodome.Signature.DSS instead©ÚNotImplementedError)r-   ÚMÚKs      r2   ÚsignzDsaKey.signU  ó   € Ý!Ð"OÑPÔPÐPr4   c                 ó    — t          d¦  «        ‚r²   r³   )r-   rµ   Ú	signatures      r2   ÚverifyzDsaKey.verifyX  r¸   r4   c                 ó   — t           ‚r`   r³   )r-   Ú	plaintextr¶   s      r2   ÚencryptzDsaKey.encrypt[  ó   € Ý!Ð!r4   c                 ó   — t           ‚r`   r³   )r-   Ú
ciphertexts     r2   ÚdecryptzDsaKey.decrypt^  r¿   r4   c                 ó   — t           ‚r`   r³   ©r-   rµ   ÚBs      r2   ÚblindzDsaKey.blinda  r¿   r4   c                 ó   — t           ‚r`   r³   rÄ   s      r2   ÚunblindzDsaKey.unblindd  r¿   r4   c                 ó   — t           ‚r`   r³   rY   s    r2   ÚsizezDsaKey.sizeg  r¿   r4   )r   NNNN)r{   Ú
__module__Ú__qualname__Ú__doc__rf   r3   rO   rW   rA   r[   r]   rc   rj   rl   rp   rs   r€   r…   r°   Ú	exportKeyÚ	publickeyr·   r»   r¾   rÂ   rÆ   rÈ   rÊ   r8   r4   r2   r   r   N   s•  € € € € € ðð ð, )Ð(Ð(€Hð
#ð 
#ð 
#ð ð  ð  ð"	ð 	ð 	ð ð  ð  ð
ð ð ðð ð ð)ð )ð )ðð ð ð&ð &ð &ðð ð ð
Bð Bð BðVð Vð Vð'ð 'ð 'ð ?CØ,0ð{Yð {Yð {Yð {Yð| €IØ€IðQð Qð QðQð Qð Qð"ð "ð "ð"ð "ð "ð"ð "ð "ð"ð "ð "ð"ð "ð "ð "ð "r4   r   c                 óT  ‡‡‡‡— ddddœ                      | ¦  «        }|€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          k    rj |d
¦  «        Št	          j        t          j        ‰¦  «         	                    ¦   «         ¦  «        |dz
  z  }||z  dz  }t          ||¦  «        t          k    °j| 
                    ¦   «         |k    sJ ‚dŠd| dz
  z  }	 ˆˆfd„t          |dz   ¦  «        D ¦   «         Šd„ ‰D ¦   «         Št          ˆˆfd„t          |¦  «        D ¦   «         ‰|         d|z  dz
  z  d|‰z  z  z  ¦  «        }t	          ||z   ¦  «        }	|	 
                    ¦   «         | k    sJ ‚|	|dz  z  }
|	|
dz
  z
  }| 
                    ¦   «         | k    rt          ||¦  «        t          k    rn	‰|dz   z  ŠŒä|dz
  |z  }t          j        d¦  «        D ]Š}‰dz   t          d¦  «        z   t	          |¦  «                             ¦   «         z   }t	          j        t          j        |¦  «         	                    ¦   «         ¦  «        }t#          |||¦  «        }|dk    r nŒ‹|||‰fS )z+Generate a new set of DSA domain parametersé    éà   é   )é   é   é   NzInvalid modulus length (%d)é   r6   é   é@   Tc           	      ó¦   •— g | ]M}t          j        ‰t          ‰|z   ¦  «                             ¦   «         z   ¦  «                             ¦   «         ‘ŒNS r8   )r   Únewr   r‰   Údigest)r;   ÚjÚoffsetÚseeds     €€r2   r=   z$_generate_domain.<locals>.<listcomp>„  s\   ø€ ð +ð +ð +Øõ Œj˜¥¨°©
Ñ 3Ô 3× <Ò <Ñ >Ô >Ñ>Ñ?Ô?×FÒFÑHÔHð +ð +ð +r4   c                 ó6   — g | ]}t          j        |¦  «        ‘ŒS r8   ©r   Ú
from_bytes)r;   rV   s     r2   r=   z$_generate_domain.<locals>.<listcomp>†  s#   € Ð0Ð0Ð0¨�gÔ  Ñ#Ô#Ð0Ð0Ð0r4   c                 ó2   •— g | ]}‰|         d |‰z  z  z  ‘ŒS )r6   r8   )r;   ÚiÚVÚoutlens     €€r2   r=   z$_generate_domain.<locals>.<listcomp>‡  s+   ø€ ÐCÐCÐC°��1”˜˜q 6™zÑ*Ñ+ÐCÐCÐCr4   é   s   ggen)Úgetr)   r   Údigest_sizer   r   r   râ   rÛ   rÜ   rw   r   ÚsumÚ	itertoolsÚcountr   r‰   rE   )ÚLr˜   ÚNÚnÚb_r!   Ú	upper_bitÚUÚWÚXÚcr    Úerì   r   rå   rÞ   ræ   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Ò
<Ð
<Øˆx˜‰|Œ|ˆÝÔ�vœz¨$Ñ/Ô/×6Ò6Ñ8Ô8Ñ9Ô9¸YÈ¹]ÑKˆØ�	‰M˜AÑˆõ ˜a Ñ
*Ô
*­nÒ
<Ð
<ð
 �>Š>ÑÔ˜qÒ Ð Ð Ð ð €FØ�a˜!‘e‘€Iðð+ð +ð +ð +ð +Ý! ! a¡%Ñ(Ô(ð+ñ +ô +ˆà0Ð0¨QÐ0Ñ0Ô0ˆÝÐCÐCÐCÐCÐCµZÀ±]´]ÐCÑCÔCØ�1”˜!˜r™' Q™Ñ'¨A°!°f±*Ñ,=Ñ>ñ@ô @ˆõ �A˜	‘MÑ"Ô"ˆØ�~Š~ÑÔ 1Ò$Ð$Ð$Ð$à��Q‘‰KˆØ��Q‘‰KˆØ�>Š>ÑÔ˜qÒ Ð Ý˜q (Ñ+Ô+­~Ò=Ð=ØØ�!�a‘%‰ˆðð$ 
ˆQ‰�1‰€AÝ” Ñ#Ô#ð ð ˆØ�7‰N�T !™WœWÑ$¥w¨u¡~¤~×'>Ò'>Ñ'@Ô'@Ñ@ˆÝÔ�vœz¨!™}œ}×3Ò3Ñ5Ô5Ñ6Ô6ˆÝ��1�a‰LŒLˆØ�Š6ˆ6ØˆEð ð ˆq�!�Tˆ?Ðr4   c                 ó   — |€t           j        }|r”t          t          |¦  «        \  }}}t	          |¦  «        t
          k    }|t	          |¦  «        t
          k    z  }||dz
  |z  dk    z  }||dk    p||k    z  }|t          |||¦  «        dk    z  }|rt          d¦  «        ‚nt          | |¦  «        \  }}}}| 	                    ¦   «         }| 	                    ¦   «         }	|| k    rt          d|| fz  ¦  «        ‚||	fdvrt          d||	fz  ¦  «        ‚d|cxk     r|k     sn 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:`Cryptodome.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
    Nr6   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œ   rF   r   r   r   rE   r)   r÷   rw   Úrandomr   )r   r˜   rs   r    r!   r   Ú	fmt_errorÚ_rí   rî   rõ   r"   r   r.   s                 r2   r   r      sã  € ð< ÐÝÔ*ˆàð 6Ý•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Ô5‰
ˆˆ1ˆa�à	�ŠÑÔ€AØ	�ŠÑÔ€AàˆD‚y€yÝð 6Ø9:¸D¸	ñBñ Cô Cð 	Cð 	
ˆ1€vð 0ð 0ð 0åð )Ø,-¨q¨6ñ2ñ 3ô 3ð 	3ð ˆqˆ9ˆ9Š9ˆ9�1Š9ˆ9ˆ9ˆ9ÝÐ2Ñ3Ô3Ð3õ 	Œ ! b¡&°8Ð<Ñ<Ô<€AØ	ˆQ�‰U‰�a‰€AÝˆAˆq�!‰Œ€Aà˜A 1¨!°Ð4Ð4€HÝ�(ÑÔÐr4   Tc           	      óÖ  — t          t          dt          t          | ¦  «        ¦  «        ¦  «        }t	          |¦  «        }d}|�rt          |j        ¦  «        t          k    }|t          |j        ¦  «        t          k    z  }||j        dz
  |j        z  dk    z  }||j	        dk    p|j	        |j        k    z  }|t          |j	        |j        |j        ¦  «        dk    z  }||j        dk    p|j        |j        k    z  }t          |d¦  «        rJ||j        dk    p|j        |j        k    z  }|t          |j	        |j        |j        ¦  «        |j        k    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+   ÚziprF   r   r   r   r    r   r!   r   rE   r   ry   r"   r)   )ÚtupÚconsistency_checkr.   Úkeyrû   s        r2   r   r   é  sS  € õ2 •CÐ1µ3µwÀÑ3DÔ3DÑEÔEÑFÔF€HÝ
�Ñ
Ô
€Cà€IØñ ;å'¨¬Ñ.Ô.µ)Ò;ˆ	ØÕ(¨¬Ñ/Ô/µ9Ò<Ñ<ˆ	à�s”u˜q‘y C¤EÑ)¨aÒ/Ñ/ˆ	Ø�S”U˜a’ZÐ1 3¤5¨C¬E¢>Ñ1ˆ	Ø•S˜œ ¤ s¤uÑ-Ô-°Ò2Ñ2ˆ	à�S”U˜a’ZÐ1 3¤5¨C¬E¢>Ñ1ˆ	Ý�3˜ÑÔð 	;Ø˜œ !šÐ5 s¤u°´¢~Ñ5ˆIØ�˜SœU C¤E¨3¬5Ñ1Ô1°S´UÒ:Ñ:ˆIàð 7ÝÐ5Ñ6Ô6Ð6à€Jr4   c                 óÞ   ‡— |rt          d¦  «        ‚t          ¦   «                              | dd¬¦  «        Š‰d         dk    rt          d¦  «        ‚ˆfd„dD ¦   «         }t          |¦  «        S )	Nz-DSA private key already comes with parametersé   T)Únr_elementsÚonly_ints_expectedr   zNo version foundc                 ó    •— g | ]
}‰|         ‘ŒS r8   r8   )r;   r<   Úders     €r2   r=   z+_import_openssl_private.<locals>.<listcomp>'  s   ø€ Ð
1Ð
1Ð
1˜ˆ3ˆtŒ9Ð
1Ð
1Ð
1r4   )rØ   é   r6   rç   é   )r)   r   Údecoder   )Úencodedr¤   rª   rÿ   r  s       @r2   Ú_import_openssl_privater  !  sz   ø€ Øð JÝÐHÑIÔIÐIÝ
‰-Œ-×
Ò
˜w°AÈ$Ð
Ñ
OÔ
O€CØ
ˆ1„v�‚{€{ÝÐ+Ñ,Ô,Ð,Ø
1Ð
1Ð
1Ð
1 Ð
1Ñ
1Ô
1€CÝ�S‰>Œ>Ðr4   c                 ó`  — t          | ¦  «        \  }}}|t          k    rt          d¦  «        ‚|r|rt          d¦  «        ‚t          ¦   «                              |¦  «        j        }t          t          ¦   «                              |p|¦  «        ¦  «        \  }}}	||	||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Ô'OÑ#€FˆK˜Ø•‚}€}ÝÐ6Ñ7Ô7Ð7Øð 4�*ð 4ÝÐ2Ñ3Ô3Ð3å‰Œ×Ò˜KÑ(Ô(Ô.€AÝ•;‘=”=×'Ò'¨Ð(<°*Ñ=Ô=Ñ>Ô>�G€A€qˆ!Øˆa��Aˆ,€CÝ�S‰>Œ>Ðr4   c                 óB   — t          | ¦  «        }t          |d |¦  «        S r`   )r   r  )r  r¤   rª   Úsp_infos       r2   Ú_import_x509_certr  9  s!   € å.¨wÑ7Ô7€GÝ'¨°°vÑ>Ô>Ð>r4   c                 ó   — |rt          d¦  «        ‚t          j        | |¦  «        }|d         t          k    rt          d¦  «        ‚t	          ¦   «                              |d         ¦  «        j        }t          t          ¦   «                              |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   rE   r   )	r  r¤   rª   rI   r"   r    r!   r   rÿ   s	            r2   Ú_import_pkcs8r  ?  s³   € Øð ?ÝÐ=Ñ>Ô>Ð>ÝŒ�W˜jÑ)Ô)€AØˆ„t�s‚{€{ÝÐ4Ñ5Ô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          $ r Y Œw xY wt	          d¦  «        ‚)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  sx   € õ )Ý-Ý"Ýð €Ið
 ð ð ˆð	Ø�8˜H j°&Ñ9Ô9Ð9Ð9Ð9øÝð 	ð 	ð 	ØˆDð	øøøõ Ð6Ñ
7Ô
7Ð7s    /¯
<»<c                 óB  ‡— t          | ¦  «        } |�t          |¦  «        }|                      d¦  «        r;t          j        t	          | ¦  «        |¦  «        \  }}}|rd}t          ||d¦  «        S |                      d¦  «        rÎt          j        |                      d¦  «        d         ¦  «        }g Št          |¦  «        dk    rct          j        d|dd…         ¦  «        d         }‰                     |dd|z   …         ¦  «         |d|z   d…         }t          |¦  «        dk    °c‰d         d	k    rˆfd
„dD ¦   «         }t          |¦  «        S t          | ¦  «        dk    r*t          | d         ¦  «        dk    rt          | |d¦  «        S t          d¦  «        ‚)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Ž   c                 óD   •— g | ]}t          j        ‰|         ¦  «        ‘ŒS r8   rá   )r;   r"   r¨   s     €r2   r=   zimport_key.<locals>.<listcomp>˜  s(   ø€ ÐIÐIÐI°q•7Ô% h¨q¤kÑ2Ô2ÐIÐIÐIr4   )rØ   r  r6   rç   é0   r  )r	   Ú
startswithr   r
  r
   r  r�   Ú
a2b_base64Úsplitr“   r‘   Úunpackrx   r   r   r)   )	Ú
extern_keyr¤   r  ÚmarkerÚenc_flagr©   Úlengthrÿ   r¨   s	           @r2   r   r   \  sª  ø€ õP ˜Ñ$Ô$€JØÐÝ˜ZÑ(Ô(ˆ
à×Ò˜XÑ&Ô&ð 6å"%¤*­U°:Ñ->Ô->À
Ñ"KÔ"KÑˆˆf�hØð 	ØˆJÝ˜s J°Ñ5Ô5Ð5à×Ò˜[Ñ)Ô)ð 
"åÔ'¨
×(8Ò(8¸Ñ(>Ô(>¸qÔ(AÑBÔBˆ	ØˆÝ�)‰nŒn˜qÒ Ð Ý”] 4¨°2°A°2¬Ñ7Ô7¸Ô:ˆFØ�OŠO˜I a¨¨F©
 lÔ3Ñ4Ô4Ð4Ø! ! f¡* + +Ô.ˆIõ �)‰nŒn˜qÒ Ð ð �AŒ;˜*Ò$Ð$ØIÐIÐIÐI¸LÐIÑIÔIˆCÝ˜S‘>”>Ð!å
ˆ:�„˜ÒÐ�t J¨q¤MÑ2Ô2°dÒ:Ð:å˜z¨:°tÑ<Ô<Ð<å
Ð6Ñ
7Ô
7Ð7r4   z1.2.840.10040.4.1)NN)Tr`   ).Ú__all__r�   r‘   rë   ÚCryptodome.Util.py3compatr   r   r	   r
   r   Ú
Cryptodomer   ÚCryptodome.IOr   r   ÚCryptodome.Hashr   ÚCryptodome.Util.asn1r   r   r   r   r   ÚCryptodome.Math.Numbersr   ÚCryptodome.Math.Primalityr   r   r   ÚCryptodome.PublicKeyr   r   r   Úobjectr   r÷   r   r   r  r  r  r  r  r   Ú	importKeyr¡   r8   r4   r2   ú<module>r7     sF  ðð2 =Ð
<Ð
<€à €€€Ø €€€Ø Ð Ð Ð à LÐ LÐ LÐ LÐ LÐ LÐ LÐ LÐ LÐ LÐ LÐ LÐ LÐ Là Ð Ð Ð Ð Ð Ø $Ð $Ð $Ð $Ð $Ð $Ð $Ð $Ø "Ð "Ð "Ð "Ð "Ð "ðð ð ð ð ð ð ð ð ð ð ð ð ð ð ,Ð +Ð +Ð +Ð +Ð +ð3ð 3ð 3ð 3ð 3ð 3ð 3ð 3ð 3ð 3ð@ð @ð @ð @ð @ð @ð @ð @ð @ð @ð@Z"ð Z"ð Z"ð Z"ð Z"ˆVñ Z"ô Z"ð Z"ðz2ð 2ð 2ðjFð Fð Fð FðR.ð .ð .ð .ðpð ð ðð ð ð?ð ?ð ?ð	ð 	ð 	ð8ð 8ð 8ð"C8ð C8ð C8ð C8ðN €	ð €€€r4   