AES128 加密解密C源码实现

AES128 加密解密C源码实现

#ifndef AES_C_H
#define AES_C_H

/**

  • \file aes.h
  • \brief This file contains AES definitions and functions.
  •      The Advanced Encryption Standard (AES) specifies a FIPS-approved
    
  •      cryptographic algorithm that can be used to protect electronic
    
  •      data.
    
  •      The AES algorithm is a symmetric block cipher that can
    
  •      encrypt and decrypt information. For more information, see
    
  •      <em>FIPS Publication 197: Advanced Encryption Standard</em> and
    
  •      <em>ISO/IEC 18033-2:2006: Information technology -- Security
    
  •      techniques -- Encryption algorithms -- Part 2: Asymmetric
    
  •      ciphers</em>.
    
  •      The AES-XTS block mode is standardized by NIST SP 800-38E
    
  •      <https://nvlpubs.nist.gov/nistpubs/legacy/sp/nistspecialpublication800-38e.pdf>
    
  •      and described in detail by IEEE P1619
    
  •      <https://ieeexplore.ieee.org/servlet/opac?punumber=4375278>.
    

*/

/* Copyright © 2006-2018, Arm Limited (or its affiliates), All Rights Reserved.

  • SPDX-License-Identifier: Apache-2.0
  • Licensed under the Apache License, Version 2.0 (the “License”); you may
  • not use this file except in compliance with the License.
  • You may obtain a copy of the License at
  • http://www.apache.org/licenses/LICENSE-2.0
  • Unless required by applicable law or agreed to in writing, software
  • distributed under the License is distributed on an “AS IS” BASIS, WITHOUT
  • WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  • See the License for the specific language governing permissions and
  • limitations under the License.

*/

#include <stddef.h>
#include <stdint.h>

#define MBEDTLS_AES_C
#define MBEDTLS_AES_ROM_TABLES

typedef int32u uint32_t;
typedef int8u uint8_t;

/* padlock.c and aesni.c rely on these values! */
#define MBEDTLS_AES_ENCRYPT 1 /< AES encryption. */
#define MBEDTLS_AES_DECRYPT 0 /
< AES decryption. */

/* Error codes in range 0x0020-0x0022 */
#define MBEDTLS_ERR_AES_INVALID_KEY_LENGTH -0x0020 /< Invalid key length. */
#define MBEDTLS_ERR_AES_INVALID_INPUT_LENGTH -0x0022 /
< Invalid data input length. */

/* Error codes in range 0x0021-0x0025 */
#define MBEDTLS_ERR_AES_BAD_INPUT_DATA -0x0021 /**< Invalid input data. */

/* MBEDTLS_ERR_AES_FEATURE_UNAVAILABLE is deprecated and should not be used. */
#define MBEDTLS_ERR_AES_FEATURE_UNAVAILABLE -0x0023 /**< Feature not available. For example, an unsupported AES key size. */

/* MBEDTLS_ERR_AES_HW_ACCEL_FAILED is deprecated and should not be used. */
#define MBEDTLS_ERR_AES_HW_ACCEL_FAILED -0x0025 /**< AES hardware accelerator failed. */

#if ( defined(__ARMCC_VERSION) || defined(_MSC_VER) ) &&
!defined(inline) && !defined(__cplusplus)
#define inline __inline
#endif

#ifdef __cplusplus
extern “C” {
#endif

#if !defined(MBEDTLS_AES_ALT)
// Regular implementation
//

/**

  • \brief The AES context-type definition.
    /
    typedef struct mbedtls_aes_context
    {
    int nr; /
    !< The number of rounds. */
    uint32_t rk; /!< AES round keys. /
    uint32_t buf[68]; /
    !< Unaligned data buffer. This buffer can
    hold 32 extra Bytes, which can be used for
    one of the following purposes:
    • Alignment if VIA padlock is
      used.

    • Simplifying key expansion in the 256-bit
      case by generating an extra round key.
    */
    }
    mbedtls_aes_context;

#else /* MBEDTLS_AES_ALT /
#include “aes_alt.h”
#endif /
MBEDTLS_AES_ALT */

/**

  • \brief This function initializes the specified AES context.
  •             It must be the first API called before using
    
  •             the context.
    
  • \param ctx The AES context to initialize. This must not be \c NULL.
    */
    void mbedtls_aes_init( mbedtls_aes_context *ctx );

/**

  • \brief This function releases and clears the specified AES context.
  • \param ctx The AES context to clear.
  •             If this is \c NULL, this function does nothing.
    
  •             Otherwise, the context must have been at least initialized.
    

*/
void mbedtls_aes_free( mbedtls_aes_context *ctx );

/**

  • \brief This function sets the encryption key.
  • \param ctx The AES context to which the key should be bound.
  •             It must be initialized.
    
  • \param key The encryption key.
  •             This must be a readable buffer of size \p keybits bits.
    
  • \param keybits The size of data passed in bits. Valid options are:
  •             <ul><li>128 bits</li>
    
  •             <li>192 bits</li>
    
  •             <li>256 bits</li></ul>
    
  • \return \c 0 on success.
  • \return #MBEDTLS_ERR_AES_INVALID_KEY_LENGTH on failure.
    */
    int mbedtls_aes_setkey_enc( mbedtls_aes_context *ctx, const unsigned char *key,
    unsigned int keybits );

/**

  • \brief This function sets the decryption key.
  • \param ctx The AES context to which the key should be bound.
  •             It must be initialized.
    
  • \param key The decryption key.
  •             This must be a readable buffer of size \p keybits bits.
    
  • \param keybits The size of data passed. Valid options are:
  •             <ul><li>128 bits</li>
    
  •             <li>192 bits</li>
    
  •             <li>256 bits</li></ul>
    
  • \return \c 0 on success.
  • \return #MBEDTLS_ERR_AES_INVALID_KEY_LENGTH on failure.
    */
    int mbedtls_aes_setkey_dec( mbedtls_aes_context *ctx, const unsigned char *key,
    unsigned int keybits );

/**

  • \brief This function performs an AES single-block encryption or

  •             decryption operation.
    
  •             It performs the operation defined in the \p mode parameter
    
  •             (encrypt or decrypt), on the input data buffer defined in
    
  •             the \p input parameter.
    
  •             mbedtls_aes_init(), and either mbedtls_aes_setkey_enc() or
    
  •             mbedtls_aes_setkey_dec() must be called before the first
    
  •             call to this API with the same context.
    
  • \param ctx The AES context to use for encryption or decryption.

  •             It must be initialized and bound to a key.
    
  • \param mode The AES operation: #MBEDTLS_AES_ENCRYPT or

  •             #MBEDTLS_AES_DECRYPT.
    
  • \param input The buffer holding the input data.

  •             It must be readable and at least \c 16 Bytes long.
    
  • \param output The buffer where the output data will be written.

  •             It must be writeable and at least \c 16 Bytes long.
    
  • \return \c 0 on success.
    */
    int mbedtls_aes_crypt_ecb( mbedtls_aes_context *ctx,
    int mode,
    const unsigned char input[16],
    unsigned char output[16] );

/**

  • \brief Internal AES block encryption function. This is only
  •              exposed to allow overriding it using
    
  •              \c MBEDTLS_AES_ENCRYPT_ALT.
    
  • \param ctx The AES context to use for encryption.
  • \param input The plaintext block.
  • \param output The output (ciphertext) block.
  • \return \c 0 on success.
    */
    int mbedtls_internal_aes_encrypt( mbedtls_aes_context *ctx,
    const unsigned char input[16],
    unsigned char output[16] );

/**

  • \brief Internal AES block decryption function. This is only
  •              exposed to allow overriding it using see
    
  •              \c MBEDTLS_AES_DECRYPT_ALT.
    
  • \param ctx The AES context to use for decryption.
  • \param input The ciphertext block.
  • \param output The output (plaintext) block.
  • \return \c 0 on success.
    */
    int mbedtls_internal_aes_decrypt( mbedtls_aes_context *ctx,
    const unsigned char input[16],
    unsigned char output[16] );

#if !defined(MBEDTLS_DEPRECATED_REMOVED)
#if defined(MBEDTLS_DEPRECATED_WARNING)
#define MBEDTLS_DEPRECATED attribute((deprecated))
#else
#define MBEDTLS_DEPRECATED
#endif
/**

  • \brief Deprecated internal AES block encryption function
  •              without return value.
    
  • \deprecated Superseded by mbedtls_internal_aes_encrypt()
  • \param ctx The AES context to use for encryption.
  • \param input Plaintext block.
  • \param output Output (ciphertext) block.
    */
    MBEDTLS_DEPRECATED void mbedtls_aes_encrypt( mbedt
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值