Skip to content

Commit 2ebda74

Browse files
gcabidduherbertx
authored andcommitted
crypto: acomp - add asynchronous compression api
Add acomp, an asynchronous compression api that uses scatterlist buffers. Signed-off-by: Giovanni Cabiddu <giovanni.cabiddu@intel.com> Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
1 parent c8d283f commit 2ebda74

File tree

8 files changed

+502
-0
lines changed

8 files changed

+502
-0
lines changed

crypto/Kconfig

+10
Original file line numberDiff line numberDiff line change
@@ -102,6 +102,15 @@ config CRYPTO_KPP
102102
select CRYPTO_ALGAPI
103103
select CRYPTO_KPP2
104104

105+
config CRYPTO_ACOMP2
106+
tristate
107+
select CRYPTO_ALGAPI2
108+
109+
config CRYPTO_ACOMP
110+
tristate
111+
select CRYPTO_ALGAPI
112+
select CRYPTO_ACOMP2
113+
105114
config CRYPTO_RSA
106115
tristate "RSA algorithm"
107116
select CRYPTO_AKCIPHER
@@ -138,6 +147,7 @@ config CRYPTO_MANAGER2
138147
select CRYPTO_BLKCIPHER2
139148
select CRYPTO_AKCIPHER2
140149
select CRYPTO_KPP2
150+
select CRYPTO_ACOMP2
141151

142152
config CRYPTO_USER
143153
tristate "Userspace cryptographic algorithm configuration"

crypto/Makefile

+2
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,8 @@ rsa_generic-y += rsa_helper.o
5050
rsa_generic-y += rsa-pkcs1pad.o
5151
obj-$(CONFIG_CRYPTO_RSA) += rsa_generic.o
5252

53+
obj-$(CONFIG_CRYPTO_ACOMP2) += acompress.o
54+
5355
cryptomgr-y := algboss.o testmgr.o
5456

5557
obj-$(CONFIG_CRYPTO_MANAGER2) += cryptomgr.o

crypto/acompress.c

+118
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,118 @@
1+
/*
2+
* Asynchronous Compression operations
3+
*
4+
* Copyright (c) 2016, Intel Corporation
5+
* Authors: Weigang Li <weigang.li@intel.com>
6+
* Giovanni Cabiddu <giovanni.cabiddu@intel.com>
7+
*
8+
* This program is free software; you can redistribute it and/or modify it
9+
* under the terms of the GNU General Public License as published by the Free
10+
* Software Foundation; either version 2 of the License, or (at your option)
11+
* any later version.
12+
*
13+
*/
14+
#include <linux/errno.h>
15+
#include <linux/kernel.h>
16+
#include <linux/module.h>
17+
#include <linux/seq_file.h>
18+
#include <linux/slab.h>
19+
#include <linux/string.h>
20+
#include <linux/crypto.h>
21+
#include <crypto/algapi.h>
22+
#include <linux/cryptouser.h>
23+
#include <net/netlink.h>
24+
#include <crypto/internal/acompress.h>
25+
#include "internal.h"
26+
27+
#ifdef CONFIG_NET
28+
static int crypto_acomp_report(struct sk_buff *skb, struct crypto_alg *alg)
29+
{
30+
struct crypto_report_acomp racomp;
31+
32+
strncpy(racomp.type, "acomp", sizeof(racomp.type));
33+
34+
if (nla_put(skb, CRYPTOCFGA_REPORT_ACOMP,
35+
sizeof(struct crypto_report_acomp), &racomp))
36+
goto nla_put_failure;
37+
return 0;
38+
39+
nla_put_failure:
40+
return -EMSGSIZE;
41+
}
42+
#else
43+
static int crypto_acomp_report(struct sk_buff *skb, struct crypto_alg *alg)
44+
{
45+
return -ENOSYS;
46+
}
47+
#endif
48+
49+
static void crypto_acomp_show(struct seq_file *m, struct crypto_alg *alg)
50+
__attribute__ ((unused));
51+
52+
static void crypto_acomp_show(struct seq_file *m, struct crypto_alg *alg)
53+
{
54+
seq_puts(m, "type : acomp\n");
55+
}
56+
57+
static void crypto_acomp_exit_tfm(struct crypto_tfm *tfm)
58+
{
59+
struct crypto_acomp *acomp = __crypto_acomp_tfm(tfm);
60+
struct acomp_alg *alg = crypto_acomp_alg(acomp);
61+
62+
alg->exit(acomp);
63+
}
64+
65+
static int crypto_acomp_init_tfm(struct crypto_tfm *tfm)
66+
{
67+
struct crypto_acomp *acomp = __crypto_acomp_tfm(tfm);
68+
struct acomp_alg *alg = crypto_acomp_alg(acomp);
69+
70+
if (alg->exit)
71+
acomp->base.exit = crypto_acomp_exit_tfm;
72+
73+
if (alg->init)
74+
return alg->init(acomp);
75+
76+
return 0;
77+
}
78+
79+
static const struct crypto_type crypto_acomp_type = {
80+
.extsize = crypto_alg_extsize,
81+
.init_tfm = crypto_acomp_init_tfm,
82+
#ifdef CONFIG_PROC_FS
83+
.show = crypto_acomp_show,
84+
#endif
85+
.report = crypto_acomp_report,
86+
.maskclear = ~CRYPTO_ALG_TYPE_MASK,
87+
.maskset = CRYPTO_ALG_TYPE_MASK,
88+
.type = CRYPTO_ALG_TYPE_ACOMPRESS,
89+
.tfmsize = offsetof(struct crypto_acomp, base),
90+
};
91+
92+
struct crypto_acomp *crypto_alloc_acomp(const char *alg_name, u32 type,
93+
u32 mask)
94+
{
95+
return crypto_alloc_tfm(alg_name, &crypto_acomp_type, type, mask);
96+
}
97+
EXPORT_SYMBOL_GPL(crypto_alloc_acomp);
98+
99+
int crypto_register_acomp(struct acomp_alg *alg)
100+
{
101+
struct crypto_alg *base = &alg->base;
102+
103+
base->cra_type = &crypto_acomp_type;
104+
base->cra_flags &= ~CRYPTO_ALG_TYPE_MASK;
105+
base->cra_flags |= CRYPTO_ALG_TYPE_ACOMPRESS;
106+
107+
return crypto_register_alg(base);
108+
}
109+
EXPORT_SYMBOL_GPL(crypto_register_acomp);
110+
111+
int crypto_unregister_acomp(struct acomp_alg *alg)
112+
{
113+
return crypto_unregister_alg(&alg->base);
114+
}
115+
EXPORT_SYMBOL_GPL(crypto_unregister_acomp);
116+
117+
MODULE_LICENSE("GPL");
118+
MODULE_DESCRIPTION("Asynchronous compression type");

crypto/crypto_user.c

+19
Original file line numberDiff line numberDiff line change
@@ -112,6 +112,21 @@ static int crypto_report_comp(struct sk_buff *skb, struct crypto_alg *alg)
112112
return -EMSGSIZE;
113113
}
114114

115+
static int crypto_report_acomp(struct sk_buff *skb, struct crypto_alg *alg)
116+
{
117+
struct crypto_report_acomp racomp;
118+
119+
strncpy(racomp.type, "acomp", sizeof(racomp.type));
120+
121+
if (nla_put(skb, CRYPTOCFGA_REPORT_ACOMP,
122+
sizeof(struct crypto_report_acomp), &racomp))
123+
goto nla_put_failure;
124+
return 0;
125+
126+
nla_put_failure:
127+
return -EMSGSIZE;
128+
}
129+
115130
static int crypto_report_akcipher(struct sk_buff *skb, struct crypto_alg *alg)
116131
{
117132
struct crypto_report_akcipher rakcipher;
@@ -186,7 +201,11 @@ static int crypto_report_one(struct crypto_alg *alg,
186201
goto nla_put_failure;
187202

188203
break;
204+
case CRYPTO_ALG_TYPE_ACOMPRESS:
205+
if (crypto_report_acomp(skb, alg))
206+
goto nla_put_failure;
189207

208+
break;
190209
case CRYPTO_ALG_TYPE_AKCIPHER:
191210
if (crypto_report_akcipher(skb, alg))
192211
goto nla_put_failure;

0 commit comments

Comments
 (0)