6 # We don't use a secret keyring, of course, but gpg panics and 
   7 # implodes if there isn't one available 
   8 SECRETKEYRING
="$(mktemp)" 
   9 trap "rm -f '${SECRETKEYRING}'" 0 HUP INT QUIT ILL ABRT FPE SEGV PIPE TERM
 
  10 GPG_CMD
="gpg --ignore-time-conflict --no-options --no-default-keyring --secret-keyring ${SECRETKEYRING}" 
  12 if [ "$(id -u)" -eq 0 ]; then 
  13         # we could use a tmpfile here too, but creation of this tends to be time-consuming 
  14         GPG_CMD
="$GPG_CMD --trustdb-name /etc/apt/trustdb.gpg" 
  21 MASTER_KEYRING
=/usr
/share
/keyrings
/ubuntu
-master-keyring.gpg
 
  22 ARCHIVE_KEYRING
=/usr
/share
/keyrings
/ubuntu
-archive-keyring.gpg
 
  23 REMOVED_KEYS
=/usr
/share
/keyrings
/ubuntu
-archive-removed-keys.gpg
 
  24 ARCHIVE_KEYRING_URI
=http
://archive.ubuntu.com
/ubuntu
/project
/ubuntu
-archive-keyring.gpg
 
  25 TMP_KEYRING
=/var
/lib
/apt
/keyrings
/maybe
-import-keyring.gpg
 
  28         if [ "$(id -u)" -ne 0 ]; then 
  29                 echo >&1 "ERROR: This command can only be used by root." 
  34 add_keys_with_verify_against_master_keyring
() { 
  38     if [ ! -f "$ADD_KEYRING" ]; then 
  39         echo "ERROR: '$ADD_KEYRING' not found" 
  42     if [ ! -f "$MASTER" ]; then 
  43         echo "ERROR: '$MASTER' not found" 
  47     # when adding new keys, make sure that the archive-master-keyring 
  49     #   all keys that are exported must have a valid signature 
  50     #   from a key in the $distro-master-keyring 
  51     add_keys
=`$GPG_CMD --keyring $ADD_KEYRING --with-colons --list-keys | grep ^pub | cut -d: -f5` 
  52     master_keys
=`$GPG_CMD --keyring $MASTER --with-colons --list-keys | grep ^pub | cut -d: -f5` 
  54     for add_key 
in $add_keys; do 
  56         # ensure there are no colisions LP: #857472 
  57         for master_key 
in $master_keys; do 
  58             if [ "$add_key" = "$master_key" ]; then 
  59                 echo >&2 "Keyid collision for '$add_key' detected, operation aborted" 
  64         # export the add keyring one-by-one 
  66         $GPG_CMD --keyring $ADD_KEYRING --output $TMP_KEYRING --export $add_key  
  67         # check if signed with the master key and only add in this case 
  69         for master_key 
in $master_keys; do 
  70             if $GPG_CMD --keyring $MASTER --keyring $TMP_KEYRING --check-sigs --with-colons $add_key | grep '^sig:!:' | cut 
-d: -f5 | grep -q $master_key; then 
  71                 $GPG --import $TMP_KEYRING 
  75         if [ $ADDED = 0 ]; then 
  76             echo >&2 "Key '$add_key' not added. It is not signed with a master key" 
  82 # update the current archive signing keyring from a network URI 
  83 # the archive-keyring keys needs to be signed with the master key 
  84 # (otherwise it does not make sense from a security POV) 
  87     if [ -z "$ARCHIVE_KEYRING_URI" ]; then 
  88         echo >&2 "ERROR: Your distribution is not supported in net-update as no uri for the archive-keyring is set" 
  92     # in theory we would need to depend on wget for this, but this feature 
  93     # isn't useable in debian anyway as we have no keyring uri nor a master key 
  94     if ! which wget 
>/dev
/null 
2>&1; then 
  95         echo >&2 "ERROR: an installed wget is required for a network-based update" 
  98     if [ ! -d /var
/lib
/apt
/keyrings 
]; then 
  99         mkdir -p /var
/lib
/apt
/keyrings
 
 101     keyring
=/var
/lib
/apt
/keyrings
/$(basename $ARCHIVE_KEYRING) 
 103     if [ -e $keyring ]; then 
 104         old_mtime
=$(stat -c %Y $keyring) 
 106     (cd  /var
/lib
/apt
/keyrings
; wget 
--timeout=90 -q -N $ARCHIVE_KEYRING_URI) 
 107     if [ ! -e $keyring ]; then 
 110     new_mtime
=$(stat -c %Y $keyring) 
 111     if [ $new_mtime -ne $old_mtime ]; then 
 112         echo "Checking for new archive signing keys now" 
 113         add_keys_with_verify_against_master_keyring 
$keyring $MASTER_KEYRING 
 118     if [ ! -f $ARCHIVE_KEYRING ]; then 
 119         echo >&2 "ERROR: Can't find the archive-keyring" 
 120         echo >&2 "Is the ubuntu-keyring package installed?" 
 125     # add new keys from the package; 
 127     # we do not use add_keys_with_verify_against_master_keyring here, 
 128     # because "update" is run on regular package updates.  A 
 129     # attacker might as well replace the master-archive-keyring file 
 130     # in the package and add his own keys. so this check wouldn't 
 131     # add any security. we *need* this check on net-update though 
 132     $GPG_CMD --quiet --batch --keyring $ARCHIVE_KEYRING --export | $GPG --import 
 134     if [ -r "$REMOVED_KEYS" ]; then 
 135         # remove no-longer supported/used keys 
 136         keys
=`$GPG_CMD --keyring $REMOVED_KEYS --with-colons --list-keys | grep ^pub | cut -d: -f5` 
 138             if $GPG --list-keys --with-colons | grep ^pub 
| cut 
-d: -f5 | grep -q $key; then 
 139                 $GPG --quiet --batch --delete-key --yes ${key} 
 143         echo "Warning: removed keys keyring  $REMOVED_KEYS missing or not readable" >&2 
 149     echo "Usage: apt-key [--keyring file] [command] [arguments]" 
 151     echo "Manage apt's list of trusted keys" 
 153     echo "  apt-key add <file>          - add the key contained in <file> ('-' for stdin)" 
 154     echo "  apt-key del <keyid>         - remove the key <keyid>" 
 155     echo "  apt-key export <keyid>      - output the key <keyid>" 
 156     echo "  apt-key exportall           - output all trusted keys" 
 157     echo "  apt-key update              - update keys using the keyring package" 
 158     echo "  apt-key net-update          - update keys using the network" 
 159     echo "  apt-key list                - list keys" 
 160     echo "  apt-key finger              - list fingerprints" 
 161     echo "  apt-key adv                 - pass advanced options to gpg (download key)" 
 163     echo "If no specific keyring file is given the command applies to all keyring files." 
 166 # Determine on which keyring we want to work 
 167 if [ "$1" = "--keyring" ]; then 
 168         #echo "keyfile given" 
 171         if [ -r "$TRUSTEDFILE" ]; then 
 172                 GPG
="$GPG --keyring $TRUSTEDFILE --primary-keyring $TRUSTEDFILE" 
 174                 echo >&2 "Error: The specified keyring »$TRUSTEDFILE« is missing or not readable" 
 178 # otherwise use the default 
 180         #echo "generate list" 
 181         TRUSTEDFILE
="/etc/apt/trusted.gpg" 
 182         eval $(apt-config shell TRUSTEDFILE Apt::GPGV::TrustedKeyring) 
 183         eval $(apt-config shell TRUSTEDFILE Dir::Etc::Trusted/f) 
 184         if [ -r "$TRUSTEDFILE" ]; then 
 185                 GPG
="$GPG --keyring $TRUSTEDFILE" 
 187         GPG
="$GPG --primary-keyring $TRUSTEDFILE" 
 188         TRUSTEDPARTS
="/etc/apt/trusted.gpg.d" 
 189         eval $(apt-config shell TRUSTEDPARTS Dir::Etc::TrustedParts/d) 
 190         if [ -d "$TRUSTEDPARTS" ]; then 
 192                 for trusted 
in $(run-parts --list $TRUSTEDPARTS --regex '^.*\.gpg$'); do 
 193                         #echo "part -> $trusted" 
 194                         GPG
="$GPG --keyring $trusted" 
 198 #echo "COMMAND: $GPG" 
 201 if [ -z "$command" ]; then 
 207 if [ "$command" != "help" ] && ! which gpg 
>/dev
/null 
2>&1; then 
 208     echo >&2 "Warning: gnupg does not seem to be installed." 
 209     echo >&2 "Warning: apt-key requires gnupg for most operations." 
 216         $GPG --quiet --batch --import "$1" 
 221         $GPG --quiet --batch --delete-key --yes "$1" 
 231         $GPG --batch --list-keys 
 234         $GPG --batch --fingerprint 
 237         $GPG --armor --export "$1" 
 240         $GPG --armor --export 
 243         echo "Executing: $GPG $*"