changelog shortlog graph tags branches changeset files file revisions raw help

Mercurial > infra / annotate scripts/get-linux.sh

changeset 229: 989b1b4782dc
parent: 745d8b0118e5
author: Richard Westhaver <ellis@rwest.io>
date: Sat, 25 May 2024 23:17:00 -0400
permissions: -rwxr-xr-x
description: scripts update
37
ellis <ellis@rwest.io>
parents: 21
diff changeset
1
 #!/usr/bin/env bash
3
ellis <ellis@rwest.io>
parents: 1
diff changeset
2
 # get-linux
21
3491c1d1815d script fixes
ellis <ellis@rwest.io>
parents: 3
diff changeset
3
 
3
ellis <ellis@rwest.io>
parents: 1
diff changeset
4
 # from https://git.kernel.org/pub/scm/linux/kernel/git/mricon/korg-helpers.git/tree/get-verified-tarball
21
3491c1d1815d script fixes
ellis <ellis@rwest.io>
parents: 3
diff changeset
5
 
3491c1d1815d script fixes
ellis <ellis@rwest.io>
parents: 3
diff changeset
6
 # there are minimal modifications to this script - be careful, it
3491c1d1815d script fixes
ellis <ellis@rwest.io>
parents: 3
diff changeset
7
 # pulls from the upstream kernel source archives.
3491c1d1815d script fixes
ellis <ellis@rwest.io>
parents: 3
diff changeset
8
 
0
ellis <ellis@rwest.io>
parents:
diff changeset
9
 # --------------------
ellis <ellis@rwest.io>
parents:
diff changeset
10
 # Get Linux kernel tarball and cryptographically verify it,
ellis <ellis@rwest.io>
parents:
diff changeset
11
 # retrieving the PGP keys using the Web Key Directory (WKD)
ellis <ellis@rwest.io>
parents:
diff changeset
12
 # protocol if they are not already in the keyring.
ellis <ellis@rwest.io>
parents:
diff changeset
13
 #
ellis <ellis@rwest.io>
parents:
diff changeset
14
 # Pass the kernel version as the only parameter, or
ellis <ellis@rwest.io>
parents:
diff changeset
15
 # we'll grab the latest stable kernel.
ellis <ellis@rwest.io>
parents:
diff changeset
16
 #
3
ellis <ellis@rwest.io>
parents: 1
diff changeset
17
 # Example: ./get-linux 4.4.145
0
ellis <ellis@rwest.io>
parents:
diff changeset
18
 #
ellis <ellis@rwest.io>
parents:
diff changeset
19
 # Configurable parameters
ellis <ellis@rwest.io>
parents:
diff changeset
20
 # -----------------------
ellis <ellis@rwest.io>
parents:
diff changeset
21
 # What kernel version do you want?
ellis <ellis@rwest.io>
parents:
diff changeset
22
 HOST_VER=$(uname -r | cut -d- -f1)
ellis <ellis@rwest.io>
parents:
diff changeset
23
 VER="${1:-$HOST_VER}"
ellis <ellis@rwest.io>
parents:
diff changeset
24
 
ellis <ellis@rwest.io>
parents:
diff changeset
25
 # Where to download the tarball and verification data.
229
989b1b4782dc scripts update
Richard Westhaver <ellis@rwest.io>
parents: 37
diff changeset
26
 TARGETDIR=${2:-.stash/src/linux-$VER}
0
ellis <ellis@rwest.io>
parents:
diff changeset
27
 
ellis <ellis@rwest.io>
parents:
diff changeset
28
 # For CI and other automated infrastructure, you may want to
ellis <ellis@rwest.io>
parents:
diff changeset
29
 # create a keyring containing the keys belonging to:
ellis <ellis@rwest.io>
parents:
diff changeset
30
 #  - autosigner@kernel.org
ellis <ellis@rwest.io>
parents:
diff changeset
31
 #  - torvalds@kernel.org
ellis <ellis@rwest.io>
parents:
diff changeset
32
 #  - gregkh@kernel.org
ellis <ellis@rwest.io>
parents:
diff changeset
33
 #
ellis <ellis@rwest.io>
parents:
diff changeset
34
 # To generate the keyring with these keys, do:
ellis <ellis@rwest.io>
parents:
diff changeset
35
 #   gpg --export autosigner@ torvalds@ gregkh@ > keyring.gpg
ellis <ellis@rwest.io>
parents:
diff changeset
36
 #   (or use full keyids for maximum certainty)
ellis <ellis@rwest.io>
parents:
diff changeset
37
 #
ellis <ellis@rwest.io>
parents:
diff changeset
38
 # Once you have keyring.gpg, install it on your CI system and set
ellis <ellis@rwest.io>
parents:
diff changeset
39
 # USEKEYRING to the full path to it. If unset, we generate our own
ellis <ellis@rwest.io>
parents:
diff changeset
40
 # from GNUPGHOME.
ellis <ellis@rwest.io>
parents:
diff changeset
41
 # need to run make linux-keys first
ellis <ellis@rwest.io>
parents:
diff changeset
42
 USEKEYRING=${3}
ellis <ellis@rwest.io>
parents:
diff changeset
43
 
ellis <ellis@rwest.io>
parents:
diff changeset
44
 # If you set this to empty value, we'll make a temporary
ellis <ellis@rwest.io>
parents:
diff changeset
45
 # directory and fetch the verification keys from the
ellis <ellis@rwest.io>
parents:
diff changeset
46
 # Web Key Directory each time. Also, see the USEKEYRING=
ellis <ellis@rwest.io>
parents:
diff changeset
47
 # configuration option for an alternative that doesn't
ellis <ellis@rwest.io>
parents:
diff changeset
48
 # rely on WKD.
ellis <ellis@rwest.io>
parents:
diff changeset
49
 GNUPGHOME="$HOME/.gnupg"
ellis <ellis@rwest.io>
parents:
diff changeset
50
 
ellis <ellis@rwest.io>
parents:
diff changeset
51
 # Point this at your GnuPG binary version 2.1.11 or above.
ellis <ellis@rwest.io>
parents:
diff changeset
52
 # If you are using USEKEYRING, GnuPG-1 will work, too.
ellis <ellis@rwest.io>
parents:
diff changeset
53
 GPGBIN="/usr/bin/gpg2"
ellis <ellis@rwest.io>
parents:
diff changeset
54
 GPGVBIN="/usr/bin/gpgv2"
ellis <ellis@rwest.io>
parents:
diff changeset
55
 # We need a compatible version of sha256sum, too
ellis <ellis@rwest.io>
parents:
diff changeset
56
 SHA256SUMBIN="/usr/bin/sha256sum"
ellis <ellis@rwest.io>
parents:
diff changeset
57
 # And curl
ellis <ellis@rwest.io>
parents:
diff changeset
58
 CURLBIN="/usr/bin/curl"
ellis <ellis@rwest.io>
parents:
diff changeset
59
 # And we need the xz binary
ellis <ellis@rwest.io>
parents:
diff changeset
60
 XZBIN="/usr/bin/xz"
ellis <ellis@rwest.io>
parents:
diff changeset
61
 
ellis <ellis@rwest.io>
parents:
diff changeset
62
 # You shouldn't need to modify this, unless someone
ellis <ellis@rwest.io>
parents:
diff changeset
63
 # other than Linus or Greg start releasing kernels.
ellis <ellis@rwest.io>
parents:
diff changeset
64
 DEVKEYS="torvalds@kernel.org gregkh@kernel.org"
ellis <ellis@rwest.io>
parents:
diff changeset
65
 # Don't add this to DEVKEYS, as it plays a wholly
ellis <ellis@rwest.io>
parents:
diff changeset
66
 # different role and is NOT a key that should be used
ellis <ellis@rwest.io>
parents:
diff changeset
67
 # to verify kernel tarball signatures (just the checksums).
ellis <ellis@rwest.io>
parents:
diff changeset
68
 SHAKEYS="autosigner@kernel.org"
ellis <ellis@rwest.io>
parents:
diff changeset
69
 
ellis <ellis@rwest.io>
parents:
diff changeset
70
 if [[ -z ${VER} ]]; then
ellis <ellis@rwest.io>
parents:
diff changeset
71
     # Assume you want the latest stable
ellis <ellis@rwest.io>
parents:
diff changeset
72
     VER=$(${CURLBIN} -sL https://www.kernel.org/finger_banner \
ellis <ellis@rwest.io>
parents:
diff changeset
73
           | grep 'latest stable version' \
ellis <ellis@rwest.io>
parents:
diff changeset
74
           | awk -F: '{gsub(/ /,"", $0); print $2}')
ellis <ellis@rwest.io>
parents:
diff changeset
75
 fi
ellis <ellis@rwest.io>
parents:
diff changeset
76
 if [[ -z ${VER} ]]; then
ellis <ellis@rwest.io>
parents:
diff changeset
77
     echo "Could not figure out the latest stable version."
ellis <ellis@rwest.io>
parents:
diff changeset
78
     exit 1
ellis <ellis@rwest.io>
parents:
diff changeset
79
 fi
ellis <ellis@rwest.io>
parents:
diff changeset
80
 
ellis <ellis@rwest.io>
parents:
diff changeset
81
 MAJOR="$(echo ${VER} | cut -d. -f1)"
ellis <ellis@rwest.io>
parents:
diff changeset
82
 if [[ ${MAJOR} -lt 3 ]]; then
ellis <ellis@rwest.io>
parents:
diff changeset
83
     echo "This script only supports kernel v3.x.x and above"
ellis <ellis@rwest.io>
parents:
diff changeset
84
     exit 1
ellis <ellis@rwest.io>
parents:
diff changeset
85
 fi
ellis <ellis@rwest.io>
parents:
diff changeset
86
 
ellis <ellis@rwest.io>
parents:
diff changeset
87
 if [[ ! -d ${TARGETDIR} ]]; then
ellis <ellis@rwest.io>
parents:
diff changeset
88
     echo "${TARGETDIR} does not exist"
ellis <ellis@rwest.io>
parents:
diff changeset
89
     exit 1
ellis <ellis@rwest.io>
parents:
diff changeset
90
 fi
ellis <ellis@rwest.io>
parents:
diff changeset
91
 
ellis <ellis@rwest.io>
parents:
diff changeset
92
 TARGET="${TARGETDIR}/linux-${VER}.tar.xz"
ellis <ellis@rwest.io>
parents:
diff changeset
93
 # Do we already have this file?
ellis <ellis@rwest.io>
parents:
diff changeset
94
 if [[ -f ${TARGET} ]]; then
ellis <ellis@rwest.io>
parents:
diff changeset
95
     echo "File ${TARGETDIR}/linux-${VER}.tar.xz already exists."
ellis <ellis@rwest.io>
parents:
diff changeset
96
     exit 0
ellis <ellis@rwest.io>
parents:
diff changeset
97
 fi
ellis <ellis@rwest.io>
parents:
diff changeset
98
 
ellis <ellis@rwest.io>
parents:
diff changeset
99
 # Start by making sure our GnuPG environment is sane
ellis <ellis@rwest.io>
parents:
diff changeset
100
 if [[ ! -x ${GPGBIN} ]]; then
ellis <ellis@rwest.io>
parents:
diff changeset
101
     echo "Could not find gpg in ${GPGBIN}"
ellis <ellis@rwest.io>
parents:
diff changeset
102
     exit 1
ellis <ellis@rwest.io>
parents:
diff changeset
103
 fi
ellis <ellis@rwest.io>
parents:
diff changeset
104
 if [[ ! -x ${GPGVBIN} ]]; then
ellis <ellis@rwest.io>
parents:
diff changeset
105
     echo "Could not find gpgv in ${GPGVBIN}"
ellis <ellis@rwest.io>
parents:
diff changeset
106
     exit 1
ellis <ellis@rwest.io>
parents:
diff changeset
107
 fi
ellis <ellis@rwest.io>
parents:
diff changeset
108
 
3
ellis <ellis@rwest.io>
parents: 1
diff changeset
109
 # NOTE 2023-11-19: we make a folder in /tmp/ due to a strange bug
ellis <ellis@rwest.io>
parents: 1
diff changeset
110
 # encountered when using the TARGETDIR. Need to test on 
ellis <ellis@rwest.io>
parents: 1
diff changeset
111
 TMPDIR=$(mktemp -d)
0
ellis <ellis@rwest.io>
parents:
diff changeset
112
 echo "Using TMPDIR=${TMPDIR}"
ellis <ellis@rwest.io>
parents:
diff changeset
113
 # Are we using a keyring?
ellis <ellis@rwest.io>
parents:
diff changeset
114
 if [[ -z ${USEKEYRING} ]]; then
ellis <ellis@rwest.io>
parents:
diff changeset
115
     if [[ -z ${GNUPGHOME} ]]; then
ellis <ellis@rwest.io>
parents:
diff changeset
116
         GNUPGHOME="${TMPDIR}/gnupg"
ellis <ellis@rwest.io>
parents:
diff changeset
117
     elif [[ ! -d ${GNUPGHOME} ]]; then
ellis <ellis@rwest.io>
parents:
diff changeset
118
         echo "GNUPGHOME directory ${GNUPGHOME} does not exist"
ellis <ellis@rwest.io>
parents:
diff changeset
119
         echo -n "Create it? [Y/n]"
ellis <ellis@rwest.io>
parents:
diff changeset
120
         read YN
ellis <ellis@rwest.io>
parents:
diff changeset
121
         if [[ ${YN} == 'n' ]]; then
ellis <ellis@rwest.io>
parents:
diff changeset
122
             echo "Exiting"
ellis <ellis@rwest.io>
parents:
diff changeset
123
             rm -rf ${TMPDIR}
ellis <ellis@rwest.io>
parents:
diff changeset
124
             exit 1
ellis <ellis@rwest.io>
parents:
diff changeset
125
         fi
ellis <ellis@rwest.io>
parents:
diff changeset
126
     fi
ellis <ellis@rwest.io>
parents:
diff changeset
127
     mkdir -p -m 0700 ${GNUPGHOME}
ellis <ellis@rwest.io>
parents:
diff changeset
128
     echo "Making sure we have all the necessary keys"
ellis <ellis@rwest.io>
parents:
diff changeset
129
     ${GPGBIN} --batch --quiet \
ellis <ellis@rwest.io>
parents:
diff changeset
130
         --homedir ${GNUPGHOME} \
ellis <ellis@rwest.io>
parents:
diff changeset
131
         --auto-key-locate wkd \
ellis <ellis@rwest.io>
parents:
diff changeset
132
         --locate-keys ${DEVKEYS} ${SHAKEYS}
ellis <ellis@rwest.io>
parents:
diff changeset
133
     # If this returned non-0, we bail
ellis <ellis@rwest.io>
parents:
diff changeset
134
     if [[ $? != "0" ]]; then
ellis <ellis@rwest.io>
parents:
diff changeset
135
         echo "Something went wrong fetching keys"
ellis <ellis@rwest.io>
parents:
diff changeset
136
         rm -rf ${TMPDIR}
ellis <ellis@rwest.io>
parents:
diff changeset
137
         exit 1
ellis <ellis@rwest.io>
parents:
diff changeset
138
     fi
ellis <ellis@rwest.io>
parents:
diff changeset
139
     # Make a temporary keyring and set USEKEYRING to it
ellis <ellis@rwest.io>
parents:
diff changeset
140
     USEKEYRING=${TMPDIR}/keyring.gpg
ellis <ellis@rwest.io>
parents:
diff changeset
141
     ${GPGBIN} --batch --export ${DEVKEYS} ${SHAKEYS} > ${USEKEYRING}
ellis <ellis@rwest.io>
parents:
diff changeset
142
 fi
ellis <ellis@rwest.io>
parents:
diff changeset
143
 # Now we make two keyrings -- one for the autosigner, and
ellis <ellis@rwest.io>
parents:
diff changeset
144
 # the other for kernel developers. We do this in order to
ellis <ellis@rwest.io>
parents:
diff changeset
145
 # make sure that we never verify kernel tarballs using the
ellis <ellis@rwest.io>
parents:
diff changeset
146
 # autosigner keys, only using developer keys.
ellis <ellis@rwest.io>
parents:
diff changeset
147
 SHAKEYRING=${TMPDIR}/shakeyring.gpg
ellis <ellis@rwest.io>
parents:
diff changeset
148
 ${GPGBIN} --batch \
ellis <ellis@rwest.io>
parents:
diff changeset
149
     --no-default-keyring --keyring ${USEKEYRING} \
ellis <ellis@rwest.io>
parents:
diff changeset
150
     --export ${SHAKEYS} > ${SHAKEYRING}
ellis <ellis@rwest.io>
parents:
diff changeset
151
 DEVKEYRING=${TMPDIR}/devkeyring.gpg
ellis <ellis@rwest.io>
parents:
diff changeset
152
 ${GPGBIN} --batch \
ellis <ellis@rwest.io>
parents:
diff changeset
153
     --no-default-keyring --keyring ${USEKEYRING} \
ellis <ellis@rwest.io>
parents:
diff changeset
154
     --export ${DEVKEYS} > ${DEVKEYRING}
ellis <ellis@rwest.io>
parents:
diff changeset
155
 
ellis <ellis@rwest.io>
parents:
diff changeset
156
 # Now that we know we can verify them, grab the contents
ellis <ellis@rwest.io>
parents:
diff changeset
157
 TXZ="https://cdn.kernel.org/pub/linux/kernel/v${MAJOR}.x/linux-${VER}.tar.xz"
ellis <ellis@rwest.io>
parents:
diff changeset
158
 SIG="https://cdn.kernel.org/pub/linux/kernel/v${MAJOR}.x/linux-${VER}.tar.sign"
ellis <ellis@rwest.io>
parents:
diff changeset
159
 SHA="https://www.kernel.org/pub/linux/kernel/v${MAJOR}.x/sha256sums.asc"
ellis <ellis@rwest.io>
parents:
diff changeset
160
 
ellis <ellis@rwest.io>
parents:
diff changeset
161
 # Before we verify the developer signature, we make sure that the
ellis <ellis@rwest.io>
parents:
diff changeset
162
 # tarball matches what is on the kernel.org master. This avoids
ellis <ellis@rwest.io>
parents:
diff changeset
163
 # CDN cache poisoning that could, in theory, use vulnerabilities in
ellis <ellis@rwest.io>
parents:
diff changeset
164
 # the XZ binary to alter the verification process or compromise the
ellis <ellis@rwest.io>
parents:
diff changeset
165
 # system performing the verification.
ellis <ellis@rwest.io>
parents:
diff changeset
166
 SHAFILE=${TMPDIR}/sha256sums.asc
ellis <ellis@rwest.io>
parents:
diff changeset
167
 echo "Downloading the checksums file for linux-${VER}"
ellis <ellis@rwest.io>
parents:
diff changeset
168
 if ! ${CURLBIN} -sL -o ${SHAFILE} ${SHA}; then
ellis <ellis@rwest.io>
parents:
diff changeset
169
     echo "Failed to download the checksums file"
ellis <ellis@rwest.io>
parents:
diff changeset
170
     rm -rf ${TMPDIR}
ellis <ellis@rwest.io>
parents:
diff changeset
171
     exit 1
ellis <ellis@rwest.io>
parents:
diff changeset
172
 fi
ellis <ellis@rwest.io>
parents:
diff changeset
173
 echo "Verifying the checksums file"
ellis <ellis@rwest.io>
parents:
diff changeset
174
 COUNT=$(${GPGVBIN} --keyring=${SHAKEYRING} --status-fd=1 ${SHAFILE} \
ellis <ellis@rwest.io>
parents:
diff changeset
175
         | grep -c -E '^\[GNUPG:\] (GOODSIG|VALIDSIG)')
ellis <ellis@rwest.io>
parents:
diff changeset
176
 if [[ ${COUNT} -lt 2 ]]; then
ellis <ellis@rwest.io>
parents:
diff changeset
177
     echo "FAILED to verify the sha256sums.asc file."
ellis <ellis@rwest.io>
parents:
diff changeset
178
     rm -rf ${TMPDIR}
ellis <ellis@rwest.io>
parents:
diff changeset
179
     exit 1
ellis <ellis@rwest.io>
parents:
diff changeset
180
 fi
ellis <ellis@rwest.io>
parents:
diff changeset
181
 # Grab only the tarball we want from the full list
ellis <ellis@rwest.io>
parents:
diff changeset
182
 SHACHECK=${TMPDIR}/sha256sums.txt
ellis <ellis@rwest.io>
parents:
diff changeset
183
 grep "linux-${VER}.tar.xz" ${SHAFILE} > ${SHACHECK}
ellis <ellis@rwest.io>
parents:
diff changeset
184
 
ellis <ellis@rwest.io>
parents:
diff changeset
185
 echo
ellis <ellis@rwest.io>
parents:
diff changeset
186
 echo "Downloading the signature file for linux-${VER}"
ellis <ellis@rwest.io>
parents:
diff changeset
187
 SIGFILE=${TMPDIR}/linux-${VER}.tar.asc
ellis <ellis@rwest.io>
parents:
diff changeset
188
 if ! ${CURLBIN} -sL -o ${SIGFILE} ${SIG}; then
ellis <ellis@rwest.io>
parents:
diff changeset
189
     echo "Failed to download the signature file"
ellis <ellis@rwest.io>
parents:
diff changeset
190
     rm -rf ${TMPDIR}
ellis <ellis@rwest.io>
parents:
diff changeset
191
     exit 1
ellis <ellis@rwest.io>
parents:
diff changeset
192
 fi
ellis <ellis@rwest.io>
parents:
diff changeset
193
 echo "Downloading the XZ tarball for linux-${VER}"
ellis <ellis@rwest.io>
parents:
diff changeset
194
 TXZFILE=${TMPDIR}/linux-${VER}.tar.xz
ellis <ellis@rwest.io>
parents:
diff changeset
195
 if ! ${CURLBIN} -L -o ${TXZFILE} ${TXZ}; then
ellis <ellis@rwest.io>
parents:
diff changeset
196
     echo "Failed to download the tarball"
ellis <ellis@rwest.io>
parents:
diff changeset
197
     rm -rf ${TMPDIR}
ellis <ellis@rwest.io>
parents:
diff changeset
198
     exit 1
ellis <ellis@rwest.io>
parents:
diff changeset
199
 fi
ellis <ellis@rwest.io>
parents:
diff changeset
200
 
ellis <ellis@rwest.io>
parents:
diff changeset
201
 pushd ${TMPDIR} >/dev/null
ellis <ellis@rwest.io>
parents:
diff changeset
202
 echo "Verifying checksum on linux-${VER}.tar.xz"
ellis <ellis@rwest.io>
parents:
diff changeset
203
 if ! ${SHA256SUMBIN} -c ${SHACHECK}; then
ellis <ellis@rwest.io>
parents:
diff changeset
204
     echo "FAILED to verify the downloaded tarball checksum"
ellis <ellis@rwest.io>
parents:
diff changeset
205
     popd >/dev/null
ellis <ellis@rwest.io>
parents:
diff changeset
206
     rm -rf ${TMPDIR}
ellis <ellis@rwest.io>
parents:
diff changeset
207
     exit 1
ellis <ellis@rwest.io>
parents:
diff changeset
208
 fi
ellis <ellis@rwest.io>
parents:
diff changeset
209
 popd >/dev/null
ellis <ellis@rwest.io>
parents:
diff changeset
210
 
ellis <ellis@rwest.io>
parents:
diff changeset
211
 echo
ellis <ellis@rwest.io>
parents:
diff changeset
212
 echo "Verifying developer signature on the tarball"
ellis <ellis@rwest.io>
parents:
diff changeset
213
 COUNT=$(${XZBIN} -cd ${TXZFILE} \
ellis <ellis@rwest.io>
parents:
diff changeset
214
         | ${GPGVBIN} --keyring=${DEVKEYRING} --status-fd=1 ${SIGFILE} - \
ellis <ellis@rwest.io>
parents:
diff changeset
215
         | grep -c -E '^\[GNUPG:\] (GOODSIG|VALIDSIG)')
ellis <ellis@rwest.io>
parents:
diff changeset
216
 if [[ ${COUNT} -lt 2 ]]; then
ellis <ellis@rwest.io>
parents:
diff changeset
217
     echo "FAILED to verify the tarball!"
ellis <ellis@rwest.io>
parents:
diff changeset
218
     rm -rf ${TMPDIR}
ellis <ellis@rwest.io>
parents:
diff changeset
219
     exit 1
ellis <ellis@rwest.io>
parents:
diff changeset
220
 fi
ellis <ellis@rwest.io>
parents:
diff changeset
221
 mv -f ${TXZFILE} ${TARGET}
ellis <ellis@rwest.io>
parents:
diff changeset
222
 rm -rf ${TMPDIR}
ellis <ellis@rwest.io>
parents:
diff changeset
223
 echo
ellis <ellis@rwest.io>
parents:
diff changeset
224
 echo "Successfully downloaded and verified ${TARGET}"