blob: 88aedd38f511ed3d8ee81b93f7a49595cf1e87db [file] [log] [blame]
/* drivers/soc/samsung/exynos-hdcp/exynos-hdcp2-crypto.c
*
* Copyright (c) 2016 Samsung Electronics Co., Ltd.
* http://www.samsung.com
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 as
* published by the Free Software Foundation.
*/
#include <linux/err.h>
#include <linux/crypto.h>
#include <linux/ctype.h>
#include <crypto/hash.h>
#include <crypto/sha.h>
struct sdesc {
struct shash_desc shash;
char ctx[];
};
static struct sdesc *alloc_sdesc(struct crypto_shash *alg)
{
struct sdesc *sdesc;
int size;
size = sizeof(struct shash_desc) + crypto_shash_descsize(alg);
sdesc = kmalloc(size, GFP_KERNEL);
if (!sdesc)
return ERR_PTR(-ENOMEM);
sdesc->shash.tfm = alg;
sdesc->shash.flags = 0x0;
return sdesc;
}
int hdcp_calc_sha1(u8 *digest, const u8 *buf, unsigned int buflen)
{
struct crypto_shash *hashalg;
const char hash_alg[] = "sha1";
struct sdesc *sdesc;
int ret;
hashalg = crypto_alloc_shash(hash_alg, 0, CRYPTO_ALG_ASYNC);
if (IS_ERR(hashalg)) {
pr_info("encrypted_key: could not allocate crypto %s\n",
hash_alg);
return PTR_ERR(hashalg);
}
sdesc = alloc_sdesc(hashalg);
if (IS_ERR(sdesc)) {
pr_err("alloc_sdesc: can't alloc %s\n", hash_alg);
if (hashalg)
crypto_free_shash(hashalg);
return PTR_ERR(sdesc);
}
ret = crypto_shash_digest(&sdesc->shash, buf, buflen, digest);
kfree(sdesc);
if (hashalg)
crypto_free_shash(hashalg);
return ret;
}