1
/*
2
*******************************************************************************
3
\file util.c
4
\brief Utilities
5
\project bee2 [cryptographic library]
6
\author (C) Sergey Agievich [agievich@{bsu.by|gmail.com}]
7
\created 2012.05.10
8
\version 2017.10.14
9
\license This program is released under the GNU General Public License 
10
version 3. See Copyright Notices in bee2/info.h.
11
*******************************************************************************
12
*/
13

14
#include <assert.h>
15
#include <stdarg.h>
16
#include <stdio.h>
17
#include <stdlib.h>
18
#include "bee2/info.h"
19
#include "bee2/core/mem.h"
20
#include "bee2/core/tm.h"
21
#include "bee2/core/util.h"
22

23
/*
24
*******************************************************************************
25
Версия
26
*******************************************************************************
27
*/
28

29 1
const char* utilVersion()
30
{
31 1
	return BEE2_VERSION;
32
}
33

34
/*
35
*******************************************************************************
36
Assert
37
*******************************************************************************
38
*/
39

40 1
void utilAssert(int b, const char* file, int line)
41
{
42 1
	if (!b)
43
	{
44 0
		fprintf(stderr, "Assertion in %s::%d\n", file, line);
45 0
		abort();
46
	}
47
}
48

49
/*
50
*******************************************************************************
51
Минимум / максимум
52
*******************************************************************************
53
*/
54

55 1
size_t utilMin(size_t n, ...)
56
{
57 1
	size_t min = SIZE_MAX;
58
	va_list marker;
59 1
	ASSERT(n > 0);
60 1
	va_start(marker, n);
61 1
	while (n--)
62
	{
63 1
		size_t current = va_arg(marker, size_t);
64 1
		if (current < min)
65 1
			min = current;
66
	}
67 1
	va_end(marker);
68 1
	return min;
69
}
70

71 1
size_t utilMax(size_t n, ...)
72
{
73 1
	size_t max = 0;
74
	va_list marker;
75 1
	ASSERT(n > 0);
76 1
	va_start(marker, n);
77 1
	while (n--)
78
	{
79 1
		size_t current = va_arg(marker, size_t);
80 1
		if (current > max)
81 1
			max = current;
82
	}
83 1
	va_end(marker);
84 1
	return max;
85
}
86

87
/*
88
*******************************************************************************
89
CRC32
90

91
На основании программы Gary S. Brown (1986).
92

93
Таблица crc32_table рассчитывается следующим образом (см. RFC1952):
94
\code
95
	void make_crc32_table()
96
	{
97
		u32 x, y;
98
		size_t i;
99
		for (x = 0; x < 256; ++x)
100
		{
101
			for (y = x, i = 0; i < 8; ++i)
102
				y = y & 1 ? 0xedb88320 ^ y >> 1 : y >> 1;
103
			crc_table[x] = y;
104
		}
105
	}
106
\endcode
107
*******************************************************************************
108
*/
109

110
static const u32 crc32_table[] = {
111
	0x00000000, 0x77073096, 0xee0e612c, 0x990951ba, 0x076dc419, 0x706af48f,
112
	0xe963a535, 0x9e6495a3,	0x0edb8832, 0x79dcb8a4, 0xe0d5e91e, 0x97d2d988,
113
	0x09b64c2b, 0x7eb17cbd, 0xe7b82d07, 0x90bf1d91, 0x1db71064, 0x6ab020f2,
114
	0xf3b97148, 0x84be41de,	0x1adad47d, 0x6ddde4eb, 0xf4d4b551, 0x83d385c7,
115
	0x136c9856, 0x646ba8c0, 0xfd62f97a, 0x8a65c9ec,	0x14015c4f, 0x63066cd9,
116
	0xfa0f3d63, 0x8d080df5,	0x3b6e20c8, 0x4c69105e, 0xd56041e4, 0xa2677172,
117
	0x3c03e4d1, 0x4b04d447, 0xd20d85fd, 0xa50ab56b,	0x35b5a8fa, 0x42b2986c,
118
	0xdbbbc9d6, 0xacbcf940,	0x32d86ce3, 0x45df5c75, 0xdcd60dcf, 0xabd13d59,
119
	0x26d930ac, 0x51de003a, 0xc8d75180, 0xbfd06116, 0x21b4f4b5, 0x56b3c423,
120
	0xcfba9599, 0xb8bda50f, 0x2802b89e, 0x5f058808, 0xc60cd9b2, 0xb10be924,
121
	0x2f6f7c87, 0x58684c11, 0xc1611dab, 0xb6662d3d,	0x76dc4190, 0x01db7106,
122
	0x98d220bc, 0xefd5102a, 0x71b18589, 0x06b6b51f, 0x9fbfe4a5, 0xe8b8d433,
123
	0x7807c9a2, 0x0f00f934, 0x9609a88e, 0xe10e9818, 0x7f6a0dbb, 0x086d3d2d,
124
	0x91646c97, 0xe6635c01, 0x6b6b51f4, 0x1c6c6162, 0x856530d8, 0xf262004e,
125
	0x6c0695ed, 0x1b01a57b, 0x8208f4c1, 0xf50fc457, 0x65b0d9c6, 0x12b7e950,
126
	0x8bbeb8ea, 0xfcb9887c, 0x62dd1ddf, 0x15da2d49, 0x8cd37cf3, 0xfbd44c65,
127
	0x4db26158, 0x3ab551ce, 0xa3bc0074, 0xd4bb30e2, 0x4adfa541, 0x3dd895d7,
128
	0xa4d1c46d, 0xd3d6f4fb, 0x4369e96a, 0x346ed9fc, 0xad678846, 0xda60b8d0,
129
	0x44042d73, 0x33031de5, 0xaa0a4c5f, 0xdd0d7cc9, 0x5005713c, 0x270241aa,
130
	0xbe0b1010, 0xc90c2086, 0x5768b525, 0x206f85b3, 0xb966d409, 0xce61e49f,
131
	0x5edef90e, 0x29d9c998, 0xb0d09822, 0xc7d7a8b4, 0x59b33d17, 0x2eb40d81,
132
	0xb7bd5c3b, 0xc0ba6cad, 0xedb88320, 0x9abfb3b6, 0x03b6e20c, 0x74b1d29a,
133
	0xead54739, 0x9dd277af, 0x04db2615, 0x73dc1683, 0xe3630b12, 0x94643b84,
134
	0x0d6d6a3e, 0x7a6a5aa8, 0xe40ecf0b, 0x9309ff9d, 0x0a00ae27, 0x7d079eb1,
135
	0xf00f9344, 0x8708a3d2, 0x1e01f268, 0x6906c2fe, 0xf762575d, 0x806567cb,
136
	0x196c3671, 0x6e6b06e7, 0xfed41b76, 0x89d32be0, 0x10da7a5a, 0x67dd4acc,
137
	0xf9b9df6f, 0x8ebeeff9, 0x17b7be43, 0x60b08ed5, 0xd6d6a3e8, 0xa1d1937e,
138
	0x38d8c2c4, 0x4fdff252, 0xd1bb67f1, 0xa6bc5767, 0x3fb506dd, 0x48b2364b,
139
	0xd80d2bda, 0xaf0a1b4c, 0x36034af6, 0x41047a60, 0xdf60efc3, 0xa867df55,
140
	0x316e8eef, 0x4669be79, 0xcb61b38c, 0xbc66831a, 0x256fd2a0, 0x5268e236,
141
	0xcc0c7795, 0xbb0b4703, 0x220216b9, 0x5505262f, 0xc5ba3bbe, 0xb2bd0b28,
142
	0x2bb45a92, 0x5cb36a04, 0xc2d7ffa7, 0xb5d0cf31, 0x2cd99e8b, 0x5bdeae1d,
143
	0x9b64c2b0, 0xec63f226, 0x756aa39c, 0x026d930a, 0x9c0906a9, 0xeb0e363f,
144
	0x72076785, 0x05005713, 0x95bf4a82, 0xe2b87a14, 0x7bb12bae, 0x0cb61b38,
145
	0x92d28e9b, 0xe5d5be0d, 0x7cdcefb7, 0x0bdbdf21, 0x86d3d2d4, 0xf1d4e242,
146
	0x68ddb3f8, 0x1fda836e, 0x81be16cd, 0xf6b9265b, 0x6fb077e1, 0x18b74777,
147
	0x88085ae6, 0xff0f6a70, 0x66063bca, 0x11010b5c, 0x8f659eff, 0xf862ae69,
148
	0x616bffd3, 0x166ccf45, 0xa00ae278, 0xd70dd2ee, 0x4e048354, 0x3903b3c2,
149
	0xa7672661, 0xd06016f7, 0x4969474d, 0x3e6e77db, 0xaed16a4a, 0xd9d65adc,
150
	0x40df0b66, 0x37d83bf0, 0xa9bcae53, 0xdebb9ec5, 0x47b2cf7f, 0x30b5ffe9,
151
	0xbdbdf21c, 0xcabac28a, 0x53b39330, 0x24b4a3a6, 0xbad03605, 0xcdd70693,
152
	0x54de5729, 0x23d967bf, 0xb3667a2e, 0xc4614ab8, 0x5d681b02, 0x2a6f2b94,
153
	0xb40bbe37, 0xc30c8ea1, 0x5a05df1b, 0x2d02ef8d,
154
};
155

156 1
u32 utilCRC32(const void* buf, size_t count, u32 state)
157
{
158 1
	const octet* octets = (const octet*)buf;
159 1
	for (state ^= 0xFFFFFFFF; count--; )
160 1
		state = crc32_table[(state ^ *octets++) & 0xFF] ^ (state >> 8);
161 1
	return state ^ 0xFFFFFFFF;
162
}
163

164
/*
165
*******************************************************************************
166
FNV32
167

168
Умножение на 16777619 = 2^24 + 2^8 + 2^7 + 2^4 + 2^1 + 2^0 реализуется
169
сдвигами и сложениями.
170
*******************************************************************************
171
*/
172

173 1
u32 utilFNV32(const void* buf, size_t count, u32 state)
174
{
175 1
	const octet* octets = (const octet*)buf;
176 1
	while (count--)
177
	{
178 1
		state ^= *octets++;
179 1
		state += (state << 1) + (state << 4) + (state << 7) +
180 1
			(state << 8) + (state << 24);
181
	}
182 1
	return state;
183
}
184

185
/*
186
*******************************************************************************
187
Нонс
188
*******************************************************************************
189
*/
190

191 1
u32 utilNonce32()
192
{
193
	tm_time_t curtime;
194
	tm_ticks_t curticks;
195 1
	register u32 state = 2166136261u;
196
	// UNIX-время
197 1
	curtime = tmTime();
198 1
	state = utilFNV32(&curtime, sizeof(curtime), state);
199
	// число тактов
200 1
	curticks = tmTicks();
201 1
	state = utilFNV32(&curticks, sizeof(curticks), state);
202
	// еще?
203 1
	return state;
204
}

Read our documentation on viewing source code .

Loading