#!/bin/bash # # mkcryptfs: Creates an encrypted container in the specified directory, # or in the specified user's home directory # # Crée un système de fichier chiffré dans le répertoire # spécifié, ou dans le répertoire personnel de l'utilisateur # spécifié. # # Should work either with loop-aes, cryptoapi or kerneli patch, or SuSE # # Written by Michel Bouissou on 2002/03/21 # License: GPL, see http://www.gnu.org/licenses/licenses.html#GPL # # Version: 0.5.5 - 2003/05/19 # *** Usage: mkcryptfs help *** # USER SETTINGS SECTION -------------------------------------------------- # SECTION DES PARAMETRES REGLABLES PAR L'UTILISATEUR --------------------- # Specify here if your system uses loop-aes, cryptoapi or kerneli # Uncomment one of the following parameters as necessary: # # Spécifiez ci-dessous si votre système utilise loop-aes, cryptoapi ou kerneli # Décommentez l'un des paramètres ci-dessous selon le cas: # # Mandrake 8.2 and SuSE users should choose "loop-aes" # # The following entry is for loop-aes only # CMode="loop-aes" # # The following entry should be used for cryptoapi or kerneli # CMode="cryptoapi" # You can choose below the cipher and keylength that will be used # # Vous pouvez choisir ci-dessous l'algorithme de chiffrement et la # longueur de clé à utiliser # # Mandrake 8.2 users should choose one of the AESxxx variants # SuSE Users should choose "twofish" # # Cipher to use with loop-aes LCipher=AES256 # LCipher=AES192 # LCipher=AES128 # # LCipher=twofish # Cipher and keylength to use with cryptoapi or kerneli patch CCipher=aes # You can specify "manual" if you want to be prompted for key length at # container creation time, or if you have old version of losetup/mount # utilities that do not allow keylength to be passed as a parameter. # Vous pouvez spécifier "manual" si vous désirez choisir la longueur de # clé lors de la création du container, ou si vous avez de vieilles versions # des utilitaires losetup et mount qui ne permettent pas le passage de la # longueur de clé en paramètre. CKeybits=256 # CKeybits=manual # You can choose below the filesystem type, only ext3 or ext2 are # supported by this script # Note: This is the filesystem that will be created into the encrypted # container. It is unrelated to the filesystem of the partition on # which the encrypted container resides, which can be any filesystem # supported by your Linux kernel. # # Vous pouvez choisir ci-dessous le type de système de fichiers à créer # Seuls ext3 et ext2 sont supportés par ce script. # Note: Il s'agit du système de fichiers qui sera créé à l'intérieur du # container chiffré. Celui-ci est indépendant du système de fichiers # utilisé par la partition sur laquelle réside le container chiffré, # et qui peut être n'importe quel système de fichiers géré par votre # noyau Linux. # # FSType=ext3 FSType=ext2 # If you use cryptoapi (NOT for loop-aes) you may want this script to # test that the cryptoloop module inserts OK. # Uncomment the following parameter to do this. # # Si vous utilisez cryptoapi (PAS pour loop-aes), ce script peut tester # que le module cryptoloop s'insère correctement. # Décommentez le paramètre suivant pour ce faire. # # Mandrake 8.2 and SuSE users should set this to "no" # # TMcryptoloop=yes TMcryptoloop=no # By default, this script will test that the "loop" module inserts OK. # If you have compiled the loop function into your kernel, then you need # to skip this test. Change the following setting accordingly # # Par défaut, ce script contrôle que le module "loop" s'insère # correctement. # Toutefois, si vous avez compilé ce module "en dur" dans votre noyau, # vous devez sauter ce test. Utilisez pour cela le réglage suivant # # Mandrake 8.2 users should set this to "yes # SuSE users should set this to "no" # TMloop=yes # TMloop=no # SuSE uses an encryption module which has a different name # Only SuSE users should set the following parameter to "yes" # # SuSE utilise un module de chiffrement appelé différemment: loop_fish2 # Seuls les utilisateurs de SuSE doivent régler le paramètre suivant # sur "yes" # # TMloop_fish2=yes TMloop_fish2=no # NO USER DEFINABLE PARAMETERS BELOW ------------------------------------- # DON'T EDIT BELOW UNLESS YOU KNOW WHAT YOU'RE DOING --------------------- # AUCUN PARAMETRE MODIFIABLE PAR L'UTILISATEUR CI-DESSOUS ---------------- # NE FAITES PAS DE MODIFICATIONS PLUS BAS, A MOINS DE SAVOIR VRAIMENT ---- # CE QUE VOUS FAITES ----------------------------------------------------- # Script internal functions ---------------------------------------------- # Displays a message message() { case "$1" in version) echo "$0 version 0.5.4 by Michel Bouissou . License: GPL" ;; help) message version echo "" case $Ml in fr) echo "Ce script crée un système de fichiers chiffré en utilisant $CMode, dans un" echo "fichier-container qui sera placé soit dans le répertoire spécifié, soit dans le" echo "répertoire \"home\" de l'utilisateur spécifié." echo "" echo "- Si on spécifie un répertoire, le container appartiendra au propriétaire de" echo " ce répertoire;" echo "- Si on spécifie un utilisateur, le container appartiendra à cet utilisateur." echo "" echo "Une fois créé, le système de fichiers chiffré peut être monté par" echo "l'utilisateur à qui il appartient, en utilisant une commande \"mount\" standard" echo "et en tapant le mot de passe ou phrase secrète qui protège le container." echo "" echo "Pour lancer ce script, vous devez simplement préciser:" echo "- Le répertoire où placer le container chiffré, ou le nom de l'utilisateur" echo " à qui le container appartiendra;" echo "- Le nom à utiliser pour créer le container et le répertoire correspondant;" echo "- La taille (en mégaoctets) du container à créer." echo "" message usage echo "Exemple 1: $0 /home/pierre/mesfichiers secret 200" echo " ...créera un container chiffré de 200 Mo appelé \".secret\" dans le" echo " répertoire /home/pierre/mesfichiers" echo " Le container se montera sous /home/pierre/mesfichiers/secret" echo "" echo "Exemple 2: $0 pierre secret 200" echo " ...créera un container chiffré de 200 Mo appelé \".secret\" dans le" echo " répertoire personnel de pierre." echo " Le container se montera sous ~pierre/secret" echo "" echo "Plus d'infos sur le chiffrement loopback sous Linux:" echo "The Linux Encryption HowTo: http://encryptionhowto.sourceforge.net/" echo "The loop-aes page: http://sourceforge.net/projects/loop-aes/" echo "The cryptoapi page: http://cryptoapi.sourceforge.net" echo "The international crypto kernel patch: http://www.kerneli.org" echo "" ;; *) echo "This script creates an encrypted filesystem using $CMode, in a container" echo "file that will be put either in the specified directory, or in the" echo "specified user's home directory." echo "" echo "- If a destination directory is specified, the container will be owned by" echo " the destination directory's owner." echo "- If a user is specified, the container will be owned by the specified user." echo "" echo "Once created, the encrypted filesystem can be mounted by the user who owns it," echo "using a standard \"mount\" command, and typing the password or passphrase that" echo "protects the container." echo "" echo "To call this script, you only need to specify:" echo "- The directory where to place the container, or the username of the user" echo " who will own it;" echo "- The name to be used for creating the container and directory;" echo "- The size (in megabytes) of the container to be created." echo "" message usage echo "Example 1: $0 /home/joe/myfiles secret 200" echo " ...would create a 200MB encrypted container named \".secret\" in the" echo " /home/joe/myfiles directory" echo " The container will mount under /home/joe/myfiles/secret" echo "" echo "Example 2: $0 joe secret 200" echo " ...would create a 200MB encrypted container named \".secret\" in joe's" echo " home directory" echo " The container will mount under ~joe/secret" echo "" echo "More information about loopback encryption in Linux:" echo "The Linux Encryption HowTo: http://encryptionhowto.sourceforge.net/" echo "The loop-aes page: http://sourceforge.net/projects/loop-aes/" echo "The cryptoapi page: http://cryptoapi.sourceforge.net" echo "The international crypto kernel patch: http://www.kerneli.org" echo "" ;; esac ;; usage) case $Ml in fr) echo "Usage: $0 répertoire_destination nom_container taille_Mo" echo " Crée un container chiffré \".nom_container\" de \"taille_Mo\"" echo " dans \"répertoire_destination\"." echo "" echo " -ou- $0 nom_utilisateur nom_container taille_Mo" echo " Crée un container chiffré \".nom_container\" de \"taille_Mo\"" echo " dans le répertoire personnel de \"nom_utilisateur\"." ;; *) echo "Usage: $0 destination_directory container_name size_MB" echo " Creates a \"size_MB\" encrypted container \".container_name\"." echo " in \"destination_directory\"." echo "" echo " -or- $0 username container_name size_MB" echo " Creates a \"size_MB\" encrypted container \".container_name\"." echo " in the home directory of \"username\"." ;; esac echo "" ;; 1) case $Ml in fr) echo "Cette étape a échoué. La procédure est abandonnée." echo "Nettoyage..." ;; *) echo "This step failed. Procedure is aborted." echo "Cleaning up..." ;; esac ;; 2) case $Ml in fr) echo "Fait." ;; *) echo "Done." ;; esac ;; 3) case $Ml in fr) echo "ERREUR: Le programme \"$2\" n'a pas été trouvé." echo " Ce programme est nécessaire à l'exécution de ce script; veuillez l'installer." echo "Abandon." ;; *) echo "ERROR: The \"$2\" program could not be found." echo " This program is necessary for executing this script; please install it." echo "Aborting." ;; esac ;; 4) case $Ml in fr) echo "ERREUR: Paramétrage initial du script $0" echo " Le paramètre CMode n'est pas réglé convenablement dans ce script." echo " Peut-être ce script n'a-t-il encore jamais été configuré pour votre système ?" echo " Veuillez éditer ce script et contrôler ce paramètre au début de celui-ci." echo "Abandon." ;; *) echo "ERROR: Initial setup of $0 script." echo " The CMode parameter is not correctly set at the beginning of this script." echo " Maybe this script has not yet been configured for your system ?" echo " Please edit this script and check this parameter at its beginning." echo "Aborting." ;; esac ;; 5) case $Ml in fr) echo "Etape terminée OK." ;; *) echo "Step completed OK." ;; esac echo "" ;; 6) case $Ml in fr) echo "ERREUR: Code statut=$2" ;; *) echo "ERROR: Status code=$2" ;; esac ;; 7) case $Ml in fr) echo "Ce script doit être exécuté par root. Abandon." ;; *) echo "This script must be used by root. Aborting." ;; esac ;; 8) case $Ml in fr) echo "ERREUR: Aucun paramètre spécifié. Abandon." ;; *) echo "ERROR: No parameters specified. Aborting." ;; esac ;; 9) case $Ml in fr) echo "ERREUR: Paramétrage initial du script $0" echo " Le paramètre FSType n'est pas réglé convenablement dans ce script." echo " Peut-être ce script n'a-t-il encore jamais été configuré pour votre système ?" echo " Veuillez éditer ce script et contrôler ce paramètre au début de celui-ci." echo "Abandon." ;; *) echo "ERROR: Initial setup of $0 script." echo " The FSType parameter is not correctly set at the beginning of this script." echo " Maybe this script has not yet been configured for your system ?" echo " Please edit this script and check this parameter at its beginning." echo "Aborting." ;; esac ;; 10) case $Ml in fr) echo "ERREUR: Nombre de paramètres incorrect. Abandon." ;; *) echo "ERROR: Incorrect number of parameters. Aborting." ;; esac ;; 11) case $Ml in fr) echo "ERREUR: Le paramètre 1: \"$2\" ne correspond à aucun répertoire ni utilisateur" echo " existant sur le système." echo "Abandon." ;; *) echo "ERROR: First parameter: \"$2\" does not correspond to any existing directory" echo " or user on this system." echo "Aborting." ;; esac ;; 12) case $Ml in fr) echo "ERREUR: Le répertoire $2 de l'utilisateur $3 n'a pas été trouvé. Abandon." ;; *) echo "ERROR: User ${3}'s home directory $2 was not found. Aborting." ;; esac ;; 13) case $Ml in fr) echo "ERREUR: Un fichier ou répertoire nommé $3 ou .$3 existe déjà" echo " dans le répertoire $2." echo "" echo "Veuillez choisir un autre nom pour le container chiffré à créer". echo "Abandon." ;; *) echo "ERROR: A file or directory named $3 or .$3 already exists" echo " in directory $2." echo "" echo "Please choose another name for the encrypted container to be created." echo "Aborting." ;; esac ;; 14) case $Ml in fr) echo "ERREUR: Le troisième paramètre: \"$2\" n'est pas numérique." echo " Ce paramètre doit être un nombre entier spécifiant la taille en Mo" echo " du container chiffré à créer." echo "Abandon." ;; *) echo "ERROR: The 3rd parameter: \"$2\" is not an integer numerical value." echo " This parameter should specify the size of the encrypted container" echo " to be created (in MBytes)." echo "Aborting." ;; esac ;; 15) case $Ml in fr) echo "ERREUR: Le troisième paramètre: \"$2\" est inférieur à 1 ou commence par \"0\"." echo " Ce paramètre doit être un nombre entier spécifiant la taille en Mo" echo " du container chiffré à créer. Il ne doit pas commencer par un \"0\"." echo "Abandon." ;; *) echo "ERROR: The 3rd parameter: \"$2\" is smaller than 1 or begins with \"0\"." echo " This parameter should specify the size of the encrypted container" echo " to be created (in MBytes). It must not begin with \"0\"." echo "Aborting." ;; esac ;; 16) case $Ml in fr) echo "ERREUR: Le fichier spécial /dev/urandom utilisé par le générateur" echo " aléatoire n'existe pas." echo "Abandon." ;; *) echo "ERROR: Special file /dev/urandom used by random number generator" echo " does not exist." echo "Aborting." ;; esac ;; 17) case $Ml in fr) echo "ERREUR: Le fichier spécial /proc/mounts n'existe pas." echo "Abandon." ;; *) echo "ERROR: Special file /proc/mounts does not exist." echo "Aborting." ;; esac ;; 18) case $Ml in fr) echo "Echec." echo "ERREUR: Impossible d'insérer le module \"$2\"." echo "Abandon." ;; *) echo "Failed." echo "ERROR: Failed inserting \"$2\" module." echo "Aborting." ;; esac ;; 19) case $Ml in fr) echo "Recherche d'un loop device disponible..." ;; *) echo "Looking for an available loop device..." ;; esac ;; 20) case $Ml in fr) echo "Loop device disponible trouvé: $2." ;; *) echo "Found available loop device: $2." ;; esac echo "" ;; 21) case $Ml in fr) echo -n "Teste l'insertion du module \"$2\"... " ;; *) echo -n "Testing insertion of \"$2\" module... " ;; esac ;; 22) case $Ml in fr) echo "Aucun loop device n'est disponible." echo "Abandon." ;; *) echo "Couldn't find any available loop device." echo "Aborting." ;; esac ;; 23) case $Ml in fr) echo "Création d'un container vide $3 de $2 Mo dans le répertoire $4 en cours." echo "Ce container appartiendra à l'utilisateur $5 et au groupe $6." echo "Cette étape peut prendre un certain temps - Veuillez patienter..." ;; *) echo "Creating a $2 MB random file $3 in directory $4." echo "This container will be owned by user $5 and group $6." echo "This step can take some time to complete - Please wait..." ;; esac ;; 24) case $Ml in fr) echo "Montage du container $2 sur $3" echo " avec chiffrement $4." echo "Vous devez choisir une phrase secrète d'au moins 20 caractères." echo "ATTENTION: Soyez soigneux en tapant votre phrase secrète, vous ne" echo " la taperez qu'une fois..." ;; *) echo "Mounting container $2 with cipher $4" echo " on $3." echo "You will need to choose a passphrase made with at least 20 characters." echo "WARNING: Be careful when typing your passphrase, you will type it" echo " only once..." ;; esac ;; 25) case $Ml in fr) echo -n "Formatage de $2... " ;; *) echo -n "Formatting $2... " ;; esac ;; 26) case $Ml in fr) echo -n "Démontage de $2... " ;; *) echo -n "Unmounting $2... " ;; esac ;; 27) echo "" case $Ml in fr) echo "Remontage du container $2 sur $3" echo "pour vérification de la phrase secrète, et contrôle du système de fichiers." ;; *) echo "Remounting container $2 on $3" echo "for checking passphrase and filesystem integrity." ;; esac ;; 28) case $Ml in fr) echo -n "Contrôle du système de fichiers... " ;; *) echo -n "Checking filesystem integrity... " ;; esac ;; 29) case $Ml in fr) echo -n "Création du répertoire de montage: $2... " ;; *) echo -n "Creating mouting directory: $2... " ;; esac ;; 30) case $Ml in fr) echo -n "Réglage des permissions répertoire et fichier... " ;; *) echo -n "Setting file and directory permissions... " ;; esac ;; 31) case $Ml in fr) echo -n "Essai de montage du répertoire chiffré... " ;; *) echo -n "Trying to mount encrypted directory... " ;; esac ;; 32) case $Ml in fr) echo -n "Réglage des dernières permissions... " ;; *) echo -n "Setting last permissions... " ;; esac ;; 33) case $Ml in fr) echo -n "Démontage du répertoire chiffré... " ;; *) echo -n "Unmounting encrypted directory... " ;; esac ;; 34) echo "" case $Ml in fr) echo "VOTRE CONTAINER CHIFFRE A ETE CREE AVEC SUCCES !" ;; *) echo "YOUR ENCRYPTED CONTAINER HAS BEEN SUCCESSFULLY CREATED!" ;; esac echo "" ;; 35) case $Ml in fr) echo "Mise à jour du fichier /etc/fstab..." ;; *) echo "Updating /etc/fstab..." ;; esac ;; 36) echo "" case $Ml in fr) echo "Une copie de secours de votre fichier /etc/fstab" echo "a été effectuée dans /etc/fstab.mkcryptfs.bak avant" echo "que des modifications ne soient faites." ;; *) echo "A backup copy of your /etc/fstab file has been made" echo "/etc/fstab.mkcryptfs.bak before performing any modification." ;; esac echo "" ;; 37) echo "" case $Ml in fr) echo "Une copie de secours de votre fichier /etc/fstab" echo "existait déjà dans /etc/fstab.mkcryptfs.bak." echo "Aucune nouvelle copie ne sera faite." ;; *) echo "A backup copy of your /etc/fstab file already existed" echo "in /etc/fstab.mkcryptfs.bak. No new copy will be made." ;; esac echo "" ;; 38) echo "" case $Ml in fr) echo "Une copie de secours de votre fichier /etc/fstab N'A PAS PU" echo "être effectuée dans /etc/fstab.mkcryptfs.bak. La procédure" echo "se poursuit quand même." ;; *) echo "A backup copy of your /etc/fstab file COULD NOT be made" echo "in /etc/fstab.mkcryptfs.bak. Procedure goes on anyway." ;; esac echo "" ;; 39) case $Ml in fr) echo "La mise-à-jour automatique de /etc/fstab a réussi !" echo "" echo "Désormais, l'utilisateur $2 pourra monter son système de fichiers chiffré" echo "en tapant simplement la commande:" ;; *) echo "The automatic update of /etc/fstab succeeded!" echo "" echo "From now on, user $2 will be able to mount his encrypted filesystem" echo "by just typing the command:" ;; esac echo "mount $Mountdir" ;; 40) case $Ml in fr) echo "Je n'ai pas pu mettre à jour /etc/fstab !" echo "Vous devrez contrôler votre fichier /etc/fstab manuellement." ;; *) echo "I couldn't update /etc/fstab!" echo "You will have to check this manually." ;; esac ;; 41) case $Ml in fr) echo "Votre système de fichier chiffré est déjà mentionné dans /etc/fstab !" echo "Je ne peux donc pas mettre à jour /etc/fstab dans ces conditions." echo "Vous devrez contrôler votre fichier /etc/fstab manuellement." ;; *) echo "Your encrypted filesystem is already listed in /etc/fstab!" echo "Thus, I cannot update /etc/fstab automatically." echo "You will have to check this manually." ;; esac ;; 42) case $Ml in fr) echo "Je ne trouve pas le fichier /etc/fstab..." echo "Je ne peux donc pas le mettre à jour." echo "Vous devrez résoudre ce problème manuellement." ;; *) echo "Couldn't find /etc/fstab, so I couldn't update it..." echo "You will have to check this manually." ;; esac ;; 43) echo "" case $Ml in fr) echo "Fin normale de la procédure." ;; *) echo "Procedure ends successfully." ;; esac ;; 44) echo "" case $Ml in fr) echo "Nettoyage terminé." echo "" echo "La création du container chiffré A ECHOUE." echo "Abandon." ;; *) echo "Finished cleaning up." echo "" echo "Procedure FAILED creating an encrypted container." echo "Exiting on abort." ;; esac ;; 45) case $Ml in fr) echo "Attente de 10 secondes pour la création d'un loop device par devfsd." ;; *) echo "Waiting 10 seconds for devfsd to create a loop device." ;; esac ;; 46) case $Ml in fr) echo "Echec." ;; *) echo "Failed." ;; esac ;; *) case $Ml in fr) echo "ERREUR: Le message à afficher n'est pas défini !" ;; *) echo "ERROR: Message to be displayed is undefined!" ;; esac ;; esac } # Displays program version version () { message version echo "" echo "Utilise:" echo "kernel version: `uname -srm`" echo "modprobe version: `modprobe -V 2> /dev/null | head -1`" echo "mount version: `mount -V 2>&1 | head -1`" echo "mke2fs version: `mke2fs -V 2>&1 | head -1`" echo "e2fsck version: `e2fsck -V 2>&1 | head -1`" echo "dd version: `dd --version 2>&1 | head -1`" echo "ls version: `ls --version 2>&1 | head -1`" echo "cp version: `cp --version 2>&1 | head -1`" echo "mv version: `mv --version 2>&1 | head -1`" echo "mkdir version: `mkdir --version 2>&1 | head -1`" echo "rmdir version: `rmdir --version 2>&1 | head -1`" echo "chown version: `chown --version 2>&1 | head -1`" echo "chmod version: `chmod --version 2>&1 | head -1`" echo "grep version: `grep -V 2>&1 | head -1`" echo "cut version: `cut --version 2>&1 | head -1`" echo "awk version: `awk --version 2>&1 | head -1`" exit 1 } # Displays usage information usage () { message version echo "" message usage case $Ml in fr) echo " -ou- $0 version" echo " Affiche la version de ce programme." echo "" echo " -ou- $0 help" echo " Affiche une aide plus détaillée." ;; *) echo " -or- $0 version" echo " Displays program version." echo "" echo " -or- $0 help" echo " Displays more detailed help." ;; esac exit 1 } # Displays help help () { echo "$0 help:" echo "" message help exit 1 } # Performs some cleanup and quits script when a step has failed failure () { message 1 if [ $Funmount == yes ] && grep -n $Mountdir /proc/mounts; then echo -n "Unmounting encrypted directory... " umount $Mountdir message 2 fi if [ $Frmmdir == yes ] && [ -d $Mountdir ]; then echo -n "Removing directory $Mountdir... " rmdir $Mountdir message 2 fi if [ $Funloop == yes ] && { losetup $Loopdev > /dev/null; }; then echo -n "Unmounting loop device $Loopdev... " losetup -d $Loopdev message 2 fi if [ $Frmctr == yes ] && [ -f $Container ]; then echo -n "Removing $Container... " rm -f $Container message 2 fi message 44 exit 1 } # Checks that a program which is needed by this script is present checkprog () { if ! ( [ -x /bin/$1 ] || [ -x /usr/bin/$1 ] || [ -x /usr/local/bin/$1 ] \ || [ -x /sbin/$1 ] || [ -x /usr/sbin/$1 ] || [ -x /usr/local/sbin/$1 ] ); then message 3 $1 exit 1 fi } # Checks the return code of some command checkstep() { if [ a${1}a == a0a ];then message 2 else message 6 $1 failure fi } # Executes the specified command, then checks its return code step() { # echo "Executing: $*" $* > /dev/null checkstep $? } # Main part -------------------------------------------------------------- # Resets a couple of flags Frmctr=no; Frmmdir=no; Funloop=no; Funmount=no # Tests the user language setting if ( [ $LANG ] && echo $LANG | grep -q ^fr ) \ || ( [ $LANGUAGE ] && echo $LANGUAGE | grep -q ^fr );then Ml=fr else Ml=en fi # Tests that the script is executed as root if [ a${UID}a != a0a ]; then message 7 exit 1 fi # Tests that CMode has been set OK if [ a${CMode}a != aloop-aesa ] && [ a${CMode}a != acryptoapia ]; then message 4 exit 1 fi # Tests that FSType has been set OK if [ a${FSType}a != aext3a ] && [ a${FSType}a != aext2a ]; then message 9 exit 1 fi # Tests that at least one parameter has been specified if [ $# == 0 ];then message 8 echo "" usage fi # Was help requested ? if [ $1 == help ] || [ $1 == HELP ] || [ $1 == --help ] || [ $1 == -h ]; then help fi # Was version display requested ? if [ $1 == version ] || [ $1 == VERSION ] || [ $1 == --version ] || [ $1 == -V ]; then version fi # Tests for correct number of parameters if [ $# != 3 ];then message 10 echo "" usage fi # Tests if required programs are available checkprog grep checkprog cut checkprog dd checkprog modprobe checkprog chmod checkprog chown checkprog losetup checkprog mount checkprog umount checkprog mke2fs checkprog e2fsck checkprog rm checkprog mkdir checkprog rmdir checkprog cp checkprog mv checkprog ls checkprog awk checkprog sleep # Determines if first parameter specifies a directory or username if [ -d $1 ]; then # A "$1" directory exists: Lets' consider it as a directory CryptHomeDir=$1 # Determine owner of destination directory OwnArray=(`ls -ld $CryptHomeDir | awk '{print $3 " " $4}'`) CryptOwner=${OwnArray[0]}; CryptGroup=${OwnArray[1]} # echo "Mode=Directory; Directory=$CryptHomeDir; Owner=$CryptOwner; Group=$CryptGroup" # A "$1" directory doesn't exist: Let's check for a username elif grep -q $1: /etc/passwd; then # User "$1" was found in /etc/passwd CryptOwner=$1 # Get User group CryptGroup=`grep $CryptOwner: /etc/passwd | cut -d: -f4` # Tests if user homedir exists CryptHomeDir=`grep $CryptOwner: /etc/passwd | cut -d: -f6` if ! [ -d $CryptHomeDir ]; then message 12 $CryptHomeDir $CryptOwner exit 1 fi # echo "Mode=Username; Directory=$CryptHomeDir; Owner=$CryptOwner; Group=$CryptGroup" # No "$1" directory or user exists: Complain else message 11 $1 exit 1 fi # Tests if container file or mounting directory already exists Container=$CryptHomeDir/.$2 if [ -a $CryptHomeDir/$2 ] || [ -a $Container ]; then message 13 $CryptHomeDir $2 exit 1 fi # Tests if requested size is numerical if ! echo $3 | grep -q ^[0-9][0-9]*$;then message 14 $3 echo "" usage fi # Tests if requested size >= 1 if [[ $3 < 1 ]]; then message 15 $3 echo "" usage fi # Tests if /dev/urandom present if ! [ -c /dev/urandom ]; then message 16 exit 1 fi # Tests if /proc/mounts present if ! [ -f /proc/mounts ]; then message 17 exit 1 fi # Tests if cryptoloop module inserts OK if [ a${TMcryptoloop}a == ayesa ]; then message 21 cryptoloop if ! modprobe cryptoloop; then message 18 cryptoloop exit 1 else echo "OK." fi fi # Tests if loop_fish2 module inserts OK if [ a${TMloop_fish2}a == ayesa ]; then message 21 loop_fish2 if ! modprobe loop_fish2; then message 18 loop_fish2 exit 1 else echo "OK." fi fi # Tests if loop module inserts OK if [ a${TMloop}a == ayesa ]; then message 21 loop if ! modprobe loop; then message 18 loop exit 1 else echo "OK." fi fi # Looks for an available loop device message 19 Loopdev=NONE for (( s = 1; s <= 10; s++ ));do if [ -b /dev/loop0 ]; then if [ $s != 1 ]; then echo "OK." fi Loopdev=OK s=11 else if [ $s == 1 ]; then message 45 fi echo -n "$s... " sleep 1 fi done if [ $Loopdev == NONE ]; then message 46 message 22 exit 1 fi Loopdev=NONE for l in `echo /dev/loop[0-9]`; do if [ $Loopdev == NONE ] && ! grep -q $l /proc/mounts && ! { losetup $l &> /dev/null; }; then Loopdev=$l fi done if [ $Loopdev != NONE ]; then message 20 $Loopdev else message 22 exit 1 fi # Creates a container file from random data message 23 $3 "\".$2\"" $CryptHomeDir $CryptOwner $CryptGroup Frmctr=yes step dd if=/dev/urandom of=$Container bs=1024k count=$3 # Connects created container to loopback device if [ "$CMode" == "loop-aes" ]; then Cipher=$LCipher else Cipher=$CCipher fi echo "" message 24 $Container $Loopdev $Cipher if [ "$CMode" == "loop-aes" ] || ( [ "$CMode" == "cryptoapi" ] && [ $CKeybits == manual ] ); then losetup -e $Cipher $Loopdev $Container checkstep $? else losetup -e $Cipher -k $CKeybits $Loopdev $Container checkstep $? fi Funloop=yes echo "" # Makes filesystem on loop device message 25 $Loopdev if [ $FSType == ext3 ];then step mke2fs -j $Loopdev else step mke2fs $Loopdev fi # Disconnects container from loop device message 26 $Loopdev step losetup -d $Loopdev Funloop=no # Reconnects container to loop device (checks passphrase) message 27 $Container $Loopdev if [ "$CMode" == "loop-aes" ] || ( [ "$CMode" == "cryptoapi" ] && [ $CKeybits == manual ] ); then losetup -e $Cipher $Loopdev $Container checkstep $? else losetup -e $Cipher -k $CKeybits $Loopdev $Container checkstep $? fi Funloop=yes echo "" # Encrypted filesystem fsck message 28 e2fsck -fyC 0 $Loopdev > /dev/null checkstep $? # Creates mount directory Mountdir=$CryptHomeDir/$2 message 29 $Mountdir step mkdir $Mountdir Frmmdir=yes # Sets ownership and permissions message 30 chown $CryptOwner:$CryptGroup $Mountdir && chown $CryptOwner:$CryptGroup $Container \ && chmod 700 $Mountdir && chmod 600 $Container checkstep $? # Now mounts the encrypted filesystem message 31 if [ $FSType == ext3 ];then step mount -t ext3 $Loopdev $Mountdir else step mount -t ext2 $Loopdev $Mountdir fi Funmount=yes # Sets ownership and permissions message 32 chown -R $CryptOwner:$CryptGroup $Mountdir \ && chmod -R go= $Mountdir && chmod 700 $Mountdir checkstep $? Frmmdir=no; Frmctr=no # Unmounts encrypted filesystem message 33 step umount $Mountdir Funmount=no # Disconnects container from loop device message 26 $Loopdev step losetup -d $Loopdev Funloop=no # Issues success message message 34 # Updates fstab message 35 FstabOK=no if [ -f /etc/fstab ]; then if ! grep -q $Mountdir /etc/fstab && ! grep -q $Container /etc/fstab; then if ! [ -f /etc/fstab.mkcryptfs.bak ]; then cp /etc/fstab /etc/fstab.mkcryptfs.bak if [ $? == 0 ]; then message 36 else message 38 fi else message 37 fi if cp /etc/fstab /etc/fstab.$$.tmp; then if [ "$CMode" == "loop-aes" ] || ( [ "$CMode" == "cryptoapi" ] && [ $CKeybits == manual ] ); then if [ $FSType == ext3 ];then echo "$Container $Mountdir ext3 user,loop,noauto,noatime,data=journal,encryption=$Cipher 0 0" >> /etc/fstab.$$.tmp else echo "$Container $Mountdir ext2 user,loop,noauto,noatime,encryption=$Cipher 0 0" >> /etc/fstab.$$.tmp fi else if [ $FSType == ext3 ];then echo "$Container $Mountdir ext3 user,loop,noauto,noatime,data=journal,encryption=$Cipher,keybits=$CKeybits 0 0" >> /etc/fstab.$$.tmp else echo "$Container $Mountdir ext2 user,loop,noauto,noatime,encryption=$Cipher,keybits=$CKeybits 0 0" >> /etc/fstab.$$.tmp fi fi if [ $? == 0 ] && mv -f /etc/fstab.$$.tmp /etc/fstab; then FstabOK=yes fi fi if [ $FstabOK == yes ]; then message 39 $1 else message 40 fi else message 41 fi else message 42 fi # End message 43 exit 0