ГОСТ Р ИСО/МЭК 9834-8—2011
«include «string.h>
«include “sysdep.h"
Гсистемно-заеисимый вызов для получения идентификатора узла КДС.
В данном примере генерируется случайный идентификатор узла. */
void get_ieee_node_*dentifier(uuid_node_t ’node)
{
static mt inlted = 0;
static uuid_node_t8aved_node,
unsigned charseed(16];
FILE *fp;
If (United) {
fp = fopenfnodetd". *rb“);
fread(&saved_node. slzeof saved_node. 1. fp);
fclose(fp);
)
else {
get_random_lnfo(seed);
seed[0)|« 0x80;
memcpy(&saved_node. seed, sizeof saved_node);
fp ■ fopenfnodeld*, "wb");
fwnte(&saved_node, slzeof saved_node. 1. fp);
fclose(fp);
}
}
Inlted = 1;
>
•node = saved_node.
}
/‘ системно-зависимый вызов для получения текущего системного времени. Возвращает 100-наносекундные
отсчеты от эпохи УУИд, но разрешение может быть меньше 100 наносекунд.*/
elfdef _WINDOWS_
void get_system_time(uuld_bme_t *uuid_tlme)
{
ULARGEJNTEGER time;
/* В Windows NT время хранится в формате FILETIME, который есть число 100 наносекундных отсчетов
от 1 января 1601 г. В УУИд используется время в 100 наносекундных отсчетах от 15октября 1582г.
Разница составляет 17 дней в октябре ♦ 30 (ноябрь) + 31 (декабрь) ♦ 18 лет ♦ 5 дней в високосных годах. */
GetSystemTimeAsFileTlme((FILETIME *)&time);
tlme.QuadParl +=
(unsigned_int64) (1000* 1000* 10)//секунды
* (unsigned_mt64)(60 * 60 *24)//дни
* (unsigned_mt64) (17*30*31 ♦365*18*5); // число дней
*uuld_time = time.OuadPart;
}
void get_random_mfo(unsigned char seed[l6])
{
MD5_CTX c;
struct (
MEMORYSTATUSm;
SYSTEMJNFOs;
FILETIME t;
LARGE_INTEGER pc;
DWORD tc;
23