Для проекта, над которым я работаю, мне нужно внедрить ECDSA по кривой NIST P-384 (AKA secp384r1
). Что бы это ни стоило, выбор кривой в данном конкретном случае находится вне моего контроля.
Хотя у меня уже есть работающая реализация, и это (пока) всего лишь небольшой проект, мне было интересно, как я могу позаботиться об этом в большинстве случаев. эффективный путь, особенно для подписывающей части.
Примерный список пожеланий:
- Я хочу сделать серьезную попытку защититься от утечек из сторонних каналов и тайминга.
- Поскольку меня интересуют только кривая P-384 и ECDSA, мне нужна кодовая база с относительно небольшим размером (также потому, что мне нужно будет предоставить привязки для кода, отличного от C). Тем не менее, оптимизации для P384, безусловно, приветствуются.
- Я хотел бы использовать детерминированный стиль RFC 6979. $к$ значения (или какая-либо другая детерминированная схема вывода nonce).
- Схема, которую я реализую, также требует поддержки точечного сжатия.
Я могу справиться с 3 и 4 самостоятельно, если кодовая база поддается модификации.
После некоторого осмотра, вот что я нашел:
- OpenSSL (и его ответвления, такие как LibreSSL/BoringSSL/...): очевидный выбор, но громоздкий, и я также не являюсь поклонником причудливых соглашений о вызовах OpenSSL.
- Android включает симпатичная минималистичная реализация P-256. Я не уверен, насколько это безопасно конкретный один есть, но это хороший пример того, что я ищу (замена P-256 на P-384).
- BearSSL Томаса Порнина имеет переносимую, но с постоянным временем (насколько это возможно) реализацию P-384 и выглядит достаточно простой, чтобы исключить функциональность, которая мне не нужна. Похоже, что он не использует никаких оптимизаций для конкретных кривых, но уже использует детерминированные $к$ значения из коробки.
Очевидно, я бы предпочел избежать необходимости развертывания собственной реализации. Прямо сейчас я испытываю искушение пойти по пути «разборки BearSSL», но я хотел спросить, есть ли что-то еще по принципу plug-and-play, или есть ли какие-то проблемы, которые я пропустил. Спасибо!