1cc6ac5d6SJoseph Chen /* SPDX-License-Identifier: GPL-2.0+ */ 2cc6ac5d6SJoseph Chen /* 3cc6ac5d6SJoseph Chen * (C) Copyright 2019 Rockchip Electronics Co., Ltd 4cc6ac5d6SJoseph Chen */ 5cc6ac5d6SJoseph Chen 6cc6ac5d6SJoseph Chen #ifndef _CORE_CRYPTO_H_ 7cc6ac5d6SJoseph Chen #define _CORE_CRYPTO_H_ 8cc6ac5d6SJoseph Chen 9*1d2a3f6cSJoseph Chen #include <common.h> 10*1d2a3f6cSJoseph Chen #include <dm.h> 11*1d2a3f6cSJoseph Chen #include <u-boot/sha1.h> 12*1d2a3f6cSJoseph Chen 13cc6ac5d6SJoseph Chen /* Algorithms/capability of crypto, works together with crypto_algo_nbits() */ 14cc6ac5d6SJoseph Chen #define CRYPTO_MD5 BIT(0) 15cc6ac5d6SJoseph Chen #define CRYPTO_SHA1 BIT(1) 16cc6ac5d6SJoseph Chen #define CRYPTO_SHA256 BIT(2) 17e7846385SLin Jinhan #define CRYPTO_SHA512 BIT(3) 18e7846385SLin Jinhan 19e7846385SLin Jinhan #define CRYPTO_RSA512 BIT(10) 20e7846385SLin Jinhan #define CRYPTO_RSA1024 BIT(11) 21e7846385SLin Jinhan #define CRYPTO_RSA2048 BIT(12) 22e7846385SLin Jinhan #define CRYPTO_RSA3072 BIT(13) 23e7846385SLin Jinhan #define CRYPTO_RSA4096 BIT(14) 24cc6ac5d6SJoseph Chen 25434d6fd3SLin Jinhan #define CRYPTO_TRNG BIT(15) 26434d6fd3SLin Jinhan 27cc6ac5d6SJoseph Chen #define BYTE2WORD(bytes) ((bytes) / 4) 28cc6ac5d6SJoseph Chen #define BITS2BYTE(nbits) ((nbits) / 8) 29cc6ac5d6SJoseph Chen #define BITS2WORD(nbits) ((nbits) / 32) 30cc6ac5d6SJoseph Chen 31cc6ac5d6SJoseph Chen typedef struct { 32cc6ac5d6SJoseph Chen u32 algo; /* Algorithm: CRYPTO_MD5/CRYPTO_SHA1/CRYPTO_RSA2048... */ 33cc6ac5d6SJoseph Chen u32 length; /* Data total length */ 34cc6ac5d6SJoseph Chen 35cc6ac5d6SJoseph Chen } sha_context; 36cc6ac5d6SJoseph Chen 37cc6ac5d6SJoseph Chen typedef struct { 38cc6ac5d6SJoseph Chen u32 algo; /* Algorithm: CRYPTO_MD5/CRYPTO_SHA1/CRYPTO_RSA2048... */ 39cc6ac5d6SJoseph Chen u32 *n; /* Public key factor N */ 40cc6ac5d6SJoseph Chen u32 *e; /* Public key factor E */ 41cc6ac5d6SJoseph Chen u32 *c; /* Optional, a accelerate factor for some crypto */ 42cc6ac5d6SJoseph Chen } rsa_key; 43cc6ac5d6SJoseph Chen 44cc6ac5d6SJoseph Chen struct dm_crypto_ops { 45cc6ac5d6SJoseph Chen /* Hardware algorithm capability */ 46cc6ac5d6SJoseph Chen u32 (*capability)(struct udevice *dev); 47cc6ac5d6SJoseph Chen 48cc6ac5d6SJoseph Chen /* SHA init/update/final */ 49cc6ac5d6SJoseph Chen int (*sha_init)(struct udevice *dev, sha_context *ctx); 50cc6ac5d6SJoseph Chen int (*sha_update)(struct udevice *dev, u32 *input, u32 len); 51cc6ac5d6SJoseph Chen int (*sha_final)(struct udevice *dev, sha_context *ctx, u8 *output); 52cc6ac5d6SJoseph Chen 53cc6ac5d6SJoseph Chen /* RSA verify */ 54cc6ac5d6SJoseph Chen int (*rsa_verify)(struct udevice *dev, rsa_key *ctx, 55cc6ac5d6SJoseph Chen u8 *sign, u8 *output); 56434d6fd3SLin Jinhan 57434d6fd3SLin Jinhan /* TRNG get */ 58434d6fd3SLin Jinhan int (*get_trng)(struct udevice *dev, u8 *output, u32 len); 59cc6ac5d6SJoseph Chen }; 60cc6ac5d6SJoseph Chen 61cc6ac5d6SJoseph Chen /** 62cc6ac5d6SJoseph Chen * crypto_algo_nbits() - Get algorithm bits accroding to algorithm 63cc6ac5d6SJoseph Chen * @capability: expected algorithm capability, eg. CRYPTO_MD5/RSA2048... 64cc6ac5d6SJoseph Chen * 65cc6ac5d6SJoseph Chen * @return algorithm bits 66cc6ac5d6SJoseph Chen */ 67cc6ac5d6SJoseph Chen u32 crypto_algo_nbits(u32 algo); 68cc6ac5d6SJoseph Chen 69cc6ac5d6SJoseph Chen /** 70cc6ac5d6SJoseph Chen * crypto_get_device() - Get crypto device by capability 71cc6ac5d6SJoseph Chen * @capability: expected algorithm capability, eg. CRYPTO_MD5/RSA2048... 72cc6ac5d6SJoseph Chen * 73cc6ac5d6SJoseph Chen * @return dev on success, otherwise NULL 74cc6ac5d6SJoseph Chen */ 75cc6ac5d6SJoseph Chen struct udevice *crypto_get_device(u32 capability); 76cc6ac5d6SJoseph Chen 77cc6ac5d6SJoseph Chen /** 78cc6ac5d6SJoseph Chen * crypto_sha_init() - Crypto sha init 79cc6ac5d6SJoseph Chen * 80cc6ac5d6SJoseph Chen * @dev: crypto device 81cc6ac5d6SJoseph Chen * @ctx: sha context 82cc6ac5d6SJoseph Chen * 83cc6ac5d6SJoseph Chen * @return 0 on success, otherwise failed 84cc6ac5d6SJoseph Chen */ 85cc6ac5d6SJoseph Chen int crypto_sha_init(struct udevice *dev, sha_context *ctx); 86cc6ac5d6SJoseph Chen 87cc6ac5d6SJoseph Chen /** 88cc6ac5d6SJoseph Chen * crypto_sha_update() - Crypto sha update 89cc6ac5d6SJoseph Chen * 90cc6ac5d6SJoseph Chen * @dev: crypto device 91cc6ac5d6SJoseph Chen * @input: input data buffer 92cc6ac5d6SJoseph Chen * @len: input data length 93cc6ac5d6SJoseph Chen * 94cc6ac5d6SJoseph Chen * @return 0 on success, otherwise failed 95cc6ac5d6SJoseph Chen */ 96cc6ac5d6SJoseph Chen int crypto_sha_update(struct udevice *dev, u32 *input, u32 len); 97cc6ac5d6SJoseph Chen 98cc6ac5d6SJoseph Chen /** 99cc6ac5d6SJoseph Chen * crypto_sha_final() - Crypto sha finish and get result 100cc6ac5d6SJoseph Chen * 101cc6ac5d6SJoseph Chen * @dev: crypto device 102cc6ac5d6SJoseph Chen * @ctx: sha context 103cc6ac5d6SJoseph Chen * @output: output hash data 104cc6ac5d6SJoseph Chen * 105cc6ac5d6SJoseph Chen * @return 0 on success, otherwise failed 106cc6ac5d6SJoseph Chen */ 107cc6ac5d6SJoseph Chen int crypto_sha_final(struct udevice *dev, sha_context *ctx, u8 *output); 108cc6ac5d6SJoseph Chen 109cc6ac5d6SJoseph Chen /** 110cc6ac5d6SJoseph Chen * crypto_sha_csum() - Crypto sha hash for one data block only 111cc6ac5d6SJoseph Chen * 112cc6ac5d6SJoseph Chen * @dev: crypto device 113cc6ac5d6SJoseph Chen * @ctx: sha context 114cc6ac5d6SJoseph Chen * @input: input data buffer 115cc6ac5d6SJoseph Chen * @input_len: input data length 116cc6ac5d6SJoseph Chen * @output: output hash data 117cc6ac5d6SJoseph Chen * 118cc6ac5d6SJoseph Chen * @return 0 on success, otherwise failed 119cc6ac5d6SJoseph Chen */ 120cc6ac5d6SJoseph Chen int crypto_sha_csum(struct udevice *dev, sha_context *ctx, 121cc6ac5d6SJoseph Chen char *input, u32 input_len, u8 *output); 122cc6ac5d6SJoseph Chen 123cc6ac5d6SJoseph Chen /** 124cc6ac5d6SJoseph Chen * crypto_rsa_verify() - Crypto rsa verify 125cc6ac5d6SJoseph Chen * 126cc6ac5d6SJoseph Chen * @dev: crypto device 127cc6ac5d6SJoseph Chen * @ctx: rsa key context 128cc6ac5d6SJoseph Chen * @sign: signature 129cc6ac5d6SJoseph Chen * @output: output hash data buffer 130cc6ac5d6SJoseph Chen * 131cc6ac5d6SJoseph Chen * @return 0 on success, otherwise failed 132cc6ac5d6SJoseph Chen */ 133cc6ac5d6SJoseph Chen int crypto_rsa_verify(struct udevice *dev, rsa_key *ctx, u8 *sign, u8 *output); 134cc6ac5d6SJoseph Chen 135434d6fd3SLin Jinhan /** 136434d6fd3SLin Jinhan * crypto_get_trng() - Crypto get trng 137434d6fd3SLin Jinhan * 138434d6fd3SLin Jinhan * @dev: crypto device 139434d6fd3SLin Jinhan * @output: output trng data 140434d6fd3SLin Jinhan * @len: trng len to get 141434d6fd3SLin Jinhan * 142434d6fd3SLin Jinhan * @return 0 on success, otherwise failed 143434d6fd3SLin Jinhan */ 144434d6fd3SLin Jinhan int crypto_get_trng(struct udevice *dev, u8 *output, u32 len); 145434d6fd3SLin Jinhan 146cc6ac5d6SJoseph Chen #endif 147