xref: /openbmc/u-boot/drivers/crypto/fsl/fsl_hash.c (revision b9eebfad)
1*b9eebfadSRuchika Gupta /*
2*b9eebfadSRuchika Gupta  * Copyright 2014 Freescale Semiconductor, Inc.
3*b9eebfadSRuchika Gupta  *
4*b9eebfadSRuchika Gupta  * SPDX-License-Identifier:	GPL-2.0+
5*b9eebfadSRuchika Gupta  *
6*b9eebfadSRuchika Gupta  */
7*b9eebfadSRuchika Gupta 
8*b9eebfadSRuchika Gupta #include <common.h>
9*b9eebfadSRuchika Gupta #include <malloc.h>
10*b9eebfadSRuchika Gupta #include "jobdesc.h"
11*b9eebfadSRuchika Gupta #include "desc.h"
12*b9eebfadSRuchika Gupta #include "jr.h"
13*b9eebfadSRuchika Gupta 
14*b9eebfadSRuchika Gupta #define CRYPTO_MAX_ALG_NAME	80
15*b9eebfadSRuchika Gupta #define SHA1_DIGEST_SIZE        20
16*b9eebfadSRuchika Gupta #define SHA256_DIGEST_SIZE      32
17*b9eebfadSRuchika Gupta 
18*b9eebfadSRuchika Gupta struct caam_hash_template {
19*b9eebfadSRuchika Gupta 	char name[CRYPTO_MAX_ALG_NAME];
20*b9eebfadSRuchika Gupta 	unsigned int digestsize;
21*b9eebfadSRuchika Gupta 	u32 alg_type;
22*b9eebfadSRuchika Gupta };
23*b9eebfadSRuchika Gupta 
24*b9eebfadSRuchika Gupta enum caam_hash_algos {
25*b9eebfadSRuchika Gupta 	SHA1 = 0,
26*b9eebfadSRuchika Gupta 	SHA256
27*b9eebfadSRuchika Gupta };
28*b9eebfadSRuchika Gupta 
29*b9eebfadSRuchika Gupta static struct caam_hash_template driver_hash[] = {
30*b9eebfadSRuchika Gupta 	{
31*b9eebfadSRuchika Gupta 		.name = "sha1",
32*b9eebfadSRuchika Gupta 		.digestsize = SHA1_DIGEST_SIZE,
33*b9eebfadSRuchika Gupta 		.alg_type = OP_ALG_ALGSEL_SHA1,
34*b9eebfadSRuchika Gupta 	},
35*b9eebfadSRuchika Gupta 	{
36*b9eebfadSRuchika Gupta 		.name = "sha256",
37*b9eebfadSRuchika Gupta 		.digestsize = SHA256_DIGEST_SIZE,
38*b9eebfadSRuchika Gupta 		.alg_type = OP_ALG_ALGSEL_SHA256,
39*b9eebfadSRuchika Gupta 	},
40*b9eebfadSRuchika Gupta };
41*b9eebfadSRuchika Gupta 
42*b9eebfadSRuchika Gupta int caam_hash(const unsigned char *pbuf, unsigned int buf_len,
43*b9eebfadSRuchika Gupta 	      unsigned char *pout, enum caam_hash_algos algo)
44*b9eebfadSRuchika Gupta {
45*b9eebfadSRuchika Gupta 	int ret = 0;
46*b9eebfadSRuchika Gupta 	uint32_t *desc;
47*b9eebfadSRuchika Gupta 
48*b9eebfadSRuchika Gupta 	desc = malloc(sizeof(int) * MAX_CAAM_DESCSIZE);
49*b9eebfadSRuchika Gupta 	if (!desc) {
50*b9eebfadSRuchika Gupta 		debug("Not enough memory for descriptor allocation\n");
51*b9eebfadSRuchika Gupta 		return -1;
52*b9eebfadSRuchika Gupta 	}
53*b9eebfadSRuchika Gupta 
54*b9eebfadSRuchika Gupta 	inline_cnstr_jobdesc_hash(desc, pbuf, buf_len, pout,
55*b9eebfadSRuchika Gupta 				  driver_hash[algo].alg_type,
56*b9eebfadSRuchika Gupta 				  driver_hash[algo].digestsize,
57*b9eebfadSRuchika Gupta 				  0);
58*b9eebfadSRuchika Gupta 
59*b9eebfadSRuchika Gupta 	ret = run_descriptor_jr(desc);
60*b9eebfadSRuchika Gupta 
61*b9eebfadSRuchika Gupta 	free(desc);
62*b9eebfadSRuchika Gupta 	return ret;
63*b9eebfadSRuchika Gupta }
64*b9eebfadSRuchika Gupta 
65*b9eebfadSRuchika Gupta void hw_sha256(const unsigned char *pbuf, unsigned int buf_len,
66*b9eebfadSRuchika Gupta 			unsigned char *pout, unsigned int chunk_size)
67*b9eebfadSRuchika Gupta {
68*b9eebfadSRuchika Gupta 	if (caam_hash(pbuf, buf_len, pout, SHA256))
69*b9eebfadSRuchika Gupta 		printf("CAAM was not setup properly or it is faulty\n");
70*b9eebfadSRuchika Gupta }
71*b9eebfadSRuchika Gupta 
72*b9eebfadSRuchika Gupta void hw_sha1(const unsigned char *pbuf, unsigned int buf_len,
73*b9eebfadSRuchika Gupta 			unsigned char *pout, unsigned int chunk_size)
74*b9eebfadSRuchika Gupta {
75*b9eebfadSRuchika Gupta 	if (caam_hash(pbuf, buf_len, pout, SHA1))
76*b9eebfadSRuchika Gupta 		printf("CAAM was not setup properly or it is faulty\n");
77*b9eebfadSRuchika Gupta }
78