Merge branch 'master' into make
Conflicts: src/libexpr/eval.cc
This commit is contained in:
		
						commit
						81628a6ccc
					
				
					 34 changed files with 473 additions and 103 deletions
				
			
		|  | @ -13,6 +13,7 @@ $storeDir = $ENV{"NIX_STORE_DIR"} || "@storedir@"; | |||
| $bzip2 = "@bzip2@"; | ||||
| $xz = "@xz@"; | ||||
| $curl = "@curl@"; | ||||
| $openssl = "@openssl@"; | ||||
| 
 | ||||
| $useBindings = "@perlbindings@" eq "yes"; | ||||
| 
 | ||||
|  | @ -32,7 +33,7 @@ sub readConfig { | |||
| 
 | ||||
|     open CONFIG, "<$config" or die "cannot open `$config'"; | ||||
|     while (<CONFIG>) { | ||||
|         /^\s*([\w|-]+)\s*=\s*(.*)$/ or next; | ||||
|         /^\s*([\w\-\.]+)\s*=\s*(.*)$/ or next; | ||||
|         $config{$1} = $2; | ||||
|     } | ||||
|     close CONFIG; | ||||
|  |  | |||
							
								
								
									
										42
									
								
								perl/lib/Nix/Crypto.pm
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										42
									
								
								perl/lib/Nix/Crypto.pm
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,42 @@ | |||
| package Nix::Crypto; | ||||
| 
 | ||||
| use strict; | ||||
| use MIME::Base64; | ||||
| use Nix::Store; | ||||
| use Nix::Config; | ||||
| use IPC::Open2; | ||||
| 
 | ||||
| our @ISA = qw(Exporter); | ||||
| our @EXPORT = qw(signString isValidSignature); | ||||
| 
 | ||||
| sub signString { | ||||
|     my ($privateKeyFile, $s) = @_; | ||||
|     my $hash = hashString("sha256", 0, $s); | ||||
|     my ($from, $to); | ||||
|     my $pid = open2($from, $to, $Nix::Config::openssl, "rsautl", "-sign", "-inkey", $privateKeyFile); | ||||
|     print $to $hash; | ||||
|     close $to; | ||||
|     local $/ = undef; | ||||
|     my $sig = <$from>; | ||||
|     close $from; | ||||
|     waitpid($pid, 0); | ||||
|     die "$0: OpenSSL returned exit code $? while signing hash\n" if $? != 0; | ||||
|     my $sig64 = encode_base64($sig, ""); | ||||
|     return $sig64; | ||||
| } | ||||
| 
 | ||||
| sub isValidSignature { | ||||
|     my ($publicKeyFile, $sig64, $s) = @_; | ||||
|     my ($from, $to); | ||||
|     my $pid = open2($from, $to, $Nix::Config::openssl, "rsautl", "-verify", "-inkey", $publicKeyFile, "-pubin"); | ||||
|     print $to decode_base64($sig64); | ||||
|     close $to; | ||||
|     my $decoded = <$from>; | ||||
|     close $from; | ||||
|     waitpid($pid, 0); | ||||
|     return 0 if $? != 0; | ||||
|     my $hash = hashString("sha256", 0, $s); | ||||
|     return $decoded eq $hash; | ||||
| } | ||||
| 
 | ||||
| 1; | ||||
|  | @ -8,6 +8,7 @@ use File::stat; | |||
| use File::Path; | ||||
| use Fcntl ':flock'; | ||||
| use Nix::Config; | ||||
| use Nix::Crypto; | ||||
| 
 | ||||
| our @ISA = qw(Exporter); | ||||
| our @EXPORT = qw(readManifest writeManifest updateManifestDB addPatch deleteOldManifests parseNARInfo); | ||||
|  | @ -394,9 +395,10 @@ sub deleteOldManifests { | |||
| 
 | ||||
| # Parse a NAR info file. | ||||
| sub parseNARInfo { | ||||
|     my ($storePath, $content) = @_; | ||||
|     my ($storePath, $content, $requireValidSig, $location) = @_; | ||||
| 
 | ||||
|     my ($storePath2, $url, $fileHash, $fileSize, $narHash, $narSize, $deriver, $system); | ||||
|     my ($storePath2, $url, $fileHash, $fileSize, $narHash, $narSize, $deriver, $system, $sig); | ||||
|     my $signedData = ""; | ||||
|     my $compression = "bzip2"; | ||||
|     my @refs; | ||||
| 
 | ||||
|  | @ -412,11 +414,13 @@ sub parseNARInfo { | |||
|         elsif ($1 eq "References") { @refs = split / /, $2; } | ||||
|         elsif ($1 eq "Deriver") { $deriver = $2; } | ||||
|         elsif ($1 eq "System") { $system = $2; } | ||||
|         elsif ($1 eq "Signature") { $sig = $2; last; } | ||||
|         $signedData .= "$line\n"; | ||||
|     } | ||||
| 
 | ||||
|     return undef if $storePath ne $storePath2 || !defined $url || !defined $narHash; | ||||
| 
 | ||||
|     return | ||||
|     my $res = | ||||
|         { url => $url | ||||
|         , compression => $compression | ||||
|         , fileHash => $fileHash | ||||
|  | @ -427,6 +431,36 @@ sub parseNARInfo { | |||
|         , deriver => $deriver | ||||
|         , system => $system | ||||
|         }; | ||||
| 
 | ||||
|     if ($requireValidSig) { | ||||
|         if (!defined $sig) { | ||||
|             warn "NAR info file `$location' lacks a signature; ignoring\n"; | ||||
|             return undef; | ||||
|         } | ||||
|         my ($sigVersion, $keyName, $sig64) = split ";", $sig; | ||||
|         $sigVersion //= 0; | ||||
|         if ($sigVersion != 1) { | ||||
|             warn "NAR info file `$location' has unsupported version $sigVersion; ignoring\n"; | ||||
|             return undef; | ||||
|         } | ||||
|         return undef unless defined $keyName && defined $sig64; | ||||
|         my $publicKeyFile = $Nix::Config::config{"binary-cache-public-key-$keyName"}; | ||||
|         if (!defined $publicKeyFile) { | ||||
|             warn "NAR info file `$location' is signed by unknown key `$keyName'; ignoring\n"; | ||||
|             return undef; | ||||
|         } | ||||
|         if (! -f $publicKeyFile) { | ||||
|             die "binary cache public key file `$publicKeyFile' does not exist\n"; | ||||
|             return undef; | ||||
|         } | ||||
|         if (!isValidSignature($publicKeyFile, $sig64, $signedData)) { | ||||
|             warn "NAR info file `$location' has an invalid signature; ignoring\n"; | ||||
|             return undef; | ||||
|         } | ||||
|         $res->{signedBy} = $keyName; | ||||
|     } | ||||
| 
 | ||||
|     return $res; | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
|  |  | |||
|  | @ -20,6 +20,8 @@ void doInit() | |||
|     if (!store) { | ||||
|         try { | ||||
|             settings.processEnvironment(); | ||||
|             settings.loadConfFile(); | ||||
|             settings.update(); | ||||
|             settings.lockCPU = false; | ||||
|             store = openStore(); | ||||
|         } catch (Error & e) { | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue