#!/usr/bin/perl -w # # This script runs the OpenSSL Configure script, then processes the # resulting file list into our local OpensslLib[Crypto].inf and also # takes copies of opensslconf.h and dso_conf.h. # # This only needs to be done once by a developer when updating to a # new version of OpenSSL (or changing options, etc.). Normal users # do not need to do this, since the results are stored in the EDK2 # git repository for them. # use strict; use Cwd; use File::Copy; # # Find the openssl directory name for use lib. We have to do this # inside of BEGIN. The variables we create here, however, don't seem # to be available to the main script, so we have to repeat the # exercise. # my $inf_file; my $OPENSSL_PATH; my @inf; BEGIN { $inf_file = "OpensslLib.inf"; # Read the contents of the inf file open( FD, "<" . $inf_file ) || die "Cannot open \"" . $inf_file . "\"!"; @inf = (); close(FD) || die "Cannot close \"" . $inf_file . "\"!"; foreach (@inf) { if (/DEFINE\s+OPENSSL_PATH\s*=\s*([a-z]+)/) { # We need to run Configure before we can include its result... $OPENSSL_PATH = $1; my $basedir = getcwd(); chdir($OPENSSL_PATH) || die "Cannot change to OpenSSL directory \"" . $OPENSSL_PATH . "\""; # Configure UEFI system( "./Configure", "UEFI", "no-afalgeng", "no-asm", "no-async", "no-autoerrinit", "no-autoload-config", "no-bf", "no-blake2", "no-camellia", "no-capieng", "no-cast", "no-chacha", "no-cms", "no-ct", "no-deprecated", "no-des", "no-dgram", "no-dsa", "no-dynamic-engine", "no-ec", "no-ec2m", "no-engine", "no-err", "no-filenames", "no-gost", "no-hw", "no-idea", "no-md4", "no-mdc2", "no-pic", "no-ocb", "no-poly1305", "no-posix-io", "no-rc2", "no-rc4", "no-rfc3779", "no-rmd160", "no-scrypt", "no-seed", "no-sock", "no-srp", "no-ssl", "no-stdio", "no-threads", "no-ts", "no-ui", "no-whirlpool", # OpenSSL1_1_1b doesn't support default rand-seed-os for UEFI # UEFI only support --with-rand-seed=none "--with-rand-seed=none" ) == 0 || die "OpenSSL Configure failed!\n"; # Generate opensslconf.h per config data system( "perl -I. -Mconfigdata util/dofile.pl " . "include/openssl/opensslconf.h.in " . "> include/openssl/opensslconf.h" ) == 0 || die "Failed to generate opensslconf.h!\n"; # Generate dso_conf.h per config data system( "perl -I. -Mconfigdata util/dofile.pl " . "include/crypto/dso_conf.h.in " . "> include/crypto/dso_conf.h" ) == 0 || die "Failed to generate dso_conf.h!\n"; chdir($basedir) || die "Cannot change to base directory \"" . $basedir . "\""; push @INC, $1; last; } } } # # Retrieve file lists from OpenSSL configdata # use configdata qw/%unified_info/; my @cryptofilelist = (); my @sslfilelist = (); foreach my $product ((@{$unified_info{libraries}}, @{$unified_info{engines}})) { foreach my $o (@{$unified_info{sources}->{$product}}) { foreach my $s (@{$unified_info{sources}->{$o}}) { next if ($unified_info{generate}->{$s}); next if $s =~ "crypto/bio/b_print.c"; # No need to add unused files in UEFI. # So it can reduce porting time, compile time, library size. next if $s =~ "crypto/rand/randfile.c"; next if $s =~ "crypto/store/"; next if $s =~ "crypto/err/err_all.c"; next if $s =~ "crypto/aes/aes_ecb.c"; if ($product =~ "libssl") { push @sslfilelist, ' $(OPENSSL_PATH)/' . $s . "\r\n"; next; } push @cryptofilelist, ' $(OPENSSL_PATH)/' . $s . "\r\n"; } } } # # Update the perl script to generate the missing header files # my @dir_list = (); for (sort keys %{$unified_info{dirinfo}}){ push @dir_list,$_; } my $dir = getcwd(); my @files = (); my @headers = (); chdir ("openssl"); foreach(@dir_list){ @files = glob($_."/*.h"); push @headers, @files; } chdir ($dir); foreach (@headers){ if(/ssl/){ push @sslfilelist, ' $(OPENSSL_PATH)/' . $_ . "\r\n"; next; } push @cryptofilelist, ' $(OPENSSL_PATH)/' . $_ . "\r\n"; } # # Update OpensslLib.inf with autogenerated file list # my @new_inf = (); my $subbing = 0; print "\n--> Updating OpensslLib.inf ... "; foreach (@inf) { if ( $_ =~ "# Autogenerated files list starts here" ) { push @new_inf, $_, @cryptofilelist, @sslfilelist; $subbing = 1; next; } if ( $_ =~ "# Autogenerated files list ends here" ) { push @new_inf, $_; $subbing = 0; next; } push @new_inf, $_ unless ($subbing); } my $new_inf_file = $inf_file . ".new"; open( FD, ">" . $new_inf_file ) || die $new_inf_file; print( FD @new_inf ) || die $new_inf_file; close(FD) || die $new_inf_file; rename( $new_inf_file, $inf_file ) || die "rename $inf_file"; print "Done!"; # # Update OpensslLibCrypto.inf with auto-generated file list (no libssl) # $inf_file = "OpensslLibCrypto.inf"; # Read the contents of the inf file @inf = (); @new_inf = (); open( FD, "<" . $inf_file ) || die "Cannot open \"" . $inf_file . "\"!"; @inf = (); close(FD) || die "Cannot close \"" . $inf_file . "\"!"; $subbing = 0; print "\n--> Updating OpensslLibCrypto.inf ... "; foreach (@inf) { if ( $_ =~ "# Autogenerated files list starts here" ) { push @new_inf, $_, @cryptofilelist; $subbing = 1; next; } if ( $_ =~ "# Autogenerated files list ends here" ) { push @new_inf, $_; $subbing = 0; next; } push @new_inf, $_ unless ($subbing); } $new_inf_file = $inf_file . ".new"; open( FD, ">" . $new_inf_file ) || die $new_inf_file; print( FD @new_inf ) || die $new_inf_file; close(FD) || die $new_inf_file; rename( $new_inf_file, $inf_file ) || die "rename $inf_file"; print "Done!"; # # Copy opensslconf.h and dso_conf.h generated from OpenSSL Configuration # print "\n--> Duplicating opensslconf.h into Include/openssl ... "; system( "perl -pe 's/\\n/\\r\\n/' " . "< " . $OPENSSL_PATH . "/include/openssl/opensslconf.h " . "> " . $OPENSSL_PATH . "/../../Include/openssl/opensslconf.h" ) == 0 || die "Cannot copy opensslconf.h!"; print "Done!"; print "\n--> Duplicating dso_conf.h into Include/crypto ... "; system( "perl -pe 's/\\n/\\r\\n/' " . "< " . $OPENSSL_PATH . "/include/crypto/dso_conf.h" . "> " . $OPENSSL_PATH . "/../../Include/crypto/dso_conf.h" ) == 0 || die "Cannot copy dso_conf.h!"; print "Done!\n"; print "\nProcessing Files Done!\n"; exit(0);