17c2fbfb3SApril Chin /***********************************************************************
27c2fbfb3SApril Chin *                                                                      *
37c2fbfb3SApril Chin *               This software is part of the ast package               *
4*b30d1939SAndy Fiddaman *          Copyright (c) 1996-2011 AT&T Intellectual Property          *
57c2fbfb3SApril Chin *                      and is licensed under the                       *
6*b30d1939SAndy Fiddaman *                 Eclipse Public License, Version 1.0                  *
77c2fbfb3SApril Chin *                    by AT&T Intellectual Property                     *
87c2fbfb3SApril Chin *                                                                      *
97c2fbfb3SApril Chin *                A copy of the License is available at                 *
10*b30d1939SAndy Fiddaman *          http://www.eclipse.org/org/documents/epl-v10.html           *
11*b30d1939SAndy Fiddaman *         (with md5 checksum b35adb5213ca9657e911e9befb180842)         *
127c2fbfb3SApril Chin *                                                                      *
137c2fbfb3SApril Chin *              Information and Software Systems Research               *
147c2fbfb3SApril Chin *                            AT&T Research                             *
157c2fbfb3SApril Chin *                           Florham Park NJ                            *
167c2fbfb3SApril Chin *                                                                      *
177c2fbfb3SApril Chin *                 Glenn Fowler <gsf@research.att.com>                  *
187c2fbfb3SApril Chin *                                                                      *
197c2fbfb3SApril Chin ***********************************************************************/
207c2fbfb3SApril Chin #pragma prototyped
217c2fbfb3SApril Chin 
227c2fbfb3SApril Chin /*
237c2fbfb3SApril Chin  * ast4
247c2fbfb3SApril Chin  */
257c2fbfb3SApril Chin 
267c2fbfb3SApril Chin #define ast4_description \
277c2fbfb3SApril Chin 	"The \bast\b 128 bit PRNG hash generated by catenating 4 separate 32 \
287c2fbfb3SApril Chin 	bit PNRG hashes. The block count is not printed."
297c2fbfb3SApril Chin #define ast4_options	0
307c2fbfb3SApril Chin #define ast4_match	"ast4|32x4|tw"
317c2fbfb3SApril Chin #define ast4_done	long_done
327c2fbfb3SApril Chin #define ast4_scale	0
337c2fbfb3SApril Chin 
347c2fbfb3SApril Chin typedef struct Ast4_sum_s
357c2fbfb3SApril Chin {
367c2fbfb3SApril Chin 	uint32_t	sum0;
377c2fbfb3SApril Chin 	uint32_t	sum1;
387c2fbfb3SApril Chin 	uint32_t	sum2;
397c2fbfb3SApril Chin 	uint32_t	sum3;
407c2fbfb3SApril Chin } Ast4_sum_t;
417c2fbfb3SApril Chin 
427c2fbfb3SApril Chin typedef struct Ast4_s
437c2fbfb3SApril Chin {
447c2fbfb3SApril Chin 	_SUM_PUBLIC_
457c2fbfb3SApril Chin 	_SUM_PRIVATE_
467c2fbfb3SApril Chin 	Ast4_sum_t	cur;
477c2fbfb3SApril Chin 	Ast4_sum_t	tot;
487c2fbfb3SApril Chin 	unsigned char	buf[sizeof(Ast4_sum_t)];
497c2fbfb3SApril Chin } Ast4_t;
507c2fbfb3SApril Chin 
517c2fbfb3SApril Chin static int
ast4_init(Sum_t * p)527c2fbfb3SApril Chin ast4_init(Sum_t* p)
537c2fbfb3SApril Chin {
547c2fbfb3SApril Chin 	register Ast4_t*	a = (Ast4_t*)p;
557c2fbfb3SApril Chin 
567c2fbfb3SApril Chin 	a->tot.sum0 ^= a->cur.sum0;
577c2fbfb3SApril Chin 	a->cur.sum0 = 0;
587c2fbfb3SApril Chin 	a->tot.sum1 ^= a->cur.sum1;
597c2fbfb3SApril Chin 	a->cur.sum1 = 0;
607c2fbfb3SApril Chin 	a->tot.sum2 ^= a->cur.sum2;
617c2fbfb3SApril Chin 	a->cur.sum2 = 0;
627c2fbfb3SApril Chin 	a->tot.sum3 ^= a->cur.sum3;
637c2fbfb3SApril Chin 	a->cur.sum3 = 0;
647c2fbfb3SApril Chin 	return 0;
657c2fbfb3SApril Chin }
667c2fbfb3SApril Chin 
677c2fbfb3SApril Chin static Sum_t*
ast4_open(const Method_t * method,const char * name)687c2fbfb3SApril Chin ast4_open(const Method_t* method, const char* name)
697c2fbfb3SApril Chin {
707c2fbfb3SApril Chin 	Ast4_t*	p;
717c2fbfb3SApril Chin 
727c2fbfb3SApril Chin 	if (p = newof(0, Ast4_t, 1, 0))
737c2fbfb3SApril Chin 	{
747c2fbfb3SApril Chin 		p->method = (Method_t*)method;
757c2fbfb3SApril Chin 		p->name = name;
767c2fbfb3SApril Chin 	}
777c2fbfb3SApril Chin 	return (Sum_t*)p;
787c2fbfb3SApril Chin }
797c2fbfb3SApril Chin 
807c2fbfb3SApril Chin static int
ast4_block(Sum_t * p,const void * s,size_t n)817c2fbfb3SApril Chin ast4_block(Sum_t* p, const void* s, size_t n)
827c2fbfb3SApril Chin {
837c2fbfb3SApril Chin 	register Ast4_sum_t*	a = &((Ast4_t*)p)->cur;
847c2fbfb3SApril Chin 	register unsigned char*	b = (unsigned char*)s;
857c2fbfb3SApril Chin 	register unsigned char*	e = b + n;
867c2fbfb3SApril Chin 	register int		c;
877c2fbfb3SApril Chin 
887c2fbfb3SApril Chin 	while (b < e)
897c2fbfb3SApril Chin 	{
907c2fbfb3SApril Chin 		c = *b++;
917c2fbfb3SApril Chin 		a->sum0 = a->sum0 * 0x63c63cd9 + 0x9c39c33d + c;
927c2fbfb3SApril Chin 		a->sum1 = a->sum1 * 0x00000011 + 0x00017cfb + c;
937c2fbfb3SApril Chin 		a->sum2 = a->sum2 * 0x12345679 + 0x3ade68b1 + c;
947c2fbfb3SApril Chin 		a->sum3 = a->sum3 * 0xf1eac01d + 0xcafe10af + c;
957c2fbfb3SApril Chin 	}
967c2fbfb3SApril Chin 	return 0;
977c2fbfb3SApril Chin }
987c2fbfb3SApril Chin 
997c2fbfb3SApril Chin static int
ast4_print(Sum_t * p,Sfio_t * sp,int flags,size_t scale)1007c2fbfb3SApril Chin ast4_print(Sum_t* p, Sfio_t* sp, int flags, size_t scale)
1017c2fbfb3SApril Chin {
1027c2fbfb3SApril Chin 	register Ast4_sum_t*	a;
1037c2fbfb3SApril Chin 
1047c2fbfb3SApril Chin 	a = (flags & SUM_TOTAL) ? &((Ast4_t*)p)->tot : &((Ast4_t*)p)->cur;
1057c2fbfb3SApril Chin 	sfprintf(sp, "%06..64u%06..64u%06..64u%06..64u", a->sum0, a->sum1, a->sum2, a->sum3);
1067c2fbfb3SApril Chin 	return 0;
1077c2fbfb3SApril Chin }
1087c2fbfb3SApril Chin 
1097c2fbfb3SApril Chin static int
ast4_data(Sum_t * p,Sumdata_t * data)1107c2fbfb3SApril Chin ast4_data(Sum_t* p, Sumdata_t* data)
1117c2fbfb3SApril Chin {
1127c2fbfb3SApril Chin 	data->size = sizeof(((Ast4_t*)p)->cur);
1137c2fbfb3SApril Chin 	data->num = 0;
1147c2fbfb3SApril Chin #if _ast_intswap
1157c2fbfb3SApril Chin 	swapmem(_ast_intswap, data->buf = ((Ast4_t*)p)->buf, &((Ast4_t*)p)->cur, sizeof(((Ast4_t*)p)->cur));
1167c2fbfb3SApril Chin #else
1177c2fbfb3SApril Chin 	data->buf = &((Ast4_t*)p)->cur;
1187c2fbfb3SApril Chin #endif
1197c2fbfb3SApril Chin 	return 0;
1207c2fbfb3SApril Chin }
121