Ñò
ðgcJc           @   s®   d  Z  d d k Z d d k l Z l Z d d k Z d d k l Z d d k l	 Z	 d d k
 Td d k l Z d d k l Z d d	 k l Z l Z d
 e f d „  ƒ  YZ d S(   s!   
Common API for all public keys.
iÿÿÿÿN(   t   hexlifyt	   unhexlify(   t   MD5(   t   DES3(   t   *(   t   util(   t   Message(   t   SSHExceptiont   PasswordRequiredExceptiont   PKeyc           B   s  e  Z d  Z h h e d 6d d 6d d 6e i d 6d 6Z d d d „ Z d	 „  Z d
 „  Z	 d „  Z
 d „  Z d „  Z d „  Z d „  Z d „  Z d „  Z d d „ Z e e ƒ Z d d „ Z e e ƒ Z d d „ Z d d „ Z d d „ Z d d „ Z d d „ Z d d „ Z RS(   s%   
    Base class for public keys.
    t   cipheri   t   keysizei   t	   blocksizet   modes   DES-EDE3-CBCc         C   s   d S(   sY  
        Create a new instance of this public key type.  If C{msg} is given,
        the key's public part(s) will be filled in from the message.  If
        C{data} is given, the key's public part(s) will be filled in from
        the string.

        @param msg: an optional SSH L{Message} containing a public key of this
        type.
        @type msg: L{Message}
        @param data: an optional string containing a public key of this type
        @type data: str

        @raise SSHException: if a key cannot be created from the C{data} or
        C{msg} given, or no key was passed in.
        N(    (   t   selft   msgt   data(    (    sL   C:\Documents and Settings\red08xgu\Desktop\python_webupdate\paramiko\pkey.pyt   __init__/   s    c         C   s   d S(   s  
        Return a string of an SSH L{Message} made up of the public part(s) of
        this key.  This string is suitable for passing to L{__init__} to
        re-create the key object later.

        @return: string representation of an SSH key message.
        @rtype: str
        t    (    (   R   (    (    sL   C:\Documents and Settings\red08xgu\Desktop\python_webupdate\paramiko\pkey.pyt   __str__A   s    	c         C   sL   t  |  ƒ } t  | ƒ } | | j o t | | ƒ St t |  ƒ t | ƒ ƒ S(   s±  
        Compare this key to another.  Returns 0 if this key is equivalent to
        the given key, or non-0 if they are different.  Only the public parts
        of the key are compared, so a public key will compare equal to its
        corresponding private key.

        @param other: key to compare to.
        @type other: L{PKey}
        @return: 0 if the two keys are equivalent, non-0 otherwise.
        @rtype: int
        (   t   hasht   cmpt   str(   R   t   othert   hst   ho(    (    sL   C:\Documents and Settings\red08xgu\Desktop\python_webupdate\paramiko\pkey.pyt   __cmp__L   s
    c         C   s   d S(   sÂ   
        Return the name of this private key implementation.

        @return: name of this private key type, in SSH terminology (for
        example, C{"ssh-rsa"}).
        @rtype: str
        R   (    (   R   (    (    sL   C:\Documents and Settings\red08xgu\Desktop\python_webupdate\paramiko\pkey.pyt   get_name^   s    c         C   s   d S(   s¿   
        Return the number of significant bits in this key.  This is useful
        for judging the relative security of a key.

        @return: bits in the key.
        @rtype: int
        i    (    (   R   (    (    sL   C:\Documents and Settings\red08xgu\Desktop\python_webupdate\paramiko\pkey.pyt   get_bitsh   s    c         C   s   t  S(   s®   
        Return C{True} if this key has the private part necessary for signing
        data.

        @return: C{True} if this is a private key.
        @rtype: bool
        (   t   False(   R   (    (    sL   C:\Documents and Settings\red08xgu\Desktop\python_webupdate\paramiko\pkey.pyt   can_signr   s    c         C   s   t  i t |  ƒ ƒ i ƒ  S(   sã   
        Return an MD5 fingerprint of the public part of this key.  Nothing
        secret is revealed.

        @return: a 16-byte string (binary) of the MD5 fingerprint, in SSH
            format.
        @rtype: str
        (   R   t   newR   t   digest(   R   (    (    sL   C:\Documents and Settings\red08xgu\Desktop\python_webupdate\paramiko\pkey.pyt   get_fingerprint|   s    	c         C   s   t  i t |  ƒ ƒ i d d ƒ S(   s7  
        Return a base64 string containing the public part of this key.  Nothing
        secret is revealed.  This format is compatible with that used to store
        public key files or recognized host keys.

        @return: a base64 string containing the public part of the key.
        @rtype: str
        s   
R   (   t   base64t   encodestringR   t   replace(   R   (    (    sL   C:\Documents and Settings\red08xgu\Desktop\python_webupdate\paramiko\pkey.pyt
   get_base64‡   s    	c         C   s   d S(   s  
        Sign a blob of data with this private key, and return a L{Message}
        representing an SSH signature message.

        @param randpool: a secure random number generator.
        @type randpool: L{Crypto.Util.randpool.RandomPool}
        @param data: the data to sign.
        @type data: str
        @return: an SSH signature message.
        @rtype: L{Message}
        R   (    (   R   t   randpoolR   (    (    sL   C:\Documents and Settings\red08xgu\Desktop\python_webupdate\paramiko\pkey.pyt   sign_ssh_data’   s    c         C   s   t  S(   s›  
        Given a blob of data, and an SSH message representing a signature of
        that data, verify that it was signed with this key.

        @param data: the data that was signed.
        @type data: str
        @param msg: an SSH signature message
        @type msg: L{Message}
        @return: C{True} if the signature verifies correctly; C{False}
            otherwise.
        @rtype: boolean
        (   R   (   R   R   R   (    (    sL   C:\Documents and Settings\red08xgu\Desktop\python_webupdate\paramiko\pkey.pyt   verify_ssh_sig    s    c         C   s   |  d | d | ƒ } | S(   s×  
        Create a key object by reading a private key file.  If the private
        key is encrypted and C{password} is not C{None}, the given password
        will be used to decrypt the key (otherwise L{PasswordRequiredException}
        is thrown).  Through the magic of python, this factory method will
        exist in all subclasses of PKey (such as L{RSAKey} or L{DSSKey}), but
        is useless on the abstract PKey class.

        @param filename: name of the file to read
        @type filename: str
        @param password: an optional password to use to decrypt the key file,
            if it's encrypted
        @type password: str
        @return: a new key object based on the given private key
        @rtype: L{PKey}

        @raise IOError: if there was an error reading the file
        @raise PasswordRequiredException: if the private key file is
            encrypted, and C{password} is C{None}
        @raise SSHException: if the key file is invalid
        t   filenamet   password(    (   t   clsR)   R*   t   key(    (    sL   C:\Documents and Settings\red08xgu\Desktop\python_webupdate\paramiko\pkey.pyt   from_private_key_file¯   s    c         C   s   |  d | d | ƒ } | S(   sH  
        Create a key object by reading a private key from a file (or file-like)
        object.  If the private key is encrypted and C{password} is not C{None},
        the given password will be used to decrypt the key (otherwise
        L{PasswordRequiredException} is thrown).
        
        @param file_obj: the file to read from
        @type file_obj: file
        @param password: an optional password to use to decrypt the key, if it's
            encrypted
        @type password: str
        @return: a new key object based on the given private key
        @rtype: L{PKey}
        
        @raise IOError: if there was an error reading the key
        @raise PasswordRequiredException: if the private key file is encrypted,
            and C{password} is C{None}
        @raise SSHException: if the key file is invalid
        t   file_objR*   (    (   R+   R.   R*   R,   (    (    sL   C:\Documents and Settings\red08xgu\Desktop\python_webupdate\paramiko\pkey.pyt   from_private_keyÉ   s    c         C   s   t  d ƒ ‚ d S(   s³  
        Write private key contents into a file.  If the password is not
        C{None}, the key is encrypted before writing.

        @param filename: name of the file to write
        @type filename: str
        @param password: an optional password to use to encrypt the key file
        @type password: str

        @raise IOError: if there was an error writing the file
        @raise SSHException: if the key is invalid
        s   Not implemented in PKeyN(   t	   Exception(   R   R)   R*   (    (    sL   C:\Documents and Settings\red08xgu\Desktop\python_webupdate\paramiko\pkey.pyt   write_private_key_fileá   s    c         C   s   t  d ƒ ‚ d S(   sÜ  
        Write private key contents into a file (or file-like) object.  If the
        password is not C{None}, the key is encrypted before writing.
        
        @param file_obj: the file object to write into
        @type file_obj: file
        @param password: an optional password to use to encrypt the key
        @type password: str
        
        @raise IOError: if there was an error writing to the file
        @raise SSHException: if the key is invalid
        s   Not implemented in PKeyN(   R0   (   R   R.   R*   (    (    sL   C:\Documents and Settings\red08xgu\Desktop\python_webupdate\paramiko\pkey.pyt   write_private_keyð   s    c         C   s2   t  | d ƒ } |  i | | | ƒ } | i ƒ  | S(   s  
        Read an SSH2-format private key file, looking for a string of the type
        C{"BEGIN xxx PRIVATE KEY"} for some C{xxx}, base64-decode the text we
        find, and return it as a string.  If the private key is encrypted and
        C{password} is not C{None}, the given password will be used to decrypt
        the key (otherwise L{PasswordRequiredException} is thrown).

        @param tag: C{"RSA"} or C{"DSA"}, the tag used to mark the data block.
        @type tag: str
        @param filename: name of the file to read.
        @type filename: str
        @param password: an optional password to use to decrypt the key file,
            if it's encrypted.
        @type password: str
        @return: data blob that makes up the private key.
        @rtype: str

        @raise IOError: if there was an error reading the file.
        @raise PasswordRequiredException: if the private key file is
            encrypted, and C{password} is C{None}.
        @raise SSHException: if the key file is invalid.
        t   r(   t   opent   _read_private_keyt   close(   R   t   tagR)   R*   t   fR   (    (    sL   C:\Documents and Settings\red08xgu\Desktop\python_webupdate\paramiko\pkey.pyt   _read_private_key_fileÿ   s    
c         C   sÂ  | i  ƒ  } d } xA | t | ƒ j  o- | | i ƒ  d | d j o | d 7} q W| t | ƒ j o t d | d ƒ ‚ n h  } | d 7} xk | t | ƒ j  oW | | i d ƒ } t | ƒ d j o Pn | d i ƒ  | | d i ƒ  <| d 7} q” W| } xA | | i ƒ  d | d j o! | t | ƒ j  o | d 7} qWy# t i d	 i | | | !ƒ ƒ }	 Wn1 t i	 i
 j
 o }
 t d
 t |
 ƒ ƒ ‚ n Xd | j o |	 S| d d j o t d | d ƒ ‚ n y | d i d ƒ \ } } Wn t d ƒ ‚ n X| |  i j o t d | ƒ ‚ n | d  j o t d ƒ ‚ n |  i | d } |  i | d } |  i | d } t | ƒ } t i t | | | ƒ } | i | | | ƒ i |	 ƒ S(   Ni    s   -----BEGIN s    PRIVATE KEY-----i   s   not a valid s    private key files   : s	   -----END R   s   base64 decoding error: s	   proc-types   4,ENCRYPTEDs"   Unknown private key structure "%s"s   dek-infot   ,s(   Can't parse DEK-info in private key files   Unknown private key cipher "%s"s   Private key file is encryptedR
   R   R   (   t	   readlinest   lent   stripR   t   splitt   lowerR"   t   decodestringt   joint   binasciit   ErrorR   t   _CIPHER_TABLEt   NoneR   R   R   t   generate_key_bytesR   R   t   decrypt(   R   R7   R8   R*   t   linest   startt   headerst   lt   endR   t   et   encryption_typet   saltstrR
   R   R   t   saltR,   (    (    sL   C:\Documents and Settings\red08xgu\Desktop\python_webupdate\paramiko\pkey.pyR5     sT     2
  2#c         C   sF   t  | d d ƒ } t i | d ƒ |  i | | | | ƒ | i ƒ  d S(   s×  
        Write an SSH2-format private key file in a form that can be read by
        paramiko or openssh.  If no password is given, the key is written in
        a trivially-encoded format (base64) which is completely insecure.  If
        a password is given, DES-EDE3-CBC is used.

        @param tag: C{"RSA"} or C{"DSA"}, the tag used to mark the data block.
        @type tag: str
        @param filename: name of the file to write.
        @type filename: str
        @param data: data blob that makes up the private key.
        @type data: str
        @param password: an optional password to use to encrypt the file.
        @type password: str

        @raise IOError: if there was an error writing the file.
        t   wi€  N(   R4   t   ost   chmodt   _write_private_keyR6   (   R   R7   R)   R   R*   R8   (    (    sL   C:\Documents and Settings\red08xgu\Desktop\python_webupdate\paramiko\pkey.pyt   _write_private_key_fileJ  s    c         C   sÕ  | i  d | ƒ | d  j	 o|  i i ƒ  d } |  i | d } |  i | d } |  i | d } |  i | d }	 t i d ƒ }
 t i t |
 | | ƒ } t	 | ƒ | d j o& | t	 | ƒ | } | d | 7} n | i
 | |	 |
 ƒ i | ƒ } | i  d	 ƒ | i  d
 | t |
 ƒ i ƒ  f ƒ | i  d ƒ n t i | ƒ } d i | i d ƒ ƒ } d i g  } t d t	 | ƒ d ƒ D] } | | | | d !q‚~ ƒ } | i  | ƒ | i  d ƒ | i  d | ƒ d  S(   Ns   -----BEGIN %s PRIVATE KEY-----
i    R
   R   R   R   i   t    s   Proc-Type: 4,ENCRYPTED
s   DEK-Info: %s,%s
s   
R   i@   s   -----END %s PRIVATE KEY-----
(   t   writeRE   RD   t   keysR&   t	   get_bytesR   RF   R   R<   R   t   encryptR    t   upperR"   R#   RA   R>   t   range(   R   R7   R8   R   R*   t   cipher_nameR
   R   R   R   RP   R,   t   nt   st   _[1]t   i(    (    sL   C:\Documents and Settings\red08xgu\Desktop\python_webupdate\paramiko\pkey.pyRT   b  s,    #GN(   t   __name__t
   __module__t   __doc__R   t   MODE_CBCRD   RE   R   R   R   R   R   R   R!   R%   R'   R(   R-   t   classmethodR/   R1   R2   R9   R5   RU   RT   (    (    (    sL   C:\Documents and Settings\red08xgu\Desktop\python_webupdate\paramiko\pkey.pyR	   $   s.   )			
	
	
				/(   Rd   R"   RB   R    R   RR   t   Crypto.HashR   t   Crypto.CipherR   t   paramiko.commont   paramikoR   t   paramiko.messageR   t   paramiko.ssh_exceptionR   R   t   objectR	   (    (    (    sL   C:\Documents and Settings\red08xgu\Desktop\python_webupdate\paramiko\pkey.pyt   <module>   s   
