2 * AES CBC routines supporting the Power 7+ Nest Accelerators driver
4 * Copyright (C) 2011-2012 International Business Machines Inc.
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation; version 2 only.
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
15 * You should have received a copy of the GNU General Public License
16 * along with this program; if not, write to the Free Software
17 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
19 * Author: Kent Yoder <yoder1@us.ibm.com>
22 #include <crypto/aes.h>
23 #include <crypto/algapi.h>
24 #include <linux/module.h>
25 #include <linux/types.h>
26 #include <linux/crypto.h>
29 #include "nx_csbcpb.h"
33 static int cbc_aes_nx_set_key(struct crypto_tfm
*tfm
,
37 struct nx_crypto_ctx
*nx_ctx
= crypto_tfm_ctx(tfm
);
38 struct nx_csbcpb
*csbcpb
= nx_ctx
->csbcpb
;
40 nx_ctx_init(nx_ctx
, HCOP_FC_AES
);
44 NX_CPB_SET_KEY_SIZE(csbcpb
, NX_KS_AES_128
);
45 nx_ctx
->ap
= &nx_ctx
->props
[NX_PROPS_AES_128
];
48 NX_CPB_SET_KEY_SIZE(csbcpb
, NX_KS_AES_192
);
49 nx_ctx
->ap
= &nx_ctx
->props
[NX_PROPS_AES_192
];
52 NX_CPB_SET_KEY_SIZE(csbcpb
, NX_KS_AES_256
);
53 nx_ctx
->ap
= &nx_ctx
->props
[NX_PROPS_AES_256
];
59 csbcpb
->cpb
.hdr
.mode
= NX_MODE_AES_CBC
;
60 memcpy(csbcpb
->cpb
.aes_cbc
.key
, in_key
, key_len
);
65 static int cbc_aes_nx_crypt(struct blkcipher_desc
*desc
,
66 struct scatterlist
*dst
,
67 struct scatterlist
*src
,
71 struct nx_crypto_ctx
*nx_ctx
= crypto_blkcipher_ctx(desc
->tfm
);
72 struct nx_csbcpb
*csbcpb
= nx_ctx
->csbcpb
;
75 if (nbytes
> nx_ctx
->ap
->databytelen
)
79 NX_CPB_FDM(csbcpb
) |= NX_FDM_ENDE_ENCRYPT
;
81 NX_CPB_FDM(csbcpb
) &= ~NX_FDM_ENDE_ENCRYPT
;
83 rc
= nx_build_sg_lists(nx_ctx
, desc
, dst
, src
, nbytes
,
84 csbcpb
->cpb
.aes_cbc
.iv
);
88 if (!nx_ctx
->op
.inlen
|| !nx_ctx
->op
.outlen
) {
93 rc
= nx_hcall_sync(nx_ctx
, &nx_ctx
->op
,
94 desc
->flags
& CRYPTO_TFM_REQ_MAY_SLEEP
);
98 atomic_inc(&(nx_ctx
->stats
->aes_ops
));
99 atomic64_add(csbcpb
->csb
.processed_byte_count
,
100 &(nx_ctx
->stats
->aes_bytes
));
105 static int cbc_aes_nx_encrypt(struct blkcipher_desc
*desc
,
106 struct scatterlist
*dst
,
107 struct scatterlist
*src
,
110 return cbc_aes_nx_crypt(desc
, dst
, src
, nbytes
, 1);
113 static int cbc_aes_nx_decrypt(struct blkcipher_desc
*desc
,
114 struct scatterlist
*dst
,
115 struct scatterlist
*src
,
118 return cbc_aes_nx_crypt(desc
, dst
, src
, nbytes
, 0);
121 struct crypto_alg nx_cbc_aes_alg
= {
122 .cra_name
= "cbc(aes)",
123 .cra_driver_name
= "cbc-aes-nx",
125 .cra_flags
= CRYPTO_ALG_TYPE_BLKCIPHER
,
126 .cra_blocksize
= AES_BLOCK_SIZE
,
127 .cra_ctxsize
= sizeof(struct nx_crypto_ctx
),
128 .cra_type
= &crypto_blkcipher_type
,
129 .cra_module
= THIS_MODULE
,
130 .cra_list
= LIST_HEAD_INIT(nx_cbc_aes_alg
.cra_list
),
131 .cra_init
= nx_crypto_ctx_aes_cbc_init
,
132 .cra_exit
= nx_crypto_ctx_exit
,
134 .min_keysize
= AES_MIN_KEY_SIZE
,
135 .max_keysize
= AES_MAX_KEY_SIZE
,
136 .ivsize
= AES_BLOCK_SIZE
,
137 .setkey
= cbc_aes_nx_set_key
,
138 .encrypt
= cbc_aes_nx_encrypt
,
139 .decrypt
= cbc_aes_nx_decrypt
,