Как использовать Linux CryptoAPI из user space без использования libkcapi? Необходимо обратиться к функциям Linux Crypto API из пространства пользователя (user space).
Конкретно необходимо encrypt/decrypt gcm(aes). Примеров нет. Т.е. совсем нет.
Encrypt/decrypt cbc нашли, проверили - работает! А вот с gcm aes беда.
По условиям использовать libkcapi в этом проекте нельзя. Кто нибудь может поделиться реальным примером?

20 Ноя 2020 в 19:47
151 +1
0
Ответы
1

Для использования Linux CryptoAPI из user space без использования libkcapi для шифрования/расшифрования GCM (AES) можно воспользоваться следующим примером кода:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <fcntl.h>
#include <sys/ioctl.h>
#include <linux/if_alg.h>
#include <linux/types.h>
#include <linux/socket.h>
#include <linux/crypto.h>
#include <linux/scatterlist.h>
#define AES_KEYSIZE 32
#define IV_SIZE 12
#define TAG_SIZE 16
void error(char *msg) {
perror(msg);
exit(EXIT_FAILURE);
}
int main() {
int tfmfd, sockfd, err;
struct sockaddr_alg sa = {
.salg_family = AF_ALG,
.salg_type = "skcipher",
.salg_name = "gcm(aes)"
};
struct msghdr msg = {0};
struct cmsghdr *cmsg;
char key[AES_KEYSIZE] = "0123456789abcdef0123456789abcdef";
char iv[IV_SIZE] = "123456789012";
char buffer[512] = "Encrypt me with AES-GCM!";
struct iovec iov = {
.iov_base = buffer,
.iov_len = sizeof(buffer)
};
struct af_alg_iv *enc_iv = malloc(sizeof(*enc_iv) + IV_SIZE);
enc_iv->ivlen = IV_SIZE;
memcpy(enc_iv->iv, iv, IV_SIZE);
struct crypto_aead_setkey_aead key_data = {
.key = key,
.keylen = AES_KEYSIZE
};
tfmfd = socket(AF_ALG, SOCK_SEQPACKET, 0);
if (tfmfd < 0) error("socket");
if (bind(tfmfd, (struct sockaddr *)&sa, sizeof(sa)) < 0) error("bind");
if (setsockopt(tfmfd, SOL_ALG, ALG_SET_KEY, &key_data, sizeof(key_data)) < 0) error("setsockopt ALG_SET_KEY");
msg.msg_control = enc_iv;
msg.msg_controllen = sizeof(*enc_iv) + IV_SIZE;
cmsg = CMSG_FIRSTHDR(&msg);
cmsg->cmsg_level = SOL_ALG;
cmsg->cmsg_type = ALG_SET_IV;
cmsg->cmsg_len = CMSG_LEN(sizeof(*enc_iv));
if (sendmsg(tfmfd, &msg, 0) < 0) error("sendmsg ALG_SET_IV");
if (sendmsg(tfmfd, &iov, 1) < 0) error("sendmsg data");
close(tfmfd);
exit(EXIT_SUCCESS);
}

Этот код представляет пример шифрования данных алгоритмом AES-GCM с использованием Linux CryptoAPI из пользовательского пространства. В этом примере данные шифруются, но для дешифрования нужно будет доработать код. Надеюсь, этот пример будет полезен.

17 Апр в 21:56
Не можешь разобраться в этой теме?
Обратись за помощью к экспертам
Название заказа не должно быть пустым
Введите email
Бесплатные доработки
Гарантированные бесплатные доработки
Быстрое выполнение
Быстрое выполнение от 2 часов
Проверка работы
Проверка работы на плагиат
Интересные статьи из справочника
Поможем написать учебную работу
Название заказа не должно быть пустым
Введите email
Доверьте свою работу экспертам
Разместите заказ
Наша система отправит ваш заказ на оценку 84 683 авторам
Первые отклики появятся уже в течение 10 минут
Прямой эфир