|
|
|
#ifndef _TS3INIT_COOKIE_SEED_H
|
|
|
|
#define _TS3INIT_COOKIE_SEED_H
|
|
|
|
|
|
|
|
enum {
|
|
|
|
RANDOM_SEED_LEN = 60,
|
|
|
|
RANDOM_SEED_PATH_MAX = 256,
|
|
|
|
};
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Parses a hexstring into dest.
|
|
|
|
* It is assumed that RANDOM_SEED_LEN bytes are to be parsed.
|
|
|
|
*/
|
|
|
|
static inline bool parse_random_seed(const char *src, __u8* dst)
|
|
|
|
{
|
|
|
|
int i, j;
|
|
|
|
for (i = 0; i < RANDOM_SEED_LEN; ++i)
|
|
|
|
{
|
|
|
|
int v = 0;
|
|
|
|
for ( j = 0; j < 2; ++j)
|
|
|
|
{
|
|
|
|
uint8_t byte = *src++;
|
|
|
|
if (byte >= '0' && byte <= '9') byte = byte - '0';
|
|
|
|
else if (byte >= 'a' && byte <='f') byte = byte - 'a' + 10;
|
|
|
|
else if (byte >= 'A' && byte <='F') byte = byte - 'A' + 10;
|
|
|
|
else return false;
|
|
|
|
v = (v << 4) | byte;
|
|
|
|
}
|
|
|
|
*dst++ = v;
|
|
|
|
}
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
|
|
|
#ifndef __KERNEL__
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Reads a cookie seed from a file.
|
|
|
|
*/
|
|
|
|
static inline bool read_random_seed_from_file(const char *module_name, const char *path, __u8* dst)
|
|
|
|
{
|
|
|
|
int n, fd;
|
|
|
|
char text[RANDOM_SEED_LEN * 2], error_message[256];
|
|
|
|
if (strlen(path) > RANDOM_SEED_PATH_MAX)
|
|
|
|
{
|
|
|
|
xtables_error(PARAMETER_PROBLEM, "%s: path is too long.", module_name);
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
|
|
|
fd = open(path, O_RDONLY);
|
|
|
|
if (fd == -1) goto io_error;
|
|
|
|
if (lseek(fd, 0, SEEK_END) == sizeof(text))
|
|
|
|
{
|
|
|
|
xtables_error(PARAMETER_PROBLEM, "%s: %s must contain exactly %lu characters", module_name, path, sizeof(text));
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
if (lseek(fd, 0, SEEK_SET) == -1) goto io_error;
|
|
|
|
|
|
|
|
n = read(fd, text, sizeof(text));
|
|
|
|
if (n == -1) goto io_error;
|
|
|
|
else if (n != sizeof(text) || parse_random_seed(text, dst) == false)
|
|
|
|
{
|
|
|
|
xtables_error(PARAMETER_PROBLEM, "%s: %s must contain exactly %lu lowercase hex characters", module_name, path, sizeof(text));
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
return true;
|
|
|
|
io_error:
|
|
|
|
strerror_r(errno, error_message, sizeof(error_message));
|
|
|
|
xtables_error(PARAMETER_PROBLEM, "%s: %s.",
|
|
|
|
module_name,
|
|
|
|
error_message);
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
|
|
|
#endif /* __KERNEL__ */
|
|
|
|
#endif /* _TS3INIT_COOKIE_SEED_H */
|