1 // SPDX-License-Identifier: GPL-2.0 2 /* 3 * Copyright (c) 2021 Rockchip Electronics Co., Ltd 4 */ 5 6 #include <common.h> 7 #include <crypto.h> 8 9 static void dump_hash(const char *label, void *hash, 10 u32 nbits, char *addr, int len) 11 { 12 char *buf; 13 int i; 14 15 printf("%s for %08lx ... %08lx ==> ", label, (ulong)addr, (ulong)addr + len); 16 buf = hash; 17 for (i = 0; i < BITS2BYTE(nbits); i++) 18 printf("%02x", buf[i]); 19 20 printf("\n\n"); 21 } 22 23 static int do_crypto_csum(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) 24 { 25 sha_context csha_ctx; 26 struct udevice *dev; 27 char *input_data; 28 int input_len; 29 u8 hash[256]; 30 u32 cap; 31 32 if (argc != 4) 33 return CMD_RET_USAGE; 34 35 if (!strcmp(argv[1], "md5")) 36 cap = CRYPTO_MD5; 37 else if (!strcmp(argv[1], "sha1")) 38 cap = CRYPTO_SHA1; 39 else if (!strcmp(argv[1], "sha256")) 40 cap = CRYPTO_SHA256; 41 else if (!strcmp(argv[1], "sha512")) 42 cap = CRYPTO_SHA512; 43 else 44 return CMD_RET_USAGE; 45 46 input_data = (char *)simple_strtoul(argv[2], NULL, 16); 47 input_len = simple_strtoul(argv[3], NULL, 16); 48 49 dev = crypto_get_device(cap); 50 if (!dev) { 51 printf("Can't find crypto device for %s\n", argv[1]); 52 return -ENODEV; 53 } 54 55 if (cap == CRYPTO_MD5) { 56 csha_ctx.algo = CRYPTO_MD5; 57 csha_ctx.length = input_len; 58 memset(hash, 0, sizeof(hash)); 59 crypto_sha_csum(dev, &csha_ctx, input_data, input_len, hash); 60 dump_hash("md5", hash, crypto_algo_nbits(csha_ctx.algo), 61 input_data, input_len); 62 } else if (cap == CRYPTO_SHA1) { 63 csha_ctx.algo = CRYPTO_SHA1; 64 csha_ctx.length = input_len; 65 memset(hash, 0, sizeof(hash)); 66 crypto_sha_csum(dev, &csha_ctx, input_data, input_len, hash); 67 dump_hash("sha1", hash, crypto_algo_nbits(csha_ctx.algo), 68 input_data, input_len); 69 } else if (cap == CRYPTO_SHA256) { 70 csha_ctx.algo = CRYPTO_SHA256; 71 csha_ctx.length = input_len; 72 memset(hash, 0, sizeof(hash)); 73 crypto_sha_csum(dev, &csha_ctx, input_data, input_len, hash); 74 dump_hash("sha256", hash, crypto_algo_nbits(csha_ctx.algo), 75 input_data, input_len); 76 } else if (cap == CRYPTO_SHA512) { 77 csha_ctx.algo = CRYPTO_SHA512; 78 csha_ctx.length = input_len; 79 memset(hash, 0, sizeof(hash)); 80 crypto_sha_csum(dev, &csha_ctx, input_data, input_len, hash); 81 dump_hash("sha512", hash, crypto_algo_nbits(csha_ctx.algo), 82 input_data, input_len); 83 } 84 85 return 0; 86 } 87 88 U_BOOT_CMD( 89 crypto_sum, 4, 1, do_crypto_csum, 90 "crypto checksum engine", 91 "[md5|sha1|sha256|sha512] [addr] [length]" 92 ); 93 94