Как использовать Linux CryptoAPI из user space без использования libkcapi? Необходимо обратиться к функциям Linux Crypto API из пространства пользователя (user space). Конкретно необходимо encrypt/decrypt gcm(aes). Примеров нет. Т.е. совсем нет. Encrypt/decrypt cbc нашли, проверили - работает! А вот с gcm aes беда. По условиям использовать libkcapi в этом проекте нельзя. Кто нибудь может поделиться реальным примером?
Для использования Linux CryptoAPI из user space без использования libkcapi для шифрования/расшифрования GCM (AES) можно воспользоваться следующим примером кода:
Этот код представляет пример шифрования данных алгоритмом AES-GCM с использованием Linux CryptoAPI из пользовательского пространства. В этом примере данные шифруются, но для дешифрования нужно будет доработать код. Надеюсь, этот пример будет полезен.
Для использования 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 из пользовательского пространства. В этом примере данные шифруются, но для дешифрования нужно будет доработать код. Надеюсь, этот пример будет полезен.