187 lines
		
	
	
		
			5.6 KiB
		
	
	
	
		
			C
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			187 lines
		
	
	
		
			5.6 KiB
		
	
	
	
		
			C
		
	
	
		
			Executable File
		
	
	
	
	
| /*
 | |
|  * 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_BIGNUM_H__
 | |
| #define __HW_BIGNUM_H__
 | |
| 
 | |
| #include <hwcrypto.h>
 | |
| 
 | |
| #ifdef __cplusplus
 | |
| extern "C" {
 | |
| #endif
 | |
| 
 | |
| struct hwcrypto_bignum;
 | |
| 
 | |
| /* bignum obj */
 | |
| struct hw_bignum_mpi
 | |
| {
 | |
|     int sign;                   /**< integer sign. -1 or 1 */
 | |
|     rt_size_t total;            /**< total of limbs */
 | |
|     rt_uint8_t *p;              /**< pointer to limbs */
 | |
| };
 | |
| 
 | |
| struct hwcrypto_bignum_ops
 | |
| {
 | |
|     rt_err_t (*add)(struct hwcrypto_bignum *bignum_ctx,
 | |
|                     struct hw_bignum_mpi *x,
 | |
|                     const struct hw_bignum_mpi *a,
 | |
|                     const struct hw_bignum_mpi *b);             /**< x = a + b */
 | |
|     rt_err_t (*sub)(struct hwcrypto_bignum *bignum_ctx,
 | |
|                     struct hw_bignum_mpi *x,
 | |
|                     const struct hw_bignum_mpi *a,
 | |
|                     const struct hw_bignum_mpi *b);             /**< x = a - b */
 | |
|     rt_err_t (*mul)(struct hwcrypto_bignum *bignum_ctx,
 | |
|                     struct hw_bignum_mpi *x,
 | |
|                     const struct hw_bignum_mpi *a,
 | |
|                     const struct hw_bignum_mpi *b);             /**< x = a * b */
 | |
|     rt_err_t (*mulmod)(struct hwcrypto_bignum *bignum_ctx,
 | |
|                        struct hw_bignum_mpi *x,
 | |
|                        const struct hw_bignum_mpi *a,
 | |
|                        const struct hw_bignum_mpi *b,
 | |
|                        const struct hw_bignum_mpi *c);          /**< x = a * b (mod c) */
 | |
|     rt_err_t (*exptmod)(struct hwcrypto_bignum *bignum_ctx,
 | |
|                         struct hw_bignum_mpi *x,
 | |
|                         const struct hw_bignum_mpi *a,
 | |
|                         const struct hw_bignum_mpi *b,
 | |
|                         const struct hw_bignum_mpi *c);         /**< x = a ^ b (mod c) */
 | |
| };
 | |
| 
 | |
| /**
 | |
|  * @brief           bignum context. Hardware driver usage
 | |
|  */
 | |
| struct hwcrypto_bignum
 | |
| {
 | |
|     struct rt_hwcrypto_ctx parent;              /**< Inheritance from hardware crypto context */
 | |
|     const struct hwcrypto_bignum_ops *ops;      /**< !! Hardware initializes this value when creating context !! */
 | |
| };
 | |
| 
 | |
| /**
 | |
|  * @brief           Setting bignum default devices
 | |
|  *
 | |
|  * @return          RT_EOK on success.
 | |
|  */
 | |
| rt_err_t rt_hwcrypto_bignum_default(struct rt_hwcrypto_device *device);
 | |
| 
 | |
| /**
 | |
|  * @brief           Init bignum obj
 | |
|  */
 | |
| void rt_hwcrypto_bignum_init(struct hw_bignum_mpi *n);
 | |
| 
 | |
| /**
 | |
|  * @brief           free a bignum obj
 | |
|  *
 | |
|  * @param           Pointer to bignum obj
 | |
|  */
 | |
| void rt_hwcrypto_bignum_free(struct hw_bignum_mpi *n);
 | |
| 
 | |
| /**
 | |
|  * @brief           Get length of bignum as an unsigned binary buffer
 | |
|  *
 | |
|  * @param n         bignum obj
 | |
|  *
 | |
|  * @return          binary buffer Length
 | |
|  */
 | |
| int rt_hwcrypto_bignum_get_len(const struct hw_bignum_mpi *n);
 | |
| 
 | |
| /**
 | |
|  * @brief           Export n into unsigned binary data, big endian
 | |
|  *
 | |
|  * @param n         bignum obj
 | |
|  * @param buf       Buffer for the binary number
 | |
|  * @param len       Length of the buffer
 | |
|  *
 | |
|  * @return          export bin length
 | |
|  */
 | |
| int rt_hwcrypto_bignum_export_bin(struct hw_bignum_mpi *n, rt_uint8_t *buf, int len);
 | |
| 
 | |
| /**
 | |
|  * @brief           Import n from unsigned binary data, big endian
 | |
|  *
 | |
|  * @param n         bignum obj
 | |
|  * @param buf       Buffer for the binary number
 | |
|  * @param len       Length of the buffer
 | |
|  *
 | |
|  * @return          import length.
 | |
|  */
 | |
| int rt_hwcrypto_bignum_import_bin(struct hw_bignum_mpi *n, rt_uint8_t *buf, int len);
 | |
| 
 | |
| /**
 | |
|  * @brief           x = a + b
 | |
|  *
 | |
|  * @param a         bignum obj
 | |
|  * @param b         bignum obj
 | |
|  * @param c         bignum obj
 | |
|  *
 | |
|  * @return          RT_EOK on success.
 | |
|  */
 | |
| rt_err_t rt_hwcrypto_bignum_add(struct hw_bignum_mpi *x,
 | |
|                                 const struct hw_bignum_mpi *a,
 | |
|                                 const struct hw_bignum_mpi *b);
 | |
| 
 | |
| /**
 | |
|  * @brief           x = a - b
 | |
|  *
 | |
|  * @param a         bignum obj
 | |
|  * @param b         bignum obj
 | |
|  * @param c         bignum obj
 | |
|  *
 | |
|  * @return          RT_EOK on success.
 | |
|  */
 | |
| rt_err_t rt_hwcrypto_bignum_sub(struct hw_bignum_mpi *x,
 | |
|                                 const struct hw_bignum_mpi *a,
 | |
|                                 const struct hw_bignum_mpi *b);
 | |
| 
 | |
| /**
 | |
|  * @brief           x = a * b
 | |
|  *
 | |
|  * @param a         bignum obj
 | |
|  * @param b         bignum obj
 | |
|  * @param c         bignum obj
 | |
|  *
 | |
|  * @return          RT_EOK on success.
 | |
|  */
 | |
| rt_err_t rt_hwcrypto_bignum_mul(struct hw_bignum_mpi *x,
 | |
|                                 const struct hw_bignum_mpi *a,
 | |
|                                 const struct hw_bignum_mpi *b);
 | |
| 
 | |
| /**
 | |
|  * @brief           x = a * b (mod c)
 | |
|  *
 | |
|  * @param a         bignum obj
 | |
|  * @param b         bignum obj
 | |
|  * @param c         bignum obj
 | |
|  *
 | |
|  * @return          RT_EOK on success.
 | |
|  */
 | |
| rt_err_t rt_hwcrypto_bignum_mulmod(struct hw_bignum_mpi *x,
 | |
|                                    const struct hw_bignum_mpi *a,
 | |
|                                    const struct hw_bignum_mpi *b,
 | |
|                                    const struct hw_bignum_mpi *c);
 | |
| 
 | |
| /**
 | |
|  * @brief           x = a ^ b (mod c)
 | |
|  *
 | |
|  * @param a         bignum obj
 | |
|  * @param b         bignum obj
 | |
|  * @param c         bignum obj
 | |
|  *
 | |
|  * @return          RT_EOK on success.
 | |
|  */
 | |
| rt_err_t rt_hwcrypto_bignum_exptmod(struct hw_bignum_mpi *x,
 | |
|                                     const struct hw_bignum_mpi *a,
 | |
|                                     const struct hw_bignum_mpi *b,
 | |
|                                     const struct hw_bignum_mpi *c);
 | |
| 
 | |
| #ifdef __cplusplus
 | |
| }
 | |
| #endif
 | |
| 
 | |
| #endif
 |