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