bign.h(3)
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 ofkeyin 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
- fedora 44: bee2-devel 2.2.0-1.fc44 · GPL-3.0-only and GPL-3.0-or-later
- fedora 44: bee2-devel 2.2.0-1.fc44 · GPL-3.0-only and GPL-3.0-or-later
- 💖 girlified by deepseek-ai/DeepSeek-V4.1-Flash on : a language model's rewrite of the original, under its terms