1 /*=========================================================================== 2 * 3 * PUBLIC DOMAIN NOTICE 4 * National Center for Biotechnology Information 5 * 6 * This software/database is a "United States Government Work" under the 7 * terms of the United States Copyright Act. It was written as part of 8 * the author's official duties as a United States Government employee and 9 * thus cannot be copyrighted. This software/database is freely available 10 * to the public for use. The National Library of Medicine and the U.S. 11 * Government have not placed any restriction on its use or reproduction. 12 * 13 * Although all reasonable efforts have been taken to ensure the accuracy 14 * and reliability of the software and data, the NLM and the U.S. 15 * Government do not and cannot warrant the performance or results that 16 * may be obtained by using this software or data. The NLM and the U.S. 17 * Government disclaim all warranties, express or implied, including 18 * warranties of performance, merchantability or fitness for any particular 19 * purpose. 20 * 21 * Please cite the author in any work or product based on this material. 22 * 23 * =========================================================================== 24 * 25 */ 26 27 #ifndef _h_klib_checksum_ 28 #define _h_klib_checksum_ 29 30 #ifndef _h_klib_extern_ 31 #include <klib/extern.h> 32 #endif 33 34 #ifndef _h_klib_defs_ 35 #include <klib/defs.h> 36 #endif 37 38 #ifdef __cplusplus 39 extern "C" { 40 #endif 41 42 43 /*-------------------------------------------------------------------------- 44 * CRC32 45 */ 46 47 /* CRC32Init 48 * initializes table 49 * IDEMPOTENT 50 */ 51 KLIB_EXTERN void CC CRC32Init ( void ); 52 53 /* CRC32 54 * runs checksum on arbitrary data, returning result 55 * initial checksum to be passed in is 0 56 * subsequent checksums should be return from prior invocation 57 */ 58 KLIB_EXTERN uint32_t CC CRC32 ( uint32_t checksum, const void *data, size_t size ); 59 60 61 /*-------------------------------------------------------------------------- 62 * MD5 63 * taken from Peter Deutsch's sources due to simplicity 64 */ 65 typedef struct MD5State MD5State; 66 struct MD5State 67 { 68 uint32_t count [ 2 ]; 69 uint32_t abcd [ 4 ]; 70 uint8_t buf [ 64 ]; 71 }; 72 73 /* Init 74 * initialize the algorithm and state block 75 */ 76 KLIB_EXTERN void CC MD5StateInit ( MD5State *md5 ); 77 78 /* Append 79 * run MD5 on data block 80 * accumulate results into "md5" 81 * processes data in chunks 82 */ 83 KLIB_EXTERN void CC MD5StateAppend ( MD5State *md5, const void *data, size_t size ); 84 85 /* Finish 86 * processes any remaining data in "md5" 87 * returns 16 bytes of digest 88 */ 89 KLIB_EXTERN void CC MD5StateFinish ( MD5State *md5, uint8_t digest [ 16 ] ); 90 91 92 /*-------------------------------------------------------------------------- 93 * SHA 94 */ 95 typedef struct SHA32bitState SHA1State, SHA256State; 96 struct SHA32bitState 97 { 98 uint64_t len; 99 uint32_t H [ 8 ]; 100 uint32_t cur; 101 uint8_t W [ 64 ]; 102 }; 103 104 typedef struct SHA64bitState SHA384State, SHA512State; 105 struct SHA64bitState 106 { 107 uint64_t len; 108 uint64_t H [ 8 ]; 109 unsigned long cur; 110 uint8_t W [ 128 ]; 111 }; 112 113 114 /* Init 115 * initialize the algorithm and state block 116 */ 117 KLIB_EXTERN void CC SHA1StateInit ( SHA1State *state ); 118 KLIB_EXTERN void CC SHA256StateInit ( SHA256State *state ); 119 KLIB_EXTERN void CC SHA384StateInit ( SHA384State *state ); 120 KLIB_EXTERN void CC SHA512StateInit ( SHA512State *state ); 121 122 123 /* Append 124 * run SHA-x on data block 125 * accumulate results into "state" 126 * processes data in chunks 127 */ 128 KLIB_EXTERN void CC SHA1StateAppend ( SHA1State *state, const void *data, size_t size ); 129 KLIB_EXTERN void CC SHA256StateAppend ( SHA256State *state, const void *data, size_t size ); 130 KLIB_EXTERN void CC SHA384StateAppend ( SHA384State *state, const void *data, size_t size ); 131 KLIB_EXTERN void CC SHA512StateAppend ( SHA512State *state, const void *data, size_t size ); 132 133 134 /* Finish 135 * processes any remaining data in "state" 136 * returns N bytes of digest 137 * N = 20 for SHA-1 138 * N = 32 for SHA-256 139 * N = 48 for SHA-384 140 * N = 64 for SHA-512 141 */ 142 KLIB_EXTERN void CC SHA1StateFinish ( SHA1State *state, uint8_t digest [ 20 ] ); 143 KLIB_EXTERN void CC SHA256StateFinish ( SHA256State *state, uint8_t digest [ 32 ] ); 144 KLIB_EXTERN void CC SHA384StateFinish ( SHA384State *state, uint8_t digest [ 48 ] ); 145 KLIB_EXTERN void CC SHA512StateFinish ( SHA512State *state, uint8_t digest [ 64 ] ); 146 147 148 #ifdef __cplusplus 149 } 150 #endif 151 152 #endif /* _h_klib_checksum_ */ 153