U
    ÈZjjW  ã                   @   s"  d dddg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„ de!ƒZ"dd„ Z#d dd „Z$d!dd„Z%dd„ Z&dd„ Z'dd„ Z(dd„ Z)dd„ Z*d"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                   @   sÐ   e Zd ZdZdddddg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d3d#d$„ZeZeZd%d&„ Zd'd(„ Zd)d*„ Zd+d,„ Zd-d.„ Zd/d0„ Zd1d2„ Zd"S )4r   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                 C   sp   t | ¡ ƒ}t dƒ}| |¡s2tdt|| ƒ ƒ‚|| }|rb|t dƒkrbtdt|t dƒ ƒ ƒ‚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_dictZ	input_setZ
public_setZ	extra_set© r+   úW/var/www/html/TRUCKING_PROJECT/venv/lib/python3.8/site-packages/Crypto/PublicKey/DSA.pyÚ__init__g   s    

ÿÿzDsaKey.__init__c                    s¤   ˆ   ¡ stdƒ‚d|  k r&ˆ jk s0n tdƒ‚‡ fdd„dD ƒ\}}}}tjd|d�}||  |¡}|| }	t|||ƒ| }
||| |	|
   | }tt	|
|fƒS )Nz)DSA public key cannot be used for signingé   zk is not between 2 and q-1c                    s   g | ]}ˆ j | ‘qS r+   ©r(   ©Ú.0Úcomp©r)   r+   r,   Ú
<listcomp>y   s     z DsaKey._sign.<locals>.<listcomp>)r   r   r   r   )Zmin_inclusiveZmax_exclusive)
Úhas_privateÚ	TypeErrorr   r%   r   Zrandom_rangeÚinverseÚpowÚmapÚint)r)   ÚmÚkr   r   r   r   Zblind_factorZinv_blind_kZblind_xÚrÚsr+   r3   r,   Ú_signs   s    ÿzDsaKey._signc                    s¢   |\}}‡ fdd„dD ƒ\}}}}d|  k r6|k rPn nd|  k rN|k sTn dS t |ƒ |¡}	|	| | }
|	| | }t||
|ƒt|||ƒ | | }||kS )Nc                    s   g | ]}ˆ j | ‘qS r+   r/   r0   r3   r+   r,   r4   †   s     z"DsaKey._verify.<locals>.<listcomp>)r   r   r   r   r   F)r   r7   r8   )r)   r;   Úsigr=   r>   r   r   r   r   ÚwÚu1Úu2Úvr+   r3   r,   Ú_verify„   s    . zDsaKey._verifyc                 C   s
   d| j kS )z!Whether this is a DSA private keyr   r/   r3   r+   r+   r,   r5   �   s    zDsaKey.has_privatec                 C   s   dS )NFr+   r3   r+   r+   r,   Úcan_encrypt”   s    zDsaKey.can_encryptc                 C   s   dS )NTr+   r3   r+   r+   r,   Úcan_sign—   s    zDsaKey.can_signc                    s   t ‡ fdd„dD ƒƒ}t|ƒS )z^A matching DSA public key.

        Returns:
            a new :class:`DsaKey` object
        c                 3   s   | ]}|ˆ j | fV  qd S ©Nr/   )r1   r<   r3   r+   r,   Ú	<genexpr>¡   s     z$DsaKey.public_key.<locals>.<genexpr>r    )r'   r   )r)   Zpublic_componentsr+   r3   r,   Ú
public_keyš   s    zDsaKey.public_keyc                 C   sP   t |  ¡ ƒt | ¡ ƒkrdS d}| jD ]$}|oHt| j|d ƒt|j|d ƒk}q&|S )NFT)Úboolr5   Ú_keydataÚgetattrr(   )r)   ÚotherÚresultr2   r+   r+   r,   Ú__eq__¤   s    
ÿzDsaKey.__eq__c                 C   s   |   |¡ S rH   )rP   )r)   rN   r+   r+   r,   Ú__ne__®   s    zDsaKey.__ne__c                 C   s   ddl m} |‚d S )Nr   )ÚPicklingError)ÚpicklerR   )r)   rR   r+   r+   r,   Ú__getstate__±   s    zDsaKey.__getstate__c                    s   ‡ fdd„dD ƒS )zPThe DSA domain parameters.

        Returns
            tuple : (p,q,g)
        c                    s   g | ]}t ˆ j| ƒ‘qS r+   )r:   r(   r0   r3   r+   r,   r4   ½   s     z!DsaKey.domain.<locals>.<listcomp>)r   r   r   r+   r3   r+   r3   r,   Údomain¶   s    zDsaKey.domainc                 C   sz   g }| j D ]@}|dkr6t| jƒ ¡ }| d|f ¡ q
t| |ƒr
| |¡ q
|  ¡ r^| d¡ d| jjt	| ƒd 
|¡f S )Nr   zp(%d)Úprivatez<%s @0x%x %s>ú,)rL   r   r   Úsize_in_bitsÚappendÚhasattrr5   Ú	__class__Ú__name__ÚidÚjoin)r)   Úattrsr<   Úbitsr+   r+   r,   Ú__repr__¿   s    


zDsaKey.__repr__c                 C   s2   zt | j| ƒW S  tk
r,   t|ƒ‚Y nX d S rH   )r:   r(   ÚKeyErrorÚAttributeError)r)   Úitemr+   r+   r,   Ú__getattr__Ì   s    zDsaKey.__getattr__r   Nc                    s   |dk	rt |ƒ}|dkrtj}|dkr†‡fdd„dD ƒ}dd„ ‰ ‡ fdd„|D ƒ}d	g| }d
 dd„ |D ƒ¡}	dt |	¡dd…  S tˆjˆjˆj	gƒ}
ˆ 
¡ �r8|dkr°d}|rô|s¼d}tˆjƒ ¡ }tj|t|||
|d�}|rêd}nd}d}nB|dk�r|�rtdƒ‚dˆjˆjˆj	ˆjˆjg}t|ƒ ¡ }d}n$|�rFtdƒ‚tttˆjƒ|
ƒ}d}|dk�rj|S |dk�r�t ||d ||¡}t |ƒS td| ƒ‚dS )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
        NZOpenSSHc                    s   g | ]}ˆ j |  ¡ ‘qS r+   )r(   Úto_bytes©r1   r   r3   r+   r,   r4     s     z%DsaKey.export_key.<locals>.<listcomp>)r   r   r   r   c                 S   s$   t | d ƒd@ rtdƒ|  S | S d S )Nr   é€   )r   r   r!   r+   r+   r,   Úfunc  s    zDsaKey.export_key.<locals>.funcc                    s   g | ]}ˆ |ƒ‘qS r+   r+   rg   )ri   r+   r,   r4     s     ó   ssh-dssó    c                 S   s    g | ]}t  d t|ƒ¡| ‘qS )ú>I)ÚstructÚpackÚlen)r1   Úkpr+   r+   r,   r4     s     ó   ssh-dss éÿÿÿÿTz"PBKDF2WithHMAC-SHA1AndDES-EDE3-CBC)Z
key_paramsÚrandfunczENCRYPTED PRIVATEZPRIVATEr   z#DSA private key cannot be encryptedr   zDSA PRIVATEz*PKCS#8 is only meaningful for private keysZPUBLICZDERz KEYz3Unknown key format '%s'. Cannot export the DSA key.)r   r   Úget_random_bytesr^   ÚbinasciiÚ
b2a_base64r   r   r   r   r5   r   r   Úencoder   ÚwrapÚoidr%   r   r   r   )r)   ÚformatZpkcs8Ú
passphraseZ
protectionrs   Ztup1Ztup2ÚkeypartsÚ	keystringÚparamsZprivate_keyZ
binary_keyZkey_typeZintsZpem_strr+   )ri   r)   r,   Ú
export_keyÒ   sp    ;
ÿ
   ý ÿ

  þzDsaKey.export_keyc                 C   s   t dƒ‚d S ©Nz'Use module Crypto.Signature.DSS instead©ÚNotImplementedError)r)   ÚMÚKr+   r+   r,   ÚsignU  s    zDsaKey.signc                 C   s   t dƒ‚d S r€   r�   )r)   rƒ   Ú	signaturer+   r+   r,   ÚverifyX  s    zDsaKey.verifyc                 C   s   t ‚d S rH   r�   )r)   Z	plaintextr„   r+   r+   r,   Úencrypt[  s    zDsaKey.encryptc                 C   s   t ‚d S rH   r�   )r)   Z
ciphertextr+   r+   r,   Údecrypt^  s    zDsaKey.decryptc                 C   s   t ‚d S rH   r�   ©r)   rƒ   ÚBr+   r+   r,   Úblinda  s    zDsaKey.blindc                 C   s   t ‚d S rH   r�   rŠ   r+   r+   r,   Úunblindd  s    zDsaKey.unblindc                 C   s   t ‚d S rH   r�   r3   r+   r+   r,   Úsizeg  s    zDsaKey.size)r   NNNN)r\   Ú
__module__Ú__qualname__Ú__doc__rL   r-   r?   rE   r5   rF   rG   rJ   rP   rQ   rT   rU   ra   re   r   Z	exportKeyZ	publickeyr…   r‡   rˆ   r‰   rŒ   r�   rŽ   r+   r+   r+   r,   r   N   s8   

	    ÿ
~c                    s  ddddœ  | ¡}|dkr&td|  ƒ‚tjd ‰| ˆ d ˆ d }| d |ˆ  }td	ƒ}d|d > }t||ƒtkr¨|d
ƒ‰t t ˆ¡ 	¡ ¡|d @ }||B dB }qh| 
¡ |ks¸t‚d‰d| d > }‡‡fdd„t|d ƒD ƒ‰ dd„ ˆ D ƒ‰ t‡ ‡fdd„t|ƒD ƒˆ | d|> d @ d|ˆ >  ƒ}t|| ƒ}	|	 
¡ | k�sJt‚|	|d  }
|	|
d  }| 
¡ | k�r„t||ƒtk�r„�q’ˆ|d 7 ‰qÈ|d | }t d¡D ]R}ˆd tdƒ t|ƒ ¡  }t t |¡ 	¡ ¡}t|||ƒ}|dk�r¨ �qü�q¨|||ˆfS )z+Generate a new set of DSA domain parametersé    éà   é   )é   é   é   NzInvalid modulus length (%d)é   r.   é   é@   c                    s*   g | ]"}t  ˆtˆ | ƒ ¡  ¡ ¡ ‘qS r+   )r   Únewr   rf   Údigest)r1   Új)ÚoffsetÚseedr+   r,   r4   „  s   ÿz$_generate_domain.<locals>.<listcomp>c                 S   s   g | ]}t  |¡‘qS r+   ©r   Ú
from_bytes)r1   rD   r+   r+   r,   r4   †  s     c                    s    g | ]}ˆ | d |ˆ >  ‘qS )r.   r+   )r1   Úi)ÚVÚoutlenr+   r,   r4   ‡  s     é   s   ggen)Úgetr%   r   Údigest_sizer   r   r   r¡   r›   rœ   rX   ÚAssertionErrorr
   ÚsumÚ	itertoolsÚcountr   rf   r8   )ÚLrs   ÚNÚnZb_r   Z	upper_bitÚUÚWÚXÚcr   Úer«   r   r+   )r£   rž   r¤   rŸ   r,   Ú_generate_domaink  sN    

ÿÿÿ

r´   c                 C   sB  |dkrt j}|rˆtt|ƒ\}}}t|ƒtk}|t|ƒtkO }||d | dkO }||dkpb||kO }|t|||ƒdkO }|rštdƒ‚nt| |ƒ\}}}}| 	¡ }| 	¡ }	|| krÂtd|| f ƒ‚||	fdkrÞtd||	f ƒ‚d|  k rò|k sün tdƒ‚tj
|	d	 |d
�}
|
|d  d }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
    Nr.   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š   )Z
exact_bitsrs   ©r   r   r   r   r   )r   rt   r9   r   r   r   r8   r%   r´   rX   Úrandomr   )r`   rs   rU   r   r   r   Ú	fmt_errorÚ_r¬   r­   r²   r   r   r*   r+   r+   r,   r      s:    
ÿÿTc                 C   sú   t tdtt| ƒƒƒ}t|ƒ}d}|rêt|jƒtk}|t|jƒtkO }||jd |j dkO }||j	dkpr|j	|jkO }|t
|j	|j|jƒdkO }||jdkp¦|j|jkO }t|dƒrê||jdkpÊ|j|jkO }|t
|j	|j|jƒ|jkO }|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µ   Fr.   r   r   zInvalid DSA key components)r'   Úzipr9   r   r   r   r   r   r   r   r8   r   rZ   r   r%   )ÚtupZconsistency_checkr*   Úkeyr·   r+   r+   r,   r   é  s     
c                    sL   |rt dƒ‚tƒ j| ddd�‰ ˆ d dkr2t dƒ‚‡ fdd„d	D ƒ}t|ƒS )
Nz-DSA private key already comes with parametersé   T)Znr_elementsZonly_ints_expectedr   zNo version foundc                    s   g | ]}ˆ | ‘qS r+   r+   r0   ©Úderr+   r,   r4   '  s     z+_import_openssl_private.<locals>.<listcomp>)r™   é   r.   r¥   é   )r%   r   Údecoder   )Úencodedr{   r~   rº   r+   r½   r,   Ú_import_openssl_private!  s    rÃ   c                 C   sj   t | ƒ\}}}|tkrtdƒ‚|r.|r.tdƒ‚tƒ  |¡j}ttƒ  |pJ|¡ƒ\}}}	||	||f}
t|
ƒS )NzNo DSA subjectPublicKeyInfozToo many DSA parameters)	r   ry   r%   r   rÁ   ÚvalueÚlistr   r   )rÂ   r{   r~   ZalgoidZencoded_keyZ
emb_paramsr   r   r   r   rº   r+   r+   r,   Ú_import_subjectPublicKeyInfo+  s    rÆ   c                 C   s   t | ƒ}t|d |ƒS rH   )r   rÆ   )rÂ   r{   r~   Zsp_infor+   r+   r,   Ú_import_x509_cert9  s    rÇ   c           	      C   sv   |rt dƒ‚t | |¡}|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 keyr.   r¥   )r%   r   Úunwrapry   r   rÁ   rÄ   rÅ   r   r8   r   )	rÂ   r{   r~   r<   r   r   r   r   rº   r+   r+   r,   Ú_import_pkcs8?  s    rÉ   c              	   C   sJ   t tttf}|D ],}z|| ||ƒW   S  tk
r:   Y qX qtdƒ‚dS )z?Import a DSA key (public or private half), encoded in DER form.úDSA key format is not supportedN)rÃ   rÆ   rÇ   rÉ   r%   )Zkey_datar{   r~   Z	decodingsZdecodingr+   r+   r,   Ú_import_key_derK  s    ýrË   c                    s  t | ƒ} |dk	rt |ƒ}|  d¡rLt t| ƒ|¡\}}}|r@d}t||dƒS |  d¡ràt |  d¡d ¡}g ‰ t	|ƒdkrºt
 d|dd… ¡d }ˆ  |dd| … ¡ |d| d… }qnˆ d d	krà‡ fd
d„dD ƒ}t|ƒS t	| ƒdk�rt| d ƒdk�rt| |dƒS tdƒ‚dS )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   -----rq   ó    r.   r™   rl   r   rj   c                    s   g | ]}t  ˆ | ¡‘qS r+   r    rg   ©r|   r+   r,   r4   ˜  s     zimport_key.<locals>.<listcomp>)r™   r¿   r.   r¥   é0   rÊ   )r   Ú
startswithr   rÁ   r	   rË   ru   Ú
a2b_base64Úsplitro   rm   ÚunpackrY   r   r   r%   )Z
extern_keyr{   r¾   ÚmarkerZenc_flagr}   Úlengthrº   r+   rÍ   r,   r   \  s*    (

 z1.2.840.10040.4.1)NN)T)N).Ú__all__ru   rm   rª   ZCrypto.Util.py3compatr   r   r   r	   r
   ZCryptor   Z	Crypto.IOr   r   ZCrypto.Hashr   ZCrypto.Util.asn1r   r   r   r   r   ZCrypto.Math.Numbersr   ZCrypto.Math.Primalityr   r   r   ZCrypto.PublicKeyr   r   r   Úobjectr   r´   r   r   rÃ   rÆ   rÇ   rÉ   rË   r   Z	importKeyry   r+   r+   r+   r,   Ú<module>   s2      5
I
8

G