Esempio n. 1
0
File: dstu.c Progetto: fars/bee2
static size_t _dstuRecoverPoint_deep(size_t n, size_t f_deep, size_t ec_d, 
	size_t ec_deep)
{
	return O_OF_W(2 * n) + 
		utilMax(2,
			gf2QSolve_deep(n, f_deep),
			gf2Tr_deep(n, f_deep));
}
Esempio n. 2
0
File: dstu.c Progetto: fars/bee2
static size_t _dstuSign_deep(size_t n, size_t f_deep, size_t ec_d, 
	size_t ec_deep)
{
	return O_OF_W(6 * n) + 
		utilMax(2,
			ecMulA_deep(n, ec_d, ec_deep, n),
			zzMulMod_deep(n));
}
Esempio n. 3
0
File: dstu.c Progetto: fars/bee2
static size_t _dstuValPoint_deep(size_t n, size_t f_deep, size_t ec_d, 
	size_t ec_deep)
{
	return O_OF_W(2 * n) + 
		utilMax(2,
			ec2IsOnA_deep(n, f_deep),
			ecHasOrderA_deep(n, ec_d, ec_deep, n));
}
Esempio n. 4
0
File: dstu.c Progetto: fars/bee2
static size_t _dstuGenPoint_deep(size_t n, size_t f_deep, size_t ec_d, 
	size_t ec_deep)
{
	return O_OF_W(3 * n) + 
		utilMax(2,
			gf2QSolve_deep(n, f_deep),
			ecHasOrderA_deep(n, ec_d, ec_deep, n));
}
Esempio n. 5
0
File: g12s.c Progetto: fars/bee2
static size_t g12sValParams_deep(size_t n, size_t f_deep, size_t ec_d, 
	size_t ec_deep)
{
	return utilMax(4,
			ecpIsValid_deep(n, f_deep),
			ecpSeemsValidGroup_deep(n, f_deep),
			ecpIsSafeGroup_deep(n),
			ecHasOrderA_deep(n, ec_d, ec_deep, n));
}
Esempio n. 6
0
File: g12s.c Progetto: fars/bee2
static size_t g12sSign_deep(size_t n, size_t f_deep, size_t ec_d, 
	size_t ec_deep)
{
	const size_t m = n;
	return 	O_OF_W(3 * m + 2 * n) +
		utilMax(3,
			zzMod_deep(m, m),
			ecMulA_deep(n, ec_d, ec_deep, n),
			zzMulMod_deep(m));
}
Esempio n. 7
0
File: g12s.c Progetto: fars/bee2
static size_t g12sVerify_deep(size_t n, size_t f_deep, size_t ec_d, 
	size_t ec_deep)
{
	const size_t m = n;
	return O_OF_W(5 * m + 2 * n) +
		utilMax(4,
			zzMod_deep(m, m),
			zzMulMod_deep(m),
			zzInvMod_deep(m),
			ecAddMulA_deep(n, ec_d, ec_deep, 2, m, m));
}
Esempio n. 8
0
bool_t utilTest()
{
	printf("utilVersion: %s\n", utilVersion());
	if (utilMin(5, SIZE_1, (size_t)2, (size_t)3, SIZE_1, SIZE_0) != 0 ||
		utilMax(5, SIZE_1, (size_t)2, (size_t)3, SIZE_1, SIZE_0) != 3)
		return FALSE;
	if (utilCRC32("123456789", 9, 0) != 0xCBF43926)
		return FALSE;
	if (utilFNV32("3pjNqM", 6, 0x811C9DC5) != 0)
		return FALSE;
	// все нормально
	return TRUE;
}
Esempio n. 9
0
File: pos.c Progetto: raimarHD/lcec
bool posIsDraw(const Pos *pos, unsigned int ply) {
	// False positives are bad, false negatives are OK.

	// Repetition (2-fold).
	PosData *ptr, *endPtr=utilMax(pos->dataStart, pos->data-posGetHalfMoveNumber(pos));
	for(ptr=pos->data-2;ptr>=endPtr;ptr-=2)
		if (ptr->key==pos->data->key)
			return true;

	// 50-move rule.
	if (posGetHalfMoveNumber(pos)>=100)
		return true;

	// Insufficient material.
	if (evalGetMatType(pos)==EvalMatTypeDraw)
		return true;

	return false;
}
Esempio n. 10
0
File: g12s.c Progetto: fars/bee2
static err_t g12sCreateEc(
	ec_o** pec,						/* [out] описание эллиптической кривой */
	const g12s_params* params,		/* [in] долговременные параметры */
	g12s_deep_i deep				/* [in] потребности в стековой памяти */
)
{
	// размерности
	size_t n, no, nb;
	size_t f_keep;
	size_t f_deep;
	size_t ec_d;
	size_t ec_keep;
	size_t ec_deep;
	// состояние
	void* state;	
	qr_o* f;			/* базовое поле */
	ec_o* ec;			/* кривая */
	void* stack;
	// pre
	ASSERT(memIsValid(pec, sizeof(*pec)));
	// минимальная проверка входных данных
	if (!memIsValid(params, sizeof(g12s_params)) ||
		params->l != 256 && params->l != 512)
		return ERR_BAD_PARAMS;
	// определить размерности
	no = memNonZeroSize(params->p, sizeof(params->p) * params->l / 512);
	n = W_OF_O(no);
	f_keep = gfpCreate_keep(no);
	f_deep = gfpCreate_deep(no);
	ec_d = 3;
	ec_keep = ecpCreateJ_keep(no);
	ec_deep = ecpCreateJ_deep(no, f_deep);
	// создать состояние
	state = blobCreate(
		f_keep + ec_keep +
		utilMax(3,
			ec_deep,
			ecCreateGroup_deep(f_deep),
			deep(n, f_deep, ec_d, ec_deep)));
	if (state == 0)
		return ERR_NOT_ENOUGH_MEMORY;
	// создать поле
	f = (qr_o*)((octet*)state + ec_keep);
	stack = (octet*)f + f_keep;
	if (!gfpCreate(f, params->p, no, stack))
	{
		blobClose(state);
		return ERR_BAD_PARAMS;
	}
	// проверить длину p
	nb = wwBitSize(f->mod, n);
	if (params->l == 256 && nb <= 253 ||
		params->l == 512 && nb <= 507)
	{
		blobClose(state);
		return ERR_BAD_PARAMS;
	}
	// создать кривую и группу
	ec = (ec_o*)state;
	if (!ecpCreateJ(ec, f, params->a, params->b, stack) ||
		!ecCreateGroup(ec, params->xP, params->yP, params->q, 
			params->l / 8, params->n, stack))
	{
		blobClose(state);
		return ERR_BAD_PARAMS;
	}
	// проверить q
	n = W_OF_B(params->l);
	nb = wwBitSize(ec->order, n);
	if (params->l == 256 && nb <= 254 ||
		params->l == 512 && nb <= 508 ||
		zzIsEven(ec->order, n))
	{
		blobClose(state);
		return ERR_BAD_PARAMS;
	}
	// присоединить f к ec
	objAppend(ec, f, 0);
	// все нормально
	*pec = ec;
	return ERR_OK;
}
Esempio n. 11
0
File: dstu.c Progetto: fars/bee2
static err_t _dstuCreateEc(
	ec_o** pec,						/* [out] описание эллиптической кривой */
	const dstu_params* params,		/* [in] долговременные параметры */
	_dstu_deep_i deep				/* [in] потребности в стековой памяти */
)
{
	// размерности
	size_t m;
	size_t n;
	size_t f_keep;
	size_t f_deep;
	size_t ec_d;
	size_t ec_keep;
	size_t ec_deep;
	// состояние
	void* state;	
	size_t* p;			/* описание многочлена */
	qr_o* f;			/* поле */
	octet* A;			/* коэффициент A */
	ec_o* ec;			/* кривая */
	void* stack;
	// pre
	ASSERT(memIsValid(pec, sizeof(*pec)));
	// минимальная проверка входных данных
	if (!memIsValid(params, sizeof(dstu_params)) ||
		(m = params->p[0]) < 160 || m > 509 || 
		params->A > 1)
		return ERR_BAD_PARAMS;
	// определить размерности
	n = W_OF_B(m);
	f_keep = gf2Create_keep(m);
	f_deep = gf2Create_deep(m);
	ec_d = 3;
	ec_keep = ec2CreateLD_keep(n);
	ec_deep = ec2CreateLD_deep(n, f_deep);
	// создать состояние
	state = blobCreate(
		f_keep + ec_keep +
		utilMax(4,
			4 * sizeof(size_t) + f_deep,
			O_OF_B(m) + ec_deep,
			ecCreateGroup_deep(f_deep),
			deep(n, f_deep, ec_d, ec_deep)));
	if (state == 0)
		return ERR_NOT_ENOUGH_MEMORY;
	// создать поле
	f = (qr_o*)((octet*)state + ec_keep);
	p = (size_t*)((octet*)f + f_keep);
	p[0] = params->p[0];
	p[1] = params->p[1];
	p[2] = params->p[2];
	p[3] = params->p[3];
	stack = p + 4;
	if (!gf2Create(f, p, stack))
	{
		blobClose(state);
		return ERR_BAD_PARAMS;
	}
	// создать кривую и группу
	ec = (ec_o*)state;
	A = (octet*)p;
	A[0] = params->A;
	memSetZero(A + 1, f->no - 1);
	stack = A + f->no;
	if (!ec2CreateLD(ec, f, A, params->B, stack) ||
		!ecCreateGroup(ec, params->P, params->P + ec->f->no, params->n, 
			ec->f->no, params->c, stack))
	{
		blobClose(state);
		return ERR_BAD_PARAMS;
	}
	// присоединить f к ec
	objAppend(ec, f, 0);
	// все нормально
	*pec = ec;
	return ERR_OK;
}