* Print a better error message for wrong hashes (NIX-49).
This commit is contained in:
parent
22d13d6ec2
commit
0623359fbc
|
@ -353,13 +353,16 @@ static Expr primDerivationStrict(EvalState & state, const ATermVector & args)
|
|||
HashType ht = parseHashType(outputHashAlgo);
|
||||
if (ht == htUnknown)
|
||||
throw EvalError(format("unknown hash algorithm `%1%'") % outputHashAlgo);
|
||||
Hash h;
|
||||
if (outputHash.size() == Hash(ht).hashSize * 2)
|
||||
Hash h(ht);
|
||||
if (outputHash.size() == h.hashSize * 2)
|
||||
/* hexadecimal representation */
|
||||
h = parseHash(ht, outputHash);
|
||||
else
|
||||
else if (outputHash.size() == hashLength32(h))
|
||||
/* base-32 representation */
|
||||
h = parseHash32(ht, outputHash);
|
||||
else
|
||||
throw Error(format("hash `%1%' has wrong length for hash type `%2%'")
|
||||
% outputHash % outputHashAlgo);
|
||||
string s = outputHash;
|
||||
outputHash = printHash(h);
|
||||
if (outputHashRecursive) outputHashAlgo = "r:" + outputHashAlgo;
|
||||
|
|
|
@ -120,6 +120,12 @@ static unsigned char divMod(unsigned char * bytes, unsigned char y)
|
|||
}
|
||||
|
||||
|
||||
unsigned int hashLength32(const Hash & hash)
|
||||
{
|
||||
return (hash.hashSize * 8 - 1) / 5 + 1;
|
||||
}
|
||||
|
||||
|
||||
// omitted: E O U T
|
||||
const string base32Chars = "0123456789abcdfghijklmnpqrsvwxyz";
|
||||
|
||||
|
@ -127,7 +133,7 @@ const string base32Chars = "0123456789abcdfghijklmnpqrsvwxyz";
|
|||
string printHash32(const Hash & hash)
|
||||
{
|
||||
Hash hash2(hash);
|
||||
unsigned int len = (hash.hashSize * 8 - 1) / 5 + 1;
|
||||
unsigned int len = hashLength32(hash);
|
||||
|
||||
const char * chars = base32Chars.c_str();
|
||||
|
||||
|
|
|
@ -49,6 +49,9 @@ string printHash(const Hash & hash);
|
|||
/* Parse a hexadecimal representation of a hash code. */
|
||||
Hash parseHash(HashType ht, const string & s);
|
||||
|
||||
/* Returns the length of a base-32 hash representation. */
|
||||
unsigned int hashLength32(const Hash & hash);
|
||||
|
||||
/* Convert a hash to a base-32 representation. */
|
||||
string printHash32(const Hash & hash);
|
||||
|
||||
|
|
Loading…
Reference in a new issue