Beispiel #1
0
/**
 * do_aes() - Handle the "aes" command-line command
 * @cmdtp:	Command data struct pointer
 * @flag:	Command flag
 * @argc:	Command-line argument count
 * @argv:	Array of command-line arguments
 *
 * Returns zero on success, CMD_RET_USAGE in case of misuse and negative
 * on error.
 */
static int do_aes(cmd_tbl_t *cmdtp, int flag, int argc, char *const argv[])
{
	uint32_t key_addr, iv_addr, src_addr, dst_addr, len;
	uint8_t *key_ptr, *iv_ptr, *src_ptr, *dst_ptr;
	uint8_t key_exp[AES_EXPAND_KEY_LENGTH];
	uint32_t aes_blocks;
	int enc;

	if (argc != 7)
		return CMD_RET_USAGE;

	if (!strncmp(argv[1], "enc", 3))
		enc = 1;
	else if (!strncmp(argv[1], "dec", 3))
		enc = 0;
	else
		return CMD_RET_USAGE;

	key_addr = simple_strtoul(argv[2], NULL, 16);
	iv_addr = simple_strtoul(argv[3], NULL, 16);
	src_addr = simple_strtoul(argv[4], NULL, 16);
	dst_addr = simple_strtoul(argv[5], NULL, 16);
	len = simple_strtoul(argv[6], NULL, 16);

	key_ptr = (uint8_t *)key_addr;
	iv_ptr = (uint8_t *)iv_addr;
	src_ptr = (uint8_t *)src_addr;
	dst_ptr = (uint8_t *)dst_addr;

	/* First we expand the key. */
	aes_expand_key(key_ptr, key_exp);

	/* Calculate the number of AES blocks to encrypt. */
	aes_blocks = DIV_ROUND_UP(len, AES_KEY_LENGTH);

	if (enc)
		aes_cbc_encrypt_blocks(key_exp, iv_ptr, src_ptr, dst_ptr,
				       aes_blocks);
	else
		aes_cbc_decrypt_blocks(key_exp, iv_ptr, src_ptr, dst_ptr,
				       aes_blocks);

	return 0;
}
Beispiel #2
0
static int env_aes_cbc_crypt(env_t *env, const int enc)
{
    unsigned char *data = env->data;
    uint8_t *key;
    uint8_t key_exp[AES_EXPAND_KEY_LENGTH];
    uint32_t aes_blocks;

    key = env_aes_cbc_get_key();
    if (!key)
        return -EINVAL;

    /* First we expand the key. */
    aes_expand_key(key, key_exp);

    /* Calculate the number of AES blocks to encrypt. */
    aes_blocks = ENV_SIZE / AES_KEY_LENGTH;

    if (enc)
        aes_cbc_encrypt_blocks(key_exp, data, data, aes_blocks);
    else
        aes_cbc_decrypt_blocks(key_exp, data, data, aes_blocks);

    return 0;
}