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