1 /*
2  * haval.c --
3  *
4  *	Implements and registers message digest generator HAVAL.
5  *
6  *
7  * Copyright (c) 1996 Andreas Kupries (andreas_kupries@users.sourceforge.net)
8  * All rights reserved.
9  *
10  * Permission is hereby granted, without written agreement and without
11  * license or royalty fees, to use, copy, modify, and distribute this
12  * software and its documentation for any purpose, provided that the
13  * above copyright notice and the following two paragraphs appear in
14  * all copies of this software.
15  *
16  * IN NO EVENT SHALL I LIABLE TO ANY PARTY FOR DIRECT, INDIRECT, SPECIAL,
17  * INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OF THIS
18  * SOFTWARE AND ITS DOCUMENTATION, EVEN IF I HAVE BEEN ADVISED OF THE
19  * POSSIBILITY OF SUCH DAMAGE.
20  *
21  * I SPECIFICALLY DISCLAIM ANY WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
22  * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
23  * PURPOSE.  THE SOFTWARE PROVIDED HEREUNDER IS ON AN "AS IS" BASIS, AND
24  * I HAVE NO OBLIGATION TO PROVIDE MAINTENANCE, SUPPORT, UPDATES,
25  * ENHANCEMENTS, OR MODIFICATIONS.
26  *
27  * CVS: $Id: haval.c,v 1.4 2000/08/09 19:13:17 aku Exp $
28  */
29 
30 #include "transformInt.h"
31 #include "haval.1996/haval.h"
32 
33 /*
34  * Generator description
35  * ---------------------
36  *
37  * The HAVAL alogrithm is used to compute a cryptographically strong
38  * message digest.
39  */
40 
41 #define DIGEST_SIZE               (32)
42 #define CTX_TYPE                  haval_state
43 
44 /*
45  * Declarations of internal procedures.
46  */
47 
48 static void MDHaval_Start     _ANSI_ARGS_ ((VOID* context));
49 static void MDHaval_Update    _ANSI_ARGS_ ((VOID* context, unsigned int character));
50 static void MDHaval_UpdateBuf _ANSI_ARGS_ ((VOID* context, unsigned char* buffer, size_t bufLen));
51 static void MDHaval_Final     _ANSI_ARGS_ ((VOID* digest, VOID* context));
52 
53 /*
54  * Generator definition.
55  */
56 
57 static Trf_MessageDigestDescription mdDescription = { /* THREADING: constant, read-only => safe */
58   "haval",
59   sizeof (CTX_TYPE),
60   DIGEST_SIZE,
61   MDHaval_Start,
62   MDHaval_Update,
63   MDHaval_UpdateBuf,
64   MDHaval_Final,
65   NULL
66 };
67 
68 /*
69  *------------------------------------------------------*
70  *
71  *	TrfInit_HAVAL --
72  *
73  *	------------------------------------------------*
74  *	Register the generator implemented in this file.
75  *	------------------------------------------------*
76  *
77  *	Sideeffects:
78  *		As of 'Trf_Register'.
79  *
80  *	Result:
81  *		A standard Tcl error code.
82  *
83  *------------------------------------------------------*
84  */
85 
86 int
TrfInit_HAVAL(interp)87 TrfInit_HAVAL (interp)
88 Tcl_Interp* interp;
89 {
90   return Trf_RegisterMessageDigest (interp, &mdDescription);
91 }
92 
93 /*
94  *------------------------------------------------------*
95  *
96  *	MDHaval_Start --
97  *
98  *	------------------------------------------------*
99  *	Initialize the internal state of the message
100  *	digest generator.
101  *	------------------------------------------------*
102  *
103  *	Sideeffects:
104  *		As of the called procedure.
105  *
106  *	Result:
107  *		None.
108  *
109  *------------------------------------------------------*
110  */
111 
112 static void
MDHaval_Start(context)113 MDHaval_Start (context)
114 VOID* context;
115 {
116   haval_start ((CTX_TYPE*) context);
117 }
118 
119 /*
120  *------------------------------------------------------*
121  *
122  *	MDHaval_Update --
123  *
124  *	------------------------------------------------*
125  *	Update the internal state of the message digest
126  *	generator for a single character.
127  *	------------------------------------------------*
128  *
129  *	Sideeffects:
130  *		As of the called procedure.
131  *
132  *	Result:
133  *		None.
134  *
135  *------------------------------------------------------*
136  */
137 
138 static void
MDHaval_Update(context,character)139 MDHaval_Update (context, character)
140 VOID* context;
141 unsigned int   character;
142 {
143   unsigned char buf = character;
144 
145   haval_hash ((CTX_TYPE*) context, &buf, 1);
146 }
147 
148 /*
149  *------------------------------------------------------*
150  *
151  *	MDHaval_UpdateBuf --
152  *
153  *	------------------------------------------------*
154  *	Update the internal state of the message digest
155  *	generator for a character buffer.
156  *	------------------------------------------------*
157  *
158  *	Sideeffects:
159  *		As of the called procedure.
160  *
161  *	Result:
162  *		None.
163  *
164  *------------------------------------------------------*
165  */
166 
167 static void
MDHaval_UpdateBuf(context,buffer,bufLen)168 MDHaval_UpdateBuf (context, buffer, bufLen)
169 VOID* context;
170 unsigned char* buffer;
171 size_t   bufLen;
172 {
173   haval_hash ((CTX_TYPE*) context, (unsigned char*) buffer, bufLen);
174 }
175 
176 /*
177  *------------------------------------------------------*
178  *
179  *	MDHaval_Final --
180  *
181  *	------------------------------------------------*
182  *	Generate the digest from the internal state of
183  *	the message digest generator.
184  *	------------------------------------------------*
185  *
186  *	Sideeffects:
187  *		As of the called procedure.
188  *
189  *	Result:
190  *		None.
191  *
192  *------------------------------------------------------*
193  */
194 
195 static void
MDHaval_Final(digest,context)196 MDHaval_Final (digest, context)
197 VOID* context;
198 VOID* digest;
199 {
200   haval_end ((CTX_TYPE*) context, (unsigned char*) digest);
201 }
202 
203 /*
204  * External code from here on.
205  */
206 
207 #include "haval.1996/haval.c" /* THREADING: import of one constant var, read-only => safe */
208