1/***********************************************************************
2*                                                                      *
3*               This software is part of the ast package               *
4*          Copyright (c) 1996-2011 AT&T Intellectual Property          *
5*                      and is licensed under the                       *
6*                 Eclipse Public License, Version 1.0                  *
7*                    by AT&T Intellectual Property                     *
8*                                                                      *
9*                A copy of the License is available at                 *
10*          http://www.eclipse.org/org/documents/epl-v10.html           *
11*         (with md5 checksum b35adb5213ca9657e911e9befb180842)         *
12*                                                                      *
13*              Information and Software Systems Research               *
14*                            AT&T Research                             *
15*                           Florham Park NJ                            *
16*                                                                      *
17*                 Glenn Fowler <gsf@research.att.com>                  *
18*                                                                      *
19***********************************************************************/
20#pragma prototyped
21
22/*
23 * sum(3) wrapper for solaris -lmd message digest library
24 */
25
26typedef void (*Lmd_init_f)(void*);
27typedef void (*Lmd_update_f)(void*, const void*, size_t);
28typedef void (*Lmd_final_f)(unsigned char*, void*);
29
30#define	_SUM_LMD_	\
31	_SUM_PUBLIC_	\
32	_SUM_PRIVATE_	\
33	Lmd_init_f	initf; \
34	Lmd_update_f	updatef; \
35	Lmd_final_f	finalf; \
36	unsigned int	datasize; \
37	unsigned char	total[64]; \
38	unsigned char	data[64];
39
40typedef struct Lmd_s
41{
42	_SUM_LMD_
43	struct
44	{
45	uintmax_t	context;
46	}		context;
47} Lmd_t;
48
49static int
50lmd_init(Sum_t* p)
51{
52	Lmd_t*	lmd = (Lmd_t*)p;
53
54	(*lmd->initf)(&lmd->context);
55	return 0;
56}
57
58static int
59lmd_block(Sum_t* p, const void* s, size_t n)
60{
61	Lmd_t*	lmd = (Lmd_t*)p;
62
63	(*lmd->updatef)(&lmd->context, s, n);
64	return 0;
65}
66
67static int
68lmd_done(Sum_t* p)
69{
70	register Lmd_t*	lmd = (Lmd_t*)p;
71	register int	i;
72
73	(*lmd->finalf)(lmd->data, &lmd->context);
74	for (i = 0; i < lmd->datasize; i++)
75		lmd->total[i] ^= lmd->data[i];
76	return 0;
77}
78
79static int
80lmd_print(Sum_t* p, Sfio_t* sp, register int flags, size_t scale)
81{
82	register Lmd_t*		lmd = (Lmd_t*)p;
83	register unsigned char*	d;
84	register int		i;
85
86	d = (flags & SUM_TOTAL) ? lmd->total : lmd->data;
87	for (i = 0; i < lmd->datasize; i++)
88		sfprintf(sp, "%02x", d[i]);
89	return 0;
90}
91
92static int
93lmd_data(Sum_t* p, Sumdata_t* data)
94{
95	Lmd_t*		lmd = (Lmd_t*)p;
96
97	data->size = lmd->datasize;
98	data->num = 0;
99	data->buf = lmd->data;
100	return 0;
101}
102
103#if _lib_MD4Init && _hdr_md4
104
105#include <md4.h>
106
107#define md4_description "RFC1320 MD4 message digest. Cryptographically weak. The block count is not printed."
108#define md4_options	"[+(version)?md4 (solaris -lmd) 2005-07-26]"
109#define md4_match	"md4|MD4"
110#define md4_scale	0
111#define md4_init	lmd_init
112#define md4_block	lmd_block
113#define md4_done	lmd_done
114#define md4_print	lmd_print
115#define md4_data	lmd_data
116
117typedef struct Md4_s
118{
119	_SUM_LMD_
120	MD4_CTX		context;
121} Md4_t;
122
123static Sum_t*
124md4_open(const Method_t* method, const char* name)
125{
126	Md4_t*	lmd;
127
128	if (lmd = newof(0, Md4_t, 1, 0))
129	{
130		lmd->method = (Method_t*)method;
131		lmd->name = name;
132		lmd->datasize = 16;
133		lmd->initf = (Lmd_init_f)MD4Init;
134		lmd->updatef = (Lmd_update_f)MD4Update;
135		lmd->finalf = (Lmd_final_f)MD4Final;
136		md4_init((Sum_t*)lmd);
137	}
138	return (Sum_t*)lmd;
139}
140
141#endif
142
143#if _lib_MD5Init && _hdr_md5
144
145#include <md5.h>
146
147#define md5_description	"RFC1321 MD5 message digest. Cryptographically weak. The block count is not printed."
148#define md5_options	"[+(version)?md5 (solaris -lmd) 2005-07-26]"
149#define md5_match	"md5|MD5"
150#define md5_scale	0
151#define md5_init	lmd_init
152#define md5_block	lmd_block
153#define md5_done	lmd_done
154#define md5_print	lmd_print
155#define md5_data	lmd_data
156
157typedef struct Md5_s
158{
159	_SUM_LMD_
160	MD5_CTX		context;
161} Md5_t;
162
163static Sum_t*
164md5_open(const Method_t* method, const char* name)
165{
166	Md5_t*	lmd;
167
168	if (lmd = newof(0, Md5_t, 1, 0))
169	{
170		lmd->method = (Method_t*)method;
171		lmd->name = name;
172		lmd->datasize = 16;
173		lmd->initf = (Lmd_init_f)MD5Init;
174		lmd->updatef = (Lmd_update_f)MD5Update;
175		lmd->finalf = (Lmd_final_f)MD5Final;
176		md5_init((Sum_t*)lmd);
177	}
178	return (Sum_t*)lmd;
179}
180
181#endif
182
183#if _lib_SHA1Init && _hdr_sha1
184
185#include <sha1.h>
186
187#define sha1_description "RFC3174 / FIPS 180-1 SHA-1 secure hash algorithm 1. Cryptographically weak. The block count is not printed."
188#define sha1_options	"[+(version)?sha1 (solaris -lmd) 2005-07-26]"
189#define sha1_match	"sha1|SHA1|sha-1|SHA-1"
190#define sha1_scale	0
191#define sha1_init	lmd_init
192#define sha1_block	lmd_block
193#define sha1_done	lmd_done
194#define sha1_print	lmd_print
195#define sha1_data	lmd_data
196
197typedef struct Sha1_s
198{
199	_SUM_LMD_
200	SHA1_CTX	context;
201	unsigned char	pad[1024];	/* XXX: who's bug is it? */
202} Sha1_t;
203
204static Sum_t*
205sha1_open(const Method_t* method, const char* name)
206{
207	Sha1_t*	lmd;
208
209	if (lmd = newof(0, Sha1_t, 1, 0))
210	{
211		lmd->method = (Method_t*)method;
212		lmd->name = name;
213		lmd->datasize = 20;
214		lmd->initf = (Lmd_init_f)SHA1Init;
215		lmd->updatef = (Lmd_update_f)SHA1Update;
216		lmd->finalf = (Lmd_final_f)SHA1Final;
217		sha1_init((Sum_t*)lmd);
218	}
219	return (Sum_t*)lmd;
220}
221
222#endif
223
224#if _lib_SHA2Init && _hdr_sha2
225
226#include <sha2.h>
227
228#define sha256_description "FIPS 180-2 SHA256 secure hash algorithm.  The block count is not printed."
229#define sha256_options	"[+(version)?sha256 (solaris -lmd) 2005-07-26]"
230#define sha256_match	"sha256|sha-256|SHA256|SHA-256"
231#define sha256_scale	0
232#define sha256_init	lmd_init
233#define sha256_block	lmd_block
234#define sha256_done	lmd_done
235#define sha256_print	lmd_print
236#define sha256_data	lmd_data
237
238typedef struct Sha256_s
239{
240	_SUM_LMD_
241	SHA256_CTX	context;
242} Sha256_t;
243
244static Sum_t*
245sha256_open(const Method_t* method, const char* name)
246{
247	Sha256_t*	lmd;
248
249	if (lmd = newof(0, Sha256_t, 1, 0))
250	{
251		lmd->method = (Method_t*)method;
252		lmd->name = name;
253		lmd->datasize = 32;
254		lmd->initf = (Lmd_init_f)SHA256Init;
255		lmd->updatef = (Lmd_update_f)SHA256Update;
256		lmd->finalf = (Lmd_final_f)SHA256Final;
257		sha256_init((Sum_t*)lmd);
258	}
259	return (Sum_t*)lmd;
260}
261
262#define sha384_description "FIPS 180-2 SHA384 secure hash algorithm.  The block count is not printed."
263#define sha384_options	"[+(version)?sha384 (solaris -lmd) 2005-07-26]"
264#define sha384_match	"sha384|sha-384|SHA384|SHA-384"
265#define sha384_scale	0
266#define sha384_init	lmd_init
267#define sha384_block	lmd_block
268#define sha384_done	lmd_done
269#define sha384_print	lmd_print
270#define sha384_data	lmd_data
271
272typedef struct Sha384_s
273{
274	_SUM_LMD_
275	SHA384_CTX	context;
276} Sha384_t;
277
278static Sum_t*
279sha384_open(const Method_t* method, const char* name)
280{
281	Sha384_t*	lmd;
282
283	if (lmd = newof(0, Sha384_t, 1, 0))
284	{
285		lmd->method = (Method_t*)method;
286		lmd->name = name;
287		lmd->datasize = 48;
288		lmd->initf = (Lmd_init_f)SHA384Init;
289		lmd->updatef = (Lmd_update_f)SHA384Update;
290		lmd->finalf = (Lmd_final_f)SHA384Final;
291		sha384_init((Sum_t*)lmd);
292	}
293	return (Sum_t*)lmd;
294}
295
296#define sha512_description "FIPS 180-2 SHA512 secure hash algorithm.  The block count is not printed."
297#define sha512_options	"[+(version)?sha512 (solaris -lmd) 2005-07-26]"
298#define sha512_match	"sha512|sha-512|SHA512|SHA-512"
299#define sha512_scale	0
300#define sha512_init	lmd_init
301#define sha512_block	lmd_block
302#define sha512_done	lmd_done
303#define sha512_print	lmd_print
304#define sha512_data	lmd_data
305
306typedef struct Sha512_s
307{
308	_SUM_LMD_
309	SHA512_CTX	context;
310} Sha512_t;
311
312static Sum_t*
313sha512_open(const Method_t* method, const char* name)
314{
315	Sha512_t*	lmd;
316
317	if (lmd = newof(0, Sha512_t, 1, 0))
318	{
319		lmd->method = (Method_t*)method;
320		lmd->name = name;
321		lmd->datasize = 64;
322		lmd->initf = (Lmd_init_f)SHA512Init;
323		lmd->updatef = (Lmd_update_f)SHA512Update;
324		lmd->finalf = (Lmd_final_f)SHA512Final;
325		sha512_init((Sum_t*)lmd);
326	}
327	return (Sum_t*)lmd;
328}
329
330#endif
331