Skip to content

Commit

Permalink
Add btokCVCLen
Browse files Browse the repository at this point in the history
  • Loading branch information
agievich committed Oct 31, 2022
1 parent b791e2f commit 33c9d94
Show file tree
Hide file tree
Showing 7 changed files with 58 additions and 21 deletions.
9 changes: 4 additions & 5 deletions cmd/cmd.h
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
\brief Command-line interface to Bee2
\project bee2/cmd
\created 2022.06.09
\version 2022.10.28
\version 2022.10.31
\license This program is released under the GNU General Public License
version 3. See Copyright Notices in bee2/info.h.
*******************************************************************************
Expand Down Expand Up @@ -421,15 +421,14 @@ err_t cmdCVCPrint(btok_cvc_t* cvc);
*******************************************************************************
ЭЦП
ЭЦП может сопровождаться цепочкой CV-сертификатов. Первым в цепочке идет
сертификат подписанта. Каждый следующий сертификат -- это сертификат
ЭЦП может сопровождаться (обратной) цепочкой CV-сертификатов. Первым в цепочке
идет сертификат подписанта. Каждый следующий сертификат -- это сертификат
удостоверяющего центра, выпустившего предыдущий сертификат.
Цепочка сертификатов подписывается вместе с содержимым целевого файла.
При этом смена сертификата подписанта в цепочке сделает подпись
недействительной, даже если открытый ключ будет повторен в двух сертификатах
(см. описание угроз в RFC5035 и описание атрибута SigningCertificateV2
в этом же документе).
(см. RFC5035: описание угроз, описание атрибута SigningCertificateV2).
Формат ЭЦП:
\code
Expand Down
22 changes: 12 additions & 10 deletions cmd/core/cmd_sig.c
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
\brief Command-line interface to Bee2: signing files
\project bee2/cmd
\created 2022.08.20
\version 2022.10.27
\version 2022.10.31
\license This program is released under the GNU General Public License
version 3. See Copyright Notices in bee2/info.h.
*******************************************************************************
Expand Down Expand Up @@ -64,7 +64,7 @@ static bool_t cmdSigSeemsValid(const cmd_sig_t* sig)
// проверить сертификаты
for (certs_len = sig->certs_len, cert = sig->certs; certs_len; )
{
cert_len = derDec2(0, 0, cert, certs_len, 0x7F21);
cert_len = btokCVCLen(cert, certs_len);
if (cert_len == SIZE_MAX)
return FALSE;
cert += cert_len, certs_len -= cert_len;
Expand Down Expand Up @@ -346,12 +346,12 @@ static err_t cmdSigCertsVal(const cmd_sig_t* sig)
return ERR_OK;
// найти и разобрать последний сертификат
certs_len = sig->certs_len, certa = sig->certs;
certa_len = derDec2(0, 0, certa, certs_len, 0x7F21);
certa_len = btokCVCLen(certa, certs_len);
ASSERT(certa_len != SIZE_MAX);
while (certs_len > certa_len)
{
certa += certa_len;
certa_len = derDec2(0, 0, certa, certs_len, 0x7F21);
certa_len = btokCVCLen(certa, certs_len);
ASSERT(certa_len != SIZE_MAX);
certs_len -= certa_len;
}
Expand All @@ -362,12 +362,12 @@ static err_t cmdSigCertsVal(const cmd_sig_t* sig)
{
// определить сертификат эмитента
certs_len = sig->certs_len, cert = sig->certs;
cert_len = derDec2(0, 0, cert, certs_len, 0x7F21);
cert_len = btokCVCLen(cert, certs_len);
ASSERT(cert_len != SIZE_MAX);
while (cert + cert_len < certa)
{
cert += cert_len;
cert_len = derDec2(0, 0, cert, certs_len, 0x7F21);
cert_len = btokCVCLen(cert, certs_len);
ASSERT(cert_len != SIZE_MAX);
certs_len -= cert_len;
}
Expand All @@ -393,7 +393,7 @@ static err_t cmdSigCertsVal2(const cmd_sig_t* sig, const octet anchor[],
// один из сертификатов совпадает с anchor?
for (certs_len = sig->certs_len, cert = sig->certs; certs_len; )
{
cert_len = derDec2(0, 0, cert, certs_len, 0x7F21);
cert_len = btokCVCLen(cert, certs_len);
if (cert_len == SIZE_MAX)
return ERR_BAD_CERT;
if (cert_len == anchor_len && memEq(cert, anchor, cert_len))
Expand Down Expand Up @@ -458,7 +458,7 @@ static err_t cmdSigCertsGet(btok_cvc_t* cvc, size_t* cert_len,
if (offset >= sig->certs_len)
return ERR_BAD_INPUT;
// выделить сертификат
len = derDec2(0, 0, sig->certs + offset, sig->certs_len - offset, 0x7F21);
len = btokCVCLen(sig->certs + offset, sig->certs_len - offset);
code = len != SIZE_MAX ? ERR_OK : ERR_BAD_CERT;
ERR_CALL_CHECK(code);
// возвратить длину
Expand All @@ -484,7 +484,7 @@ static err_t cmdSigCertsMatch(const cmd_sig_t* sig, const octet privkey[],
if (!sig->certs_len)
return ERR_OK;
// выделить первый сертификат
cert_len = derDec2(0, 0, sig->certs, sig->certs_len, 0x7F21);
cert_len = btokCVCLen(sig->certs, sig->certs_len);
code = cert_len != SIZE_MAX ? ERR_OK : ERR_BAD_CERT;
ERR_CALL_CHECK(code);
// проверить соответствие
Expand Down Expand Up @@ -761,10 +761,12 @@ err_t cmdSigVerify2(const char* file, const char* sig_file,
/*
*******************************************************************************
Самопроверка
\thanks Gregory Pakosz [https://github.com/gpakosz/whereami]
*******************************************************************************
*/

extern int wai_getExecutablePath(char*, int, int*);
#include "whereami.h"

err_t cmdSigSelfVerify(const octet pubkey[], size_t pubkey_len)
{
Expand Down
7 changes: 7 additions & 0 deletions cmd/core/whereami.c
Original file line number Diff line number Diff line change
Expand Up @@ -68,7 +68,14 @@ extern "C" {
#if defined(_MSC_VER)
#pragma warning(pop)
#endif
#if (MSC_VER >= 1800)
#include <stdbool.h>
#else
#define bool int
#define false 0
#define true 1
#endif


static int WAI_PREFIX(getModulePath_)(HMODULE module, char* out, int capacity, int* dirname_length)
{
Expand Down
15 changes: 14 additions & 1 deletion include/bee2/crypto/btok.h
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
\brief STB 34.101.79 (btok): cryptographic tokens
\project bee2 [cryptographic library]
\created 2022.07.04
\version 2022.10.21
\version 2022.10.31
\license This program is released under the GNU General Public License
version 3. See Copyright Notices in bee2/info.h.
*******************************************************************************
Expand Down Expand Up @@ -205,6 +205,19 @@ err_t btokCVCIss(
size_t privkeya_len /*!< [in] длина privkeya в октетах */
);

/*! \brief Точная длина CV-сертификата
Определяется точная длина CV-сертификата, размещенного в префиксе
DER-кода [count]der.
\return SIZE_MAX в случае ошибки и длина сертификата в противном
случае.
\remark Корректность CV-сертификата сертификата не проверяется.
*/
size_t btokCVCLen(
const octet der[], /*!< [in] DER-код */
size_t count /*!< [in] длина privkey в октетах */
);

/*! \brief Проверка CV-сертификата
Проверяется корректность CV-сертификата [cert_len]cert на дату date,
Expand Down
16 changes: 14 additions & 2 deletions src/crypto/btok/btok_cvc.c
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
\brief STB 34.101.79 (btok): CV certificates
\project bee2 [cryptographic library]
\created 2022.07.04
\version 2022.07.18
\version 2022.10.31
\license This program is released under the GNU General Public License
version 3. See Copyright Notices in bee2/info.h.
*******************************************************************************
Expand Down Expand Up @@ -589,6 +589,19 @@ err_t btokCVCIss(octet cert[], size_t* cert_len, btok_cvc_t* cvc,
return code;
}

/*
*******************************************************************************
Точная длина CV-сертификата
*******************************************************************************
*/

size_t btokCVCLen(const octet der[], size_t count)
{
if (!memIsValid(der, count))
return SIZE_MAX;
return derDec2(0, 0, der, count, 0x7F21);
}

/*
*******************************************************************************
Проверка CV-сертификата
Expand Down Expand Up @@ -696,4 +709,3 @@ err_t btokCVCMatch(const octet cert[], size_t cert_len, const octet privkey[],
blobClose(cvc);
return code;
}

5 changes: 4 additions & 1 deletion test/crypto/btok_test.c
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
\brief Tests for STB 34.101.79 (btok) helpers
\project bee2/test
\created 2022.07.07
\version 2022.07.18
\version 2022.10.31
\license This program is released under the GNU General Public License
version 3. See Copyright Notices in bee2/info.h.
*******************************************************************************
Expand Down Expand Up @@ -71,6 +71,9 @@ static bool_t btokCVCTest()
btokCVCUnwrap(cvc1, cert0, cert0_len, cvc0->pubkey,
cvc0->pubkey_len) != ERR_OK ||
!memEq(cvc0, cvc1, sizeof(btok_cvc_t)) ||
btokCVCLen(cert0, cert0_len) != cert0_len ||
btokCVCLen(cert0, cert0_len + 1) != cert0_len ||
btokCVCLen(cert0, cert0_len - 1) != SIZE_MAX ||
btokCVCMatch(cert0, cert0_len, privkey0, 64) != ERR_OK)
return FALSE;
// составить и проверить cvc1
Expand Down
5 changes: 3 additions & 2 deletions win/bee2.def
Original file line number Diff line number Diff line change
Expand Up @@ -267,5 +267,6 @@ EXPORTS
btokCVCWrap @1503
btokCVCUnwrap @1504
btokCVCIss @1505
btokCVCVal @1506
btokCVCVal2 @1507
btokCVCLen @1506
btokCVCVal @1507
btokCVCVal2 @1508

0 comments on commit 33c9d94

Please sign in to comment.