xref: /onnv-gate/usr/src/lib/libsum/common/sum-lmd.c (revision 12068:08a39a083754)
18462SApril.Chin@Sun.COM /***********************************************************************
28462SApril.Chin@Sun.COM *                                                                      *
38462SApril.Chin@Sun.COM *               This software is part of the ast package               *
4*12068SRoger.Faulkner@Oracle.COM *          Copyright (c) 1996-2010 AT&T Intellectual Property          *
58462SApril.Chin@Sun.COM *                      and is licensed under the                       *
68462SApril.Chin@Sun.COM *                  Common Public License, Version 1.0                  *
78462SApril.Chin@Sun.COM *                    by AT&T Intellectual Property                     *
88462SApril.Chin@Sun.COM *                                                                      *
98462SApril.Chin@Sun.COM *                A copy of the License is available at                 *
108462SApril.Chin@Sun.COM *            http://www.opensource.org/licenses/cpl1.0.txt             *
118462SApril.Chin@Sun.COM *         (with md5 checksum 059e8cd6165cb4c31e351f2b69388fd9)         *
128462SApril.Chin@Sun.COM *                                                                      *
138462SApril.Chin@Sun.COM *              Information and Software Systems Research               *
148462SApril.Chin@Sun.COM *                            AT&T Research                             *
158462SApril.Chin@Sun.COM *                           Florham Park NJ                            *
168462SApril.Chin@Sun.COM *                                                                      *
178462SApril.Chin@Sun.COM *                 Glenn Fowler <gsf@research.att.com>                  *
188462SApril.Chin@Sun.COM *                                                                      *
198462SApril.Chin@Sun.COM ***********************************************************************/
208462SApril.Chin@Sun.COM #pragma prototyped
218462SApril.Chin@Sun.COM 
228462SApril.Chin@Sun.COM /*
238462SApril.Chin@Sun.COM  * sum(3) wrapper for solaris -lmd message digest library
248462SApril.Chin@Sun.COM  */
258462SApril.Chin@Sun.COM 
268462SApril.Chin@Sun.COM typedef void (*Lmd_init_f)(void*);
278462SApril.Chin@Sun.COM typedef void (*Lmd_update_f)(void*, const void*, size_t);
288462SApril.Chin@Sun.COM typedef void (*Lmd_final_f)(unsigned char*, void*);
298462SApril.Chin@Sun.COM 
308462SApril.Chin@Sun.COM #define	_SUM_LMD_	\
318462SApril.Chin@Sun.COM 	_SUM_PUBLIC_	\
328462SApril.Chin@Sun.COM 	_SUM_PRIVATE_	\
338462SApril.Chin@Sun.COM 	Lmd_init_f	initf; \
348462SApril.Chin@Sun.COM 	Lmd_update_f	updatef; \
358462SApril.Chin@Sun.COM 	Lmd_final_f	finalf; \
368462SApril.Chin@Sun.COM 	unsigned int	datasize; \
378462SApril.Chin@Sun.COM 	unsigned char	total[64]; \
388462SApril.Chin@Sun.COM 	unsigned char	data[64];
398462SApril.Chin@Sun.COM 
408462SApril.Chin@Sun.COM typedef struct Lmd_s
418462SApril.Chin@Sun.COM {
428462SApril.Chin@Sun.COM 	_SUM_LMD_
438462SApril.Chin@Sun.COM 	struct
448462SApril.Chin@Sun.COM 	{
458462SApril.Chin@Sun.COM 	uintmax_t	context;
468462SApril.Chin@Sun.COM 	}		context;
478462SApril.Chin@Sun.COM } Lmd_t;
488462SApril.Chin@Sun.COM 
498462SApril.Chin@Sun.COM static int
lmd_init(Sum_t * p)508462SApril.Chin@Sun.COM lmd_init(Sum_t* p)
518462SApril.Chin@Sun.COM {
528462SApril.Chin@Sun.COM 	Lmd_t*	lmd = (Lmd_t*)p;
538462SApril.Chin@Sun.COM 
548462SApril.Chin@Sun.COM 	(*lmd->initf)(&lmd->context);
558462SApril.Chin@Sun.COM 	return 0;
568462SApril.Chin@Sun.COM }
578462SApril.Chin@Sun.COM 
588462SApril.Chin@Sun.COM static int
lmd_block(Sum_t * p,const void * s,size_t n)598462SApril.Chin@Sun.COM lmd_block(Sum_t* p, const void* s, size_t n)
608462SApril.Chin@Sun.COM {
618462SApril.Chin@Sun.COM 	Lmd_t*	lmd = (Lmd_t*)p;
628462SApril.Chin@Sun.COM 
638462SApril.Chin@Sun.COM 	(*lmd->updatef)(&lmd->context, s, n);
648462SApril.Chin@Sun.COM 	return 0;
658462SApril.Chin@Sun.COM }
668462SApril.Chin@Sun.COM 
678462SApril.Chin@Sun.COM static int
lmd_done(Sum_t * p)688462SApril.Chin@Sun.COM lmd_done(Sum_t* p)
698462SApril.Chin@Sun.COM {
708462SApril.Chin@Sun.COM 	register Lmd_t*	lmd = (Lmd_t*)p;
718462SApril.Chin@Sun.COM 	register int	i;
728462SApril.Chin@Sun.COM 
738462SApril.Chin@Sun.COM 	(*lmd->finalf)(lmd->data, &lmd->context);
748462SApril.Chin@Sun.COM 	for (i = 0; i < lmd->datasize; i++)
758462SApril.Chin@Sun.COM 		lmd->total[i] ^= lmd->data[i];
768462SApril.Chin@Sun.COM 	return 0;
778462SApril.Chin@Sun.COM }
788462SApril.Chin@Sun.COM 
798462SApril.Chin@Sun.COM static int
lmd_print(Sum_t * p,Sfio_t * sp,register int flags,size_t scale)808462SApril.Chin@Sun.COM lmd_print(Sum_t* p, Sfio_t* sp, register int flags, size_t scale)
818462SApril.Chin@Sun.COM {
828462SApril.Chin@Sun.COM 	register Lmd_t*		lmd = (Lmd_t*)p;
838462SApril.Chin@Sun.COM 	register unsigned char*	d;
848462SApril.Chin@Sun.COM 	register int		i;
858462SApril.Chin@Sun.COM 
868462SApril.Chin@Sun.COM 	d = (flags & SUM_TOTAL) ? lmd->total : lmd->data;
878462SApril.Chin@Sun.COM 	for (i = 0; i < lmd->datasize; i++)
888462SApril.Chin@Sun.COM 		sfprintf(sp, "%02x", d[i]);
898462SApril.Chin@Sun.COM 	return 0;
908462SApril.Chin@Sun.COM }
918462SApril.Chin@Sun.COM 
928462SApril.Chin@Sun.COM static int
lmd_data(Sum_t * p,Sumdata_t * data)938462SApril.Chin@Sun.COM lmd_data(Sum_t* p, Sumdata_t* data)
948462SApril.Chin@Sun.COM {
958462SApril.Chin@Sun.COM 	Lmd_t*		lmd = (Lmd_t*)p;
968462SApril.Chin@Sun.COM 
978462SApril.Chin@Sun.COM 	data->size = lmd->datasize;
988462SApril.Chin@Sun.COM 	data->num = 0;
998462SApril.Chin@Sun.COM 	data->buf = lmd->data;
1008462SApril.Chin@Sun.COM 	return 0;
1018462SApril.Chin@Sun.COM }
1028462SApril.Chin@Sun.COM 
1038462SApril.Chin@Sun.COM #if _lib_MD4Init && _hdr_md4
1048462SApril.Chin@Sun.COM 
1058462SApril.Chin@Sun.COM #include <md4.h>
1068462SApril.Chin@Sun.COM 
1078462SApril.Chin@Sun.COM #define md4_description "RFC1320 MD4 message digest. Cryptographically weak. The block count is not printed."
1088462SApril.Chin@Sun.COM #define md4_options	"[+(version)?md4 (solaris -lmd) 2005-07-26]"
1098462SApril.Chin@Sun.COM #define md4_match	"md4|MD4"
1108462SApril.Chin@Sun.COM #define md4_scale	0
1118462SApril.Chin@Sun.COM #define md4_init	lmd_init
1128462SApril.Chin@Sun.COM #define md4_block	lmd_block
1138462SApril.Chin@Sun.COM #define md4_done	lmd_done
1148462SApril.Chin@Sun.COM #define md4_print	lmd_print
1158462SApril.Chin@Sun.COM #define md4_data	lmd_data
1168462SApril.Chin@Sun.COM 
1178462SApril.Chin@Sun.COM typedef struct Md4_s
1188462SApril.Chin@Sun.COM {
1198462SApril.Chin@Sun.COM 	_SUM_LMD_
1208462SApril.Chin@Sun.COM 	MD4_CTX		context;
1218462SApril.Chin@Sun.COM } Md4_t;
1228462SApril.Chin@Sun.COM 
1238462SApril.Chin@Sun.COM static Sum_t*
md4_open(const Method_t * method,const char * name)1248462SApril.Chin@Sun.COM md4_open(const Method_t* method, const char* name)
1258462SApril.Chin@Sun.COM {
1268462SApril.Chin@Sun.COM 	Md4_t*	lmd;
1278462SApril.Chin@Sun.COM 
1288462SApril.Chin@Sun.COM 	if (lmd = newof(0, Md4_t, 1, 0))
1298462SApril.Chin@Sun.COM 	{
1308462SApril.Chin@Sun.COM 		lmd->method = (Method_t*)method;
1318462SApril.Chin@Sun.COM 		lmd->name = name;
1328462SApril.Chin@Sun.COM 		lmd->datasize = 16;
1338462SApril.Chin@Sun.COM 		lmd->initf = (Lmd_init_f)MD4Init;
1348462SApril.Chin@Sun.COM 		lmd->updatef = (Lmd_update_f)MD4Update;
1358462SApril.Chin@Sun.COM 		lmd->finalf = (Lmd_final_f)MD4Final;
1368462SApril.Chin@Sun.COM 		md4_init((Sum_t*)lmd);
1378462SApril.Chin@Sun.COM 	}
1388462SApril.Chin@Sun.COM 	return (Sum_t*)lmd;
1398462SApril.Chin@Sun.COM }
1408462SApril.Chin@Sun.COM 
1418462SApril.Chin@Sun.COM #endif
1428462SApril.Chin@Sun.COM 
1438462SApril.Chin@Sun.COM #if _lib_MD5Init && _hdr_md5
1448462SApril.Chin@Sun.COM 
1458462SApril.Chin@Sun.COM #include <md5.h>
1468462SApril.Chin@Sun.COM 
1478462SApril.Chin@Sun.COM #define md5_description	"RFC1321 MD5 message digest. Cryptographically weak. The block count is not printed."
1488462SApril.Chin@Sun.COM #define md5_options	"[+(version)?md5 (solaris -lmd) 2005-07-26]"
1498462SApril.Chin@Sun.COM #define md5_match	"md5|MD5"
1508462SApril.Chin@Sun.COM #define md5_scale	0
1518462SApril.Chin@Sun.COM #define md5_init	lmd_init
1528462SApril.Chin@Sun.COM #define md5_block	lmd_block
1538462SApril.Chin@Sun.COM #define md5_done	lmd_done
1548462SApril.Chin@Sun.COM #define md5_print	lmd_print
1558462SApril.Chin@Sun.COM #define md5_data	lmd_data
1568462SApril.Chin@Sun.COM 
1578462SApril.Chin@Sun.COM typedef struct Md5_s
1588462SApril.Chin@Sun.COM {
1598462SApril.Chin@Sun.COM 	_SUM_LMD_
1608462SApril.Chin@Sun.COM 	MD5_CTX		context;
1618462SApril.Chin@Sun.COM } Md5_t;
1628462SApril.Chin@Sun.COM 
1638462SApril.Chin@Sun.COM static Sum_t*
md5_open(const Method_t * method,const char * name)1648462SApril.Chin@Sun.COM md5_open(const Method_t* method, const char* name)
1658462SApril.Chin@Sun.COM {
1668462SApril.Chin@Sun.COM 	Md5_t*	lmd;
1678462SApril.Chin@Sun.COM 
1688462SApril.Chin@Sun.COM 	if (lmd = newof(0, Md5_t, 1, 0))
1698462SApril.Chin@Sun.COM 	{
1708462SApril.Chin@Sun.COM 		lmd->method = (Method_t*)method;
1718462SApril.Chin@Sun.COM 		lmd->name = name;
1728462SApril.Chin@Sun.COM 		lmd->datasize = 16;
1738462SApril.Chin@Sun.COM 		lmd->initf = (Lmd_init_f)MD5Init;
1748462SApril.Chin@Sun.COM 		lmd->updatef = (Lmd_update_f)MD5Update;
1758462SApril.Chin@Sun.COM 		lmd->finalf = (Lmd_final_f)MD5Final;
1768462SApril.Chin@Sun.COM 		md5_init((Sum_t*)lmd);
1778462SApril.Chin@Sun.COM 	}
1788462SApril.Chin@Sun.COM 	return (Sum_t*)lmd;
1798462SApril.Chin@Sun.COM }
1808462SApril.Chin@Sun.COM 
1818462SApril.Chin@Sun.COM #endif
1828462SApril.Chin@Sun.COM 
1838462SApril.Chin@Sun.COM #if _lib_SHA1Init && _hdr_sha1
1848462SApril.Chin@Sun.COM 
1858462SApril.Chin@Sun.COM #include <sha1.h>
1868462SApril.Chin@Sun.COM 
1878462SApril.Chin@Sun.COM #define sha1_description "RFC3174 / FIPS 180-1 SHA-1 secure hash algorithm 1. Cryptographically weak. The block count is not printed."
1888462SApril.Chin@Sun.COM #define sha1_options	"[+(version)?sha1 (solaris -lmd) 2005-07-26]"
1898462SApril.Chin@Sun.COM #define sha1_match	"sha1|SHA1|sha-1|SHA-1"
1908462SApril.Chin@Sun.COM #define sha1_scale	0
1918462SApril.Chin@Sun.COM #define sha1_init	lmd_init
1928462SApril.Chin@Sun.COM #define sha1_block	lmd_block
1938462SApril.Chin@Sun.COM #define sha1_done	lmd_done
1948462SApril.Chin@Sun.COM #define sha1_print	lmd_print
1958462SApril.Chin@Sun.COM #define sha1_data	lmd_data
1968462SApril.Chin@Sun.COM 
1978462SApril.Chin@Sun.COM typedef struct Sha1_s
1988462SApril.Chin@Sun.COM {
1998462SApril.Chin@Sun.COM 	_SUM_LMD_
2008462SApril.Chin@Sun.COM 	SHA1_CTX	context;
2018462SApril.Chin@Sun.COM 	unsigned char	pad[1024];	/* XXX: who's bug is it? */
2028462SApril.Chin@Sun.COM } Sha1_t;
2038462SApril.Chin@Sun.COM 
2048462SApril.Chin@Sun.COM static Sum_t*
sha1_open(const Method_t * method,const char * name)2058462SApril.Chin@Sun.COM sha1_open(const Method_t* method, const char* name)
2068462SApril.Chin@Sun.COM {
2078462SApril.Chin@Sun.COM 	Sha1_t*	lmd;
2088462SApril.Chin@Sun.COM 
2098462SApril.Chin@Sun.COM 	if (lmd = newof(0, Sha1_t, 1, 0))
2108462SApril.Chin@Sun.COM 	{
2118462SApril.Chin@Sun.COM 		lmd->method = (Method_t*)method;
2128462SApril.Chin@Sun.COM 		lmd->name = name;
2138462SApril.Chin@Sun.COM 		lmd->datasize = 20;
2148462SApril.Chin@Sun.COM 		lmd->initf = (Lmd_init_f)SHA1Init;
2158462SApril.Chin@Sun.COM 		lmd->updatef = (Lmd_update_f)SHA1Update;
2168462SApril.Chin@Sun.COM 		lmd->finalf = (Lmd_final_f)SHA1Final;
2178462SApril.Chin@Sun.COM 		sha1_init((Sum_t*)lmd);
2188462SApril.Chin@Sun.COM 	}
2198462SApril.Chin@Sun.COM 	return (Sum_t*)lmd;
2208462SApril.Chin@Sun.COM }
2218462SApril.Chin@Sun.COM 
2228462SApril.Chin@Sun.COM #endif
2238462SApril.Chin@Sun.COM 
2248462SApril.Chin@Sun.COM #if _lib_SHA2Init && _hdr_sha2
2258462SApril.Chin@Sun.COM 
2268462SApril.Chin@Sun.COM #include <sha2.h>
2278462SApril.Chin@Sun.COM 
2288462SApril.Chin@Sun.COM #define sha256_description "FIPS 180-2 SHA256 secure hash algorithm.  The block count is not printed."
2298462SApril.Chin@Sun.COM #define sha256_options	"[+(version)?sha256 (solaris -lmd) 2005-07-26]"
2308462SApril.Chin@Sun.COM #define sha256_match	"sha256|sha-256|SHA256|SHA-256"
2318462SApril.Chin@Sun.COM #define sha256_scale	0
2328462SApril.Chin@Sun.COM #define sha256_init	lmd_init
2338462SApril.Chin@Sun.COM #define sha256_block	lmd_block
2348462SApril.Chin@Sun.COM #define sha256_done	lmd_done
2358462SApril.Chin@Sun.COM #define sha256_print	lmd_print
2368462SApril.Chin@Sun.COM #define sha256_data	lmd_data
2378462SApril.Chin@Sun.COM 
2388462SApril.Chin@Sun.COM typedef struct Sha256_s
2398462SApril.Chin@Sun.COM {
2408462SApril.Chin@Sun.COM 	_SUM_LMD_
2418462SApril.Chin@Sun.COM 	SHA256_CTX	context;
2428462SApril.Chin@Sun.COM } Sha256_t;
2438462SApril.Chin@Sun.COM 
2448462SApril.Chin@Sun.COM static Sum_t*
sha256_open(const Method_t * method,const char * name)2458462SApril.Chin@Sun.COM sha256_open(const Method_t* method, const char* name)
2468462SApril.Chin@Sun.COM {
2478462SApril.Chin@Sun.COM 	Sha256_t*	lmd;
2488462SApril.Chin@Sun.COM 
2498462SApril.Chin@Sun.COM 	if (lmd = newof(0, Sha256_t, 1, 0))
2508462SApril.Chin@Sun.COM 	{
2518462SApril.Chin@Sun.COM 		lmd->method = (Method_t*)method;
2528462SApril.Chin@Sun.COM 		lmd->name = name;
2538462SApril.Chin@Sun.COM 		lmd->datasize = 32;
2548462SApril.Chin@Sun.COM 		lmd->initf = (Lmd_init_f)SHA256Init;
2558462SApril.Chin@Sun.COM 		lmd->updatef = (Lmd_update_f)SHA256Update;
2568462SApril.Chin@Sun.COM 		lmd->finalf = (Lmd_final_f)SHA256Final;
2578462SApril.Chin@Sun.COM 		sha256_init((Sum_t*)lmd);
2588462SApril.Chin@Sun.COM 	}
2598462SApril.Chin@Sun.COM 	return (Sum_t*)lmd;
2608462SApril.Chin@Sun.COM }
2618462SApril.Chin@Sun.COM 
2628462SApril.Chin@Sun.COM #define sha384_description "FIPS 180-2 SHA384 secure hash algorithm.  The block count is not printed."
2638462SApril.Chin@Sun.COM #define sha384_options	"[+(version)?sha384 (solaris -lmd) 2005-07-26]"
2648462SApril.Chin@Sun.COM #define sha384_match	"sha384|sha-384|SHA384|SHA-384"
2658462SApril.Chin@Sun.COM #define sha384_scale	0
2668462SApril.Chin@Sun.COM #define sha384_init	lmd_init
2678462SApril.Chin@Sun.COM #define sha384_block	lmd_block
2688462SApril.Chin@Sun.COM #define sha384_done	lmd_done
2698462SApril.Chin@Sun.COM #define sha384_print	lmd_print
2708462SApril.Chin@Sun.COM #define sha384_data	lmd_data
2718462SApril.Chin@Sun.COM 
2728462SApril.Chin@Sun.COM typedef struct Sha384_s
2738462SApril.Chin@Sun.COM {
2748462SApril.Chin@Sun.COM 	_SUM_LMD_
2758462SApril.Chin@Sun.COM 	SHA384_CTX	context;
2768462SApril.Chin@Sun.COM } Sha384_t;
2778462SApril.Chin@Sun.COM 
2788462SApril.Chin@Sun.COM static Sum_t*
sha384_open(const Method_t * method,const char * name)2798462SApril.Chin@Sun.COM sha384_open(const Method_t* method, const char* name)
2808462SApril.Chin@Sun.COM {
2818462SApril.Chin@Sun.COM 	Sha384_t*	lmd;
2828462SApril.Chin@Sun.COM 
2838462SApril.Chin@Sun.COM 	if (lmd = newof(0, Sha384_t, 1, 0))
2848462SApril.Chin@Sun.COM 	{
2858462SApril.Chin@Sun.COM 		lmd->method = (Method_t*)method;
2868462SApril.Chin@Sun.COM 		lmd->name = name;
2878462SApril.Chin@Sun.COM 		lmd->datasize = 48;
2888462SApril.Chin@Sun.COM 		lmd->initf = (Lmd_init_f)SHA384Init;
2898462SApril.Chin@Sun.COM 		lmd->updatef = (Lmd_update_f)SHA384Update;
2908462SApril.Chin@Sun.COM 		lmd->finalf = (Lmd_final_f)SHA384Final;
2918462SApril.Chin@Sun.COM 		sha384_init((Sum_t*)lmd);
2928462SApril.Chin@Sun.COM 	}
2938462SApril.Chin@Sun.COM 	return (Sum_t*)lmd;
2948462SApril.Chin@Sun.COM }
2958462SApril.Chin@Sun.COM 
2968462SApril.Chin@Sun.COM #define sha512_description "FIPS 180-2 SHA512 secure hash algorithm.  The block count is not printed."
2978462SApril.Chin@Sun.COM #define sha512_options	"[+(version)?sha512 (solaris -lmd) 2005-07-26]"
2988462SApril.Chin@Sun.COM #define sha512_match	"sha512|sha-512|SHA512|SHA-512"
2998462SApril.Chin@Sun.COM #define sha512_scale	0
3008462SApril.Chin@Sun.COM #define sha512_init	lmd_init
3018462SApril.Chin@Sun.COM #define sha512_block	lmd_block
3028462SApril.Chin@Sun.COM #define sha512_done	lmd_done
3038462SApril.Chin@Sun.COM #define sha512_print	lmd_print
3048462SApril.Chin@Sun.COM #define sha512_data	lmd_data
3058462SApril.Chin@Sun.COM 
3068462SApril.Chin@Sun.COM typedef struct Sha512_s
3078462SApril.Chin@Sun.COM {
3088462SApril.Chin@Sun.COM 	_SUM_LMD_
3098462SApril.Chin@Sun.COM 	SHA512_CTX	context;
3108462SApril.Chin@Sun.COM } Sha512_t;
3118462SApril.Chin@Sun.COM 
3128462SApril.Chin@Sun.COM static Sum_t*
sha512_open(const Method_t * method,const char * name)3138462SApril.Chin@Sun.COM sha512_open(const Method_t* method, const char* name)
3148462SApril.Chin@Sun.COM {
3158462SApril.Chin@Sun.COM 	Sha512_t*	lmd;
3168462SApril.Chin@Sun.COM 
3178462SApril.Chin@Sun.COM 	if (lmd = newof(0, Sha512_t, 1, 0))
3188462SApril.Chin@Sun.COM 	{
3198462SApril.Chin@Sun.COM 		lmd->method = (Method_t*)method;
3208462SApril.Chin@Sun.COM 		lmd->name = name;
3218462SApril.Chin@Sun.COM 		lmd->datasize = 64;
3228462SApril.Chin@Sun.COM 		lmd->initf = (Lmd_init_f)SHA512Init;
3238462SApril.Chin@Sun.COM 		lmd->updatef = (Lmd_update_f)SHA512Update;
3248462SApril.Chin@Sun.COM 		lmd->finalf = (Lmd_final_f)SHA512Final;
3258462SApril.Chin@Sun.COM 		sha512_init((Sum_t*)lmd);
3268462SApril.Chin@Sun.COM 	}
3278462SApril.Chin@Sun.COM 	return (Sum_t*)lmd;
3288462SApril.Chin@Sun.COM }
3298462SApril.Chin@Sun.COM 
3308462SApril.Chin@Sun.COM #endif
331