Pārlūkot izejas kodu

Use libgfshare for key splitting

Bob Mottram 10 gadus atpakaļ
vecāks
revīzija
02bd649d8a
4 mainītis faili ar 37 papildinājumiem un 79 dzēšanām
  1. Binārs
      man/freedombone-splitkey.1.gz
  2. 11
    13
      src/freedombone
  3. 8
    21
      src/freedombone-recoverkey
  4. 18
    45
      src/freedombone-splitkey

Binārs
man/freedombone-splitkey.1.gz Parādīt failu


+ 11
- 13
src/freedombone Parādīt failu

1702
   if grep -Fxq "create_backup_script" $COMPLETION_FILE; then
1702
   if grep -Fxq "create_backup_script" $COMPLETION_FILE; then
1703
       return
1703
       return
1704
   fi
1704
   fi
1705
-  apt-get -y install rsyncrypto cryptsetup ssss
1705
+  apt-get -y install rsyncrypto cryptsetup libgfshare-bin
1706
 
1706
 
1707
   get_mariadb_password
1707
   get_mariadb_password
1708
   get_mariadb_gnusocial_admin_password
1708
   get_mariadb_gnusocial_admin_password
3782
   # we just need to rsync it to each friend
3782
   # we just need to rsync it to each friend
3783
 
3783
 
3784
   echo '# For each remote server' >> /usr/bin/$BACKUP_TO_FRIENDS_SCRIPT_NAME
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
   echo 'while read remote_server' >> /usr/bin/$BACKUP_TO_FRIENDS_SCRIPT_NAME
3786
   echo 'while read remote_server' >> /usr/bin/$BACKUP_TO_FRIENDS_SCRIPT_NAME
3787
   echo 'do' >> /usr/bin/$BACKUP_TO_FRIENDS_SCRIPT_NAME
3787
   echo 'do' >> /usr/bin/$BACKUP_TO_FRIENDS_SCRIPT_NAME
3788
   echo '  # Get the server and its password' >> /usr/bin/$BACKUP_TO_FRIENDS_SCRIPT_NAME
3788
   echo '  # Get the server and its password' >> /usr/bin/$BACKUP_TO_FRIENDS_SCRIPT_NAME
3810
   if [[ $ENABLE_SOCIAL_KEY_MANAGEMENT == "yes" ]]; then
3810
   if [[ $ENABLE_SOCIAL_KEY_MANAGEMENT == "yes" ]]; then
3811
       echo "    if [ -d /home/$MY_USERNAME/.gnupg_fragments ]; then" >> /usr/bin/$BACKUP_TO_FRIENDS_SCRIPT_NAME
3811
       echo "    if [ -d /home/$MY_USERNAME/.gnupg_fragments ]; then" >> /usr/bin/$BACKUP_TO_FRIENDS_SCRIPT_NAME
3812
       echo "        cd /home/$MY_USERNAME/.gnupg_fragments" >> /usr/bin/$BACKUP_TO_FRIENDS_SCRIPT_NAME
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
       echo "            mkdir -p /home/$MY_USERNAME/tempkey/.gnupg_fragments" >> /usr/bin/$BACKUP_TO_FRIENDS_SCRIPT_NAME
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
       echo -n '            /usr/bin/sshpass -p $REMOTE_PASSWORD ' >> /usr/bin/$BACKUP_TO_FRIENDS_SCRIPT_NAME
3820
       echo -n '            /usr/bin/sshpass -p $REMOTE_PASSWORD ' >> /usr/bin/$BACKUP_TO_FRIENDS_SCRIPT_NAME
3823
       echo "scp -r -P $REMOTE_SSH_PORT /home/$MY_USERNAME/tempkey/.gnupg_fragments $REMOTE_SERVER" >> /usr/bin/$BACKUP_TO_FRIENDS_SCRIPT_NAME
3821
       echo "scp -r -P $REMOTE_SSH_PORT /home/$MY_USERNAME/tempkey/.gnupg_fragments $REMOTE_SERVER" >> /usr/bin/$BACKUP_TO_FRIENDS_SCRIPT_NAME
3824
       echo "            shred -zu /home/$MY_USERNAME/tempkey/.gnupg_fragments/*" >> /usr/bin/$BACKUP_TO_FRIENDS_SCRIPT_NAME
3822
       echo "            shred -zu /home/$MY_USERNAME/tempkey/.gnupg_fragments/*" >> /usr/bin/$BACKUP_TO_FRIENDS_SCRIPT_NAME
3825
       echo "            rm -rf /home/$MY_USERNAME/tempkey" >> /usr/bin/$BACKUP_TO_FRIENDS_SCRIPT_NAME
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
       echo '            fi' >> /usr/bin/$BACKUP_TO_FRIENDS_SCRIPT_NAME
3827
       echo '            fi' >> /usr/bin/$BACKUP_TO_FRIENDS_SCRIPT_NAME
3830
       echo '        fi' >> /usr/bin/$BACKUP_TO_FRIENDS_SCRIPT_NAME
3828
       echo '        fi' >> /usr/bin/$BACKUP_TO_FRIENDS_SCRIPT_NAME
3831
       echo '    fi' >> /usr/bin/$BACKUP_TO_FRIENDS_SCRIPT_NAME
3829
       echo '    fi' >> /usr/bin/$BACKUP_TO_FRIENDS_SCRIPT_NAME

+ 8
- 21
src/freedombone-recoverkey Parādīt failu

76
     exit 7483
76
     exit 7483
77
 fi
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
 # decrypt the file
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
 if [ ! -f $KEYS_FILE ]; then
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
 fi
87
 fi
102
-echo 'Key fragments decrypted'
88
+
89
+echo 'Key fragments recombined'
103
 
90
 
104
 # import the gpg key
91
 # import the gpg key
105
 su -c "gpg --allow-secret-key-import --import $KEYS_FILE" - $MY_USERNAME
92
 su -c "gpg --allow-secret-key-import --import $KEYS_FILE" - $MY_USERNAME

+ 18
- 45
src/freedombone-splitkey Parādīt failu

37
 KEY_FRAGMENTS=3
37
 KEY_FRAGMENTS=3
38
 MY_USERNAME=
38
 MY_USERNAME=
39
 MY_EMAIL_ADDRESS=
39
 MY_EMAIL_ADDRESS=
40
-PASSPHRASE=
41
 
40
 
42
 function show_help {
41
 function show_help {
43
     echo ''
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
     echo ''
44
     echo ''
46
     exit 0
45
     exit 0
47
 }
46
 }
66
     shift
65
     shift
67
     MY_EMAIL_ADDRESS=$1
66
     MY_EMAIL_ADDRESS=$1
68
     ;;
67
     ;;
69
-    -p|--passphrase)
70
-    shift
71
-    PASSPHRASE=$1
72
-    ;;
73
     *)
68
     *)
74
     # unknown option
69
     # unknown option
75
     ;;
70
     ;;
103
         $MY_USERNAME | awk -F ' ' '{print $2}' | awk -F '/' '{print $2}')
98
         $MY_USERNAME | awk -F ' ' '{print $2}' | awk -F '/' '{print $2}')
104
 
99
 
105
 # create the key file
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
 if [ ! "$?" = "0" ]; then
104
 if [ ! "$?" = "0" ]; then
109
     echo "Unable to extract public key for $KEYID"
105
     echo "Unable to extract public key for $KEYID"
110
     exit 7835
106
     exit 7835
111
 fi
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
 if [ ! "$?" = "0" ]; then
109
 if [ ! "$?" = "0" ]; then
114
     echo "Unable to extract private key for $KEYID"
110
     echo "Unable to extract private key for $KEYID"
115
     exit 7823
111
     exit 7823
116
 fi
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
 if [ ! "$?" = "0" ]; then
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
 fi
126
 fi
132
 shred -zu $KEYS_FILE
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
 chown -R $MY_USERNAME:$MY_USERNAME $FRAGMENTS_DIR
130
 chown -R $MY_USERNAME:$MY_USERNAME $FRAGMENTS_DIR
155
 chmod -R 600 $FRAGMENTS_DIR
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
 exit 0
135
 exit 0