PNG  IHDRQgAMA a cHRMz&u0`:pQ<bKGDgmIDATxwUﹻ& ^CX(J I@ "% (** BX +*i"]j(IH{~R)[~>h{}gy)I$Ij .I$I$ʊy@}x.: $I$Ii}VZPC)I$IF ^0ʐJ$I$Q^}{"r=OzI$gRZeC.IOvH eKX $IMpxsk.쒷/&r[޳<v| .I~)@$updYRa$I |M.e JaֶpSYR6j>h%IRز if&uJ)M$I vLi=H;7UJ,],X$I1AҒJ$ XY XzI@GNҥRT)E@;]K*Mw;#5_wOn~\ DC&$(A5 RRFkvIR}l!RytRl;~^ǷJj اy뷦BZJr&ӥ8Pjw~vnv X^(I;4R=P[3]J,]ȏ~:3?[ a&e)`e*P[4]T=Cq6R[ ~ޤrXR Հg(t_HZ-Hg M$ãmL5R uk*`%C-E6/%[t X.{8P9Z.vkXŐKjgKZHg(aK9ڦmKjѺm_ \#$5,)-  61eJ,5m| r'= &ڡd%-]J on Xm|{ RҞe $eڧY XYrԮ-a7RK6h>n$5AVڴi*ֆK)mѦtmr1p| q:흺,)Oi*ֺK)ܬ֦K-5r3>0ԔHjJئEZj,%re~/z%jVMڸmrt)3]J,T K֦OvԒgii*bKiNO~%PW0=dii2tJ9Jݕ{7"I P9JKTbu,%r"6RKU}Ij2HKZXJ,妝 XYrP ެ24c%i^IK|.H,%rb:XRl1X4Pe/`x&P8Pj28Mzsx2r\zRPz4J}yP[g=L) .Q[6RjWgp FIH*-`IMRaK9TXcq*I y[jE>cw%gLRԕiFCj-ďa`#e~I j,%r,)?[gp FI˨mnWX#>mʔ XA DZf9,nKҲzIZXJ,L#kiPz4JZF,I,`61%2s $,VOϚ2/UFJfy7K> X+6 STXIeJILzMfKm LRaK9%|4p9LwJI!`NsiazĔ)%- XMq>pk$-$Q2x#N ؎-QR}ᶦHZډ)J,l#i@yn3LN`;nڔ XuX5pF)m|^0(>BHF9(cզEerJI rg7 4I@z0\JIi䵙RR0s;$s6eJ,`n 䂦0a)S)A 1eJ,堌#635RIgpNHuTH_SԕqVe ` &S)>p;S$魁eKIuX`I4춒o}`m$1":PI<[v9^\pTJjriRŭ P{#{R2,`)e-`mgj~1ϣLKam7&U\j/3mJ,`F;M'䱀 .KR#)yhTq;pcK9(q!w?uRR,n.yw*UXj#\]ɱ(qv2=RqfB#iJmmL<]Y͙#$5 uTU7ӦXR+q,`I}qL'`6Kͷ6r,]0S$- [RKR3oiRE|nӦXR.(i:LDLTJjY%o:)6rxzҒqTJjh㞦I.$YR.ʼnGZ\ֿf:%55 I˼!6dKxm4E"mG_ s? .e*?LRfK9%q#uh$)i3ULRfK9yxm܌bj84$i1U^@Wbm4uJ,ҪA>_Ij?1v32[gLRD96oTaR׿N7%L2 NT,`)7&ƝL*꽙yp_$M2#AS,`)7$rkTA29_Iye"|/0t)$n XT2`YJ;6Jx".e<`$) PI$5V4]29SRI>~=@j]lp2`K9Jaai^" Ԋ29ORI%:XV5]JmN9]H;1UC39NI%Xe78t)a;Oi Ҙ>Xt"~G>_mn:%|~ޅ_+]$o)@ǀ{hgN;IK6G&rp)T2i୦KJuv*T=TOSV>(~D>dm,I*Ɛ:R#ۙNI%D>G.n$o;+#RR!.eU˽TRI28t)1LWϚ>IJa3oFbu&:tJ*(F7y0ZR ^p'Ii L24x| XRI%ۄ>S1]Jy[zL$adB7.eh4%%누>WETf+3IR:I3Xה)3אOۦSRO'ٺ)S}"qOr[B7ϙ.edG)^ETR"RtRݜh0}LFVӦDB^k_JDj\=LS(Iv─aTeZ%eUAM-0;~˃@i|l @S4y72>sX-vA}ϛBI!ݎߨWl*)3{'Y|iSlEڻ(5KtSI$Uv02,~ԩ~x;P4ցCrO%tyn425:KMlD ^4JRxSهF_}شJTS6uj+ﷸk$eZO%G*^V2u3EMj3k%)okI]dT)URKDS 7~m@TJR~荪fT"֛L \sM -0T KfJz+nإKr L&j()[E&I ߴ>e FW_kJR|!O:5/2跌3T-'|zX ryp0JS ~^F>-2< `*%ZFP)bSn"L :)+pʷf(pO3TMW$~>@~ū:TAIsV1}S2<%ޟM?@iT ,Eūoz%i~g|`wS(]oȤ8)$ ntu`өe`6yPl IzMI{ʣzʨ )IZ2= ld:5+請M$-ї;U>_gsY$ÁN5WzWfIZ)-yuXIfp~S*IZdt;t>KūKR|$#LcԀ+2\;kJ`]YǔM1B)UbG"IRߊ<xܾӔJ0Z='Y嵤 Leveg)$znV-º^3Ւof#0Tfk^Zs[*I꯳3{)ˬW4Ւ4 OdpbZRS|*I 55#"&-IvT&/윚Ye:i$ 9{LkuRe[I~_\ؠ%>GL$iY8 9ܕ"S`kS.IlC;Ҏ4x&>u_0JLr<J2(^$5L s=MgV ~,Iju> 7r2)^=G$1:3G< `J3~&IR% 6Tx/rIj3O< ʔ&#f_yXJiގNSz; Tx(i8%#4 ~AS+IjerIUrIj362v885+IjAhK__5X%nV%Iͳ-y|7XV2v4fzo_68"S/I-qbf; LkF)KSM$ Ms>K WNV}^`-큧32ŒVؙGdu,^^m%6~Nn&͓3ŒVZMsRpfEW%IwdǀLm[7W&bIRL@Q|)* i ImsIMmKmyV`i$G+R 0tV'!V)֏28vU7͒vHꦼtxꗞT ;S}7Mf+fIRHNZUkUx5SAJㄌ9MqμAIRi|j5)o*^'<$TwI1hEU^c_j?Е$%d`z cyf,XO IJnTgA UXRD }{H}^S,P5V2\Xx`pZ|Yk:$e ~ @nWL.j+ϝYb퇪bZ BVu)u/IJ_ 1[p.p60bC >|X91P:N\!5qUB}5a5ja `ubcVxYt1N0Zzl4]7­gKj]?4ϻ *[bg$)+À*x쳀ogO$~,5 زUS9 lq3+5mgw@np1sso Ӻ=|N6 /g(Wv7U;zωM=wk,0uTg_`_P`uz?2yI!b`kĸSo+Qx%!\οe|އԁKS-s6pu_(ֿ$i++T8=eY; צP+phxWQv*|p1. ά. XRkIQYP,drZ | B%wP|S5`~́@i޾ E;Չaw{o'Q?%iL{u D?N1BD!owPHReFZ* k_-~{E9b-~P`fE{AܶBJAFO wx6Rox5 K5=WwehS8 (JClJ~ p+Fi;ŗo+:bD#g(C"wA^ r.F8L;dzdIHUX݆ϞXg )IFqem%I4dj&ppT{'{HOx( Rk6^C٫O.)3:s(۳(Z?~ٻ89zmT"PLtw䥈5&b<8GZ-Y&K?e8,`I6e(֍xb83 `rzXj)F=l($Ij 2*(F?h(/9ik:I`m#p3MgLaKjc/U#n5S# m(^)=y=đx8ŬI[U]~SцA4p$-F i(R,7Cx;X=cI>{Km\ o(Tv2vx2qiiDJN,Ҏ!1f 5quBj1!8 rDFd(!WQl,gSkL1Bxg''՞^ǘ;pQ P(c_ IRujg(Wz bs#P­rz> k c&nB=q+ؔXn#r5)co*Ũ+G?7< |PQӣ'G`uOd>%Mctz# Ԫڞ&7CaQ~N'-P.W`Oedp03C!IZcIAMPUۀ5J<\u~+{9(FbbyAeBhOSܳ1 bÈT#ŠyDžs,`5}DC-`̞%r&ڙa87QWWp6e7 Rϫ/oY ꇅ Nܶըtc!LA T7V4Jsū I-0Pxz7QNF_iZgúWkG83 0eWr9 X]㾮݁#Jˢ C}0=3ݱtBi]_ &{{[/o[~ \q鯜00٩|cD3=4B_b RYb$óBRsf&lLX#M*C_L܄:gx)WΘsGSbuL rF$9';\4Ɍq'n[%p.Q`u hNb`eCQyQ|l_C>Lb꟟3hSb #xNxSs^ 88|Mz)}:](vbۢamŖ࿥ 0)Q7@0=?^k(*J}3ibkFn HjB׻NO z x}7p 0tfDX.lwgȔhԾŲ }6g E |LkLZteu+=q\Iv0쮑)QٵpH8/2?Σo>Jvppho~f>%bMM}\//":PTc(v9v!gոQ )UfVG+! 35{=x\2+ki,y$~A1iC6#)vC5^>+gǵ@1Hy٪7u;p psϰu/S <aʸGu'tD1ԝI<pg|6j'p:tպhX{o(7v],*}6a_ wXRk,O]Lܳ~Vo45rp"N5k;m{rZbΦ${#)`(Ŵg,;j%6j.pyYT?}-kBDc3qA`NWQū20/^AZW%NQ MI.X#P#,^Ebc&?XR tAV|Y.1!؅⨉ccww>ivl(JT~ u`ٵDm q)+Ri x/x8cyFO!/*!/&,7<.N,YDŽ&ܑQF1Bz)FPʛ?5d 6`kQձ λc؎%582Y&nD_$Je4>a?! ͨ|ȎWZSsv8 j(I&yj Jb5m?HWp=g}G3#|I,5v珿] H~R3@B[☉9Ox~oMy=J;xUVoj bUsl_35t-(ՃɼRB7U!qc+x4H_Qo֮$[GO<4`&č\GOc[.[*Af%mG/ ňM/r W/Nw~B1U3J?P&Y )`ѓZ1p]^l“W#)lWZilUQu`-m|xĐ,_ƪ|9i:_{*(3Gѧ}UoD+>m_?VPۅ15&}2|/pIOʵ> GZ9cmíتmnz)yߐbD >e}:) r|@R5qVSA10C%E_'^8cR7O;6[eKePGϦX7jb}OTGO^jn*媓7nGMC t,k31Rb (vyܴʭ!iTh8~ZYZp(qsRL ?b}cŨʊGO^!rPJO15MJ[c&~Z`"ѓޔH1C&^|Ш|rʼ,AwĴ?b5)tLU)F| &g٣O]oqSUjy(x<Ϳ3 .FSkoYg2 \_#wj{u'rQ>o;%n|F*O_L"e9umDds?.fuuQbIWz |4\0 sb;OvxOSs; G%T4gFRurj(֍ڑb uԖKDu1MK{1^ q; C=6\8FR艇!%\YÔU| 88m)֓NcLve C6z;o&X x59:q61Z(T7>C?gcļxѐ Z oo-08jہ x,`' ҔOcRlf~`jj".Nv+sM_]Zk g( UOPyεx%pUh2(@il0ݽQXxppx-NS( WO+轾 nFߢ3M<;z)FBZjciu/QoF 7R¥ ZFLF~#ȣߨ^<쩡ݛкvџ))ME>ώx4m#!-m!L;vv#~Y[đKmx9.[,UFS CVkZ +ߟrY٧IZd/ioi$%͝ب_ֶX3ܫhNU ZZgk=]=bbJS[wjU()*I =ώ:}-蹞lUj:1}MWm=̛ _ ¾,8{__m{_PVK^n3esw5ӫh#$-q=A̟> ,^I}P^J$qY~Q[ Xq9{#&T.^GVj__RKpn,b=`żY@^՝;z{paVKkQXj/)y TIc&F;FBG7wg ZZDG!x r_tƢ!}i/V=M/#nB8 XxЫ ^@CR<{䤭YCN)eKOSƟa $&g[i3.C6xrOc8TI;o hH6P&L{@q6[ Gzp^71j(l`J}]e6X☉#͕ ׈$AB1Vjh㭦IRsqFBjwQ_7Xk>y"N=MB0 ,C #o6MRc0|$)ف"1!ixY<B9mx `,tA>)5ػQ?jQ?cn>YZe Tisvh# GMމȇp:ԴVuږ8ɼH]C.5C!UV;F`mbBk LTMvPʍϤj?ԯ/Qr1NB`9s"s TYsz &9S%U԰> {<ؿSMxB|H\3@!U| k']$U+> |HHMLޢ?V9iD!-@x TIî%6Z*9X@HMW#?nN ,oe6?tQwڱ.]-y':mW0#!J82qFjH -`ѓ&M0u Uγmxϵ^-_\])@0Rt.8/?ٰCY]x}=sD3ojަЫNuS%U}ԤwHH>ڗjܷ_3gN q7[q2la*ArǓԖ+p8/RGM ]jacd(JhWko6ڎbj]i5Bj3+3!\j1UZLsLTv8HHmup<>gKMJj0@H%,W΃7R) ">c, xixј^ aܖ>H[i.UIHc U1=yW\=S*GR~)AF=`&2h`DzT󑓶J+?W+}C%P:|0H܆}-<;OC[~o.$~i}~HQ TvXΈr=b}$vizL4:ȰT|4~*!oXQR6Lk+#t/g lԁߖ[Jڶ_N$k*". xsxX7jRVbAAʯKҎU3)zSNN _'s?f)6X!%ssAkʱ>qƷb hg %n ~p1REGMHH=BJiy[<5 ǁJҖgKR*倳e~HUy)Ag,K)`Vw6bRR:qL#\rclK/$sh*$ 6덤 KԖc 3Z9=Ɣ=o>X Ώ"1 )a`SJJ6k(<c e{%kϊP+SL'TcMJWRm ŏ"w)qc ef꒵i?b7b('"2r%~HUS1\<(`1Wx9=8HY9m:X18bgD1u ~|H;K-Uep,, C1 RV.MR5άh,tWO8WC$ XRVsQS]3GJ|12 [vM :k#~tH30Rf-HYݺ-`I9%lIDTm\ S{]9gOڒMNCV\G*2JRŨ;Rҏ^ڽ̱mq1Eu?To3I)y^#jJw^Ńj^vvlB_⋌P4x>0$c>K†Aļ9s_VjTt0l#m>E-,,x,-W)سo&96RE XR.6bXw+)GAEvL)͞K4$p=Ũi_ѱOjb HY/+@θH9޼]Nԥ%n{ &zjT? Ty) s^ULlb,PiTf^<À] 62R^V7)S!nllS6~͝V}-=%* ʻ>G DnK<y&>LPy7'r=Hj 9V`[c"*^8HpcO8bnU`4JȪAƋ#1_\ XϘHPRgik(~G~0DAA_2p|J묭a2\NCr]M_0 ^T%e#vD^%xy-n}-E\3aS%yN!r_{ )sAw ڼp1pEAk~v<:`'ӭ^5 ArXOI驻T (dk)_\ PuA*BY]yB"l\ey hH*tbK)3 IKZ򹞋XjN n *n>k]X_d!ryBH ]*R 0(#'7 %es9??ښFC,ՁQPjARJ\Ρw K#jahgw;2$l*) %Xq5!U᢯6Re] |0[__64ch&_}iL8KEgҎ7 M/\`|.p,~`a=BR?xܐrQ8K XR2M8f ?`sgWS%" Ԉ 7R%$ N}?QL1|-эټwIZ%pvL3Hk>,ImgW7{E xPHx73RA @RS CC !\ȟ5IXR^ZxHл$Q[ŝ40 (>+ _C >BRt<,TrT {O/H+˟Pl6 I B)/VC<6a2~(XwV4gnXR ϱ5ǀHٻ?tw똤Eyxp{#WK qG%5],(0ӈH HZ])ג=K1j&G(FbM@)%I` XRg ʔ KZG(vP,<`[ Kn^ SJRsAʠ5xՅF`0&RbV tx:EaUE/{fi2;.IAwW8/tTxAGOoN?G}l L(n`Zv?pB8K_gI+ܗ #i?ޙ.) p$utc ~DžfՈEo3l/)I-U?aԅ^jxArA ΧX}DmZ@QLےbTXGd.^|xKHR{|ΕW_h] IJ`[G9{).y) 0X YA1]qp?p_k+J*Y@HI>^?gt.06Rn ,` ?);p pSF9ZXLBJPWjgQ|&)7! HjQt<| ؅W5 x W HIzYoVMGP Hjn`+\(dNW)F+IrS[|/a`K|ͻ0Hj{R,Q=\ (F}\WR)AgSG`IsnAR=|8$}G(vC$)s FBJ?]_u XRvύ6z ŨG[36-T9HzpW̞ú Xg큽=7CufzI$)ki^qk-) 0H*N` QZkk]/tnnsI^Gu't=7$ Z;{8^jB% IItRQS7[ϭ3 $_OQJ`7!]W"W,)Iy W AJA;KWG`IY{8k$I$^%9.^(`N|LJ%@$I}ֽp=FB*xN=gI?Q{٥4B)mw $Igc~dZ@G9K X?7)aK%݅K$IZ-`IpC U6$I\0>!9k} Xa IIS0H$I H ?1R.Чj:4~Rw@p$IrA*u}WjWFPJ$I➓/6#! LӾ+ X36x8J |+L;v$Io4301R20M I$-E}@,pS^ޟR[/s¹'0H$IKyfŸfVOπFT*a$I>He~VY/3R/)>d$I>28`Cjw,n@FU*9ttf$I~<;=/4RD~@ X-ѕzἱI$: ԍR a@b X{+Qxuq$IЛzo /~3\8ڒ4BN7$IҀj V]n18H$IYFBj3̵̚ja pp $Is/3R Ӻ-Yj+L;.0ŔI$Av? #!5"aʄj}UKmɽH$IjCYs?h$IDl843.v}m7UiI=&=0Lg0$I4: embe` eQbm0u? $IT!Sƍ'-sv)s#C0:XB2a w I$zbww{."pPzO =Ɔ\[ o($Iaw]`E).Kvi:L*#gР7[$IyGPI=@R 4yR~̮´cg I$I/<tPͽ hDgo 94Z^k盇΄8I56^W$I^0̜N?4*H`237}g+hxoq)SJ@p|` $I%>-hO0eO>\ԣNߌZD6R=K ~n($I$y3D>o4b#px2$yڪtzW~a $I~?x'BwwpH$IZݑnC㧄Pc_9sO gwJ=l1:mKB>Ab<4Lp$Ib o1ZQ@85b̍ S'F,Fe,^I$IjEdù{l4 8Ys_s Z8.x m"+{~?q,Z D!I$ϻ'|XhB)=…']M>5 rgotԎ 獽PH$IjIPhh)n#cÔqA'ug5qwU&rF|1E%I$%]!'3AFD/;Ck_`9 v!ٴtPV;x`'*bQa w I$Ix5 FC3D_~A_#O݆DvV?<qw+I$I{=Z8".#RIYyjǪ=fDl9%M,a8$I$Ywi[7ݍFe$s1ՋBVA?`]#!oz4zjLJo8$I$%@3jAa4(o ;p,,dya=F9ً[LSPH$IJYЉ+3> 5"39aZ<ñh!{TpBGkj}Sp $IlvF.F$I z< '\K*qq.f<2Y!S"-\I$IYwčjF$ w9 \ߪB.1v!Ʊ?+r:^!I$BϹB H"B;L'G[ 4U#5>੐)|#o0aڱ$I>}k&1`U#V?YsV x>{t1[I~D&(I$I/{H0fw"q"y%4 IXyE~M3 8XψL}qE$I[> nD?~sf ]o΁ cT6"?'_Ἣ $I>~.f|'!N?⟩0G KkXZE]ޡ;/&?k OۘH$IRۀwXӨ<7@PnS04aӶp.:@\IWQJ6sS%I$e5ڑv`3:x';wq_vpgHyXZ 3gЂ7{{EuԹn±}$I$8t;b|591nءQ"P6O5i }iR̈́%Q̄p!I䮢]O{H$IRϻ9s֧ a=`- aB\X0"+5"C1Hb?߮3x3&gşggl_hZ^,`5?ߎvĸ%̀M!OZC2#0x LJ0 Gw$I$I}<{Eb+y;iI,`ܚF:5ܛA8-O-|8K7s|#Z8a&><a&/VtbtLʌI$I$I$I$I$I$IRjDD%tEXtdate:create2022-05-31T04:40:26+00:00!Î%tEXtdate:modify2022-05-31T04:40:26+00:00|{2IENDB`Mini Shell

HOME


Mini Shell 1.0
DIR:/usr/lib/python2.7/site-packages/passlib/handlers/
Upload File :
Current File : //usr/lib/python2.7/site-packages/passlib/handlers/bcrypt.pyo
�
��nXc@�s�dZddlmZmZddlmZddlmZddlZddl	Z	ddl
Z
e
je�Z
ddlmZeaeaeaeaddlmZmZmZddlmZmZmZmZmZmZm Z m!Z!dd	l"m#Z#dd
l$m%Z%m&Z&m'Z'm(Z(ddl)j*j+Z,dgZ-e%d�Z.e%d
�Z/e%d�Z0e%d�Z1e%d�Z2dZ3dZ4d�Z5de,j6e,j7e,j8e,j9e,j:e,j;fd��YZ<de<fd��YZ=de<fd��YZ>de<fd��YZ?de<fd��YZ@de<fd��YZAd e<fd!��YZBde=e<fd"��YZCe%d#�ZDd$eCfd%��YZEd&eEfd'��YZFdS((s�passlib.bcrypt -- implementation of OpenBSD's BCrypt algorithm.

TODO:

* support 2x and altered-2a hashes?
  http://www.openwall.com/lists/oss-security/2011/06/27/9

* deal with lack of PY3-compatibile c-ext implementation
i(twith_statementtabsolute_import(t	b64encode(tsha256N(twarn(tPasslibHashWarningtPasslibSecurityWarningtPasslibSecurityError(t
safe_cryptt
repeat_stringtto_bytest
parse_versiontrngt
getrandstrt
test_cryptt
to_unicode(tbcrypt64(tut
uascii_to_strtunicodet
str_to_uasciitbcrypts$2$s$2a$s$2x$s$2y$s$2b$ts<$2a$04$5BJqKfqMQvV7nS.yUguNcueVirQqDBGaLXSqj.rs.pZPlNR0UX/HKcC�sRyddl}Wntk
r$dSXyddlm}Wntk
rMtSXtS(s!
    internal helper which tries to distinguish pybcrypt vs bcrypt.

    :returns:
        True if cext-based py-bcrypt,
        False if ffi-based bcrypt,
        None if 'bcrypt' module not found.

    .. versionchanged:: 1.6.3

        Now assuming bcrypt installed, unless py-bcrypt explicitly detected.
        Previous releases assumed py-bcrypt by default.

        Making this change since py-bcrypt is (apparently) unmaintained and static,
        whereas bcrypt is being actively maintained, and it's internal structure may shift.
    iN(t__version__(RtImportErrortNonetbcrypt._bcryptRtFalsetTrue(RR((s;/usr/lib/python2.7/site-packages/passlib/handlers/bcrypt.pyt_detect_pybcrypt4s

t
_BcryptCommoncB�sleZdZdZdZdZejZe	Z
eee
ee	fZieed�6eed�6eed	�6e	ed
�6ZdZZejZdZd
ZdZdZdZeZeZeZeZeZeZ e!d��Z"d�Z#d�Z$e!d��Z%e!d��Z&e!d��Z'e!d��Z(ed�Z)dZ*e!d��Z+d�Z,e!ed��Z-RS(s&
    Base class which implements brunt of BCrypt code.
    This is then subclassed by the various backends,
    to override w/ backend-specific methods.

    When a backend is loaded, the bases of the 'bcrypt' class proper
    are modified to prepend the correct backend-specific subclass.
    Rtsalttroundstidentttruncate_errorit2t2at2yt2biiitlog2iHc	
C�s�|j|�\}}|tkr0td��n|jtd��\}}t|�}|td�|fkr�tjj|d��n|d |d}}|d|d|d|p�dd	|�S(
Ns>crypt_blowfish's buggy '2x' hashes are not currently supportedt$s%02dsmalformed cost fieldiR RtchecksumR!(
t_parse_identtIDENT_2Xt
ValueErrortsplitRtinttuhtexctMalformedHashErrorR(	tclsthashR!ttailt
rounds_strtdataR Rtchk((s;/usr/lib/python2.7/site-packages/passlib/handlers/bcrypt.pytfrom_string�scC�s2td�|j|j|j|jf}t|�S(Ns%s%02d$%s%s(RR!R RR)R(tselfR3((s;/usr/lib/python2.7/site-packages/passlib/handlers/bcrypt.pyt	to_string�s(cC�s)td�||j|jf}t|�S(s5internal helper to prepare config string for backendss	%s%02d$%s(RR RR(R9R!tconfig((s;/usr/lib/python2.7/site-packages/passlib/handlers/bcrypt.pyt_get_config�scK�sdt|t�r!|jd�}n|jt�rK|dtjdkrKtStt	|�j
||�S(Ntasciiii(t
isinstancetbytestdecodet
startswithtIDENT_2ARt	_padinfo2RtsuperRtneeds_update(R2R3tkwds((s;/usr/lib/python2.7/site-packages/passlib/handlers/bcrypt.pyRE�s
&cC�s*|j|�r"|j|�j�S|SdS(s<helper to normalize hash, correcting any bcrypt padding bitsN(tidentifyR8R:(R2R3((s;/usr/lib/python2.7/site-packages/passlib/handlers/bcrypt.pytnormhash�scC�s"tt|�j�}tj|�S(N(RDRt_generate_saltRt
repair_unused(R2R((s;/usr/lib/python2.7/site-packages/passlib/handlers/bcrypt.pyRI�scK�sJtt|�j||�}tj|�\}}|rFtdt�n|S(Ns�encountered a bcrypt salt with incorrectly set padding bits; you may want to use bcrypt.normhash() to fix this; this will be an error under Passlib 2.0(RDRt
_norm_saltRtcheck_repair_unusedRR(R2RRFtchanged((s;/usr/lib/python2.7/site-packages/passlib/handlers/bcrypt.pyRK�s
cC�sMtt|�j|d|�}tj|�\}}|rItdt�n|S(Ntrelaxeds�encountered a bcrypt hash with incorrectly set padding bits; you may want to use bcrypt.normhash() to fix this; this will be an error under Passlib 2.0(RDRt_norm_checksumRRLRR(R9R)RNRM((s;/usr/lib/python2.7/site-packages/passlib/handlers/bcrypt.pyRO�s
s9 -- recommend you install one (e.g. 'pip install bcrypt')c
�s^|jr
tS|j�tf�tr;�tjjf7�n���fd�}��fd�}��fd����fd�}d}|d|�}|s�td���n(|tkr�t|_	t
jd��n|dt�}|std	���nX|tkr#td
���n9|t
��t
�r\td�tjj�t|_ntjdd
�}|d|�}|s�td���n<|tkr�t|_t
jd��n|t�|t�tjdd�}	|d|	�}|std���nE|tkr4t|_t
jd��nt|_|t�|t�t|_tS(s�
        helper called by from backend mixin classes' _load_backend_mixin() --
        invoked after backend imports have been loaded, and performs
        feature detection & testing common to all backends.
        c�sYy�||�SWnA�k
r%tStk
rT}tjd�||dt�tSXdS(s8verify() wrapper which traps 'unknown identifier' errorss<trapped unexpected response from %r backend: verify(%r, %r):texc_infoN(tNotImplementedtAssertionErrortlogtdebugR(tsecretR3terr(tbackendt	err_typestverify(s;/usr/lib/python2.7/site-packages/passlib/handlers/bcrypt.pytsafe_verify"s
	c�szd}|jd�d}�||�r;td���n|jd�d}�||�svtd�|f��ndS(s
            helper to check for cryptblowfish 8bit bug (fixed in 2y/2b);
            even though it's not known to be present in any of passlib's backends.
            this is treated as FATAL, because it can easily result in seriously malformed hashes,
            and we can't correct for it ourselves.

            test cases from <http://cvsweb.openwall.com/cgi/cvsweb.cgi/Owl/packages/glibc/crypt_blowfish/wrapper.c.diff?r1=1.9;r2=1.10>
            reference hash is the incorrectly generated $2x$ hash taken from above url
            s�R=s805$/OK.fbVrR/bpIqNJ5ianF.CE5elHaaO4EbggVDjb8P19RukzXSM3es�passlib.hash.bcrypt: Your installation of the %r backend is vulnerable to the crypt_blowfish 8-bit bug (CVE-2011-2483), and should be upgraded or replaced with another backend.s805$/OK.fbVrR/bpIqNJ5ianF.Sa7shbm4.OzKpvFnX1pQLmQW96oUlCqs(%s backend failed to verify %s 8bit hashN(tencodeRtRuntimeError(R!RUtbug_hashtcorrect_hash(RWRY(s;/usr/lib/python2.7/site-packages/passlib/handlers/bcrypt.pytassert_lacks_8bit_bug4s

c�ssddd }|jd�d}�||�r4tS|jd�d}�||�sotd�|f��ntS(s>
            check for bsd wraparound bug (fixed in 2b)
            this is treated as a warning, because it's rare in the field,
            and pybcrypt (as of 2015-7-21) is unpatched, but some people may be stuck with it.

            test cases from <http://www.openwall.com/lists/oss-security/2012/01/02/4>

            NOTE: reference hash is of password "0"*72

            NOTE: if in future we need to deliberately create hashes which have this bug,
                  can use something like 'hashpw(repeat_string(secret[:((1+secret) % 256) or 1]), 72)'
            t
0123456789ii�R=s804$R1lJ2gkNaoPGdafE.H.16.nVyh2niHsGJhayOHLMiXlI45o8/DU.6s804$R1lJ2gkNaoPGdafE.H.16.1MKHPvmKwryeulRe225LKProWYwt9Ois.%s backend failed to verify %s wraparound hash(R[RR\R(R!RUR]R^(RWRY(s;/usr/lib/python2.7/site-packages/passlib/handlers/bcrypt.pytdetect_wrap_bugOsc�s*�|�sdStd�|f��dS(Ns1%s backend unexpectedly has wraparound bug for %s(R\(R!(RWRa(s;/usr/lib/python2.7/site-packages/passlib/handlers/bcrypt.pytassert_lacks_wrap_bugjss;$2$04$5BJqKfqMQvV7nS.yUguNcuRfMMOXK0xPWavM7pOzjEi5ze5T1k8/Sttests %s incorrectly rejected $2$ hashs1%r backend lacks $2$ support, enabling workarounds!%s incorrectly rejected $2a$ hashs %s lacks support for $2a$ hashess�passlib.hash.bcrypt: Your installation of the %r backend is vulnerable to the bsd wraparound bug, and should be upgraded or replaced with another backend (enabling workaround for now).R$R%s!%s incorrectly rejected $2y$ hashs2%r backend lacks $2y$ support, enabling workaroundR&s!%s incorrectly rejected $2b$ hashs2%r backend lacks $2b$ support, enabling workaround(t_workrounds_initializedRRYR,t	_bcryptortenginet	SaltErrorR\RQt_lacks_20_supportRSRTtTEST_HASH_2ARBRR/R0Rt_has_2a_wraparound_bugtreplacet_lacks_2y_supporttIDENT_2Yt_lacks_2b_supporttIDENT_2Bt_fallback_ident(
t	mixin_clsRWtdryrunRZR_Rbttest_hash_20tresultttest_hash_2yttest_hash_2b((RWRaRXRYs;/usr/lib/python2.7/site-packages/passlib/handlers/bcrypt.pyt_finalize_backend_mixinsb
				

	

			

	cC�s|j||jd|j�S(s�
        common helper for backends to implement _calc_checksum().
        takes in secret, returns (secret, ident) pair,
        tnew(t_norm_digest_argsR!tuse_defaults(R9RU((s;/usr/lib/python2.7/site-packages/passlib/handlers/bcrypt.pyt_prepare_digest_args�scC�sUt|t�r!|jd�}ntj|�|rD|j|�nt|kretjj|��n|j	r�t
|�dkr�|d }n|tkr�n�|tkr�|j
rK|j}qKn�|tkr�|jrK|j}qKng|tkr |jrK|rt|d�}n|j}qKn+|tkr;td��ntd|��||fS(Nsutf-8i�iHs.$2x$ hashes not currently supported by passlibsunexpected ident value: %r(R>RR[R/tvalidate_secrett_check_truncate_policyt_BNULLR0tNullPasswordErrorRjtlenRBRoRnRpRmRltIDENT_2RhR	R+R\RR(R2RUR!Rx((s;/usr/lib/python2.7/site-packages/passlib/handlers/bcrypt.pyRy�s4

			(ssaltsroundssidentR"(.t__name__t
__module__t__doc__tnametsetting_kwdst
checksum_sizeRtcharmaptchecksum_charsRot
default_identR�RBR+Rmtident_valuesRt
ident_aliasest
min_salt_sizet
max_salt_sizet
salt_charstdefault_roundst
min_roundst
max_roundstrounds_costt
truncate_sizeRRdRjRhRlRnRptclassmethodR8R:R<RERHRIRKROt_no_backend_suggestionRwR{Ry(((s;/usr/lib/python2.7/site-packages/passlib/handlers/bcrypt.pyRYsF		*
				�	t
_NoBackendcB�seZdZd�ZRS(s�
    mixin used before any backend has been loaded.
    contains stubs that force loading of one of the available backends.
    cC�s |j�tt|�j|�S(N(t_stub_requires_backendRDRt_calc_checksum(R9RU((s;/usr/lib/python2.7/site-packages/passlib/handlers/bcrypt.pyR�s
(R�R�R�R�(((s;/usr/lib/python2.7/site-packages/passlib/handlers/bcrypt.pyR�	st_BcryptBackendcB�s&eZdZed��Zd�ZRS(s-
    backend which uses 'bcrypt' package
    cC�s�t�r
tSyddlaWntk
r1tSXytjj}Wn tjddt	�d}nXtj
d|�|j||�S(Nis&(trapped) error reading bcrypt versionRPs	<unknown>s%detected 'bcrypt' backend, version %r(RRRt_bcryptRt	__about__RRStwarningRRTRw(RqR�Rrtversion((s;/usr/lib/python2.7/site-packages/passlib/handlers/bcrypt.pyt_load_backend_mixin#s	

cC�sh|j|�\}}|j|�}t|t�rE|jd�}ntj||�}|djd�S(NR=i��(R{R<R>RR[R�thashpwR@(R9RUR!R;R3((s;/usr/lib/python2.7/site-packages/passlib/handlers/bcrypt.pyR�Is(R�R�R�R�R�R�(((s;/usr/lib/python2.7/site-packages/passlib/handlers/bcrypt.pyR�s&t_BcryptorBackendcB�s&eZdZed��Zd�ZRS(s/
    backend which uses 'bcryptor' package
    cC�s5yddlaWntk
r$tSX|j||�S(Ni(tbcryptorReRRRw(RqR�Rr((s;/usr/lib/python2.7/site-packages/passlib/handlers/bcrypt.pyR�`s

cC�sP|j|�\}}|j|�}tjjt�j||�}t|d�S(Ni��(R{R<ReRftEngineRthash_keyR(R9RUR!R;R3((s;/usr/lib/python2.7/site-packages/passlib/handlers/bcrypt.pyR�js(R�R�R�R�R�R�(((s;/usr/lib/python2.7/site-packages/passlib/handlers/bcrypt.pyR�[s
t_PyBcryptBackendcB�s;eZdZdZed��Zd�Zd�ZeZ	RS(s/
    backend which uses 'pybcrypt' package
    cC�s�t�s
tSyddlaWntk
r1tSXytjj}Wn tjddt	�d}nXtj
d|�t|�p�d}|d	kr�td|t
jj�|jdkr�ddl}|j�|_n|jj|_n|j||�S(
Nis((trapped) error reading pybcrypt versionRPs	<unknown>s'detected 'pybcrypt' backend, version %risapy-bcrypt %s has a major security vulnerability, you should upgrade to py-bcrypt 0.3 immediately.(ii(ii(RRRt	_pybcryptRR�RRSR�RRTRRR/R0Rt
_calc_lockRt	threadingtLockt_calc_checksum_threadsafet__func__R�Rw(RqR�RrR�tvinfoR�((s;/usr/lib/python2.7/site-packages/passlib/handlers/bcrypt.pyR��s*	

cC�s!|j�|j|�SWdQXdS(N(R�t_calc_checksum_raw(R9RU((s;/usr/lib/python2.7/site-packages/passlib/handlers/bcrypt.pyR��s
cC�sD|j|�\}}|j|�}tj||�}t|d�S(Ni��(R{R<R�R�R(R9RUR!R;R3((s;/usr/lib/python2.7/site-packages/passlib/handlers/bcrypt.pyR��sN(
R�R�R�RR�R�R�R�R�R�(((s;/usr/lib/python2.7/site-packages/passlib/handlers/bcrypt.pyR�xs!		t_OsCryptBackendcB�s&eZdZed��Zd�ZRS(s0
    backend which uses :func:`crypt.crypt`
    cC�s#tdt�stS|j||�S(NRc(RRiRRw(RqR�Rr((s;/usr/lib/python2.7/site-packages/passlib/handlers/bcrypt.pyR��scC�sW|j|�\}}|j|�}t||�}|rA|dStjjd��dS(Ni��ssnon-utf8 encoded passwords can't be handled by crypt.crypt() under python3, recommend running `pip install bcrypt`.(R{R<RR/R0tMissingBackendError(R9RUR!R;R3((s;/usr/lib/python2.7/site-packages/passlib/handlers/bcrypt.pyR��s
	(R�R�R�R�R�R�(((s;/usr/lib/python2.7/site-packages/passlib/handlers/bcrypt.pyR��st_BuiltinBackendcB�s&eZdZed��Zd�ZRS(sA
    backend which uses passlib's pure-python implementation
    cC�sYddlm}|tjjd��s9tjd�tSddlm	a
|j||�S(Ni(tas_booltPASSLIB_BUILTIN_BCRYPTs@bcrypt 'builtin' backend not enabled via $PASSLIB_BUILTIN_BCRYPT(t
raw_bcrypt(t
passlib.utilsR�tostenvirontgetRSRTRtpasslib.crypto._blowfishR�t_builtin_bcryptRw(RqR�RrR�((s;/usr/lib/python2.7/site-packages/passlib/handlers/bcrypt.pyR��s
cC�sM|j|�\}}t||dd!|jjd�|j�}|jd�S(Nii����R=(R{R�RR[R R@(R9RUR!R7((s;/usr/lib/python2.7/site-packages/passlib/handlers/bcrypt.pyR��s(R�R�R�R�R�R�(((s;/usr/lib/python2.7/site-packages/passlib/handlers/bcrypt.pyR��s
cB�sJeZdZdZeZied6ed6e	d6e
d6ed6ed6Z
RS(s�
This class implements the BCrypt password hash, and follows the :ref:`password-hash-api`.

    It supports a fixed-length salt, and a variable number of rounds.

    The :meth:`~passlib.ifc.PasswordHash.using` method accepts the following optional keywords:

    :type salt: str
    :param salt:
        Optional salt string.
        If not specified, one will be autogenerated (this is recommended).
        If specified, it must be 22 characters, drawn from the regexp range ``[./0-9A-Za-z]``.

    :type rounds: int
    :param rounds:
        Optional number of rounds to use.
        Defaults to 12, must be between 4 and 31, inclusive.
        This value is logarithmic, the actual number of iterations used will be :samp:`2**{rounds}`
        -- increasing the rounds by +1 will double the amount of time taken.

    :type ident: str
    :param ident:
        Specifies which version of the BCrypt algorithm will be used when creating a new hash.
        Typically this option is not needed, as the default (``"2b"``) is usually the correct choice.
        If specified, it must be one of the following:

        * ``"2"`` - the first revision of BCrypt, which suffers from a minor security flaw and is generally not used anymore.
        * ``"2a"`` - some implementations suffered from rare security flaws, replaced by 2b.
        * ``"2y"`` - format specific to the *crypt_blowfish* BCrypt implementation,
          identical to ``"2b"`` in all but name.
        * ``"2b"`` - latest revision of the official BCrypt algorithm, current default.

    :param bool truncate_error:
        By default, BCrypt will silently truncate passwords larger than 72 bytes.
        Setting ``truncate_error=True`` will cause :meth:`~passlib.ifc.PasswordHash.hash`
        to raise a :exc:`~passlib.exc.PasswordTruncateError` instead.

        .. versionadded:: 1.7

    :type relaxed: bool
    :param relaxed:
        By default, providing an invalid value for one of the other
        keywords will result in a :exc:`ValueError`. If ``relaxed=True``,
        and the error can be corrected, a :exc:`~passlib.exc.PasslibHashWarning`
        will be issued instead. Correctable errors include ``rounds``
        that are too small or too large, and ``salt`` strings that are too long.

        .. versionadded:: 1.6

    .. versionchanged:: 1.6
        This class now supports ``"2y"`` hashes, and recognizes
        (but does not support) the broken ``"2x"`` hashes.
        (see the :ref:`crypt_blowfish bug <crypt-blowfish-bug>`
        for details).

    .. versionchanged:: 1.6
        Added a pure-python backend.

    .. versionchanged:: 1.6.3

        Added support for ``"2b"`` variant.

    .. versionchanged:: 1.7

        Now defaults to ``"2b"`` variant.
    RtpybcryptR�tos_crypttbuiltin(sbcryptR�sbcryptorR�R�N(R�R�R�tbackendsRt_backend_mixin_targetR�RR�R�R�R�R�t_backend_mixin_map(((s;/usr/lib/python2.7/site-packages/passlib/handlers/bcrypt.pyR�sAR(t_wrapped_bcryptcB�s<eZdZed�ejD��ZdZed��Z	RS(s�
    abstracts out some bits bcrypt_sha256 & django_bcrypt_sha256 share.
    - bypass backend-loading wrappers for hash() etc
    - disable truncation support, sha256 wrappers don't need it.
    cc�s!|]}|dkr|VqdS(R"N(struncate_error((t.0telem((s;/usr/lib/python2.7/site-packages/passlib/handlers/bcrypt.pys	<genexpr>_scC�sdS(N((R2RU((s;/usr/lib/python2.7/site-packages/passlib/handlers/bcrypt.pyR}ssN(
R�R�R�ttupleRR�RR�R�R}(((s;/usr/lib/python2.7/site-packages/passlib/handlers/bcrypt.pyR�Yst
bcrypt_sha256cB�s�eZdZdZeefZd�e�ZeZe	d�Z
ejdej
�Zed��Zed��Ze	d�Zd�Zd	�ZRS(
s�This class implements a composition of BCrypt+SHA256, and follows the :ref:`password-hash-api`.

    It supports a fixed-length salt, and a variable number of rounds.

    The :meth:`~passlib.ifc.PasswordHash.hash` and :meth:`~passlib.ifc.PasswordHash.genconfig` methods accept
    all the same optional keywords as the base :class:`bcrypt` hash.

    .. versionadded:: 1.6.2

    .. versionchanged:: 1.7

        Now defaults to ``"2b"`` variant.
    R�c�s#t�fd�tjj�D��S(Nc3�s%|]}|d�kr|VqdS(iN((R�titem(R�(s;/usr/lib/python2.7/site-packages/passlib/handlers/bcrypt.pys	<genexpr>�s(tdictRR�titems(R�((R�s;/usr/lib/python2.7/site-packages/passlib/handlers/bcrypt.pyt<lambda>�ss$bcrypt-sha256$s�
        ^
        [$]bcrypt-sha256
        [$](?P<variant>2[ab])
        ,(?P<rounds>\d{1,2})
        [$](?P<salt>[^$]{22})
        (?:[$](?P<digest>.{31}))?
        $
        cC�s)tj|�}|stS|j|j�S(N(R/tto_unicode_for_identifyRRAtprefix(R2R3((s;/usr/lib/python2.7/site-packages/passlib/handlers/bcrypt.pyRG�scC�s�t|dd�}|j|j�s9tjj|��n|jj|�}|sftjj|��n|j	d�}|jtj
�r�|tj
kr�tjj|��n|d|j	d�dt|�d|j	d�d|j	d��S(	NR=R3R R!tvariantRR)tdigest(
RRAR�R/R0tInvalidHashErrort_hash_retmatchR1tgroupt_UZEROtZeroPaddedRoundsErrorR.(R2R3tmR ((s;/usr/lib/python2.7/site-packages/passlib/handlers/bcrypt.pyR8�s!s$bcrypt-sha256$%s,%d$%s$%scC�s8|j|jjt�|j|j|jf}t|�S(N(t	_templateR!tstript_UDOLLARR RR)R(R9R3((s;/usr/lib/python2.7/site-packages/passlib/handlers/bcrypt.pyR:�scC�sOt|t�r!|jd�}ntt|�j��}tt|�j|�S(Nsutf-8(	R>RR[RRR�RDR�R�(R9RUtkey((s;/usr/lib/python2.7/site-packages/passlib/handlers/bcrypt.pyR��s(R�R�R�R�RBRoR�R�R�RR�tretcompiletXR�R�RGR8R�R:R�(((s;/usr/lib/python2.7/site-packages/passlib/handlers/bcrypt.pyR�|s
		(GR�t
__future__RRtbase64RthashlibRR�R�tloggingt	getLoggerR�RStwarningsRRR�R�ReR�tpasslib.excRRRR�RR	R
RRR
RRtpasslib.utils.binaryRtpasslib.utils.compatRRRRtpasslib.utils.handlerstutilsthandlersR/t__all__R�RBR+RmRoR~RiRtSubclassBackendMixint
TruncateMixint
HasManyIdentst	HasRoundstHasSalttGenericHandlerRR�R�R�R�R�R�RR�R�R�(((s;/usr/lib/python2.7/site-packages/passlib/handlers/bcrypt.pyt<module>	sN:"		%"��=A#b#