Ñò &5š@c @s!dZddkTddklZddklZlZddklZyddk l Z Wne j o dZ nXde fd„ƒYZd „Zdd „Zd „Zd efd „ƒYZeZeZeZdefd„ƒYZdd„Zd„Ze oeZeZe iZndS(s6$Id: DSA.py,v 1.16 2004/05/06 12:52:54 akuchling Exp $iÿÿÿÿ(t*(tnumber(t bytes_to_longt long_to_bytes(tSHA(t _fastmathterrorcBseZRS((t__name__t __module__(((s:/usr/lib64/python2.6/site-packages/Crypto/PublicKey/DSA.pyRscCs5|dƒ}ti|ƒiƒ}titt|ƒdƒƒiƒ}tdƒ}xytddƒD]h}t||ƒt||ƒA}|djo|dB}n|djo|dB}n|d|}qbWxt|ƒp|d}qÑWt ddƒ|jot dd ƒjno ||fSt d ‚dS( Niiii€iiilŸl sBad q value generated( RtnewtdigestRRtbignumtrangetordtisPrimetpowR(trandfunctSthash1thash2tqtitc((s:/usr/lib64/python2.6/site-packages/Crypto/PublicKey/DSA.pyt generateQs$ %    0 cCsñ|djo td‚ntƒ}|o|dƒnx¢t|ƒ\}|_|dd}ddh}}}|id?d@} ttdƒ| ƒ} ttdƒ|dƒ} xÿ|d joñxNtd|dƒD]9} tti |t |ƒt | ƒƒi ƒƒ|| || } q7W| | }||d|id}| |jot |ƒoPn|d||d}}q´W|d joPn|o|d ƒq;q;||_ |d|i}|o|d ƒnxct||ƒƒ|d}t|||ƒ}d|jo|djno|djoPqq||_|o|dƒnx;t|dƒƒ}d|jo |ijnoPq“q“|t|||ƒ|_|_|S(sègenerate(bits:int, randfunc:callable, progress_func:callable) Generate a DSA key of length 'bits', using 'randfunc' to get random data and 'progress_func', if present, to display the progress of the key generation. i sKey length <160 bitssp,q iiiiiiiÿÿÿÿl s4096 multiples failed sh,g sx,y i(RtDSAobjRRRR R RRR tstrR Rtptgtxty(tbitsRt progress_functobjRtntCtNtVtbtpowbtpowL1tktWtXRtpowerthRR((s:/usr/lib64/python2.6/site-packages/Crypto/PublicKey/DSA.pytgenerate/s`    7   / !cCsktƒ}t|ƒdjo td‚nx;tt|ƒƒD]'}|i|}t||||ƒq<W|S(s‰construct(tuple:(long,long,long,long)|(long,long,long,long,long)):DSAobj Construct a DSA object from a 4- or 5-tuple of numbers. iis%argument for construct() wrong length(ii(RtlenRR tkeydatatsetattr(ttupleR Rtfield((s:/usr/lib64/python2.6/site-packages/Crypto/PublicKey/DSA.pyt constructgs   RcBsneZdddddgZd„Zd„Zd„Zd„Zd „Zd „Zd „Z d „Z d „Z RS(RRRRRcCs td‚dS(Ns!DSA algorithm cannot encrypt data(R(tselftstKstr((s:/usr/lib64/python2.6/site-packages/Crypto/PublicKey/DSA.pyt_encryptvscCs td‚dS(Ns!DSA algorithm cannot decrypt data(R(R4R5((s:/usr/lib64/python2.6/site-packages/Crypto/PublicKey/DSA.pyt_decryptyscCs{|djp|i|jo td‚nt|i||iƒ|i}t||iƒ||i||i}||fS(NisK is not between 2 and q(RRRRRtinverseR(R4tMtKtrR5((s:/usr/lib64/python2.6/site-packages/Crypto/PublicKey/DSA.pyt_sign|s  (c Csä|\}}|djp-||ijp|djp||ijodSt||iƒ}|||i|||i}}t|i||iƒ}t|i||iƒ} || |i} | |i} | |jodSdS(Nii(RR9RRRR( R4R:tsigR<R5twtu1tu2tv1tv2tv((s:/usr/lib64/python2.6/site-packages/Crypto/PublicKey/DSA.pyt_verifyƒs :#  cCsti|iƒdS(sBReturn the maximum number of bits that can be handled by this key.i(RtsizeR(R4((s:/usr/lib64/python2.6/site-packages/Crypto/PublicKey/DSA.pyRF‘scCst|dƒodSdSdS(sQReturn a Boolean denoting whether the object contains private components.RiiN(thasattr(R4((s:/usr/lib64/python2.6/site-packages/Crypto/PublicKey/DSA.pyt has_private•scCsdS(sPReturn a Boolean value recording whether this algorithm can generate signatures.i((R4((s:/usr/lib64/python2.6/site-packages/Crypto/PublicKey/DSA.pytcan_signscCsdS(sIReturn a Boolean value recording whether this algorithm can encrypt data.i((R4((s:/usr/lib64/python2.6/site-packages/Crypto/PublicKey/DSA.pyt can_encrypt¡scCs"t|i|i|i|ifƒS(s?Return a new key object containing only the public information.(R3RRRR(R4((s:/usr/lib64/python2.6/site-packages/Crypto/PublicKey/DSA.pyt publickey¥s( RRR/R7R8R=RERFRHRIRJRK(((s:/usr/lib64/python2.6/site-packages/Crypto/PublicKey/DSA.pyRss        tDSAobj_ccBs€eZdddddgZd„Zd„Zd„Zd„Zd „Zd „Zd „Z d „Z d „Z d„Z d„Z RS(RRRRRcCs ||_dS(N(tkey(R4RM((s:/usr/lib64/python2.6/site-packages/Crypto/PublicKey/DSA.pyt__init__±scCs]||ijot|i|ƒS|ii|ƒo|i|ntd|i|f‚dS(Ns%s instance has no attribute %s(R/tgetattrRMt__dict__thas_keytAttributeErrort __class__(R4tattr((s:/usr/lib64/python2.6/site-packages/Crypto/PublicKey/DSA.pyt __getattr__´s cCsKh}x>|iD]3}t|i|ƒot|i|ƒ||s.    8 63