|
| 1 | +#!/usr/bin/env bash |
| 2 | + |
| 3 | +set -e |
| 4 | + |
| 5 | +export CXXFLAGS='' |
| 6 | +export LDFLAGS='' |
| 7 | + |
| 8 | +# BoringSSL build as described in the Security Policy for BoringCrypto module (2022-05-06): |
| 9 | +# https://csrc.nist.gov/CSRC/media/projects/cryptographic-module-validation-program/documents/security-policies/140sp4407.pdf |
| 10 | + |
| 11 | +OS=`uname` |
| 12 | +ARCH=`uname -m` |
| 13 | +# This works only on Linux-x86_64, Linux-ppc64le, and Linux-aarch64. |
| 14 | + |
| 15 | +if [[ "$OS" != "Linux" || ("$ARCH" != "x86_64" && "$ARCH" != "aarch64" && "$ARCH" != "ppc64le") ]]; then |
| 16 | + echo "ERROR: AWS-LC FIPS is currently supported only on Linux-x86_64, Linux-ppc64le, and Linux-aarch64." |
| 17 | + exit 1 |
| 18 | +fi |
| 19 | + |
| 20 | + |
| 21 | +# Bazel magic. |
| 22 | +# ROOT=$(dirname $(rootpath boringssl/BUILDING.md))/.. |
| 23 | +ROOT=./external |
| 24 | +pushd "$ROOT" |
| 25 | + |
| 26 | +# Build tools requirements (from section 12.1 of https://csrc.nist.gov/CSRC/media/projects/cryptographic-module-validation-program/documents/security-policies/140sp4407.pdf): |
| 27 | +# - Clang compiler version 12.0.0 (https://releases.llvm.org/download.html) |
| 28 | +# - Go programming language version 1.16.5 (https://golang.org/dl/) |
| 29 | +# - Ninja build system version 1.10.2 (https://github.com/ninja-build/ninja/releases) |
| 30 | +# - Cmake version 3.20.1 (https://cmake.org/download/) |
| 31 | + |
| 32 | +# Override $PATH for build tools, to avoid picking up anything else. |
| 33 | +export PATH="$(dirname `which cmake`):/usr/bin:/bin" |
| 34 | + |
| 35 | +# Clang |
| 36 | +VERSION=14.0.0 |
| 37 | +if [[ "$ARCH" == "x86_64" ]]; then |
| 38 | + PLATFORM="x86_64-linux-gnu-ubuntu-20.04" |
| 39 | + SHA256=61582215dafafb7b576ea30cc136be92c877ba1f1c31ddbbd372d6d65622fef5 |
| 40 | +elif [[ "$ARCH" == "ppc64le" ]]; then |
| 41 | + PLATFORM="powerpc64le-linux-ubuntu-18.04" |
| 42 | + SHA256=2d504c4920885c86b306358846178bc2232dfac83b47c3b1d05861a8162980e6 |
| 43 | +else |
| 44 | + PLATFORM="aarch64-linux-gnu" |
| 45 | + SHA256=1792badcd44066c79148ffeb1746058422cc9d838462be07e3cb19a4b724a1ee |
| 46 | +fi |
| 47 | + |
| 48 | +curl -sLO https://github.com/llvm/llvm-project/releases/download/llvmorg-"$VERSION"/clang+llvm-"$VERSION"-"$PLATFORM".tar.xz |
| 49 | +tar xf clang+llvm-"$VERSION"-"$PLATFORM".tar.xz |
| 50 | + |
| 51 | +export HOME="$PWD" |
| 52 | +printf "set(CMAKE_C_COMPILER \"clang\")\nset(CMAKE_CXX_COMPILER \"clang++\")\n" > ${HOME}/toolchain |
| 53 | +export PATH="$PWD/clang+llvm-$VERSION-$PLATFORM/bin:$PATH" |
| 54 | + |
| 55 | +if [[ `clang --version | head -1 | awk '{print $3}'` != "$VERSION" ]]; then |
| 56 | + echo "ERROR: Clang version doesn't match. Expected: ${VERSION}, Got: $(clang --version)" |
| 57 | + exit 1 |
| 58 | +fi |
| 59 | + |
| 60 | +# Go |
| 61 | +VERSION=1.18.1 |
| 62 | +if [[ "$ARCH" == "x86_64" ]]; then |
| 63 | + PLATFORM="linux-amd64" |
| 64 | + SHA256=b3b815f47ababac13810fc6021eb73d65478e0b2db4b09d348eefad9581a2334 |
| 65 | +elif [[ "$ARCH" == "ppc64le" ]]; then |
| 66 | + PLATFORM="linux-ppc64le" |
| 67 | + SHA256=33db623d1eecf362fe365107c12efc90eff0b9609e0b3345e258388019cb552a |
| 68 | +else |
| 69 | + PLATFORM="linux-arm64" |
| 70 | + SHA256=56a91851c97fb4697077abbca38860f735c32b38993ff79b088dac46e4735633 |
| 71 | +fi |
| 72 | + |
| 73 | +curl -sLO https://dl.google.com/go/go"$VERSION"."$PLATFORM".tar.gz \ |
| 74 | + && echo "$SHA256" go"$VERSION"."$PLATFORM".tar.gz | sha256sum --check |
| 75 | +tar xf go"$VERSION"."$PLATFORM".tar.gz |
| 76 | + |
| 77 | +export GOPATH="$PWD/gopath" |
| 78 | +export GOROOT="$PWD/go" |
| 79 | +export PATH="$GOPATH/bin:$GOROOT/bin:$PATH" |
| 80 | + |
| 81 | +if [[ `go version | awk '{print $3}'` != "go$VERSION" ]]; then |
| 82 | + echo "ERROR: Go version doesn't match." |
| 83 | + exit 1 |
| 84 | +fi |
| 85 | + |
| 86 | +# Ninja |
| 87 | +VERSION=1.10.2 |
| 88 | +SHA256=ce35865411f0490368a8fc383f29071de6690cbadc27704734978221f25e2bed |
| 89 | +curl -sLO https://github.com/ninja-build/ninja/archive/refs/tags/v"$VERSION".tar.gz \ |
| 90 | + && echo "$SHA256" v"$VERSION".tar.gz | sha256sum --check |
| 91 | +tar -xvf v"$VERSION".tar.gz |
| 92 | +cd ninja-"$VERSION" |
| 93 | +python3 ./configure.py --bootstrap |
| 94 | + |
| 95 | +export PATH="$PWD:$PATH" |
| 96 | + |
| 97 | +if [[ `ninja --version` != "$VERSION" ]]; then |
| 98 | + echo "ERROR: Ninja version doesn't match." |
| 99 | + exit 1 |
| 100 | +fi |
| 101 | +cd .. |
| 102 | + |
| 103 | +# CMake |
| 104 | +VERSION=3.22.1 |
| 105 | +if [[ "$ARCH" != "ppc64le" ]]; then |
| 106 | + if [[ "$ARCH" == "x86_64" ]]; then |
| 107 | + PLATFORM="linux-x86_64" |
| 108 | + SHA256=73565c72355c6652e9db149249af36bcab44d9d478c5546fd926e69ad6b43640 |
| 109 | + else |
| 110 | + PLATFORM="linux-aarch64" |
| 111 | + SHA256=601443375aa1a48a1a076bda7e3cca73af88400463e166fffc3e1da3ce03540b |
| 112 | + fi |
| 113 | + |
| 114 | + curl -sLO https://github.com/Kitware/CMake/releases/download/v"$VERSION"/cmake-"$VERSION"-"$PLATFORM".tar.gz \ |
| 115 | + && echo "$SHA256" cmake-"$VERSION"-"$PLATFORM".tar.gz | sha256sum --check |
| 116 | + tar xf cmake-"$VERSION"-"$PLATFORM".tar.gz |
| 117 | + export PATH="$PWD/cmake-$VERSION-$PLATFORM/bin:$PATH" |
| 118 | +else |
| 119 | + PLATFORM="linux-ppc64le" |
| 120 | + echo "Building cmake for ppc64le" |
| 121 | + |
| 122 | + curl -sL -o cmake-$VERSION-$PLATFORM.tar.gz https://github.com/Kitware/CMake/releases/download/v"$VERSION"/cmake-"$VERSION".tar.gz |
| 123 | + tar xf cmake-"$VERSION"-"$PLATFORM".tar.gz |
| 124 | + |
| 125 | + cd cmake-"$VERSION" |
| 126 | + ./bootstrap && make |
| 127 | + export PATH="$PWD/bin:$PATH" |
| 128 | + cd .. |
| 129 | +fi |
| 130 | + |
| 131 | +if [[ `cmake --version | head -n1` != "cmake version $VERSION" ]]; then |
| 132 | + echo "PATH: $PATH" |
| 133 | + echo "PLATFORM: $PLATFORM" |
| 134 | + echo "ERROR: CMake version doesn't match. Expected: ${VERSION}, Got: $(cmake --version | head -n1)" |
| 135 | + exit 1 |
| 136 | +fi |
| 137 | + |
| 138 | +echo "Cmake installed successfully" |
| 139 | +echo "PWD: $PWD" |
| 140 | + |
| 141 | +# Clean after previous build. |
| 142 | +rm -rf aws_lc/build |
| 143 | + |
| 144 | +# Build BoringSSL. |
| 145 | +cd aws_lc |
| 146 | + |
| 147 | +# Setting -fPIC only affects the compilation of the non-module code in libcrypto.a, |
| 148 | +# because the FIPS module itself is already built with -fPIC. |
| 149 | +mkdir build && cd build && cmake -GNinja -DCMAKE_TOOLCHAIN_FILE=${HOME}/toolchain -DFIPS=1 -DCMAKE_BUILD_TYPE=Release -DCMAKE_C_FLAGS="-fPIC" -DCMAKE_CXX_FLAGS="-fPIC" .. |
| 150 | +ninja |
| 151 | +export GTEST_FILTER="-SSLTest.HostMatching" |
| 152 | +#ninja run_tests |
| 153 | +./crypto/crypto_test |
| 154 | + |
| 155 | +echo "created build directory and built aws_lc with ninja" |
| 156 | + |
| 157 | +# Verify correctness of the FIPS build. |
| 158 | +if [[ `tool/bssl isfips` != "1" ]]; then |
| 159 | + echo "ERROR: BoringSSL tool didn't report FIPS build." |
| 160 | + exit 1 |
| 161 | +fi |
| 162 | + |
| 163 | +# Move compiled libraries to the expected destinations. |
| 164 | +popd |
| 165 | +mv $ROOT/aws_lc/build/crypto/libcrypto.a $1 |
| 166 | +mv $ROOT/aws_lc/build/ssl/libssl.a $2 |
0 commit comments