Просмотр исходного кода

Enable recovery of gpg key from USB drive/s

Bob Mottram 9 лет назад
Родитель
Сommit
bda98ed500
2 измененных файлов: 1601 добавлений и 1457 удалений
  1. 1432
    1432
      src/freedombone-config
  2. 169
    25
      src/freedombone-recoverkey

+ 1432
- 1432
src/freedombone-config
Разница между файлами не показана из-за своего большого размера
Просмотреть файл


+ 169
- 25
src/freedombone-recoverkey Просмотреть файл

@@ -30,37 +30,43 @@
30 30
 
31 31
 FRIENDS_SERVERS_LIST=
32 32
 MY_USERNAME=
33
+GPG_USB_DRIVE='sdb1'
33 34
 
34 35
 function show_help {
35 36
     echo ''
36
-    echo 'freedombone-recoverkey -u [username] -l [friends servers list filename]'
37
+    echo 'freedombone-recoverkey -u [username] -d [drive]'
38
+    echo '                       -l [friends servers list filename]'
37 39
     echo ''
38 40
     exit 0
39 41
 }
40 42
 
41 43
 while [[ $# > 1 ]]
42 44
 do
43
-key="$1"
45
+    key="$1"
44 46
 
45
-case $key in
46
-    -h|--help)
47
-    show_help
48
-    ;;
49
-    -u|--user)
50
-    shift
51
-    MY_USERNAME="$1"
52
-    ;;
53
-    # backup list filename
54
-    # typically /home/$USER/backup.list
55
-    -l|--list)
47
+    case $key in
48
+        -h|--help)
49
+            show_help
50
+            ;;
51
+        -u|--user)
52
+            shift
53
+            MY_USERNAME="$1"
54
+            ;;
55
+        # backup list filename
56
+        # typically /home/$USER/backup.list
57
+        -l|--list)
58
+            shift
59
+            FRIENDS_SERVERS_LIST="$1"
60
+            ;;
61
+        -d|--drive)
62
+            shift
63
+            GPG_USB_DRIVE=/dev/$1
64
+            ;;
65
+        *)
66
+            # unknown option
67
+            ;;
68
+    esac
56 69
     shift
57
-    FRIENDS_SERVERS_LIST="$1"
58
-    ;;
59
-    *)
60
-    # unknown option
61
-    ;;
62
-esac
63
-shift
64 70
 done
65 71
 
66 72
 if [ ! $MY_USERNAME ]; then
@@ -82,11 +88,149 @@ fi
82 88
 
83 89
 FRAGMENTS_DIR=/home/$MY_USERNAME/.gnupg_fragments
84 90
 
85
-# find the remote backup list
86
-if [ ! $FRIENDS_SERVERS_LIST ]; then
87
-    if [ -f /home/$MY_USERNAME/backup.list ]; then
88
-        FRIENDS_SERVERS_LIST=/home/$MY_USERNAME/backup.list
91
+function reconstruct_key {
92
+    if [ ! -d /home/$MY_USERNAME/.gnupg_fragments ]; then
93
+        return
94
+    fi
95
+    cd /home/$MY_USERNAME/.gnupg_fragments
96
+    no_of_shares=$(ls -afq keyshare.asc.* | wc -l)
97
+    if (( no_of_shares < 4 )); then
98
+        dialog --title "Encryption keys" --msgbox 'Not enough fragments to reconstruct the key' 6 70
99
+        exit 7348
100
+    fi
101
+    apt-get -y install libgfshare-bin gnupg
102
+    gfcombine /home/$MY_USERNAME/.gnupg_fragments/keyshare*
103
+    if [ ! "$?" = "0" ]; then
104
+        dialog --title "Encryption keys" --msgbox 'Unable to reconstruct the key' 6 70
105
+        exit 7348
89 106
     fi
107
+
108
+    KEYS_FILE=/home/$MY_USERNAME/.gnupg_fragments/keyshare.asc
109
+    if [ ! -f $KEYS_FILE ]; then
110
+        dialog --title "Encryption keys" --msgbox 'Unable to reconstruct the key' 6 70
111
+    fi
112
+
113
+    su -c "gpg --allow-secret-key-import --import $KEYS_FILE" - $MY_USERNAME
114
+    if [ ! "$?" = "0" ]; then
115
+        echo 'Unable to import gpg key'
116
+        shred -zu $KEYS_FILE
117
+        rm -rf /home/$MY_USERNAME/.tempgnupg
118
+        exit 9654
119
+    fi
120
+    shred -zu $KEYS_FILE
121
+
122
+    dialog --title "Encryption keys" --msgbox 'Key has been reconstructed' 6 70
123
+}
124
+
125
+function interactive_gpg_from_usb {
126
+    dialog --title "Encryption keys" \
127
+           --msgbox 'Plug in a USB drive containing a copy of your full key or key fragment' 6 70
128
+
129
+    HOME_DIR=/home/$MY_USERNAME
130
+    GPG_LOADING="yes"
131
+    SSH_IMPORTED="no"
132
+    GPG_CTR=0
133
+    while [[ $GPG_LOADING == "yes" ]]
134
+    do
135
+        if [ ! -b $GPG_USB_DRIVE ]; then
136
+            GPG_USB_DRIVE='/dev/sdc1'
137
+            if [ ! -b $GPG_USB_DRIVE ]; then
138
+                GPG_USB_DRIVE='/dev/sdd1'
139
+                if [ ! -b $GPG_USB_DRIVE ]; then
140
+                    if (( GPG_CTR > 0 )); then
141
+                        reconstruct_key
142
+                        return 0
143
+                    fi
144
+                    dialog --title "Encryption keys" --msgbox 'No USB drive found' 6 30
145
+                    exit 27852
146
+                fi
147
+            fi
148
+        fi
149
+
150
+        GPG_USB_MOUNT='/mnt/usb'
151
+        umount -f $GPG_USB_MOUNT
152
+        if [ ! -d $GPG_USB_MOUNT ]; then
153
+            mkdir -p $GPG_USB_MOUNT
154
+        fi
155
+
156
+        if [ -f /dev/mapper/encrypted_usb ]; then
157
+            rm -rf /dev/mapper/encrypted_usb
158
+        fi
159
+        cryptsetup luksClose encrypted_usb
160
+        cryptsetup luksOpen $GPG_USB_DRIVE encrypted_usb
161
+        if [ "$?" = "0" ]; then
162
+            GPG_USB_DRIVE=/dev/mapper/encrypted_usb
163
+        fi
164
+        mount $GPG_USB_DRIVE $GPG_USB_MOUNT
165
+        if [ ! "$?" = "0" ]; then
166
+            if (( GPG_CTR > 0 )); then
167
+                rm -rf $GPG_USB_MOUNT
168
+                reconstruct_key
169
+                return 0
170
+            fi
171
+            dialog --title "Encryption keys" \
172
+                   --msgbox "There was a problem mounting the USB drive to $GPG_USB_MOUNT" 6 70
173
+            rm -rf $GPG_USB_MOUNT
174
+            exit 74393
175
+        fi
176
+
177
+        if [ ! -d $GPG_USB_MOUNT/.gnupg ]; then
178
+            if [ ! -d $GPG_USB_MOUNT/.gnupg_fragments ]; then
179
+                if (( GPG_CTR > 0 )); then
180
+                    umount -f $GPG_USB_MOUNT
181
+                    rm -rf $GPG_USB_MOUNT
182
+                    reconstruct_key
183
+                    return 0
184
+                fi
185
+                dialog --title "Encryption keys" \
186
+                       --msgbox "The directory $GPG_USB_MOUNT/.gnupg or $GPG_USB_MOUNT/.gnupg_fragments was not found" 6 70
187
+                umount -f $GPG_USB_MOUNT
188
+                rm -rf $GPG_USB_MOUNT
189
+                exit 723814
190
+            fi
191
+        fi
192
+
193
+        if [ -d $GPG_USB_MOUNT/.gnupg ]; then
194
+            if [ ! -d $HOME_DIR/.gnupg ]; then
195
+                mkdir $HOME_DIR/.gnupg
196
+            fi
197
+            cp -r $GPG_USB_MOUNT/.gnupg/* $HOME_DIR/.gnupg
198
+            GPG_LOADING="no"
199
+            dialog --title "Encryption keys" \
200
+                   --msgbox "GPG Keyring loaded to $HOME_DIR" 6 70
201
+        else
202
+            if [ ! -d $HOME_DIR/.gnupg_fragments ]; then
203
+                mkdir $HOME_DIR/.gnupg_fragments
204
+            fi
205
+            cp -r $GPG_USB_MOUNT/.gnupg_fragments/* $HOME_DIR/.gnupg_fragments
206
+        fi
207
+
208
+        if [[ $SSH_IMPORTED == "no" ]]; then
209
+            if [ -d $GPG_USB_MOUNT/.ssh ]; then
210
+                if [ ! -d $HOME_DIR/.ssh ]; then
211
+                    mkdir $HOME_DIR/.ssh
212
+                fi
213
+                cp $GPG_USB_MOUNT/.ssh/* $HOME_DIR/.ssh
214
+                dialog --title "Encryption keys" \
215
+                       --msgbox "ssh keys imported" 6 70
216
+                SSH_IMPORTED="yes"
217
+            fi
218
+        fi
219
+
220
+        umount -f $GPG_USB_MOUNT
221
+        rm -rf $GPG_USB_MOUNT
222
+        if [[ $GPG_LOADING == "yes" ]]; then
223
+            dialog --title "Encryption keys" \
224
+                   --msgbox "Now remove the USB drive. Insert the next drive containing a key fragment, or select Ok to finish" 6 70
225
+        fi
226
+        GPG_CTR=$((GPG_CTR + 1))
227
+    done
228
+}
229
+
230
+# if no remote backup list was given then assume recover from USB
231
+if [ ! $FRIENDS_SERVERS_LIST ]; then
232
+    interactive_gpg_from_usb
233
+    exit 0
90 234
 fi
91 235
 
92 236
 # obtain shares/fragments from remote locations
@@ -109,7 +253,7 @@ if [ $FRIENDS_SERVERS_LIST ]; then
109 253
 
110 254
             echo -n "Starting key retrieval from $REMOTE_SERVER..."
111 255
             /usr/bin/sshpass -p $REMOTE_PASSWORD \
112
-                scp -r -P $REMOTE_SSH_PORT $REMOTE_SERVER/.gnupg_fragments/* /home/$MY_USERNAME/.gnupg_fragments
256
+                             scp -r -P $REMOTE_SSH_PORT $REMOTE_SERVER/.gnupg_fragments/* /home/$MY_USERNAME/.gnupg_fragments
113 257
             if [ ! "$?" = "0" ]; then
114 258
                 echo 'FAILED'
115 259
             else