]> git.mxchange.org Git - secure-linux-project.git/blob - encrypt/asset.sh
Initial import from 0.5a version.
[secure-linux-project.git] / encrypt / asset.sh
1 #!/bin/sh
2 ##############################################
3 # Script for Secure Linux Project            #
4 # Copyright(c) 2005, 2006 by Roland Haeder   #
5 ##############################################
6 # Purpose: Creates the encrypted asset       #
7 ##############################################
8 # This software is licensed under the GNU    #
9 # General Public License Version 2 or either #
10 # and comes with ABSOLUTELY NO WARRANTY      #
11 # neither implied nor explicit.              #
12 ##############################################
13
14 rm -fv ./.local.sh
15 . ./.settings.sh || exit 3
16
17 if test "$UMOUNT_ASSET" == "0"; then
18         umount /dev/loop3 > /dev/null 2>&1
19         umount /dev/loop2 > /dev/null 2>&1
20         losetup -d /dev/loop3 > /dev/null 2>&1
21         losetup -d /dev/loop2 > /dev/null 2>&1
22         losetup -d /dev/loop1 > /dev/null 2>&1
23 fi
24
25 if test -e $MULTI_KEY; then
26         echo "$0: Keyfile found."
27  else
28         echo "$0: Keyfile not found! Run gen.sh first."
29         exit 2
30 fi
31
32 mkdir $VERBOSE $KEYS $SECRETS $STICK
33
34 if test -e $BASEDIR/.seed; then
35         echo "$0: Using saved seed... "
36  else
37         echo "$0: Please run gen.sh first to generate the seeds!"
38         exit 255
39 fi
40
41 if test -e $BASEDIR/.stick_seed; then
42         echo "$0: Using saved stick seed... "
43  else
44         echo "$0: Please run gen.sh first to generate the seeds!"
45         exit 255
46 fi
47
48 MKFS="0" # Make no filesystem is the default
49 if test -e $BASEDIR/.created; then
50         echo "$0: Using existing filesystem on $FS_ROOT."
51 else
52         echo "$0: Will create/overwrite filesystem on $FS_ROOT."
53         MKFS="1"
54 fi
55 for usr in $USERS; do
56         if test "$MKFS" == "1" && test ! -e "$BASEDIR/.stick_$usr"; then
57                 # Remove invalid image if present (e.g. different seed)
58                 rm $VERBOSE -f $BASEDIR/setup/images/key-$usr.img
59         fi
60
61         if test -e $BASEDIR/setup/images/key-$usr.img; then
62                 echo "$0: Key-image found for $usr."
63          else
64                 echo -n "$0: Generating key-image for $usr ... "
65                 head -c 256k $RAND > $BASEDIR/setup/images/key-$usr.img
66                 echo "done"
67                 losetup -e $CIPHER -K $STICK_KEY /dev/loop2 $BASEDIR/setup/images/key-$usr.img || exit 1
68                 mke2fs /dev/loop2 || exit 4
69                 mount /dev/loop2 $KEYS
70                 cp $VERBOSE $BASEDIR/setup/keys/$usr-$MULTI_KEY_SUFFIX $KEYS/
71                 umount $KEYS
72                 losetup -d /dev/loop2
73         fi
74 done
75
76 if test -b $ASSET_DEVICE; then
77         # Real device
78         echo "$0: Using real device."
79         DEVICE="$ASSET_DEVICE"
80         BOOT="$ASSET_DEVICE"1
81         ASSET="$ASSET_DEVICE"2
82  else
83         # Image for testing
84         echo "$0: Using loop-device on test image."
85         losetup -e NONE /dev/loop7 $ASSET_DEVICE || exit 1
86         losetup -e NONE -o 64512 /dev/loop8 /dev/loop7 || exit 1
87         losetup -e NONE -o $OFFSET_SWAP /dev/loop9 /dev/loop7 || exit 1
88         DEVICE="/dev/loop7"
89         BOOT="/dev/loop8"
90         ASSET="/dev/loop9"
91 fi
92
93
94 echo -n "$0: Scrambling $DEVICE ... "
95 if test "$COUNT" == "0" && test -b $DEVICE; then
96         # Whole disc/partition
97         echo
98         # You can watch the process here...
99         shred -n 1 $VERBOSE $DEVICE || exit 1
100         echo
101  elif test "$COUNT" != "0" && test -b $DEVICE; then
102         # Disabled!
103         echo "disabled"
104  elif test $COUNT -gt 0 && test -f $DEVICE; then
105         # Maybe file for testing?
106         if test "$OPENSSL" == "1"; then
107                 openssl rand -out $DEVICE $(($COUNT*1024)) > /dev/null 2>&1
108          else
109                 dd if=$RAND of=$DEVICE bs=1k count=$COUNT > /dev/null 2>&1
110         fi
111         echo "done"
112  else
113         # Invalid mode
114         echo "invalid!"
115         echo "$0: You entered an invalid value for ASSET and COUNT:"
116         echo
117         echo "ASSET=$ASSET"
118         echo "COUNT=$COUNT"
119         exit 6
120 fi
121
122 echo -n "$0: Setting up $LOOP_ASSET ... "
123 head -c $SEED_LEN $RAND | uuencode -m - | head -n 2 | tail -n 1 | losetup -p 0 -e $CIPHER -S `cat $BASEDIR/.seed` -C $ITER $LOOP_ASSET $DEVICE || exit1
124
125 if test "$ZERO_ASSET" == "1"; then
126         # This may take very long on large discs!
127         echo -n "Zero-ing... "
128         nice -n 19 dd if=/dev/zero of=$LOOP_ASSET bs=4k conv=notrunc 2>/dev/null
129 fi
130 losetup -d $LOOP_ASSET || exit 1
131 echo "done"
132
133 if test ! -e "$BASEDIR/.created"; then
134         MB="$(($SIZE_BOOT/1024))"
135         echo "$0: Zeroing $DEVICE ($MB MB only)..."
136         dd if=/dev/zero of=$DEVICE bs=1k count=$SIZE_BOOT > /dev/null 2>&1
137
138         parted -s $DEVICE mklabel msdos || exit 1
139
140         # Determine maximum sectos
141         SIZE_MAX=`cfdisk -P s $DEVICE | grep "Free Space" | cut -c26- | cut -f1 -d " "`
142         # One secor = 512 Byte so we can calculate the maximum MBytes + some extra
143         SIZE_MAX="$(($SIZE_MAX * 512 / 1024 / 1024 + $SIZE_EXTRA))"
144         echo "$0: Maximum size is $SIZE_MAX MByte"
145
146         echo -n "$0: Creating partitions on $ASSET_DEVICE ... "
147         #parted -s $DEVICE mkpart extended 0 $SIZE_MAX || exit 1
148         echo -n "."
149         parted -s $DEVICE mkpart primary 0 $MB || exit 1
150         echo -n "."
151         parted -s $DEVICE mkpart primary $MB $SIZE_MAX || exit 1
152         echo ". done"
153
154         echo "$0: Creating $FS_BOOT on $BOOT..."
155         mkfs -t $FS_BOOT -b $SIZE_BLOCK $BOOT || exit 1
156 fi
157 echo
158 echo "$0: Need a password for creating asset on $ASSET."
159 echo
160 losetup -e $CIPHER -C $ITER -S `cat $BASEDIR/.seed` -K $MULTI_KEY /dev/loop1 $ASSET || exit 1
161
162 echo "$0: Creating randomized swap partition..."
163 mkswap /dev/loop1 $SIZE_SWAP || exit 1
164
165 mkdir $VERBOSE $BASEDIR/root
166
167 losetup -e NONE -o $OFFSET_ROOT /dev/loop2 /dev/loop1 || exit 1
168
169 if test "$MKFS" == "1"; then
170         # Run a "dry" test to gather maximum size of target /dev/loop2
171         SIZE_MAX=`mke2fs -n -j -b $SIZE_BLOCK /dev/loop2 | grep "inodes," | cut -f 3 -d " "`
172         SIZE_MAX="$((SIZE_MAX * $SIZE_BLOCK  - $OFFSET_DATA))"
173         BLOCKS_ROOT="$(($SIZE_ROOT * 1024 / $SIZE_BLOCK))"
174         FREE_SPACE="$(($OFFSET_DATA - ($OFFSET_ROOT + $BLOCKS_ROOT * $SIZE_BLOCK)))"
175         echo -n "$0: Size<->Offset-Data: $FREE_SPACE - "
176         # DEBUG: read dummy
177         if test "$FREE_SPACE" == "$ROOM_PART"; then
178                 echo "okay"
179          else
180                 echo "failed!"
181                 echo "FREE_SPACE=$FREE_SPACE / ROOM_PART=$ROOM_PART"
182                 exit 6
183         fi
184
185         mkfs -t $FS_ROOT -b $SIZE_BLOCK /dev/loop2 $BLOCKS_ROOT || exit 1
186  else
187         fsck.$FS_ROOT -pv /dev/loop2 || exit 2
188 fi
189 mount -t $FS_ROOT /dev/loop2 $BASEDIR/root
190
191 mkdir $VERBOSE $BASEDIR/root/initrd $BOOT_MOUNT $MP_DATA
192
193 losetup -o $OFFSET_DATA /dev/loop3 /dev/loop1 || exit 1
194
195 if test "$MKFS" == "1"; then
196         mkfs -t $FS_DATA -b $SIZE_BLOCK /dev/loop3 $BLOCKS_DATA || exit 1
197         echo -n "" > $BASEDIR/.created
198  else
199         fsck.$FS_DATA -pv /dev/loop3 || exit 2
200 fi
201
202 mount /dev/loop3 $MP_DATA
203
204 if test "$UMOUNT_ASSET" == "1"; then
205         umount /dev/loop3
206         umount /dev/loop2
207         losetup -d /dev/loop3
208         losetup -d /dev/loop2
209         losetup -d /dev/loop1
210 fi
211
212 # Is the .local.sh not beeing created or STICK_SIZE not yet set?
213 if ! test -e "$BASEDIR/.local.sh" || test "$STICK_SIZE" == "xxx"; then
214         # Now we can write the .local.sh script which keeps our configuration stuff
215         echo -n "$0: Writing .local.sh ... "
216         cp $BASEDIR/.local.sh.head $BASEDIR/.local.sh > /dev/null 2>&1
217         if test -b "$STICK_DEVIE"; then
218                 # On real stick device
219                 echo "KEYS=/$MNT/$KEYS_DIR" >> $BASEDIR/.local.sh
220                 echo "SEED_STICK=/.seed" >> $BASEDIR/.local.sh
221          else
222                 # For testing purposes
223                 echo "KEYS=$BASEDIR/initrd/$MNT/$KEYS_DIR" >> $BASEDIR/.local.sh
224                 echo "SEED_STICK=$BASEDIR/initrd/.seed" >> $BASEDIR/.local.sh
225         fi
226         echo "SEED_LEN=$SEED_LEN" >> $BASEDIR/.local.sh
227         echo "PASS_LEN=$PASS_LEN" >> $BASEDIR/.local.sh
228         echo "RAND=$RAND" >> $BASEDIR/.local.sh
229         echo "SEED_USER=\$KEYS/.seed" >> $BASEDIR/.local.sh
230         echo "SEED_STICK_MD5=\"`md5sum -b $BASEDIR/.stick_seed | cut -c -32`\"" >> $BASEDIR/.local.sh
231         echo "ASSET=$ASSET" >> $BASEDIR/.local.sh
232         echo "ROOT_OFFSET=$OFFSET_ROOT" >> $BASEDIR/.local.sh
233         echo "DATA_OFFSET=$OFFSET_DATA" >> $BASEDIR/.local.sh
234         echo "SWAP_OFFSET=$OFFSET_SWAP" >> $BASEDIR/.local.sh
235         echo "SWAP_SIZE=$SIZE_SWAP" >> $BASEDIR/.local.sh
236         if test -b "$STICK_DEVIE"; then
237                 # On real stick device
238                 echo "MOUNT=/$MNT/new-root/" >> $BASEDIR/.local.sh
239                 echo "STICK_KEY=\"\$KEYS/`basename $STICK_KEY`\"" >> $BASEDIR/.local.sh
240          else
241                 # For testing purposes
242                 echo "MOUNT=$BASEDIR/initrd/$MNT/new-root/" >> $BASEDIR/.local.sh
243                 echo "STICK_KEY=\"$BASEDIR/initrd/`basename $STICK_KEY`\"" >> $BASEDIR/.local.sh
244         fi
245         echo "if test \"\$1\" != \"\"; then" >> $BASEDIR/.local.sh
246         echo "  DISC_KEY=\"\$1.gpg\"" >> $BASEDIR/.local.sh
247         echo " else" >> $BASEDIR/.local.sh
248         echo "  DISC_KEY=\"\"" >> $BASEDIR/.local.sh
249         echo "fi" >> $BASEDIR/.local.sh
250         echo "STICK_MD5=`md5sum -b $STICK_KEY | cut -c -32`" >> $BASEDIR/.local.sh
251         echo "STICK_LOOP=/dev/loop4" >> $BASEDIR/.local.sh
252         echo "CIPHER=$CIPHER" >> $BASEDIR/.local.sh
253         echo "ITER=$ITER" >> $BASEDIR/.local.sh
254         echo "BOOT_DEVICE=\""$ASSET_DEVICE"1\"" >> $BASEDIR/.local.sh
255         echo "ROOT_TYPE=$FS_ROOT" >> $BASEDIR/.local.sh
256         echo "DATA_TYPE=$FS_DATA" >> $BASEDIR/.local.sh
257         echo "STICK_TYPE=$FS_STICK" >> $BASEDIR/.local.sh
258         echo "STICK_DEVICE=$STICK_DEVICE" >> $BASEDIR/.local.sh
259         echo "STICK_START=xxx" >> $BASEDIR/.local.sh
260         if test -b "$STICK_DEVIE"; then
261                 # On real stick device
262                 echo "STICK_MOUNT=/$MNT/stick" >> $BASEDIR/.local.sh
263          else
264                 # For testing purposes
265                 echo "STICK_MOUNT=$BASEDIR/initrd/$MNT/stick" >> $BASEDIR/.local.sh
266         fi
267
268         # Write more MD5 sums here
269         for user in $USERS; do
270                 MD5=`md5sum -b $BASEDIR/setup/keys/$user-$MULTI_KEY_SUFFIX | cut -c -32`
271                 if test "$user" == "$MASTER_USER"; then
272                         # First MD5 sum
273                         echo "MD5SUMS=\"`echo $MD5`\" # ($user)" >> $BASEDIR/.local.sh
274                  else
275                         # Next/last MD5 sum
276                         echo "MD5SUMS=\"\$MD5SUMS `echo $MD5`\" # ($user)" >> $BASEDIR/.local.sh
277                 fi
278         done
279
280         # Append existing footer script to this script
281         if test -e "$BASEDIR/.local.sh.foot"; then
282                 echo "" >> $BASEDIR/.local.sh
283                 cat $BASEDIR/.local.sh.foot >> $BASEDIR/.local.sh
284         fi
285
286         # Set rights/owner/group
287         echo " done"
288         chmod -c go-rwx,u+rwx $BASEDIR/.local.sh
289         chown -c root.root $BASEDIR/.local.sh
290
291         # Extra syncing
292         sync
293
294         echo
295         echo "$0: .local.sh is now created."
296 else
297         echo "$0: Creation of .local.sh skipped."
298 fi
299 echo
300 echo "You may want to execute initrd.sh to setup your initrd image."
301 if test -f "$ASSET"; then
302         echo -n "$0: Removing file $ASSET... "
303         rm -f $ASSET
304         touch $ASSET
305         echo "done"
306 fi