U
    ø¹Öh   ã                   @   sp   d Z ddlZddlZddlmZ dd„ Zdd„ Zd ¡ Zdd	d
„Z	ddd„Z
ddd„Zdd„ Zedkrleƒ  dS )zLpasslib.crypto._blowfish._gen_files - meta script that generates unrolled.pyé    N)Úirangec                    s   d  ‡ fdd„t|ƒD ƒ¡S )Nz, c                 3   s   | ]}ˆ t |ƒ V  qd S )N)Ústr)Ú.0Úx©Úname© úI./venv/lib/python3.8/site-packages/passlib/crypto/_blowfish/_gen_files.pyÚ	<genexpr>   s     zvarlist.<locals>.<genexpr>)Újoinr   )r   Úcountr   r   r	   Úvarlist   s    r   c                    s"   |   d¡}d ‡ fdd„|D ƒ¡S )zident block of textÚ
c                 3   s   | ]}|rˆ | nd V  qdS )Ú Nr   )r   Úline©Úpaddingr   r	   r
      s   ÿzindent_block.<locals>.<genexpr>)Úsplitr   )Úblockr   Úlinesr   r   r	   Úindent_block   s    
þr   z                ((((S0[l >> 24] + S1[(l >> 16) & 0xff]) ^ S2[(l >> 8) & 0xff]) +
                  S3[l & 0xff]) & 0xffffffff)
c                 C   s<   t dddƒD ]*}| |d||d |d tt dd¡d qd S )	Nr   é   é   zÐ            # Feistel substitution on left word (round %(i)d)
            r ^= %(left)s ^ p%(i1)d

            # Feistel substitution on right word (round %(i1)d)
            l ^= %(right)s ^ p%(i2)d
        é   ÚlÚr)ÚiÚi1Zi2ÚleftÚright)r   ÚBFSTRÚreplace©ÚwriteÚindentr   r   r   r	   Úrender_encipher    s       
ùr%   c                 C   s*   | |dƒ t | |d ƒ | |d dƒ d S )Na2          def encipher(self, l, r):
            """blowfish encipher a single 64-bit block encoded as two 32-bit ints"""

            (p0, p1, p2, p3, p4, p5, p6, p7, p8, p9,
              p10, p11, p12, p13, p14, p15, p16, p17) = self.P
            S0, S1, S2, S3 = self.S

            l ^= p0

            r   z$
        return r ^ p17, l

        )r%   )r#   r$   r   r   r	   Úwrite_encipher_function,   s    
r&   c                 C   sÒ   | |dƒ t dƒD ]}| |d d|d q| |d dƒ t| |d ƒ | |d dƒ t dddƒD ]B}| |d d	||d d
 t| |d ƒ | |d d||d d
 q`| |d dƒ t| |d ƒ | |d dƒ d S )Na¬          def expand(self, key_words):
            """unrolled version of blowfish key expansion"""
            ##assert len(key_words) >= 18, "size of key_words must be >= 18"

            P, S = self.P, self.S
            S0, S1, S2, S3 = S

            #=============================================================
            # integrate key
            #=============================================================
        é   r   z9            p%(i)d = P[%(i)d] ^ key_words[%(i)d]
        )r   aT  
        #=============================================================
        # update P
        #=============================================================

        #------------------------------------------------
        # update P[0] and P[1]
        #------------------------------------------------
        l, r = p0, 0

        z-
        p0, p1 = l, r = r ^ p17, l

        r   zÉ            #------------------------------------------------
            # update P[%(i)d] and P[%(i1)d]
            #------------------------------------------------
            l ^= p0

            )r   r   z=            p%(i)d, p%(i1)d = l, r = r ^ p17, l

            a  
        #------------------------------------------------
        # save changes to original P array
        #------------------------------------------------
        P[:] = (p0, p1, p2, p3, p4, p5, p6, p7, p8, p9,
          p10, p11, p12, p13, p14, p15, p16, p17)

        #=============================================================
        # update S
        #=============================================================

        for box in S:
            j = 0
            while j < 256:
                l ^= p0

        é   zU
                box[j], box[j+1] = l, r = r ^ p17, l
                j += 2
        )r   r%   r"   r   r   r	   Úwrite_expand_function@   s*    

þ
 ú
 ýr)   c                     s\   t j t j t¡d¡} t| dƒ‰ ‡ fdd„}|ddƒ t|dd t|dd |dd	ƒ d S )
Nzunrolled.pyÚwc                    sP   |  dd¡}|r||; }|s,t | d¡¡}| rBt|d| d  ƒ}ˆ  |¡ d S )NÚliteralFú é   )ÚpopÚtextwrapÚdedentÚrstripr   r#   )r$   ÚmsgÚkwdsr+   ©Zfhr   r	   r#   ™   s    zmain.<locals>.writer   aJ          """passlib.crypto._blowfish.unrolled - unrolled loop implementation of bcrypt,
        autogenerated by _gen_files.py

        currently this override the encipher() and expand() methods
        with optimized versions, and leaves the other base.py methods alone.
        """
        #=================================================================
        # imports
        #=================================================================
        # pkg
        from passlib.crypto._blowfish.base import BlowfishEngine as _BlowfishEngine
        # local
        __all__ = [
            "BlowfishEngine",
        ]
        #=================================================================
        #
        #=================================================================
        class BlowfishEngine(_BlowfishEngine):

        r   )r$   a]              #=================================================================
            # eoc
            #=================================================================

        #=================================================================
        # eof
        #=================================================================
        )ÚosÚpathr   ÚdirnameÚ__file__Úfiler&   r)   )Útargetr#   r   r4   r	   Úmain•   s    


r;   Ú__main__)r   )r   )r   )Ú__doc__r5   r/   Zpasslib.utils.compatr   r   r   Ústripr    r%   r&   r)   r;   Ú__name__r   r   r   r	   Ú<module>   s   


U2