Skip to content

Commit

Permalink
Start btok/bauth
Browse files Browse the repository at this point in the history
  • Loading branch information
agievich committed Nov 3, 2022
1 parent 33def66 commit 615bcce
Show file tree
Hide file tree
Showing 8 changed files with 1,037 additions and 10 deletions.
16 changes: 8 additions & 8 deletions AUTHORS.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,29 +4,29 @@ Credits
Developement lead
-----------------

- Sergey Agievich [agievich@{bsu.by|gmail.com}]
- Sergey Agievich

Authors
-------

- Vlad Semenov [[email protected]]
- core/der, crypto/bash, crypto/bpki
- Vlad Semenov
- core/der, crypto/bash, crypto/bpki, crypto/btok
- code review
- Stanislav Poruchnik [[email protected]]
- Stanislav Poruchnik
- SAFE(math/zz)

Contributors*
------------

- Oleg Solovey [[email protected]]
- Oleg Solovey
- code review
- Michael Koypish [[email protected]]
- Michael Koypish
- code review
- Stanislav Lipnickii [[email protected]]
- Stanislav Lipnickii
- static analysis
- Nastya Kozlovskaya
- logo
- Alexander Usikov [https://github.com/relonger]
- Alexander Usikov
- code review
- Mikhail Novik
- doc review
Expand Down
178 changes: 178 additions & 0 deletions include/bee2/crypto/btok.h
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ version 3. See Copyright Notices in bee2/info.h.

#include "bee2/defs.h"
#include "bee2/core/apdu.h"
#include "bee2/crypto/bake.h"

/*!
*******************************************************************************
Expand Down Expand Up @@ -441,6 +442,183 @@ err_t btokSMRespUnwrap(
void* state /*!< [in/out] состояние SM */
);

/*!
*******************************************************************************
\file btok.h
\section btok-bauth Протокол BAUTH
*******************************************************************************
*/

/*! \brief Длина состояния функций BAUTHct
Возвращается длина состояния (в октетах) функций
криптографического токена протокола BAUTH.
\return Длина состояния.
*/
size_t btokBAUTHct_keep(
size_t l /*!< [in] уровень стойкости */
);

/*! \brief Инициализация криптографическим токеном протокола BAUTH
По параметрам params, настройкам settings, личному ключу [l / 4]privkey
и сертификату cert соответствующего открытого ключа в state формируются
структуры данных, необходимые для выполнения протокола BAUTH.
\pre По адресу state зарезервировано btokBAUTH_keep() октетов.
\expect{ERR_BAD_PARAMS} Параметры params корректны.
\expect{ERR_BAD_INPUT} settings->kca == TRUE && settings->kcb == TRUE.
\expect{ERR_BAD_INPUT} Указатель settings->helloa нулевой, либо буфер
[settings->helloa_len]settings->helloa корректен. Аналогичное требование
касается полей settings->hellob, settings->hellob_len.
\expect{ERR_BAD_RNG} Генератор settings->rng (с состоянием
settings->rng_state) корректен.
\expect Генератор settings->rng является криптографически стойким.
\expect{ERR_BAD_CERT} Сертификат cert корректен.
\expect Ключ privkey и сертификат cert согласованы. Если согласование
нарушено, то протокол будет завершен с ошибкой.
\return ERR_OK, если инициализация успешно выполнена, и код ошибки
в противном случае.
*/
err_t btokBAUTHctStart(
void* state, /*!< [out] состояние */
const bign_params* params, /*!< [in] долговременные параметры */
const bake_settings* settings, /*!< [in] настройки */
const octet privkey[], /*!< [in] личный ключ */
const bake_cert* cert /*!< [in] сертификат */
);

/*! \brief Шаг 2 протокола BAUTH
Выполняется шаг 2 протокола BAUTH с состоянием state. Криптографический
токен формирует сообщение M1 = [5 l / 8 + 16]out.
\expect btokBAUTHctStart() < btokBAUTHctStep2().
\return ERR_OK, если шаг успешно выполнен, и код ошибки в противном случае.
\remark Приветственное сообщение токена в M1 не передаются.
*/
err_t btokBAUTHctStep2(
octet out[], /*!< [out] выходное сообщение M1 */
const bake_cert* cert_term, /*!< [in] сертификат терминала */
void* state /*!< [in/out] состояние */
);

/*! \brief Шаг 4 протокола BAUTH
Выполняется шаг 4 протокола BAUTH с состоянием state. Криптографический
токен обрабатывает сообщение M2 = [8 + l / 8]in и формирует сообщение
M3 = [l / 4 + cert->len + 8]out.
\expect btokBAUTHctStep2() < btokBAUTHctStep4().
\expect btokBAUTHtermStep3() << btokBAUTHctStep4().
\return ERR_OK, если шаг успешно выполнен, и код ошибки в противном случае.
*/
err_t btokBAUTHctStep4(
octet out[], /*!< [out] выходное сообщение M3 */
const octet in[], /*!< [in] входное сообщение M2 */
void* state /*!< [in/out] состояние */
);

/*! \brief Извлечение ключа протокола BAUTH
Определяется общий секретный ключ key, полученный с помощью протокола BAUTH
с состоянием state.
\expect btokBAUTHctStep4() < btokBAUTHctStepG().
\return ERR_OK, если шаг успешно выполнен, и код ошибки в противном случае.
*/
err_t btokBAUTHctStepG(
octet key[32], /*!< [out] общий ключ */
void* state /*!< [in/out] состояние */
);

/*
*******************************************************************************
Функции терминала
*******************************************************************************
*/

/*! \brief Длина состояния функций BAUTHterm
Возвращается длина состояния (в октетах) функций терминала
протокола BAUTH.
\return Длина состояния.
*/
size_t btokBAUTHterm_keep(
size_t l /*!< [in] уровень стойкости */
);

/*! \brief Инициализация криптографическим токеном протокола BAUTH
По параметрам params, настройкам settings, личному ключу [l / 4]privkey
и сертификату cert соответствующего открытого ключа в state формируются
структуры данных, необходимые для выполнения протокола BAUTH.
\pre По адресу state зарезервировано btokBAUTH_keep() октетов.
\expect{ERR_BAD_PARAMS} Параметры params корректны.
\expect{ERR_BAD_INPUT} settings->kca == TRUE && settings->kcb == TRUE.
\expect{ERR_BAD_INPUT} Указатель settings->helloa нулевой, либо буфер
[settings->helloa_len]settings->helloa корректен. Аналогичное требование
касается полей settings->hellob, settings->hellob_len.
\expect{ERR_BAD_RNG} Генератор settings->rng (с состоянием
settings->rng_state) корректен.
\expect Генератор settings->rng является криптографически стойким.
\expect{ERR_BAD_CERT} Сертификат cert корректен.
\expect Ключ privkey и сертификат cert согласованы. Если согласование
нарушено, то протокол будет завершен с ошибкой.
\return ERR_OK, если инициализация успешно выполнена, и код ошибки
в противном случае.
*/
err_t btokBAUTHtermStart(
void* state, /*!< [out] состояние */
const bign_params* params, /*!< [in] долговременные параметры */
const bake_settings* settings, /*!< [in] настройки */
const octet privkey[], /*!< [in] личный ключ */
const bake_cert* cert /*!< [in] сертификат */
);

/*! \brief Шаг 3 протокола BAUTH
Выполняется шаг 3 протокола BAUTH с состоянием state. Терминал
обрабатывает сообщение M1 = [5 l / 8 + 16]in и формирует сообщение
M2 = [8 + l / 8]out.
\expect btokBAUTHtermStart() < btokBAUTHtermStep3().
\expect btokBAUTHctStep2() << btokBAUTHtermStep3().
\return ERR_OK, если шаг успешно выполнен, и код ошибки в противном случае.
*/
err_t btokBAUTHtermStep3(
octet out[], /*!< [out] выходное сообщение M2 */
const octet in[], /*!< [in] входное сообщение M1 */
void* state /*!< [in/out] состояние */
);

/*! \brief Шаг 5 протокола BAUTH
Выполняется шаг 5 протокола BAUTH с состоянием state. Терминал
обрабатывает сообщение M4 = [in_len]in. Терминал проверяет присланный
в M4 сертификат криптографического токена с помощью функции val_ct.
\expect btokBAUTHtermStep3() < btokBAUTHtermStep6().
\expect btokBAUTHctStep4() << btokBAUTHtermStep5().
\return ERR_OK, если шаг успешно выполнен, и код ошибки в противном случае.
*/
err_t btokBAUTHtermStep5(
const octet in[], /*!< [in] входное сообщение M3 */
size_t in_len, /*!< [in] длина in */
bake_certval_i val_ct, /*!< [in] функция проверки сертификата криптографического токена */
void* state /*!< [in/out] состояние */
);

/*! \brief Извлечение ключа протокола BAUTH
Определяется общий секретный ключ key, полученный с помощью протокола BAUTH
с состоянием state.
\expect Если КТ аутентифицируется перед терминалом, то
btokBAUTHtermStep5() < btokBAUTHtermStepG(), иначе
btokBAUTHtermStep3() < btokBAUTHtermStepG().
\return ERR_OK, если шаг успешно выполнен, и код ошибки в противном случае.
*/
err_t btokBAUTHtermStepG(
octet key[32], /*!< [out] общий ключ */
void* state /*!< [in/out] состояние */
);


#ifdef __cplusplus
} /* extern "C" */
#endif
Expand Down
1 change: 1 addition & 0 deletions src/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,7 @@ set(src
crypto/bpki.c
crypto/botp.c
crypto/brng.c
crypto/btok/btok_bauth.c
crypto/btok/btok_cvc.c
crypto/btok/btok_pwd.c
crypto/btok/btok_sm.c
Expand Down
Loading

0 comments on commit 615bcce

Please sign in to comment.