Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
att
GitHub Repository: att/ast
Path: blob/master/src/lib/libsum/sum-ast4.c
1808 views
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 <[email protected]> *
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
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*
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
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
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
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
122