152 lines · c
1// SPDX-License-Identifier: GPL-2.0-or-later2/*3 * Cryptographic API for the 842 software compression algorithm.4 *5 * Copyright (C) IBM Corporation, 2011-20156 *7 * Original Authors: Robert Jennings <rcj@linux.vnet.ibm.com>8 * Seth Jennings <sjenning@linux.vnet.ibm.com>9 *10 * Rewrite: Dan Streetman <ddstreet@ieee.org>11 *12 * This is the software implementation of compression and decompression using13 * the 842 format. This uses the software 842 library at lib/842/ which is14 * only a reference implementation, and is very, very slow as compared to other15 * software compressors. You probably do not want to use this software16 * compression. If you have access to the PowerPC 842 compression hardware, you17 * want to use the 842 hardware compression interface, which is at:18 * drivers/crypto/nx/nx-842-crypto.c19 */20 21#include <linux/init.h>22#include <linux/module.h>23#include <linux/crypto.h>24#include <linux/sw842.h>25#include <crypto/internal/scompress.h>26 27struct crypto842_ctx {28 void *wmem; /* working memory for compress */29};30 31static void *crypto842_alloc_ctx(struct crypto_scomp *tfm)32{33 void *ctx;34 35 ctx = kmalloc(SW842_MEM_COMPRESS, GFP_KERNEL);36 if (!ctx)37 return ERR_PTR(-ENOMEM);38 39 return ctx;40}41 42static int crypto842_init(struct crypto_tfm *tfm)43{44 struct crypto842_ctx *ctx = crypto_tfm_ctx(tfm);45 46 ctx->wmem = crypto842_alloc_ctx(NULL);47 if (IS_ERR(ctx->wmem))48 return -ENOMEM;49 50 return 0;51}52 53static void crypto842_free_ctx(struct crypto_scomp *tfm, void *ctx)54{55 kfree(ctx);56}57 58static void crypto842_exit(struct crypto_tfm *tfm)59{60 struct crypto842_ctx *ctx = crypto_tfm_ctx(tfm);61 62 crypto842_free_ctx(NULL, ctx->wmem);63}64 65static int crypto842_compress(struct crypto_tfm *tfm,66 const u8 *src, unsigned int slen,67 u8 *dst, unsigned int *dlen)68{69 struct crypto842_ctx *ctx = crypto_tfm_ctx(tfm);70 71 return sw842_compress(src, slen, dst, dlen, ctx->wmem);72}73 74static int crypto842_scompress(struct crypto_scomp *tfm,75 const u8 *src, unsigned int slen,76 u8 *dst, unsigned int *dlen, void *ctx)77{78 return sw842_compress(src, slen, dst, dlen, ctx);79}80 81static int crypto842_decompress(struct crypto_tfm *tfm,82 const u8 *src, unsigned int slen,83 u8 *dst, unsigned int *dlen)84{85 return sw842_decompress(src, slen, dst, dlen);86}87 88static int crypto842_sdecompress(struct crypto_scomp *tfm,89 const u8 *src, unsigned int slen,90 u8 *dst, unsigned int *dlen, void *ctx)91{92 return sw842_decompress(src, slen, dst, dlen);93}94 95static struct crypto_alg alg = {96 .cra_name = "842",97 .cra_driver_name = "842-generic",98 .cra_priority = 100,99 .cra_flags = CRYPTO_ALG_TYPE_COMPRESS,100 .cra_ctxsize = sizeof(struct crypto842_ctx),101 .cra_module = THIS_MODULE,102 .cra_init = crypto842_init,103 .cra_exit = crypto842_exit,104 .cra_u = { .compress = {105 .coa_compress = crypto842_compress,106 .coa_decompress = crypto842_decompress } }107};108 109static struct scomp_alg scomp = {110 .alloc_ctx = crypto842_alloc_ctx,111 .free_ctx = crypto842_free_ctx,112 .compress = crypto842_scompress,113 .decompress = crypto842_sdecompress,114 .base = {115 .cra_name = "842",116 .cra_driver_name = "842-scomp",117 .cra_priority = 100,118 .cra_module = THIS_MODULE,119 }120};121 122static int __init crypto842_mod_init(void)123{124 int ret;125 126 ret = crypto_register_alg(&alg);127 if (ret)128 return ret;129 130 ret = crypto_register_scomp(&scomp);131 if (ret) {132 crypto_unregister_alg(&alg);133 return ret;134 }135 136 return ret;137}138subsys_initcall(crypto842_mod_init);139 140static void __exit crypto842_mod_exit(void)141{142 crypto_unregister_alg(&alg);143 crypto_unregister_scomp(&scomp);144}145module_exit(crypto842_mod_exit);146 147MODULE_LICENSE("GPL");148MODULE_DESCRIPTION("842 Software Compression Algorithm");149MODULE_ALIAS_CRYPTO("842");150MODULE_ALIAS_CRYPTO("842-generic");151MODULE_AUTHOR("Dan Streetman <ddstreet@ieee.org>");152