
    g                          S r SSKrSSKrSSKJr  S rS rSR                  5       rSS jr	SS jr
SS	 jrS
 r\S:X  a  \" 5         gg)zLpasslib.crypto._blowfish._gen_files - meta script that generates unrolled.py    N)irangec                 L   ^  SR                  U 4S j[        U5       5       5      $ )Nz, c              3   @   >#    U  H  nT[        U5      -   v   M     g 7f)N)str).0xnames     \/home/matz/Project1/venv/lib/python3.13/site-packages/passlib/crypto/_blowfish/_gen_files.py	<genexpr>varlist.<locals>.<genexpr>   s     :MqTCF]M   )joinr   )r	   counts   ` r
   varlistr      s    99:F5M:::    c                 \   ^ U R                  S5      nSR                  U4S jU 5       5      $ )zident block of text
c              3   @   >#    U  H  nU(       a  TU-   OS v   M     g7f) N )r   linepaddings     r
   r   indent_block.<locals>.<genexpr>   s#      D $B&r   )splitr   )blockr   liness    ` r
   indent_blockr      s/    KKE99   r   z                ((((S0[l >> 24] + S1[(l >> 16) & 0xff]) ^ S2[(l >> 8) & 0xff]) +
                  S3[l & 0xff]) & 0xffffffff)
c                 ~    [        SSS5       H,  nU " USX"S-   US-   [        [        R                  SS5      S9  M.     g )	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i1i2leftright)r   BFSTRreplacewriteindentr$   s      r
   render_encipherr.       sC    Ar1f  qSQqSu}}S5	 r   c                 J    U " US5        [        XS-   5        U " US-   S5        g )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-   s     r
   write_encipher_functionr0   ,   s2    	& 
 
 E!8$	&(  r   c                 d   U " US5        [        S5       H  nU " US-   SUS9  M     U " US-   S5        [        XS-   5        U " US-   S5        [        SSS5       H-  nU " US-   S	X"S-   S
9  [        XS-   5        U " US-   SX"S-   S
9  M/     U " US-   S5        [        XS-   5        U " US-   S5        g )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+   s      r
   write_expand_functionr4   @   s    	&   BZfQh 	  
&(   E!8$	&(   Ar1fQh  1	 	ax(fQh  1	   
&(  & E!8$	&(  r   c                     ^ [         R                  R                  [         R                  R                  [        5      S5      n [        U S5      mU4S jnU" SS5        [        USS9  [        USS9  U" SS5        g )	Nzunrolled.pywc                    > UR                  SS5      nU(       a  X-  nU(       d%  [        R                  " UR                  S5      5      nU (       a  [	        USU S-  -  5      nTR                  U5        g )NliteralF    )poptextwrapdedentrstripr   r,   )r-   msgkwdsr8   fhs       r
   r,   main.<locals>.write   sY    ((9e,KC//#**S/2CsC6!8$45C
r   r   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__filer0   r4   )targetr,   rA   s     @r
   mainrI      sk    WW\\"''//(3]CF	fc	B 
!  . E!,%*	!  r   __main__)r   )__doc__rC   r<   passlib.utils.compatr   r   r   stripr)   r.   r0   r4   rI   __name__r   r   r
   <module>rO      s[    R
 
  ';	 
EG 

(Oj0d zF r   