<- ^ -> [Contents]
Предыдущий: 3.2 Модификация mount Выше: 3. Реализация файловой системы Следующий: 4. Заключение

3.3 Модификация файловой системы ext2

Файл, в котором располагается обработка списка опций, а также реализация механизма проверки пароля и повторного шифрования суперблока, называется 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; }