1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30 """Utility functions for hashing.
31
32 """
33
34 import os
35 import hmac
36
37 from ganeti import compat
38
39
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
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
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
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