123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189 |
- /*
- * Copyright (c) 2006-2023, RT-Thread Development Team
- *
- * SPDX-License-Identifier: Apache-2.0
- *
- * Change Logs:
- * Date Author Notes
- * 2019-04-25 tyx the first version
- */
- #ifndef __HW_SYMMETRIC_H__
- #define __HW_SYMMETRIC_H__
- #include <hwcrypto.h>
- #ifndef RT_HWCRYPTO_IV_MAX_SIZE
- #define RT_HWCRYPTO_IV_MAX_SIZE (16)
- #endif
- #ifndef RT_HWCRYPTO_KEYBIT_MAX_SIZE
- #define RT_HWCRYPTO_KEYBIT_MAX_SIZE (256)
- #endif
- #define SYMMTRIC_MODIFY_KEY (0x1 << 0)
- #define SYMMTRIC_MODIFY_IV (0x1 << 1)
- #define SYMMTRIC_MODIFY_IVOFF (0x1 << 2)
- #ifdef __cplusplus
- extern "C" {
- #endif
- struct hwcrypto_symmetric;
- struct hwcrypto_symmetric_info;
- struct hwcrypto_symmetric_ops
- {
- rt_err_t (*crypt)(struct hwcrypto_symmetric *symmetric_ctx,
- struct hwcrypto_symmetric_info *symmetric_info); /**< Hardware Symmetric Encryption and Decryption Callback */
- };
- /**
- * @brief Hardware driver usage, including input and output information
- */
- struct hwcrypto_symmetric_info
- {
- hwcrypto_mode mode; /**< crypto mode. HWCRYPTO_MODE_ENCRYPT or HWCRYPTO_MODE_DECRYPT */
- const rt_uint8_t *in; /**< Input data */
- rt_uint8_t *out; /**< Output data will be written */
- rt_size_t length; /**< The length of the input data in Bytes. It's a multiple of block size. */
- };
- /**
- * @brief Symmetric crypto context. Hardware driver usage
- */
- struct hwcrypto_symmetric
- {
- struct rt_hwcrypto_ctx parent; /**< Inheritance from hardware crypto context */
- rt_uint16_t flags; /**< key or iv or ivoff has been changed. The flag will be set up */
- rt_uint16_t iv_len; /**< initialization vector effective length */
- rt_uint16_t iv_off; /**< The offset in IV */
- rt_uint16_t key_bitlen; /**< The crypto key bit length */
- rt_uint8_t iv[RT_HWCRYPTO_IV_MAX_SIZE]; /**< The initialization vector */
- rt_uint8_t key[RT_HWCRYPTO_KEYBIT_MAX_SIZE >> 3]; /**< The crypto key */
- const struct hwcrypto_symmetric_ops *ops; /**< !! Hardware initializes this value when creating context !! */
- };
- /**
- * @brief Creating Symmetric Encryption and Decryption Context
- *
- * @param device Hardware crypto device
- * @param type Type of symmetric crypto context
- *
- * @return Symmetric crypto context
- */
- struct rt_hwcrypto_ctx *rt_hwcrypto_symmetric_create(struct rt_hwcrypto_device *device,
- hwcrypto_type type);
- /**
- * @brief Destroy Symmetric Encryption and Decryption Context
- *
- * @param ctx Symmetric crypto context
- */
- void rt_hwcrypto_symmetric_destroy(struct rt_hwcrypto_ctx *ctx);
- /**
- * @brief This function performs a symmetric encryption or decryption operation
- *
- * @param ctx Symmetric crypto context
- * @param mode Operation mode. HWCRYPTO_MODE_ENCRYPT or HWCRYPTO_MODE_DECRYPT
- * @param length The length of the input data in Bytes. This must be a multiple of the block size
- * @param in The buffer holding the input data
- * @param out The buffer holding the output data
- *
- * @return RT_EOK on success.
- */
- rt_err_t rt_hwcrypto_symmetric_crypt(struct rt_hwcrypto_ctx *ctx, hwcrypto_mode mode,
- rt_size_t length, const rt_uint8_t *in, rt_uint8_t *out);
- /**
- * @brief Set Symmetric Encryption and Decryption Key
- *
- * @param ctx Symmetric crypto context
- * @param key The crypto key
- * @param bitlen The crypto key bit length
- *
- * @return RT_EOK on success.
- */
- rt_err_t rt_hwcrypto_symmetric_setkey(struct rt_hwcrypto_ctx *ctx, const rt_uint8_t *key, rt_uint32_t bitlen);
- /**
- * @brief Get Symmetric Encryption and Decryption Key
- *
- * @param ctx Symmetric crypto context
- * @param key The crypto key buffer
- * @param bitlen The crypto key bit length
- *
- * @return Key length of copy
- */
- int rt_hwcrypto_symmetric_getkey(struct rt_hwcrypto_ctx *ctx, rt_uint8_t *key, rt_uint32_t bitlen);
- /**
- * @brief Set Symmetric Encryption and Decryption initialization vector
- *
- * @param ctx Symmetric crypto context
- * @param iv The crypto initialization vector
- * @param len The crypto initialization vector length
- *
- * @return RT_EOK on success.
- */
- rt_err_t rt_hwcrypto_symmetric_setiv(struct rt_hwcrypto_ctx *ctx, const rt_uint8_t *iv, rt_size_t len);
- /**
- * @brief Get Symmetric Encryption and Decryption initialization vector
- *
- * @param ctx Symmetric crypto context
- * @param iv The crypto initialization vector buffer
- * @param len The crypto initialization vector buffer length
- *
- * @return IV length of copy
- */
- int rt_hwcrypto_symmetric_getiv(struct rt_hwcrypto_ctx *ctx, rt_uint8_t *iv, rt_size_t len);
- /**
- * @brief Set offset in initialization vector
- *
- * @param ctx Symmetric crypto context
- * @param iv_off The offset in IV
- */
- void rt_hwcrypto_symmetric_set_ivoff(struct rt_hwcrypto_ctx *ctx, rt_int32_t iv_off);
- /**
- * @brief Get offset in initialization vector
- *
- * @param ctx Symmetric crypto context
- * @param iv_off It must point to a valid memory
- */
- void rt_hwcrypto_symmetric_get_ivoff(struct rt_hwcrypto_ctx *ctx, rt_int32_t *iv_off);
- /**
- * @brief This function copy symmetric crypto context
- *
- * @param des The destination symmetric crypto context
- * @param src The symmetric crypto context to be copy
- *
- * @return RT_EOK on success.
- */
- rt_err_t rt_hwcrypto_symmetric_cpy(struct rt_hwcrypto_ctx *des, const struct rt_hwcrypto_ctx *src);
- /**
- * @brief Reset symmetric crypto context
- *
- * @param ctx Symmetric crypto context
- */
- void rt_hwcrypto_symmetric_reset(struct rt_hwcrypto_ctx *ctx);
- /**
- * @brief Setting symmetric crypto context type
- *
- * @param ctx Symmetric crypto context
- * @param type Types of settings
- *
- * @return RT_EOK on success.
- */
- rt_err_t rt_hwcrypto_symmetric_set_type(struct rt_hwcrypto_ctx *ctx, hwcrypto_type type);
- #ifdef __cplusplus
- }
- #endif
- #endif
|