Доброго времени суток!
Возникла задача создать минимальный образ, зашифровать его простейшим способом и написать драйвер, который будет дешифровать его «на лету».
Сразу оговорюсь, что почти всё делаю по интуиции, и некоторые моменты могут оказаться для вас абсурдными.
Создаю образ:
dd if=/dev/zero of=myFS bs=1024 count=60
mkfs.ext2 myFS
Шифрую XOR-ом:
int main()
{
std::fstream streamIn;
std::fstream streamOut;
const char key = 0b00001111;
streamIn.open("myFS", std::ios_base::binary | std::ios_base::in);
streamOut.open("newFS", std::ios_base::binary | std::ios_base::trunc | std::ios_base::out);
char b;
while (streamIn.read(&b, 1))
{
b ^= key;
streamOut.write(&b, 1);
}
streamIn.close();
streamOut.close();
return 0;
}
Далее пишу драйвер. Он основан на device-mapper target-е, и основная функция обработки запросов имеет следующий прототип:
static int sddm_target_map(struct dm_target *ti, struct bio *bio);
То есть я имею в своём распоряжении структуру bio, в которой, как мне это видится, я должен дешифровать все байты. Хороших примеров я не нашёл, так что прошу не заряжать помидоры) Сделал так:
struct bio_vec vec;
struct bvec_iter it;
unsigned int len;
char *addr;
unsigned int i;
bio_for_each_segment(vec, bio, it)
{
len = vec.bv_len;
addr = (char*)(page_address(vec.bv_page) + vec.bv_offset);
for (i = 0; i != len; ++i)
{
*(addr+i) ^= 0b00001111;
}
}
В драйвере device-mapper target-а необходимо изменить целевое устройство bio->bi_bdev
на реальное и повторить запрос submit_bio(bio)
. Хотя к данной задаче это не особо относится, но может быть кому-то пригодится.
Очевидно, что не всё так просто. При попытке монтирования моего устройства получаю следующее:
mount: wrong fs type, bad option, bad superblock on /dev/mapper/mydevice
Видел ещё такой вариант:
bio_for_each_segment(vec, bio, it)
{
len = vec.bv_len;
addr = kmap_atomic(vec.bv_page);
pointer = (char *)(addr + vec.bv_offset);
for (i = 0; i != len; ++i)
{
*(pointer+i) ^= 0b00001111;
}
kunmap_atomic(addr);
}
Но и он выдаёт ту же ошибку.
Подскажите, как правильно реализовать задуманное! Спасибо!