|
@@ -10,6 +10,36 @@
|
|
|
#include "desc_constr.h"
|
|
|
#include "key_gen.h"
|
|
|
|
|
|
+/**
|
|
|
+ * split_key_len - Compute MDHA split key length for a given algorithm
|
|
|
+ * @hash: Hashing algorithm selection, one of OP_ALG_ALGSEL_* - MD5, SHA1,
|
|
|
+ * SHA224, SHA384, SHA512.
|
|
|
+ *
|
|
|
+ * Return: MDHA split key length
|
|
|
+ */
|
|
|
+static inline u32 split_key_len(u32 hash)
|
|
|
+{
|
|
|
+ /* Sizes for MDHA pads (*not* keys): MD5, SHA1, 224, 256, 384, 512 */
|
|
|
+ static const u8 mdpadlen[] = { 16, 20, 32, 32, 64, 64 };
|
|
|
+ u32 idx;
|
|
|
+
|
|
|
+ idx = (hash & OP_ALG_ALGSEL_SUBMASK) >> OP_ALG_ALGSEL_SHIFT;
|
|
|
+
|
|
|
+ return (u32)(mdpadlen[idx] * 2);
|
|
|
+}
|
|
|
+
|
|
|
+/**
|
|
|
+ * split_key_pad_len - Compute MDHA split key pad length for a given algorithm
|
|
|
+ * @hash: Hashing algorithm selection, one of OP_ALG_ALGSEL_* - MD5, SHA1,
|
|
|
+ * SHA224, SHA384, SHA512.
|
|
|
+ *
|
|
|
+ * Return: MDHA split key pad length
|
|
|
+ */
|
|
|
+static inline u32 split_key_pad_len(u32 hash)
|
|
|
+{
|
|
|
+ return ALIGN(split_key_len(hash), 16);
|
|
|
+}
|
|
|
+
|
|
|
void split_key_done(struct device *dev, u32 *desc, u32 err,
|
|
|
void *context)
|
|
|
{
|
|
@@ -42,13 +72,28 @@ Split key generation-----------------------------------------------
|
|
|
@0xffe04000
|
|
|
*/
|
|
|
int gen_split_key(struct device *jrdev, u8 *key_out,
|
|
|
- struct alginfo * const adata, const u8 *key_in, u32 keylen)
|
|
|
+ struct alginfo * const adata, const u8 *key_in, u32 keylen,
|
|
|
+ int max_keylen)
|
|
|
{
|
|
|
u32 *desc;
|
|
|
struct split_key_result result;
|
|
|
dma_addr_t dma_addr_in, dma_addr_out;
|
|
|
int ret = -ENOMEM;
|
|
|
|
|
|
+ adata->keylen = split_key_len(adata->algtype & OP_ALG_ALGSEL_MASK);
|
|
|
+ adata->keylen_pad = split_key_pad_len(adata->algtype &
|
|
|
+ OP_ALG_ALGSEL_MASK);
|
|
|
+
|
|
|
+#ifdef DEBUG
|
|
|
+ dev_err(jrdev, "split keylen %d split keylen padded %d\n",
|
|
|
+ adata->keylen, adata->keylen_pad);
|
|
|
+ print_hex_dump(KERN_ERR, "ctx.key@" __stringify(__LINE__)": ",
|
|
|
+ DUMP_PREFIX_ADDRESS, 16, 4, key_in, keylen, 1);
|
|
|
+#endif
|
|
|
+
|
|
|
+ if (adata->keylen_pad > max_keylen)
|
|
|
+ return -EINVAL;
|
|
|
+
|
|
|
desc = kmalloc(CAAM_CMD_SZ * 6 + CAAM_PTR_SZ * 2, GFP_KERNEL | GFP_DMA);
|
|
|
if (!desc) {
|
|
|
dev_err(jrdev, "unable to allocate key input memory\n");
|