Files

120 lines
2.9 KiB
C

/* SPDX-License-Identifier: (GPL-2.0+ OR MIT) */
/*
* Copyright (c) 2019 Amlogic, Inc. All rights reserved.
*/
#ifndef _CRYPTO_INTERNAL_H
#define _CRYPTO_INTERNAL_H
#include <common.h>
#include <u-boot/sha256.h>
#define USE_SHA_OLD_CODE
#define HASH_FLUSH_INPUT
/* DMA operation mode */
#define CIPHER_OP_MODE_ECB 0
#define CIPHER_OP_MODE_CBC 1
#define CIPHER_OP_MODE_CTR 2
#define HASH_OP_MODE_SHA1 1
#define HASH_OP_MODE_SHA256 2
#define HASH_OP_MODE_SHA224 3
/* DMA mode */
#define DMA_MODE_DMA 0x0
#define DMA_MODE_KEY 0x1
#define DMA_MODE_MEMSET 0x2
/* 0x3 skipped */
/* 0x4 skipped */
#define DMA_MODE_SHA1 0x5
#define DMA_MODE_SHA256 0x6
#define DMA_MODE_SHA224 0x7
#define DMA_MODE_AES128 0x8
#define DMA_MODE_AES192 0x9
#define DMA_MODE_AES256 0xa
#define DMA_MODE_S17 0xb
#define DMA_MODE_DES 0xc
/* 0xd skipped */
#define DMA_MODE_TDES_2K 0xe
#define DMA_MODE_TDES_3K 0xf
#define DMA_BLOCK_SIZE (0x200)
#define MAX_BLOCK_TRANSFER (0x1ffff)
#define KEYTABLE_BASE (0xffffff00)
#define KEYTABLE_MAX_SLOT (0xff)
struct dma_dsc {
union {
uint32_t d32;
struct {
unsigned length:17;
unsigned irq:1;
unsigned eoc:1;
unsigned loop:1;
unsigned mode:4;
unsigned begin:1;
unsigned end:1;
unsigned op_mode:2;
unsigned enc_sha_only:1;
unsigned block:1;
unsigned error:1;
unsigned owner:1;
} b;
} dsc_cfg;
uint32_t src_addr;
uint32_t tgt_addr;
};
/*
* aes_cipher - aes cipher
*
* @key - key pointer, can be actually key buffer, or key table addr
* @keylen - length of key
* @iv - AES IV
* @src - src pointer
* @dst - dst pointer
* @encrypt - encrypt or decrypt
* @mode - DMA mode
* @op_mode - DMA operation mode
* @size - data length
* @return - on successful, 0 and negative value, otherwise.
*/
int32_t aes_cipher(void *key, uint32_t keylen, uint8_t iv[16],
const void *src, void *dst, uint8_t encrypt, uint8_t mode,
uint8_t op_mode, size_t size);
/*
* des_tdes_cipher - des and tdes cipher
*
* @key - key pointer, can be actually key buffer, or key table addr
* @keylen - length of key
* @iv - DES/TDES IV
* @src - src pointer
* @dst - dst pointer
* @encrypt - encrypt or decrypt
* @mode - DMA mode
* @op_mode - DMA operation mode
* @size - data length
* @return - on successful, 0 and negative value, otherwise.
*/
int32_t des_tdes_cipher(void *key, uint32_t keylen, uint8_t iv[8],
const void *src, void *dst, uint8_t encrypt, uint8_t mode,
uint8_t op_mode, size_t size);
/*
* hw_update_internal - Internal logic for SHA update
*
* @cur_ctx - SHA context
* @input - input pointer
* @ilen - input length
* @hash - hash buffer
* @last_update - to finalize context
* @return - on successful, 0 and negative value, otherwise.
*/
int32_t hw_update_internal(sha2_ctx *cur_ctx, const uint8_t *input,
uint32_t ilen, uint8_t *hash, uint8_t last_update);
#endif