5Xc@sXdZddlZddlmZdgZeaadZde fdYZ dS(sGpasslib.crypto._blowfish.base - unoptimized pure-python blowfish engineiN(t repeat_stringtBlowfishEnginecCsR ddddddddd d d d d dddddgadddddddddddddd d!d"d#d$d%d&d'd(d)d*d+d,d-d.d/d0d1d2d3d4d5d6d7d8d9d:d;d<d=d>d?d@dAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd[d\d]d^d_d`dadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzd{d|d}d~ddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd d d d d dddddgdddddddddddddd d!d"d#d$d%d&d'd(d)d*d+d,d-d.d/d0d1d2d3d4d5d6d7d8d9d:d;d<d=d>d?d@dAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd[d\d]d^d_d`dadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzd{d|d}d~ddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd d d d d dddddgdddddddddddddd d!d"d#d$d%d&d'd(d)d*d+d,d-d.d/d0d1d2d3d4d5d6d7d8d9d:d;d<d=d>d?d@dAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd[d\d]d^d_d`dadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzd{d|d}d~ddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd d d d d dddddgdddddddddddddd d!d"d#d$d%d&d'd(d)d*d+d,d-d.d/d0d1d2d3d4d5d6d7d8d9d:d;d<d=d>d?d@dAdBdCdDdEdFdGdHdIdJdKdLdMdNdOdPdQdRdSdTdUdVdWdXdYdZd[d\d]d^d_d`dadbdcdddedfdgdhdidjdkdldmdndodpdqdrdsdtdudvdwdxdydzd{d|d}d~ddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd d d d d dddddggadS(Nij?$Ii.iDspI"8 i1)i.IlNi!(Eiw8IfTil 4I)IP|iՄ?I GIIyI 1Iߘir/IIi~&jIE|I,iG$IliIi iciiNWqIXI~=it iXriX͋qIJiT{IYZI90i`*I#i`(IyAI8۸Iyi:`ilI>IwI'K1i/xi`\`UI%UIUibHWi@cij9Ui*I4\̴iAITir|Ii*oci]ũ+i1tI>\II3֯i\$liS2ziw(iH;iKkIi!(fi aI!i`|Hi2]I]]IuI#&Iei>#IŬiomI9BiD .I iJiI^iBh!Ilia gIӫiҠQjIh/TI(I3Qil ni;zIP;i*~Ieiv9i>YfICIioEiå}i^;IuoIs iD@ijVibNiw?6iri=Bi$7IH IiIirSI{iy%IIPI;LyIliIOi`@iž\^ic$jiohiSl>i9ioR;iQmI,0IDEI ^IIJ3i(fiK.IWitEI9_ IӹiyUi 2`Iiyr,@i%gỊI饎I"2iuIW\Ioi.VIiIBi~(I2gIsUOi'[iIXʻI]Ii=I!ilJi[-IySIeEIIiKII3~ˤiAbII iLw6I~i+IMەIIqiՓkIюI%ǯI/[<IuIId+II i^OiÏhIIi"//IwI-uII̠ItoiIIOIi;|I٨if_IwIs̓iw!Ie iwIBTI5I i>{IAII~i-%i^q ih"iWi6d$I icUiYiCxISZi[} iŹIv&iϕbihiAJsNI-GiJ{iRQI)SI?WIƛiv`+ItioiWIki *I!ecII.4IdVi]-SIiGijnipzKID)I. uI#&Ini}ߧII`IfIqiiilRdVIឱi6i)L uI@YI>:iT?ieB[ikI?IҡI0i8-MI]%i LI&pici^i?kh i>ii\ID}iWI7:I PIiI itIAuI8i/;i2i1>i8TNimOi BoI i,iy|$iryVIIwIII.?irUi$qk.iPḮiGXzitII}KI:zIifC cIdIGi2I7;Ci$iCMiQe*iPi:iqiUN1Iwi_iV5Ikǣi;Ziwi=Nie)II։>i%fRixL.IjIIxIS<i- INi=+6i&9i`yi#RIInIfIEI{I7i(I2IZli!XeihII;/i}*i/n[i(!ipa)IuGiai0Iai4IcI\si9pLI IުIi,b`I\InidiIi#iPZei2Zh@i* iEIꫪIOlIOIBBIji;Oei!AIyIMIjGKiPb=IbiF&[IIi$itii GiVi[ IHitbi#i*BXiU i>iap?#ir3IA~I_i;"liY7|I`ti@In2wIiPIUi5aIiI iZI I.zDI4EIgiɞIsi͈Uiy_gI@CgIe4i8>qi(=I mi!>IJ=I+IIhZ=I@I&LI4)ii AivI.kIhIq$ij 3iԷCiaPi.9IFE$itO!I@iMIipiE/fI iimi1I'iA9UIG%I ʫi%xP(i)Siچ, ImibhIiHihi'i?OIIizI|ΪI_7IxiB*k@i5 II9iN;iiVmKi1f&Iitn:I2C[iAhI xIN IiV@EI'Hi::SUi IkIKigUIXIc)I3IVJ*i%1?i~^I|1)Iip/'I\i,(IHI"mi?HI܆iiAiyG@in]iQ_2IIid5Ai4x{%i`*`Iilci´i2IOfIi#ki>3ib $;I"II I ri(-IExIib}dIioITIH}I'I>iAcG It.ino:I7I`IILI knIU{i7,gmi;e'II )II9i ii{fI}I ϑI^I/i$[Qiy{i;vi.97IyYI&I-1.iBhI;+jiLui.xi7BjIQi满iPcKikiiؽ%=IiYBDi In I*iNgdI_I鿾idIWIi{x`iM``IFI8iEwI6I3kBIqIAi_^;IZI4iٷ,iQ+I:Ֆi}}I>i(-}|i%IirZiLZIq)IiGIIiW;(I)fi(.yi_xIU`uIDI^imImi%aidIiWid!Qi2OwI~㶨IF=)iiSHidII$mi-iif! I FiEdilXi i[i@XIikI~jiEY:iD 5>IʹirIdIfIGo<Ici]/TIw®IpcNi tIW[IqrI]}Si@@iNijF4iI(I:iIHni;?oi 5iKi'r'i`aI?I+y:i%E4I9iKyQi2/IɺI~IǼIIǪiIIOII8 i*9Ig6I|1IO+IYi:CIiE'I,"i*iqI%IaI뜶IYdiѨI^I jiePIBIni;ۘiLidx2I2IߒI+4IqiAt i4KI qI2vI5I./IGo iITLiIybIo~>ifI,IҏI"IW#I#v2I15iVIbiuZi6nIs҈IbIIiPLiVqIi z2iEI{ISibI%iҽ5iiqI"I|˶I+vi>Si@i`8iG%I 8IvFišwi``u IN˅I؍izi~Li\HiijIIiԐI\i-% ?II2aNI[wiߏWir:(t BLOWFISH_Pt BLOWFISH_S(((sA/usr/lib/python2.7/site-packages/passlib/crypto/_blowfish/base.pyt_init_constantss                                                                                                                                                                                                                                                                  cBsPeZdZeddZdZdZdZdZdZ RS(cCsKtdkrtntt|_gtD]}t|^q,|_dS(N(RtNoneRtlisttPRtS(tselftbox((sA/usr/lib/python2.7/site-packages/passlib/crypto/_blowfish/base.pyt__init__7s  icCsGt|}|sdg|St||d>}tjd|f|S(swconvert data to tuple of 4-byte integers, repeating or truncating data as needed to reach specified sizeiis>%dI(tlenRtstructtunpack(tdatatsizetdlen((sA/usr/lib/python2.7/site-packages/passlib/crypto/_blowfish/base.pyt key_to_words@s   cCs|j|j}}||dN}d}x|dkr|d|d?|d|d?d@|d|d?d@A|d |d@d @||A|A}||}}|d7}q*W||dA|fS( s)loop version of blowfish encipher routineiiiiiiiiiI(RR(R tltrRRti((sA/usr/lib/python2.7/site-packages/passlib/crypto/_blowfish/base.pytencipherTsZ c Cs |j|j|j}}}d}x.|dkrS||c||N<|d7}q&Wd}}}xE|dkr|||\||<||d<\}}|d7}qeWx\|D]T}d}xE|dkr|||\||<||d<\}}|d7}qWqWdS(s(perform stock Blowfish keyschedule setupiiiiiN(RRR( R t key_wordsRRRRRRR ((sA/usr/lib/python2.7/site-packages/passlib/crypto/_blowfish/base.pytexpandds+ +c Cst|}|j|j|j}}}d}x.|dkr_||c||N<|d7}q2Wd}}} } x|dkr| ||N} | ||dN} |d7}||krd}n|| | \||<||d<\} } |d7}quWx|D]} d}x|dkr| ||N} | ||dN} |d7}||krZd}n|| | \| |<| |d<\} } |d7}qWqWdS(s9perform EKS' salted version of Blowfish keyschedule setupiiiiiN(R RRR( R Rt salt_wordst salt_sizeRRRRtsRRR ((sA/usr/lib/python2.7/site-packages/passlib/crypto/_blowfish/base.pyteks_salted_expand|s2    +    +cCsD|j}d}x.||kr?|||||d7}qWdS(s-perform rounds stage of EKS keyschedule setupiiN(R(R RRtroundsRtn((sA/usr/lib/python2.7/site-packages/passlib/crypto/_blowfish/base.pyteks_repeated_expands    cCsK|j}d}x/||kr@|||\}}|d7}qW||fS(s.repeatedly apply encipher operation to a blockii(R(R RRtcountRR((sA/usr/lib/python2.7/site-packages/passlib/crypto/_blowfish/base.pytrepeat_enciphers  ( t__name__t __module__R t staticmethodRRRRRR!(((sA/usr/lib/python2.7/site-packages/passlib/crypto/_blowfish/base.pyR5s    % ( t__doc__R t passlib.utilsRt__all__RRRRtobjectR(((sA/usr/lib/python2.7/site-packages/passlib/crypto/_blowfish/base.pyts    #