From: Evgeniy Polyakov <johnpol@2ka.mipt.ru>
To: linux-kernel@vger.kernel.org
Cc: Fruhwirth Clemens <clemens@endorphin.org>,
Herbert Xu <herbert@gondor.apana.org.au>,
cryptoapi@lists.logix.cz, James Morris <jmorris@redhat.com>,
David Miller <davem@davemloft.net>, Andrew Morton <akpm@osdl.org>,
Evgeniy Polyakov <johnpol@2ka.mipt.ru>
Subject: [??/many] ucon_crypto.c - simple example of the userspace acrypto usage [DIRECT ACCESS]
Date: Mon, 7 Mar 2005 23:37:33 +0300 [thread overview]
Message-ID: <1110227853910@2ka.mipt.ru> (raw)
In-Reply-To: <1110227853606@2ka.mipt.ru>
/*
* ucon_crypto.c
*
* Copyright (c) 2004 Evgeniy Polyakov <johnpol@2ka.mipt.ru>
*
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
#include <asm/types.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/poll.h>
#include <sys/mman.h>
#include <linux/netlink.h>
#include <linux/types.h>
#include <linux/rtnetlink.h>
#include <arpa/inet.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <errno.h>
#include <time.h>
#include "../connector/connector.h"
#include "crypto_def.h"
#include "crypto_conn.h"
#include "crypto_user.h"
static int need_exit;
static __u32 seq;
static int netlink_send(FILE *out, int s, struct cn_msg *msg)
{
struct nlmsghdr *nlh;
unsigned int size;
char buf[128];
int err;
struct cn_msg *m;
struct crypto_conn_data *cmd;
cmd = (struct crypto_conn_data *)(msg + 1);
size = NLMSG_SPACE(sizeof(struct cn_msg) + msg->len);
nlh = (struct nlmsghdr *)buf;
nlh->nlmsg_seq = seq++;
nlh->nlmsg_pid = getpid();
nlh->nlmsg_type = NLMSG_DONE;
nlh->nlmsg_len = NLMSG_LENGTH(size - sizeof(*nlh));
nlh->nlmsg_flags = 0;
m = NLMSG_DATA(nlh);
printf("%s: len=%u, seq=%u, ack=%u, "
"name=%s, cmd=%02x.\n",
__func__,
msg->len, msg->seq, msg->ack,
cmd->name, cmd->cmd);
memcpy(m, msg, sizeof(*m) + msg->len);
err = send(s, nlh, size, 0);
if (err == -1)
{
fprintf(out, "Failed to send: %s [%d].\n",
strerror(errno), errno);
return err;
}
fprintf(out, "%d bytes has been sent.\n", size);
return 0;
}
static int send_cmd(FILE *out, int s, struct crypto_conn_data *cm)
{
struct cn_msg *data;
struct crypto_conn_data *m;
int size;
size = sizeof(*data) + sizeof(*m) + cm->len;
data = malloc(size);
if (!data)
return -ENOMEM;
memset(data, 0, size);
data->id.idx = 0xdead;
data->id.val = 0x0000;
data->seq = seq++;
data->ack = 0;
data->len = sizeof(*cm) + cm->len;
m = (struct crypto_conn_data *)(data + 1);
memcpy(m, cm, sizeof(*m));
memcpy(m+1, cm->data, cm->len);
return netlink_send(out, s, data);
}
static int request_stat(FILE *out, int s, char *name)
{
struct crypto_conn_data m;
memset(&m, 0, sizeof(m));
m.cmd = CRYPTO_GET_STAT;
m.len = 0;
snprintf(m.name, sizeof(m.name), "%s", name);
return send_cmd(out, s, &m);
}
static void process_stat(FILE *out, struct cn_msg *data)
{
struct crypto_device_stat *stat;
struct crypto_conn_data *m;
time_t tm;
m = (struct crypto_conn_data *)(data + 1);
stat = (struct crypto_device_stat *)(m+1);
time(&tm);
fprintf(out,
"%.24s : [%x.%x] [seq=%u, ack=%u], name=%s, cmd=%#02x, "
"sesions: completed=%llu, started=%llu, finished=%llu, kmem_failed=%llu.\n",
ctime(&tm), data->id.idx, data->id.val,
data->seq, data->ack, m->name, m->cmd,
stat->scompleted, stat->sstarted, stat->sfinished, stat->kmem_failed);
fflush(out);
}
static void dump_data(FILE *out, unsigned char *ptr)
{
int i;
fprintf(out, "UCON DATA: ");
for (i=0; i<32; ++i)
fprintf(out, "%02x ", ptr[i]);
fprintf(out, "\n");
}
static int request_crypto(FILE *out, int s, char *name)
{
void *ptr;
int size, err;
struct crypto_user usr;
struct crypto_conn_data *m;
size = 4000;
ptr = malloc(size);
if (!ptr)
{
fprintf(out, "Failed to allocate %d byte area.\n", size);
return -1;
}
memset(ptr, 0x00, size);
err = mlock(ptr, size);
if (err == -1)
{
fprintf(out, "Failed to lock %d byte area.\n", size);
free(ptr);
return -1;
}
memset(&usr, 0, sizeof(usr));
usr.operation = CRYPTO_OP_ENCRYPT;
usr.mode = CRYPTO_MODE_ECB;
usr.type = CRYPTO_TYPE_AES_128;
usr.priority = 0;
usr.src = (__u64)ptr;
usr.src_size = size;
usr.dst = (__u64)ptr;
usr.dst_size = size;
usr.pid = getpid();
usr.key_size = 0;
usr.iv_size = 0;
m = malloc(sizeof(*m) + sizeof(usr) + usr.key_size + usr.iv_size);
if (!m)
return -ENOMEM;
memset(m, 0, sizeof(m));
memcpy(m+1, &usr, sizeof(usr));
m->cmd = CRYPTO_REQUEST;
m->len = sizeof(usr);
snprintf(m->name, sizeof(m->name), "%s", name);
dump_data(out, ptr);
err = send_cmd(out, s, m);
if (err)
goto err_out_free;
fprintf(out, "Command was sent.\n");
sleep(1);
dump_data(out, ptr);
//return 0;
err_out_free:
free(m);
err = munlock(ptr, size);
if (err == -1)
{
fprintf(out, "Failed to unlock %d byte area.\n", size);
free(ptr);
return -1;
}
free(ptr);
return err;
}
int main(int argc, char *argv[])
{
int s, tmp;
char buf[128];
int len;
struct nlmsghdr *reply;
struct sockaddr_nl l_local;
struct cn_msg *data;
struct crypto_conn_data *m;
FILE *out;
struct pollfd pfd;
if (argc < 2)
out = stdout;
else {
out = fopen(argv[1], "a+");
if (!out) {
fprintf(stderr, "Unable to open %s for writing: %s\n",
argv[1], strerror(errno));
out = stdout;
}
}
memset(buf, 0, sizeof(buf));
s = socket(PF_NETLINK, SOCK_DGRAM, NETLINK_NFLOG);
if (s == -1) {
perror("socket");
return -1;
}
l_local.nl_family = AF_NETLINK;
l_local.nl_groups = 0xdead;
l_local.nl_pid = getpid();
if (bind(s, (struct sockaddr *)&l_local, sizeof(struct sockaddr_nl)) == -1) {
perror("bind");
close(s);
return -1;
}
pfd.fd = s;
//request_stat(s, "async_provider0");
for (len=0; len<1000; ++len)
request_crypto(out, s, "hifn0");
tmp = 0;
while (!need_exit) {
pfd.events = POLLIN;
pfd.revents = 0;
switch (poll(&pfd, 1, -1))
{
case 0:
need_exit = 1;
break;
case -1:
if (errno != EINTR)
{
need_exit = 1;
break;
}
continue;
}
if (need_exit)
break;
memset(buf, 0, sizeof(buf));
len = recv(s, buf, sizeof(buf), 0);
if (len == -1) {
perror("recv buf");
close(s);
return -1;
}
reply = (struct nlmsghdr *)buf;
switch (reply->nlmsg_type) {
case NLMSG_ERROR:
fprintf(out, "Error message received.\n");
fflush(out);
break;
case NLMSG_DONE:
data = (struct cn_msg *)NLMSG_DATA(reply);
m = (struct crypto_conn_data *)(data + 1);
switch (m->cmd)
{
case CRYPTO_GET_STAT:
process_stat(out, data);
break;
default:
break;
}
break;
default:
break;
}
}
close(s);
return 0;
}
next prev parent reply other threads:[~2005-03-07 21:21 UTC|newest]
Thread overview: 84+ messages / expand[flat|nested] mbox.gz Atom feed top
2005-03-07 20:37 [0/many] Acrypto - asynchronous crypto layer for linux kernel 2.6 Evgeniy Polyakov
2005-03-07 20:37 ` [??/many] list of files to be sent in a next couple of e-mails with small description Evgeniy Polyakov
2005-03-07 20:37 ` [??/many] acrypto benchmarks vs cryptoloop vs dm_crypt Evgeniy Polyakov
2005-03-07 20:37 ` [??/many] iok.c - simple example of the userspace acrypto usage [IOCTL] Evgeniy Polyakov
2005-03-07 20:37 ` Evgeniy Polyakov [this message]
2005-03-07 20:37 ` [1/many] acrypto: Kconfig Evgeniy Polyakov
2005-03-07 20:37 ` [2/many] acrypto: Makefile Evgeniy Polyakov
2005-03-07 20:37 ` [3/many] acrypto: acrypto.h Evgeniy Polyakov
2005-03-07 20:37 ` [4/many] acrypto: async_provider.c Evgeniy Polyakov
2005-03-07 20:37 ` [5/many] acrypto: crypto_conn.c Evgeniy Polyakov
2005-03-07 20:37 ` [6/many] acrypto: crypto_conn.h Evgeniy Polyakov
2005-03-07 20:37 ` [7/many] acrypto: crypto_def.h Evgeniy Polyakov
2005-03-07 20:37 ` [8/many] acrypto: crypto_dev.c Evgeniy Polyakov
2005-03-07 20:37 ` [9/many] acrypto: crypto_lb.c Evgeniy Polyakov
2005-03-07 20:37 ` [10/many] acrypto: crypto_lb.h Evgeniy Polyakov
2005-03-07 20:37 ` [11/many] acrypto: crypto_main.c Evgeniy Polyakov
2005-03-07 20:37 ` [12/many] acrypto: crypto_route.h Evgeniy Polyakov
2005-03-07 20:37 ` [13/many] acrypto: crypto_stat.c Evgeniy Polyakov
2005-03-07 20:37 ` [14/many] acrypto: crypto_stat.h Evgeniy Polyakov
2005-03-07 20:37 ` [15/many] acrypto: crypto_user.c Evgeniy Polyakov
2005-03-07 20:37 ` [16/many] acrypto: crypto_user.h Evgeniy Polyakov
2005-03-07 20:37 ` [17/many] acrypto: crypto_user_direct.c Evgeniy Polyakov
2005-03-07 20:37 ` [18/many] acrypto: crypto_user_direct.h Evgeniy Polyakov
2005-03-07 20:37 ` [19/many] acrypto: crypto_user_ioctl.c Evgeniy Polyakov
2005-03-07 20:37 ` [20/many] acrypto: crypto_user_ioctl.h Evgeniy Polyakov
2005-03-07 20:37 ` [21/many] acrypto: simple_lb.c Evgeniy Polyakov
2005-03-07 20:37 ` [22/many] arch: alpha config Evgeniy Polyakov
2005-03-07 20:37 ` [23/many] arch: arm config Evgeniy Polyakov
2005-03-07 20:37 ` [24/many] arch: arm26 config Evgeniy Polyakov
2005-03-07 20:37 ` [25/many] arch: cris config Evgeniy Polyakov
2005-03-07 20:37 ` [26/many] arch: frv config Evgeniy Polyakov
2005-03-07 20:37 ` [27/many] arch: h8300 config Evgeniy Polyakov
2005-03-07 20:37 ` [28/many] arch: i386 config Evgeniy Polyakov
2005-03-07 20:37 ` [29/many] arch: ia64 config Evgeniy Polyakov
2005-03-07 20:37 ` [30/many] arch: m32r config Evgeniy Polyakov
2005-03-07 20:37 ` [31/many] arch: m68k config Evgeniy Polyakov
2005-03-07 20:37 ` [32/many] arch: m68knommu config Evgeniy Polyakov
2005-03-07 20:37 ` [33/many] arch: mips config Evgeniy Polyakov
2005-03-07 20:37 ` [34/many] arch: parisc config Evgeniy Polyakov
2005-03-07 20:37 ` [35/many] arch: ppc config Evgeniy Polyakov
2005-03-07 20:37 ` [36/many] arch: ppc64 config Evgeniy Polyakov
2005-03-07 20:37 ` [37/many] arch: s390 config Evgeniy Polyakov
2005-03-07 20:37 ` [38/many] arch: sh config Evgeniy Polyakov
2005-03-07 20:37 ` [39/many] arch: sh64 config Evgeniy Polyakov
2005-03-07 20:37 ` [40/many] arch: sparc config Evgeniy Polyakov
2005-03-07 20:37 ` [41/many] arch: sparc64 config Evgeniy Polyakov
2005-03-07 20:37 ` [42/many] arch: um config Evgeniy Polyakov
2005-03-07 20:37 ` [43/many] arch: v850 config Evgeniy Polyakov
2005-03-07 20:37 ` [44/many] arch: x86_64 config Evgeniy Polyakov
2005-03-07 20:37 ` [1/5] bd: Asynchronous block device Evgeniy Polyakov
2005-03-07 20:37 ` [2/5] bd: userspace utility to control asynchronous " Evgeniy Polyakov
2005-03-07 20:37 ` [4/5] bd: script for binding file and acrypto filters Evgeniy Polyakov
2005-03-07 20:37 ` [5/5] bd: script for unbinding any filters Evgeniy Polyakov
2005-03-08 15:16 ` [1/5] bd: Asynchronous block device Evgeniy Polyakov
2005-03-15 17:27 ` [16/many] acrypto: crypto_user.h Randy.Dunlap
2005-03-15 16:24 ` [11/many] acrypto: crypto_main.c Randy.Dunlap
2005-03-16 4:58 ` Evgeniy Polyakov
2005-03-08 18:02 ` [UPDATE PATCH 9/many] acrypto: crypto_lb.c Nishanth Aravamudan
2005-03-08 18:33 ` Evgeniy Polyakov
2005-03-10 19:18 ` [9/many] " Randy.Dunlap
2005-03-07 22:40 ` [8/many] acrypto: crypto_dev.c Nish Aravamudan
2005-03-07 23:14 ` Evgeniy Polyakov
2005-03-07 22:51 ` Nish Aravamudan
2005-03-07 23:27 ` Evgeniy Polyakov
2005-03-08 1:46 ` [UPDATE PATCH 8/many] " Nishanth Aravamudan
2005-03-08 9:40 ` Evgeniy Polyakov
2005-03-07 23:37 ` [8/many] " Randy.Dunlap
2005-03-08 0:05 ` Evgeniy Polyakov
2005-03-07 23:50 ` [3/many] acrypto: acrypto.h Randy.Dunlap
2005-03-08 0:34 ` Evgeniy Polyakov
2005-03-07 23:33 ` [1/many] acrypto: Kconfig Randy.Dunlap
2005-03-08 0:03 ` Evgeniy Polyakov
2005-03-07 21:13 ` [0/many] Acrypto - asynchronous crypto layer for linux kernel 2.6 Fruhwirth Clemens
2005-03-07 21:49 ` Evgeniy Polyakov
2005-03-08 13:24 ` Joshua Jackson
2005-03-10 10:27 ` Evgeniy Polyakov
2005-03-08 5:08 ` Kyle Moffett
2005-03-08 9:37 ` Evgeniy Polyakov
2005-03-08 12:22 ` Kyle Moffett
2005-03-08 13:07 ` Evgeniy Polyakov
2005-03-08 14:46 ` Kyle Moffett
2005-03-08 15:24 ` Evgeniy Polyakov
2005-03-10 12:42 ` Christophe Saout
2005-03-08 10:30 ` Herbert Xu
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1110227853910@2ka.mipt.ru \
--to=johnpol@2ka.mipt.ru \
--cc=akpm@osdl.org \
--cc=clemens@endorphin.org \
--cc=cryptoapi@lists.logix.cz \
--cc=davem@davemloft.net \
--cc=herbert@gondor.apana.org.au \
--cc=jmorris@redhat.com \
--cc=linux-kernel@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox