Файл, в котором располагается обработка списка опций, а также реализация
механизма проверки пароля и повторного шифрования суперблока, называется
super.c и располагается в директории linux-2.0.36/fs/ext2_crypt/.
Обработка списка опций осуществляется функцией parse_options(...),
а механизм проверки пароля реализован в функции ext2_crypt_read_super(...)
и выглядит, как приведено ниже:
/*
* Cheking the password...
*/
if(es->s_magic == EXT2_CRYPT_SUPER_MAGIC){
! crypt_super = (char*) &(es->s_second_magic);
! for(k = 0; k < sizeof(__u32); k++)
! *(crypt_super++) ^= password_key;
if(es->s_second_magic != EXT2_CRYPT_SUPER_MAGIC){
tty_write_message(current->tty,"\nPassword incorrect\n\r");
goto failed_mount;
}
}
else{
crypt_super = (char*) es;
for(k = 0; k < (SUPERBLOCK_SIZE-4); k++)
*(crypt_super++) ^= password_key;
if(es->s_magic != EXT2_CRYPT_SUPER_MAGIC){
tty_write_message(current->tty,"\nPassword incorrect\n\r");
goto failed_mount;
}
}
Строчки, помеченные восклицательными знаками, есть ничто иное, как алгоритм шифрования, используемый для защиты абсолютно всех защищенных в данной реализации элементов системы. Очевидно, он слишком прост, и имеет место тот факт, что алгоритмы зашифровывания и расшифровывания совпадают. Однако, данный алгоритм можно очень легко и безболезненно заменить на любой другой более сложный, и мало того, для еще большего повышения надежности, можно использовать разные алгоритмы для шифрования разных элементов системы.
Что касается повторного шифрования суперблока, то оно осуществляется в функции ext2_crypt_put_super(...), так как именно эта функция вызывается в момент отмонтирования системы.
Также, необходимо сказать о механизмах защиты информации в файлах. Данные механизмы располагаются в той же директории в файле file.c и осуществляются следующими функциями:
int ext2_crypt_file_read(struct inode * inode,
struct file * filp, char * buf, int count)
{
int read,i;
char ch;
read = generic_file_read(inode, filp, buf, count);
for(i = 0; i < read; i++) {
ch = get_user(buf);
ch ^= inode->i_sb->u.ext2_crypt_sb.password;
put_user(ch,buf++);
}
return read;
}
static int ext2_crypt_file_write (struct inode * inode, struct file * filp,
const char * buf, int count)
{
int i;
char ch;
for(i = 0; i < count; i++) {
ch = get_user(buf);
ch ^= inode->i_sb->u.ext2_crypt_sb.password;
put_user(ch,buf++);
}
buf -= count;
return ext2_file_write(inode,filp,buf,count);
}
И, наконец, о шифровании имен файлов. Реализация шифрования данных элементов системы находится в той же директории в файле namei.c. Ниже приводится уже описанный, но несколько адаптированный для этого случая, алгоритм шифрования, который в такой модификации осуществляет шифрование имен файлов:
/*
* Crypting the name ...
*/
crypt_name = name;
while(*crypt_name != '\0'){
*(crypt_name++) ^=
dir->i_sb->u.ext2_crypt_sb.password;
}