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" 
  20 ARCHIVE_KEYRING_URI
="" 
  21 #MASTER_KEYRING=/usr/share/keyrings/debian-master-keyring.gpg 
  22 #ARCHIVE_KEYRING_URI=http://ftp.debian.org/debian/debian-archive-keyring.gpg 
  24 ARCHIVE_KEYRING
=/usr
/share
/keyrings
/debian
-archive-keyring.gpg
 
  25 REMOVED_KEYS
=/usr
/share
/keyrings
/debian
-archive-removed-keys.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` 
  53     for add_key 
in $add_keys; do 
  55         for master_key 
in $master_keys; do 
  56             if $GPG_CMD --keyring $ADD_KEYRING --list-sigs --with-colons $add_key | grep ^sig 
| cut 
-d: -f5 | grep -q $master_key; then 
  57                 $GPG_CMD --quiet --batch --keyring $ADD_KEYRING --export $add_key | $GPG --import 
  61         if [ $ADDED = 0 ]; then 
  62             echo >&2 "Key '$add_key' not added. It is not signed with a master key" 
  67 # update the current archive signing keyring from a network URI 
  68 # the archive-keyring keys needs to be signed with the master key 
  69 # (otherwise it does not make sense from a security POV) 
  71     if [ -z "$ARCHIVE_KEYRING_URI" ]; then 
  72         echo >&2 "ERROR: Your distribution is not supported in net-update as no uri for the archive-keyring is set" 
  76     # in theory we would need to depend on wget for this, but this feature 
  77     # isn't useable in debian anyway as we have no keyring uri nor a master key 
  78     if ! which wget 
>/dev
/null 
2>&1; then 
  79         echo >&2 "ERROR: an installed wget is required for a network-based update" 
  82     if [ ! -d /var
/lib
/apt
/keyrings 
]; then 
  83         mkdir -p /var
/lib
/apt
/keyrings
 
  85     keyring
=/var
/lib
/apt
/keyrings
/$(basename $ARCHIVE_KEYRING) 
  87     if [ -e $keyring ]; then 
  88         old_mtime
=$(stat -c %Y $keyring) 
  90     (cd  /var
/lib
/apt
/keyrings
; wget 
-q -N $ARCHIVE_KEYRING_URI) 
  91     if [ ! -e $keyring ]; then 
  94     new_mtime
=$(stat -c %Y $keyring) 
  95     if [ $new_mtime -ne $old_mtime ]; then 
  96         echo "Checking for new archive signing keys now" 
  97         add_keys_with_verify_against_master_keyring 
$keyring $MASTER_KEYRING 
 102     if [ ! -f $ARCHIVE_KEYRING ]; then 
 103         echo >&2 "ERROR: Can't find the archive-keyring" 
 104         echo >&2 "Is the debian-archive-keyring package installed?" 
 109     # add new keys from the package; 
 111     # we do not use add_keys_with_verify_against_master_keyring here, 
 112     # because "update" is run on regular package updates.  A 
 113     # attacker might as well replace the master-archive-keyring file 
 114     # in the package and add his own keys. so this check wouldn't 
 115     # add any security. we *need* this check on net-update though 
 116     $GPG_CMD --quiet --batch --keyring $ARCHIVE_KEYRING --export | $GPG --import 
 118     if [ -r "$REMOVED_KEYS" ]; then 
 119         # remove no-longer supported/used keys 
 120         keys
=`$GPG_CMD --keyring $REMOVED_KEYS --with-colons --list-keys | grep ^pub | cut -d: -f5` 
 122             if $GPG --list-keys --with-colons | grep ^pub 
| cut 
-d: -f5 | grep -q $key; then 
 123                 $GPG --quiet --batch --delete-key --yes ${key} 
 127         echo "Warning: removed keys keyring  $REMOVED_KEYS missing or not readable" >&2 
 133     echo "Usage: apt-key [--keyring file] [command] [arguments]" 
 135     echo "Manage apt's list of trusted keys" 
 137     echo "  apt-key add <file>          - add the key contained in <file> ('-' for stdin)" 
 138     echo "  apt-key del <keyid>         - remove the key <keyid>" 
 139     echo "  apt-key export <keyid>      - output the key <keyid>" 
 140     echo "  apt-key exportall           - output all trusted keys" 
 141     echo "  apt-key update              - update keys using the keyring package" 
 142     echo "  apt-key net-update          - update keys using the network" 
 143     echo "  apt-key list                - list keys" 
 144     echo "  apt-key finger              - list fingerprints" 
 145     echo "  apt-key adv                 - pass advanced options to gpg (download key)" 
 147     echo "If no specific keyring file is given the command applies to all keyring files." 
 150 # Determine on which keyring we want to work 
 151 if [ "$1" = "--keyring" ]; then 
 152         #echo "keyfile given" 
 155         if [ -r "$TRUSTEDFILE" ] || [ "$2" = 'add' ]; then 
 156                 GPG
="$GPG --keyring $TRUSTEDFILE --primary-keyring $TRUSTEDFILE" 
 158                 echo >&2 "Error: The specified keyring »$TRUSTEDFILE« is missing or not readable" 
 162 # otherwise use the default 
 164         #echo "generate list" 
 165         TRUSTEDFILE
="/etc/apt/trusted.gpg" 
 166         eval $(apt-config shell TRUSTEDFILE Apt::GPGV::TrustedKeyring) 
 167         eval $(apt-config shell TRUSTEDFILE Dir::Etc::Trusted/f) 
 168         if [ -r "$TRUSTEDFILE" ]; then 
 169                 GPG
="$GPG --keyring $TRUSTEDFILE" 
 171         GPG
="$GPG --primary-keyring $TRUSTEDFILE" 
 172         TRUSTEDPARTS
="/etc/apt/trusted.gpg.d" 
 173         eval $(apt-config shell TRUSTEDPARTS Dir::Etc::TrustedParts/d) 
 174         if [ -d "$TRUSTEDPARTS" ]; then 
 176                 for trusted 
in $(run-parts --list $TRUSTEDPARTS --regex '^.*\.gpg$'); do 
 177                         #echo "part -> $trusted" 
 178                         GPG
="$GPG --keyring $trusted" 
 182 #echo "COMMAND: $GPG" 
 185 if [ -z "$command" ]; then 
 191 if [ "$command" != "help" ] && ! which gpg 
>/dev
/null 
2>&1; then 
 192     echo >&2 "Warning: gnupg does not seem to be installed." 
 193     echo >&2 "Warning: apt-key requires gnupg for most operations." 
 200         $GPG --quiet --batch --import "$1" 
 205         $GPG --quiet --batch --delete-key --yes "$1" 
 215         $GPG --batch --list-keys 
 218         $GPG --batch --fingerprint 
 221         $GPG --armor --export "$1" 
 224         $GPG --armor --export 
 227         echo "Executing: $GPG $*"