Рейтинг:1

Как использовать тестовые векторы ECDSA?

флаг gs

Я хотел бы проверить свою систему, запустив тестовые векторы ECDSA NIST, но я не получаю ожидаемых результатов. Я могу рассчитать сигнатуру, но это неправильно или, по крайней мере, компоненты "r" и "s" содержат значения, отличные от значений в nist векторах. Что я делаю неправильно?

Тестовые векторы: NIST: FIPS 186-4 ECDSA - 186-3ecdsasiggencomponenttestvectors.zip

#include <mbedtls/ecdsa.h>
#include <mbedtls/ecp.h>
#include <mbedtls/bignum.h>
#include <mbedtls/entropy.h>
#include <mbedtls/ctr_drbg.h>

//Все проверки ошибок удалены

//Первый из [P-256,SHA-256]-векторов
uint8_t ecc_d_p256[] = "\x51\x9b\x42...";
uint8_t ecc_hash_p256[] = "\x44\xac\xf6...":

const char *pers = "тест";
mbedtls_mpi г, с, д;
группа mbedtls_ecp_group;
mbedtls_ctr_drbg_context ctr_drbg;
mbedtls_entropy_context mbedtls_entropy;

//В этом
mbedtls_mpi_init(&r);
mbedtls_mpi_init(&s);
mbedtls_mpi_init(&d);
mbedtls_ecp_group_init(&grp);
mbedtls_ctr_drbg_init(&ctr_drbg);
mbedtls_entropy_init(&mbedtls_entropy);

//Настройка значений
mbedtls_ctr_drbg_seed(&ctr_drbg, mbedtls_entropy_func, &mbedtls_entropy, чел, 4);
mbedtls_mpi_read_binary(&d, ecc_d_p256, (sizeof(ecc_d_p256)-1));
mbedtls_ecp_group_load(&grp, MBEDTLS_ECP_DP_SECP256R1); 

//Подписать
mbedtls_ecdsa_sign_det_ext(&grp, &r, &s, &d,
                           ecc_hash_p256, sizeof(ecc_hash_p256)-1,
                           MBEDTLS_MD_SHA256,
                           mbedtls_ctr_drbg_random,
                           &ot_mbedtls_ctr_drbg);

//Вывод
//"r" и "s" содержат 32-байтовые выходы, но не "правильные"
Maarten Bodewes avatar
флаг in
Если вы тестируете внутреннюю реализацию, вы, несомненно, сможете протестировать ее, предоставив рандомизированные значения в качестве входных данных. Если вы не можете сделать это из API, то я бы сказал, что, к сожалению, вы не можете проверить его напрямую на тестовых векторах.
kelalaka avatar
флаг in
Жиль прав, вы используете детерминированную ECDSA, тестовые векторы есть в [RFC 6979, приложение-A.2] (https://datatracker.ietf.org/doc/html/rfc6979#appendix-A.2)
Kris Kwiatkowski avatar
флаг fr
Тестовые векторы из FIPS CAVP не поддерживают детерминированный режим ECDSA. Детерминированный ECDSA теперь поддерживается тестовыми векторами, предоставленными ACVP NIST. Стандартизация детерминированного режима разработана в FIPS 186-5 (https://nvlpubs.nist.gov/nistpubs/FIPS/NIST.FIPS.186-5-draft.pdf, см. 6.3.2). Вам нужно будет подключить свою реализацию к серверу ACVP, чтобы протестировать ее. Подробное описание структуры тестового вектора можно найти здесь: https://pages.nist.gov/ACVP/draft-fussell-acvp-ecdsa.html
Kris Kwiatkowski avatar
флаг fr
Один из способов получить эти векторы от ACVP — использовать acvpproxy. https://github.com/smuellerDD/acvpproxy
Рейтинг:2
флаг cn

Существует два варианта ECDSA: рандомизированный или детерминированный. Расчет подписи включает число $к$ который никогда не должен повторяться для разных сообщений с одним и тем же ключом. Есть два способа реализовать это: создание $к$ случайным образом или генерация $к$ детерминированным образом из ключа и сообщения. (Здесь я опускаю детали, а просто сосредоточусь на том, что имеет отношение к этому вопросу.) Два варианта создают совместимые подписи: невозможно сказать, какой вариант использовался для создания данной подписи. (Конечно, вы можете сказать это, попросив реализацию дважды подписать одно и то же сообщение и сравнив результаты.)

Первоначальное определение ECDSA рассматривало только рандомизированный вариант, и это единственный вариант, разрешенный NIST на момент публикации. ФИПС 186-4 (см. §6.3 и §6.4). RFC 6979 является спецификацией для детерминированного варианта.

Тестовые векторы NIST были созданы с использованием рандомизированного ECDSA. Следствием использования рандомизированного алгоритма является то, что для него не может быть тестов с известным ответом. Каждый раз, когда вы запускаете вычисление подписи, вы получаете другой результат. Все, что вы можете сделать для тестирования, — это проверить, является ли результат вычисления подписи действительной подписью, а не то, что это определенная последовательность байтов.

mbedtls_ecdsa_sign_det_ext реализует детерминированный ECDSA. Вы можете использовать тесты с известным ответом для детерминированного ECDSA. Но NIST не предоставляет для него тестовые векторы, поскольку NIST не стандартизирует детерминированную ECDSA.

Если вы немного растянете это, вы можете сказать, что возможны тесты с известным ответом, если вы полностью укажете, как алгоритм использует выходные данные генератора случайных чисел. Но с теоретической точки зрения вы сейчас тестируете детерминистический алгоритм, который принимает некоторые входные данные, которые в реальном мире должны исходить от генератора случайных чисел. И с практической точки зрения, в реальной реализации не всегда возможно заменить генератор случайных чисел для тестирования. И в любом случае FIPS 184-4 допускает некоторые вариации в том, как выходные данные генератора случайных чисел потребляются при генерации $к$ для подписи ECDSA.

kelalaka avatar
флаг in
Хороший улов о дет. Я хочу добавить, что NIST предоставляет значения $k$, чтобы можно было заменить случайные $k$ заданными $k$, чтобы они могли видеть, что их алгоритм работает, а затем заменить этот код случайно сгенерированными $k$. Кроме того, в RFC 6979 Томас Порнин также предоставляет тестовые векторы.
KaljaTolkki avatar
флаг gs
Спасибо за отличный ответ @Gilles «ТАК, перестань быть злым»! Также хочу сказать спасибо всем участникам этой темы за помощь! Я не реализую алгоритм и не знаю, могу ли я предоставить значение «k» без каких-либо изменений реализации. Для меня достаточно тестовых векторов RFC 6979. Я смог проверить свою трубу!

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.