blob: 560aaeedd4b1e37a706fa27bcaf879949f4366ca [file] [log] [blame] [edit]
/* SPDX-License-Identifier: (GPL-2.0+ OR MIT) */
/*
* Copyright (c) 2019 Amlogic, Inc. All rights reserved.
*/
#ifndef _AML_CRYPTO_H
#define _AML_CRYPTO_H
#include <u-boot/sha256.h>
#define CRYPTO_ERROR_NO_ERROR (0)
#define CRYPTO_ERROR_BAD_PARAMETERS (-1)
#define CRYPTO_ERROR_BAD_PROCESS (-2)
#define AES_KEY_SIZE_128 16
#define AES_KEY_SIZE_192 24
#define AES_KEY_SIZE_256 32
#define DES_KEY_SIZE 8
#define TDES_2K_KEY_SIZE 16
#define TDES_3K_KEY_SIZE 24
#define SHA224_DIGEST_SIZE 28
#define SHA256_DIGEST_SIZE 32
#define SHA384_DIGEST_SIZE 38
#define SHA512_DIGEST_SIZE 64
#define SHA256_BLOCK_SIZE 64
#define SHA224_BLOCK_SIZE 64
#define SHA3_224_DIGEST_SIZE 28
#define SHA3_256_DIGEST_SIZE 32
#define SHA3_384_DIGEST_SIZE 48
#define SHA3_512_DIGEST_SIZE 64
#define SHA3_MAX_BLOCK_SIZE (168)
#define SHA3_STATE_SIZE (201)
#define SHA3_224_RATE (144)
#define SHA3_256_RATE (136)
#define SHA3_384_RATE (104)
#define SHA3_512_RATE (72)
#define SHAKE_128_RATE (168)
#define SHAKE_256_RATE (136)
enum SHA3_type {
SHA3_224 = 0,
SHA3_256 = 1,
SHA3_384 = 2,
SHA3_512 = 3,
SHA3_SHAKE_128 = 4,
SHA3_SHAKE_256 = 5,
SHA3_MAX
};
/* SHA2 context */
typedef struct {
uint32_t tot_len;
uint32_t digest_len;
uint32_t buf_len;
uint8_t buf[SHA256_BLOCK_SIZE];
uint8_t state[SHA256_DIGEST_SIZE + 16];
} sha2_ctx;
/* SHA3 context */
typedef struct {
uint32_t mode;
uint32_t tot_len;
uint32_t digest_len;
uint32_t block_size;
uint32_t buf_len;
uint8_t buf[SHA3_MAX_BLOCK_SIZE];
uint8_t state[SHA3_STATE_SIZE];
uint8_t rsv[7];
} sha3_ctx;
/*
* aes_ecb_enc_keytbl - AES ECB encrypt with keytable
*
* @input - input pointer
* @output - output pointer
* @nbytes - data length
* @key_slot - key table slot to be used
* @return - on successful, 0 and negative value, otherwise.
*/
int32_t aes_ecb_enc_keytbl(uint32_t keylen, const void *input, void *output,
uint8_t iv[16], size_t nbytes, uint32_t slot);
/*
* aes_ecb_dec_keytbl - AES ECB decrypt with keytable
*
* @input - input pointer
* @output - output pointer
* @nbytes - data length
* @key_slot - key table slot to be used
* @return - on successful, 0 and negative value, otherwise.
*/
int32_t aes_ecb_dec_keytbl(uint32_t keylen, const void *input, void *output,
uint8_t iv[16], size_t nbytes, uint32_t slot);
/*
* aes_cbc_enc_keytbl - AES CBC encrypt with keytable
*
* @input - input pointer
* @output - output pointer
* @iv - AES IV
* @nbytes - data length
* @key_slot - key table slot to be used
* @return - on successful, 0 and negative value, otherwise.
*/
int32_t aes_cbc_enc_keytbl(uint32_t keylen, const void *input, void *output,
uint8_t iv[16], size_t nbytes, uint32_t slot);
/*
* aes256cbc_dec_keytbl - AES CBC decrypt with keytable
*
* @input - input pointer
* @output - output pointer
* @iv - AES IV
* @nbytes - data length
* @key_slot - key table slot to be used
* @return - on successful, 0 and negative value, otherwise.
*/
int32_t aes256cbc_dec_keytbl(const void *input, void *output, uint8_t iv[16],
size_t nbytes, uint32_t key_slot);
/*
* aes_cbc_dec_keytbl - AES CBC decrypt with keytable
*
* @keylen - key length
* @input - input pointer
* @output - output pointer
* @iv - AES IV
* @nbytes - data length
* @slot - key table slot to be used
* @return - on successful, 0 and negative value, otherwise.
*/
int32_t aes_cbc_dec_keytbl(uint32_t keylen, const void *input, void *output, uint8_t iv[16],
size_t nbytes, uint32_t slot);
/*
* aes_ctr_encrypt_keytbl - AES CTR encrypt with keytable
*
* @keylen - key length
* @input - input pointer
* @output - output pointer
* @iv - AES initial counter
* @nbytes - data length
* @slot - key table slot to be used
* @return - on successful, 0 and negative value, otherwise.
*/
int32_t aes_ctr_encrypt_keytbl(uint32_t keylen, const void *input, void *output,
uint8_t iv[16], size_t nbytes, uint32_t slot);
/*
* aes_ctr_decrypt_keytbl - AES CTR decrypt with keytable
*
* @keylen - key length
* @input - input pointer
* @output - output pointer
* @iv - AES initial counter
* @nbytes - data length
* @slot - key table slot to be used
* @return - on successful, 0 and negative value, otherwise.
*/
int32_t aes_ctr_decrypt_keytbl(uint32_t keylen, const void *input, void *output,
uint8_t iv[16], size_t nbytes, uint32_t slot);
/*
* aes256cbc_iv0_dec_keytbl - AES CBC decrypt with keytable and iv0
*
* @input - input pointer
* @output - output pointer
* @nbytes - data length
* @slot - key table slot to be used
* @return - on successful, 0 and negative value, otherwise.
*/
int32_t aes256cbc_iv0_dec_keytbl(const void *input, void *output, size_t nbytes,
uint32_t slot);
/*
* des_tdes_ecb_enc_keytbl - DES/TDES ECB encrypt with keytable
*
* @keylen - key length
* @input - input pointer
* @output - output pointer
* @iv - TDES IV
* @nbytes - data length
* @slot - key table slot to be used
* @return - on successful, 0 and negative value, otherwise.
*/
int32_t des_tdes_ecb_enc_keytbl(uint32_t keylen, const void *input,
void *output, size_t nbytes, uint32_t slot);
/*
* des_tdes_ecb_dec_keytbl - DES/TDES ECB decrypt with keytable
*
* @keylen - key length
* @input - input pointer
* @output - output pointer
* @iv - TDES IV
* @nbytes - data length
* @slot - key table slot to be used
* @return - on successful, 0 and negative value, otherwise.
*/
int32_t des_tdes_ecb_dec_keytbl(uint32_t keylen, const void *input,
void *output, uint8_t iv[16], size_t nbytes, uint32_t slot);
/*
* des_tdes_cbc_enc_keytbl - DES/TDES CBC encrypt with keytable
*
* @keylen - key length
* @input - input pointer
* @output - output pointer
* @iv - TDES IV
* @nbytes - data length
* @slot - key table slot to be used
* @return - on successful, 0 and negative value, otherwise.
*/
int32_t des_tdes_cbc_enc_keytbl(uint32_t keylen, const void *input,
void *output, uint8_t iv[8], size_t nbytes, uint32_t slot);
/*
* des_tdes_cbc_dec_keytbl - DES/TDES CBC decrypt with keytable
*
* @keylen - key length
* @input - input pointer
* @output - output pointer
* @iv - TDES IV
* @nbytes - data length
* @slot - key table slot to be used
* @return - on successful, 0 and negative value, otherwise.
*/
int32_t des_tdes_cbc_dec_keytbl(uint32_t keylen, const void *input,
void *output, uint8_t iv[8], size_t nbytes, uint32_t slot);
/*
* aml_hw_sha2_init - HW SHA2 Init
*
* @ctx - SHA2 context
* @is224 - SHA224 or SHA256
* @return - on successful, 0 and negative value, otherwise.
*/
int32_t aml_hw_sha2_init(sha2_ctx *ctx, uint32_t is224);
/*
* aml_hw_sha2_update - HW SHA Update
*
* @ctx - SHA context
* @input - input pointer
* @ilen - input size
* @return - on successful, 0 and negative value, otherwise.
*/
int32_t aml_hw_sha2_update(sha2_ctx *ctx, const uint8_t *input, uint32_t ilen);
/*
* aml_hw_sha2_update - HW SHA Update
*
* @ctx - SHA context
* @input - input pointer
* @ilen - input size
* @hash - output hash
* @last_update - to finalize SHA context
* @return - on successful, 0 and negative value, otherwise.
*/
int32_t aml_hw_sha2_final(sha2_ctx *ctx, uint8_t *hash);
/*
* aml_hw_sha3_init - HW SHA3 Init
*
* @ctx - SHA context
* @mode - SHA3-224/256/384/512/SHAKE-128/SHAKE-256
* @return - on successful, 0 and negative value, otherwise.
*/
int32_t aml_hw_sha3_init(sha3_ctx *ctx, uint32_t mode);
/*
* aml_hw_sha3_update - HW SHA3 Update
*
* @ctx - SHA context
* @input - input pointer
* @ilen - input size
* @hash - output hash. There is no hash out when using SHAKE,
* use aml_hw_sha3_shake_squeeze instead.
* @last_update - to finalize SHA context
* @return - on successful, 0 and negative value, otherwise.
*/
int32_t aml_hw_sha3_update(sha3_ctx *ctx, const uint8_t *input, uint32_t ilen);
/*
* aml_hw_sha3_final - HW SHA3 finalize
*
* @ctx - SHA context
* @hash - output hash
* @digest_len - length of hash to copy, for SHAKE, it is squeeze size
* @return - on successful, 0 and negative value, otherwise.
*/
int32_t aml_hw_sha3_final(sha3_ctx *ctx, uint8_t *hash, uint32_t digest_size);
#endif