105 padded_len = in_len + padding_len;
108 padded_buf = vmalloc(padded_len);
113 memcpy(padded_buf, in, in_len);
116 for (i = 0; i < padding_len; i++) {
117 padded_buf[in_len + i] = (char)padding_len;
121 *out_len = padded_len;
137 unsigned char padding_len;
147 padding_len = (
unsigned char)in[in_len - 1];
150 if (padding_len == 0 || padding_len >
AES_BLOCK_SIZE || padding_len > in_len)
154 for (i = 0; i < padding_len; i++) {
155 if ((
unsigned char)in[in_len - 1 - i] != padding_len)
160 data_len = in_len - padding_len;
163 unpadded_buf = vmalloc(data_len);
168 memcpy(unpadded_buf, in, data_len);
187 char **out,
size_t *out_len) {
188 struct crypto_skcipher *tfm;
189 struct skcipher_request *req;
190 struct scatterlist sg;
192 char *padded_in = NULL;
193 size_t padded_len = 0;
201 ERR_MSG(
"Failed to load AES constants: %d\n", ret);
206 if (!in || !out || !out_len)
224 ERR_MSG(
"Decrypt input length must be a multiple of %d\n",
228 padded_in = vmalloc(in_len);
231 memcpy(padded_in, in, in_len);
236 buf = vmalloc(padded_len);
243 tfm = crypto_alloc_skcipher(
"cbc(aes)", 0, 0);
246 goto out_free_buffers;
250 req = skcipher_request_alloc(tfm, GFP_KERNEL);
257 ret = crypto_skcipher_setkey(tfm,
AES_KEY, 16);
259 pr_err(
"setkey failed: %d\n", ret);
264 sg_init_one(&sg, padded_in, padded_len);
265 skcipher_request_set_crypt(req, &sg, &sg, padded_len, iv);
269 ret = crypto_skcipher_encrypt(req);
271 ret = crypto_skcipher_decrypt(req);
274 ERR_MSG(
"%s failed: %d\n", encrypt ?
"encrypt" :
"decrypt", ret);
279 memcpy(buf, sg_virt(&sg), padded_len);
288 ERR_MSG(
"Failed to remove padding: %d\n", ret);
295 padded_len = unpadded_len;
299 *out_len = padded_len;
303 skcipher_request_free(req);
305 crypto_free_skcipher(tfm);
static int add_pkcs7_padding(const char *in, size_t in_len, char **out, size_t *out_len)
Add PKCS#7 padding to a buffer.
int encrypt_buffer(const char *in, size_t in_len, char **out, size_t *out_len)
Encrypts a buffer using AES-128 in CBC mode.
static int _crypt_buffer(bool encrypt, const char *in, size_t in_len, char **out, size_t *out_len)
Encrypts or decrypts a buffer using AES-128 in CBC mode.
int decrypt_buffer(const char *in, size_t in_len, char **out, size_t *out_len)
Decrypts a buffer using AES-128 in CBC mode.
static int remove_pkcs7_padding(const char *in, size_t in_len, char **out, size_t *out_len)
Remove PKCS#7 padding from a buffer.