LINUX.ORG.RU

Как генерируются ключи в CryptoAPI Linux?

 , , ,


0

1

Ковыряю стандартный модуль ядра aes-generic. Пытаюсь понять, как работает. Вроде начало понятно, надо создать структурку типа struct crypto_alg, заполнить ее соответствующие поля и записать туда же указатели на функции crypto_aes_set_key, aes_encrypt и aes_decrypt. Эти функции необходимо реализовать в коде. Ничего не меняю, опять же смотрю стандартную реализацию.

int crypto_aes_set_key(struct crypto_tfm *tfm, const u8 *in_key,
		unsigned int key_len)
{
	struct crypto_aes_ctx *ctx = crypto_tfm_ctx(tfm);
	u32 *flags = &tfm->crt_flags;
	int ret;

	ret = crypto_aes_expand_key(ctx, in_key, key_len);
	if (!ret)
		return 0;

	*flags |= CRYPTO_TFM_RES_BAD_KEY_LEN;
	return -EINVAL;
}
Вот здесь не очень понятно. Структура ctx, насколько я понял из документации, необходима для передачи неких приватных данных между вызовами функции шифрования. Ее реализация:
struct crypto_aes_ctx {
	u32 key_enc[AES_MAX_KEYLENGTH_U32];
	u32 key_dec[AES_MAX_KEYLENGTH_U32];
	u32 key_length;
};
Раскопал реализацию структуры tfm:

struct crypto_tfm {

	u32 crt_flags;
	
	union {
		struct cipher_tfm cipher;
		struct digest_tfm digest;
		struct compress_tfm compress;
	} crt_u;
	
	struct crypto_alg *__crt_alg;
};
Реализации различны. Предпоолагаю, что функция crypto_tfm_ctx() выполняет некое преобразование над структурой, но документации по ней я не нашел. Это печалит. Буду признателен, если подскажете, где почитать можно. Далее я предполагаю, что основную работу над преобразованием ключа выполняет функция crypto_aes_expand_key(). Ее хочется попробовать отладить. В начало функции впиливаю такой код:
int crypto_aes_expand_key(struct crypto_aes_ctx *ctx, const u8 *in_key, unsigned int key_len)
{
	const __le32 *key = (const __le32 *)in_key;
	u32 i, t, u, v, w, j;
	#ifdef __DEBUG__
		u8 ic;
		static u8 callnum;
		printk("@setkey: %d \n", callnum++);
                for(ic = 0; ic < key_len; ic++) printk(" %d", *(in_key++));
                printk( "\nlen: %d \n", key_len );
	#endif
Компилю, подгружаю модуль и шифрую тестовый файлик. Парольную фразу использую «password»:
insmod aes_generic_test.ko
cryptsetup -c aestest luksFormat test.img
Смотрю dmesg, а там...
[20424.784155] @setkey: 0 
[20424.784158]  0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
len: 32 
[20424.833566] @setkey: 1 
[20424.833632]  0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
len: 32 
[20427.779761] @setkey: 2 
[20427.779761]  130 92 60 220 127 250 172 229 23 142 121 102 90 147 86 68 83 26 104 151 161 177 175 125 248 18 91 57 36 187 180 43
len: 32 
[20427.779761] @setkey: 3 
[20427.779761]  130 92 60 220 127 250 172 229 23 142 121 102 90 147 86 68 83 26 104 151 161 177 175 125 248 18 91 57 36 187 180 43
len: 32 
Почему-то 4 вызова функции. При этом при первых двух вызовах там вообще нули в ключе. Шифрую еще раз. Вывод dmesg:
[21096.884222] @setkey: 4 
[21096.884226]  0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
len: 32 
[21096.897071] @setkey: 5 
[21096.897077]  0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
len: 32 
[21099.761775] @setkey: 6 
[21099.771637]  247 128 66 45 202 109 37 95 162 76 218 185 161 120 54 193 40 30 45 78 116 189 142 58 123 196 127 156 184 82 145 154
len: 32 
[21099.775441] @setkey: 7 
[21099.775470]  247 128 66 45 202 109 37 95 162 76 218 185 161 120 54 193 40 30 45 78 116 189 142 58 123 196 127 156 184 82 145 154
len: 32 
Выгружаю и загружаю модуль обратно. Шифрую.
[21217.221897] @setkey: 0 
[21217.221897]  0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
len: 32 
[21217.229780] @setkey: 1 
[21217.229783]  0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
len: 32 
[21220.164857] @setkey: 2 
[21220.164857]  141 102 75 227 249 233 47 193 248 96 3 193 14 9 146 192 249 134 63 180 15 82 95 186 75 118 217 162 46 181 170 253
len: 32 
[21220.164857] @setkey: 3 
[21220.164857]  141 102 75 227 249 233 47 193 248 96 3 193 14 9 146 192 249 134 63 180 15 82 95 186 75 118 217 162 46 181 170 253
len: 32
Почему везде разные ключи? Парольные фразы я вводил везде одинаковые. И почему они только на 3-й и 4-й вызов оказываются отличными от нуля? Я не понимаю, как это работает. Могу ли я собственным алгоритмом генерировать ключ из парольной фразы?



Последнее исправление: esvstn (всего исправлений: 2)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.