/*
*******************************************************************************
\file bake_lcl.h
\brief STB 34.101.66 (bake): local declarations
\project bee2 [cryptographic library]
\created 2014.04.03
\version 2025.09.25
\copyright The Bee2 authors
\license Licensed under the Apache License, Version 2.0 (see LICENSE.txt).
*******************************************************************************
*/

#ifndef __BEE2_BAKE_LCL_H
#define __BEE2_BAKE_LCL_H

#include "bee2/crypto/bign.h"

#ifdef __cplusplus
extern "C" {
#endif

/*
*******************************************************************************
Эллиптические кривые

В Bake используются эллиптические кривые Bign (СТБ 34.101.45). Описание кривой
развертывается в состоянии протокола, а не во внешнем блобе, как в Bign.
После описания кривой могут следовать поля состояния проткола переменной длины, 
а за ними располагаться стек. Потребности в стеке указываются через функцию 
интерфейса bake_ec_deep_i. Длина состояния с учетом стека определяется 
с помощью функции bakeEcStart_keep(). Единожды подготовив память нужной длины, 
можно полностью выполнить на ней весь протокол.
*******************************************************************************
*/


/*!	\brief Потребности в стеке

	Определяется глубина стека, который требуется стороне протокола
	для работы с эллиптической кривой, описываемой объясненными ниже
	размерностями n, f_deep, ec_d, ec_deep.
	\remark При расчете глубины не следует учитывать память для
	размещения описаний базового поля и эллиптической кривой.
*/

typedef size_t(*bake_ec_deep_i)(
	size_t n,				/*!< [in] число слов для хранения элемента поля */
	size_t f_deep,			/*!< [in] глубина стека базового поля */
	size_t ec_d,			/*!< [in] число проективных координат */
	size_t ec_deep			/*!< [in] глубина стека эллиптической кривой */
	);

/*!	\brief Длина состояния

	Возвращается длина состояния (в октетах) высокоуровневой функции,
	которая работает на уровне стойкости l и имеет потребности в стеке deep.
	\pre l == 128 || l == 192 || l == 256.
	\return Длина состояния.
	\remark Состояние включает как локальные переменные, так и стек.
*/
size_t bakeEcStart_keep(
	size_t l,				/*!< [in] уровень стойкости */
	bake_ec_deep_i deep		/*!< [in] потребности в стековой памяти */
);

/*!	\brief Развертывание эллиптической кривой

	По долговременным параметрам params по адресу state формируется описание
	эллиптической кривой.
	\pre bignParamsCheck(params) == ERR_OK.
	\return ERR_OK, если кривая успешно развернута, и код ошибки в противном
	случае.
*/
err_t bakeEcStart(
	void* state,				/*!< [out] состояние */
	const bign_params* params	/*!< [in] долговременные параметры */
);


#ifdef __cplusplus
} /* extern "C" */
#endif

#endif /* __BEE2_BAKE_LCL_H */
