]>
git.saurik.com Git - apt.git/blob - apt-pkg/contrib/hashes.cc
1 // -*- mode: cpp; mode: fold -*-
3 // $Id: hashes.cc,v 1.1 2001/03/06 07:15:29 jgg Exp $
4 /* ######################################################################
6 Hashes - Simple wrapper around the hash functions
8 This is just used to make building the methods simpler, this is the
9 only interface required..
11 ##################################################################### */
13 // Include Files /*{{{*/
16 #include <apt-pkg/hashes.h>
17 #include <apt-pkg/fileutl.h>
18 #include <apt-pkg/configuration.h>
19 #include <apt-pkg/md5.h>
20 #include <apt-pkg/sha1.h>
21 #include <apt-pkg/sha2.h>
30 const char * HashString::_SupportedHashes
[] =
32 "SHA512", "SHA256", "SHA1", "MD5Sum", NULL
35 HashString::HashString()
39 HashString::HashString(std::string Type
, std::string Hash
) : Type(Type
), Hash(Hash
)
43 HashString::HashString(std::string StringedHash
) /*{{{*/
45 if (StringedHash
.find(":") == std::string::npos
)
47 // legacy: md5sum without "MD5Sum:" prefix
48 if (StringedHash
.size() == 32)
53 if(_config
->FindB("Debug::Hashes",false) == true)
54 std::clog
<< "HashString(string): invalid StringedHash " << StringedHash
<< std::endl
;
57 std::string::size_type pos
= StringedHash
.find(":");
58 Type
= StringedHash
.substr(0,pos
);
59 Hash
= StringedHash
.substr(pos
+1, StringedHash
.size() - pos
);
61 if(_config
->FindB("Debug::Hashes",false) == true)
62 std::clog
<< "HashString(string): " << Type
<< " : " << Hash
<< std::endl
;
65 bool HashString::VerifyFile(std::string filename
) const /*{{{*/
67 std::string fileHash
= GetHashForFile(filename
);
69 if(_config
->FindB("Debug::Hashes",false) == true)
70 std::clog
<< "HashString::VerifyFile: got: " << fileHash
<< " expected: " << toStr() << std::endl
;
72 return (fileHash
== Hash
);
75 bool HashString::FromFile(std::string filename
) /*{{{*/
77 // pick the strongest hash
79 Type
= _SupportedHashes
[0];
81 Hash
= GetHashForFile(filename
);
85 std::string
HashString::GetHashForFile(std::string filename
) const /*{{{*/
89 FileFd
Fd(filename
, FileFd::ReadOnly
);
90 if(strcasecmp(Type
.c_str(), "MD5Sum") == 0)
94 fileHash
= (std::string
)MD5
.Result();
96 else if (strcasecmp(Type
.c_str(), "SHA1") == 0)
100 fileHash
= (std::string
)SHA1
.Result();
102 else if (strcasecmp(Type
.c_str(), "SHA256") == 0)
104 SHA256Summation SHA256
;
106 fileHash
= (std::string
)SHA256
.Result();
108 else if (strcasecmp(Type
.c_str(), "SHA512") == 0)
110 SHA512Summation SHA512
;
112 fileHash
= (std::string
)SHA512
.Result();
119 const char** HashString::SupportedHashes() /*{{{*/
121 return _SupportedHashes
;
124 APT_PURE
bool HashString::empty() const /*{{{*/
126 return (Type
.empty() || Hash
.empty());
129 std::string
HashString::toStr() const /*{{{*/
131 return Type
+ ":" + Hash
;
134 APT_PURE
bool HashString::operator==(HashString
const &other
) const /*{{{*/
136 return (strcasecmp(Type
.c_str(), other
.Type
.c_str()) == 0 && Hash
== other
.Hash
);
138 APT_PURE
bool HashString::operator!=(HashString
const &other
) const
140 return !(*this == other
);
144 bool HashStringList::usable() const /*{{{*/
148 std::string
const forcedType
= _config
->Find("Acquire::ForceHash", "");
149 if (forcedType
.empty() == true)
151 return find(forcedType
) != NULL
;
154 HashString
const * HashStringList::find(char const * const type
) const /*{{{*/
156 if (type
== NULL
|| type
[0] == '\0')
158 std::string
const forcedType
= _config
->Find("Acquire::ForceHash", "");
159 if (forcedType
.empty() == false)
160 return find(forcedType
.c_str());
161 for (char const * const * t
= HashString::SupportedHashes(); *t
!= NULL
; ++t
)
162 for (std::vector
<HashString
>::const_iterator hs
= list
.begin(); hs
!= list
.end(); ++hs
)
163 if (strcasecmp(hs
->HashType().c_str(), *t
) == 0)
167 for (std::vector
<HashString
>::const_iterator hs
= list
.begin(); hs
!= list
.end(); ++hs
)
168 if (strcasecmp(hs
->HashType().c_str(), type
) == 0)
173 bool HashStringList::supported(char const * const type
) /*{{{*/
175 for (char const * const * t
= HashString::SupportedHashes(); *t
!= NULL
; ++t
)
176 if (strcasecmp(*t
, type
) == 0)
181 bool HashStringList::push_back(const HashString
&hashString
) /*{{{*/
183 if (hashString
.HashType().empty() == true ||
184 hashString
.HashValue().empty() == true ||
185 supported(hashString
.HashType().c_str()) == false)
188 // ensure that each type is added only once
189 HashString
const * const hs
= find(hashString
.HashType().c_str());
191 return *hs
== hashString
;
193 list
.push_back(hashString
);
197 bool HashStringList::VerifyFile(std::string filename
) const /*{{{*/
199 if (list
.empty() == true)
201 HashString
const * const hs
= find(NULL
);
202 if (hs
== NULL
|| hs
->VerifyFile(filename
) == false)
207 bool HashStringList::operator==(HashStringList
const &other
) const /*{{{*/
209 std::string
const forcedType
= _config
->Find("Acquire::ForceHash", "");
210 if (forcedType
.empty() == false)
212 HashString
const * const hs
= find(forcedType
);
213 HashString
const * const ohs
= other
.find(forcedType
);
214 if (hs
== NULL
|| ohs
== NULL
)
219 for (const_iterator hs
= begin(); hs
!= end(); ++hs
)
221 HashString
const * const ohs
= other
.find(hs
->HashType());
232 bool HashStringList::operator!=(HashStringList
const &other
) const
234 return !(*this == other
);
238 // Hashes::Add* - Add the contents of data or FD /*{{{*/
239 bool Hashes::Add(const unsigned char * const Data
,unsigned long long const Size
, unsigned int const Hashes
)
243 #pragma GCC diagnostic push
244 #pragma GCC diagnostic ignored "-Wdeprecated-declarations"
246 if ((Hashes
& MD5SUM
) == MD5SUM
)
247 Res
&= MD5
.Add(Data
, Size
);
248 if ((Hashes
& SHA1SUM
) == SHA1SUM
)
249 Res
&= SHA1
.Add(Data
, Size
);
250 if ((Hashes
& SHA256SUM
) == SHA256SUM
)
251 Res
&= SHA256
.Add(Data
, Size
);
252 if ((Hashes
& SHA512SUM
) == SHA512SUM
)
253 Res
&= SHA512
.Add(Data
, Size
);
255 #pragma GCC diagnostic pop
259 bool Hashes::AddFD(int const Fd
,unsigned long long Size
, unsigned int const Hashes
)
261 unsigned char Buf
[64*64];
262 bool const ToEOF
= (Size
== UntilEOF
);
263 while (Size
!= 0 || ToEOF
)
265 unsigned long long n
= sizeof(Buf
);
266 if (!ToEOF
) n
= std::min(Size
, n
);
267 ssize_t
const Res
= read(Fd
,Buf
,n
);
268 if (Res
< 0 || (!ToEOF
&& Res
!= (ssize_t
) n
)) // error, or short read
270 if (ToEOF
&& Res
== 0) // EOF
273 if (Add(Buf
, Res
, Hashes
) == false)
278 bool Hashes::AddFD(FileFd
&Fd
,unsigned long long Size
, unsigned int const Hashes
)
280 unsigned char Buf
[64*64];
281 bool const ToEOF
= (Size
== 0);
282 while (Size
!= 0 || ToEOF
)
284 unsigned long long n
= sizeof(Buf
);
285 if (!ToEOF
) n
= std::min(Size
, n
);
286 unsigned long long a
= 0;
287 if (Fd
.Read(Buf
, n
, &a
) == false) // error
291 if (a
!= n
) // short read
294 else if (a
== 0) // EOF
297 if (Add(Buf
, a
, Hashes
) == false)
303 HashStringList
Hashes::GetHashStringList()
305 HashStringList hashes
;
307 #pragma GCC diagnostic push
308 #pragma GCC diagnostic ignored "-Wdeprecated-declarations"
310 hashes
.push_back(HashString("MD5Sum", MD5
.Result().Value()));
311 hashes
.push_back(HashString("SHA1", SHA1
.Result().Value()));
312 hashes
.push_back(HashString("SHA256", SHA256
.Result().Value()));
313 hashes
.push_back(HashString("SHA512", SHA512
.Result().Value()));
315 #pragma GCC diagnostic pop
320 #pragma GCC diagnostic push
321 #pragma GCC diagnostic ignored "-Wdeprecated-declarations"
322 #pragma GCC diagnostic ignored "-Wsuggest-attribute=const"
327 #pragma GCC diagnostic pop