1*2e192b24SSimon Glass /* 2*2e192b24SSimon Glass * Copyright (C) 2014 Marek Vasut <marex@denx.de> 3*2e192b24SSimon Glass * 4*2e192b24SSimon Glass * Command for en/de-crypting block of memory with AES-128-CBC cipher. 5*2e192b24SSimon Glass * 6*2e192b24SSimon Glass * SPDX-License-Identifier: GPL-2.0+ 7*2e192b24SSimon Glass */ 8*2e192b24SSimon Glass 9*2e192b24SSimon Glass #include <common.h> 10*2e192b24SSimon Glass #include <command.h> 11*2e192b24SSimon Glass #include <environment.h> 12*2e192b24SSimon Glass #include <aes.h> 13*2e192b24SSimon Glass #include <malloc.h> 14*2e192b24SSimon Glass #include <asm/byteorder.h> 15*2e192b24SSimon Glass #include <linux/compiler.h> 16*2e192b24SSimon Glass 17*2e192b24SSimon Glass DECLARE_GLOBAL_DATA_PTR; 18*2e192b24SSimon Glass 19*2e192b24SSimon Glass /** 20*2e192b24SSimon Glass * do_aes() - Handle the "aes" command-line command 21*2e192b24SSimon Glass * @cmdtp: Command data struct pointer 22*2e192b24SSimon Glass * @flag: Command flag 23*2e192b24SSimon Glass * @argc: Command-line argument count 24*2e192b24SSimon Glass * @argv: Array of command-line arguments 25*2e192b24SSimon Glass * 26*2e192b24SSimon Glass * Returns zero on success, CMD_RET_USAGE in case of misuse and negative 27*2e192b24SSimon Glass * on error. 28*2e192b24SSimon Glass */ 29*2e192b24SSimon Glass static int do_aes(cmd_tbl_t *cmdtp, int flag, int argc, char *const argv[]) 30*2e192b24SSimon Glass { 31*2e192b24SSimon Glass uint32_t key_addr, src_addr, dst_addr, len; 32*2e192b24SSimon Glass uint8_t *key_ptr, *src_ptr, *dst_ptr; 33*2e192b24SSimon Glass uint8_t key_exp[AES_EXPAND_KEY_LENGTH]; 34*2e192b24SSimon Glass uint32_t aes_blocks; 35*2e192b24SSimon Glass int enc; 36*2e192b24SSimon Glass 37*2e192b24SSimon Glass if (argc != 6) 38*2e192b24SSimon Glass return CMD_RET_USAGE; 39*2e192b24SSimon Glass 40*2e192b24SSimon Glass if (!strncmp(argv[1], "enc", 3)) 41*2e192b24SSimon Glass enc = 1; 42*2e192b24SSimon Glass else if (!strncmp(argv[1], "dec", 3)) 43*2e192b24SSimon Glass enc = 0; 44*2e192b24SSimon Glass else 45*2e192b24SSimon Glass return CMD_RET_USAGE; 46*2e192b24SSimon Glass 47*2e192b24SSimon Glass key_addr = simple_strtoul(argv[2], NULL, 16); 48*2e192b24SSimon Glass src_addr = simple_strtoul(argv[3], NULL, 16); 49*2e192b24SSimon Glass dst_addr = simple_strtoul(argv[4], NULL, 16); 50*2e192b24SSimon Glass len = simple_strtoul(argv[5], NULL, 16); 51*2e192b24SSimon Glass 52*2e192b24SSimon Glass key_ptr = (uint8_t *)key_addr; 53*2e192b24SSimon Glass src_ptr = (uint8_t *)src_addr; 54*2e192b24SSimon Glass dst_ptr = (uint8_t *)dst_addr; 55*2e192b24SSimon Glass 56*2e192b24SSimon Glass /* First we expand the key. */ 57*2e192b24SSimon Glass aes_expand_key(key_ptr, key_exp); 58*2e192b24SSimon Glass 59*2e192b24SSimon Glass /* Calculate the number of AES blocks to encrypt. */ 60*2e192b24SSimon Glass aes_blocks = DIV_ROUND_UP(len, AES_KEY_LENGTH); 61*2e192b24SSimon Glass 62*2e192b24SSimon Glass if (enc) 63*2e192b24SSimon Glass aes_cbc_encrypt_blocks(key_exp, src_ptr, dst_ptr, aes_blocks); 64*2e192b24SSimon Glass else 65*2e192b24SSimon Glass aes_cbc_decrypt_blocks(key_exp, src_ptr, dst_ptr, aes_blocks); 66*2e192b24SSimon Glass 67*2e192b24SSimon Glass return 0; 68*2e192b24SSimon Glass } 69*2e192b24SSimon Glass 70*2e192b24SSimon Glass /***************************************************/ 71*2e192b24SSimon Glass #ifdef CONFIG_SYS_LONGHELP 72*2e192b24SSimon Glass static char aes_help_text[] = 73*2e192b24SSimon Glass "enc key src dst len - Encrypt block of data $len bytes long\n" 74*2e192b24SSimon Glass " at address $src using a key at address\n" 75*2e192b24SSimon Glass " $key and store the result at address\n" 76*2e192b24SSimon Glass " $dst. The $len size must be multiple of\n" 77*2e192b24SSimon Glass " 16 bytes and $key must be 16 bytes long.\n" 78*2e192b24SSimon Glass "aes dec key src dst len - Decrypt block of data $len bytes long\n" 79*2e192b24SSimon Glass " at address $src using a key at address\n" 80*2e192b24SSimon Glass " $key and store the result at address\n" 81*2e192b24SSimon Glass " $dst. The $len size must be multiple of\n" 82*2e192b24SSimon Glass " 16 bytes and $key must be 16 bytes long."; 83*2e192b24SSimon Glass #endif 84*2e192b24SSimon Glass 85*2e192b24SSimon Glass U_BOOT_CMD( 86*2e192b24SSimon Glass aes, 6, 1, do_aes, 87*2e192b24SSimon Glass "AES 128 CBC encryption", 88*2e192b24SSimon Glass aes_help_text 89*2e192b24SSimon Glass ); 90