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