Home | History | Annotate | Download | only in cmd
      1 // SPDX-License-Identifier: GPL-2.0+
      2 /*
      3  *
      4  * Command for encapsulating/decapsulating blob of memory.
      5  */
      6 
      7 #include <common.h>
      8 #include <command.h>
      9 #include <environment.h>
     10 #include <malloc.h>
     11 #include <asm/byteorder.h>
     12 #include <linux/compiler.h>
     13 
     14 /**
     15  * blob_decap() - Decapsulate the data as a blob
     16  * @key_mod:	- Pointer to key modifier/key
     17  * @src:	- Address of data to be decapsulated
     18  * @dst:	- Address of data to be decapsulated
     19  * @len:	- Size of data to be decapsulated
     20  *
     21  * Returns zero on success,and negative on error.
     22  */
     23 __weak int blob_decap(u8 *key_mod, u8 *src, u8 *dst, u32 len)
     24 {
     25 	return 0;
     26 }
     27 
     28 /**
     29  * blob_encap() - Encapsulate the data as a blob
     30  * @key_mod:	- Pointer to key modifier/key
     31  * @src:	- Address of data to be encapsulated
     32  * @dst:	- Address of data to be encapsulated
     33  * @len:	- Size of data to be encapsulated
     34  *
     35  * Returns zero on success,and negative on error.
     36  */
     37 __weak int blob_encap(u8 *key_mod, u8 *src, u8 *dst, u32 len)
     38 {
     39 	return 0;
     40 }
     41 
     42 /**
     43  * do_blob() - Handle the "blob" command-line command
     44  * @cmdtp:	Command data struct pointer
     45  * @flag:	Command flag
     46  * @argc:	Command-line argument count
     47  * @argv:	Array of command-line arguments
     48  *
     49  * Returns zero on success, CMD_RET_USAGE in case of misuse and negative
     50  * on error.
     51  */
     52 static int do_blob(cmd_tbl_t *cmdtp, int flag, int argc, char *const argv[])
     53 {
     54 	ulong key_addr, src_addr, dst_addr, len;
     55 	uint8_t *km_ptr, *src_ptr, *dst_ptr;
     56 	int enc, ret = 0;
     57 
     58 	if (argc != 6)
     59 		return CMD_RET_USAGE;
     60 
     61 	if (!strncmp(argv[1], "enc", 3))
     62 		enc = 1;
     63 	else if (!strncmp(argv[1], "dec", 3))
     64 		enc = 0;
     65 	else
     66 		return CMD_RET_USAGE;
     67 
     68 	src_addr = simple_strtoul(argv[2], NULL, 16);
     69 	dst_addr = simple_strtoul(argv[3], NULL, 16);
     70 	len = simple_strtoul(argv[4], NULL, 16);
     71 	key_addr = simple_strtoul(argv[5], NULL, 16);
     72 
     73 	km_ptr = (uint8_t *)(uintptr_t)key_addr;
     74 	src_ptr = (uint8_t *)(uintptr_t)src_addr;
     75 	dst_ptr = (uint8_t *)(uintptr_t)dst_addr;
     76 
     77 	if (enc)
     78 		ret = blob_encap(km_ptr, src_ptr, dst_ptr, len);
     79 	else
     80 		ret = blob_decap(km_ptr, src_ptr, dst_ptr, len);
     81 
     82 	return ret;
     83 }
     84 
     85 /***************************************************/
     86 static char blob_help_text[] =
     87 	"enc src dst len km - Encapsulate and create blob of data\n"
     88 	"                          $len bytes long at address $src and\n"
     89 	"                          store the result at address $dst.\n"
     90 	"                          $km is the address where the key\n"
     91 	"                          modifier is stored.\n"
     92 	"                          The modifier is required for generation\n"
     93 	"                          /use as key for cryptographic operation.\n"
     94 	"                          Key modifier should be 16 byte long.\n"
     95 	"blob dec src dst len km - Decapsulate the  blob of data at address\n"
     96 	"                          $src and store result of $len byte at\n"
     97 	"                          addr $dst.\n"
     98 	"                          $km is the address where the key\n"
     99 	"                          modifier is stored.\n"
    100 	"                          The modifier is required for generation\n"
    101 	"                          /use as key for cryptographic operation.\n"
    102 	"                          Key modifier should be 16 byte long.\n";
    103 
    104 U_BOOT_CMD(
    105 	blob, 6, 1, do_blob,
    106 	"Blob encapsulation/decryption",
    107 	blob_help_text
    108 );
    109