8 echo "Usage: $0 filename version arch changes_file suite"
12 IN_TARBALL="$1" # Tarball to read, compressed with xz
15 CHANGES="$4" # Changes file for the upload
23 export OPENSSL_CONF=/dev/null
25 # Read dak configuration for security or main archive
27 /srv/security-master.debian.org/*)
28 configdir="/srv/security-master.debian.org/dak/config/debian-security"
30 /srv/ftp-master.debian.org/*)
31 configdir="/srv/ftp-master.debian.org/dak/config/debian"
34 error "$0: Can't tell if security or not"
39 # Read and trivially validate our configuration
40 . "$configdir/byhand-code-sign.conf"
41 for var in EFI_BINARY_PRIVKEY EFI_BINARY_CERT \
42 LINUX_SIGNFILE LINUX_MODULE_PRIVKEY LINUX_MODULE_CERT; do
43 test -v $var || error "$var is not defined in configuration"
44 test -n "${!var}" || error "$var is empty in configuration"
47 TARGET="$ftpdir/dists/$SUITE/main/code-sign/"
48 OUT_TARBALL="$TARGET/${IN_TARBALL##*/}"
49 OUT_TARBALL="${OUT_TARBALL%.tar.xz}_sigs.tar.xz"
51 # Check that this source/arch/version hasn't already been signed
52 if [ -e "$OUT_TARBALL" ]; then
53 error "Signature tarball already exists: $OUT_TARBALL"
56 # If we fail somewhere, cleanup the temporary directories
61 for dir in "$IN_DIR" "$OUT_DIR" "$CERT_DIR"; do
62 test -z "$dir" || rm -rf "$dir"
67 # Extract the data into the input directory
68 IN_DIR="$(mktemp -td byhand-code-sign-in.XXXXXX)"
69 tar xaf "$IN_TARBALL" --directory="$IN_DIR"
71 case "$EFI_BINARY_PRIVKEY" in
73 # Translate from OpenSSL PKCS#11 enigne syntax to pesign parameters
74 # See: https://sources.debian.net/src/engine-pkcs11/0.2.2-1/src/engine_pkcs11.c
78 for kv in ${EFI_BINARY_PRIVKEY#pkcs11:}; do
81 pkcs11_token="${kv#*=}"
84 pkcs11_object="${kv#*=}"
87 pkcs11_pin_value="${kv#*=}"
94 PESIGN_PARAMS=(-t "$pkcs11_token" -c "$pkcs11_object")
97 # Create certificate store for pesign
98 CERT_DIR="$(mktemp -td byhand-code-sign-cert.XXXXXX)"
100 mkdir "$CERT_DIR/store"
101 certutil -N --empty-password -d "$CERT_DIR/store"
102 openssl pkcs12 -export \
103 -inkey "$EFI_BINARY_PRIVKEY" -in "$EFI_BINARY_CERT" \
104 -out "$CERT_DIR/efi-image.p12" -passout pass: \
106 pk12util -i "$CERT_DIR/efi-image.p12" -d "$CERT_DIR/store" -K '' -W ''
107 PESIGN_PARAMS=(-n "$CERT_DIR/store" -c efi-image)
111 # Create hierarchy of detached signatures in parallel to the uploaded files
112 OUT_DIR="$(mktemp -td byhand-code-sign-out.XXXXXX)"
113 while read filename; do
114 mkdir -p "$OUT_DIR/${filename%/*}"
115 case "${filename##*/}" in
117 pesign -i "$IN_DIR/$filename" \
118 --export-signature "$OUT_DIR/$filename.sig" --sign \
119 -d sha256 "${PESIGN_PARAMS[@]}"
122 "$LINUX_SIGNFILE" -d sha256 "$LINUX_MODULE_PRIVKEY" \
123 "$LINUX_MODULE_CERT" "$IN_DIR/$filename"
124 mv "$IN_DIR/$filename.p7s" "$OUT_DIR/$filename.sig"
127 echo >&2 "W: Not signing unrecognised file: $filename"
131 if [ ${#filename} -gt 60 ]; then
132 filename_trunc="...${filename:$((${#filename} - 57)):57}"
134 filename_trunc="$filename"
136 printf 'I: Signed %-60s\r' "$filename_trunc"
137 done < <(find "$IN_DIR" -type f -printf '%P\n')
139 # Clear last progress message
142 # Build tarball of signatures
143 chmod -R a+rX "$OUT_DIR"
145 tar caf "$OUT_TARBALL" --directory="$OUT_DIR" .
146 echo "I: Created $OUT_TARBALL"