7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin/***********************************************************************
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin* *
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin* This software is part of the ast package *
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner* Copyright (c) 1996-2010 AT&T Intellectual Property *
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin* and is licensed under the *
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin* Common Public License, Version 1.0 *
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin* by AT&T Intellectual Property *
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin* *
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin* A copy of the License is available at *
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin* http://www.opensource.org/licenses/cpl1.0.txt *
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin* (with md5 checksum 059e8cd6165cb4c31e351f2b69388fd9) *
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin* *
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin* Information and Software Systems Research *
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin* AT&T Research *
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin* Florham Park NJ *
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin* *
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin* Glenn Fowler <gsf@research.att.com> *
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin* *
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin***********************************************************************/
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin#pragma prototyped
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin/*
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin * ast4
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin */
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin#define ast4_description \
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin "The \bast\b 128 bit PRNG hash generated by catenating 4 separate 32 \
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin bit PNRG hashes. The block count is not printed."
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin#define ast4_options 0
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin#define ast4_match "ast4|32x4|tw"
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin#define ast4_done long_done
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin#define ast4_scale 0
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chintypedef struct Ast4_sum_s
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin{
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin uint32_t sum0;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin uint32_t sum1;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin uint32_t sum2;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin uint32_t sum3;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin} Ast4_sum_t;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chintypedef struct Ast4_s
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin{
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin _SUM_PUBLIC_
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin _SUM_PRIVATE_
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin Ast4_sum_t cur;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin Ast4_sum_t tot;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin unsigned char buf[sizeof(Ast4_sum_t)];
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin} Ast4_t;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chinstatic int
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chinast4_init(Sum_t* p)
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin{
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin register Ast4_t* a = (Ast4_t*)p;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin a->tot.sum0 ^= a->cur.sum0;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin a->cur.sum0 = 0;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin a->tot.sum1 ^= a->cur.sum1;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin a->cur.sum1 = 0;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin a->tot.sum2 ^= a->cur.sum2;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin a->cur.sum2 = 0;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin a->tot.sum3 ^= a->cur.sum3;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin a->cur.sum3 = 0;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin return 0;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin}
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chinstatic Sum_t*
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chinast4_open(const Method_t* method, const char* name)
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin{
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin Ast4_t* p;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin if (p = newof(0, Ast4_t, 1, 0))
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin {
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin p->method = (Method_t*)method;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin p->name = name;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin }
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin return (Sum_t*)p;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin}
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chinstatic int
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chinast4_block(Sum_t* p, const void* s, size_t n)
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin{
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin register Ast4_sum_t* a = &((Ast4_t*)p)->cur;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin register unsigned char* b = (unsigned char*)s;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin register unsigned char* e = b + n;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin register int c;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin while (b < e)
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin {
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin c = *b++;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin a->sum0 = a->sum0 * 0x63c63cd9 + 0x9c39c33d + c;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin a->sum1 = a->sum1 * 0x00000011 + 0x00017cfb + c;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin a->sum2 = a->sum2 * 0x12345679 + 0x3ade68b1 + c;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin a->sum3 = a->sum3 * 0xf1eac01d + 0xcafe10af + c;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin }
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin return 0;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin}
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chinstatic int
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chinast4_print(Sum_t* p, Sfio_t* sp, int flags, size_t scale)
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin{
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin register Ast4_sum_t* a;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin a = (flags & SUM_TOTAL) ? &((Ast4_t*)p)->tot : &((Ast4_t*)p)->cur;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin sfprintf(sp, "%06..64u%06..64u%06..64u%06..64u", a->sum0, a->sum1, a->sum2, a->sum3);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin return 0;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin}
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chinstatic int
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chinast4_data(Sum_t* p, Sumdata_t* data)
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin{
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin data->size = sizeof(((Ast4_t*)p)->cur);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin data->num = 0;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin#if _ast_intswap
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin swapmem(_ast_intswap, data->buf = ((Ast4_t*)p)->buf, &((Ast4_t*)p)->cur, sizeof(((Ast4_t*)p)->cur));
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin#else
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin data->buf = &((Ast4_t*)p)->cur;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin#endif
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin return 0;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin}