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