From 94378910fb55780cc11c1d68045f5c43e269490e Mon Sep 17 00:00:00 2001 From: Eelco Dolstra Date: Wed, 3 Jun 2015 15:33:17 +0200 Subject: [PATCH] Handle base-16 NarHash fields in signed .narinfo files --- perl/lib/Nix/Manifest.pm | 7 +++++-- perl/lib/Nix/Store.pm | 2 +- perl/lib/Nix/Store.xs | 11 +++++++++++ 3 files changed, 17 insertions(+), 3 deletions(-) diff --git a/perl/lib/Nix/Manifest.pm b/perl/lib/Nix/Manifest.pm index fb4a46469..428decf09 100644 --- a/perl/lib/Nix/Manifest.pm +++ b/perl/lib/Nix/Manifest.pm @@ -395,12 +395,15 @@ sub deleteOldManifests { # Return a fingerprint of a store path to be used in binary cache -# signatures. It contains the store path, the SHA-256 hash of the -# contents of the path, and the references. +# signatures. It contains the store path, the base-32 SHA-256 hash of +# the contents of the path, and the references. sub fingerprintPath { my ($storePath, $narHash, $narSize, $references) = @_; die if substr($storePath, 0, length($Nix::Config::storeDir)) ne $Nix::Config::storeDir; die if substr($narHash, 0, 7) ne "sha256:"; + # Convert hash from base-16 to base-32, if necessary. + $narHash = "sha256:" . convertHash("sha256", substr($narHash, 7), 1) + if length($narHash) == 71; die if length($narHash) != 59; foreach my $ref (@{$references}) { die if substr($ref, 0, length($Nix::Config::storeDir)) ne $Nix::Config::storeDir; diff --git a/perl/lib/Nix/Store.pm b/perl/lib/Nix/Store.pm index f735a0a20..af3d2fa2e 100644 --- a/perl/lib/Nix/Store.pm +++ b/perl/lib/Nix/Store.pm @@ -17,7 +17,7 @@ our @EXPORT = qw( isValidPath queryReferences queryPathInfo queryDeriver queryPathHash queryPathFromHashPart topoSortPaths computeFSClosure followLinksToStorePath exportPaths importPaths - hashPath hashFile hashString + hashPath hashFile hashString convertHash signString checkSignature addToStore makeFixedOutputPath derivationFromPath diff --git a/perl/lib/Nix/Store.xs b/perl/lib/Nix/Store.xs index 6a94bc90b..d3bfa19fd 100644 --- a/perl/lib/Nix/Store.xs +++ b/perl/lib/Nix/Store.xs @@ -232,6 +232,17 @@ SV * hashString(char * algo, int base32, char * s) } +SV * convertHash(char * algo, char * s, int toBase32) + PPCODE: + try { + Hash h = parseHash16or32(parseHashType(algo), s); + string s = toBase32 ? printHash32(h) : printHash(h); + XPUSHs(sv_2mortal(newSVpv(s.c_str(), 0))); + } catch (Error & e) { + croak(e.what()); + } + + SV * signString(SV * secretKey_, char * msg) PPCODE: try {