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