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  * ast4
24  */
25 
26 #define ast4_description \
27 	"The \bast\b 128 bit PRNG hash generated by catenating 4 separate 32 \
28 	bit PNRG hashes. The block count is not printed."
29 #define ast4_options	0
30 #define ast4_match	"ast4|32x4|tw"
31 #define ast4_done	long_done
32 #define ast4_scale	0
33 
34 typedef struct Ast4_sum_s
35 {
36 	uint32_t	sum0;
37 	uint32_t	sum1;
38 	uint32_t	sum2;
39 	uint32_t	sum3;
40 } Ast4_sum_t;
41 
42 typedef struct Ast4_s
43 {
44 	_SUM_PUBLIC_
45 	_SUM_PRIVATE_
46 	Ast4_sum_t	cur;
47 	Ast4_sum_t	tot;
48 	unsigned char	buf[sizeof(Ast4_sum_t)];
49 } Ast4_t;
50 
51 static int
ast4_init(Sum_t * p)52 ast4_init(Sum_t* p)
53 {
54 	register Ast4_t*	a = (Ast4_t*)p;
55 
56 	a->tot.sum0 ^= a->cur.sum0;
57 	a->cur.sum0 = 0;
58 	a->tot.sum1 ^= a->cur.sum1;
59 	a->cur.sum1 = 0;
60 	a->tot.sum2 ^= a->cur.sum2;
61 	a->cur.sum2 = 0;
62 	a->tot.sum3 ^= a->cur.sum3;
63 	a->cur.sum3 = 0;
64 	return 0;
65 }
66 
67 static Sum_t*
ast4_open(const Method_t * method,const char * name)68 ast4_open(const Method_t* method, const char* name)
69 {
70 	Ast4_t*	p;
71 
72 	if (p = newof(0, Ast4_t, 1, 0))
73 	{
74 		p->method = (Method_t*)method;
75 		p->name = name;
76 	}
77 	return (Sum_t*)p;
78 }
79 
80 static int
ast4_block(Sum_t * p,const void * s,size_t n)81 ast4_block(Sum_t* p, const void* s, size_t n)
82 {
83 	register Ast4_sum_t*	a = &((Ast4_t*)p)->cur;
84 	register unsigned char*	b = (unsigned char*)s;
85 	register unsigned char*	e = b + n;
86 	register int		c;
87 
88 	while (b < e)
89 	{
90 		c = *b++;
91 		a->sum0 = a->sum0 * 0x63c63cd9 + 0x9c39c33d + c;
92 		a->sum1 = a->sum1 * 0x00000011 + 0x00017cfb + c;
93 		a->sum2 = a->sum2 * 0x12345679 + 0x3ade68b1 + c;
94 		a->sum3 = a->sum3 * 0xf1eac01d + 0xcafe10af + c;
95 	}
96 	return 0;
97 }
98 
99 static int
ast4_print(Sum_t * p,Sfio_t * sp,int flags,size_t scale)100 ast4_print(Sum_t* p, Sfio_t* sp, int flags, size_t scale)
101 {
102 	register Ast4_sum_t*	a;
103 
104 	a = (flags & SUM_TOTAL) ? &((Ast4_t*)p)->tot : &((Ast4_t*)p)->cur;
105 	sfprintf(sp, "%06..64u%06..64u%06..64u%06..64u", a->sum0, a->sum1, a->sum2, a->sum3);
106 	return 0;
107 }
108 
109 static int
ast4_data(Sum_t * p,Sumdata_t * data)110 ast4_data(Sum_t* p, Sumdata_t* data)
111 {
112 	data->size = sizeof(((Ast4_t*)p)->cur);
113 	data->num = 0;
114 #if _ast_intswap
115 	swapmem(_ast_intswap, data->buf = ((Ast4_t*)p)->buf, &((Ast4_t*)p)->cur, sizeof(((Ast4_t*)p)->cur));
116 #else
117 	data->buf = &((Ast4_t*)p)->cur;
118 #endif
119 	return 0;
120 }
121