Ваш сертификат содержит открытый ключ, P-256 или secp256r1 или prime256v1, который вы можете увидеть здесь. Однако ключ находится в несжатом формате (начиная с байта 04
а затем 64 случайных байта), а параметры домена задаются с помощью OID с кривой, упомянутой выше. Таким образом, единственными координатами являются координаты открытого ключа, и это всегда одни и те же 1 + 64 байта; там нет проблем.
Так что, вероятно, вы говорите о R и S, как упоминаете в вопросе. Однако R — случайное число, а S — соответствующая рандомизированная подпись, а это означает, что это не координаты.
Теперь кривая не указана; это указано в сертификате эмитента, на который ссылается этот сертификат. Однако мы можем с уверенностью предположить, что это та самая кривая, о которой мы говорим. Конечно, если вы строите верификатор, то вам должен получить кривую и открытый ключ из сертификата эмитента.
Как вы можете видеть в последней части сертификата:
БИТОВАЯ СТРОКА (568 бит) 0011000001000101000000100010000000000000101000111011101011001100001001…
ПОСЛЕДОВАТЕЛЬНОСТЬ (2 элемента)
ЦЕЛОЕ ЧИСЛО (248 бит) 289285300410612710111232441046660521562717594643885711748150025403073…
ЦЕЛОЕ ЧИСЛО (256 бит) 1104268754670564871921027255657571260094376165878172031675520861809130…
Случайное значение составляет 248 бит, а подпись — 256 бит. Эти значения просто должны быть меньше размера поля. Это означает, что динамическое кодирование длины этих целых чисел со знаком, прямым порядком байтов и порядком байтов может различаться. Если у вас плохой код, то в этом случае компонент R может быть меньше, чем вы ожидаете; если бы вы просто предположили 256 бит, у вас были бы проблемы.
Что вам нужно сделать, так это убедиться, что ваше программное обеспечение будет интерпретировать эти числа, если они закодированы как 1 байт, как 33 байта (включая 00
байт заполнения слева) или любого размера между ними. После этого вам, возможно, придется перекодировать их как 32 + 32 = 64 байта, чтобы проверка подписи заработала.
Или, конечно, вы можете просто использовать программное обеспечение, которое проверяет формат подписи ANS X9.62. Или используйте библиотеку, которая просто принимает R и S как отдельные числа, используя какую-то библиотеку «bignum».