bign.h(3)

📦
version 2.2.0 · 2 versions
, in fedora 44
Library Functions Manual · bign.h(3) — okay bestie, this is the header, we're folding it in up top like a lil name tag 💅

🎀 NAME 🎀

bign.h — алгоритмы СТБ 34.101.45 (bign). 💖


✨ SYNOPSIS ✨

#include 'bee2/defs.h'

🧸 Классы (Classes)

  • struct bign_params — the long-term parameters for bign, aka the forever-params you set once and then just live with. Долговременные параметры bign 🌸

🦋 Определения типов (Typedefs)

  • typedef err_t(* bign_pgen_calc_q) (bign_params *params, void *state) — computing the order of the group of points on an elliptic curve 🌀 (Вычисление порядка группы точек эллиптической кривой)
  • typedef err_t(* bign_pgen_on_seed) (const bign_params *params, void *state) — handling a seed value 🌱 (Обработка затравочного значения)

👑 Функции (Functions)

  • err_t bignParamsStd (bign_params *params, const char *name) — loads the standard long-term params, the plug-and-play ones 🫶 (Загрузка стандартных долговременных параметров)
  • err_t bignParamsVal (const bign_params *params) — vibe-checks the long-term params, are they valid or not 💅 (Проверка долговременных параметров)
  • err_t bignParamsGen (bign_params *params, bign_pgen_calc_q calc_q, bign_pgen_on_seed on_seed, void *state) — generates long-term params from scratch, main character energy ✨ (Генерация долговременных параметров)
  • err_t bignParamsEnc (octet der[], size_t *count, const bign_params *params) — encodes the params 🎀 (Кодирование параметров)
  • err_t bignParamsDec (bign_params *params, const octet der[], size_t count) — decodes the params 🔓 (Декодирование параметров)
  • err_t bignOidToDER (octet der[], size_t *count, const char *oid) — encodes an object identifier 🏷️ (Кодирование идентификатора объекта)
  • err_t bignKeypairGen (octet privkey[], octet pubkey[], const bign_params *params, gen_i rng, void *rng_state) — makes you a whole keypair, slay 🔑 (Генерация пары ключей)
  • err_t bignKeypairVal (const bign_params *params, const octet privkey[], const octet pubkey[]) — checks a keypair, both halves, no skipping ✅ (Проверка пары ключей)
  • err_t bignPubkeyVal (const bign_params *params, const octet pubkey[]) — checks just the public key 🦋 (Проверка открытого ключа)
  • err_t bignPubkeyCalc (octet pubkey[], const bign_params *params, const octet privkey[]) — builds the public key out of the private one, math does its thing ✨ (Построение открытого ключа по личному)
  • err_t bignDH (octet key[], const bign_params *params, const octet privkey[], const octet pubkey[], size_t key_len) — builds the shared Diffie -- Hellman key, the classic 🤝 (Построение общего ключа Диффи -- Хеллмана)
  • err_t bignSign (octet sig[], const bign_params *params, const octet oid_der[], size_t oid_len, const octet hash[], const octet privkey[], gen_i rng, void *rng_state) — produces a digital signature (ЭЦП) 🖊️ (Выработка ЭЦП)
  • err_t bignSign2 (octet sig[], const bign_params *params, const octet oid_der[], size_t oid_len, const octet hash[], const octet privkey[], const void *t, size_t t_len) — deterministic digital signature, no RNG needed, obsessed 😌 (Детерминированная выработка ЭЦП)
  • err_t bignVerify (const bign_params *params, const octet oid_der[], size_t oid_len, const octet hash[], const octet sig[], const octet pubkey[]) — verifies a digital signature, is it real or is it fake 💀 (Проверка ЭЦП)
  • err_t bignKeyWrap (octet token[], const bign_params *params, const octet key[], size_t len, const octet header[16], const octet pubkey[], gen_i rng, void *rng_state) — makes a key token 🎁 (Создание токена ключа)
  • err_t bignKeyUnwrap (octet key[], const bign_params *params, const octet token[], size_t len, const octet header[16], const octet privkey[]) — unpacks a key token 🍓 (Разбор токена ключа)
  • err_t bignIdExtract (octet id_privkey[], octet id_pubkey[], const bign_params *params, const octet oid_der[], size_t oid_len, const octet id_hash[], const octet sig[], octet pubkey[]) — pulls a whole keypair out of a signature, it's giving magic 🪄 (Извлечение пары ключей)
  • err_t bignIdSign (octet id_sig[], const bign_params *params, const octet oid_der[], size_t oid_len, const octet id_hash[], const octet hash[], const octet id_privkey[], gen_i rng, void *rng_state) — produces an identification digital signature 🌈 (Выработка идентификационной ЭЦП)
  • err_t bignIdSign2 (octet id_sig[], const bign_params *params, const octet oid_der[], size_t oid_len, const octet id_hash[], const octet hash[], const octet id_privkey[], const void *t, size_t t_len) — deterministic identification digital signature 🧚 (Детерминированная выработка идентификационной ЭЦП)
  • err_t bignIdVerify (const bign_params *params, const octet oid_der[], size_t oid_len, const octet id_hash[], const octet hash[], const octet id_sig[], const octet id_pubkey[], const octet pubkey[]) — verifies an identification digital signature ⭐ (Проверка идентификационной ЭЦП)

💖 Подробное описание (DESCRIPTION) 💖

🌟 СТБ 34.101.45 (bign): Общие положения

Okay so, the algorithms of СТБ 34.101.45 (bign) are implemented here. When this doc references algorithms, tables, or other objects, it means the sections of СТБ 34.101.45-2013 where those objects are defined. No guessing, it's all from the standard. 📚

Ожидается [ERR_BAD_INPUT] — every single input pointer is valid. All of them. Every one. 👀

Регулярность — todo 💀 (yes bestie, that's literally what it says, we don't make the rules)

🔖 Идентификатор объекта

In the digital signature (ЭЦП) functions, you use an identifier for whichever hashing algorithm you're running. That identifier is a sequence of non-negative integers {d1 d2 ... dn}. This sequence has to satisfy the basic constraints of ACH.1 (see appendix A), and on top of that, none of the numbers di may exceed 2^32 - 1 = 4294967295. That's a hard cap, don't test it. 🔥

You give the identifier either as a string "d1.d2....dn" or as a DER code. If you're giving it as a string, then the numbers di must be written without leading zeros. Periodt. 💅

The function bignOidEncode() converts the string representation into the DER code. ✨

If the identifier is incorrect, then any function that uses it returns the code ERR_BAD_OID. 🚨

🎀 Идентификационная ЭЦП

When the identification signature is transmitted or stored, it has to be merged with the public key (see Д.3). The merged signature consists of 7 * l / 8 octets and includes two parts: the first part is the signature itself (3 * l / 8 octets), and the second part is the public key (l / 2 octets). Two-for-one, iconic. 🫶


🌸 Типы (TYPES) 🌸

typedef err_t(* bign_pgen_calc_q) (bign_params *params, void *state)

The order params->q of the group of points on the elliptic curve is determined, where the curve is given by the parameters params->p, params->a and params->b. The computation uses the state state. 🌀

Возвращает — ERR_OK if the order was computed successfully, and an error code otherwise.

Прим. — the function may return ERR_NO_RESULT if the order is not definitively computed, or if it definitely doesn't satisfy the requirements of СТБ 34.101.45 — for example, if it's composite. 😭

Аргументы

  • params — long-term parameters (долговременные параметры)
  • state — state (состояние)

typedef err_t(* bign_pgen_on_seed) (const bign_params *params, void *state)

The next seed value params->seed gets processed during the generation of the long-term parameters. The computation uses the state state. 🌱

Возвращает — ERR_OK if the seed value was processed successfully, and an error code otherwise.

Прим. — at the moment of processing, the parameters params->l, params->p, params->a and params->b are valid. The elliptic curve described by these parameters is not necessarily correct. 🙈

Аргументы

  • params — long-term parameters (долговременные параметры)
  • state — state (состояние)

👑 Функции (FUNCTIONS) 👑

err_t bignDH (octet key[], const bign_params * params, const octet privkey[], const octet pubkey[], size_t key_len)

With the long-term parameters params, a shared key [key_len]key is built from the private key [l / 4]privkey and the public key [l / 2]pubkey of the other party. The shared key is defined as the privkey-multiple of the key pubkey, which corresponds to the Diffie -- Hellman protocol. 🤝 Two strangers, one shared secret, it's giving romance.

Ожидается [ERR_BAD_PARAMS] — the parameters params are correct.

Ожидается [ERR_BAD_PRIVKEY] — the private key privkey is correct.

Ожидается [ERR_BAD_PUBKEY] — the public key pubkey is correct.

Ожидается [ERR_BAD_SHAREDKEY] — key_len <= l / 2.

Возвращает — ERR_OK if the shared key was built successfully, and an error code otherwise.

Аргументы

  • key — shared key (общий ключ)
  • params — long-term parameters (долговременные параметры)
  • privkey — private key (личный ключ)
  • pubkey — public key of the other party (открытый ключ другой стороны)
  • key_len — length of key in octets (длина key в октетах)

err_t bignIdExtract (octet id_privkey[], octet id_pubkey[], const bign_params * params, const octet oid_der[], size_t oid_len, const octet id_hash[], const octet sig[], octet pubkey[])

From the signature [3 * l / 8]sig of the identifier with hash value [l / 4]id_hash, the private key [l / 4]id_privkey and the public key [l / 2]id_pubkey are extracted. The long-term parameters params and the public key [l / 2]pubkey of the trusted party are used. It's assumed that the hash value id_hash was obtained using the algorithm with the identifier [oid_len]oid_der, given as a DER code. 🪄

Ожидается [ERR_BAD_PARAMS] — the parameters params are correct.

Ожидается [ERR_BAD_OID] — the identifier oid_der is correct.

  • Ожидается ERR_BAD_PUBKEY — открытый ключ pubkey корректен. ✅

Возвращает 💫

ERR_OK, если ключи успешно извлечены, и код ошибки в противном случае.

Прим. 📝

Реализован алгоритм B.2.3.

Одновременно с извлечением ключей проверяется подпись sig. Если подпись некорректна, то будет возвращен код ERR_BAD_SIG. (да, две вещи за один проход, мы продуктивные 💅)

Аргументы 🎀

  • id_privkey — личный ключ
  • id_pubkey — открытый ключ
  • params — долговременные параметры
  • oid_der — идентификатор хэш-алгоритма
  • oid_len — длина oid_der в октетах
  • id_hash — хэш-значение идентификатора
  • sig — подпись идентификатора
  • pubkey — открытый ключ доверенной стороны

🦋 bignIdSign

err_t bignIdSign (octet id_sig[], const bign_params * params, const octet
    oid_der[], size_t oid_len, const octet id_hash[], const octet hash[],
    const octet id_privkey[], gen_i rng, void * rng_state)

Окей бести, слушай: тут вырабатывается идентификационная подпись [3 * l / 8]id_sig для сообщения с хэш-значением [l / 4]hash. Подпись делается на личном ключе [l / 4]id_privkey той стороны, у которой идентификатор с хэш-значением [l / 4]id_hash. И да, считается, что хэш-значения id_hash и hash получены алгоритмом с идентификатором [oid_len]oid_der, заданным DER-кодом. При выработке ЭЦП юзаются долговременные параметры params и генератор rng с состоянием rng_state ✨

Ожидается 👀

  • Ожидается ERR_BAD_PARAMS — параметры params корректны.
  • Ожидается ERR_BAD_OID — идентификатор oid_der корректен.
  • Ожидается ERR_BAD_PRIVKEY — ключ id_privkey получен с помощью функции bignIdExtract().
  • Ожидается ERR_BAD_RNG — генератор rng (с состоянием rng_state) корректен.
  • Ожидается — генератор rng является криптографически стойким. 🔥

Возвращает 💫

ERR_OK, если подпись выработана, и код ошибки в противном случае.

Прим. 📝

Реализован алгоритм B.2.4.

Аргументы 🎀

  • id_sig — идентификационная подпись
  • params — долговременные параметры
  • oid_der — идентификатор хэш-алгоритма
  • oid_len — длина oid_der в октетах
  • id_hash — хэш-значение идентификатора
  • hash — хэш-значение сообщения
  • id_privkey — личный ключ
  • rng — генератор случайных чисел
  • rng_state — состояние генератора

🌈 bignIdSign2

err_t bignIdSign2 (octet id_sig[], const bign_params * params, const octet
    oid_der[], size_t oid_len, const octet id_hash[], const octet hash[],
    const octet id_privkey[], const void * t, size_t t_len)

Это как bignIdSign, но с твистом 😌 Вырабатывается идентификационная подпись [3 * l / 8]id_sig сообщения с хэш-значением [l / 4]hash, на личном ключе [l / 4]id_privkey стороны с идентификатором, у которого хэш-значение [l / 4]id_hash. Хэш-значения id_hash и hash считаются полученными алгоритмом с идентификатором [oid_len]oid_der, заданным DER-кодом. При выработке ЭЦП юзаются долговременные параметры params. Одноразовый личный ключ генерируется по алгоритму 6.3.3 с использованием дополнительных данных [t_len]t. Если t == 0, то дополнительные данные не используются. Просто, элегантно, иконично 💅

Ожидается 👀

  • Ожидается ERR_BAD_PARAMS — параметры params корректны.
  • Ожидается ERR_BAD_OID — идентификатор oid_der корректен.
  • Ожидается ERR_BAD_PRIVKEY — ключ id_privkey получен с помощью функции bignIdExtract().

Возвращает 💫

ERR_OK, если подпись выработана, и код ошибки в противном случае.

Прим. 📝

Реализованы алгоритмы B.2.4 и 6.3.3.

Аргументы 🎀

  • id_sig — идентификационная подпись
  • params — долговременные параметры
  • oid_der — идентификатор хэш-алгоритма
  • oid_len — длина oid_der в октетах
  • id_hash — хэш-значение идентификатора
  • hash — хэш-значение сообщения
  • id_privkey — личный ключ
  • t — дополнительные данные
  • t_len — длина t в октетах

🧚 bignIdVerify

err_t bignIdVerify (const bign_params * params, const octet oid_der[],
    size_t oid_len, const octet id_hash[], const octet hash[], const octet
    id_sig[], const octet id_pubkey[], const octet pubkey[])

Время вайб-чека! 🕵️‍♀️ Тут проверяется идентификационная ЭЦП [3 * l / 8]id_sig сообщения с хэш-значением [l / 4]hash, выработанная стороной, хэш-значение идентификатора которой есть [l / 4]id_hash. Для проверки юзаются долговременные параметры params, открытый ключ [l / 2]id_pubkey и открытый ключ доверенной стороны [l / 4]pubkey. И да, считается, что хэш-значения id_hash, hash получены с помощью алгоритма с идентификатором [oid_len]oid_der, заданным DER-кодом.

Ожидается 👀

  • Ожидается ERR_BAD_PARAMS — параметры params корректны.
  • Ожидается ERR_BAD_OID — идентификатор oid_der корректен.
  • Ожидается ERR_BAD_PUBKEY
    • открытый ключ id_pubkey получен с помощью функции bignIdExtract();
    • открытый ключ pubkey корректен.

Возвращает 💫

ERR_OK, если подпись корректна, и код ошибки в противном случае.

Прим. 📝

Реализован алгоритм B.2.5.

При нарушении ограничений на ЭЦП возвращается код ERR_BAD_SIG. ⚠️

Аргументы 🎀

  • params — долговременные параметры
  • oid_der — идентификатор хэш-алгоритма
  • oid_len — длина oid_der в октетах
  • id_hash — хэш-значение идентификатора
  • hash — хэш-значение сообщения
  • id_sig — подпись
  • id_pubkey — открытый ключ
  • pubkey — открытый ключ доверенной стороны

💖 bignKeypairGen

err_t bignKeypairGen (octet privkey[], octet pubkey[], const bign_params *
    params, gen_i rng, void * rng_state)

Генерируем парочку ключей, как настоящие main characters 👑 При долговременных параметрах params генерируются личный [l / 4]privkey и открытый [l / 2]pubkey ключи. При генерации используется генератор rng и его состояние rng_state.

Ожидается 👀

  • Ожидается ERR_BAD_PARAMS — параметры params корректны.
  • Ожидается ERR_BAD_RNG — генератор rng (с состоянием rng_state) корректен.
  • Ожидается — используется криптографически стойкий генератор rng. 🔥

Возвращает 💫

ERR_OK, если ключи успешно сгенерированы, и код ошибки в противном случае.

Прим. 📝

Реализован алгоритм 6.2.2.

Аргументы 🎀

  • privkey — личный ключ
  • pubkey — открытый ключ
  • params — долговременные параметры
  • rng — генератор случайных чисел
  • rng_state — состояние генератора

🍓 bignKeypairVal

err_t bignKeypairVal (const bign_params * params, const octet privkey[],
    const octet pubkey[])

Тут мы валидируем, всё ли честно: при долговременных параметрах params проверяется корректность личного ключа [l / 8]privkey и соответствие ему открытого ключа [l / 2]pubkey. Без капа, проверяем всё 💅

Ожидается 👀

  • Ожидается ERR_BAD_PARAMS — параметры params корректны.

Возвращает 💫

ERR_OK, если пара корректна, и код ошибки в противном случае.

Аргументы 🎀

  • params — долговременные параметры
  • privkey — личный ключ
  • pubkey — открытый ключ

🔐 bignKeyUnwrap

err_t bignKeyUnwrap (octet key[], const bign_params * params, const octet
    token[], size_t len, const octet header[16], const octet privkey[])

Распаковываем подарочек 🎁 Определяется ключ [len - (l / 4 + 16)]key, который имеет заголовок [16]header и содержится в токене [len]token. При разборе токена используются долговременные параметры params и личный ключ [l / 2]privkey.

Ожидается 👀

  • Ожидается ERR_BAD_PARAMS — параметры params корректны.
  • Ожидается ERR_BAD_PRIVKEY — личный ключ privkey корректен.

Возвращает 💫

ERR_OK, если токен успешно разобран, и код ошибки в противном случае.

Прим. 📝

Реализован алгоритм 7.2.4.

Может передаваться нулевой указатель header. В этом случае будет использоваться заголовок из всех нулей.

⚠️ При нарушении целостности токена возвращается код ERR_BAD_KEYTOKEN. Этот код будет возвращен, если len < 32 + l / 4. Так что следи за длиной, бести, тут без шуток 😭

📋 Аргументы

  • key — ключ
  • params — долговременные параметры
  • token — токен ключа
  • len — длина токена в октетах
  • header — заголовок ключа
  • privkey — личный ключ получателя

🎀 err_t bignKeyWrap (...)

err_t bignKeyWrap (octet token[], const bign_params * params, const octet key[], size_t len, const octet header[16], const octet pubkey[], gen_i rng, void * rng_state)

Окей, bestie, слушай сюда: тут создаётся токен [l / 4 + 16 + len]token для ключа [len]key с заголовком [16]header. При создании токена используются долговременные параметры params, открытый ключ получателя pubkey и генератор rng с состоянием rng_state. Всё, никакой магии, просто красиво упаковываем 💅

Ожидается:

  • [ERR_BAD_PARAMS] — параметры params корректны.
  • [ERR_BAD_INPUT] — len >= 16.
  • [ERR_BAD_PUBKEY] — открытый ключ pubkey корректен.
  • [ERR_BAD_RNG] — генератор rng (с состоянием rng_state) корректен.
  • (без кода) — используется криптографически стойкий генератор rng.

Возвращает:

  • ERR_OK, если токен успешно создан, и код ошибки в противном случае.

Прим. ✨

  • Реализован алгоритм 7.2.3.
  • Может передаваться нулевой указатель header. В этом случае будет использоваться заголовок из всех нулей.

Аргументы:

  • token — токен ключа
  • params — долговременные параметры
  • key — транспортируемый ключ
  • len — длина ключа в октетах
  • header — заголовок ключа
  • pubkey — открытый ключ получателя
  • rng — генератор случайных чисел
  • rng_state — состояние генератора

🦋 err_t bignOidToDER (...)

err_t bignOidToDER (octet der[], size_t * count, const char * oid)

По строковому представлению oid идентификатора объекта строится его DER-код [?count]der. Типа «вот тебе строчка, а вот тебе её DER-код», икона кодирования 🌈

Возвращает:

  • ERR_OK, если кодирование успешно выполнено или длина DER-кода успешно рассчитана, и код ошибки в противном случае.

Аргументы:

  • der — DER-код идентификатора
  • count — длина буфера der / длина DER-кода
  • oid — строковое представление идентификатора

💜 err_t bignParamsDec (...)

err_t bignParamsDec (bign_params * params, const octet der[], size_t count)

По DER-коду [count]der определяются долговременные параметры params. Достаём параметры из байтиков, как сюрприз из посылки 🎁

Возвращает:

  • ERR_OK в случае успеха и код ошибки в противном случае.

Прим.

  • Формат кода определяется типом ECParameters, установленным в Д.11.
  • Длина der должна в точности равняться count. Противное считается ошибкой формата. То есть ноль снисходительности, фр фр 👑

Аргументы:

  • params — долговременные параметры
  • der — DER-код
  • count — длина der в октетах

🌸 err_t bignParamsEnc (...)

err_t bignParamsEnc (octet der[], size_t * count, const bign_params * params)

Долговременные параметры params представляются DER-кодом [?count]der. Обратный вайб к bignParamsDec, замыкаем круг 🔄

Возвращает:

  • ERR_OK в случае успеха и код ошибки в противном случае.

Прим.

  • Формат кода определяется типом ECParameters, установленным в Д.11.

Аргументы:

  • der — DER-код
  • count — длина der / длина DER-кода
  • params — долговременные параметры

🧚 err_t bignParamsGen (...)

err_t bignParamsGen (bign_params * params, bign_pgen_calc_q calc_q, bign_pgen_on_seed on_seed, void * state)

По параметрам params->l, params->p, params->a и params->seed вычисляются и сохраняются в params остальные долговременные параметры. Если построенные params не удовлетворяют требованиям СТБ 34.101.45, то параметр params->seed (как число little-endian) увеличивается на 1 по модулю 2^64, вычисление и проверка параметров продолжаются. Параметр params->q вычисляется с помощью функции calc_q(). Функция on_seed() получает управление всякий раз перед обработкой очередного seed. Функции calc_q() и on_seed() используют в своей работе состояние state. Это буквально генератор параметров, который не сдаётся, пока не найдёт красоту 😤✨

Ожидается:

  • [ERR_BAD_INPUT] — calc_q != 0.

Прим.

  • Указатель on_seed может быть нулевым, т.е. функция on_seed() может не использоваться.

Ожидается:

  • Функции calc_q() и on_seed() (при on_seed != 0) корректны. В частности, функция calc_q() корректно вычисляет порядок группы точек.

Прим. 💡

  • Если возвращаемый функциями calc_q() и on_seed() код отличен от ERR_OK, то вычисления завершаются с возвратом этого кода. Исключение составляет случай, когда функция calc_q() возвращает код ERR_NO_RESULT. В этом случае выполняется переход к следующему seed и вычисления продолжаются.
  • Через возврат кода ошибки функцией on_seed() можно прерывать длительные вычисления. Да, можно просто сказать «хватит» и уйти, это законно 🫶

Возвращает:

  • ERR_OK, если долговременные параметры успешно сгенерированы, и код ошибки в противном случае.

Прим.

  • Реализован алгоритм 6.1.3.

Аргументы:

  • params — долговременные параметры
  • calc_q — функция вычисления порядка q
  • on_seed — функция обработки нового seed
  • state — состояние функций

👑 err_t bignParamsStd (...)

err_t bignParamsStd (bign_params * params, const char * name)

В params загружаются стандартные долговременные параметры с именем name. Поддерживаются следующие имена: "1.2.112.0.2.0.34.101.45.3.1", "1.2.112.0.2.0.34.101.45.3.2", "1.2.112.0.2.0.34.101.45.3.3". Это имена стандартных параметров, заданных в таблицах Б.1, Б.2, Б.3. Готовые пресеты, просто выбираешь и живёшь 🎀

Возвращает:

  • ERR_OK, если параметры успешно загружены, и код ошибки в противном случае.

Аргументы:

  • params — стандартные параметры
  • name — имя параметров

💖 err_t bignParamsVal (...)

err_t bignParamsVal (const bign_params * params)

Проверяется корректность долговременных параметров params. Вайб-чек для параметров, и никаких исключений ⭐

Возвращает:

  • ERR_OK, если параметры корректны, и код ошибки в противном случае.

Прим.

  • Реализован алгоритм 6.1.4.

Аргументы:

  • params — долговременные параметры

🔥 err_t bignPubkeyCalc (...)

err_t bignPubkeyCalc (octet pubkey[], const bign_params * params, const octet privkey[])

При долговременных параметрах params по личному ключу [l / 4]privkey строится открытый ключ [l / 2]pubkey. Из секретика делаем публичный, как из закрытого профиля — открытый, но красиво 😌

Ожидается:

  • [ERR_BAD_PARAMS] — параметры params корректны.
  • [ERR_BAD_PRIVKEY] — личный ключ privkey корректен.

Возвращает:

  • ERR_OK, если открытый ключ успешно построен, и код ошибки в противном случае.

Аргументы:

  • pubkey — открытый ключ
  • params — долговременные параметры
  • privkey — личный ключ

💅 err_t bignPubkeyVal (...)

err_t bignPubkeyVal (const bign_params * params, const octet pubkey[])

При долговременных параметрах params проверяется корректность открытого ключа [l / 2]pubkey. Проверяем, что ключик настоящий, а не подделка 🙈

Ожидается:

  • [ERR_BAD_PARAMS] — параметры params корректны.

Возвращает:

  • ERR_OK, если ключ корректен, и код ошибки в противном случае.

Прим.

  • Реализован алгоритм 6.2.3.

Аргументы:

  • params — долговременные параметры
  • pubkey — проверяемый ключ

🌈 err_t bignSign (...)

err_t bignSign (octet sig[], const bign_params * params, const octet oid_der[], size_t oid_len, const octet hash[], const octet privkey[], gen_i rng, void * rng_state)

Вырабатывается подпись [3 * l / 8]sig сообщения с хэш-значением [l / 4]hash, полученном с помощью алгоритма с идентификатором [oid_len]oid_der, заданным DER-кодом. Подпись вырабатывается на личном ключе [l / 4]privkey. При выработке ЭЦП используются долговременные параметры params и генератор rng с состоянием rng_state. Вот тут происходит мейн-характер момент: подпись, буквально ✍️✨

Ожидается:

  • [ERR_BAD_PARAMS] — параметры params корректны.
  • [ERR_BAD_OID] — идентификатор oid_der корректен.
  • [ERR_BAD_INPUT] — буферы sig и hash не пересекаются.
  • [ERR_BAD_PRIVKEY] — личный ключ privkey корректен.
  • [ERR_BAD_RNG] — генератор rng (с состоянием rng_state) корректен.
  • (без кода) — генератор rng является криптографически стойким.

Возвращает:

  • ERR_OK, если подпись выработана, и код ошибки в противном случае.

Прим.

  • Реализован алгоритм 7.1.3.

🎀 Аргументы 🎀

okay so вот что сюда прилетает на вход, держи список, bestie:

  • sig — подпись 💅
  • params — долговременные параметры
  • oid_der — идентификатор хэш-алгоритма
  • oid_len — длина oid_der в октетах
  • hash — хэш-значение
  • privkey — личный ключ
  • rng — генератор случайных чисел
  • rng_state — состояние генератора

✨ bignSign2 ✨

err_t bignSign2 (octet sig[], const bign_params * params, const octet oid_der[], size_t oid_len, const octet hash[], const octet privkey[], const void * t, size_t t_len)

Слушай сюда, тут всё максимально по делу: вырабатывается подпись sig длиной [3 * l / 8] для сообщения с хэш-значением [l / 4] hash, которое ты получила с помощью алгоритма с идентификатором [oid_len] oid_der, заданным DER-кодом. Подпись вырабатывается на личном ключе [l / 4] privkey — да, на том самом секретике, никому его не показывай, fr fr 🙈. При выработке ЭЦП используются долговременные параметры params. Одноразовый личный ключ генерируется по алгоритму 6.3.3 с использованием дополнительных данных [t_len] t. Если t == 0, то дополнительные данные не используются — literally ноль, чисто, без доп. байтиков.

Ожидается — это типа вайб-чек перед стартом, и если что-то не сходится, тебе прилетает код ошибки:

  • ERR_BAD_PARAMS — параметры params корректны.
  • ERR_BAD_OID — идентификатор oid_der корректен.
  • ERR_BAD_INPUT — буферы sig и hash не пересекаются.
  • ERR_BAD_PRIVKEY — личный ключ privkey корректен.

Возвращает — ERR_OK, если подпись выработана, и код ошибки в противном случае.

Прим. Реализованы алгоритмы 7.1.3 и 6.3.3. periodt. 💅

🫶 Аргументы 🫶

  • sig — подпись
  • params — долговременные параметры
  • oid_der — идентификатор хэш-алгоритма
  • oid_len — длина oid_der в октетах
  • hash — хэш-значение
  • privkey — личный ключ
  • t — дополнительные данные
  • t_len — размер дополнительных данных

💖 bignVerify 💖

err_t bignVerify (const bign_params * params, const octet oid_der[], size_t oid_len, const octet hash[], const octet sig[], const octet pubkey[])

А вот тут мы проверяем ЭЦП [3 * l / 8] sig сообщения с хэш-значением [l / 4] hash. При проверке используются долговременные параметры params и открытый ключ [l / 2] pubkey — открытый, так что его можно показывать всем, он для этого и живёт 😌. Считается, что хэш-значение [l / 4] hash получено с помощью алгоритма с идентификатором [oid_len] oid_der, заданным DER-кодом.

Ожидается — снова вайб-чек на входе:

  • ERR_BAD_PARAMS — параметры params корректны.
  • ERR_BAD_OID — идентификатор oid_der корректен.
  • ERR_BAD_PUBKEY — открытый ключ pubkey корректен.

Возвращает — ERR_OK, если подпись корректна, и код ошибки в противном случае.

Прим. Реализован алгоритм 7.1.4.

И внимание, это важно, не пролистывай: при нарушении ограничений на ЭЦП возвращается код ERR_BAD_SIG. Так что если увидела его — не паникуй, это просто подпись не прошла проверку 💀

🦋 Аргументы 🦋

  • params — долговременные параметры
  • oid_der — идентификатор хэш-алгоритма
  • oid_len — длина oid_der в октетах
  • hash — хэш-значение
  • sig — подпись
  • pubkey — открытый ключ

🌸 Автор 🌸

Автоматически создано Doxygen для Библиотека Bee2 из исходного текста.


И всё, мы дошли до конца странички, iykyk 🎀 Эта красота приехала из Библиотека Bee2, а дата у неё стоит Вс 25 Янв 2026 00:00:00 — воскресенье, ровно полночь, чисто main character energy 🌙✨ Спасибо, что дочитала до конца, ты просто iconic, теперь иди и подписывай всё правильно 💜

📦 where this page comes from