summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--crypto/deflate.c61
-rw-r--r--crypto/testmgr.c10
-rw-r--r--crypto/testmgr.h75
3 files changed, 129 insertions, 17 deletions
diff --git a/crypto/deflate.c b/crypto/deflate.c
index f942cb391890..94ec3b36a8e8 100644
--- a/crypto/deflate.c
+++ b/crypto/deflate.c
@@ -43,20 +43,24 @@ struct deflate_ctx {
43 struct z_stream_s decomp_stream; 43 struct z_stream_s decomp_stream;
44}; 44};
45 45
46static int deflate_comp_init(struct deflate_ctx *ctx) 46static int deflate_comp_init(struct deflate_ctx *ctx, int format)
47{ 47{
48 int ret = 0; 48 int ret = 0;
49 struct z_stream_s *stream = &ctx->comp_stream; 49 struct z_stream_s *stream = &ctx->comp_stream;
50 50
51 stream->workspace = vzalloc(zlib_deflate_workspacesize( 51 stream->workspace = vzalloc(zlib_deflate_workspacesize(
52 -DEFLATE_DEF_WINBITS, DEFLATE_DEF_MEMLEVEL)); 52 MAX_WBITS, MAX_MEM_LEVEL));
53 if (!stream->workspace) { 53 if (!stream->workspace) {
54 ret = -ENOMEM; 54 ret = -ENOMEM;
55 goto out; 55 goto out;
56 } 56 }
57 ret = zlib_deflateInit2(stream, DEFLATE_DEF_LEVEL, Z_DEFLATED, 57 if (format)
58 -DEFLATE_DEF_WINBITS, DEFLATE_DEF_MEMLEVEL, 58 ret = zlib_deflateInit(stream, 3);
59 Z_DEFAULT_STRATEGY); 59 else
60 ret = zlib_deflateInit2(stream, DEFLATE_DEF_LEVEL, Z_DEFLATED,
61 -DEFLATE_DEF_WINBITS,
62 DEFLATE_DEF_MEMLEVEL,
63 Z_DEFAULT_STRATEGY);
60 if (ret != Z_OK) { 64 if (ret != Z_OK) {
61 ret = -EINVAL; 65 ret = -EINVAL;
62 goto out_free; 66 goto out_free;
@@ -68,7 +72,7 @@ out_free:
68 goto out; 72 goto out;
69} 73}
70 74
71static int deflate_decomp_init(struct deflate_ctx *ctx) 75static int deflate_decomp_init(struct deflate_ctx *ctx, int format)
72{ 76{
73 int ret = 0; 77 int ret = 0;
74 struct z_stream_s *stream = &ctx->decomp_stream; 78 struct z_stream_s *stream = &ctx->decomp_stream;
@@ -78,7 +82,10 @@ static int deflate_decomp_init(struct deflate_ctx *ctx)
78 ret = -ENOMEM; 82 ret = -ENOMEM;
79 goto out; 83 goto out;
80 } 84 }
81 ret = zlib_inflateInit2(stream, -DEFLATE_DEF_WINBITS); 85 if (format)
86 ret = zlib_inflateInit(stream);
87 else
88 ret = zlib_inflateInit2(stream, -DEFLATE_DEF_WINBITS);
82 if (ret != Z_OK) { 89 if (ret != Z_OK) {
83 ret = -EINVAL; 90 ret = -EINVAL;
84 goto out_free; 91 goto out_free;
@@ -102,21 +109,21 @@ static void deflate_decomp_exit(struct deflate_ctx *ctx)
102 vfree(ctx->decomp_stream.workspace); 109 vfree(ctx->decomp_stream.workspace);
103} 110}
104 111
105static int __deflate_init(void *ctx) 112static int __deflate_init(void *ctx, int format)
106{ 113{
107 int ret; 114 int ret;
108 115
109 ret = deflate_comp_init(ctx); 116 ret = deflate_comp_init(ctx, format);
110 if (ret) 117 if (ret)
111 goto out; 118 goto out;
112 ret = deflate_decomp_init(ctx); 119 ret = deflate_decomp_init(ctx, format);
113 if (ret) 120 if (ret)
114 deflate_comp_exit(ctx); 121 deflate_comp_exit(ctx);
115out: 122out:
116 return ret; 123 return ret;
117} 124}
118 125
119static void *deflate_alloc_ctx(struct crypto_scomp *tfm) 126static void *gen_deflate_alloc_ctx(struct crypto_scomp *tfm, int format)
120{ 127{
121 struct deflate_ctx *ctx; 128 struct deflate_ctx *ctx;
122 int ret; 129 int ret;
@@ -125,7 +132,7 @@ static void *deflate_alloc_ctx(struct crypto_scomp *tfm)
125 if (!ctx) 132 if (!ctx)
126 return ERR_PTR(-ENOMEM); 133 return ERR_PTR(-ENOMEM);
127 134
128 ret = __deflate_init(ctx); 135 ret = __deflate_init(ctx, format);
129 if (ret) { 136 if (ret) {
130 kfree(ctx); 137 kfree(ctx);
131 return ERR_PTR(ret); 138 return ERR_PTR(ret);
@@ -134,11 +141,21 @@ static void *deflate_alloc_ctx(struct crypto_scomp *tfm)
134 return ctx; 141 return ctx;
135} 142}
136 143
144static void *deflate_alloc_ctx(struct crypto_scomp *tfm)
145{
146 return gen_deflate_alloc_ctx(tfm, 0);
147}
148
149static void *zlib_deflate_alloc_ctx(struct crypto_scomp *tfm)
150{
151 return gen_deflate_alloc_ctx(tfm, 1);
152}
153
137static int deflate_init(struct crypto_tfm *tfm) 154static int deflate_init(struct crypto_tfm *tfm)
138{ 155{
139 struct deflate_ctx *ctx = crypto_tfm_ctx(tfm); 156 struct deflate_ctx *ctx = crypto_tfm_ctx(tfm);
140 157
141 return __deflate_init(ctx); 158 return __deflate_init(ctx, 0);
142} 159}
143 160
144static void __deflate_exit(void *ctx) 161static void __deflate_exit(void *ctx)
@@ -272,7 +289,7 @@ static struct crypto_alg alg = {
272 .coa_decompress = deflate_decompress } } 289 .coa_decompress = deflate_decompress } }
273}; 290};
274 291
275static struct scomp_alg scomp = { 292static struct scomp_alg scomp[] = { {
276 .alloc_ctx = deflate_alloc_ctx, 293 .alloc_ctx = deflate_alloc_ctx,
277 .free_ctx = deflate_free_ctx, 294 .free_ctx = deflate_free_ctx,
278 .compress = deflate_scompress, 295 .compress = deflate_scompress,
@@ -282,7 +299,17 @@ static struct scomp_alg scomp = {
282 .cra_driver_name = "deflate-scomp", 299 .cra_driver_name = "deflate-scomp",
283 .cra_module = THIS_MODULE, 300 .cra_module = THIS_MODULE,
284 } 301 }
285}; 302}, {
303 .alloc_ctx = zlib_deflate_alloc_ctx,
304 .free_ctx = deflate_free_ctx,
305 .compress = deflate_scompress,
306 .decompress = deflate_sdecompress,
307 .base = {
308 .cra_name = "zlib-deflate",
309 .cra_driver_name = "zlib-deflate-scomp",
310 .cra_module = THIS_MODULE,
311 }
312} };
286 313
287static int __init deflate_mod_init(void) 314static int __init deflate_mod_init(void)
288{ 315{
@@ -292,7 +319,7 @@ static int __init deflate_mod_init(void)
292 if (ret) 319 if (ret)
293 return ret; 320 return ret;
294 321
295 ret = crypto_register_scomp(&scomp); 322 ret = crypto_register_scomps(scomp, ARRAY_SIZE(scomp));
296 if (ret) { 323 if (ret) {
297 crypto_unregister_alg(&alg); 324 crypto_unregister_alg(&alg);
298 return ret; 325 return ret;
@@ -304,7 +331,7 @@ static int __init deflate_mod_init(void)
304static void __exit deflate_mod_fini(void) 331static void __exit deflate_mod_fini(void)
305{ 332{
306 crypto_unregister_alg(&alg); 333 crypto_unregister_alg(&alg);
307 crypto_unregister_scomp(&scomp); 334 crypto_unregister_scomps(scomp, ARRAY_SIZE(scomp));
308} 335}
309 336
310module_init(deflate_mod_init); 337module_init(deflate_mod_init);
diff --git a/crypto/testmgr.c b/crypto/testmgr.c
index 6b8661ee8dc0..6f5f3ed8376c 100644
--- a/crypto/testmgr.c
+++ b/crypto/testmgr.c
@@ -3513,6 +3513,16 @@ static const struct alg_test_desc alg_test_descs[] = {
3513 .dec = __VECS(tf_xts_dec_tv_template) 3513 .dec = __VECS(tf_xts_dec_tv_template)
3514 } 3514 }
3515 } 3515 }
3516 }, {
3517 .alg = "zlib-deflate",
3518 .test = alg_test_comp,
3519 .fips_allowed = 1,
3520 .suite = {
3521 .comp = {
3522 .comp = __VECS(zlib_deflate_comp_tv_template),
3523 .decomp = __VECS(zlib_deflate_decomp_tv_template)
3524 }
3525 }
3516 } 3526 }
3517}; 3527};
3518 3528
diff --git a/crypto/testmgr.h b/crypto/testmgr.h
index 15c043f74b18..429357339dcc 100644
--- a/crypto/testmgr.h
+++ b/crypto/testmgr.h
@@ -33204,6 +33204,81 @@ static const struct comp_testvec deflate_decomp_tv_template[] = {
33204 }, 33204 },
33205}; 33205};
33206 33206
33207static const struct comp_testvec zlib_deflate_comp_tv_template[] = {
33208 {
33209 .inlen = 70,
33210 .outlen = 44,
33211 .input = "Join us now and share the software "
33212 "Join us now and share the software ",
33213 .output = "\x78\x5e\xf3\xca\xcf\xcc\x53\x28"
33214 "\x2d\x56\xc8\xcb\x2f\x57\x48\xcc"
33215 "\x4b\x51\x28\xce\x48\x2c\x4a\x55"
33216 "\x28\xc9\x48\x55\x28\xce\x4f\x2b"
33217 "\x29\x07\x71\xbc\x08\x2b\x01\x00"
33218 "\x7c\x65\x19\x3d",
33219 }, {
33220 .inlen = 191,
33221 .outlen = 129,
33222 .input = "This document describes a compression method based on the DEFLATE"
33223 "compression algorithm. This document defines the application of "
33224 "the DEFLATE algorithm to the IP Payload Compression Protocol.",
33225 .output = "\x78\x5e\x5d\xce\x41\x0a\xc3\x30"
33226 "\x0c\x04\xc0\xaf\xec\x0b\xf2\x87"
33227 "\xd2\xa6\x50\xe8\xc1\x07\x7f\x40"
33228 "\xb1\x95\x5a\x60\x5b\xc6\x56\x0f"
33229 "\xfd\x7d\x93\x1e\x42\xe8\x51\xec"
33230 "\xee\x20\x9f\x64\x20\x6a\x78\x17"
33231 "\xae\x86\xc8\x23\x74\x59\x78\x80"
33232 "\x10\xb4\xb4\xce\x63\x88\x56\x14"
33233 "\xb6\xa4\x11\x0b\x0d\x8e\xd8\x6e"
33234 "\x4b\x8c\xdb\x7c\x7f\x5e\xfc\x7c"
33235 "\xae\x51\x7e\x69\x17\x4b\x65\x02"
33236 "\xfc\x1f\xbc\x4a\xdd\xd8\x7d\x48"
33237 "\xad\x65\x09\x64\x3b\xac\xeb\xd9"
33238 "\xc2\x01\xc0\xf4\x17\x3c\x1c\x1c"
33239 "\x7d\xb2\x52\xc4\xf5\xf4\x8f\xeb"
33240 "\x6a\x1a\x34\x4f\x5f\x2e\x32\x45"
33241 "\x4e",
33242 },
33243};
33244
33245static const struct comp_testvec zlib_deflate_decomp_tv_template[] = {
33246 {
33247 .inlen = 128,
33248 .outlen = 191,
33249 .input = "\x78\x9c\x5d\x8d\x31\x0e\xc2\x30"
33250 "\x10\x04\xbf\xb2\x2f\xc8\x1f\x10"
33251 "\x04\x09\x89\xc2\x85\x3f\x70\xb1"
33252 "\x2f\xf8\x24\xdb\x67\xd9\x47\xc1"
33253 "\xef\x49\x68\x12\x51\xae\x76\x67"
33254 "\xd6\x27\x19\x88\x1a\xde\x85\xab"
33255 "\x21\xf2\x08\x5d\x16\x1e\x20\x04"
33256 "\x2d\xad\xf3\x18\xa2\x15\x85\x2d"
33257 "\x69\xc4\x42\x83\x23\xb6\x6c\x89"
33258 "\x71\x9b\xef\xcf\x8b\x9f\xcf\x33"
33259 "\xca\x2f\xed\x62\xa9\x4c\x80\xff"
33260 "\x13\xaf\x52\x37\xed\x0e\x52\x6b"
33261 "\x59\x02\xd9\x4e\xe8\x7a\x76\x1d"
33262 "\x02\x98\xfe\x8a\x87\x83\xa3\x4f"
33263 "\x56\x8a\xb8\x9e\x8e\x5c\x57\xd3"
33264 "\xa0\x79\xfa\x02\x2e\x32\x45\x4e",
33265 .output = "This document describes a compression method based on the DEFLATE"
33266 "compression algorithm. This document defines the application of "
33267 "the DEFLATE algorithm to the IP Payload Compression Protocol.",
33268 }, {
33269 .inlen = 44,
33270 .outlen = 70,
33271 .input = "\x78\x9c\xf3\xca\xcf\xcc\x53\x28"
33272 "\x2d\x56\xc8\xcb\x2f\x57\x48\xcc"
33273 "\x4b\x51\x28\xce\x48\x2c\x4a\x55"
33274 "\x28\xc9\x48\x55\x28\xce\x4f\x2b"
33275 "\x29\x07\x71\xbc\x08\x2b\x01\x00"
33276 "\x7c\x65\x19\x3d",
33277 .output = "Join us now and share the software "
33278 "Join us now and share the software ",
33279 },
33280};
33281
33207/* 33282/*
33208 * LZO test vectors (null-terminated strings). 33283 * LZO test vectors (null-terminated strings).
33209 */ 33284 */