Package ganeti :: Package utils :: Module hash
[hide private]
[frames] | no frames]

Source Code for Module ganeti.utils.hash

  1  # 
  2  # 
  3   
  4  # Copyright (C) 2006, 2007, 2010, 2011 Google Inc. 
  5  # All rights reserved. 
  6  # 
  7  # Redistribution and use in source and binary forms, with or without 
  8  # modification, are permitted provided that the following conditions are 
  9  # met: 
 10  # 
 11  # 1. Redistributions of source code must retain the above copyright notice, 
 12  # this list of conditions and the following disclaimer. 
 13  # 
 14  # 2. Redistributions in binary form must reproduce the above copyright 
 15  # notice, this list of conditions and the following disclaimer in the 
 16  # documentation and/or other materials provided with the distribution. 
 17  # 
 18  # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS 
 19  # IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED 
 20  # TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 
 21  # PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR 
 22  # CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 
 23  # EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 
 24  # PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR 
 25  # PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF 
 26  # LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING 
 27  # NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 
 28  # SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
 29   
 30  """Utility functions for hashing. 
 31   
 32  """ 
 33   
 34  import os 
 35  import hmac 
 36   
 37  from ganeti import compat 
 38   
 39   
40 -def Sha1Hmac(key, text, salt=None):
41 """Calculates the HMAC-SHA1 digest of a text. 42 43 HMAC is defined in RFC2104. 44 45 @type key: string 46 @param key: Secret key 47 @type text: string 48 49 """ 50 if salt: 51 salted_text = salt + text 52 else: 53 salted_text = text 54 55 return hmac.new(key, salted_text, compat.sha1).hexdigest()
56 57
58 -def VerifySha1Hmac(key, text, digest, salt=None):
59 """Verifies the HMAC-SHA1 digest of a text. 60 61 HMAC is defined in RFC2104. 62 63 @type key: string 64 @param key: Secret key 65 @type text: string 66 @type digest: string 67 @param digest: Expected digest 68 @rtype: bool 69 @return: Whether HMAC-SHA1 digest matches 70 71 """ 72 return digest.lower() == Sha1Hmac(key, text, salt=salt).lower()
73 74
75 -def _FingerprintFile(filename):
76 """Compute the fingerprint of a file. 77 78 If the file does not exist, a None will be returned 79 instead. 80 81 @type filename: str 82 @param filename: the filename to checksum 83 @rtype: str 84 @return: the hex digest of the sha checksum of the contents 85 of the file 86 87 """ 88 if not (os.path.exists(filename) and os.path.isfile(filename)): 89 return None 90 91 f = open(filename) 92 93 fp = compat.sha1_hash() 94 while True: 95 data = f.read(4096) 96 if not data: 97 break 98 99 fp.update(data) 100 101 return fp.hexdigest()
102 103
104 -def FingerprintFiles(files):
105 """Compute fingerprints for a list of files. 106 107 @type files: list 108 @param files: the list of filename to fingerprint 109 @rtype: dict 110 @return: a dictionary filename: fingerprint, holding only 111 existing files 112 113 """ 114 ret = {} 115 116 for filename in files: 117 cksum = _FingerprintFile(filename) 118 if cksum: 119 ret[filename] = cksum 120 121 return ret
122