Files

172 lines
4.4 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>
#include <amlogic/aml_crypto.h>
#define SHA3_TMP_SIZE (256)
#define NO_BLOCK_BUFFERING_FOR_SHA3
/* DMA operation mode */
#define CIPHER_OP_MODE_ECB 0
#define CIPHER_OP_MODE_CBC 1
#define CIPHER_OP_MODE_CTR 2
#define SHA2_OP_MODE_SHA2 0
#define SHA2_OP_MODE_HMAC_IPAD 1
#define SHA2_OP_MODE_HMAC_OPAD 2
#define SHA3_OP_MODE_SHA3_224 0
#define SHA3_OP_MODE_SHA3_256 1
#define SHA3_OP_MODE_SHA3_384 2
#define SHA3_OP_MODE_SHA3_512 3
#define SHA3_OP_MODE_SHAKE_128_ABSORB 0
#define SHA3_OP_MODE_SHAKE_256_ABSORB 1
#define SHA3_OP_MODE_SHAKE_128_SQUEEZE 2
#define SHA3_OP_MODE_SHAKE_256_SQUEEZE 3
#define CIPHER_ENC_SHA_ONLY_DECRYPT 0
#define CIPHER_ENC_SHA_ONLY_ENCRYPT 1
#define SHA2_ENC_SHA_ONLY_COPY_AND_SHA 0
#define SHA2_ENC_SHA_ONLY_SHA 1
#define SHA3_ENC_SHA_ONLY_SHA3 0
#define SHA3_ENC_SHA_ONLY_SHAKE 1
#define SHA3_END_SHAKE_SAVE_CTX 0
#define SHA3_END_SHAKE_OUTPUT 1
/* DMA mode */
#define DMA_MODE_DMA 0x0
#define DMA_MODE_KEY 0x1
#define DMA_MODE_MEMSET 0x2
#define DMA_MODE_SHA3 0x3
/* 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;
#ifdef CONFIG_AML_CRYPTO_64
uint64_t src_addr;
uint64_t tgt_addr;
#else
uint32_t src_addr;
uint32_t tgt_addr;
#endif
} __packed;
/*
* 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);
/*
* sha2_update_internal - Internal logic for SHA update
*
* @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 sha2_update_internal(sha2_ctx *ctx, const uint8_t *input,
uint32_t ilen, uint8_t *hash, uint8_t last_update);
/*
* sha3_update_internal - Internal logic for SHA3 update
*
* @ctx - SHA context
* @input - input pointer
* @ilen - input length
* @digest - hash buffer
* @digest_size - size of hash buffer
* @last_update - to finalize context
* @return - on successful, 0 and negative value, otherwise.
*/
int32_t sha3_update_internal(sha3_ctx *ctx, const uint8_t *input,
uint32_t ilen, uint8_t *digest, uint32_t digest_size, uint8_t last_update);
/*
* sha3_shake_squeeze_internal - Internal logic for SHAKE squeeze
*
* @ctx - SHA context
* @hash - hash buffer
* @hash_len - size of hash buffer
* @return - on successful, 0 and negative value, otherwise.
*/
int32_t sha3_shake_squeeze_internal(sha3_ctx *ctx, uint8_t *hash, uint32_t hash_len);
#endif