1 #! /usr/bin/env perl 2 # Copyright 2015-2018 The OpenSSL Project Authors. All Rights Reserved. 3 # 4 # Licensed under the OpenSSL license (the "License"). You may not use 5 # this file except in compliance with the License. You can obtain a copy 6 # in the file LICENSE in the source distribution or at 7 # https://www.openssl.org/source/license.html 8 9 10 use strict; 11 use warnings; 12 13 use File::Spec::Functions; 14 use File::Copy; 15 use File::Basename; 16 use OpenSSL::Glob; 17 use OpenSSL::Test qw/:DEFAULT srctop_file/; 18 19 setup("test_rehash"); 20 21 #If "openssl rehash -help" fails it's most likely because we're on a platform 22 #that doesn't support the rehash command (e.g. Windows) 23 plan skip_all => "test_rehash is not available on this platform" 24 unless run(app(["openssl", "rehash", "-help"])); 25 26 plan tests => 4; 27 28 indir "rehash.$$" => sub { 29 prepare(); 30 ok(run(app(["openssl", "rehash", curdir()])), 31 'Testing normal rehash operations'); 32 }, create => 1, cleanup => 1; 33 34 indir "rehash.$$" => sub { 35 prepare(sub { chmod 400, $_ foreach (@_); }); 36 ok(run(app(["openssl", "rehash", curdir()])), 37 'Testing rehash operations on readonly files'); 38 }, create => 1, cleanup => 1; 39 40 indir "rehash.$$" => sub { 41 ok(run(app(["openssl", "rehash", curdir()])), 42 'Testing rehash operations on empty directory'); 43 }, create => 1, cleanup => 1; 44 45 indir "rehash.$$" => sub { 46 prepare(); 47 chmod 0500, curdir(); 48 SKIP: { 49 if (open(FOO, ">unwritable.txt")) { 50 close FOO; 51 skip "It's pointless to run the next test as root", 1; 52 } 53 isnt(run(app(["openssl", "rehash", curdir()])), 1, 54 'Testing rehash operations on readonly directory'); 55 } 56 chmod 0700, curdir(); # make it writable again, so cleanup works 57 }, create => 1, cleanup => 1; 58 59 sub prepare { 60 my @pemsourcefiles = sort glob(srctop_file('test', "*.pem")); 61 my @destfiles = (); 62 63 die "There are no source files\n" if scalar @pemsourcefiles == 0; 64 65 my $cnt = 0; 66 foreach (@pemsourcefiles) { 67 my $basename = basename($_, ".pem"); 68 my $writing = 0; 69 70 open PEM, $_ or die "Can't read $_: $!\n"; 71 while (my $line = <PEM>) { 72 if ($line =~ m{^-----BEGIN (?:CERTIFICATE|X509 CRL)-----}) { 73 die "New start in a PEM blob?\n" if $writing; 74 $cnt++; 75 my $destfile = 76 catfile(curdir(), 77 $basename . sprintf("-%02d", $cnt) . ".pem"); 78 push @destfiles, $destfile; 79 open OUT, '>', $destfile 80 or die "Can't write $destfile\n"; 81 $writing = 1; 82 } 83 print OUT $line if $writing; 84 if ($line =~ m|^-----END |) { 85 close OUT if $writing; 86 $writing = 0; 87 } 88 } 89 die "No end marker in $basename\n" if $writing; 90 } 91 die "No test PEM files produced\n" if $cnt == 0; 92 93 foreach (@_) { 94 die "Internal error, argument is not CODE" 95 unless (ref($_) eq 'CODE'); 96 $_->(@destfiles); 97 } 98 } 99