~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

TOMOYO Linux Cross Reference
Linux/crypto/deflate.c

Version: ~ [ linux-6.12-rc7 ] ~ [ linux-6.11.7 ] ~ [ linux-6.10.14 ] ~ [ linux-6.9.12 ] ~ [ linux-6.8.12 ] ~ [ linux-6.7.12 ] ~ [ linux-6.6.60 ] ~ [ linux-6.5.13 ] ~ [ linux-6.4.16 ] ~ [ linux-6.3.13 ] ~ [ linux-6.2.16 ] ~ [ linux-6.1.116 ] ~ [ linux-6.0.19 ] ~ [ linux-5.19.17 ] ~ [ linux-5.18.19 ] ~ [ linux-5.17.15 ] ~ [ linux-5.16.20 ] ~ [ linux-5.15.171 ] ~ [ linux-5.14.21 ] ~ [ linux-5.13.19 ] ~ [ linux-5.12.19 ] ~ [ linux-5.11.22 ] ~ [ linux-5.10.229 ] ~ [ linux-5.9.16 ] ~ [ linux-5.8.18 ] ~ [ linux-5.7.19 ] ~ [ linux-5.6.19 ] ~ [ linux-5.5.19 ] ~ [ linux-5.4.285 ] ~ [ linux-5.3.18 ] ~ [ linux-5.2.21 ] ~ [ linux-5.1.21 ] ~ [ linux-5.0.21 ] ~ [ linux-4.20.17 ] ~ [ linux-4.19.323 ] ~ [ linux-4.18.20 ] ~ [ linux-4.17.19 ] ~ [ linux-4.16.18 ] ~ [ linux-4.15.18 ] ~ [ linux-4.14.336 ] ~ [ linux-4.13.16 ] ~ [ linux-4.12.14 ] ~ [ linux-4.11.12 ] ~ [ linux-4.10.17 ] ~ [ linux-4.9.337 ] ~ [ linux-4.4.302 ] ~ [ linux-3.10.108 ] ~ [ linux-2.6.32.71 ] ~ [ linux-2.6.0 ] ~ [ linux-2.4.37.11 ] ~ [ unix-v6-master ] ~ [ ccs-tools-1.8.12 ] ~ [ policy-sample ] ~
Architecture: ~ [ i386 ] ~ [ alpha ] ~ [ m68k ] ~ [ mips ] ~ [ ppc ] ~ [ sparc ] ~ [ sparc64 ] ~

Diff markup

Differences between /crypto/deflate.c (Version linux-6.12-rc7) and /crypto/deflate.c (Version linux-5.10.228)


** Warning: Cannot open xref database.

  1 // SPDX-License-Identifier: GPL-2.0-or-later        1 
  2 /*                                                
  3  * Cryptographic API.                             
  4  *                                                
  5  * Deflate algorithm (RFC 1951), implemented h    
  6  * by IPCOMP (RFC 3173 & RFC 2394).               
  7  *                                                
  8  * Copyright (c) 2003 James Morris <jmorris@in    
  9  *                                                
 10  * FIXME: deflate transforms will require up t    
 11  * memory on i386 (390k for compression, the r    
 12  * current zlib kernel code uses a worst case     
 13  * This needs to be fixed so that the amount o    
 14  * related to the  winbits and memlevel parame    
 15  *                                                
 16  * The default winbits of 11 should suit most     
 17  * to configure on a per-tfm basis in the futu    
 18  *                                                
 19  * Currently, compression history is not maint    
 20  * it is not needed for IPCOMP and keeps the c    
 21  * implemented if someone wants it.               
 22  */                                               
 23 #include <linux/init.h>                           
 24 #include <linux/module.h>                         
 25 #include <linux/crypto.h>                         
 26 #include <linux/zlib.h>                           
 27 #include <linux/vmalloc.h>                        
 28 #include <linux/interrupt.h>                      
 29 #include <linux/mm.h>                             
 30 #include <linux/net.h>                            
 31 #include <crypto/internal/scompress.h>            
 32                                                   
 33 #define DEFLATE_DEF_LEVEL               Z_DEFA    
 34 #define DEFLATE_DEF_WINBITS             11        
 35 #define DEFLATE_DEF_MEMLEVEL            MAX_ME    
 36                                                   
 37 struct deflate_ctx {                              
 38         struct z_stream_s comp_stream;            
 39         struct z_stream_s decomp_stream;          
 40 };                                                
 41                                                   
 42 static int deflate_comp_init(struct deflate_ct    
 43 {                                                 
 44         int ret = 0;                              
 45         struct z_stream_s *stream = &ctx->comp    
 46                                                   
 47         stream->workspace = vzalloc(zlib_defla    
 48                                     -DEFLATE_D    
 49         if (!stream->workspace) {                 
 50                 ret = -ENOMEM;                    
 51                 goto out;                         
 52         }                                         
 53         ret = zlib_deflateInit2(stream, DEFLAT    
 54                                 -DEFLATE_DEF_W    
 55                                 Z_DEFAULT_STRA    
 56         if (ret != Z_OK) {                        
 57                 ret = -EINVAL;                    
 58                 goto out_free;                    
 59         }                                         
 60 out:                                              
 61         return ret;                               
 62 out_free:                                         
 63         vfree(stream->workspace);                 
 64         goto out;                                 
 65 }                                                 
 66                                                   
 67 static int deflate_decomp_init(struct deflate_    
 68 {                                                 
 69         int ret = 0;                              
 70         struct z_stream_s *stream = &ctx->deco    
 71                                                   
 72         stream->workspace = vzalloc(zlib_infla    
 73         if (!stream->workspace) {                 
 74                 ret = -ENOMEM;                    
 75                 goto out;                         
 76         }                                         
 77         ret = zlib_inflateInit2(stream, -DEFLA    
 78         if (ret != Z_OK) {                        
 79                 ret = -EINVAL;                    
 80                 goto out_free;                    
 81         }                                         
 82 out:                                              
 83         return ret;                               
 84 out_free:                                         
 85         vfree(stream->workspace);                 
 86         goto out;                                 
 87 }                                                 
 88                                                   
 89 static void deflate_comp_exit(struct deflate_c    
 90 {                                                 
 91         zlib_deflateEnd(&ctx->comp_stream);       
 92         vfree(ctx->comp_stream.workspace);        
 93 }                                                 
 94                                                   
 95 static void deflate_decomp_exit(struct deflate    
 96 {                                                 
 97         zlib_inflateEnd(&ctx->decomp_stream);     
 98         vfree(ctx->decomp_stream.workspace);      
 99 }                                                 
100                                                   
101 static int __deflate_init(void *ctx)              
102 {                                                 
103         int ret;                                  
104                                                   
105         ret = deflate_comp_init(ctx);             
106         if (ret)                                  
107                 goto out;                         
108         ret = deflate_decomp_init(ctx);           
109         if (ret)                                  
110                 deflate_comp_exit(ctx);           
111 out:                                              
112         return ret;                               
113 }                                                 
114                                                   
115 static void *deflate_alloc_ctx(struct crypto_s    
116 {                                                 
117         struct deflate_ctx *ctx;                  
118         int ret;                                  
119                                                   
120         ctx = kzalloc(sizeof(*ctx), GFP_KERNEL    
121         if (!ctx)                                 
122                 return ERR_PTR(-ENOMEM);          
123                                                   
124         ret = __deflate_init(ctx);                
125         if (ret) {                                
126                 kfree(ctx);                       
127                 return ERR_PTR(ret);              
128         }                                         
129                                                   
130         return ctx;                               
131 }                                                 
132                                                   
133 static int deflate_init(struct crypto_tfm *tfm    
134 {                                                 
135         struct deflate_ctx *ctx = crypto_tfm_c    
136                                                   
137         return __deflate_init(ctx);               
138 }                                                 
139                                                   
140 static void __deflate_exit(void *ctx)             
141 {                                                 
142         deflate_comp_exit(ctx);                   
143         deflate_decomp_exit(ctx);                 
144 }                                                 
145                                                   
146 static void deflate_free_ctx(struct crypto_sco    
147 {                                                 
148         __deflate_exit(ctx);                      
149         kfree_sensitive(ctx);                     
150 }                                                 
151                                                   
152 static void deflate_exit(struct crypto_tfm *tf    
153 {                                                 
154         struct deflate_ctx *ctx = crypto_tfm_c    
155                                                   
156         __deflate_exit(ctx);                      
157 }                                                 
158                                                   
159 static int __deflate_compress(const u8 *src, u    
160                               u8 *dst, unsigne    
161 {                                                 
162         int ret = 0;                              
163         struct deflate_ctx *dctx = ctx;           
164         struct z_stream_s *stream = &dctx->com    
165                                                   
166         ret = zlib_deflateReset(stream);          
167         if (ret != Z_OK) {                        
168                 ret = -EINVAL;                    
169                 goto out;                         
170         }                                         
171                                                   
172         stream->next_in = (u8 *)src;              
173         stream->avail_in = slen;                  
174         stream->next_out = (u8 *)dst;             
175         stream->avail_out = *dlen;                
176                                                   
177         ret = zlib_deflate(stream, Z_FINISH);     
178         if (ret != Z_STREAM_END) {                
179                 ret = -EINVAL;                    
180                 goto out;                         
181         }                                         
182         ret = 0;                                  
183         *dlen = stream->total_out;                
184 out:                                              
185         return ret;                               
186 }                                                 
187                                                   
188 static int deflate_compress(struct crypto_tfm     
189                             unsigned int slen,    
190 {                                                 
191         struct deflate_ctx *dctx = crypto_tfm_    
192                                                   
193         return __deflate_compress(src, slen, d    
194 }                                                 
195                                                   
196 static int deflate_scompress(struct crypto_sco    
197                              unsigned int slen    
198                              void *ctx)           
199 {                                                 
200         return __deflate_compress(src, slen, d    
201 }                                                 
202                                                   
203 static int __deflate_decompress(const u8 *src,    
204                                 u8 *dst, unsig    
205 {                                                 
206                                                   
207         int ret = 0;                              
208         struct deflate_ctx *dctx = ctx;           
209         struct z_stream_s *stream = &dctx->dec    
210                                                   
211         ret = zlib_inflateReset(stream);          
212         if (ret != Z_OK) {                        
213                 ret = -EINVAL;                    
214                 goto out;                         
215         }                                         
216                                                   
217         stream->next_in = (u8 *)src;              
218         stream->avail_in = slen;                  
219         stream->next_out = (u8 *)dst;             
220         stream->avail_out = *dlen;                
221                                                   
222         ret = zlib_inflate(stream, Z_SYNC_FLUS    
223         /*                                        
224          * Work around a bug in zlib, which so    
225          * byte when being used in the (undocu    
226          * (From USAGI).                          
227          */                                       
228         if (ret == Z_OK && !stream->avail_in &    
229                 u8 zerostuff = 0;                 
230                 stream->next_in = &zerostuff;     
231                 stream->avail_in = 1;             
232                 ret = zlib_inflate(stream, Z_F    
233         }                                         
234         if (ret != Z_STREAM_END) {                
235                 ret = -EINVAL;                    
236                 goto out;                         
237         }                                         
238         ret = 0;                                  
239         *dlen = stream->total_out;                
240 out:                                              
241         return ret;                               
242 }                                                 
243                                                   
244 static int deflate_decompress(struct crypto_tf    
245                               unsigned int sle    
246 {                                                 
247         struct deflate_ctx *dctx = crypto_tfm_    
248                                                   
249         return __deflate_decompress(src, slen,    
250 }                                                 
251                                                   
252 static int deflate_sdecompress(struct crypto_s    
253                                unsigned int sl    
254                                void *ctx)         
255 {                                                 
256         return __deflate_decompress(src, slen,    
257 }                                                 
258                                                   
259 static struct crypto_alg alg = {                  
260         .cra_name               = "deflate",      
261         .cra_driver_name        = "deflate-gen    
262         .cra_flags              = CRYPTO_ALG_T    
263         .cra_ctxsize            = sizeof(struc    
264         .cra_module             = THIS_MODULE,    
265         .cra_init               = deflate_init    
266         .cra_exit               = deflate_exit    
267         .cra_u                  = { .compress     
268         .coa_compress           = deflate_comp    
269         .coa_decompress         = deflate_deco    
270 };                                                
271                                                   
272 static struct scomp_alg scomp = {                 
273         .alloc_ctx              = deflate_allo    
274         .free_ctx               = deflate_free    
275         .compress               = deflate_scom    
276         .decompress             = deflate_sdec    
277         .base                   = {               
278                 .cra_name       = "deflate",      
279                 .cra_driver_name = "deflate-sc    
280                 .cra_module      = THIS_MODULE    
281         }                                         
282 };                                                
283                                                   
284 static int __init deflate_mod_init(void)          
285 {                                                 
286         int ret;                                  
287                                                   
288         ret = crypto_register_alg(&alg);          
289         if (ret)                                  
290                 return ret;                       
291                                                   
292         ret = crypto_register_scomp(&scomp);      
293         if (ret) {                                
294                 crypto_unregister_alg(&alg);      
295                 return ret;                       
296         }                                         
297                                                   
298         return ret;                               
299 }                                                 
300                                                   
301 static void __exit deflate_mod_fini(void)         
302 {                                                 
303         crypto_unregister_alg(&alg);              
304         crypto_unregister_scomp(&scomp);          
305 }                                                 
306                                                   
307 subsys_initcall(deflate_mod_init);                
308 module_exit(deflate_mod_fini);                    
309                                                   
310 MODULE_LICENSE("GPL");                            
311 MODULE_DESCRIPTION("Deflate Compression Algori    
312 MODULE_AUTHOR("James Morris <jmorris@intercode    
313 MODULE_ALIAS_CRYPTO("deflate");                   
314 MODULE_ALIAS_CRYPTO("deflate-generic");           
315                                                   

~ [ source navigation ] ~ [ diff markup ] ~ [ identifier search ] ~

kernel.org | git.kernel.org | LWN.net | Project Home | SVN repository | Mail admin

Linux® is a registered trademark of Linus Torvalds in the United States and other countries.
TOMOYO® is a registered trademark of NTT DATA CORPORATION.

sflogo.php