C学习 - SHA256算法的实现

1. Sha2.h/** * \file sha2.h * * \brief SHA-224 and SHA-256 cryptographic hash function * * Copyright (C) 2006-2010, Brainspark B.V. * * This file is part of PolarSSL (http://www.polars...
摘要由CSDN通过智能技术生成

1. Sha2.h

/** 
 * \file sha2.h 
 * 
 * \brief SHA-224 and SHA-256 cryptographic hash function 
 * 
 *  Copyright (C) 2006-2010, Brainspark B.V. 
 * 
 *  This file is part of PolarSSL (http://www.polarssl.org) 
 *  Lead Maintainer: Paul Bakker <polarssl_maintainer at polarssl.org> 
 * 
 *  All rights reserved. 
 * 
 *  This program is free software; you can redistribute it and/or modify 
 *  it under the terms of the GNU General Public License as published by 
 *  the Free Software Foundation; either version 2 of the License, or 
 *  (at your option) any later version. 
 * 
 *  This program is distributed in the hope that it will be useful, 
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of 
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the 
 *  GNU General Public License for more details. 
 * 
 *  You should have received a copy of the GNU General Public License along 
 *  with this program; if not, write to the Free Software Foundation, Inc., 
 *  51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. 
 */

#ifndef SHA2_H
#define SHA2_H

#include <string.h>

#ifdef _MSC_VER
#include <basetsd.h>
typedef UINT32 uint32_t;
#else
#include <inttypes.h>
#endif

#define ERR_SHA2_FILE_IO_ERROR                -0x0078  /**< Read/write error in file. */

/** 
 * \brief          SHA-256 context structure 
 */
typedef struct
{
    uint32_t total[2];          /*!< number of bytes processed  */
    uint32_t state[8];          /*!< intermediate digest state  */
    unsigned char buffer[64];   /*!< data block being processed */

    unsigned char ipad[64];     /*!< HMAC: inner padding        */
    unsigned char opad[64];     /*!< HMAC: outer padding        */
    int is224;                  /*!< 0 => SHA-256, else SHA-224 */
}
sha2_context;

#ifdef __cplusplus
extern "C" {
#endif

/**
 * \brief          SHA-256 context setup 
 * 
 * \param ctx      context to be initialized 
 * \param is224    0 = use SHA256, 1 = use SHA224 
 */
 void sha2_starts( sha2_context *ctx, int is224 );

/** 
 * \brief          SHA-256 process buffer 
 * 
 * \param ctx      SHA-256 context 
 * \param input    buffer holding the  data 
 * \param ilen     length of the input data 
 */
void sha2_update( sha2_context *ctx, const unsigned char *input, size_t ilen );

/** 
 * \brief          SHA-256 final digest 
 * 
 * \param ctx      SHA-256 context 
 * \param output   SHA-224/256 checksum result 
 */
void sha2_finish( sha2_context *ctx, unsigned char output[32] );

/** 
 * \brief          Output = SHA-256( input buffer ) 
 * 
 * \param input    buffer holding the  data 
 * \param ilen     length of the input data 
 * \param output   SHA-224/256 checksum result 
 * \param is224    0 = use SHA256, 1 = use SHA224 
 */
void sha2( const unsigned char *input, size_t ilen,
           unsigned char output[32], int is224 );

/**
 * \brief          Output = SHA-256( file contents ) 
 * 
 * \param path     input file name 
 * \param output   SHA-224/256 checksum result 
 * \param is224    0 = use SHA256, 1 = use SHA224 
 * 
 * \return         0 if successful, or POLARSSL_ERR_SHA2_FILE_IO_ERROR 
 */
int sha2_file( const char *path, unsigned char output[32], int is224 );

/** 
 * \brief          SHA-256 HMAC context setup 
 * 
 * \param ctx      HMAC context to be initialized 
 * \param key      HMAC secret key 
 * \param keylen   length of the HMAC key 
 * \param is224    0 = use SHA256, 1 = use SHA224 
 */
void sha2_hmac_starts( sha2_context *ctx, const unsigned char *key, size_t keylen,
                       int is224 );

/** 
 * \brief          SHA-256 HMAC process buffer 
 * 
 * \param ctx      HMAC context 
 * \param input    buffer holding the  data 
 * \param ilen     length of the input data 
 */
void sha2_hmac_update( sha2_context *ctx, const unsigned char *input, size_t ilen );

/** 
 * \brief          SHA-256 HMAC final digest 
 * 
 * \param ctx      HMAC context 
 * \param output   SHA-224/256 HMAC checksum result 
 */
void sha2_hmac_finish( sha2_context *ctx, unsigned char output[32] );

/** 
 * \brief          SHA-256 HMAC context reset 
 * 
 * \param ctx      HMAC context to be reset 
 */
void sha2_hmac_reset( sha2_context *ctx );

/** 
 * \brief          Output = HMAC-SHA-256( hmac key, input buffer ) 
 * 
 * \param key      HMAC secret key 
 * \param keylen   length of the HMAC key 
 * \param input    buffer holding the  data 
 * \param ilen     length of the input data 
 * \param output   HMAC-SHA-224/256 result 
 * \param is224    0 = use SHA256, 1 = use SHA224 */
void sha2_hmac( const unsigned char *key, size_t keylen,
                const unsigned char *input, size_t ilen,
                unsigned char output[32], int is224 );

/** 
 * \brief          Checkup routine 
 * 
 * \return         0 if successful, or 1 if the test failed 
 */
int sha2_self_test( int verbose );

/* Internal use */
void sha2_process( sha2_context *ctx, const unsigned char data[64] );

#ifdef __cplusplus
}
#endif

#endif /* sha2.h */

2. Sha2.c

/* 
 *  FIPS-180-2 compliant SHA-256 implementation 
 * 
 *  Copyright (C) 2006-2010, Brainspark B.V. 
 * 
 *  This file is part of PolarSSL (http://www.polarssl.org) 
 *  Lead Maintainer: Paul Bakker <polarssl_maintainer at polarssl.org> 
 * 
 *  All rights reserved. 
 * 
 *  This program is free software; you can redistribute it and/or modify 
 *  it under the terms of the GNU General Public License as published by 
 *  the Free Software Foundation; either version 2 of the Li
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值