Przeglądaj źródła

Use libgfshare for key splitting

Bob Mottram 9 lat temu
rodzic
commit
02bd649d8a
4 zmienionych plików z 37 dodań i 79 usunięć
  1. BIN
      man/freedombone-splitkey.1.gz
  2. 11
    13
      src/freedombone
  3. 8
    21
      src/freedombone-recoverkey
  4. 18
    45
      src/freedombone-splitkey

BIN
man/freedombone-splitkey.1.gz Wyświetl plik


+ 11
- 13
src/freedombone Wyświetl plik

@@ -1702,7 +1702,7 @@ function create_backup_script {
1702 1702
   if grep -Fxq "create_backup_script" $COMPLETION_FILE; then
1703 1703
       return
1704 1704
   fi
1705
-  apt-get -y install rsyncrypto cryptsetup ssss
1705
+  apt-get -y install rsyncrypto cryptsetup libgfshare-bin
1706 1706
 
1707 1707
   get_mariadb_password
1708 1708
   get_mariadb_gnusocial_admin_password
@@ -3782,7 +3782,7 @@ function backup_to_friends_servers {
3782 3782
   # we just need to rsync it to each friend
3783 3783
 
3784 3784
   echo '# For each remote server' >> /usr/bin/$BACKUP_TO_FRIENDS_SCRIPT_NAME
3785
-  echo 'ctr=0' >> /usr/bin/$BACKUP_TO_FRIENDS_SCRIPT_NAME
3785
+  echo 'ctr_share=0' >> /usr/bin/$BACKUP_TO_FRIENDS_SCRIPT_NAME
3786 3786
   echo 'while read remote_server' >> /usr/bin/$BACKUP_TO_FRIENDS_SCRIPT_NAME
3787 3787
   echo 'do' >> /usr/bin/$BACKUP_TO_FRIENDS_SCRIPT_NAME
3788 3788
   echo '  # Get the server and its password' >> /usr/bin/$BACKUP_TO_FRIENDS_SCRIPT_NAME
@@ -3810,22 +3810,20 @@ function backup_to_friends_servers {
3810 3810
   if [[ $ENABLE_SOCIAL_KEY_MANAGEMENT == "yes" ]]; then
3811 3811
       echo "    if [ -d /home/$MY_USERNAME/.gnupg_fragments ]; then" >> /usr/bin/$BACKUP_TO_FRIENDS_SCRIPT_NAME
3812 3812
       echo "        cd /home/$MY_USERNAME/.gnupg_fragments" >> /usr/bin/$BACKUP_TO_FRIENDS_SCRIPT_NAME
3813
-      echo '        no_of_fragments=$(ls -afq data* | wc -l)' >> /usr/bin/$BACKUP_TO_FRIENDS_SCRIPT_NAME
3814
-      echo '        no_of_fragments=$((no_of_fragments - 2))' >> /usr/bin/$BACKUP_TO_FRIENDS_SCRIPT_NAME
3815
-      echo '        if [[ ${no_of_fragments} > 0 ]]; then' >> /usr/bin/$BACKUP_TO_FRIENDS_SCRIPT_NAME
3816
-      echo '            key_files=(/home/$MY_USERNAME/.gnupg_fragments/data*)' >> /usr/bin/$BACKUP_TO_FRIENDS_SCRIPT_NAME
3817
-      echo '            key_filename=${key_files[ctr]}' >> /usr/bin/$BACKUP_TO_FRIENDS_SCRIPT_NAME
3813
+      echo '        no_of_shares=$(ls -afq keyshare* | wc -l)' >> /usr/bin/$BACKUP_TO_FRIENDS_SCRIPT_NAME
3814
+      echo '        no_of_shares=$((no_of_fragments - 2))' >> /usr/bin/$BACKUP_TO_FRIENDS_SCRIPT_NAME
3815
+      echo '        if [[ ${no_of_shares} > 0 ]]; then' >> /usr/bin/$BACKUP_TO_FRIENDS_SCRIPT_NAME
3816
+      echo '            share_files=(/home/$MY_USERNAME/.gnupg_fragments/keyshare*)' >> /usr/bin/$BACKUP_TO_FRIENDS_SCRIPT_NAME
3817
+      echo '            share_filename=${key_files[ctr_share]}' >> /usr/bin/$BACKUP_TO_FRIENDS_SCRIPT_NAME
3818 3818
       echo "            mkdir -p /home/$MY_USERNAME/tempkey/.gnupg_fragments" >> /usr/bin/$BACKUP_TO_FRIENDS_SCRIPT_NAME
3819
-      echo '            ctrb=$((ctr + 1))' >> /usr/bin/$BACKUP_TO_FRIENDS_SCRIPT_NAME
3820
-      echo "            sed \"$ctrbq;d\" /home/$MY_USERNAME/.gnupg_fragments/shares.txt > /home/$MY_USERNAME/tempkey/.gnupg_fragments/share.txt" >> /usr/bin/$BACKUP_TO_FRIENDS_SCRIPT_NAME
3821
-      echo "            cp $key_filename /home/$MY_USERNAME/tempkey/.gnupg_fragments" >> /usr/bin/$BACKUP_TO_FRIENDS_SCRIPT_NAME
3819
+      echo "            cp $share_filename /home/$MY_USERNAME/tempkey/.gnupg_fragments/data" >> /usr/bin/$BACKUP_TO_FRIENDS_SCRIPT_NAME
3822 3820
       echo -n '            /usr/bin/sshpass -p $REMOTE_PASSWORD ' >> /usr/bin/$BACKUP_TO_FRIENDS_SCRIPT_NAME
3823 3821
       echo "scp -r -P $REMOTE_SSH_PORT /home/$MY_USERNAME/tempkey/.gnupg_fragments $REMOTE_SERVER" >> /usr/bin/$BACKUP_TO_FRIENDS_SCRIPT_NAME
3824 3822
       echo "            shred -zu /home/$MY_USERNAME/tempkey/.gnupg_fragments/*" >> /usr/bin/$BACKUP_TO_FRIENDS_SCRIPT_NAME
3825 3823
       echo "            rm -rf /home/$MY_USERNAME/tempkey" >> /usr/bin/$BACKUP_TO_FRIENDS_SCRIPT_NAME
3826
-      echo '            ctr=$((ctr + 1))' >> /usr/bin/$BACKUP_TO_FRIENDS_SCRIPT_NAME
3827
-      echo '            if [[ ${ctr} >= ${no_of_fragments} ]]; then' >> /usr/bin/$BACKUP_TO_FRIENDS_SCRIPT_NAME
3828
-      echo '                ctr=0' >> /usr/bin/$BACKUP_TO_FRIENDS_SCRIPT_NAME
3824
+      echo '            ctr_share=$((ctr_share + 1))' >> /usr/bin/$BACKUP_TO_FRIENDS_SCRIPT_NAME
3825
+      echo '            if [[ ${ctr_share} >= ${no_of_shares} ]]; then' >> /usr/bin/$BACKUP_TO_FRIENDS_SCRIPT_NAME
3826
+      echo '                ctr_share=0' >> /usr/bin/$BACKUP_TO_FRIENDS_SCRIPT_NAME
3829 3827
       echo '            fi' >> /usr/bin/$BACKUP_TO_FRIENDS_SCRIPT_NAME
3830 3828
       echo '        fi' >> /usr/bin/$BACKUP_TO_FRIENDS_SCRIPT_NAME
3831 3829
       echo '    fi' >> /usr/bin/$BACKUP_TO_FRIENDS_SCRIPT_NAME

+ 8
- 21
src/freedombone-recoverkey Wyświetl plik

@@ -76,30 +76,17 @@ if [ ! -d $FRAGMENTS_DIR ]; then
76 76
     exit 7483
77 77
 fi
78 78
 
79
-# join the fragments
80
-if [ ! -d /home/$MY_USERNAME/.tempgnupg ]; then
81
-    mkdir /home/$MY_USERNAME/.tempgnupg
82
-fi
83
-KEYS_FILE=/home/$MY_USERNAME/.tempgnupg/tempfile.asc
84
-cat $FRAGMENTS_DIR/data* > $KEYS_FILE.gpg
85
-if [ ! "$?" = "0" ]; then
86
-    echo 'Unable to find key fragments'
87
-    exit 8727
88
-fi
89
-
90 79
 # decrypt the file
91
-cd /home/$MY_USERNAME/.tempgnupg
92
-gpg -d $KEYS_FILE.gpg -o $KEYS_FILE
93
-if [ ! "$?" = "0" ]; then
94
-    echo 'Unable to decrypt data. This may mean that not enough fragments are available'
95
-    exit 6283
96
-fi
97
-shred -zu $KEYS_FILE.gpg
80
+KEYS_FILE=$FRAGMENTS_DIR/keyshare.asc
81
+cd $FRAGMENTS_DIR
82
+gfcombine $KEYS_FILE.*
83
+
98 84
 if [ ! -f $KEYS_FILE ]; then
99
-    echo 'Unable to find decrypted key file. This may mean that not enough fragments are available'
100
-    exit 8358
85
+    echo 'Unable to decrypt key. This may mean that not enough fragments are available'
86
+    exit 6283
101 87
 fi
102
-echo 'Key fragments decrypted'
88
+
89
+echo 'Key fragments recombined'
103 90
 
104 91
 # import the gpg key
105 92
 su -c "gpg --allow-secret-key-import --import $KEYS_FILE" - $MY_USERNAME

+ 18
- 45
src/freedombone-splitkey Wyświetl plik

@@ -37,11 +37,10 @@
37 37
 KEY_FRAGMENTS=3
38 38
 MY_USERNAME=
39 39
 MY_EMAIL_ADDRESS=
40
-PASSPHRASE=
41 40
 
42 41
 function show_help {
43 42
     echo ''
44
-    echo 'freedombone-splitkey -u [username] -n [number of fragments] -e [email address] -p [passphrase]'
43
+    echo 'freedombone-splitkey -u [username] -n [number of fragments] -e [email address]'
45 44
     echo ''
46 45
     exit 0
47 46
 }
@@ -66,10 +65,6 @@ case $key in
66 65
     shift
67 66
     MY_EMAIL_ADDRESS=$1
68 67
     ;;
69
-    -p|--passphrase)
70
-    shift
71
-    PASSPHRASE=$1
72
-    ;;
73 68
     *)
74 69
     # unknown option
75 70
     ;;
@@ -103,60 +98,38 @@ KEYID=$(su -c "gpg --list-keys $MY_EMAIL_ADDRESS | grep 'pub '" - \
103 98
         $MY_USERNAME | awk -F ' ' '{print $2}' | awk -F '/' '{print $2}')
104 99
 
105 100
 # create the key file
106
-KEYS_FILE=/home/$MY_USERNAME/tempdatafile.asc
107
-gpg --output /home/$MY_USERNAME/pubkey.txt --armor --export $KEYID
101
+mkdir -p $FRAGMENTS_DIR
102
+KEYS_FILE=$FRAGMENTS_DIR/keyshare.asc
103
+gpg --output $FRAGMENTS_DIR/pubkey.txt --armor --export $KEYID
108 104
 if [ ! "$?" = "0" ]; then
109 105
     echo "Unable to extract public key for $KEYID"
110 106
     exit 7835
111 107
 fi
112
-gpg --output /home/$MY_USERNAME/privkey.txt --armor --export-secret-key $KEYID
108
+gpg --output $FRAGMENTS_DIR/privkey.txt --armor --export-secret-key $KEYID
113 109
 if [ ! "$?" = "0" ]; then
114 110
     echo "Unable to extract private key for $KEYID"
115 111
     exit 7823
116 112
 fi
117
-cat /home/$MY_USERNAME/pubkey.txt /home/$MY_USERNAME/privkey.txt > $KEYS_FILE
118
-shred -zu /home/$MY_USERNAME/privkey.txt
119
-shred -zu /home/$MY_USERNAME/pubkey.txt
113
+cat $FRAGMENTS_DIR/pubkey.txt $FRAGMENTS_DIR/privkey.txt > $KEYS_FILE
114
+shred -zu $FRAGMENTS_DIR/privkey.txt
115
+shred -zu $FRAGMENTS_DIR/pubkey.txt
120 116
 
121
-# generate a random passphrase if one isn't supplied
122
-if [ ! $PASSPHRASE ]; then
123
-    PASSPHRASE="$(openssl rand -base64 100)"
124
-fi
125
-
126
-# encrypt the keys file with a passphrase
127
-echo "$PASSPHRASE" | gpg --passphrase-fd 0 --output $KEYS_FILE.gpg --symmetric $KEYS_FILE
117
+KEY_SHARES=$((KEY_FRAGMENTS * 2))
118
+gfsplit -n $KEY_FRAGMENTS -m $KEY_SHARES $KEYS_FILE
128 119
 if [ ! "$?" = "0" ]; then
129
-    echo "Unable to encrypt the data prior to splitting"
130
-    exit 7352
120
+    echo "Unable to split the gpg key"
121
+    rm -rf $FRAGMENTS_DIR
122
+    if [ -f $KEYS_FILE ]; then
123
+        shred -zu $KEYS_FILE
124
+    fi
125
+    exit 63028
131 126
 fi
132 127
 shred -zu $KEYS_FILE
133 128
 
134
-# split the passphrase into shares
135
-echo "$PASSPHRASE" | ssss-split -q -t $KEY_FRAGMENTS -n $KEY_FRAGMENTS > \
136
-                                /home/$MY_USERNAME/.gnupg_fragments/shares.txt
137
-
138
-# (maybe) overwrite passphrase after use
139
-PASSPHRASE="$(openssl rand -base64 100)"
140
-
141
-# check that passphrase shares were created
142
-if [ ! -f /home/$MY_USERNAME/.gnupg_fragments/shares.txt ]; then
143
-    echo 'Passphrase for key fragments could not be split'
144
-    shred -zu $KEYS_FILE.gpg
145
-    exit 74549
146
-fi
147
-
148
-# generate fragments
149
-GPG_KEYS_SIZE_BYTES=$(wc -c <"$KEYS_FILE.gpg")
150
-GPG_BYTES_PER_FRAGMENT=$((GPG_KEYS_SIZE_BYTES / KEY_FRAGMENTS))
151
-GPG_BYTES_PER_FRAGMENT=$((GPG_BYTES_PER_FRAGMENT + 1))
152
-mkdir -p $FRAGMENTS_DIR
153
-split --bytes=$GPG_BYTES_PER_FRAGMENT $KEYS_FILE.gpg $FRAGMENTS_DIR/data
129
+# set permissions
154 130
 chown -R $MY_USERNAME:$MY_USERNAME $FRAGMENTS_DIR
155 131
 chmod -R 600 $FRAGMENTS_DIR
156 132
 
157
-# delete the keys file
158
-shred -zu $KEYS_FILE.gpg
159
-
160
-echo "$KEY_FRAGMENTS key fragments created"
133
+echo "$KEY_SHARES key shares created"
161 134
 
162 135
 exit 0